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

106 lines 4.7 kB
"use strict"; 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