@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
JavaScript
;
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