@things-factory/organization 10.1.229 → 10.1.231

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist-client/pages/employee/employee-list-page.d.ts +4 -0
  2. package/dist-client/pages/employee/employee-list-page.js +28 -0
  3. package/dist-client/pages/employee/employee-list-page.js.map +1 -1
  4. package/dist-client/tsconfig.tsbuildinfo +1 -1
  5. package/dist-server/index.d.ts +1 -0
  6. package/dist-server/index.js +4 -0
  7. package/dist-server/index.js.map +1 -1
  8. package/dist-server/role-tasks.js +3 -1
  9. package/dist-server/role-tasks.js.map +1 -1
  10. package/dist-server/service/certificate/employment-certificate-rules.d.ts +39 -0
  11. package/dist-server/service/certificate/employment-certificate-rules.js +40 -0
  12. package/dist-server/service/certificate/employment-certificate-rules.js.map +1 -0
  13. package/dist-server/service/certificate/employment-certificate-templates.d.ts +2 -0
  14. package/dist-server/service/certificate/employment-certificate-templates.js +47 -0
  15. package/dist-server/service/certificate/employment-certificate-templates.js.map +1 -0
  16. package/dist-server/service/certificate/employment-certificates.d.ts +2 -0
  17. package/dist-server/service/certificate/employment-certificates.js +66 -0
  18. package/dist-server/service/certificate/employment-certificates.js.map +1 -0
  19. package/dist-server/service/employee-profile/employee-profile-document.d.ts +0 -10
  20. package/dist-server/service/employee-profile/employee-profile-document.js +4 -21
  21. package/dist-server/service/employee-profile/employee-profile-document.js.map +1 -1
  22. package/dist-server/service/employee-profile/employee-profile-mutation.js.map +1 -1
  23. package/dist-server/service/employee-profile/employee-profile-rules.d.ts +12 -0
  24. package/dist-server/service/employee-profile/employee-profile-rules.js +25 -0
  25. package/dist-server/service/employee-profile/employee-profile-rules.js.map +1 -1
  26. package/dist-server/service/employee-profile/employee-profile.d.ts +1 -0
  27. package/dist-server/service/employee-profile/employee-profile.js +14 -1
  28. package/dist-server/service/employee-profile/employee-profile.js.map +1 -1
  29. package/dist-server/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +6 -5
  31. package/tests/employee-profile-db.test.ts +14 -0
  32. package/tests/employee-profile-document.test.ts +10 -1
  33. package/translations/en.json +11 -1
  34. package/translations/es.json +11 -1
  35. package/translations/ja.json +11 -1
  36. package/translations/ko.json +11 -1
  37. package/translations/ms.json +11 -1
  38. package/translations/zh.json +11 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/organization",
3
- "version": "10.1.229",
3
+ "version": "10.1.231",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -24,7 +24,8 @@
24
24
  "clean:client": "npx rimraf dist-client",
25
25
  "clean:server": "npx rimraf dist-server",
26
26
  "clean": "npm run clean:server && npm run clean:client",
27
- "migration:create": "node ../../node_modules/typeorm/cli.js migration:create ./server/migrations/migration"
27
+ "migration:create": "node ../../node_modules/typeorm/cli.js migration:create ./server/migrations/migration",
28
+ "test": "node --test test/*.test.mjs"
28
29
  },
29
30
  "dependencies": {
30
31
  "@operato/app": "^10.0.0",
@@ -38,10 +39,10 @@
38
39
  "@operato/shell": "^10.0.0",
39
40
  "@things-factory/auth-base": "^10.1.228",
40
41
  "@things-factory/code-ui": "^10.1.228",
41
- "@things-factory/contact": "^10.1.228",
42
- "@things-factory/pdf": "^10.1.228",
42
+ "@things-factory/contact": "^10.1.231",
43
+ "@things-factory/pdf": "^10.1.231",
43
44
  "@things-factory/shell": "^10.1.228",
44
45
  "exceljs": "4.2.0"
45
46
  },
46
- "gitHead": "df6361882dc166ef3f8bd54492113253c802f879"
47
+ "gitHead": "18c98a484d04e6f66f86c6fbf51e17d49a8c6d7d"
47
48
  }
@@ -123,6 +123,20 @@ describe("an employee's own profile", () => {
123
123
  expect(await dataSource.getRepository(organization.EmployeeProfile).count()).toBe(1)
124
124
  })
125
125
 
126
+ it('★ read back newest first, as written by its end - the stored rows keep the order written', async () => {
127
+ const lee = await person('lee')
128
+ const saved = await ask(lee, SAVE, {
129
+ profile: {
130
+ projects: [{ name: 'old', startedOn: '2015-01', endedOn: '2016-01' }, { name: 'now', startedOn: '2024-01' }, { name: 'mid', startedOn: '2019-01', endedOn: '2021-06' }]
131
+ }
132
+ })
133
+ expect(saved.errors).toBeUndefined()
134
+ expect(saved.data.saveMyEmployeeProfile.projects.map((row: any) => row.name)).toEqual(['now', 'mid', 'old'])
135
+ expect((await ask(lee, MINE)).data.myEmployeeProfile.projects.map((row: any) => row.name)).toEqual(['now', 'mid', 'old'])
136
+ const [stored] = await dataSource.query(`SELECT projects FROM employee_profiles WHERE deleted_at IS NULL ORDER BY updated_at DESC LIMIT 1`)
137
+ expect(JSON.parse(stored.projects).map((row: any) => row.name)).toEqual(['old', 'now', 'mid'])
138
+ })
139
+
126
140
  it('★ adding from a résumé takes nothing away, and reaches only one\'s own', async () => {
127
141
  const kim = await person('kim')
128
142
  const park = await person('park')
@@ -10,7 +10,6 @@ import {
10
10
  taglineOf,
11
11
  dotted,
12
12
  layoutHtml,
13
- newestFirst,
14
13
  periodOf,
15
14
  profileFileName,
16
15
  profileFooterHtml,
@@ -24,6 +23,7 @@ import {
24
23
  sheetNamesOf,
25
24
  type ProfileSheetWords
26
25
  } from '../server/service/employee-profile/employee-profile-document'
26
+ import { inShowingOrder, newestFirst } from '../server/service/employee-profile/employee-profile-rules'
27
27
 
28
28
  /** The profiles a quotation attaches - one layout, painted as Excel and as HTML for PDF (ADR-0169 decision 5). */
29
29
  const COUNTS: Record<string, (...args: number[]) => string> = {
@@ -124,6 +124,15 @@ describe('one layout of a staffing profile', () => {
124
124
  expect(newestFirst([{ name: 'old', acquiredOn: '2015-05-01' }, { name: 'new', acquiredOn: '2023-01-10' }]).map(row => row.name)).toEqual(['new', 'old'])
125
125
  })
126
126
 
127
+ it('★ a profile is shown in that order wherever it is read - put in it as it is loaded, the stored order untouched', () => {
128
+ const profile = inShowingOrder({ careers: [{ company: 'old', startedOn: '2001-01', endedOn: '2005-01' }, { company: 'now', startedOn: '2010-01' }], projects: null as any, skills: ['b', 'a'] } as any)
129
+ expect(profile.careers.map((row: any) => row.company)).toEqual(['now', 'old'])
130
+ expect(profile.projects).toBeNull()
131
+ expect(profile.skills).toEqual(['b', 'a'])
132
+ const entity = require('fs').readFileSync(require('path').join(__dirname, '../server/service/employee-profile/employee-profile.ts'), 'utf8')
133
+ expect(entity).toMatch(/^ @AfterLoad\(\)\n showNewestFirst\(\) \{\n inShowingOrder\(this\)/m)
134
+ })
135
+
127
136
  it('★ every dated table of the page reads newest first', () => {
128
137
  const person = {
129
138
  ...KIM,
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "certificate",
185
185
  "text.organization-entry-profile-section-career": "career",
186
186
  "text.organization-entry-profile-section-project": "project",
187
- "text.organization-entry-profile-one-summary": "A profile has one summary"
187
+ "text.organization-entry-profile-one-summary": "A profile has one summary",
188
+ "task.organization.certificates-issuing.name": "Employment and career certificates",
189
+ "task.organization.certificates-issuing.description": "Issues other employees' employment certificates and every career certificate, and reads those issued.",
190
+ "issued-document.organization.employment-certificate": "Employment certificate",
191
+ "issued-document.organization.career-certificate": "Career certificate",
192
+ "error.certificate-hired-on-missing": "Record the hire day first.",
193
+ "error.certificate-not-employed": "This employee has left - issue a career certificate.",
194
+ "error.employee-not-found": "The employee was not found.",
195
+ "button.issue-employment-certificate": "Issue employment certificate",
196
+ "button.issue-career-certificate": "Issue career certificate",
197
+ "text.select-one-employee": "Select one employee"
188
198
  }
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "certificación",
185
185
  "text.organization-entry-profile-section-career": "experiencia",
186
186
  "text.organization-entry-profile-section-project": "proyecto",
187
- "text.organization-entry-profile-one-summary": "Un perfil tiene un solo resumen"
187
+ "text.organization-entry-profile-one-summary": "Un perfil tiene un solo resumen",
188
+ "task.organization.certificates-issuing.name": "Certificados de empleo y experiencia",
189
+ "task.organization.certificates-issuing.description": "Emite los certificados de empleo de otros empleados y todos los certificados de experiencia, y lee los emitidos.",
190
+ "issued-document.organization.employment-certificate": "Certificado de empleo",
191
+ "issued-document.organization.career-certificate": "Certificado de experiencia",
192
+ "error.certificate-hired-on-missing": "Registre primero la fecha de ingreso.",
193
+ "error.certificate-not-employed": "Este empleado ya no trabaja aquí; emita un certificado de experiencia.",
194
+ "error.employee-not-found": "No se encontró el empleado.",
195
+ "button.issue-employment-certificate": "Emitir certificado de empleo",
196
+ "button.issue-career-certificate": "Emitir certificado de experiencia",
197
+ "text.select-one-employee": "Seleccione un empleado"
188
198
  }
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "資格",
185
185
  "text.organization-entry-profile-section-career": "経歴",
186
186
  "text.organization-entry-profile-section-project": "プロジェクト",
187
- "text.organization-entry-profile-one-summary": "概要は一つだけです"
187
+ "text.organization-entry-profile-one-summary": "概要は一つだけです",
188
+ "task.organization.certificates-issuing.name": "在職・経歴証明書の発行",
189
+ "task.organization.certificates-issuing.description": "他の社員の在職証明書とすべての経歴証明書を発行し、発行済みの証明書を読む。",
190
+ "issued-document.organization.employment-certificate": "在職証明書",
191
+ "issued-document.organization.career-certificate": "経歴証明書",
192
+ "error.certificate-hired-on-missing": "先に入社日を入力してください。",
193
+ "error.certificate-not-employed": "退職した社員です。経歴証明書を発行してください。",
194
+ "error.employee-not-found": "社員が見つかりません。",
195
+ "button.issue-employment-certificate": "在職証明書を発行",
196
+ "button.issue-career-certificate": "経歴証明書を発行",
197
+ "text.select-one-employee": "社員を一人選んでください"
188
198
  }
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "자격",
185
185
  "text.organization-entry-profile-section-career": "경력",
186
186
  "text.organization-entry-profile-section-project": "프로젝트",
187
- "text.organization-entry-profile-one-summary": "요약은 하나만 들어갑니다"
187
+ "text.organization-entry-profile-one-summary": "요약은 하나만 들어갑니다",
188
+ "task.organization.certificates-issuing.name": "재직·경력증명서 발급",
189
+ "task.organization.certificates-issuing.description": "다른 직원의 재직증명서와 모든 경력증명서를 발급하고, 발급된 증명서를 읽는다.",
190
+ "issued-document.organization.employment-certificate": "재직증명서",
191
+ "issued-document.organization.career-certificate": "경력증명서",
192
+ "error.certificate-hired-on-missing": "입사일이 없어 증명서를 발급할 수 없습니다. 입사일을 먼저 적으세요.",
193
+ "error.certificate-not-employed": "퇴직한 직원입니다. 경력증명서를 발급하세요.",
194
+ "error.employee-not-found": "직원을 찾을 수 없습니다.",
195
+ "button.issue-employment-certificate": "재직증명서 발급",
196
+ "button.issue-career-certificate": "경력증명서 발급",
197
+ "text.select-one-employee": "직원 한 명을 고르세요"
188
198
  }
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "pensijilan",
185
185
  "text.organization-entry-profile-section-career": "kerjaya",
186
186
  "text.organization-entry-profile-section-project": "projek",
187
- "text.organization-entry-profile-one-summary": "Profil hanya ada satu ringkasan"
187
+ "text.organization-entry-profile-one-summary": "Profil hanya ada satu ringkasan",
188
+ "task.organization.certificates-issuing.name": "Sijil pekerjaan dan pengalaman",
189
+ "task.organization.certificates-issuing.description": "Mengeluarkan sijil pekerjaan pekerja lain dan semua sijil pengalaman, serta membaca yang telah dikeluarkan.",
190
+ "issued-document.organization.employment-certificate": "Sijil pekerjaan",
191
+ "issued-document.organization.career-certificate": "Sijil pengalaman",
192
+ "error.certificate-hired-on-missing": "Rekodkan tarikh mula bekerja dahulu.",
193
+ "error.certificate-not-employed": "Pekerja ini telah berhenti - keluarkan sijil pengalaman.",
194
+ "error.employee-not-found": "Pekerja tidak ditemui.",
195
+ "button.issue-employment-certificate": "Keluarkan sijil pekerjaan",
196
+ "button.issue-career-certificate": "Keluarkan sijil pengalaman",
197
+ "text.select-one-employee": "Pilih seorang pekerja"
188
198
  }
@@ -184,5 +184,15 @@
184
184
  "text.organization-entry-profile-section-certificate": "资格",
185
185
  "text.organization-entry-profile-section-career": "经历",
186
186
  "text.organization-entry-profile-section-project": "项目",
187
- "text.organization-entry-profile-one-summary": "概要只有一条"
187
+ "text.organization-entry-profile-one-summary": "概要只有一条",
188
+ "task.organization.certificates-issuing.name": "在职·经历证明签发",
189
+ "task.organization.certificates-issuing.description": "签发其他员工的在职证明和所有经历证明,并查阅已签发的证明。",
190
+ "issued-document.organization.employment-certificate": "在职证明",
191
+ "issued-document.organization.career-certificate": "经历证明",
192
+ "error.certificate-hired-on-missing": "请先填写入职日期。",
193
+ "error.certificate-not-employed": "该员工已离职,请签发经历证明。",
194
+ "error.employee-not-found": "找不到员工。",
195
+ "button.issue-employment-certificate": "签发在职证明",
196
+ "button.issue-career-certificate": "签发经历证明",
197
+ "text.select-one-employee": "请选择一名员工"
188
198
  }