@t4dhg/mcp-factorial 7.1.0 → 8.2.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 (199) hide show
  1. package/README.md +278 -55
  2. package/dist/api/ats.d.ts +78 -0
  3. package/dist/api/ats.d.ts.map +1 -0
  4. package/dist/api/ats.js +173 -0
  5. package/dist/api/ats.js.map +1 -0
  6. package/dist/api/attendance.d.ts +27 -0
  7. package/dist/api/attendance.d.ts.map +1 -0
  8. package/dist/api/attendance.js +62 -0
  9. package/dist/api/attendance.js.map +1 -0
  10. package/dist/api/contracts.d.ts +40 -0
  11. package/dist/api/contracts.d.ts.map +1 -0
  12. package/dist/api/contracts.js +146 -0
  13. package/dist/api/contracts.js.map +1 -0
  14. package/dist/api/documents.d.ts +95 -0
  15. package/dist/api/documents.d.ts.map +1 -0
  16. package/dist/api/documents.js +265 -0
  17. package/dist/api/documents.js.map +1 -0
  18. package/dist/api/employees.d.ts +35 -0
  19. package/dist/api/employees.d.ts.map +1 -0
  20. package/dist/api/employees.js +116 -0
  21. package/dist/api/employees.js.map +1 -0
  22. package/dist/api/index.d.ts +22 -0
  23. package/dist/api/index.d.ts.map +1 -0
  24. package/dist/api/index.js +36 -0
  25. package/dist/api/index.js.map +1 -0
  26. package/dist/api/job-catalog.d.ts +21 -0
  27. package/dist/api/job-catalog.d.ts.map +1 -0
  28. package/dist/api/job-catalog.js +34 -0
  29. package/dist/api/job-catalog.js.map +1 -0
  30. package/dist/api/locations.d.ts +26 -0
  31. package/dist/api/locations.d.ts.map +1 -0
  32. package/dist/api/locations.js +59 -0
  33. package/dist/api/locations.js.map +1 -0
  34. package/dist/api/payroll.d.ts +30 -0
  35. package/dist/api/payroll.d.ts.map +1 -0
  36. package/dist/api/payroll.js +68 -0
  37. package/dist/api/payroll.js.map +1 -0
  38. package/dist/api/projects.d.ts +82 -0
  39. package/dist/api/projects.d.ts.map +1 -0
  40. package/dist/api/projects.js +193 -0
  41. package/dist/api/projects.js.map +1 -0
  42. package/dist/api/shared.d.ts +12 -0
  43. package/dist/api/shared.d.ts.map +1 -0
  44. package/dist/api/shared.js +17 -0
  45. package/dist/api/shared.js.map +1 -0
  46. package/dist/api/teams.d.ts +26 -0
  47. package/dist/api/teams.d.ts.map +1 -0
  48. package/dist/api/teams.js +59 -0
  49. package/dist/api/teams.js.map +1 -0
  50. package/dist/api/time-off.d.ts +47 -0
  51. package/dist/api/time-off.d.ts.map +1 -0
  52. package/dist/api/time-off.js +112 -0
  53. package/dist/api/time-off.js.map +1 -0
  54. package/dist/api/training.d.ts +62 -0
  55. package/dist/api/training.d.ts.map +1 -0
  56. package/dist/api/training.js +147 -0
  57. package/dist/api/training.js.map +1 -0
  58. package/dist/api/work-areas.d.ts +30 -0
  59. package/dist/api/work-areas.d.ts.map +1 -0
  60. package/dist/api/work-areas.js +71 -0
  61. package/dist/api/work-areas.js.map +1 -0
  62. package/dist/api.d.ts +3 -464
  63. package/dist/api.d.ts.map +1 -1
  64. package/dist/api.js +3 -1274
  65. package/dist/api.js.map +1 -1
  66. package/dist/audit.d.ts +8 -3
  67. package/dist/audit.d.ts.map +1 -1
  68. package/dist/audit.js +8 -3
  69. package/dist/audit.js.map +1 -1
  70. package/dist/index.d.ts +6 -13
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +6 -3860
  73. package/dist/index.js.map +1 -1
  74. package/dist/oauth.d.ts +63 -0
  75. package/dist/oauth.d.ts.map +1 -0
  76. package/dist/oauth.js +143 -0
  77. package/dist/oauth.js.map +1 -0
  78. package/dist/schemas/ats.d.ts +326 -0
  79. package/dist/schemas/ats.d.ts.map +1 -0
  80. package/dist/schemas/ats.js +121 -0
  81. package/dist/schemas/ats.js.map +1 -0
  82. package/dist/schemas/documents.d.ts +78 -0
  83. package/dist/schemas/documents.d.ts.map +1 -0
  84. package/dist/schemas/documents.js +34 -0
  85. package/dist/schemas/documents.js.map +1 -0
  86. package/dist/schemas/employees.d.ts +528 -0
  87. package/dist/schemas/employees.d.ts.map +1 -0
  88. package/dist/schemas/employees.js +206 -0
  89. package/dist/schemas/employees.js.map +1 -0
  90. package/dist/schemas/index.d.ts +18 -0
  91. package/dist/schemas/index.d.ts.map +1 -0
  92. package/dist/schemas/index.js +28 -0
  93. package/dist/schemas/index.js.map +1 -0
  94. package/dist/schemas/job-catalog.d.ts +57 -0
  95. package/dist/schemas/job-catalog.d.ts.map +1 -0
  96. package/dist/schemas/job-catalog.js +27 -0
  97. package/dist/schemas/job-catalog.js.map +1 -0
  98. package/dist/schemas/payroll.d.ts +98 -0
  99. package/dist/schemas/payroll.d.ts.map +1 -0
  100. package/dist/schemas/payroll.js +43 -0
  101. package/dist/schemas/payroll.js.map +1 -0
  102. package/dist/schemas/projects.d.ts +277 -0
  103. package/dist/schemas/projects.d.ts.map +1 -0
  104. package/dist/schemas/projects.js +114 -0
  105. package/dist/schemas/projects.js.map +1 -0
  106. package/dist/schemas/shared.d.ts +42 -0
  107. package/dist/schemas/shared.d.ts.map +1 -0
  108. package/dist/schemas/shared.js +65 -0
  109. package/dist/schemas/shared.js.map +1 -0
  110. package/dist/schemas/time-off.d.ts +286 -0
  111. package/dist/schemas/time-off.d.ts.map +1 -0
  112. package/dist/schemas/time-off.js +111 -0
  113. package/dist/schemas/time-off.js.map +1 -0
  114. package/dist/schemas/training.d.ts +223 -0
  115. package/dist/schemas/training.d.ts.map +1 -0
  116. package/dist/schemas/training.js +88 -0
  117. package/dist/schemas/training.js.map +1 -0
  118. package/dist/schemas/work-areas.d.ts +71 -0
  119. package/dist/schemas/work-areas.d.ts.map +1 -0
  120. package/dist/schemas/work-areas.js +30 -0
  121. package/dist/schemas/work-areas.js.map +1 -0
  122. package/dist/schemas.d.ts +3 -1932
  123. package/dist/schemas.d.ts.map +1 -1
  124. package/dist/schemas.js +3 -785
  125. package/dist/schemas.js.map +1 -1
  126. package/dist/tool-utils.d.ts +0 -14
  127. package/dist/tool-utils.d.ts.map +1 -1
  128. package/dist/tool-utils.js +5 -18
  129. package/dist/tool-utils.js.map +1 -1
  130. package/dist/tools/ats.d.ts +6 -0
  131. package/dist/tools/ats.d.ts.map +1 -0
  132. package/dist/tools/ats.js +206 -0
  133. package/dist/tools/ats.js.map +1 -0
  134. package/dist/tools/attendance.d.ts +6 -0
  135. package/dist/tools/attendance.d.ts.map +1 -0
  136. package/dist/tools/attendance.js +86 -0
  137. package/dist/tools/attendance.js.map +1 -0
  138. package/dist/tools/contracts.d.ts +6 -0
  139. package/dist/tools/contracts.d.ts.map +1 -0
  140. package/dist/tools/contracts.js +63 -0
  141. package/dist/tools/contracts.js.map +1 -0
  142. package/dist/tools/documents.d.ts +6 -0
  143. package/dist/tools/documents.d.ts.map +1 -0
  144. package/dist/tools/documents.js +135 -0
  145. package/dist/tools/documents.js.map +1 -0
  146. package/dist/tools/employees.d.ts +6 -0
  147. package/dist/tools/employees.d.ts.map +1 -0
  148. package/dist/tools/employees.js +125 -0
  149. package/dist/tools/employees.js.map +1 -0
  150. package/dist/tools/index.d.ts +17 -0
  151. package/dist/tools/index.d.ts.map +1 -0
  152. package/dist/tools/index.js +221 -0
  153. package/dist/tools/index.js.map +1 -0
  154. package/dist/tools/job-catalog.d.ts +6 -0
  155. package/dist/tools/job-catalog.d.ts.map +1 -0
  156. package/dist/tools/job-catalog.js +39 -0
  157. package/dist/tools/job-catalog.js.map +1 -0
  158. package/dist/tools/locations.d.ts +6 -0
  159. package/dist/tools/locations.d.ts.map +1 -0
  160. package/dist/tools/locations.js +93 -0
  161. package/dist/tools/locations.js.map +1 -0
  162. package/dist/tools/payroll.d.ts +6 -0
  163. package/dist/tools/payroll.d.ts.map +1 -0
  164. package/dist/tools/payroll.js +76 -0
  165. package/dist/tools/payroll.js.map +1 -0
  166. package/dist/tools/projects.d.ts +6 -0
  167. package/dist/tools/projects.d.ts.map +1 -0
  168. package/dist/tools/projects.js +203 -0
  169. package/dist/tools/projects.js.map +1 -0
  170. package/dist/tools/shared.d.ts +84 -0
  171. package/dist/tools/shared.d.ts.map +1 -0
  172. package/dist/tools/shared.js +164 -0
  173. package/dist/tools/shared.js.map +1 -0
  174. package/dist/tools/teams.d.ts +6 -0
  175. package/dist/tools/teams.d.ts.map +1 -0
  176. package/dist/tools/teams.js +81 -0
  177. package/dist/tools/teams.js.map +1 -0
  178. package/dist/tools/time-off.d.ts +6 -0
  179. package/dist/tools/time-off.d.ts.map +1 -0
  180. package/dist/tools/time-off.js +144 -0
  181. package/dist/tools/time-off.js.map +1 -0
  182. package/dist/tools/training.d.ts +6 -0
  183. package/dist/tools/training.d.ts.map +1 -0
  184. package/dist/tools/training.js +160 -0
  185. package/dist/tools/training.js.map +1 -0
  186. package/dist/tools/work-areas.d.ts +6 -0
  187. package/dist/tools/work-areas.d.ts.map +1 -0
  188. package/dist/tools/work-areas.js +85 -0
  189. package/dist/tools/work-areas.js.map +1 -0
  190. package/dist/utils.d.ts +35 -0
  191. package/dist/utils.d.ts.map +1 -1
  192. package/dist/utils.js +97 -0
  193. package/dist/utils.js.map +1 -1
  194. package/dist/write-safety.d.ts +229 -2
  195. package/dist/write-safety.d.ts.map +1 -1
  196. package/dist/write-safety.js +42 -3
  197. package/dist/write-safety.js.map +1 -1
  198. package/llms.txt +2 -2
  199. package/package.json +2 -2
@@ -0,0 +1,173 @@
1
+ /**
2
+ * ATS (Applicant Tracking System) API endpoints
3
+ */
4
+ import { fetchList, fetchOne, postOne, patchOne, deleteOne, postAction } from '../http-client.js';
5
+ import { cache, cached, CACHE_TTL, CacheManager } from '../cache.js';
6
+ import { buildPaginationParams, sliceForPagination, } from '../pagination.js';
7
+ import { AuditAction, auditedOperation } from '../audit.js';
8
+ import { validateId } from '../utils.js';
9
+ import { ENDPOINTS, endpointWithId, endpointWithAction } from '../endpoints.js';
10
+ // ============================================================================
11
+ // ATS - READ endpoints
12
+ // ============================================================================
13
+ /**
14
+ * List all job postings
15
+ */
16
+ export async function listJobPostings(options) {
17
+ const params = buildPaginationParams(options);
18
+ const postings = await cached(CacheManager.key('job_postings', options), () => fetchList(ENDPOINTS.jobPostings), CACHE_TTL.default);
19
+ return sliceForPagination(postings, params);
20
+ }
21
+ /**
22
+ * Get a specific job posting by ID
23
+ */
24
+ export async function getJobPosting(id) {
25
+ validateId(id, 'job posting');
26
+ return cached(`job_posting:${id}`, () => fetchOne(endpointWithId(ENDPOINTS.jobPostings, id)), CACHE_TTL.default);
27
+ }
28
+ /**
29
+ * List all candidates
30
+ */
31
+ export async function listCandidates(options) {
32
+ const params = buildPaginationParams(options);
33
+ const candidates = await fetchList(ENDPOINTS.candidates);
34
+ return sliceForPagination(candidates, params);
35
+ }
36
+ /**
37
+ * Get a specific candidate by ID
38
+ */
39
+ export async function getCandidate(id) {
40
+ validateId(id, 'candidate');
41
+ return fetchOne(endpointWithId(ENDPOINTS.candidates, id));
42
+ }
43
+ /**
44
+ * List all applications
45
+ */
46
+ export async function listApplications(jobPostingId, options) {
47
+ const params = buildPaginationParams(options);
48
+ const queryParams = {};
49
+ if (jobPostingId)
50
+ queryParams.job_posting_id = jobPostingId;
51
+ const applications = await fetchList(ENDPOINTS.applications, {
52
+ params: queryParams,
53
+ });
54
+ return sliceForPagination(applications, params);
55
+ }
56
+ /**
57
+ * Get a specific application by ID
58
+ */
59
+ export async function getApplication(id) {
60
+ validateId(id, 'application');
61
+ return fetchOne(endpointWithId(ENDPOINTS.applications, id));
62
+ }
63
+ /**
64
+ * List all hiring stages
65
+ */
66
+ export async function listHiringStages() {
67
+ return cached('hiring_stages:all', () => fetchList(ENDPOINTS.hiringStages), CACHE_TTL.default);
68
+ }
69
+ /**
70
+ * Get a specific hiring stage by ID
71
+ */
72
+ export async function getHiringStage(id) {
73
+ validateId(id, 'hiring stage');
74
+ return fetchOne(endpointWithId(ENDPOINTS.hiringStages, id));
75
+ }
76
+ // ============================================================================
77
+ // ATS - WRITE endpoints
78
+ // ============================================================================
79
+ /**
80
+ * Create a job posting
81
+ */
82
+ export async function createJobPosting(input) {
83
+ return auditedOperation(AuditAction.CREATE, 'job_posting', undefined, async () => {
84
+ const posting = await postOne(ENDPOINTS.jobPostings, input);
85
+ cache.invalidatePrefix('job_postings');
86
+ return posting;
87
+ });
88
+ }
89
+ /**
90
+ * Update a job posting
91
+ */
92
+ export async function updateJobPosting(id, input) {
93
+ validateId(id, 'job posting');
94
+ return auditedOperation(AuditAction.UPDATE, 'job_posting', id, async () => {
95
+ const posting = await patchOne(endpointWithId(ENDPOINTS.jobPostings, id), input);
96
+ cache.invalidate(`job_posting:${id}`);
97
+ cache.invalidatePrefix('job_postings');
98
+ return posting;
99
+ });
100
+ }
101
+ /**
102
+ * Delete a job posting
103
+ */
104
+ export async function deleteJobPosting(id) {
105
+ validateId(id, 'job posting');
106
+ return auditedOperation(AuditAction.DELETE, 'job_posting', id, async () => {
107
+ await deleteOne(endpointWithId(ENDPOINTS.jobPostings, id));
108
+ cache.invalidate(`job_posting:${id}`);
109
+ cache.invalidatePrefix('job_postings');
110
+ });
111
+ }
112
+ /**
113
+ * Create a candidate
114
+ */
115
+ export async function createCandidate(input) {
116
+ return auditedOperation(AuditAction.CREATE, 'candidate', undefined, async () => {
117
+ return postOne(ENDPOINTS.candidates, input);
118
+ });
119
+ }
120
+ /**
121
+ * Update a candidate
122
+ */
123
+ export async function updateCandidate(id, input) {
124
+ validateId(id, 'candidate');
125
+ return auditedOperation(AuditAction.UPDATE, 'candidate', id, async () => {
126
+ return patchOne(endpointWithId(ENDPOINTS.candidates, id), input);
127
+ });
128
+ }
129
+ /**
130
+ * Delete a candidate
131
+ */
132
+ export async function deleteCandidate(id) {
133
+ validateId(id, 'candidate');
134
+ return auditedOperation(AuditAction.DELETE, 'candidate', id, async () => {
135
+ await deleteOne(endpointWithId(ENDPOINTS.candidates, id));
136
+ });
137
+ }
138
+ /**
139
+ * Create an application
140
+ */
141
+ export async function createApplication(input) {
142
+ return auditedOperation(AuditAction.CREATE, 'application', undefined, async () => {
143
+ return postOne(ENDPOINTS.applications, input);
144
+ });
145
+ }
146
+ /**
147
+ * Update an application
148
+ */
149
+ export async function updateApplication(id, input) {
150
+ validateId(id, 'application');
151
+ return auditedOperation(AuditAction.UPDATE, 'application', id, async () => {
152
+ return patchOne(endpointWithId(ENDPOINTS.applications, id), input);
153
+ });
154
+ }
155
+ /**
156
+ * Delete an application
157
+ */
158
+ export async function deleteApplication(id) {
159
+ validateId(id, 'application');
160
+ return auditedOperation(AuditAction.DELETE, 'application', id, async () => {
161
+ await deleteOne(endpointWithId(ENDPOINTS.applications, id));
162
+ });
163
+ }
164
+ /**
165
+ * Advance an application to the next stage
166
+ */
167
+ export async function advanceApplication(id) {
168
+ validateId(id, 'application');
169
+ return auditedOperation(AuditAction.UPDATE, 'application', id, async () => {
170
+ return postAction(endpointWithAction(ENDPOINTS.applications, id, 'apply'));
171
+ });
172
+ }
173
+ //# sourceMappingURL=ats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ats.js","sourceRoot":"","sources":["../../src/api/ats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Attendance API endpoints: Shifts
3
+ */
4
+ import { type PaginatedResponse } from '../pagination.js';
5
+ import type { Shift, CreateShiftInput, UpdateShiftInput } from '../schemas.js';
6
+ import type { ListShiftsOptions } from '../types.js';
7
+ /**
8
+ * List shifts with optional filtering
9
+ */
10
+ export declare function listShifts(options?: ListShiftsOptions): Promise<PaginatedResponse<Shift>>;
11
+ /**
12
+ * Get a specific shift by ID
13
+ */
14
+ export declare function getShift(id: number): Promise<Shift>;
15
+ /**
16
+ * Create a new shift
17
+ */
18
+ export declare function createShift(input: CreateShiftInput): Promise<Shift>;
19
+ /**
20
+ * Update a shift
21
+ */
22
+ export declare function updateShift(id: number, input: UpdateShiftInput): Promise<Shift>;
23
+ /**
24
+ * Delete a shift
25
+ */
26
+ export declare function deleteShift(id: number): Promise<void>;
27
+ //# sourceMappingURL=attendance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/api/attendance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA2C,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAe/F;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAIzD;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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Attendance API endpoints: Shifts
3
+ */
4
+ import { fetchList, fetchOne, postOne, patchOne, deleteOne } from '../http-client.js';
5
+ import { buildPaginationParams, paginateResponse } from '../pagination.js';
6
+ import { AuditAction, auditedOperation } from '../audit.js';
7
+ import { validateId } from '../utils.js';
8
+ import { ENDPOINTS, endpointWithId } from '../endpoints.js';
9
+ /**
10
+ * List shifts with optional filtering
11
+ */
12
+ export async function listShifts(options) {
13
+ const params = buildPaginationParams(options);
14
+ const queryParams = {
15
+ page: params.page,
16
+ limit: params.limit,
17
+ };
18
+ if (options?.employee_id)
19
+ queryParams.employee_id = options.employee_id;
20
+ if (options?.clock_in_gte)
21
+ queryParams.clock_in_gte = options.clock_in_gte;
22
+ if (options?.clock_in_lte)
23
+ queryParams.clock_in_lte = options.clock_in_lte;
24
+ const shifts = await fetchList(ENDPOINTS.shifts, { params: queryParams });
25
+ return paginateResponse(shifts, params.page, params.limit);
26
+ }
27
+ /**
28
+ * Get a specific shift by ID
29
+ */
30
+ export async function getShift(id) {
31
+ validateId(id, 'shift');
32
+ return fetchOne(endpointWithId(ENDPOINTS.shifts, id));
33
+ }
34
+ /**
35
+ * Create a new shift
36
+ */
37
+ export async function createShift(input) {
38
+ return auditedOperation(AuditAction.CREATE, 'shift', undefined, async () => {
39
+ const shift = await postOne(ENDPOINTS.shifts, input);
40
+ return shift;
41
+ });
42
+ }
43
+ /**
44
+ * Update a shift
45
+ */
46
+ export async function updateShift(id, input) {
47
+ validateId(id, 'shift');
48
+ return auditedOperation(AuditAction.UPDATE, 'shift', id, async () => {
49
+ const shift = await patchOne(endpointWithId(ENDPOINTS.shifts, id), input);
50
+ return shift;
51
+ });
52
+ }
53
+ /**
54
+ * Delete a shift
55
+ */
56
+ export async function deleteShift(id) {
57
+ validateId(id, 'shift');
58
+ return auditedOperation(AuditAction.DELETE, 'shift', id, async () => {
59
+ await deleteOne(endpointWithId(ENDPOINTS.shifts, id));
60
+ });
61
+ }
62
+ //# sourceMappingURL=attendance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.js","sourceRoot":"","sources":["../../src/api/attendance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAA0B,MAAM,kBAAkB,CAAC;AAEnG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA2B;IAC1D,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAgD;QAC/D,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IAEF,IAAI,OAAO,EAAE,WAAW;QAAE,WAAW,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxE,IAAI,OAAO,EAAE,YAAY;QAAE,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3E,IAAI,OAAO,EAAE,YAAY;QAAE,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAE3E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAQ,SAAS,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjF,OAAO,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAU;IACvC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAExB,OAAO,QAAQ,CAAQ,cAAc,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,OAAO,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAQ,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU,EAAE,KAAuB;IACnE,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAExB,OAAO,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAQ,cAAc,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAExB,OAAO,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Contract API endpoints
3
+ */
4
+ import { type PaginatedResponse, type PaginationInput } from '../pagination.js';
5
+ import type { Employee, Contract } from '../schemas.js';
6
+ /**
7
+ * List contracts, optionally filtered by employee ID
8
+ */
9
+ export declare function listContracts(employeeId?: number, options?: PaginationInput): Promise<PaginatedResponse<Contract>>;
10
+ /**
11
+ * Get the latest contract for an employee
12
+ * Returns the most recent contract based on effective_on date
13
+ */
14
+ export declare function getLatestContract(employeeId: number): Promise<Contract | null>;
15
+ /**
16
+ * Employee with their latest contract data
17
+ */
18
+ export interface EmployeeWithContract {
19
+ employee: Employee;
20
+ contract: Contract | null;
21
+ }
22
+ /**
23
+ * Get an employee with their latest contract
24
+ * Combines employee data with compensation/job role info from their contract
25
+ */
26
+ export declare function getEmployeeWithContract(employeeId: number): Promise<EmployeeWithContract>;
27
+ /**
28
+ * List employees by job role ID
29
+ * Uses contract data to find employees assigned to a specific job role
30
+ *
31
+ * Note: Job role assignment is stored in contracts (job_catalog_role_id),
32
+ * not on the employee object itself. This is an API design choice by Factorial.
33
+ */
34
+ export declare function listEmployeesByJobRole(jobRoleId: number, options?: PaginationInput): Promise<PaginatedResponse<EmployeeWithContract>>;
35
+ /**
36
+ * List employees by job level ID
37
+ * Uses contract data to find employees at a specific job level
38
+ */
39
+ export declare function listEmployeesByJobLevel(jobLevelId: number, options?: PaginationInput): Promise<PaginatedResponse<EmployeeWithContract>>;
40
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/api/contracts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKxD;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAqBtC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAuBpF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAU/F;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAqDlD;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC,CAoDlD"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Contract API endpoints
3
+ */
4
+ import { fetchList } from '../http-client.js';
5
+ import { cached, CACHE_TTL } from '../cache.js';
6
+ import { buildPaginationParams, sliceForPagination, } from '../pagination.js';
7
+ import { validateId } from '../utils.js';
8
+ import { ENDPOINTS } from '../endpoints.js';
9
+ import { getEmployee } from './employees.js';
10
+ /**
11
+ * List contracts, optionally filtered by employee ID
12
+ */
13
+ export async function listContracts(employeeId, options) {
14
+ if (employeeId !== undefined) {
15
+ validateId(employeeId, 'employee');
16
+ }
17
+ const params = buildPaginationParams(options);
18
+ // Note: The API doesn't reliably filter by employee_id query param,
19
+ // so we fetch all contracts and filter client-side
20
+ const allContracts = await cached('contracts:all', () => fetchList(ENDPOINTS.contracts), CACHE_TTL.contracts);
21
+ const filtered = employeeId !== undefined
22
+ ? allContracts.filter(c => c.employee_id === employeeId)
23
+ : allContracts;
24
+ return sliceForPagination(filtered, params);
25
+ }
26
+ /**
27
+ * Get the latest contract for an employee
28
+ * Returns the most recent contract based on effective_on date
29
+ */
30
+ export async function getLatestContract(employeeId) {
31
+ validateId(employeeId, 'employee');
32
+ const allContracts = await cached('contracts:all', () => fetchList(ENDPOINTS.contracts), CACHE_TTL.contracts);
33
+ const employeeContracts = allContracts.filter(c => c.employee_id === employeeId);
34
+ if (employeeContracts.length === 0) {
35
+ return null;
36
+ }
37
+ // Sort by effective_on descending (most recent first)
38
+ employeeContracts.sort((a, b) => {
39
+ const dateA = a.effective_on ? new Date(a.effective_on).getTime() : 0;
40
+ const dateB = b.effective_on ? new Date(b.effective_on).getTime() : 0;
41
+ return dateB - dateA;
42
+ });
43
+ return employeeContracts[0];
44
+ }
45
+ /**
46
+ * Get an employee with their latest contract
47
+ * Combines employee data with compensation/job role info from their contract
48
+ */
49
+ export async function getEmployeeWithContract(employeeId) {
50
+ validateId(employeeId, 'employee');
51
+ // Fetch employee and contract in parallel
52
+ const [employee, contract] = await Promise.all([
53
+ getEmployee(employeeId),
54
+ getLatestContract(employeeId),
55
+ ]);
56
+ return { employee, contract };
57
+ }
58
+ /**
59
+ * List employees by job role ID
60
+ * Uses contract data to find employees assigned to a specific job role
61
+ *
62
+ * Note: Job role assignment is stored in contracts (job_catalog_role_id),
63
+ * not on the employee object itself. This is an API design choice by Factorial.
64
+ */
65
+ export async function listEmployeesByJobRole(jobRoleId, options) {
66
+ validateId(jobRoleId, 'job role');
67
+ const params = buildPaginationParams(options);
68
+ // Get all contracts and filter by job role
69
+ const allContracts = await cached('contracts:all', () => fetchList(ENDPOINTS.contracts), CACHE_TTL.contracts);
70
+ // Find contracts with this job role, grouped by employee (latest contract per employee)
71
+ const latestContractsByEmployee = new Map();
72
+ for (const contract of allContracts) {
73
+ if (contract.job_catalog_role_id === jobRoleId) {
74
+ const existing = latestContractsByEmployee.get(contract.employee_id);
75
+ if (!existing) {
76
+ latestContractsByEmployee.set(contract.employee_id, contract);
77
+ }
78
+ else {
79
+ // Keep the more recent contract
80
+ const existingDate = existing.effective_on ? new Date(existing.effective_on).getTime() : 0;
81
+ const contractDate = contract.effective_on ? new Date(contract.effective_on).getTime() : 0;
82
+ if (contractDate > existingDate) {
83
+ latestContractsByEmployee.set(contract.employee_id, contract);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ const employeeIds = Array.from(latestContractsByEmployee.keys());
89
+ if (employeeIds.length === 0) {
90
+ return { data: [], meta: { page: params.page, limit: params.limit, total: 0 } };
91
+ }
92
+ // Get all employees
93
+ const allEmployees = await cached('employees:all', () => fetchList(ENDPOINTS.employees), CACHE_TTL.employees);
94
+ // Match employees with their contracts
95
+ const results = [];
96
+ for (const emp of allEmployees) {
97
+ const contract = latestContractsByEmployee.get(emp.id);
98
+ if (contract) {
99
+ results.push({ employee: emp, contract });
100
+ }
101
+ }
102
+ return sliceForPagination(results, params);
103
+ }
104
+ /**
105
+ * List employees by job level ID
106
+ * Uses contract data to find employees at a specific job level
107
+ */
108
+ export async function listEmployeesByJobLevel(jobLevelId, options) {
109
+ validateId(jobLevelId, 'job level');
110
+ const params = buildPaginationParams(options);
111
+ // Get all contracts and filter by job level
112
+ const allContracts = await cached('contracts:all', () => fetchList(ENDPOINTS.contracts), CACHE_TTL.contracts);
113
+ // Find contracts with this job level, grouped by employee (latest contract per employee)
114
+ const latestContractsByEmployee = new Map();
115
+ for (const contract of allContracts) {
116
+ if (contract.job_catalog_level_id === jobLevelId) {
117
+ const existing = latestContractsByEmployee.get(contract.employee_id);
118
+ if (!existing) {
119
+ latestContractsByEmployee.set(contract.employee_id, contract);
120
+ }
121
+ else {
122
+ const existingDate = existing.effective_on ? new Date(existing.effective_on).getTime() : 0;
123
+ const contractDate = contract.effective_on ? new Date(contract.effective_on).getTime() : 0;
124
+ if (contractDate > existingDate) {
125
+ latestContractsByEmployee.set(contract.employee_id, contract);
126
+ }
127
+ }
128
+ }
129
+ }
130
+ const employeeIds = Array.from(latestContractsByEmployee.keys());
131
+ if (employeeIds.length === 0) {
132
+ return { data: [], meta: { page: params.page, limit: params.limit, total: 0 } };
133
+ }
134
+ // Get all employees
135
+ const allEmployees = await cached('employees:all', () => fetchList(ENDPOINTS.employees), CACHE_TTL.employees);
136
+ // Match employees with their contracts
137
+ const results = [];
138
+ for (const emp of allEmployees) {
139
+ const contract = latestContractsByEmployee.get(emp.id);
140
+ if (contract) {
141
+ results.push({ employee: emp, contract });
142
+ }
143
+ }
144
+ return sliceForPagination(results, params);
145
+ }
146
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/api/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Document API endpoints: Folders, Documents, Downloads
3
+ */
4
+ import { type PaginatedResponse } from '../pagination.js';
5
+ import type { Folder, Document } from '../schemas.js';
6
+ import type { ListDocumentsOptions } from '../types.js';
7
+ /**
8
+ * List all folders
9
+ */
10
+ export declare function listFolders(): Promise<Folder[]>;
11
+ /**
12
+ * Get a specific folder by ID
13
+ */
14
+ export declare function getFolder(id: number): Promise<Folder>;
15
+ /**
16
+ * List documents with optional filtering by folder
17
+ */
18
+ export declare function listDocuments(options?: ListDocumentsOptions): Promise<PaginatedResponse<Document>>;
19
+ /**
20
+ * Get a specific document by ID
21
+ *
22
+ * Note: The Factorial API's individual document endpoint (/documents/documents/{id})
23
+ * can be unreliable, similar to the employee endpoint. This function implements a fallback
24
+ * to listing all documents and filtering if the direct endpoint fails or returns no data.
25
+ *
26
+ * IMPORTANT: Due to Factorial API limitations, this function may not find employee-specific
27
+ * documents that were returned by listDocuments({ employee_ids: [...] }). This is because
28
+ * the fallback query cannot access all employee documents. For download operations,
29
+ * prefer using the document object directly (from listDocuments) rather than re-fetching by ID.
30
+ *
31
+ * @param id - The document ID
32
+ * @returns The document object
33
+ * @throws Error if document is not found
34
+ */
35
+ export declare function getDocument(id: number): Promise<Document>;
36
+ /**
37
+ * Response from the download-urls/bulk-create endpoint
38
+ */
39
+ interface DownloadUrlResponse {
40
+ document_id: number;
41
+ url: string;
42
+ }
43
+ /**
44
+ * Get download URLs for documents using the bulk-create endpoint
45
+ *
46
+ * IMPORTANT: This endpoint requires OAuth2 authentication. API key authentication
47
+ * does not work for document downloads - this is a Factorial API limitation.
48
+ *
49
+ * @param documentIds - Array of document IDs to get download URLs for
50
+ * @returns Array of document IDs with their signed download URLs
51
+ * @throws Error if OAuth2 is not configured or authentication fails
52
+ */
53
+ export declare function getDocumentDownloadUrls(documentIds: number[]): Promise<DownloadUrlResponse[]>;
54
+ /**
55
+ * Download a document by getting its signed URL and fetching the content
56
+ * @param idOrDocument - The document ID or a Document object (to avoid re-fetching metadata)
57
+ * @param outputDir - Directory to save the file to
58
+ * @returns Path to the downloaded file and metadata
59
+ */
60
+ export declare function downloadDocument(idOrDocument: number | Document, outputDir: string): Promise<{
61
+ path: string;
62
+ document: Document;
63
+ }>;
64
+ /**
65
+ * Outcome of a bulk payslip download
66
+ *
67
+ * Failures are returned rather than swallowed, so a partial download cannot be
68
+ * reported as a complete one.
69
+ */
70
+ export interface PayslipDownloadResult {
71
+ downloaded: Array<{
72
+ path: string;
73
+ document: Document;
74
+ }>;
75
+ failures: string[];
76
+ }
77
+ /**
78
+ * Download all payslips for an employee
79
+ * @param employeeId - The employee ID
80
+ * @param outputDir - Directory to save files to
81
+ * @returns The payslips downloaded, and a description of any that failed
82
+ */
83
+ export declare function downloadEmployeePayslips(employeeId: number, outputDir: string): Promise<PayslipDownloadResult>;
84
+ /**
85
+ * Download any employee document by ID
86
+ * @param documentId - The document ID
87
+ * @param outputDir - Directory to save the file to
88
+ * @returns Path to the downloaded file and metadata
89
+ */
90
+ export declare function downloadEmployeeDocument(documentId: number, outputDir: string): Promise<{
91
+ path: string;
92
+ document: Document;
93
+ }>;
94
+ export {};
95
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/api/documents.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAA2C,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAErD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI3D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAqCtC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoC/D;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAoEhC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,MAAM,GAAG,QAAQ,EAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CA6C/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;IACxD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAmDhC;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAE/C"}