@t4dhg/mcp-factorial 7.1.0 → 9.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 (209) hide show
  1. package/README.md +279 -56
  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 +269 -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/config.d.ts +1 -1
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +4 -1
  73. package/dist/config.js.map +1 -1
  74. package/dist/http-client.d.ts +12 -0
  75. package/dist/http-client.d.ts.map +1 -1
  76. package/dist/http-client.js +32 -1
  77. package/dist/http-client.js.map +1 -1
  78. package/dist/index.d.ts +6 -13
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +6 -3860
  81. package/dist/index.js.map +1 -1
  82. package/dist/oauth.d.ts +63 -0
  83. package/dist/oauth.d.ts.map +1 -0
  84. package/dist/oauth.js +143 -0
  85. package/dist/oauth.js.map +1 -0
  86. package/dist/schemas/ats.d.ts +403 -0
  87. package/dist/schemas/ats.d.ts.map +1 -0
  88. package/dist/schemas/ats.js +159 -0
  89. package/dist/schemas/ats.js.map +1 -0
  90. package/dist/schemas/documents.d.ts +108 -0
  91. package/dist/schemas/documents.d.ts.map +1 -0
  92. package/dist/schemas/documents.js +63 -0
  93. package/dist/schemas/documents.js.map +1 -0
  94. package/dist/schemas/employees.d.ts +586 -0
  95. package/dist/schemas/employees.d.ts.map +1 -0
  96. package/dist/schemas/employees.js +241 -0
  97. package/dist/schemas/employees.js.map +1 -0
  98. package/dist/schemas/index.d.ts +18 -0
  99. package/dist/schemas/index.d.ts.map +1 -0
  100. package/dist/schemas/index.js +28 -0
  101. package/dist/schemas/index.js.map +1 -0
  102. package/dist/schemas/job-catalog.d.ts +69 -0
  103. package/dist/schemas/job-catalog.d.ts.map +1 -0
  104. package/dist/schemas/job-catalog.js +34 -0
  105. package/dist/schemas/job-catalog.js.map +1 -0
  106. package/dist/schemas/payroll.d.ts +117 -0
  107. package/dist/schemas/payroll.d.ts.map +1 -0
  108. package/dist/schemas/payroll.js +68 -0
  109. package/dist/schemas/payroll.js.map +1 -0
  110. package/dist/schemas/projects.d.ts +303 -0
  111. package/dist/schemas/projects.d.ts.map +1 -0
  112. package/dist/schemas/projects.js +133 -0
  113. package/dist/schemas/projects.js.map +1 -0
  114. package/dist/schemas/shared.d.ts +55 -0
  115. package/dist/schemas/shared.d.ts.map +1 -0
  116. package/dist/schemas/shared.js +78 -0
  117. package/dist/schemas/shared.js.map +1 -0
  118. package/dist/schemas/time-off.d.ts +432 -0
  119. package/dist/schemas/time-off.d.ts.map +1 -0
  120. package/dist/schemas/time-off.js +175 -0
  121. package/dist/schemas/time-off.js.map +1 -0
  122. package/dist/schemas/training.d.ts +327 -0
  123. package/dist/schemas/training.d.ts.map +1 -0
  124. package/dist/schemas/training.js +138 -0
  125. package/dist/schemas/training.js.map +1 -0
  126. package/dist/schemas/work-areas.d.ts +64 -0
  127. package/dist/schemas/work-areas.d.ts.map +1 -0
  128. package/dist/schemas/work-areas.js +32 -0
  129. package/dist/schemas/work-areas.js.map +1 -0
  130. package/dist/schemas.d.ts +3 -1932
  131. package/dist/schemas.d.ts.map +1 -1
  132. package/dist/schemas.js +3 -785
  133. package/dist/schemas.js.map +1 -1
  134. package/dist/tool-utils.d.ts +0 -14
  135. package/dist/tool-utils.d.ts.map +1 -1
  136. package/dist/tool-utils.js +5 -18
  137. package/dist/tool-utils.js.map +1 -1
  138. package/dist/tools/ats.d.ts +6 -0
  139. package/dist/tools/ats.d.ts.map +1 -0
  140. package/dist/tools/ats.js +206 -0
  141. package/dist/tools/ats.js.map +1 -0
  142. package/dist/tools/attendance.d.ts +6 -0
  143. package/dist/tools/attendance.d.ts.map +1 -0
  144. package/dist/tools/attendance.js +86 -0
  145. package/dist/tools/attendance.js.map +1 -0
  146. package/dist/tools/contracts.d.ts +6 -0
  147. package/dist/tools/contracts.d.ts.map +1 -0
  148. package/dist/tools/contracts.js +63 -0
  149. package/dist/tools/contracts.js.map +1 -0
  150. package/dist/tools/documents.d.ts +6 -0
  151. package/dist/tools/documents.d.ts.map +1 -0
  152. package/dist/tools/documents.js +135 -0
  153. package/dist/tools/documents.js.map +1 -0
  154. package/dist/tools/employees.d.ts +6 -0
  155. package/dist/tools/employees.d.ts.map +1 -0
  156. package/dist/tools/employees.js +125 -0
  157. package/dist/tools/employees.js.map +1 -0
  158. package/dist/tools/index.d.ts +17 -0
  159. package/dist/tools/index.d.ts.map +1 -0
  160. package/dist/tools/index.js +221 -0
  161. package/dist/tools/index.js.map +1 -0
  162. package/dist/tools/job-catalog.d.ts +6 -0
  163. package/dist/tools/job-catalog.d.ts.map +1 -0
  164. package/dist/tools/job-catalog.js +39 -0
  165. package/dist/tools/job-catalog.js.map +1 -0
  166. package/dist/tools/locations.d.ts +6 -0
  167. package/dist/tools/locations.d.ts.map +1 -0
  168. package/dist/tools/locations.js +93 -0
  169. package/dist/tools/locations.js.map +1 -0
  170. package/dist/tools/payroll.d.ts +6 -0
  171. package/dist/tools/payroll.d.ts.map +1 -0
  172. package/dist/tools/payroll.js +76 -0
  173. package/dist/tools/payroll.js.map +1 -0
  174. package/dist/tools/projects.d.ts +6 -0
  175. package/dist/tools/projects.d.ts.map +1 -0
  176. package/dist/tools/projects.js +203 -0
  177. package/dist/tools/projects.js.map +1 -0
  178. package/dist/tools/shared.d.ts +84 -0
  179. package/dist/tools/shared.d.ts.map +1 -0
  180. package/dist/tools/shared.js +164 -0
  181. package/dist/tools/shared.js.map +1 -0
  182. package/dist/tools/teams.d.ts +6 -0
  183. package/dist/tools/teams.d.ts.map +1 -0
  184. package/dist/tools/teams.js +81 -0
  185. package/dist/tools/teams.js.map +1 -0
  186. package/dist/tools/time-off.d.ts +6 -0
  187. package/dist/tools/time-off.d.ts.map +1 -0
  188. package/dist/tools/time-off.js +144 -0
  189. package/dist/tools/time-off.js.map +1 -0
  190. package/dist/tools/training.d.ts +6 -0
  191. package/dist/tools/training.d.ts.map +1 -0
  192. package/dist/tools/training.js +160 -0
  193. package/dist/tools/training.js.map +1 -0
  194. package/dist/tools/work-areas.d.ts +6 -0
  195. package/dist/tools/work-areas.d.ts.map +1 -0
  196. package/dist/tools/work-areas.js +85 -0
  197. package/dist/tools/work-areas.js.map +1 -0
  198. package/dist/types.d.ts +1 -1
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/utils.d.ts +35 -0
  201. package/dist/utils.d.ts.map +1 -1
  202. package/dist/utils.js +97 -0
  203. package/dist/utils.js.map +1 -1
  204. package/dist/write-safety.d.ts +229 -2
  205. package/dist/write-safety.d.ts.map +1 -1
  206. package/dist/write-safety.js +42 -3
  207. package/dist/write-safety.js.map +1 -1
  208. package/llms.txt +2 -2
  209. package/package.json +2 -2
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Document API endpoints: Folders, Documents, Downloads
3
+ */
4
+ import { fetchList, fetchOne } from '../http-client.js';
5
+ import { cached, CACHE_TTL } from '../cache.js';
6
+ import { debug } from '../config.js';
7
+ import { isOAuth2Configured, getOAuth2AccessToken } from '../oauth.js';
8
+ import { buildPaginationParams, paginateResponse } from '../pagination.js';
9
+ import { validateId, resolveSafeOutputPath, writeWithoutOverwriting } from '../utils.js';
10
+ import { ENDPOINTS, endpointWithId } from '../endpoints.js';
11
+ import { NotFoundError } from '../errors.js';
12
+ /**
13
+ * List all folders
14
+ */
15
+ export async function listFolders() {
16
+ return cached('folders:all', () => fetchList(ENDPOINTS.folders), CACHE_TTL.default);
17
+ }
18
+ /**
19
+ * Get a specific folder by ID
20
+ */
21
+ export async function getFolder(id) {
22
+ validateId(id, 'folder');
23
+ return fetchOne(endpointWithId(ENDPOINTS.folders, id));
24
+ }
25
+ /**
26
+ * List documents with optional filtering by folder
27
+ */
28
+ export async function listDocuments(options) {
29
+ const params = buildPaginationParams(options);
30
+ const queryParams = {
31
+ page: params.page,
32
+ limit: params.limit,
33
+ };
34
+ if (options?.folder_id)
35
+ queryParams.folder_id = options.folder_id;
36
+ // Handle employee_ids array parameter
37
+ // Factorial API expects: employee_ids[]=123&employee_ids[]=456
38
+ if (options?.employee_ids && options.employee_ids.length > 0) {
39
+ // We'll need to build the query string manually for array parameters
40
+ const employeeIdsParam = options.employee_ids.map(id => `employee_ids[]=${id}`).join('&');
41
+ const baseParams = new URLSearchParams(queryParams).toString();
42
+ const fullParams = baseParams ? `${baseParams}&${employeeIdsParam}` : employeeIdsParam;
43
+ // Make request with custom query string
44
+ const documents = await fetchList(`${ENDPOINTS.documents}?${fullParams}`);
45
+ debug(`listDocuments returned ${documents.length} documents`, {
46
+ sampleDocument: documents[0],
47
+ missingNames: documents.filter(d => !d.filename).length,
48
+ });
49
+ return paginateResponse(documents, params.page, params.limit);
50
+ }
51
+ const documents = await fetchList(ENDPOINTS.documents, { params: queryParams });
52
+ debug(`listDocuments returned ${documents.length} documents`, {
53
+ sampleDocument: documents[0],
54
+ missingNames: documents.filter(d => !d.filename).length,
55
+ });
56
+ return paginateResponse(documents, params.page, params.limit);
57
+ }
58
+ /**
59
+ * Get a specific document by ID
60
+ *
61
+ * Note: The Factorial API's individual document endpoint (/documents/documents/{id})
62
+ * can be unreliable, similar to the employee endpoint. This function implements a fallback
63
+ * to listing all documents and filtering if the direct endpoint fails or returns no data.
64
+ *
65
+ * IMPORTANT: Due to Factorial API limitations, this function may not find employee-specific
66
+ * documents that were returned by listDocuments({ employee_ids: [...] }). This is because
67
+ * the fallback query cannot access all employee documents. For download operations,
68
+ * prefer using the document object directly (from listDocuments) rather than re-fetching by ID.
69
+ *
70
+ * @param id - The document ID
71
+ * @returns The document object
72
+ * @throws Error if document is not found
73
+ */
74
+ export async function getDocument(id) {
75
+ validateId(id, 'document');
76
+ // Try the direct endpoint first
77
+ try {
78
+ const document = await fetchOne(endpointWithId(ENDPOINTS.documents, id));
79
+ // If we got a valid document, return it
80
+ if (document) {
81
+ return document;
82
+ }
83
+ }
84
+ catch (error) {
85
+ // If direct fetch fails with NotFoundError, try fallback
86
+ if (!(error instanceof NotFoundError)) {
87
+ throw error;
88
+ }
89
+ debug(`getDocument(${id}) - direct endpoint failed, using fallback`);
90
+ }
91
+ // Fallback: Fetch all documents and filter by ID
92
+ // Note: This may not return employee-specific documents due to API access limitations
93
+ const allDocuments = await fetchList(ENDPOINTS.documents);
94
+ const document = allDocuments.find(doc => doc.id === String(id));
95
+ if (!document) {
96
+ throw new Error(`Document with ID ${id} not found.\n\n` +
97
+ 'This may happen when trying to access employee-specific documents. ' +
98
+ 'The Factorial API has limitations retrieving individual documents by ID.\n\n' +
99
+ 'Workaround: Use list_documents with employee_ids filter to get document metadata, ' +
100
+ 'then use download_payslips or download action with the document ID from that list.');
101
+ }
102
+ return document;
103
+ }
104
+ /**
105
+ * Get download URLs for documents using the bulk-create endpoint
106
+ *
107
+ * IMPORTANT: This endpoint requires OAuth2 authentication. API key authentication
108
+ * does not work for document downloads - this is a Factorial API limitation.
109
+ *
110
+ * @param documentIds - Array of document IDs to get download URLs for
111
+ * @returns Array of document IDs with their signed download URLs
112
+ * @throws Error if OAuth2 is not configured or authentication fails
113
+ */
114
+ export async function getDocumentDownloadUrls(documentIds) {
115
+ // Check if OAuth2 is configured - required for downloads
116
+ if (!isOAuth2Configured()) {
117
+ throw new Error('Document download requires OAuth2 authentication.\n\n' +
118
+ 'The Factorial API does not support document downloads with API key authentication.\n' +
119
+ 'This is a Factorial API limitation, not an MCP server limitation.\n\n' +
120
+ 'To enable document downloads:\n' +
121
+ ' 1. Go to https://api.factorialhr.com/oauth/applications\n' +
122
+ ' 2. Create an OAuth2 application\n' +
123
+ ' 3. Complete the authorization flow to get a refresh token\n' +
124
+ ' 4. Set environment variables:\n' +
125
+ ' - FACTORIAL_OAUTH_CLIENT_ID\n' +
126
+ ' - FACTORIAL_OAUTH_CLIENT_SECRET\n' +
127
+ ' - FACTORIAL_OAUTH_REFRESH_TOKEN\n\n' +
128
+ 'See the README for detailed OAuth2 setup instructions.\n\n' +
129
+ `Document IDs requested: ${documentIds.join(', ')}`);
130
+ }
131
+ // Get OAuth2 access token
132
+ const accessToken = await getOAuth2AccessToken();
133
+ // The download-urls endpoint uses API version 2025-01-01, which predates the
134
+ // string-identifier migration and expects numeric ids on the wire, as this
135
+ // server sent before 2026-07-01 became the default. This request bypasses
136
+ // factorialRequest, so stringifyIdentifiers does not apply here.
137
+ const downloadUrlsEndpoint = 'https://api.factorialhr.com/api/2025-01-01/resources/documents/download-urls/bulk-create';
138
+ const wireDocumentIds = documentIds.map(Number);
139
+ debug('Requesting document download URLs with OAuth2', { documentIds });
140
+ const response = await fetch(downloadUrlsEndpoint, {
141
+ method: 'POST',
142
+ headers: {
143
+ Authorization: `Bearer ${accessToken}`,
144
+ 'Content-Type': 'application/json',
145
+ Accept: 'application/json',
146
+ },
147
+ body: JSON.stringify({ document_ids: wireDocumentIds }),
148
+ });
149
+ if (!response.ok) {
150
+ const errorText = await response.text();
151
+ let errorData = null;
152
+ try {
153
+ errorData = JSON.parse(errorText);
154
+ }
155
+ catch {
156
+ // Ignore parse errors
157
+ }
158
+ // Handle specific errors
159
+ if (response.status === 401) {
160
+ throw new Error('OAuth2 authentication failed. The access token may have expired or been revoked.\n' +
161
+ 'Try re-authorizing the OAuth2 application to get a new refresh token.');
162
+ }
163
+ if (errorData?.errors?.some(e => e.includes('not found'))) {
164
+ throw new Error(`Documents not found or not accessible. Document IDs: ${documentIds.join(', ')}`);
165
+ }
166
+ throw new Error(`Failed to get download URLs: ${response.status} ${errorText}`);
167
+ }
168
+ const data = (await response.json());
169
+ debug('Document download URLs retrieved successfully', { count: data.data.length });
170
+ return data.data;
171
+ }
172
+ /**
173
+ * Download a document by getting its signed URL and fetching the content
174
+ * @param idOrDocument - The document ID or a Document object (to avoid re-fetching metadata)
175
+ * @param outputDir - Directory to save the file to
176
+ * @returns Path to the downloaded file and metadata
177
+ */
178
+ export async function downloadDocument(idOrDocument, outputDir) {
179
+ // Use provided document or fetch it
180
+ const document = typeof idOrDocument === 'number' ? await getDocument(idOrDocument) : idOrDocument;
181
+ const id = document.id;
182
+ // Get the signed download URL
183
+ const downloadUrls = await getDocumentDownloadUrls([id]);
184
+ const urlInfo = downloadUrls.find(u => String(u.document_id) === id);
185
+ if (!urlInfo?.url) {
186
+ throw new Error(`No download URL returned for document ${id}`);
187
+ }
188
+ // Ensure output directory exists
189
+ const fs = await import('fs/promises');
190
+ await fs.mkdir(outputDir, { recursive: true });
191
+ // Generate filename from document name or ID with appropriate extension.
192
+ // The document name is tenant-controlled metadata, so it is sanitized before
193
+ // being joined onto the output directory.
194
+ const ext = document.content_type === 'application/pdf' ? '.pdf' : '';
195
+ const fallbackName = `document-${id}${ext}`;
196
+ const outputPath = resolveSafeOutputPath(outputDir, document.filename || fallbackName, fallbackName);
197
+ // Download the file from the signed URL
198
+ const response = await fetch(urlInfo.url);
199
+ if (!response.ok) {
200
+ throw new Error(`Failed to download document: ${response.status} ${response.statusText}`);
201
+ }
202
+ const buffer = Buffer.from(await response.arrayBuffer());
203
+ // Never overwrite. The document name is tenant-controlled, so a download can
204
+ // otherwise land on an existing file the caller cares about, and two documents
205
+ // sharing a name would silently collapse into one. The `wx` flag fails if the
206
+ // path exists, so the loop settles on the first free "name (n).ext".
207
+ const writtenPath = await writeWithoutOverwriting(outputPath, buffer);
208
+ debug(`Downloaded document ${id} to ${writtenPath}`, {
209
+ size: buffer.length,
210
+ mime: document.content_type,
211
+ });
212
+ return { path: writtenPath, document };
213
+ }
214
+ /**
215
+ * Download all payslips for an employee
216
+ * @param employeeId - The employee ID
217
+ * @param outputDir - Directory to save files to
218
+ * @returns The payslips downloaded, and a description of any that failed
219
+ */
220
+ export async function downloadEmployeePayslips(employeeId, outputDir) {
221
+ // Find the Nómina (payslip) folder
222
+ const folders = await listFolders();
223
+ const payslipFolder = folders.find(f => f.name.toLowerCase() === 'nómina' ||
224
+ f.name.toLowerCase() === 'nomina' ||
225
+ f.name.toLowerCase() === 'payslips');
226
+ if (!payslipFolder) {
227
+ throw new Error('Could not find payslip folder (Nómina) in Factorial');
228
+ }
229
+ // Get all documents for this employee in the payslip folder
230
+ const allDocs = await listDocuments({ employee_ids: [employeeId] });
231
+ const payslipDocs = allDocs.data.filter(d => d.folder_id === payslipFolder.id);
232
+ if (payslipDocs.length === 0) {
233
+ throw new Error(`No payslips found for employee ${employeeId}`);
234
+ }
235
+ // Download each payslip - pass the document object to avoid re-fetching metadata
236
+ const results = [];
237
+ const failures = [];
238
+ for (const doc of payslipDocs) {
239
+ try {
240
+ const result = await downloadDocument(doc, outputDir);
241
+ results.push(result);
242
+ }
243
+ catch (error) {
244
+ const reason = error instanceof Error ? error.message : 'Unknown error';
245
+ debug(`Failed to download payslip ${doc.id}: ${reason}`);
246
+ failures.push(`document ${doc.id}: ${reason}`);
247
+ }
248
+ }
249
+ // A partial download used to look identical to a complete one: failures went
250
+ // to debug(), which is silent unless DEBUG is set, and the missing payslips
251
+ // simply did not appear in the results.
252
+ if (failures.length > 0 && results.length === 0) {
253
+ throw new Error(`All ${failures.length} payslip downloads failed for employee ${employeeId}:\n${failures.join('\n')}`);
254
+ }
255
+ if (failures.length > 0) {
256
+ debug(`Partial payslip download for employee ${employeeId}`, { failures });
257
+ }
258
+ return { downloaded: results, failures };
259
+ }
260
+ /**
261
+ * Download any employee document by ID
262
+ * @param documentId - The document ID
263
+ * @param outputDir - Directory to save the file to
264
+ * @returns Path to the downloaded file and metadata
265
+ */
266
+ export async function downloadEmployeeDocument(documentId, outputDir) {
267
+ return downloadDocument(documentId, outputDir);
268
+ }
269
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/api/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Employee API endpoints
3
+ */
4
+ import { type PaginatedResponse } from '../pagination.js';
5
+ import type { Employee, CreateEmployeeInput, UpdateEmployeeInput } from '../schemas.js';
6
+ import type { ListEmployeesOptions } from '../types.js';
7
+ /**
8
+ * List all employees with optional filtering and pagination
9
+ */
10
+ export declare function listEmployees(options?: ListEmployeesOptions): Promise<PaginatedResponse<Employee>>;
11
+ /**
12
+ * Get a specific employee by ID
13
+ *
14
+ * Note: The Factorial API's individual employee endpoint (/employees/employees/{id})
15
+ * can be unreliable. This function falls back to fetching all employees and filtering
16
+ * if the direct endpoint fails or returns no data.
17
+ */
18
+ export declare function getEmployee(id: number): Promise<Employee>;
19
+ /**
20
+ * Search employees by name or email
21
+ */
22
+ export declare function searchEmployees(query: string): Promise<Employee[]>;
23
+ /**
24
+ * Create a new employee
25
+ */
26
+ export declare function createEmployee(input: CreateEmployeeInput): Promise<Employee>;
27
+ /**
28
+ * Update an existing employee
29
+ */
30
+ export declare function updateEmployee(id: number, input: UpdateEmployeeInput): Promise<Employee>;
31
+ /**
32
+ * Terminate an employee (soft delete)
33
+ */
34
+ export declare function terminateEmployee(id: number, terminatedOn: string, reason?: string): Promise<Employee>;
35
+ //# sourceMappingURL=employees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.d.ts","sourceRoot":"","sources":["../../src/api/employees.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAKxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CA+BtC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsC/D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoBxE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAYlF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAS9F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAiBnB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Employee API endpoints
3
+ */
4
+ import { fetchList, fetchOne, postOne, patchOne } from '../http-client.js';
5
+ import { cache, cached, CACHE_TTL, CacheManager } from '../cache.js';
6
+ import { buildPaginationParams, paginateResponse, sliceForPagination, } from '../pagination.js';
7
+ import { AuditAction, auditedOperation } from '../audit.js';
8
+ import { validateId } from '../utils.js';
9
+ import { ENDPOINTS, endpointWithId } from '../endpoints.js';
10
+ import { NotFoundError } from '../errors.js';
11
+ /**
12
+ * List all employees with optional filtering and pagination
13
+ */
14
+ export async function listEmployees(options) {
15
+ const params = buildPaginationParams(options);
16
+ const cacheKey = CacheManager.key('employees', options);
17
+ // For filtered requests, we need to fetch all and filter client-side
18
+ // because the API doesn't reliably filter
19
+ if (options?.team_id || options?.location_id) {
20
+ const allEmployees = await cached('employees:all', () => fetchList(ENDPOINTS.employees), CACHE_TTL.employees);
21
+ let filtered = allEmployees;
22
+ // Note: team_id filtering requires fetching teams separately (not on Employee object)
23
+ // TODO: Implement team filtering via teams endpoint if needed
24
+ if (options.location_id) {
25
+ filtered = filtered.filter(e => e.location_id === String(options.location_id));
26
+ }
27
+ return sliceForPagination(filtered, params);
28
+ }
29
+ // Without filters, use pagination directly
30
+ const employees = await cached(cacheKey, () => fetchList(ENDPOINTS.employees, { params }), CACHE_TTL.employees);
31
+ return paginateResponse(employees, params.page, params.limit);
32
+ }
33
+ /**
34
+ * Get a specific employee by ID
35
+ *
36
+ * Note: The Factorial API's individual employee endpoint (/employees/employees/{id})
37
+ * can be unreliable. This function falls back to fetching all employees and filtering
38
+ * if the direct endpoint fails or returns no data.
39
+ */
40
+ export async function getEmployee(id) {
41
+ validateId(id, 'employee');
42
+ // Try the direct endpoint first
43
+ try {
44
+ const employee = await cached(`employee:${id}`, () => fetchOne(endpointWithId(ENDPOINTS.employees, id)), CACHE_TTL.employees);
45
+ // If we got a valid employee, return it
46
+ if (employee) {
47
+ return employee;
48
+ }
49
+ }
50
+ catch (error) {
51
+ // If direct fetch fails with NotFoundError, try fallback
52
+ // (other errors will be re-thrown below)
53
+ if (!(error instanceof NotFoundError)) {
54
+ throw error;
55
+ }
56
+ }
57
+ // Fallback: Fetch all employees and filter (same approach as searchEmployees)
58
+ // This works around Factorial API limitations with the individual employee endpoint
59
+ const allEmployees = await cached('employees:all', () => fetchList(ENDPOINTS.employees), CACHE_TTL.employees);
60
+ const employee = allEmployees.find(emp => emp.id === String(id));
61
+ if (!employee) {
62
+ throw new Error(`Employee with ID ${id} not found.`);
63
+ }
64
+ return employee;
65
+ }
66
+ /**
67
+ * Search employees by name or email
68
+ */
69
+ export async function searchEmployees(query) {
70
+ if (!query || query.trim().length < 2) {
71
+ throw new Error('Search query must be at least 2 characters long.');
72
+ }
73
+ const allEmployees = await cached('employees:all', () => fetchList(ENDPOINTS.employees), CACHE_TTL.employees);
74
+ const lowerQuery = query.toLowerCase().trim();
75
+ return allEmployees.filter(emp => emp.full_name?.toLowerCase().includes(lowerQuery) ||
76
+ emp.email?.toLowerCase().includes(lowerQuery) ||
77
+ emp.first_name?.toLowerCase().includes(lowerQuery) ||
78
+ emp.last_name?.toLowerCase().includes(lowerQuery));
79
+ }
80
+ /**
81
+ * Create a new employee
82
+ */
83
+ export async function createEmployee(input) {
84
+ return auditedOperation(AuditAction.CREATE, 'employee', undefined, async () => {
85
+ const employee = await postOne(ENDPOINTS.employees, input);
86
+ cache.invalidatePrefix('employees');
87
+ return employee;
88
+ }, Object.fromEntries(Object.entries(input).map(([k, v]) => [k, { to: v }])));
89
+ }
90
+ /**
91
+ * Update an existing employee
92
+ */
93
+ export async function updateEmployee(id, input) {
94
+ validateId(id, 'employee');
95
+ return auditedOperation(AuditAction.UPDATE, 'employee', id, async () => {
96
+ const employee = await patchOne(endpointWithId(ENDPOINTS.employees, id), input);
97
+ cache.invalidate(`employee:${id}`);
98
+ cache.invalidatePrefix('employees');
99
+ return employee;
100
+ });
101
+ }
102
+ /**
103
+ * Terminate an employee (soft delete)
104
+ */
105
+ export async function terminateEmployee(id, terminatedOn, reason) {
106
+ validateId(id, 'employee');
107
+ return auditedOperation(AuditAction.TERMINATE, 'employee', id, async () => {
108
+ const employee = await patchOne(endpointWithId(ENDPOINTS.employees, id), {
109
+ terminated_on: terminatedOn,
110
+ });
111
+ cache.invalidate(`employee:${id}`);
112
+ cache.invalidatePrefix('employees');
113
+ return employee;
114
+ }, { terminated_on: { to: terminatedOn }, reason: { to: reason } });
115
+ }
116
+ //# sourceMappingURL=employees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/api/employees.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * FactorialHR API Client
3
+ *
4
+ * Provides access to FactorialHR API endpoints with caching, pagination, and retry logic.
5
+ *
6
+ * This module re-exports all API functions from domain-specific files.
7
+ */
8
+ export { clearCache, invalidateCache } from './shared.js';
9
+ export { listEmployees, getEmployee, searchEmployees, createEmployee, updateEmployee, terminateEmployee, } from './employees.js';
10
+ export { listTeams, getTeam, createTeam, updateTeam, deleteTeam } from './teams.js';
11
+ export { listLocations, getLocation, createLocation, updateLocation, deleteLocation, } from './locations.js';
12
+ export { listContracts, getLatestContract, getEmployeeWithContract, listEmployeesByJobRole, listEmployeesByJobLevel, type EmployeeWithContract, } from './contracts.js';
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';
15
+ export { listFolders, getFolder, listDocuments, getDocument, getDocumentDownloadUrls, downloadDocument, downloadEmployeePayslips, downloadEmployeeDocument, } from './documents.js';
16
+ export { listJobRoles, getJobRole, listJobLevels, getJobLevel } from './job-catalog.js';
17
+ export { listProjects, getProject, listProjectTasks, getProjectTask, listProjectWorkers, getProjectWorker, listTimeRecords, getTimeRecord, createProject, updateProject, deleteProject, createProjectTask, updateProjectTask, deleteProjectTask, assignProjectWorker, removeProjectWorker, createTimeRecord, updateTimeRecord, deleteTimeRecord, } from './projects.js';
18
+ export { listTrainings, getTraining, listTrainingSessions, getTrainingSession, listTrainingEnrollments, getTrainingEnrollment, createTraining, updateTraining, deleteTraining, createTrainingSession, updateTrainingSession, deleteTrainingSession, enrollInTraining, unenrollFromTraining, } from './training.js';
19
+ export { listWorkAreas, getWorkArea, createWorkArea, updateWorkArea, archiveWorkArea, unarchiveWorkArea, } from './work-areas.js';
20
+ export { listJobPostings, getJobPosting, listCandidates, getCandidate, listApplications, getApplication, listHiringStages, getHiringStage, createJobPosting, updateJobPosting, deleteJobPosting, createCandidate, updateCandidate, deleteCandidate, createApplication, updateApplication, deleteApplication, advanceApplication, } from './ats.js';
21
+ export { listPayrollSupplements, getPayrollSupplement, listTaxIdentifiers, getTaxIdentifier, listFamilySituations, getFamilySituation, } from './payroll.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * FactorialHR API Client
3
+ *
4
+ * Provides access to FactorialHR API endpoints with caching, pagination, and retry logic.
5
+ *
6
+ * This module re-exports all API functions from domain-specific files.
7
+ */
8
+ // Shared utilities
9
+ export { clearCache, invalidateCache } from './shared.js';
10
+ // Employees
11
+ export { listEmployees, getEmployee, searchEmployees, createEmployee, updateEmployee, terminateEmployee, } from './employees.js';
12
+ // Teams
13
+ export { listTeams, getTeam, createTeam, updateTeam, deleteTeam } from './teams.js';
14
+ // Locations
15
+ export { listLocations, getLocation, createLocation, updateLocation, deleteLocation, } from './locations.js';
16
+ // Contracts
17
+ export { listContracts, getLatestContract, getEmployeeWithContract, listEmployeesByJobRole, listEmployeesByJobLevel, } from './contracts.js';
18
+ // Time Off
19
+ export { listLeaves, getLeave, listLeaveTypes, getLeaveType, listAllowances, createLeave, updateLeave, cancelLeave, approveLeave, rejectLeave, } from './time-off.js';
20
+ // Attendance
21
+ export { listShifts, getShift, createShift, updateShift, deleteShift } from './attendance.js';
22
+ // Documents
23
+ export { listFolders, getFolder, listDocuments, getDocument, getDocumentDownloadUrls, downloadDocument, downloadEmployeePayslips, downloadEmployeeDocument, } from './documents.js';
24
+ // Job Catalog
25
+ export { listJobRoles, getJobRole, listJobLevels, getJobLevel } from './job-catalog.js';
26
+ // Projects
27
+ export { listProjects, getProject, listProjectTasks, getProjectTask, listProjectWorkers, getProjectWorker, listTimeRecords, getTimeRecord, createProject, updateProject, deleteProject, createProjectTask, updateProjectTask, deleteProjectTask, assignProjectWorker, removeProjectWorker, createTimeRecord, updateTimeRecord, deleteTimeRecord, } from './projects.js';
28
+ // Training
29
+ export { listTrainings, getTraining, listTrainingSessions, getTrainingSession, listTrainingEnrollments, getTrainingEnrollment, createTraining, updateTraining, deleteTraining, createTrainingSession, updateTrainingSession, deleteTrainingSession, enrollInTraining, unenrollFromTraining, } from './training.js';
30
+ // Work Areas
31
+ export { listWorkAreas, getWorkArea, createWorkArea, updateWorkArea, archiveWorkArea, unarchiveWorkArea, } from './work-areas.js';
32
+ // ATS (Recruiting)
33
+ export { listJobPostings, getJobPosting, listCandidates, getCandidate, listApplications, getApplication, listHiringStages, getHiringStage, createJobPosting, updateJobPosting, deleteJobPosting, createCandidate, updateCandidate, deleteCandidate, createApplication, updateApplication, deleteApplication, advanceApplication, } from './ats.js';
34
+ // Payroll
35
+ export { listPayrollSupplements, getPayrollSupplement, listTaxIdentifiers, getTaxIdentifier, listFamilySituations, getFamilySituation, } from './payroll.js';
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Job Catalog API endpoints: Job Roles, Job Levels
3
+ */
4
+ import type { JobRole, JobLevel } from '../schemas.js';
5
+ /**
6
+ * List all job roles
7
+ */
8
+ export declare function listJobRoles(): Promise<JobRole[]>;
9
+ /**
10
+ * Get a specific job role by ID
11
+ */
12
+ export declare function getJobRole(id: number): Promise<JobRole>;
13
+ /**
14
+ * List all job levels
15
+ */
16
+ export declare function listJobLevels(): Promise<JobLevel[]>;
17
+ /**
18
+ * Get a specific job level by ID
19
+ */
20
+ export declare function getJobLevel(id: number): Promise<JobLevel>;
21
+ //# sourceMappingURL=job-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-catalog.d.ts","sourceRoot":"","sources":["../../src/api/job-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIvD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAEvD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMzD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAI/D"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Job Catalog API endpoints: Job Roles, Job Levels
3
+ */
4
+ import { fetchList, fetchOne } from '../http-client.js';
5
+ import { cached, CACHE_TTL } from '../cache.js';
6
+ import { validateId } from '../utils.js';
7
+ import { ENDPOINTS, endpointWithId } from '../endpoints.js';
8
+ /**
9
+ * List all job roles
10
+ */
11
+ export async function listJobRoles() {
12
+ return cached('job-roles:all', () => fetchList(ENDPOINTS.jobRoles), CACHE_TTL.default);
13
+ }
14
+ /**
15
+ * Get a specific job role by ID
16
+ */
17
+ export async function getJobRole(id) {
18
+ validateId(id, 'job role');
19
+ return fetchOne(endpointWithId(ENDPOINTS.jobRoles, id));
20
+ }
21
+ /**
22
+ * List all job levels
23
+ */
24
+ export async function listJobLevels() {
25
+ return cached('job-levels:all', () => fetchList(ENDPOINTS.jobLevels), CACHE_TTL.default);
26
+ }
27
+ /**
28
+ * Get a specific job level by ID
29
+ */
30
+ export async function getJobLevel(id) {
31
+ validateId(id, 'job level');
32
+ return fetchOne(endpointWithId(ENDPOINTS.jobLevels, id));
33
+ }
34
+ //# sourceMappingURL=job-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-catalog.js","sourceRoot":"","sources":["../../src/api/job-catalog.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS,CAAU,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;AAClG,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAE3B,OAAO,QAAQ,CAAU,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,MAAM,CACX,gBAAgB,EAChB,GAAG,EAAE,CAAC,SAAS,CAAW,SAAS,CAAC,SAAS,CAAC,EAC9C,SAAS,CAAC,OAAO,CAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5B,OAAO,QAAQ,CAAW,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Location API endpoints
3
+ */
4
+ import { type PaginatedResponse, type PaginationInput } from '../pagination.js';
5
+ import type { Location, CreateLocationInput, UpdateLocationInput } from '../schemas.js';
6
+ /**
7
+ * List all locations
8
+ */
9
+ export declare function listLocations(options?: PaginationInput): Promise<PaginatedResponse<Location>>;
10
+ /**
11
+ * Get a specific location by ID
12
+ */
13
+ export declare function getLocation(id: number): Promise<Location>;
14
+ /**
15
+ * Create a new location
16
+ */
17
+ export declare function createLocation(input: CreateLocationInput): Promise<Location>;
18
+ /**
19
+ * Update an existing location
20
+ */
21
+ export declare function updateLocation(id: number, input: UpdateLocationInput): Promise<Location>;
22
+ /**
23
+ * Delete a location
24
+ */
25
+ export declare function deleteLocation(id: number): Promise<void>;
26
+ //# sourceMappingURL=locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../../src/api/locations.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAKxF;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAWtC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQ/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAMlF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAS9F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9D"}