{{ part }}
{{ t('taglineSub') }}
{{ t('orgChart') }}
{{ t('noData') }} {{ t('navImport') }}
{{ t('noDeptPeople', { n: unassignedIn(orgAssign).length }) }}
{{ t('navPeople') }} {{ data.employees.length }}
| {{ t('f_emp_code') }} | {{ t('f_name') }} | {{ t('dept') }} | {{ t('f_title') }} | {{ t('f_grade') }} | {{ t('f_gender') }} | {{ t('age') }} | {{ t('f_salary') }} |
|---|---|---|---|---|---|---|---|
| {{ e.emp_code }} | {{ e.name }} | {{ deptPath(e.dept_id) }} | {{ e.title }} | {{ e.grade }} | {{ genderLabel(e.gender) }} | {{ e.age ?? '' }} | {{ money(e.salary) }} |
{{ t('noMatchPeople') }}
{{ t('reportsTitle') }}
{{ t('noReports') }}
{{ rp.def.name }}
{{ rp.def.description }}
| ƒ{{ c.name }}🔒{{ sensLabel(c.sens) }}{{ rp.sort.dir > 0 ? ' ▲' : ' ▼' }} |
|---|
| {{ fmtCell(r.v[i], c) }}{{ fmtCell(r.v[i], c) }} ⚠ |
|
{{ t('rpSum') }} / {{ t('rpAvg') }}
{{ fmtCell(Math.round(rpTotals[i].sum * 100) / 100, c) }} {{ fmtCell(Math.round(rpTotals[i].avg * 100) / 100, c) }} |
{{ t('rpHistory') }}({{ rp.snapshots.length }})
{{ t('navImport') }}
{{ t('err.forbidden') }}
{{ t(importKind==='org' ? 'orgGuideTitle' : 'csvGuideTitle') }}
{{ t(importKind==='org' ? 'orgGuideIntro' : 'csvGuideIntro') }}
| {{ t('gItem') }} | {{ t('gNeed') }} | {{ t('gFormat') }} | {{ t('gExample') }} | {{ t('gUsedFor') }} |
|---|---|---|---|---|
| {{ t('f_' + g.f) }} | {{ g.req ? t('required') : t('optional') }} | {{ t('g_' + g.f) }} | {{ lang==='en' ? g.exEn : g.ex }} | {{ t('u_' + g.f) }} |
{{ t('hier_' + m) }}
{{ t('hierDesc_' + m) }}
{{ t('hierEx_' + m) }}
- {{ t((importKind==='org' ? 'orgTip' : 'csvTip') + n) }}
{{ t(importKind==='org' ? 'dropHereOrg' : 'dropHere') }}
{{ t('csvHint') }}
{{ t('fileName') }}
{{ csv.fileName }}
{{ t('fileSize') }}
{{ csv.size }}
{{ t('records') }}
{{ dataRows.length }}
{{ t('columns') }}
{{ csv.width }}
{{ t('mapColumns') }}
{{ t('hierHow') }}
⚠ {{ t('hierNeed_' + hierMode) }}
{{ t('hierDesc_' + hierMode) }}
{{ t('linkHow') }}
{{ t('linkDesc_' + deptLink) }}
{{ t('cleanup') }}
{{ t('dupReviewTitle', { n: dupReview.length }) }}
{{ t('moreGroups', { n: dupReview.length - 20 }) }}
{{ cleanMsg }}
{{ t('orgPreview') }} {{ t('orgPreviewSum', { n: orgPlan.rows.length, d: orgPlan.depth }) }}
{{ t('previewNote', { n: orgPlan.rows.length }) }}
| # | {{ h }} |
|---|---|
| {{ i + 1 }} | {{ r[j] }} |
{{ t('previewNote', { n: dataRows.length }) }}
{{ t('checkTitle') }}
✔ {{ t(importKind==='org' ? 'checkOkOrg' : 'checkOk', { n: importCheck.ok }) }}
⚠ {{ t(i.k, { n: i.n, ex: i.ex }) }}
{{ importError }}
{{ importResult }}
{{ t('snapTitle') }}
{{ t('snapNote') }}
{{ t('snapEmpty') }}
{{ t('navSim') }}
{{ t('simHint') }}
{{ e.name }} {{ e.title }} {{ e.grade }}
{{ deptPath(e.dept_id) }}
{{ t('compare') }}
| {{ t('dept') }} | {{ t('headcount') }} | {{ t('laborCost') }} | {{ t('avgAge') }} | {{ t('femaleRatio') }} |
|---|---|---|---|---|
| {{ row.name }} | {{ row.b.count }} → {{ row.a.count }} |
{{ moneyShort(row.b.salary) }} → {{ moneyShort(row.a.salary) }} | {{ fmtNum(row.b.avgAge) }} → {{ fmtNum(row.a.avgAge) }} | {{ pct(row.b.female, row.b.gendered) }} → {{ pct(row.a.female, row.a.gendered) }} |
{{ t('gradeMix') }}
| {{ t('dept') }} | {{ g }} |
|---|---|
| {{ row.name }} | {{ row.b.grades[g] || 0 }}→{{ row.a.grades[g] || 0 }} |
{{ t('noChanges') }}
{{ t('compareNote') }}
{{ t('orgAfter') }}
{{ personError || '…' }}
{{ pe.emp_code }}
{{ pe.name }}
{{ deptPath(pe.dept_id) }} · {{ pe.title }} · {{ pe.grade }}
- {{ t('f_gender') }}
- {{ genderLabel(pe.gender) || '—' }}
- {{ t('age') }}
- {{ pe.age != null ? t('ageN', { n: pe.age }) : '—' }}({{ pe.birth_date }})
- {{ t('f_hire_date') }}
- {{ pe.hire_date || '—' }}({{ tenure }})
- {{ t('f_salary') }}
- {{ pe.salary != null ? money(pe.salary) : '—' }}
- {{ t('boss') }}
- {{ boss.name }}— {{ boss.title }}
- {{ t('deptSize') }}
- {{ t('peopleN', { n: sameDept.length + 1 }) }}
{{ t('payPosition') }}
{{ t('payRank', payRank) }}
{{ t('plansFor') }}
{{ pl.name }} → {{ deptPath(pl.to_dept_id) }}
{{ t('history') }}
-
{{ String(h.created_at).slice(0, 10) }} · {{ viaLabel(h.via) }}
{{ t('h_' + h.kind) }} {{ h.to_val || '' }} {{ histVal(h, h.from_val) }} → {{ histVal(h, h.to_val) }}
{{ t('noHistory') }}
{{ t('notes') }}
{{ String(n.created_at).slice(0, 16) }} · {{ n.author }}
{{ n.body }}
{{ t('notesNote') }}
{{ t('navSettings') }}
{{ t('myPerms') }}
{{ t('role_' + me.role) }} ・ {{ t('permsGroups', { g: perms.groups.join('、') }) }} ・ {{ t('scopeLimited') }}
{{ t('sumFields') }}: {{ SENS.filter(k => perms.fields[k]).map(k => t('sens_' + k)).join('・') || t('none') }} / {{ t('sumFuncs') }}: {{ FUNCS.filter(k => perms.funcs[k]).map(k => t('fn_' + k).replace(/(.*|\(.*/, '')).join('・') || t('none') }}
{{ t('members') }}
| {{ m.name }} | {{ m.email }} | {{ t('role_owner') }} | {{ t('accAll') }} {{ g }}{{ t('noGroup') }} |
{{ t('rolesNote') }}
{{ t('groupsTitle') }}
{{ t('groupsDesc') }}
{{ t('groupNone') }}
{{ g.name }} {{ t('peopleN', { n: g.members.length }) }}
{{ g.note }}
{{ permSummary(g.perms) }}
{{ t('linksTitle') }}
{{ t('linksNote') }}
