@aderis-erp/cli 1.0.3 → 1.0.4
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 +6 -0
- package/dist/commands/access-groups 3.d.ts +40 -0
- package/dist/commands/access-groups 3.js +1072 -0
- package/dist/commands/access-groups.d.ts +1 -0
- package/dist/commands/access-groups.js +79 -23
- package/dist/commands/account-transactions.d.ts +1 -0
- package/dist/commands/account-transactions.js +91 -35
- package/dist/commands/accounts 2.d.ts +41 -0
- package/dist/commands/accounts 2.js +1078 -0
- package/dist/commands/accounts.d.ts +1 -0
- package/dist/commands/accounts.js +84 -28
- package/dist/commands/agent-runs.d.ts +1 -0
- package/dist/commands/agent-runs.js +80 -22
- package/dist/commands/async-endpoints-internal 3.d.ts +40 -0
- package/dist/commands/async-endpoints-internal 3.js +1062 -0
- package/dist/commands/async-endpoints-internal.d.ts +1 -0
- package/dist/commands/async-endpoints-internal.js +77 -21
- package/dist/commands/audit-log 3.d.ts +40 -0
- package/dist/commands/audit-log 3.js +1066 -0
- package/dist/commands/audit-log.d.ts +1 -0
- package/dist/commands/audit-log.js +77 -21
- package/dist/commands/bank-accounts.d.ts +1 -0
- package/dist/commands/bank-accounts.js +91 -35
- package/dist/commands/bank-integrations.d.ts +1 -0
- package/dist/commands/bank-integrations.js +92 -36
- package/dist/commands/business-partners 3.d.ts +41 -0
- package/dist/commands/business-partners 3.js +1078 -0
- package/dist/commands/business-partners---contacts 3.d.ts +42 -0
- package/dist/commands/business-partners---contacts 3.js +1072 -0
- package/dist/commands/business-partners---contacts.d.ts +1 -0
- package/dist/commands/business-partners---contacts.js +84 -28
- package/dist/commands/business-partners.d.ts +1 -0
- package/dist/commands/business-partners.js +84 -28
- package/dist/commands/credit-card-accounts 3.d.ts +42 -0
- package/dist/commands/credit-card-accounts 3.js +1084 -0
- package/dist/commands/credit-card-accounts.d.ts +1 -0
- package/dist/commands/credit-card-accounts.js +89 -33
- package/dist/commands/documents.d.ts +1 -0
- package/dist/commands/documents.js +80 -24
- package/dist/commands/dunning-configs 3.d.ts +40 -0
- package/dist/commands/dunning-configs 3.js +1072 -0
- package/dist/commands/dunning-configs.d.ts +1 -0
- package/dist/commands/dunning-configs.js +79 -23
- package/dist/commands/dunning-reminders.d.ts +1 -0
- package/dist/commands/dunning-reminders.js +82 -26
- package/dist/commands/dunning-runs 3.d.ts +40 -0
- package/dist/commands/dunning-runs 3.js +1061 -0
- package/dist/commands/dunning-runs.d.ts +1 -0
- package/dist/commands/dunning-runs.js +75 -19
- package/dist/commands/employees.d.ts +1 -0
- package/dist/commands/employees.js +106 -50
- package/dist/commands/event-processor-mappings 3.d.ts +40 -0
- package/dist/commands/event-processor-mappings 3.js +1071 -0
- package/dist/commands/event-processor-mappings.d.ts +1 -0
- package/dist/commands/event-processor-mappings.js +79 -23
- package/dist/commands/files-internal 3.d.ts +40 -0
- package/dist/commands/files-internal 3.js +1073 -0
- package/dist/commands/files-internal.d.ts +1 -0
- package/dist/commands/files-internal.js +83 -27
- package/dist/commands/health 3.d.ts +40 -0
- package/dist/commands/health 3.js +1067 -0
- package/dist/commands/health.d.ts +1 -0
- package/dist/commands/health.js +79 -23
- package/dist/commands/inbox 3.d.ts +40 -0
- package/dist/commands/inbox 3.js +1065 -0
- package/dist/commands/inbox.d.ts +1 -0
- package/dist/commands/inbox.js +79 -23
- package/dist/commands/integrations 3.d.ts +41 -0
- package/dist/commands/integrations 3.js +1067 -0
- package/dist/commands/integrations.d.ts +1 -0
- package/dist/commands/integrations.js +77 -21
- package/dist/commands/item-categories 3.d.ts +40 -0
- package/dist/commands/item-categories 3.js +1072 -0
- package/dist/commands/item-categories.d.ts +1 -0
- package/dist/commands/item-categories.js +79 -23
- package/dist/commands/items 3.d.ts +40 -0
- package/dist/commands/items 3.js +1072 -0
- package/dist/commands/items.d.ts +1 -0
- package/dist/commands/items.js +79 -23
- package/dist/commands/journal-lines.d.ts +1 -0
- package/dist/commands/journal-lines.js +75 -19
- package/dist/commands/journals 3.d.ts +42 -0
- package/dist/commands/journals 3.js +1088 -0
- package/dist/commands/journals.d.ts +1 -0
- package/dist/commands/journals.js +93 -37
- package/dist/commands/ledgers.d.ts +1 -0
- package/dist/commands/ledgers.js +90 -34
- package/dist/commands/office-locations 3.d.ts +40 -0
- package/dist/commands/office-locations 3.js +1072 -0
- package/dist/commands/office-locations.d.ts +1 -0
- package/dist/commands/office-locations.js +79 -23
- package/dist/commands/payment-method-ledger-mappings 3.d.ts +41 -0
- package/dist/commands/payment-method-ledger-mappings 3.js +1066 -0
- package/dist/commands/payment-method-ledger-mappings.d.ts +1 -0
- package/dist/commands/payment-method-ledger-mappings.js +79 -23
- package/dist/commands/payment-methods 3.d.ts +40 -0
- package/dist/commands/payment-methods 3.js +1072 -0
- package/dist/commands/payment-methods.d.ts +1 -0
- package/dist/commands/payment-methods.js +79 -23
- package/dist/commands/payment-runs 3.d.ts +42 -0
- package/dist/commands/payment-runs 3.js +1087 -0
- package/dist/commands/payment-runs.d.ts +1 -0
- package/dist/commands/payment-runs.js +92 -36
- package/dist/commands/payment-terms 3.d.ts +40 -0
- package/dist/commands/payment-terms 3.js +1073 -0
- package/dist/commands/payment-terms.d.ts +1 -0
- package/dist/commands/payment-terms.js +80 -24
- package/dist/commands/price-lists 3.d.ts +41 -0
- package/dist/commands/price-lists 3.js +1078 -0
- package/dist/commands/price-lists.d.ts +1 -0
- package/dist/commands/price-lists.js +84 -28
- package/dist/commands/processor-mappings 2.d.ts +40 -0
- package/dist/commands/processor-mappings 2.js +1070 -0
- package/dist/commands/processor-mappings.d.ts +1 -0
- package/dist/commands/processor-mappings.js +78 -22
- package/dist/commands/processors.d.ts +1 -0
- package/dist/commands/processors.js +83 -27
- package/dist/commands/reconciliation 3.d.ts +40 -0
- package/dist/commands/reconciliation 3.js +1069 -0
- package/dist/commands/reconciliation.d.ts +1 -0
- package/dist/commands/reconciliation.js +80 -24
- package/dist/commands/reports.d.ts +1 -0
- package/dist/commands/reports.js +80 -21
- package/dist/commands/salary-types 3.d.ts +40 -0
- package/dist/commands/salary-types 3.js +1072 -0
- package/dist/commands/salary-types.d.ts +1 -0
- package/dist/commands/salary-types.js +79 -23
- package/dist/commands/sales-invoices 3.d.ts +43 -0
- package/dist/commands/sales-invoices 3.js +1100 -0
- package/dist/commands/sales-invoices.d.ts +1 -0
- package/dist/commands/sales-invoices.js +104 -48
- package/dist/commands/sales-orders 3.d.ts +43 -0
- package/dist/commands/sales-orders 3.js +1098 -0
- package/dist/commands/sales-orders.d.ts +1 -0
- package/dist/commands/sales-orders.js +102 -46
- package/dist/commands/tags 3.d.ts +40 -0
- package/dist/commands/tags 3.js +1072 -0
- package/dist/commands/tags.d.ts +1 -0
- package/dist/commands/tags.js +79 -23
- package/dist/commands/tax-codes 3.d.ts +40 -0
- package/dist/commands/tax-codes 3.js +1075 -0
- package/dist/commands/tax-codes.d.ts +1 -0
- package/dist/commands/tax-codes.js +82 -26
- package/dist/commands/tax-matrix.d.ts +1 -0
- package/dist/commands/tax-matrix.js +79 -23
- package/dist/commands/tenants.d.ts +1 -0
- package/dist/commands/tenants.js +79 -23
- package/dist/commands/text-templates 3.d.ts +40 -0
- package/dist/commands/text-templates 3.js +1072 -0
- package/dist/commands/text-templates.d.ts +1 -0
- package/dist/commands/text-templates.js +79 -23
- package/dist/commands/tools.d.ts +1 -0
- package/dist/commands/tools.js +76 -20
- package/dist/commands/vendor-invoices.d.ts +1 -0
- package/dist/commands/vendor-invoices.js +108 -52
- package/dist/commands/webhooks 3.d.ts +40 -0
- package/dist/commands/webhooks 3.js +1074 -0
- package/dist/commands/webhooks.d.ts +1 -0
- package/dist/commands/webhooks.js +81 -25
- package/dist/commands/workflows.d.ts +1 -0
- package/dist/commands/workflows.js +77 -21
- package/dist/lib/api-client.d.ts +5 -1
- package/dist/lib/api-client.js +19 -5
- package/dist/lib/auth.js +17 -0
- package/dist/lib/config.js +1 -1
- package/oclif.manifest.json +6099 -711
- package/package.json +1 -1
- package/dist/index 2.js +0 -1
- package/dist/index.d 2.ts +0 -1
|
@@ -8,34 +8,34 @@ const HAS_CAMT053 = false;
|
|
|
8
8
|
const NESTED_IMPORTS = ["line-items", "notes", "files"];
|
|
9
9
|
const SUBCOMMANDS = [...["list", "create", "get", "update", "delete", "pdf", "submit", "approve", "accept", "terminate", "cancel", "replace", "create-invoice", "create-line-items", "update-line-items-reorder", "update-line-items", "delete-line-items", "list-notes", "create-notes", "get-notes", "update-notes", "delete-notes", "list-files", "create-files", "get-files", "update-files", "delete-files", "files-download"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
|
|
10
10
|
const ENDPOINTS = {
|
|
11
|
-
'list': { method: 'GET', path: '/v1/sales-orders', summary: 'Get all sales orders with pagination', pathParams: [], hasBody: false, isMultipart: false },
|
|
12
|
-
'create': { method: 'POST', path: '/v1/sales-orders', summary: 'Create a new sales order', pathParams: [], hasBody: true, isMultipart: false },
|
|
13
|
-
'get': { method: 'GET', path: '/v1/sales-orders/{id}', summary: 'Get a sales order by ID', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
14
|
-
'update': { method: 'PATCH', path: '/v1/sales-orders/{id}', summary: 'Update a sales order', pathParams: ['id'], hasBody: true, isMultipart: false },
|
|
15
|
-
'delete': { method: 'DELETE', path: '/v1/sales-orders/{id}', summary: 'Delete a sales order', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
16
|
-
'pdf': { method: 'GET', path: '/v1/sales-orders/{id}/pdf', summary: '
|
|
17
|
-
'submit': { method: 'POST', path: '/v1/sales-orders/{id}/submit', summary: 'Submit order for approval (DRAFT → PENDING_APPROVAL)', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
18
|
-
'approve': { method: 'POST', path: '/v1/sales-orders/{id}/approve', summary: 'Approve order (PENDING_APPROVAL → APPROVED). Generates order number.', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
19
|
-
'accept': { method: 'POST', path: '/v1/sales-orders/{id}/accept', summary: 'Accept order (APPROVED → ACCEPTED). Adjusts billing start date.', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
20
|
-
'terminate': { method: 'POST', path: '/v1/sales-orders/{id}/terminate', summary: 'Terminate order (ACCEPTED → TERMINATED). Requires billingEndDate.', pathParams: ['id'], hasBody: true, isMultipart: false },
|
|
21
|
-
'cancel': { method: 'POST', path: '/v1/sales-orders/{id}/cancel', summary: 'Cancel order (any pre-active status → CANCELLED)', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
22
|
-
'replace': { method: 'POST', path: '/v1/sales-orders/{id}/replace', summary: 'Replace order with corrected version (APPROVED → creates new DRAFT)', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
23
|
-
'create-invoice': { method: 'POST', path: '/v1/sales-orders/{id}/create-invoice', summary: 'Create invoice from sales order (ACCEPTED → creates DRAFT invoice)', pathParams: ['id'], hasBody: false, isMultipart: false },
|
|
24
|
-
'create-line-items': { method: 'POST', path: '/v1/sales-orders/{orderId}/line-items', summary: 'Add a line item to a sales order', pathParams: ['orderId'], hasBody: true, isMultipart: false },
|
|
25
|
-
'update-line-items-reorder': { method: 'PATCH', path: '/v1/sales-orders/{orderId}/line-items/reorder', summary: 'Bulk reorder line items (drag-and-drop)', pathParams: ['orderId'], hasBody: true, isMultipart: false },
|
|
26
|
-
'update-line-items': { method: 'PATCH', path: '/v1/sales-orders/{orderId}/line-items/{lineItemId}', summary: 'Update a line item on a sales order', pathParams: ['orderId', 'lineItemId'], hasBody: true, isMultipart: false },
|
|
27
|
-
'delete-line-items': { method: 'DELETE', path: '/v1/sales-orders/{orderId}/line-items/{lineItemId}', summary: 'Remove a line item from a sales order', pathParams: ['orderId', 'lineItemId'], hasBody: false, isMultipart: false },
|
|
28
|
-
'list-notes': { method: 'GET', path: '/v1/sales-orders/{salesOrderId}/notes', summary: 'Get all notes for a sales order', pathParams: ['salesOrderId'], hasBody: false, isMultipart: false },
|
|
29
|
-
'create-notes': { method: 'POST', path: '/v1/sales-orders/{salesOrderId}/notes', summary: 'Create a note for a sales order', pathParams: ['salesOrderId'], hasBody: true, isMultipart: false },
|
|
30
|
-
'get-notes': { method: 'GET', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Get a specific note for a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: false, isMultipart: false },
|
|
31
|
-
'update-notes': { method: 'PATCH', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Update a note for a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: true, isMultipart: false },
|
|
32
|
-
'delete-notes': { method: 'DELETE', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Delete a note from a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: false, isMultipart: false },
|
|
33
|
-
'list-files': { method: 'GET', path: '/v1/sales-orders/{parentId}/files', summary: 'List file attachments for a sales order', pathParams: ['parentId'], hasBody: false, isMultipart: false },
|
|
34
|
-
'create-files': { method: 'POST', path: '/v1/sales-orders/{parentId}/files', summary: 'Upload a file attachment to a sales order', pathParams: ['parentId'], hasBody: false, isMultipart: true },
|
|
35
|
-
'get-files': { method: 'GET', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Get a file attachment for a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false },
|
|
36
|
-
'update-files': { method: 'PATCH', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Update file attachment metadata for a sales order', pathParams: ['parentId', 'fileId'], hasBody: true, isMultipart: false },
|
|
37
|
-
'delete-files': { method: 'DELETE', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Delete a file attachment from a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false },
|
|
38
|
-
'files-download': { method: 'GET', path: '/v1/sales-orders/{parentId}/files/{fileId}/download', summary: 'Download a file attachment from a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false },
|
|
11
|
+
'list': { method: 'GET', path: '/v1/sales-orders', summary: 'Get all sales orders with pagination', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
12
|
+
'create': { method: 'POST', path: '/v1/sales-orders', summary: 'Create a new sales order', pathParams: [], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: ['files', 'notes', 'tagIds', 'lineItems'] },
|
|
13
|
+
'get': { method: 'GET', path: '/v1/sales-orders/{id}', summary: 'Get a sales order by ID', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
14
|
+
'update': { method: 'PATCH', path: '/v1/sales-orders/{id}', summary: 'Update a sales order', pathParams: ['id'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: ['files', 'notes', 'tagIds', 'lineItems', 'removeFileIds'] },
|
|
15
|
+
'delete': { method: 'DELETE', path: '/v1/sales-orders/{id}', summary: 'Delete a sales order', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
16
|
+
'pdf': { method: 'GET', path: '/v1/sales-orders/{id}/pdf', summary: 'Render a sales order PDF using the configured PDF processor', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
17
|
+
'submit': { method: 'POST', path: '/v1/sales-orders/{id}/submit', summary: 'Submit order for approval (DRAFT → PENDING_APPROVAL)', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
18
|
+
'approve': { method: 'POST', path: '/v1/sales-orders/{id}/approve', summary: 'Approve order (PENDING_APPROVAL → APPROVED). Generates order number.', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
19
|
+
'accept': { method: 'POST', path: '/v1/sales-orders/{id}/accept', summary: 'Accept order (APPROVED → ACCEPTED). Adjusts billing start date.', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
20
|
+
'terminate': { method: 'POST', path: '/v1/sales-orders/{id}/terminate', summary: 'Terminate order (ACCEPTED → TERMINATED). Requires billingEndDate.', pathParams: ['id'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
21
|
+
'cancel': { method: 'POST', path: '/v1/sales-orders/{id}/cancel', summary: 'Cancel order (any pre-active status → CANCELLED)', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
22
|
+
'replace': { method: 'POST', path: '/v1/sales-orders/{id}/replace', summary: 'Replace order with corrected version (APPROVED → creates new DRAFT)', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
23
|
+
'create-invoice': { method: 'POST', path: '/v1/sales-orders/{id}/create-invoice', summary: 'Create invoice from sales order (ACCEPTED → creates DRAFT invoice)', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
24
|
+
'create-line-items': { method: 'POST', path: '/v1/sales-orders/{orderId}/line-items', summary: 'Add a line item to a sales order', pathParams: ['orderId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
25
|
+
'update-line-items-reorder': { method: 'PATCH', path: '/v1/sales-orders/{orderId}/line-items/reorder', summary: 'Bulk reorder line items (drag-and-drop)', pathParams: ['orderId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: ['items'] },
|
|
26
|
+
'update-line-items': { method: 'PATCH', path: '/v1/sales-orders/{orderId}/line-items/{lineItemId}', summary: 'Update a line item on a sales order', pathParams: ['orderId', 'lineItemId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
27
|
+
'delete-line-items': { method: 'DELETE', path: '/v1/sales-orders/{orderId}/line-items/{lineItemId}', summary: 'Remove a line item from a sales order', pathParams: ['orderId', 'lineItemId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
28
|
+
'list-notes': { method: 'GET', path: '/v1/sales-orders/{salesOrderId}/notes', summary: 'Get all notes for a sales order', pathParams: ['salesOrderId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
29
|
+
'create-notes': { method: 'POST', path: '/v1/sales-orders/{salesOrderId}/notes', summary: 'Create a note for a sales order', pathParams: ['salesOrderId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
30
|
+
'get-notes': { method: 'GET', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Get a specific note for a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
31
|
+
'update-notes': { method: 'PATCH', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Update a note for a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
32
|
+
'delete-notes': { method: 'DELETE', path: '/v1/sales-orders/{salesOrderId}/notes/{noteId}', summary: 'Delete a note from a sales order', pathParams: ['salesOrderId', 'noteId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
33
|
+
'list-files': { method: 'GET', path: '/v1/sales-orders/{parentId}/files', summary: 'List file attachments for a sales order', pathParams: ['parentId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
34
|
+
'create-files': { method: 'POST', path: '/v1/sales-orders/{parentId}/files', summary: 'Upload a file attachment to a sales order', pathParams: ['parentId'], hasBody: false, isMultipart: true, isBinaryResponse: false, bodyArrayFields: [] },
|
|
35
|
+
'get-files': { method: 'GET', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Get a file attachment for a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
36
|
+
'update-files': { method: 'PATCH', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Update file attachment metadata for a sales order', pathParams: ['parentId', 'fileId'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
37
|
+
'delete-files': { method: 'DELETE', path: '/v1/sales-orders/{parentId}/files/{fileId}', summary: 'Delete a file attachment from a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
38
|
+
'files-download': { method: 'GET', path: '/v1/sales-orders/{parentId}/files/{fileId}/download', summary: 'Download a file attachment from a sales order', pathParams: ['parentId', 'fileId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
39
39
|
};
|
|
40
40
|
export default class SalesOrders extends Command {
|
|
41
41
|
static description = 'Manage sales orders';
|
|
@@ -156,15 +156,7 @@ export default class SalesOrders extends Command {
|
|
|
156
156
|
if (eqIndex === -1)
|
|
157
157
|
this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
|
|
158
158
|
const key = f.slice(0, eqIndex);
|
|
159
|
-
|
|
160
|
-
// Check for operator prefix (with or without $)
|
|
161
|
-
const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
|
|
162
|
-
if (opMatch) {
|
|
163
|
-
value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
value = `\$eq:${value}`;
|
|
167
|
-
}
|
|
159
|
+
const value = this.parseFilterValue(f.slice(eqIndex + 1));
|
|
168
160
|
const filterKey = `filter.${key}`;
|
|
169
161
|
if (filterKey in queryParams) {
|
|
170
162
|
// Multiple filters on same field: collect as array
|
|
@@ -197,7 +189,9 @@ export default class SalesOrders extends Command {
|
|
|
197
189
|
data = form;
|
|
198
190
|
}
|
|
199
191
|
else if (endpoint.hasBody) {
|
|
200
|
-
|
|
192
|
+
// For binary-response endpoints, --file is the output path, not a JSON
|
|
193
|
+
// input file — skip the read-as-body branch.
|
|
194
|
+
if (flags.file && !endpoint.isBinaryResponse) {
|
|
201
195
|
const fsModule = await import('node:fs');
|
|
202
196
|
try {
|
|
203
197
|
data = JSON.parse(fsModule.readFileSync(flags.file, 'utf-8'));
|
|
@@ -219,6 +213,7 @@ export default class SalesOrders extends Command {
|
|
|
219
213
|
if (!data)
|
|
220
214
|
data = {};
|
|
221
215
|
const body = data;
|
|
216
|
+
const arrayFields = new Set(endpoint.bodyArrayFields);
|
|
222
217
|
for (const pair of flags.set) {
|
|
223
218
|
const eqIndex = pair.indexOf('=');
|
|
224
219
|
if (eqIndex === -1)
|
|
@@ -230,6 +225,19 @@ export default class SalesOrders extends Command {
|
|
|
230
225
|
value = JSON.parse(value);
|
|
231
226
|
}
|
|
232
227
|
catch { /* keep as string */ }
|
|
228
|
+
// For top-level keys typed as array in the API schema, split bare
|
|
229
|
+
// comma-separated input (e.g. "1171,1170" -> ["1171","1170"]) and
|
|
230
|
+
// wrap a lone scalar in a single-element array. Skips when --set
|
|
231
|
+
// already provided a JSON array.
|
|
232
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
233
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
234
|
+
if (typeof value === 'string') {
|
|
235
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
236
|
+
}
|
|
237
|
+
else if (value !== undefined && value !== null) {
|
|
238
|
+
value = [value];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
233
241
|
// Support nested keys like "address.city"
|
|
234
242
|
const keys = key.split('.');
|
|
235
243
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
@@ -280,6 +288,26 @@ export default class SalesOrders extends Command {
|
|
|
280
288
|
process.stderr.write('\n');
|
|
281
289
|
}
|
|
282
290
|
try {
|
|
291
|
+
// Binary response: download to file
|
|
292
|
+
if (endpoint.isBinaryResponse) {
|
|
293
|
+
if (!flags.file) {
|
|
294
|
+
this.error(`Endpoint returns a binary file. Specify the output path with -f / --file (e.g. -f report.xlsx).`);
|
|
295
|
+
}
|
|
296
|
+
const binResponse = await apiRequest(endpoint.method, apiPath, {
|
|
297
|
+
params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
|
|
298
|
+
data,
|
|
299
|
+
contextName: flags.context,
|
|
300
|
+
binary: true,
|
|
301
|
+
});
|
|
302
|
+
const fsModule = await import('node:fs');
|
|
303
|
+
const binData = binResponse.data;
|
|
304
|
+
const buffer = Buffer.isBuffer(binData)
|
|
305
|
+
? binData
|
|
306
|
+
: Buffer.from(binData);
|
|
307
|
+
fsModule.writeFileSync(flags.file, buffer);
|
|
308
|
+
this.log(`Saved ${buffer.length} bytes to ${flags.file}`);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
283
311
|
const response = await apiRequest(endpoint.method, apiPath, {
|
|
284
312
|
params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
|
|
285
313
|
data,
|
|
@@ -370,6 +398,7 @@ export default class SalesOrders extends Command {
|
|
|
370
398
|
}
|
|
371
399
|
else if (flags.set && flags.set.length > 0) {
|
|
372
400
|
const item = {};
|
|
401
|
+
const arrayFields = new Set(ENDPOINTS['create']?.bodyArrayFields ?? []);
|
|
373
402
|
for (const pair of flags.set) {
|
|
374
403
|
const eqIndex = pair.indexOf('=');
|
|
375
404
|
if (eqIndex === -1)
|
|
@@ -380,6 +409,15 @@ export default class SalesOrders extends Command {
|
|
|
380
409
|
value = JSON.parse(value);
|
|
381
410
|
}
|
|
382
411
|
catch { /* keep as string */ }
|
|
412
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
413
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
414
|
+
if (typeof value === 'string') {
|
|
415
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
416
|
+
}
|
|
417
|
+
else if (value !== undefined && value !== null) {
|
|
418
|
+
value = [value];
|
|
419
|
+
}
|
|
420
|
+
}
|
|
383
421
|
const keys = key.split('.');
|
|
384
422
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
385
423
|
this.error(`Invalid --set key: ${key}`);
|
|
@@ -529,14 +567,7 @@ export default class SalesOrders extends Command {
|
|
|
529
567
|
if (eqIndex === -1)
|
|
530
568
|
this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
|
|
531
569
|
const key = f.slice(0, eqIndex);
|
|
532
|
-
|
|
533
|
-
const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
|
|
534
|
-
if (opMatch) {
|
|
535
|
-
value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
|
|
536
|
-
}
|
|
537
|
-
else {
|
|
538
|
-
value = `\$eq:${value}`;
|
|
539
|
-
}
|
|
570
|
+
const value = this.parseFilterValue(f.slice(eqIndex + 1));
|
|
540
571
|
const filterKey = `filter.${key}`;
|
|
541
572
|
if (filterKey in baseParams) {
|
|
542
573
|
const existing = baseParams[filterKey];
|
|
@@ -713,6 +744,7 @@ export default class SalesOrders extends Command {
|
|
|
713
744
|
}
|
|
714
745
|
else if (flags.set && flags.set.length > 0) {
|
|
715
746
|
const item = {};
|
|
747
|
+
const arrayFields = new Set(ENDPOINTS[`create-${suffix}`]?.bodyArrayFields ?? []);
|
|
716
748
|
for (const pair of flags.set) {
|
|
717
749
|
const eqIndex = pair.indexOf('=');
|
|
718
750
|
if (eqIndex === -1)
|
|
@@ -723,6 +755,15 @@ export default class SalesOrders extends Command {
|
|
|
723
755
|
value = JSON.parse(value);
|
|
724
756
|
}
|
|
725
757
|
catch { /* keep as string */ }
|
|
758
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
759
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
760
|
+
if (typeof value === 'string') {
|
|
761
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
762
|
+
}
|
|
763
|
+
else if (value !== undefined && value !== null) {
|
|
764
|
+
value = [value];
|
|
765
|
+
}
|
|
766
|
+
}
|
|
726
767
|
const keys = key.split('.');
|
|
727
768
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
728
769
|
this.error(`Invalid --set key: ${key}`);
|
|
@@ -842,6 +883,21 @@ export default class SalesOrders extends Command {
|
|
|
842
883
|
this.log('');
|
|
843
884
|
this.log(`Summary: ${created} created, ${updated} updated, ${errors.length} failed`);
|
|
844
885
|
}
|
|
886
|
+
parseFilterValue(value) {
|
|
887
|
+
// Recognises the nestjs-paginate operator set (with or without the leading $)
|
|
888
|
+
// and recursively unwraps chained operators like 'not:null' -> '$not:$null'
|
|
889
|
+
// or 'not:like:John' -> '$not:$like:John'. Falls back to '$eq:<value>' when
|
|
890
|
+
// no operator prefix is present.
|
|
891
|
+
const opRe = /^\$?(and|or|not|eq|gt|gte|in|null|lt|lte|btw|ne|ilike|like|sw|contains)(?::|$)/;
|
|
892
|
+
const m = value.match(opRe);
|
|
893
|
+
if (!m)
|
|
894
|
+
return `\$eq:${value}`;
|
|
895
|
+
const op = m[1];
|
|
896
|
+
const rest = value.slice(m[0].length);
|
|
897
|
+
if (rest === '')
|
|
898
|
+
return `\$${op}`;
|
|
899
|
+
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
900
|
+
}
|
|
845
901
|
filterFields(data, fields) {
|
|
846
902
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
847
903
|
const pick = (obj, keys) => {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Tags extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
action: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
+
};
|
|
9
|
+
static flags: {
|
|
10
|
+
context: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
+
output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
table: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
data: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
set: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
page: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
+
limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
include: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
+
search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
21
|
+
'sort-by': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
22
|
+
filter: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
23
|
+
query: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
24
|
+
fields: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
25
|
+
sanitize: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
26
|
+
'show-http-request': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
27
|
+
};
|
|
28
|
+
run(): Promise<void>;
|
|
29
|
+
private runImport;
|
|
30
|
+
private runExport;
|
|
31
|
+
private runCamt053Import;
|
|
32
|
+
private runNestedImport;
|
|
33
|
+
private parseFilterValue;
|
|
34
|
+
private filterFields;
|
|
35
|
+
private sanitizeOutput;
|
|
36
|
+
private getColumns;
|
|
37
|
+
private getValue;
|
|
38
|
+
private printTable;
|
|
39
|
+
private printCsv;
|
|
40
|
+
}
|