@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
106 lines • 4.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateSalesOrderId = validateSalesOrderId;
exports.createInstantInvoiceFromSalesOrder = createInstantInvoiceFromSalesOrder;
exports.normalizeInvoiceResponse = normalizeInvoiceResponse;
exports.validateInvoiceCreationParams = validateInvoiceCreationParams;
const n8n_workflow_1 = require("n8n-workflow");
const GenericFunctions_1 = require("./GenericFunctions");
async function validateSalesOrderId(salesOrderId) {
try {
const response = await GenericFunctions_1.zohoApiRequest.call(this, 'GET', `/salesorders/${salesOrderId}`);
const salesOrder = response?.salesorder;
if (!salesOrder) {
return { isValid: false, reason: 'Sales order not found' };
}
const validStatuses = ['open', 'confirmed'];
if (!validStatuses.includes(salesOrder.status?.toLowerCase())) {
return {
isValid: false,
salesOrder,
reason: `Sales order status is "${salesOrder.status}". Must be "Open" or "Confirmed" to create an invoice.`
};
}
return { isValid: true, salesOrder };
}
catch (error) {
if (error instanceof n8n_workflow_1.NodeApiError && error.httpCode === '404') {
return { isValid: false, reason: 'Sales order not found' };
}
throw error;
}
}
async function createInstantInvoiceFromSalesOrder(salesOrderId, additionalFields = {}) {
const validation = await validateSalesOrderId.call(this, salesOrderId);
if (!validation.isValid) {
throw new n8n_workflow_1.NodeApiError(this.getNode(), {
message: `Cannot create invoice from sales order: ${validation.reason}`,
description: `Sales Order ID: ${salesOrderId}. ${validation.reason}`,
httpCode: validation.reason?.includes('not found') ? '404' : '400',
});
}
const queryParams = new URLSearchParams({
salesorder_id: salesOrderId,
});
const body = {
...additionalFields,
};
try {
const response = await GenericFunctions_1.zohoApiRequest.call(this, 'POST', `/invoices/fromsalesorder?${queryParams.toString()}`, body);
return response?.invoice || response;
}
catch (error) {
if (error instanceof n8n_workflow_1.NodeApiError) {
const errorMessage = error.message || 'Unknown error';
const isInvalidSalesOrderError = errorMessage.includes('Invalid value passed for salesorder_id') ||
errorMessage.includes('salesorder_id');
let enhancedDescription = `Sales Order ID: ${salesOrderId}. ${error.description || ''}`;
if (isInvalidSalesOrderError) {
enhancedDescription += '\n\nPossible causes:\n' +
'1. Sales order might already be fully invoiced\n' +
'2. Sales order status may not be "Open" or "Confirmed"\n' +
'3. Sales order might not exist in the current organization';
}
throw new n8n_workflow_1.NodeApiError(this.getNode(), {
message: `Failed to create invoice from sales order: ${errorMessage}`,
description: enhancedDescription,
httpCode: error.httpCode || '500',
});
}
throw error;
}
}
function normalizeInvoiceResponse(invoiceData) {
if (!invoiceData) {
return null;
}
return {
invoice_id: invoiceData.invoice_id,
invoice_number: invoiceData.invoice_number,
customer_id: invoiceData.customer_id,
customer_name: invoiceData.customer_name,
status: invoiceData.status,
date: invoiceData.date,
due_date: invoiceData.due_date,
total: invoiceData.total,
balance: invoiceData.balance,
currency_code: invoiceData.currency_code,
created_time: invoiceData.created_time,
updated_time: invoiceData.updated_time,
salesorder_id: invoiceData.salesorder_id,
salesorder_number: invoiceData.salesorder_number,
line_items: invoiceData.line_items || [],
...invoiceData,
};
}
function validateInvoiceCreationParams(params) {
const requiredFields = ['customer_id'];
const missingFields = requiredFields.filter(field => !params[field]);
if (missingFields.length > 0) {
throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
}
if (params.line_items && (!Array.isArray(params.line_items) || params.line_items.length === 0)) {
throw new Error('line_items must be a non-empty array');
}
}
//# sourceMappingURL=InvoiceUtils.js.map