@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.
- package/README.md +321 -49
- package/dist/api/ats.d.ts +78 -0
- package/dist/api/ats.d.ts.map +1 -0
- package/dist/api/ats.js +173 -0
- package/dist/api/ats.js.map +1 -0
- package/dist/api/attendance.d.ts +27 -0
- package/dist/api/attendance.d.ts.map +1 -0
- package/dist/api/attendance.js +62 -0
- package/dist/api/attendance.js.map +1 -0
- package/dist/api/contracts.d.ts +40 -0
- package/dist/api/contracts.d.ts.map +1 -0
- package/dist/api/contracts.js +146 -0
- package/dist/api/contracts.js.map +1 -0
- package/dist/api/documents.d.ts +95 -0
- package/dist/api/documents.d.ts.map +1 -0
- package/dist/api/documents.js +265 -0
- package/dist/api/documents.js.map +1 -0
- package/dist/api/employees.d.ts +35 -0
- package/dist/api/employees.d.ts.map +1 -0
- package/dist/api/employees.js +116 -0
- package/dist/api/employees.js.map +1 -0
- package/dist/api/index.d.ts +22 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +36 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/job-catalog.d.ts +21 -0
- package/dist/api/job-catalog.d.ts.map +1 -0
- package/dist/api/job-catalog.js +34 -0
- package/dist/api/job-catalog.js.map +1 -0
- package/dist/api/locations.d.ts +26 -0
- package/dist/api/locations.d.ts.map +1 -0
- package/dist/api/locations.js +59 -0
- package/dist/api/locations.js.map +1 -0
- package/dist/api/payroll.d.ts +30 -0
- package/dist/api/payroll.d.ts.map +1 -0
- package/dist/api/payroll.js +68 -0
- package/dist/api/payroll.js.map +1 -0
- package/dist/api/projects.d.ts +82 -0
- package/dist/api/projects.d.ts.map +1 -0
- package/dist/api/projects.js +193 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/shared.d.ts +12 -0
- package/dist/api/shared.d.ts.map +1 -0
- package/dist/api/shared.js +17 -0
- package/dist/api/shared.js.map +1 -0
- package/dist/api/teams.d.ts +26 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +59 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/time-off.d.ts +47 -0
- package/dist/api/time-off.d.ts.map +1 -0
- package/dist/api/time-off.js +112 -0
- package/dist/api/time-off.js.map +1 -0
- package/dist/api/training.d.ts +62 -0
- package/dist/api/training.d.ts.map +1 -0
- package/dist/api/training.js +147 -0
- package/dist/api/training.js.map +1 -0
- package/dist/api/work-areas.d.ts +30 -0
- package/dist/api/work-areas.d.ts.map +1 -0
- package/dist/api/work-areas.js +71 -0
- package/dist/api/work-areas.js.map +1 -0
- package/dist/api.d.ts +3 -434
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +3 -1154
- package/dist/api.js.map +1 -1
- package/dist/audit.d.ts +8 -3
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +8 -3
- package/dist/audit.js.map +1 -1
- package/dist/index.d.ts +6 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3701
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +63 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +143 -0
- package/dist/oauth.js.map +1 -0
- package/dist/schemas/ats.d.ts +326 -0
- package/dist/schemas/ats.d.ts.map +1 -0
- package/dist/schemas/ats.js +121 -0
- package/dist/schemas/ats.js.map +1 -0
- package/dist/schemas/documents.d.ts +78 -0
- package/dist/schemas/documents.d.ts.map +1 -0
- package/dist/schemas/documents.js +34 -0
- package/dist/schemas/documents.js.map +1 -0
- package/dist/schemas/employees.d.ts +528 -0
- package/dist/schemas/employees.d.ts.map +1 -0
- package/dist/schemas/employees.js +206 -0
- package/dist/schemas/employees.js.map +1 -0
- package/dist/schemas/index.d.ts +18 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +28 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/job-catalog.d.ts +57 -0
- package/dist/schemas/job-catalog.d.ts.map +1 -0
- package/dist/schemas/job-catalog.js +27 -0
- package/dist/schemas/job-catalog.js.map +1 -0
- package/dist/schemas/payroll.d.ts +98 -0
- package/dist/schemas/payroll.d.ts.map +1 -0
- package/dist/schemas/payroll.js +43 -0
- package/dist/schemas/payroll.js.map +1 -0
- package/dist/schemas/projects.d.ts +277 -0
- package/dist/schemas/projects.d.ts.map +1 -0
- package/dist/schemas/projects.js +114 -0
- package/dist/schemas/projects.js.map +1 -0
- package/dist/schemas/shared.d.ts +42 -0
- package/dist/schemas/shared.d.ts.map +1 -0
- package/dist/schemas/shared.js +65 -0
- package/dist/schemas/shared.js.map +1 -0
- package/dist/schemas/time-off.d.ts +286 -0
- package/dist/schemas/time-off.d.ts.map +1 -0
- package/dist/schemas/time-off.js +111 -0
- package/dist/schemas/time-off.js.map +1 -0
- package/dist/schemas/training.d.ts +223 -0
- package/dist/schemas/training.d.ts.map +1 -0
- package/dist/schemas/training.js +88 -0
- package/dist/schemas/training.js.map +1 -0
- package/dist/schemas/work-areas.d.ts +71 -0
- package/dist/schemas/work-areas.d.ts.map +1 -0
- package/dist/schemas/work-areas.js +30 -0
- package/dist/schemas/work-areas.js.map +1 -0
- package/dist/schemas.d.ts +4 -1879
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +4 -755
- package/dist/schemas.js.map +1 -1
- package/dist/tool-utils.d.ts +0 -14
- package/dist/tool-utils.d.ts.map +1 -1
- package/dist/tool-utils.js +5 -18
- package/dist/tool-utils.js.map +1 -1
- package/dist/tools/ats.d.ts +6 -0
- package/dist/tools/ats.d.ts.map +1 -0
- package/dist/tools/ats.js +206 -0
- package/dist/tools/ats.js.map +1 -0
- package/dist/tools/attendance.d.ts +6 -0
- package/dist/tools/attendance.d.ts.map +1 -0
- package/dist/tools/attendance.js +86 -0
- package/dist/tools/attendance.js.map +1 -0
- package/dist/tools/contracts.d.ts +6 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +63 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/documents.d.ts +6 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +135 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/employees.d.ts +6 -0
- package/dist/tools/employees.d.ts.map +1 -0
- package/dist/tools/employees.js +125 -0
- package/dist/tools/employees.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +221 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/job-catalog.d.ts +6 -0
- package/dist/tools/job-catalog.d.ts.map +1 -0
- package/dist/tools/job-catalog.js +39 -0
- package/dist/tools/job-catalog.js.map +1 -0
- package/dist/tools/locations.d.ts +6 -0
- package/dist/tools/locations.d.ts.map +1 -0
- package/dist/tools/locations.js +93 -0
- package/dist/tools/locations.js.map +1 -0
- package/dist/tools/payroll.d.ts +6 -0
- package/dist/tools/payroll.d.ts.map +1 -0
- package/dist/tools/payroll.js +76 -0
- package/dist/tools/payroll.js.map +1 -0
- package/dist/tools/projects.d.ts +6 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +203 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/shared.d.ts +84 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +164 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/teams.d.ts +6 -0
- package/dist/tools/teams.d.ts.map +1 -0
- package/dist/tools/teams.js +81 -0
- package/dist/tools/teams.js.map +1 -0
- package/dist/tools/time-off.d.ts +6 -0
- package/dist/tools/time-off.d.ts.map +1 -0
- package/dist/tools/time-off.js +144 -0
- package/dist/tools/time-off.js.map +1 -0
- package/dist/tools/training.d.ts +6 -0
- package/dist/tools/training.d.ts.map +1 -0
- package/dist/tools/training.js +160 -0
- package/dist/tools/training.js.map +1 -0
- package/dist/tools/work-areas.d.ts +6 -0
- package/dist/tools/work-areas.d.ts.map +1 -0
- package/dist/tools/work-areas.js +85 -0
- package/dist/tools/work-areas.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +35 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +97 -0
- package/dist/utils.js.map +1 -1
- package/dist/write-safety.d.ts +229 -2
- package/dist/write-safety.d.ts.map +1 -1
- package/dist/write-safety.js +42 -3
- package/dist/write-safety.js.map +1 -1
- package/llms.txt +2 -2
- 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":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC;AAE1B,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;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA8B;IAE9B,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAExD,qEAAqE;IACrE,0CAA0C;IAC1C,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,MAAM,CAC/B,eAAe,EACf,GAAG,EAAE,CAAC,SAAS,CAAW,SAAS,CAAC,SAAS,CAAC,EAC9C,SAAS,CAAC,SAAS,CACpB,CAAC;QAEF,IAAI,QAAQ,GAAG,YAAY,CAAC;QAC5B,sFAAsF;QACtF,8DAA8D;QAC9D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,2CAA2C;IAC3C,MAAM,SAAS,GAAG,MAAM,MAAM,CAC5B,QAAQ,EACR,GAAG,EAAE,CAAC,SAAS,CAAW,SAAS,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAC1D,SAAS,CAAC,SAAS,CACpB,CAAC;IAEF,OAAO,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAE3B,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,YAAY,EAAE,EAAE,EAChB,GAAG,EAAE,CAAC,QAAQ,CAAW,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EACjE,SAAS,CAAC,SAAS,CACpB,CAAC;QAEF,wCAAwC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yDAAyD;QACzD,yCAAyC;QACzC,IAAI,CAAC,CAAC,KAAK,YAAY,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,oFAAoF;IACpF,MAAM,YAAY,GAAG,MAAM,MAAM,CAC/B,eAAe,EACf,GAAG,EAAE,CAAC,SAAS,CAAW,SAAS,CAAC,SAAS,CAAC,EAC9C,SAAS,CAAC,SAAS,CACpB,CAAC;IAEF,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAC/B,eAAe,EACf,GAAG,EAAE,CAAC,SAAS,CAAW,SAAS,CAAC,SAAS,CAAC,EAC9C,SAAS,CAAC,SAAS,CACpB,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE9C,OAAO,YAAY,CAAC,MAAM,CACxB,GAAG,CAAC,EAAE,CACJ,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACjD,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7C,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAClD,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACpD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC7D,OAAO,gBAAgB,CACrB,WAAW,CAAC,MAAM,EAClB,UAAU,EACV,SAAS,EACT,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAW,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,KAA0B;IACzE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAE3B,OAAO,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAW,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1F,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAU,EACV,YAAoB,EACpB,MAAe;IAEf,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAE3B,OAAO,gBAAgB,CACrB,WAAW,CAAC,SAAS,EACrB,UAAU,EACV,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAW,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE;YACjF,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;QACH,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|