@t4dhg/mcp-factorial 7.0.1 → 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 (201) hide show
  1. package/README.md +321 -49
  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 -434
  63. package/dist/api.d.ts.map +1 -1
  64. package/dist/api.js +3 -1154
  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 -3701
  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 +4 -1879
  123. package/dist/schemas.d.ts.map +1 -1
  124. package/dist/schemas.js +4 -755
  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/types.d.ts +1 -1
  191. package/dist/types.d.ts.map +1 -1
  192. package/dist/utils.d.ts +35 -0
  193. package/dist/utils.d.ts.map +1 -1
  194. package/dist/utils.js +97 -0
  195. package/dist/utils.js.map +1 -1
  196. package/dist/write-safety.d.ts +229 -2
  197. package/dist/write-safety.d.ts.map +1 -1
  198. package/dist/write-safety.js +42 -3
  199. package/dist/write-safety.js.map +1 -1
  200. package/llms.txt +2 -2
  201. package/package.json +2 -2
@@ -0,0 +1,265 @@
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.name).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.name).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 === 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
134
+ const downloadUrlsEndpoint = 'https://api.factorialhr.com/api/2025-01-01/resources/documents/download-urls/bulk-create';
135
+ debug('Requesting document download URLs with OAuth2', { documentIds });
136
+ const response = await fetch(downloadUrlsEndpoint, {
137
+ method: 'POST',
138
+ headers: {
139
+ Authorization: `Bearer ${accessToken}`,
140
+ 'Content-Type': 'application/json',
141
+ Accept: 'application/json',
142
+ },
143
+ body: JSON.stringify({ document_ids: documentIds }),
144
+ });
145
+ if (!response.ok) {
146
+ const errorText = await response.text();
147
+ let errorData = null;
148
+ try {
149
+ errorData = JSON.parse(errorText);
150
+ }
151
+ catch {
152
+ // Ignore parse errors
153
+ }
154
+ // Handle specific errors
155
+ if (response.status === 401) {
156
+ throw new Error('OAuth2 authentication failed. The access token may have expired or been revoked.\n' +
157
+ 'Try re-authorizing the OAuth2 application to get a new refresh token.');
158
+ }
159
+ if (errorData?.errors?.some(e => e.includes('not found'))) {
160
+ throw new Error(`Documents not found or not accessible. Document IDs: ${documentIds.join(', ')}`);
161
+ }
162
+ throw new Error(`Failed to get download URLs: ${response.status} ${errorText}`);
163
+ }
164
+ const data = (await response.json());
165
+ debug('Document download URLs retrieved successfully', { count: data.data.length });
166
+ return data.data;
167
+ }
168
+ /**
169
+ * Download a document by getting its signed URL and fetching the content
170
+ * @param idOrDocument - The document ID or a Document object (to avoid re-fetching metadata)
171
+ * @param outputDir - Directory to save the file to
172
+ * @returns Path to the downloaded file and metadata
173
+ */
174
+ export async function downloadDocument(idOrDocument, outputDir) {
175
+ // Use provided document or fetch it
176
+ const document = typeof idOrDocument === 'number' ? await getDocument(idOrDocument) : idOrDocument;
177
+ const id = document.id;
178
+ // Get the signed download URL
179
+ const downloadUrls = await getDocumentDownloadUrls([id]);
180
+ const urlInfo = downloadUrls.find(u => u.document_id === id);
181
+ if (!urlInfo?.url) {
182
+ throw new Error(`No download URL returned for document ${id}`);
183
+ }
184
+ // Ensure output directory exists
185
+ const fs = await import('fs/promises');
186
+ await fs.mkdir(outputDir, { recursive: true });
187
+ // Generate filename from document name or ID with appropriate extension.
188
+ // The document name is tenant-controlled metadata, so it is sanitized before
189
+ // being joined onto the output directory.
190
+ const ext = document.mime_type === 'application/pdf' ? '.pdf' : '';
191
+ const fallbackName = `document-${id}${ext}`;
192
+ const outputPath = resolveSafeOutputPath(outputDir, document.name ?? fallbackName, fallbackName);
193
+ // Download the file from the signed URL
194
+ const response = await fetch(urlInfo.url);
195
+ if (!response.ok) {
196
+ throw new Error(`Failed to download document: ${response.status} ${response.statusText}`);
197
+ }
198
+ const buffer = Buffer.from(await response.arrayBuffer());
199
+ // Never overwrite. The document name is tenant-controlled, so a download can
200
+ // otherwise land on an existing file the caller cares about, and two documents
201
+ // sharing a name would silently collapse into one. The `wx` flag fails if the
202
+ // path exists, so the loop settles on the first free "name (n).ext".
203
+ const writtenPath = await writeWithoutOverwriting(outputPath, buffer);
204
+ debug(`Downloaded document ${id} to ${writtenPath}`, {
205
+ size: buffer.length,
206
+ mime: document.mime_type,
207
+ });
208
+ return { path: writtenPath, document };
209
+ }
210
+ /**
211
+ * Download all payslips for an employee
212
+ * @param employeeId - The employee ID
213
+ * @param outputDir - Directory to save files to
214
+ * @returns The payslips downloaded, and a description of any that failed
215
+ */
216
+ export async function downloadEmployeePayslips(employeeId, outputDir) {
217
+ // Find the Nómina (payslip) folder
218
+ const folders = await listFolders();
219
+ const payslipFolder = folders.find(f => f.name.toLowerCase() === 'nómina' ||
220
+ f.name.toLowerCase() === 'nomina' ||
221
+ f.name.toLowerCase() === 'payslips');
222
+ if (!payslipFolder) {
223
+ throw new Error('Could not find payslip folder (Nómina) in Factorial');
224
+ }
225
+ // Get all documents for this employee in the payslip folder
226
+ const allDocs = await listDocuments({ employee_ids: [employeeId] });
227
+ const payslipDocs = allDocs.data.filter(d => d.folder_id === payslipFolder.id);
228
+ if (payslipDocs.length === 0) {
229
+ throw new Error(`No payslips found for employee ${employeeId}`);
230
+ }
231
+ // Download each payslip - pass the document object to avoid re-fetching metadata
232
+ const results = [];
233
+ const failures = [];
234
+ for (const doc of payslipDocs) {
235
+ try {
236
+ const result = await downloadDocument(doc, outputDir);
237
+ results.push(result);
238
+ }
239
+ catch (error) {
240
+ const reason = error instanceof Error ? error.message : 'Unknown error';
241
+ debug(`Failed to download payslip ${doc.id}: ${reason}`);
242
+ failures.push(`document ${doc.id}: ${reason}`);
243
+ }
244
+ }
245
+ // A partial download used to look identical to a complete one: failures went
246
+ // to debug(), which is silent unless DEBUG is set, and the missing payslips
247
+ // simply did not appear in the results.
248
+ if (failures.length > 0 && results.length === 0) {
249
+ throw new Error(`All ${failures.length} payslip downloads failed for employee ${employeeId}:\n${failures.join('\n')}`);
250
+ }
251
+ if (failures.length > 0) {
252
+ debug(`Partial payslip download for employee ${employeeId}`, { failures });
253
+ }
254
+ return { downloaded: results, failures };
255
+ }
256
+ /**
257
+ * Download any employee document by ID
258
+ * @param documentId - The document ID
259
+ * @param outputDir - Directory to save the file to
260
+ * @returns Path to the downloaded file and metadata
261
+ */
262
+ export async function downloadEmployeeDocument(documentId, outputDir) {
263
+ return downloadDocument(documentId, outputDir);
264
+ }
265
+ //# 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 === 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 === 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"}