@t4dhg/mcp-factorial 9.0.0 → 10.0.0

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 (82) hide show
  1. package/README.md +76 -14
  2. package/dist/api/attendance.d.ts +37 -13
  3. package/dist/api/attendance.d.ts.map +1 -1
  4. package/dist/api/attendance.js +161 -31
  5. package/dist/api/attendance.js.map +1 -1
  6. package/dist/api/documents.d.ts +4 -3
  7. package/dist/api/documents.d.ts.map +1 -1
  8. package/dist/api/documents.js +4 -3
  9. package/dist/api/documents.js.map +1 -1
  10. package/dist/api/employees.d.ts +5 -3
  11. package/dist/api/employees.d.ts.map +1 -1
  12. package/dist/api/employees.js +5 -3
  13. package/dist/api/employees.js.map +1 -1
  14. package/dist/api/index.d.ts +1 -1
  15. package/dist/api/index.d.ts.map +1 -1
  16. package/dist/api/index.js +1 -1
  17. package/dist/api/index.js.map +1 -1
  18. package/dist/api/time-off.d.ts +6 -1
  19. package/dist/api/time-off.d.ts.map +1 -1
  20. package/dist/api/time-off.js +20 -16
  21. package/dist/api/time-off.js.map +1 -1
  22. package/dist/attendance/backfill.d.ts +36 -0
  23. package/dist/attendance/backfill.d.ts.map +1 -0
  24. package/dist/attendance/backfill.js +104 -0
  25. package/dist/attendance/backfill.js.map +1 -0
  26. package/dist/attendance/gate.d.ts +40 -0
  27. package/dist/attendance/gate.d.ts.map +1 -0
  28. package/dist/attendance/gate.js +63 -0
  29. package/dist/attendance/gate.js.map +1 -0
  30. package/dist/attendance/identity.d.ts +27 -0
  31. package/dist/attendance/identity.d.ts.map +1 -0
  32. package/dist/attendance/identity.js +73 -0
  33. package/dist/attendance/identity.js.map +1 -0
  34. package/dist/attendance/planner.d.ts +147 -0
  35. package/dist/attendance/planner.d.ts.map +1 -0
  36. package/dist/attendance/planner.js +316 -0
  37. package/dist/attendance/planner.js.map +1 -0
  38. package/dist/endpoints.d.ts +5 -0
  39. package/dist/endpoints.d.ts.map +1 -1
  40. package/dist/endpoints.js +5 -0
  41. package/dist/endpoints.js.map +1 -1
  42. package/dist/http-client.d.ts +14 -1
  43. package/dist/http-client.d.ts.map +1 -1
  44. package/dist/http-client.js +36 -7
  45. package/dist/http-client.js.map +1 -1
  46. package/dist/schemas/ats.d.ts +4 -4
  47. package/dist/schemas/attendance.d.ts +367 -0
  48. package/dist/schemas/attendance.d.ts.map +1 -0
  49. package/dist/schemas/attendance.js +159 -0
  50. package/dist/schemas/attendance.js.map +1 -0
  51. package/dist/schemas/documents.d.ts +2 -2
  52. package/dist/schemas/index.d.ts +2 -1
  53. package/dist/schemas/index.d.ts.map +1 -1
  54. package/dist/schemas/index.js +3 -1
  55. package/dist/schemas/index.js.map +1 -1
  56. package/dist/schemas/projects.d.ts +4 -4
  57. package/dist/schemas/time-off.d.ts +59 -148
  58. package/dist/schemas/time-off.d.ts.map +1 -1
  59. package/dist/schemas/time-off.js +22 -53
  60. package/dist/schemas/time-off.js.map +1 -1
  61. package/dist/schemas/training.d.ts +2 -2
  62. package/dist/tools/attendance.d.ts +9 -1
  63. package/dist/tools/attendance.d.ts.map +1 -1
  64. package/dist/tools/attendance.js +314 -24
  65. package/dist/tools/attendance.js.map +1 -1
  66. package/dist/tools/index.js +1 -1
  67. package/dist/tools/index.js.map +1 -1
  68. package/dist/tools/shared.d.ts +2 -2
  69. package/dist/tools/shared.d.ts.map +1 -1
  70. package/dist/tools/shared.js +14 -2
  71. package/dist/tools/shared.js.map +1 -1
  72. package/dist/tools/time-off.d.ts.map +1 -1
  73. package/dist/tools/time-off.js +15 -6
  74. package/dist/tools/time-off.js.map +1 -1
  75. package/dist/types.d.ts +28 -13
  76. package/dist/types.d.ts.map +1 -1
  77. package/dist/write-safety.d.ts +18 -0
  78. package/dist/write-safety.d.ts.map +1 -1
  79. package/dist/write-safety.js +19 -0
  80. package/dist/write-safety.js.map +1 -1
  81. package/llms.txt +6 -4
  82. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/api/employees.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/api/employees.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export { listTeams, getTeam, createTeam, updateTeam, deleteTeam } from './teams.
11
11
  export { listLocations, getLocation, createLocation, updateLocation, deleteLocation, } from './locations.js';
12
12
  export { listContracts, getLatestContract, getEmployeeWithContract, listEmployeesByJobRole, listEmployeesByJobLevel, type EmployeeWithContract, } from './contracts.js';
13
13
  export { listLeaves, getLeave, listLeaveTypes, getLeaveType, listAllowances, createLeave, updateLeave, cancelLeave, approveLeave, rejectLeave, } from './time-off.js';
14
- export { listShifts, getShift, createShift, updateShift, deleteShift } from './attendance.js';
14
+ export { listShifts, listShiftsInRange, getShift, createShift, updateShift, deleteShift, listOpenShifts, listEstimatedTimes, listWorkedTimes, clockIn, clockOut, formatLocalIso, localToday, } from './attendance.js';
15
15
  export { listFolders, getFolder, listDocuments, getDocument, getDocumentDownloadUrls, downloadDocument, downloadEmployeePayslips, downloadEmployeeDocument, } from './documents.js';
16
16
  export { listJobRoles, getJobRole, listJobLevels, getJobLevel } from './job-catalog.js';
17
17
  export { listProjects, getProject, listProjectTasks, getProjectTask, listProjectWorkers, getProjectWorker, listTimeRecords, getTimeRecord, createProject, updateProject, deleteProject, createProjectTask, updateProjectTask, deleteProjectTask, assignProjectWorker, removeProjectWorker, createTimeRecord, updateTimeRecord, deleteTimeRecord, } from './projects.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9F,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGxF,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGpF,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,QAAQ,EACR,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGxF,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
package/dist/api/index.js CHANGED
@@ -18,7 +18,7 @@ export { listContracts, getLatestContract, getEmployeeWithContract, listEmployee
18
18
  // Time Off
19
19
  export { listLeaves, getLeave, listLeaveTypes, getLeaveType, listAllowances, createLeave, updateLeave, cancelLeave, approveLeave, rejectLeave, } from './time-off.js';
20
20
  // Attendance
21
- export { listShifts, getShift, createShift, updateShift, deleteShift } from './attendance.js';
21
+ export { listShifts, listShiftsInRange, getShift, createShift, updateShift, deleteShift, listOpenShifts, listEstimatedTimes, listWorkedTimes, clockIn, clockOut, formatLocalIso, localToday, } from './attendance.js';
22
22
  // Documents
23
23
  export { listFolders, getFolder, listDocuments, getDocument, getDocumentDownloadUrls, downloadDocument, downloadEmployeePayslips, downloadEmployeeDocument, } from './documents.js';
24
24
  // Job Catalog
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,YAAY;AACZ,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpF,YAAY;AACZ,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY;AACZ,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,gBAAgB,CAAC;AAExB,WAAW;AACX,OAAO,EACL,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9F,YAAY;AACZ,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExF,WAAW;AACX,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,WAAW;AACX,OAAO,EACL,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,YAAY;AACZ,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpF,YAAY;AACZ,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,YAAY;AACZ,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GAExB,MAAM,gBAAgB,CAAC;AAExB,WAAW;AACX,OAAO,EACL,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,QAAQ,EACR,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,YAAY;AACZ,OAAO,EACL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAExF,WAAW;AACX,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,WAAW;AACX,OAAO,EACL,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EACL,aAAa,EACb,WAAW,EACX,cAAc,EACd,cAAc,EACd,eAAe,EACf,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
@@ -2,10 +2,15 @@
2
2
  * Time Off API endpoints: Leaves, Leave Types, Allowances
3
3
  */
4
4
  import { type PaginatedResponse } from '../pagination.js';
5
- import type { Leave, LeaveType, Allowance, CreateLeaveInput, UpdateLeaveInput, LeaveDecisionInput } from '../schemas.js';
5
+ import { type Leave, type LeaveType, type Allowance, type CreateLeaveInput, type UpdateLeaveInput, type LeaveDecisionInput } from '../schemas.js';
6
6
  import type { ListLeavesOptions, ListAllowancesOptions } from '../types.js';
7
7
  /**
8
8
  * List leaves with optional filtering
9
+ *
10
+ * The endpoint honours employee_ids[], from and to (leaves overlapping the
11
+ * window, verified live on 2026-07-01). It ignores employee_id (singular),
12
+ * status, start_on and finish_on, so those are not sent. Responses are
13
+ * validated at runtime.
9
14
  */
10
15
  export declare function listLeaves(options?: ListLeavesOptions): Promise<PaginatedResponse<Leave>>;
11
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"time-off.d.ts","sourceRoot":"","sources":["../../src/api/time-off.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAA2C,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE5E;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAgB/F;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAIzD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAM3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAavC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAOrF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CAUzF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CAUxF"}
1
+ {"version":3,"file":"time-off.d.ts","sourceRoot":"","sources":["../../src/api/time-off.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAA2C,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAcnC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAKzD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAM3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAavC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAOrF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CAUzF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CAUxF"}
@@ -4,35 +4,39 @@
4
4
  import { fetchList, fetchOne, postOne, patchOne, deleteOne, postAction } from '../http-client.js';
5
5
  import { cached, CACHE_TTL } from '../cache.js';
6
6
  import { buildPaginationParams, paginateResponse } from '../pagination.js';
7
+ import { LeaveSchema, } from '../schemas.js';
8
+ import { parseArray, parseData } from '../schemas/shared.js';
7
9
  import { AuditAction, auditedOperation } from '../audit.js';
8
10
  import { validateId } from '../utils.js';
9
11
  import { ENDPOINTS, endpointWithId, endpointWithAction } from '../endpoints.js';
10
12
  /**
11
13
  * List leaves with optional filtering
14
+ *
15
+ * The endpoint honours employee_ids[], from and to (leaves overlapping the
16
+ * window, verified live on 2026-07-01). It ignores employee_id (singular),
17
+ * status, start_on and finish_on, so those are not sent. Responses are
18
+ * validated at runtime.
12
19
  */
13
- export async function listLeaves(options) {
20
+ export async function listLeaves(options = {}) {
14
21
  const params = buildPaginationParams(options);
15
- const queryParams = {
16
- page: params.page,
17
- limit: params.limit,
18
- };
19
- if (options?.employee_id)
20
- queryParams.employee_id = options.employee_id;
21
- if (options?.status)
22
- queryParams.status = options.status;
23
- if (options?.start_on_gte)
24
- queryParams.start_on_gte = options.start_on_gte;
25
- if (options?.start_on_lte)
26
- queryParams.start_on_lte = options.start_on_lte;
27
- const leaves = await fetchList(ENDPOINTS.leaves, { params: queryParams });
28
- return paginateResponse(leaves, params.page, params.limit);
22
+ const leaves = await fetchList(ENDPOINTS.leaves, {
23
+ params: {
24
+ employee_ids: options.employee_ids,
25
+ from: options.from,
26
+ to: options.to,
27
+ page: params.page,
28
+ limit: params.limit,
29
+ },
30
+ });
31
+ return paginateResponse(parseArray('Leave', LeaveSchema, leaves), params.page, params.limit);
29
32
  }
30
33
  /**
31
34
  * Get a specific leave by ID
32
35
  */
33
36
  export async function getLeave(id) {
34
37
  validateId(id, 'leave');
35
- return fetchOne(endpointWithId(ENDPOINTS.leaves, id));
38
+ const leave = await fetchOne(endpointWithId(ENDPOINTS.leaves, id));
39
+ return parseData('Leave', LeaveSchema, leave);
36
40
  }
37
41
  /**
38
42
  * List all leave types
@@ -1 +1 @@
1
- {"version":3,"file":"time-off.js","sourceRoot":"","sources":["../../src/api/time-off.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"time-off.js","sourceRoot":"","sources":["../../src/api/time-off.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Gathers facts, plans, and executes bulk shift entry.
3
+ *
4
+ * The planner in planner.ts is pure; this module is the impure shell around
5
+ * it: it reads worked_times, estimated_times, existing shifts and leaves,
6
+ * writes the planned records one POST at a time, and invalidates the shift
7
+ * cache before planning and after writing whatever happened in between.
8
+ */
9
+ import { type BackfillPlan, type Gap, type PlanFacts, type PlanRequest, type PlannedWrite } from './planner.js';
10
+ /** Read everything the planner needs for one employee and date window */
11
+ export declare function gatherFacts(employeeId: number, startOn: string, endOn: string, now?: Date): Promise<PlanFacts>;
12
+ /** Plan without writing */
13
+ export declare function planBackfill(request: PlanRequest, startOn: string, endOn: string): Promise<{
14
+ plan: BackfillPlan;
15
+ facts: PlanFacts;
16
+ }>;
17
+ /** Workdays where the contract expects more than was tracked */
18
+ export declare function findGaps(employeeId: number, startOn: string, endOn: string): Promise<Gap[]>;
19
+ export interface BackfillResult {
20
+ written: PlannedWrite[];
21
+ failed: Array<PlannedWrite & {
22
+ error: string;
23
+ }>;
24
+ }
25
+ /**
26
+ * Write the planned records sequentially. Stops at the first failure so the
27
+ * summary can say exactly where it stopped; re-running the identical call is
28
+ * safe because the planner re-reads shifts and skips what already exists.
29
+ */
30
+ export declare function executeBackfill(employeeId: number, writes: PlannedWrite[], observations?: string): Promise<BackfillResult>;
31
+ /** The dates a request spans, for the preview header */
32
+ export declare function requestWindow(request: PlanRequest): {
33
+ start: string;
34
+ end: string;
35
+ };
36
+ //# sourceMappingURL=backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../src/attendance/backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,EAIL,KAAK,YAAY,EAEjB,KAAK,GAAG,EACR,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,yEAAyE;AACzE,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,SAAS,CAAC,CA0CpB;AAED,2BAA2B;AAC3B,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAGnD;AAED,gEAAgE;AAChE,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAGjG;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EAAE,EACtB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAIlF"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Gathers facts, plans, and executes bulk shift entry.
3
+ *
4
+ * The planner in planner.ts is pure; this module is the impure shell around
5
+ * it: it reads worked_times, estimated_times, existing shifts and leaves,
6
+ * writes the planned records one POST at a time, and invalidates the shift
7
+ * cache before planning and after writing whatever happened in between.
8
+ */
9
+ import { cache } from '../cache.js';
10
+ import { createShift, listEstimatedTimes, listShiftsInRange, listWorkedTimes, localToday, } from '../api/attendance.js';
11
+ import { listLeaves } from '../api/time-off.js';
12
+ import { buildBackfillPlan, computeGaps, expandLeaves, } from './planner.js';
13
+ /** Read everything the planner needs for one employee and date window */
14
+ export async function gatherFacts(employeeId, startOn, endOn, now = new Date()) {
15
+ // A plan must never reason from a shift list older than the call. None of
16
+ // the reads below is cached today; this keeps that true if one becomes so.
17
+ cache.invalidatePrefix('shifts');
18
+ const range = { employee_ids: [employeeId], start_on: startOn, end_on: endOn };
19
+ const [worked, estimated, shifts, leaves] = await Promise.all([
20
+ listWorkedTimes(range),
21
+ listEstimatedTimes(range),
22
+ listShiftsInRange([employeeId], startOn, endOn),
23
+ listLeaves({ employee_ids: [employeeId], from: startOn, to: endOn, limit: 100 }),
24
+ ]);
25
+ const days = new Map();
26
+ for (const day of worked) {
27
+ days.set(day.date, {
28
+ day_type: day.day_type,
29
+ expected_minutes: 0,
30
+ tracked_minutes: day.tracked_minutes,
31
+ });
32
+ }
33
+ for (const day of estimated) {
34
+ const existing = days.get(day.date);
35
+ if (existing) {
36
+ existing.expected_minutes = day.expected_minutes;
37
+ }
38
+ else {
39
+ days.set(day.date, {
40
+ day_type: 'workday',
41
+ expected_minutes: day.expected_minutes,
42
+ tracked_minutes: 0,
43
+ });
44
+ }
45
+ }
46
+ return {
47
+ today: localToday(now),
48
+ days,
49
+ shifts: shifts
50
+ .filter(s => s.clock_in !== null)
51
+ .map(s => ({ date: s.date, clock_in: s.clock_in, clock_out: s.clock_out })),
52
+ leaves: expandLeaves(leaves.data),
53
+ };
54
+ }
55
+ /** Plan without writing */
56
+ export async function planBackfill(request, startOn, endOn) {
57
+ const facts = await gatherFacts(request.employee_id, startOn, endOn);
58
+ return { plan: buildBackfillPlan(request, facts), facts };
59
+ }
60
+ /** Workdays where the contract expects more than was tracked */
61
+ export async function findGaps(employeeId, startOn, endOn) {
62
+ const facts = await gatherFacts(employeeId, startOn, endOn);
63
+ return computeGaps(facts);
64
+ }
65
+ /**
66
+ * Write the planned records sequentially. Stops at the first failure so the
67
+ * summary can say exactly where it stopped; re-running the identical call is
68
+ * safe because the planner re-reads shifts and skips what already exists.
69
+ */
70
+ export async function executeBackfill(employeeId, writes, observations) {
71
+ const result = { written: [], failed: [] };
72
+ try {
73
+ for (const write of writes) {
74
+ try {
75
+ await createShift({
76
+ employee_id: employeeId,
77
+ date: write.date,
78
+ clock_in: write.clock_in,
79
+ clock_out: write.clock_out,
80
+ observations,
81
+ });
82
+ result.written.push(write);
83
+ }
84
+ catch (error) {
85
+ result.failed.push({
86
+ ...write,
87
+ error: error instanceof Error ? error.message : String(error),
88
+ });
89
+ break;
90
+ }
91
+ }
92
+ }
93
+ finally {
94
+ cache.invalidatePrefix('shifts');
95
+ }
96
+ return result;
97
+ }
98
+ /** The dates a request spans, for the preview header */
99
+ export function requestWindow(request) {
100
+ const dates = request.mode === 'range' ? request.dates : request.days.map(d => d.date);
101
+ const sorted = [...dates].sort();
102
+ return { start: sorted[0], end: sorted[sorted.length - 1] };
103
+ }
104
+ //# sourceMappingURL=backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/attendance/backfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Target-identity confirmation gate for attendance writes.
3
+ *
4
+ * The policy gate in tools/shared.ts (checkConfirmation) is static per
5
+ * operation and cannot express "depends on who the target is" or "depends on
6
+ * how many records". This gate can. A first call without a token writes
7
+ * nothing and returns a preview plus a token bound to a fingerprint of what
8
+ * would be written; the confirming call re-derives the fingerprint and
9
+ * refuses if it changed. A `confirm: true` boolean cannot bypass it, because
10
+ * there is no token to pass on a first call.
11
+ */
12
+ export interface GateRequest {
13
+ /** Operation name, e.g. 'backfill_shifts' or 'clock_in' */
14
+ operation: string;
15
+ /** Employee the write targets */
16
+ employeeId: number;
17
+ /** Digest of exactly what would be written */
18
+ fingerprint: string;
19
+ /** Human-readable preview that always names the person */
20
+ preview: string;
21
+ /** Token from a previous preview, if the caller is confirming */
22
+ token?: string;
23
+ /** Gate regardless of target (bulk writes) */
24
+ always?: boolean;
25
+ }
26
+ export type GateResult = {
27
+ proceed: true;
28
+ } | {
29
+ proceed: false;
30
+ message: string;
31
+ };
32
+ /** Stable digest of an arbitrary payload */
33
+ export declare function payloadFingerprint(payload: unknown): string;
34
+ /**
35
+ * Decide whether a write may proceed. Writes aimed at the configured identity
36
+ * pass without a token unless `always` is set; every other write, and every
37
+ * write when FACTORIAL_EMPLOYEE_ID is unset, needs one.
38
+ */
39
+ export declare function requireTargetConfirmation(request: GateRequest): GateResult;
40
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/attendance/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,4CAA4C;AAC5C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3D;AAuBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CA+B1E"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Target-identity confirmation gate for attendance writes.
3
+ *
4
+ * The policy gate in tools/shared.ts (checkConfirmation) is static per
5
+ * operation and cannot express "depends on who the target is" or "depends on
6
+ * how many records". This gate can. A first call without a token writes
7
+ * nothing and returns a preview plus a token bound to a fingerprint of what
8
+ * would be written; the confirming call re-derives the fingerprint and
9
+ * refuses if it changed. A `confirm: true` boolean cannot bypass it, because
10
+ * there is no token to pass on a first call.
11
+ */
12
+ import { createHash } from 'node:crypto';
13
+ import { confirmationManager } from '../confirmation.js';
14
+ import { ConfirmationExpiredError } from '../errors.js';
15
+ import { isConfiguredIdentity } from './identity.js';
16
+ /** Stable digest of an arbitrary payload */
17
+ export function payloadFingerprint(payload) {
18
+ return createHash('sha256').update(JSON.stringify(payload)).digest('hex');
19
+ }
20
+ function issue(request, prefix = '') {
21
+ const token = confirmationManager.createConfirmation(request.operation, { fingerprint: request.fingerprint, employeeId: request.employeeId }, {
22
+ operation: 'create',
23
+ entityType: 'shift',
24
+ entityId: request.employeeId,
25
+ entityName: request.preview.split('\n')[0],
26
+ warnings: [],
27
+ });
28
+ return {
29
+ proceed: false,
30
+ message: `${prefix}${request.preview}\n\nNothing has been written. ` +
31
+ `To proceed, call this action again with the same arguments and confirmation_token: ${token}\n` +
32
+ 'The token is valid for 5 minutes and for exactly this plan.',
33
+ };
34
+ }
35
+ /**
36
+ * Decide whether a write may proceed. Writes aimed at the configured identity
37
+ * pass without a token unless `always` is set; every other write, and every
38
+ * write when FACTORIAL_EMPLOYEE_ID is unset, needs one.
39
+ */
40
+ export function requireTargetConfirmation(request) {
41
+ const gated = request.always === true || !isConfiguredIdentity(request.employeeId);
42
+ if (!gated)
43
+ return { proceed: true };
44
+ if (!request.token)
45
+ return issue(request);
46
+ let pending;
47
+ try {
48
+ pending = confirmationManager.confirm(request.token);
49
+ }
50
+ catch (error) {
51
+ if (error instanceof ConfirmationExpiredError) {
52
+ return issue(request, 'The confirmation token was invalid or had expired. Here is the current plan.\n\n');
53
+ }
54
+ throw error;
55
+ }
56
+ if (pending.operation !== request.operation ||
57
+ pending.payload.fingerprint !== request.fingerprint) {
58
+ return issue(request, 'The plan changed between the preview and this call (someone wrote in the meantime, or the ' +
59
+ 'arguments differ). The old token has been discarded. Here is the current plan.\n\n');
60
+ }
61
+ return { proceed: true };
62
+ }
63
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/attendance/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAmBrD,4CAA4C;AAC5C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,KAAK,CAAC,OAAoB,EAAE,MAAM,GAAG,EAAE;IAC9C,MAAM,KAAK,GAAG,mBAAmB,CAAC,kBAAkB,CAClD,OAAO,CAAC,SAAS,EACjB,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EACpE;QACE,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO,CAAC,UAAU;QAC5B,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,QAAQ,EAAE,EAAE;KACb,CACF,CAAC;IACF,OAAO;QACL,OAAO,EAAE,KAAK;QACd,OAAO,EACL,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,gCAAgC;YAC3D,sFAAsF,KAAK,IAAI;YAC/F,6DAA6D;KAChE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErC,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;YAC9C,OAAO,KAAK,CACV,OAAO,EACP,kFAAkF,CACnF,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IACE,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;QACvC,OAAO,CAAC,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,EACnD,CAAC;QACD,OAAO,KAAK,CACV,OAAO,EACP,4FAA4F;YAC1F,oFAAoF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Who "I" am for attendance actions.
3
+ *
4
+ * A company-scoped API key carries no employee: /api_public/credentials
5
+ * returns employee_id null. The optional FACTORIAL_EMPLOYEE_ID variable
6
+ * supplies the default target for every attendance action, and every write
7
+ * aimed at anyone else is treated as aimed at another person by the safety
8
+ * gate in tools/attendance.ts.
9
+ */
10
+ /** Read and validate FACTORIAL_EMPLOYEE_ID; undefined when unset */
11
+ export declare function getConfiguredEmployeeId(): number | undefined;
12
+ /**
13
+ * Resolve the employee an action targets: the explicit argument wins, then the
14
+ * configured default. With neither, the caller must name someone.
15
+ */
16
+ export declare function resolveTargetEmployeeId(explicit: number | undefined): number;
17
+ /** True when the target is the configured identity (never true when unset) */
18
+ export declare function isConfiguredIdentity(employeeId: number): boolean;
19
+ /**
20
+ * Resolve an employee id to a display name through the employees API, cached
21
+ * for the life of the process. Fails loudly when the id does not resolve, so a
22
+ * mistyped FACTORIAL_EMPLOYEE_ID cannot silently write onto a colleague.
23
+ */
24
+ export declare function resolveEmployeeName(employeeId: number): Promise<string>;
25
+ /** Forget resolved names (tests) */
26
+ export declare function clearResolvedNames(): void;
27
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/attendance/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,oEAAoE;AACpE,wBAAgB,uBAAuB,IAAI,MAAM,GAAG,SAAS,CAU5D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAc5E;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAGhE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB7E;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Who "I" am for attendance actions.
3
+ *
4
+ * A company-scoped API key carries no employee: /api_public/credentials
5
+ * returns employee_id null. The optional FACTORIAL_EMPLOYEE_ID variable
6
+ * supplies the default target for every attendance action, and every write
7
+ * aimed at anyone else is treated as aimed at another person by the safety
8
+ * gate in tools/attendance.ts.
9
+ */
10
+ import { getEmployee } from '../api/employees.js';
11
+ let resolvedNames = new Map();
12
+ /** Read and validate FACTORIAL_EMPLOYEE_ID; undefined when unset */
13
+ export function getConfiguredEmployeeId() {
14
+ const raw = process.env.FACTORIAL_EMPLOYEE_ID;
15
+ if (raw === undefined || raw.trim() === '')
16
+ return undefined;
17
+ if (!/^[1-9]\d*$/.test(raw.trim())) {
18
+ throw new Error(`FACTORIAL_EMPLOYEE_ID must be a positive integer employee id, got "${raw}". ` +
19
+ 'Unset it to require employee_id on every attendance action.');
20
+ }
21
+ return Number(raw.trim());
22
+ }
23
+ /**
24
+ * Resolve the employee an action targets: the explicit argument wins, then the
25
+ * configured default. With neither, the caller must name someone.
26
+ */
27
+ export function resolveTargetEmployeeId(explicit) {
28
+ if (explicit !== undefined) {
29
+ if (!Number.isInteger(explicit) || explicit <= 0) {
30
+ throw new Error('employee_id must be a positive integer');
31
+ }
32
+ return explicit;
33
+ }
34
+ const configured = getConfiguredEmployeeId();
35
+ if (configured === undefined) {
36
+ throw new Error('employee_id is required: FACTORIAL_EMPLOYEE_ID is not set, so there is no default identity.');
37
+ }
38
+ return configured;
39
+ }
40
+ /** True when the target is the configured identity (never true when unset) */
41
+ export function isConfiguredIdentity(employeeId) {
42
+ const configured = getConfiguredEmployeeId();
43
+ return configured !== undefined && configured === employeeId;
44
+ }
45
+ /**
46
+ * Resolve an employee id to a display name through the employees API, cached
47
+ * for the life of the process. Fails loudly when the id does not resolve, so a
48
+ * mistyped FACTORIAL_EMPLOYEE_ID cannot silently write onto a colleague.
49
+ */
50
+ export async function resolveEmployeeName(employeeId) {
51
+ const cached = resolvedNames.get(employeeId);
52
+ if (cached)
53
+ return cached;
54
+ let name;
55
+ try {
56
+ const employee = await getEmployee(employeeId);
57
+ name = employee.full_name || `${employee.first_name ?? ''} ${employee.last_name ?? ''}`.trim();
58
+ }
59
+ catch (error) {
60
+ const reason = error instanceof Error ? error.message : String(error);
61
+ throw new Error(`Employee ${employeeId} could not be resolved (${reason}). ` +
62
+ 'Check the employee_id argument or the FACTORIAL_EMPLOYEE_ID setting.');
63
+ }
64
+ if (!name)
65
+ name = `employee ${employeeId}`;
66
+ resolvedNames.set(employeeId, name);
67
+ return name;
68
+ }
69
+ /** Forget resolved names (tests) */
70
+ export function clearResolvedNames() {
71
+ resolvedNames = new Map();
72
+ }
73
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/attendance/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,IAAI,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE9C,oEAAoE;AACpE,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,sEAAsE,GAAG,KAAK;YAC5E,6DAA6D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAA4B;IAClE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;IAC7C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAC;IAC7C,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,UAAU,CAAC;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,2BAA2B,MAAM,KAAK;YAC1D,sEAAsE,CACzE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;IAC3C,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;AAC5B,CAAC"}