UNPKG

@arathron/n8n-nodes-zoho-books

Version:

n8n community nodes for Zoho Books and Zoho Inventory API integration - Complete CRUD operations for Sales Orders, Invoices, Items, Vendors, Credit Notes, Payments, Purchase Orders, Bills, Composite Items, and Assemblies

124 lines 6.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InvoiceResource = void 0; const GenericFunctions_1 = require("../utils/GenericFunctions"); const InvoiceUtils_1 = require("../utils/InvoiceUtils"); class InvoiceResource { resourceName = 'Invoice'; endpoint = '/invoices'; async create(executeFunctions, itemIndex, additionalFields) { const customerId = executeFunctions.getNodeParameter('customerId', itemIndex); const lineItems = executeFunctions.getNodeParameter('lineItems', itemIndex); const params = { customer_id: customerId, line_items: lineItems.item || [], ...additionalFields, }; (0, InvoiceUtils_1.validateInvoiceCreationParams)(params); const body = { JSONString: JSON.stringify(params), }; const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'POST', this.endpoint, body); return (0, InvoiceUtils_1.normalizeInvoiceResponse)(response?.invoice); } async createFromSalesOrder(executeFunctions, itemIndex, additionalFields) { const salesOrderId = executeFunctions.getNodeParameter('salesOrderId', itemIndex); if (!salesOrderId) { throw new Error('Missing required field: salesOrderId'); } const invoiceData = await InvoiceUtils_1.createInstantInvoiceFromSalesOrder.call(executeFunctions, salesOrderId, additionalFields); return (0, InvoiceUtils_1.normalizeInvoiceResponse)(invoiceData); } async get(executeFunctions, itemIndex, _additionalFields) { const invoiceId = executeFunctions.getNodeParameter('invoiceId', itemIndex); const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'GET', `${this.endpoint}/${invoiceId}`); return response?.invoice; } async getAll(executeFunctions, itemIndex, _additionalFields) { const returnAll = executeFunctions.getNodeParameter('returnAll', itemIndex); const limit = executeFunctions.getNodeParameter('limit', itemIndex, 50); const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'GET', this.endpoint, {}, { page: 1, per_page: returnAll ? 200 : limit }); if (returnAll) { return response?.invoices || []; } else { return (response?.invoices || []).slice(0, limit); } } async update(executeFunctions, itemIndex, additionalFields) { const invoiceId = executeFunctions.getNodeParameter('invoiceId', itemIndex); const providedLineItems = executeFunctions.getNodeParameter('lineItems', itemIndex); const existingInvoiceResponse = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'GET', `${this.endpoint}/${invoiceId}`); const existingInvoice = existingInvoiceResponse?.invoice; if (!existingInvoice) { throw new Error(`Invoice with ID ${invoiceId} not found`); } const formattedFields = { ...additionalFields }; const dateFields = ['date', 'due_date']; for (const field of dateFields) { const dateValue = formattedFields[field]; if (!dateValue) continue; if (typeof dateValue === 'string' && dateValue.trim() !== '') { const trimmedValue = dateValue.trim(); const isoDateRegex = /^\d{4}-\d{2}-\d{2}$/; if (isoDateRegex.test(trimmedValue)) { continue; } const prefix = trimmedValue.slice(0, 10); if (isoDateRegex.test(prefix)) { formattedFields[field] = prefix; } else { delete formattedFields[field]; } } else { delete formattedFields[field]; } } const lineItems = providedLineItems && providedLineItems.length > 0 ? providedLineItems : existingInvoice.line_items; if (!Array.isArray(lineItems) || !lineItems.length) { throw new Error('Zoho requires at least one line item for invoice updates'); } if (existingInvoice.status === 'sent' && !formattedFields.reason) { throw new Error('Reason is required when updating a sent invoice. Please provide a reason in the Update Fields.'); } if (formattedFields.date && !formattedFields.due_date) { formattedFields.due_date = existingInvoice.due_date || formattedFields.date; } const updatePayload = { customer_id: existingInvoice.customer_id, currency_id: existingInvoice.currency_id, line_items: lineItems, date: formattedFields.date ?? existingInvoice.date, due_date: formattedFields.due_date ?? existingInvoice.due_date, ...formattedFields, }; const body = { JSONString: JSON.stringify(updatePayload), }; const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'PUT', `${this.endpoint}/${invoiceId}`, body); return response?.invoice; } async delete(executeFunctions, itemIndex, _additionalFields) { const invoiceId = executeFunctions.getNodeParameter('invoiceId', itemIndex); const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'DELETE', `${this.endpoint}/${invoiceId}`); return response; } async list(executeFunctions, _itemIndex, _additionalFields) { return GenericFunctions_1.zohoApiRequestAllItems.call(executeFunctions, 'GET', this.endpoint, {}, {}); } async markAsSent(executeFunctions, itemIndex, _additionalFields) { const invoiceId = executeFunctions.getNodeParameter('invoiceId', itemIndex); if (!invoiceId) { throw new Error('Invoice ID is required for mark as sent operation'); } const response = await GenericFunctions_1.zohoApiRequest.call(executeFunctions, 'POST', `${this.endpoint}/${invoiceId}/status/sent`, {}, {}); return response?.invoice || response; } } exports.InvoiceResource = InvoiceResource; //# sourceMappingURL=Invoice.resource.js.map