UNPKG

@progtechbr/n8n-nodes-rdsme

Version:

Send events through API to RD Station Marketing para Ecommerce

547 lines 24.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RdsmEcommerce = void 0; const IdentifierFields_1 = require("./Fields/IdentifierFields"); const LineItemsFields_1 = require("./Fields/LineItemsFields"); const ShippingFields_1 = require("./Fields/ShippingFields"); const TrackingFields_1 = require("./Fields/TrackingFields"); const AddicionalFields_1 = require("./Fields/AddicionalFields"); const PayloadBuilders_1 = require("./Utils/PayloadBuilders"); const Validations_1 = require("./Utils/Validations"); const validator_1 = require("validator"); const GenericFunctions_1 = require("./Utils/GenericFunctions"); const GenericConstants_1 = require("./Utils/GenericConstants"); class RdsmEcommerce { constructor() { this.description = { name: 'rdsmEcommerce', displayName: 'RD Station Marketing para Ecommerce', icon: 'file:RdsmEcommerce.svg', group: ['transform'], version: 1, subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', description: 'Insert ecommerce events to RD Station Marketing through API', defaults: { name: 'RD Station Marketing para Ecommerce', }, inputs: ['main'], outputs: ['main'], credentials: [ { name: 'rdsmEcommerceOAuth2Api', required: true, } ], properties: [ { displayName: 'Resource', name: 'resource', type: 'options', options: [ { name: 'Ecommerce Event', value: 'ecommerceEvents', } ], default: 'ecommerceEvents', description: 'Create a new ecommerce event', noDataExpression: true, required: true, }, { displayName: 'Operation', name: 'operation', type: 'options', displayOptions: { show: { resource: ['ecommerceEvents'], }, }, options: [ { name: 'New Ecommerce Event', value: 'newEcommerceEvent', description: 'Register a new ecommerce event', action: 'Register a new ecommerce event', }, ], default: 'newEcommerceEvent', noDataExpression: true, }, { displayName: 'Ecommerce Event Type', name: 'eventType', type: 'options', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, options: [ { name: 'Cart Abandoned', value: 'ecommerceCartAbandoned', description: 'Cart abandoned event', }, { name: 'Checkout Started', value: 'ecommerceCheckoutStarted', description: 'Checkout started event', }, { name: 'Order Cancelled', value: 'ecommerceOrderCancelled', description: 'Order cancelled event', }, { name: 'Order Fulfilled', value: 'ecommerceOrderFulfilled', description: 'Order fulfilled event', }, { name: 'Order Paid', value: 'ecommerceOrderPaid', description: 'Order paid event', }, { name: 'Order Placed', value: 'ecommerceOrderPlaced', description: 'Order placed event', }, { name: 'Order Refunded', value: 'ecommerceOrderRefunded', description: 'Order refunded event', }, { name: 'Shipment Delivered', value: 'ecommerceShipmentDelivered', description: 'Shipment delivered event', }, ], default: 'ecommerceCartAbandoned', description: 'Ecommerce event type for lead conversion', noDataExpression: true, required: true, }, ...IdentifierFields_1.ecommerceIdentifiers, { displayName: 'Lead Email', name: 'email', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, default: '', placeholder: 'lead@email.com', description: 'Primary email for the lead', required: true, }, { displayName: 'Lead Name', name: 'name', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, default: '', description: 'Lead\'s fullname', }, { displayName: 'Lead Mobile Phone', name: 'mobilePhone', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, default: '', description: 'Lead\'s mobile phone', }, { displayName: 'Lead Personal Phone', name: 'personalPhone', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, default: '', description: 'Lead\'s personal phone', }, { displayName: 'Checkout URL', name: 'checkoutUrl', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], eventType: ['ecommerceCheckoutStarted', 'ecommerceCartAbandoned'], }, }, default: '', description: 'Checkout URL - HTTP or HTTPS address', required: true, }, { displayName: 'Order URL', name: 'orderUrl', type: 'string', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], eventType: ['ecommerceOrderPlaced', 'ecommerceOrderPaid'], }, }, default: '', description: 'Order URL - HTTP or HTTPS address', }, ...IdentifierFields_1.orderPlacedIdentifiers, ...IdentifierFields_1.orderExplicitIdentifiers, { displayName: 'Cancel Reason', name: 'cancelReason', type: 'options', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], eventType: ['ecommerceOrderCancelled'], }, }, options: [ { name: 'Customer changed or cancelled the order', value: 'customer', }, { name: 'Fraud order', value: 'fraud', }, { name: 'Other reason', value: 'other', }, { name: 'Refused payment', value: 'declined', }, { name: 'Unavailable items', value: 'inventory', }, ], default: 'other', description: 'Cancellation reason for order cancelled event', }, { displayName: 'Currency', name: 'currency', type: 'options', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, hide: { eventType: [ 'ecommerceOrderCancelled', 'ecommerceOrderFulfilled', 'ecommerceShipmentDelivered', ], }, }, options: [ { name: 'ARS', value: 'ARS', description: 'Argentine Peso', }, { name: 'BRL', value: 'BRL', description: 'Brazilian Real', }, { name: 'CAD', value: 'CAD', description: 'Canadian Dollar', }, { name: 'CLP', value: 'CLP', description: 'Chilean Peso', }, { name: 'COP', value: 'COP', description: 'Colombian Peso', }, { name: 'EUR', value: 'EUR', description: 'Euro', }, { name: 'MXN', value: 'MXN', description: 'Mexican Peso', }, { name: 'PEN', value: 'PEN', description: 'Peruvian Nuevo Sol', }, { name: 'USD', value: 'USD', description: 'United States Dollar', }, { name: 'UYU', value: 'UYU', description: 'Uruguayan Peso', }, ], default: 'BRL', description: 'Currency of the store', noDataExpression: true, required: true, }, { displayName: 'Price', name: 'price', type: 'number', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, hide: { eventType: [ 'ecommerceOrderCancelled', 'ecommerceOrderFulfilled', 'ecommerceShipmentDelivered', ], }, }, default: 0, typeOptions: { minValue: 0, }, description: 'Price of the checkout/order', required: true, }, ...ShippingFields_1.ecommerceShippingFields, ...TrackingFields_1.ecommerceTrackingFields, { displayName: 'Total Items', name: 'totalItems', type: 'number', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, hide: { eventType: [ 'ecommerceOrderCancelled', 'ecommerceOrderFulfilled', 'ecommerceShipmentDelivered', ], }, }, default: 0, typeOptions: { minValue: 0, }, description: 'Total items of products in the checkout', required: true, }, ...LineItemsFields_1.ecommerceLineItems, { displayName: 'Additional Fields', name: 'additionalFields', type: 'collection', placeholder: 'Add Field', displayOptions: { show: { operation: ['newEcommerceEvent'], resource: ['ecommerceEvents'], }, }, default: {}, options: [ { ...AddicionalFields_1.appendLegalBaseOption, description: 'Whether to include the phrase “This message was sent automatically with n8n” to the end of the message', }, ], }, ], }; } async execute() { const returnData = []; let responseData; const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); if (resource == 'ecommerceEvents' && operation == 'newEcommerceEvent') { const eventType = this.getNodeParameter('eventType', 0); const eventFamily = GenericConstants_1.EVENT_FAMILY; const event = GenericConstants_1.ECOMMERCE_EVENT_TYPE_MAP[eventType]; const additionalFields = this.getNodeParameter('additionalFields', 0); const appendLegalBase = additionalFields.apppendLegalBase; const leadEmail = (0, Validations_1.validateEmail)(this, this.getNodeParameter('email', 0), 'Lead Email'); const leadName = this.getNodeParameter('name', 0).trim(); const mobilePhone = this.getNodeParameter('mobilePhone', 0).trim(); const personalPhone = this.getNodeParameter('personalPhone', 0).trim(); const legalBases = GenericConstants_1.LEGAL_BASES_OBJECT; let identifier; let specificPayload = {}; const isCartAbandoned = eventType == 'ecommerceCartAbandoned'; const isCheckoutStarted = eventType == 'ecommerceCheckoutStarted'; const isOrderPlaced = eventType == 'ecommerceOrderPlaced'; const isOrderPaid = eventType == 'ecommerceOrderPaid'; const isOrderRefunded = eventType == 'ecommerceOrderRefunded'; const isOrderCancelled = eventType == 'ecommerceOrderCancelled'; const isOrderFulfilled = eventType == 'ecommerceOrderFulfilled'; const isShipmentDelivered = eventType == 'ecommerceShipmentDelivered'; const basePayload = { email: leadEmail, ...(!(0, validator_1.isEmpty)(leadName) && { name: leadName }), ...(!(0, validator_1.isEmpty)(mobilePhone) && { mobile_phone: mobilePhone }), ...(!(0, validator_1.isEmpty)(personalPhone) && { personal_phone: personalPhone }), ...(appendLegalBase && { legal_bases: legalBases }), }; if (isCartAbandoned || isCheckoutStarted || isOrderPlaced || isOrderPaid || isOrderRefunded) { let lineItems; let lineItemsBuilded; const currency = this.getNodeParameter('currency', 0).trim(); const price = this.getNodeParameter('price', 0); const totalItems = this.getNodeParameter('totalItems', 0); if (!isOrderRefunded) { lineItems = this.getNodeParameter('lineItemsUi', 0); lineItemsBuilded = (0, PayloadBuilders_1.buildLineItems)(lineItems); } if (isCartAbandoned || isCheckoutStarted) { const checkoutUrl = this.getNodeParameter('checkoutUrl', 0).trim(); specificPayload = { checkout_url: checkoutUrl, currency: currency, price: price, total_items: totalItems, line_items: lineItemsBuilded, }; if (isCartAbandoned) { identifier = this.getNodeParameter('identifierCartAbandoned', 0).trim(); } else if (isCheckoutStarted) { identifier = this.getNodeParameter('identifierCheckoutStarted', 0).trim(); } specificPayload.identifier = identifier; } if (isOrderPlaced || isOrderPaid || isOrderRefunded) { identifier = this.getNodeParameter('identifierOrder', 0).trim(); specificPayload = { currency: currency, price: price, total_items: totalItems, ...(!isOrderRefunded && { line_items: lineItemsBuilded }), }; if (isOrderPlaced || isOrderPaid) { const orderUrl = this.getNodeParameter('orderUrl', 0).trim(); const shippingPrice = this.getNodeParameter('shippingPrice', 0); const shippingCity = this.getNodeParameter('shippingCity', 0).trim(); const shippingState = this.getNodeParameter('shippingState', 0).trim(); const shippingCountry = this.getNodeParameter('shippingCountry', 0).trim(); if (!(0, validator_1.isEmpty)(orderUrl)) { specificPayload.order_url = orderUrl; } if (shippingPrice > 0) { specificPayload.shipping_price = shippingPrice; } if (!(0, validator_1.isEmpty)(shippingCity)) { specificPayload.shipping_city = shippingCity; } if (!(0, validator_1.isEmpty)(shippingState)) { specificPayload.shipping_state = shippingState; } if (!(0, validator_1.isEmpty)(shippingCountry)) { specificPayload.shipping_country = shippingCountry; } } if (isOrderPlaced) { const cartIdentifier = this.getNodeParameter('cartIdentifier', 0).trim(); const checkoutIdentifier = this.getNodeParameter('checkoutIdentifier', 0).trim(); if (!(0, validator_1.isEmpty)(cartIdentifier)) { specificPayload.cart_identifier = cartIdentifier; } if (!(0, validator_1.isEmpty)(checkoutIdentifier)) { specificPayload.checkout_identifier = checkoutIdentifier; } } specificPayload.identifier = identifier; } } if (isOrderCancelled) { identifier = this.getNodeParameter('identifierOrder', 0).trim(); const cancelReason = this.getNodeParameter('cancelReason', 0).trim(); specificPayload = { identifier, ...(!(0, validator_1.isEmpty)(cancelReason) && { cancel_reason: cancelReason }), }; } if (isOrderFulfilled || isShipmentDelivered) { identifier = this.getNodeParameter('identifierShipment', 0).trim(); const orderIdentifier = this.getNodeParameter('orderIdentifierExplicit', 0).trim(); if (isOrderFulfilled) { const trackingCompany = this.getNodeParameter('trackingCompany', 0).trim(); const trackingCode = this.getNodeParameter('trackingCode', 0).trim(); const trackingUrl = this.getNodeParameter('trackingUrl', 0).trim(); specificPayload = { ...(!(0, validator_1.isEmpty)(trackingCompany) && { tracking_company: trackingCompany }), ...(!(0, validator_1.isEmpty)(trackingCode) && { tracking_code: trackingCode }), ...(!(0, validator_1.isEmpty)(trackingUrl) && { tracking_url: trackingUrl }), }; } specificPayload.identifier = identifier; specificPayload.order_identifier = orderIdentifier; } const payload = { ...basePayload, ...specificPayload }; const body = { event_type: event, event_family: eventFamily, payload: payload, }; responseData = await GenericFunctions_1.rdStationApiRequest.call(this, 'POST', `/events?event_type=${event}`, body); const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: 0 } }); returnData.push(...executionData); } return this.prepareOutputData(returnData); } ; } exports.RdsmEcommerce = RdsmEcommerce; ; //# sourceMappingURL=RdsmEcommerce.node.js.map