UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

630 lines 33.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Xero = void 0; const n8n_workflow_1 = require("n8n-workflow"); const ContactDescription_1 = require("./ContactDescription"); const GenericFunctions_1 = require("./GenericFunctions"); const InvoiceDescription_1 = require("./InvoiceDescription"); class Xero { description = { displayName: 'Xero', name: 'xero', icon: 'file:xero.svg', group: ['output'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Consume Xero API', defaults: { name: 'Xero', }, usableAsTool: true, inputs: [n8n_workflow_1.NodeConnectionTypes.Main], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], credentials: [ { name: 'xeroOAuth2Api', required: true, }, ], properties: [ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Contact', value: 'contact', }, { name: 'Invoice', value: 'invoice', }, ], default: 'invoice', }, // CONTACT ...ContactDescription_1.contactOperations, ...ContactDescription_1.contactFields, // INVOICE ...InvoiceDescription_1.invoiceOperations, ...InvoiceDescription_1.invoiceFields, ], }; methods = { loadOptions: { // Get all the item codes to display them to user so that they can // select them easily async getItemCodes() { const organizationId = this.getCurrentNodeParameter('organizationId'); const returnData = []; const { Items: items } = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/items', { organizationId, }); for (const item of items) { const itemName = item.Description; const itemId = item.Code; returnData.push({ name: itemName, value: itemId, }); } return returnData; }, // Get all the account codes to display them to user so that they can // select them easily async getAccountCodes() { const organizationId = this.getCurrentNodeParameter('organizationId'); const returnData = []; const { Accounts: accounts } = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/Accounts', { organizationId, }); for (const account of accounts) { const accountName = account.Name; const accountId = account.Code; returnData.push({ name: accountName, value: accountId, }); } return returnData; }, // Get all the tenants to display them to user so that they can // select them easily async getTenants() { const returnData = []; const tenants = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '', {}, {}, 'https://api.xero.com/connections'); for (const tenant of tenants) { const tenantName = tenant.tenantName; const tenantId = tenant.tenantId; returnData.push({ name: tenantName, value: tenantId, }); } return returnData; }, // Get all the brading themes to display them to user so that they can // select them easily async getBrandingThemes() { const organizationId = this.getCurrentNodeParameter('organizationId'); const returnData = []; const { BrandingThemes: themes } = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/BrandingThemes', { organizationId }); for (const theme of themes) { const themeName = theme.Name; const themeId = theme.BrandingThemeID; returnData.push({ name: themeName, value: themeId, }); } return returnData; }, // Get all the currencies to display them to user so that they can // select them easily async getCurrencies() { const organizationId = this.getCurrentNodeParameter('organizationId'); const returnData = []; const { Currencies: currencies } = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/Currencies', { organizationId, }); for (const currency of currencies) { returnData.push({ name: currency.Description, // e.g. "Euro" value: currency.Code, // e.g. "EUR" }); } return returnData; }, // Get all the tracking categories to display them to user so that they can // select them easily async getTrakingCategories() { const organizationId = this.getCurrentNodeParameter('organizationId'); const returnData = []; const { TrackingCategories: categories } = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/TrackingCategories', { organizationId }); for (const category of categories) { const categoryName = category.Name; const categoryId = category.TrackingCategoryID; returnData.push({ name: categoryName, value: categoryId, }); } return returnData; }, // // Get all the tracking categories to display them to user so that they can // // select them easily // async getTrakingOptions(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> { // const organizationId = this.getCurrentNodeParameter('organizationId'); // const name = this.getCurrentNodeParameter('name'); // const returnData: INodePropertyOptions[] = []; // const { TrackingCategories: categories } = await xeroApiRequest.call(this, 'GET', '/TrackingCategories', { organizationId }); // const { Options: options } = categories.filter((category: IDataObject) => category.Name === name)[0]; // for (const option of options) { // const optionName = option.Name; // const optionId = option.TrackingOptionID; // returnData.push({ // name: optionName, // value: optionId, // }); // } // return returnData; // }, }, }; async execute() { const items = this.getInputData(); const returnData = []; const length = items.length; const qs = {}; let responseData; for (let i = 0; i < length; i++) { try { const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); //https://developer.xero.com/documentation/api/invoices if (resource === 'invoice') { if (operation === 'create') { const organizationId = this.getNodeParameter('organizationId', i); const type = this.getNodeParameter('type', i); const additionalFields = this.getNodeParameter('additionalFields', i); const contactId = this.getNodeParameter('contactId', i); const lineItemsValues = this.getNodeParameter('lineItemsUi', i) .lineItemsValues; const body = { organizationId, Type: type, Contact: { ContactID: contactId }, }; if (lineItemsValues) { const lineItems = []; for (const lineItemValue of lineItemsValues) { const lineItem = { Tracking: [], }; lineItem.AccountCode = lineItemValue.accountCode; lineItem.Description = lineItemValue.description; lineItem.DiscountRate = lineItemValue.discountRate; lineItem.ItemCode = lineItemValue.itemCode; lineItem.LineAmount = lineItemValue.lineAmount; lineItem.Quantity = lineItemValue.quantity.toString(); lineItem.TaxAmount = lineItemValue.taxAmount; lineItem.TaxType = lineItemValue.taxType; lineItem.UnitAmount = lineItemValue.unitAmount; // if (lineItemValue.trackingUi) { // //@ts-ignore // const { trackingValues } = lineItemValue.trackingUi as IDataObject[]; // if (trackingValues) { // for (const trackingValue of trackingValues) { // const tracking: IDataObject = {}; // tracking.Name = trackingValue.name as string; // tracking.Option = trackingValue.option as string; // lineItem.Tracking!.push(tracking); // } // } // } lineItems.push(lineItem); } body.LineItems = lineItems; } if (additionalFields.brandingThemeId) { body.BrandingThemeID = additionalFields.brandingThemeId; } if (additionalFields.currency) { body.CurrencyCode = additionalFields.currency; } if (additionalFields.currencyRate) { body.CurrencyRate = additionalFields.currencyRate; } if (additionalFields.date) { body.Date = additionalFields.date; } if (additionalFields.dueDate) { body.DueDate = additionalFields.dueDate; } if (additionalFields.dueDate) { body.DueDate = additionalFields.dueDate; } if (additionalFields.expectedPaymentDate) { body.ExpectedPaymentDate = additionalFields.expectedPaymentDate; } if (additionalFields.invoiceNumber) { body.InvoiceNumber = additionalFields.invoiceNumber; } if (additionalFields.lineAmountType) { body.LineAmountTypes = additionalFields.lineAmountType; } if (additionalFields.plannedPaymentDate) { body.PlannedPaymentDate = additionalFields.plannedPaymentDate; } if (additionalFields.reference) { body.Reference = additionalFields.reference; } if (additionalFields.sendToContact) { body.SentToContact = additionalFields.sendToContact; } if (additionalFields.status) { body.Status = additionalFields.status; } if (additionalFields.url) { body.Url = additionalFields.url; } responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'POST', '/Invoices', body); responseData = responseData.Invoices; } if (operation === 'update') { const invoiceId = this.getNodeParameter('invoiceId', i); const organizationId = this.getNodeParameter('organizationId', i); const updateFields = this.getNodeParameter('updateFields', i); const body = { organizationId, }; if (updateFields.lineItemsUi) { const lineItemsValues = updateFields.lineItemsUi .lineItemsValues; if (lineItemsValues) { const lineItems = []; for (const lineItemValue of lineItemsValues) { const lineItem = { Tracking: [], }; lineItem.AccountCode = lineItemValue.accountCode; lineItem.Description = lineItemValue.description; lineItem.DiscountRate = lineItemValue.discountRate; lineItem.ItemCode = lineItemValue.itemCode; lineItem.LineAmount = lineItemValue.lineAmount; lineItem.Quantity = lineItemValue.quantity.toString(); lineItem.TaxAmount = lineItemValue.taxAmount; lineItem.TaxType = lineItemValue.taxType; lineItem.UnitAmount = lineItemValue.unitAmount; // if (lineItemValue.trackingUi) { // //@ts-ignore // const { trackingValues } = lineItemValue.trackingUi as IDataObject[]; // if (trackingValues) { // for (const trackingValue of trackingValues) { // const tracking: IDataObject = {}; // tracking.Name = trackingValue.name as string; // tracking.Option = trackingValue.option as string; // lineItem.Tracking!.push(tracking); // } // } // } lineItems.push(lineItem); } body.LineItems = lineItems; } } if (updateFields.type) { body.Type = updateFields.type; } if (updateFields.Contact) { body.Contact = { ContactID: updateFields.contactId }; } if (updateFields.brandingThemeId) { body.BrandingThemeID = updateFields.brandingThemeId; } if (updateFields.currency) { body.CurrencyCode = updateFields.currency; } if (updateFields.currencyRate) { body.CurrencyRate = updateFields.currencyRate; } if (updateFields.date) { body.Date = updateFields.date; } if (updateFields.dueDate) { body.DueDate = updateFields.dueDate; } if (updateFields.dueDate) { body.DueDate = updateFields.dueDate; } if (updateFields.expectedPaymentDate) { body.ExpectedPaymentDate = updateFields.expectedPaymentDate; } if (updateFields.invoiceNumber) { body.InvoiceNumber = updateFields.invoiceNumber; } if (updateFields.lineAmountType) { body.LineAmountTypes = updateFields.lineAmountType; } if (updateFields.plannedPaymentDate) { body.PlannedPaymentDate = updateFields.plannedPaymentDate; } if (updateFields.reference) { body.Reference = updateFields.reference; } if (updateFields.sendToContact) { body.SentToContact = updateFields.sendToContact; } if (updateFields.status) { body.Status = updateFields.status; } if (updateFields.url) { body.Url = updateFields.url; } responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'POST', `/Invoices/${invoiceId}`, body); responseData = responseData.Invoices; } if (operation === 'get') { const organizationId = this.getNodeParameter('organizationId', i); const invoiceId = this.getNodeParameter('invoiceId', i); responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', `/Invoices/${invoiceId}`, { organizationId, }); responseData = responseData.Invoices; } if (operation === 'getAll') { const organizationId = this.getNodeParameter('organizationId', i); const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); if (options.statuses) { qs.statuses = options.statuses.join(','); } if (options.orderBy) { qs.order = `${options.orderBy} ${options.sortOrder === undefined ? 'DESC' : options.sortOrder}`; } if (options.where) { qs.where = options.where; } if (options.createdByMyApp) { qs.createdByMyApp = options.createdByMyApp; } if (returnAll) { responseData = await GenericFunctions_1.xeroApiRequestAllItems.call(this, 'Invoices', 'GET', '/Invoices', { organizationId }, qs); } else { const limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/Invoices', { organizationId }, qs); responseData = responseData.Invoices; responseData = responseData.splice(0, limit); } } } if (resource === 'contact') { if (operation === 'create') { const organizationId = this.getNodeParameter('organizationId', i); const name = this.getNodeParameter('name', i); const additionalFields = this.getNodeParameter('additionalFields', i); const addressesUi = additionalFields.addressesUi; const phonesUi = additionalFields.phonesUi; const body = { Name: name, }; if (additionalFields.accountNumber) { body.AccountNumber = additionalFields.accountNumber; } if (additionalFields.bankAccountDetails) { body.BankAccountDetails = additionalFields.bankAccountDetails; } if (additionalFields.contactNumber) { body.ContactNumber = additionalFields.contactNumber; } if (additionalFields.contactStatus) { body.ContactStatus = additionalFields.contactStatus; } if (additionalFields.defaultCurrency) { body.DefaultCurrency = additionalFields.defaultCurrency; } if (additionalFields.emailAddress) { body.EmailAddress = additionalFields.emailAddress; } if (additionalFields.firstName) { body.FirstName = additionalFields.firstName; } if (additionalFields.lastName) { body.LastName = additionalFields.lastName; } if (additionalFields.purchasesDefaultAccountCode) { body.PurchasesDefaultAccountCode = additionalFields.purchasesDefaultAccountCode; } if (additionalFields.salesDefaultAccountCode) { body.SalesDefaultAccountCode = additionalFields.salesDefaultAccountCode; } if (additionalFields.skypeUserName) { body.SkypeUserName = additionalFields.skypeUserName; } if (additionalFields.taxNumber) { body.taxNumber = additionalFields.taxNumber; } if (additionalFields.xeroNetworkKey) { body.xeroNetworkKey = additionalFields.xeroNetworkKey; } if (phonesUi) { const phoneValues = phonesUi?.phonesValues; if (phoneValues) { const phones = []; for (const phoneValue of phoneValues) { const phone = {}; phone.PhoneType = phoneValue.phoneType; phone.PhoneNumber = phoneValue.phoneNumber; phone.PhoneAreaCode = phoneValue.phoneAreaCode; phone.PhoneCountryCode = phoneValue.phoneCountryCode; phones.push(phone); } body.Phones = phones; } } if (addressesUi) { const addressValues = addressesUi?.addressesValues; if (addressValues) { const addresses = []; for (const addressValue of addressValues) { const address = {}; address.AddressType = addressValue.type; address.AddressLine1 = addressValue.line1; address.AddressLine2 = addressValue.line2; address.City = addressValue.city; address.Region = addressValue.region; address.PostalCode = addressValue.postalCode; address.Country = addressValue.country; address.AttentionTo = addressValue.attentionTo; addresses.push(address); } body.Addresses = addresses; } } responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'POST', '/Contacts', { organizationId, Contacts: [body], }); responseData = responseData.Contacts; } if (operation === 'get') { const organizationId = this.getNodeParameter('organizationId', i); const contactId = this.getNodeParameter('contactId', i); responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', `/Contacts/${contactId}`, { organizationId, }); responseData = responseData.Contacts; } if (operation === 'getAll') { const organizationId = this.getNodeParameter('organizationId', i); const returnAll = this.getNodeParameter('returnAll', i); const options = this.getNodeParameter('options', i); if (options.includeArchived) { qs.includeArchived = options.includeArchived; } if (options.orderBy) { qs.order = `${options.orderBy} ${options.sortOrder === undefined ? 'DESC' : options.sortOrder}`; } if (options.where) { qs.where = options.where; } if (returnAll) { responseData = await GenericFunctions_1.xeroApiRequestAllItems.call(this, 'Contacts', 'GET', '/Contacts', { organizationId }, qs); } else { const limit = this.getNodeParameter('limit', i); responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'GET', '/Contacts', { organizationId }, qs); responseData = responseData.Contacts; responseData = responseData.splice(0, limit); } } if (operation === 'update') { const organizationId = this.getNodeParameter('organizationId', i); const contactId = this.getNodeParameter('contactId', i); const updateFields = this.getNodeParameter('updateFields', i); const addressesUi = updateFields.addressesUi; const phonesUi = updateFields.phonesUi; const body = {}; if (updateFields.accountNumber) { body.AccountNumber = updateFields.accountNumber; } if (updateFields.name) { body.Name = updateFields.name; } if (updateFields.bankAccountDetails) { body.BankAccountDetails = updateFields.bankAccountDetails; } if (updateFields.contactNumber) { body.ContactNumber = updateFields.contactNumber; } if (updateFields.contactStatus) { body.ContactStatus = updateFields.contactStatus; } if (updateFields.defaultCurrency) { body.DefaultCurrency = updateFields.defaultCurrency; } if (updateFields.emailAddress) { body.EmailAddress = updateFields.emailAddress; } if (updateFields.firstName) { body.FirstName = updateFields.firstName; } if (updateFields.lastName) { body.LastName = updateFields.lastName; } if (updateFields.purchasesDefaultAccountCode) { body.PurchasesDefaultAccountCode = updateFields.purchasesDefaultAccountCode; } if (updateFields.salesDefaultAccountCode) { body.SalesDefaultAccountCode = updateFields.salesDefaultAccountCode; } if (updateFields.skypeUserName) { body.SkypeUserName = updateFields.skypeUserName; } if (updateFields.taxNumber) { body.taxNumber = updateFields.taxNumber; } if (updateFields.xeroNetworkKey) { body.xeroNetworkKey = updateFields.xeroNetworkKey; } if (phonesUi) { const phoneValues = phonesUi?.phonesValues; if (phoneValues) { const phones = []; for (const phoneValue of phoneValues) { const phone = {}; phone.PhoneType = phoneValue.phoneType; phone.PhoneNumber = phoneValue.phoneNumber; phone.PhoneAreaCode = phoneValue.phoneAreaCode; phone.PhoneCountryCode = phoneValue.phoneCountryCode; phones.push(phone); } body.Phones = phones; } } if (addressesUi) { const addressValues = addressesUi?.addressesValues; if (addressValues) { const addresses = []; for (const addressValue of addressValues) { const address = {}; address.AddressType = addressValue.type; address.AddressLine1 = addressValue.line1; address.AddressLine2 = addressValue.line2; address.City = addressValue.city; address.Region = addressValue.region; address.PostalCode = addressValue.postalCode; address.Country = addressValue.country; address.AttentionTo = addressValue.attentionTo; addresses.push(address); } body.Addresses = addresses; } } responseData = await GenericFunctions_1.xeroApiRequest.call(this, 'POST', `/Contacts/${contactId}`, { organizationId, Contacts: [body], }); responseData = responseData.Contacts; } } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message } }); continue; } throw error; } } return [returnData]; } } exports.Xero = Xero; //# sourceMappingURL=Xero.node.js.map