UNPKG

api-beep-onboarding

Version:

Oracle OCI FaaS for Api Beep Onboarding library

576 lines (466 loc) 17.6 kB
/** * * BeePay 2.023-2.024 - Oracle OCI FaaS for Api Beep Onboarding * Way4 WS runtime SOAP request implementation * * Changes: * jlugo: 2023-dic-01. File creation * jlugo: 2023-jan-16. Update merchant ID and merchant Amex for Store, to use store procedure for database validation * jlugo: 2024-apr-22. Added WS AddContractApplicationInfo/EditContractApplicationInfo operations * jlugo: 2024-apr-25. Moved to a library * jlugo: 2024-may-29. Comment setStoreContractParameters call from WSStoreEditRequest in order to prepare production pass */ /* RGVzYXJyb2xsYWRvIHBvciBKb25hdGhhbiBMdWdv */ import { WSTemplates } from "./templates.js"; import { env } from "./utils.js"; import SoapOps from "./soap-ops.js"; /** * Base class for SOAP web service request */ class WSRequest { static Mode = { M_CREATE: "create", M_EDIT: "edit" } #buffer = ""; #start = false; #end = false; /** * * @param {String} templateType * @param {String} templateName * @param {Object} node */ createWSNode(templateType, templateName, node) { if (!this.#start) { this.startWSNode(); } if (node) { const template = new WSTemplates(templateType, templateName, node); this.#buffer += template.getXml(); } } startWSNode() { if (!this.#start) { this.#buffer = WSTemplates.Header; this.#start = true; this.#end = false; // Start a new WS request } } endWSNode() { if (this.#start && !this.#end) { this.#buffer += WSTemplates.Footer; this.#start = false; // Start a new WS request this.#end = true; } } /** * * @returns {String} - XML buffer */ getRequestBody() { if (!this.#end) { this.endWSNode(); } return this.#buffer; } /** * Set contract parameters [Store Level] * @param {Object} params * @param {String} merchantId * @param {String} mode - create|edit */ setStoreContractParameters(params, merchantId, mode) { if (!params) { return; } params.forEach((parameter) => { parameter.merchantId = merchantId; this.createWSNode(WSTemplates.TemplateTypes.TT_STORE, mode === WSRequest.Mode.M_CREATE ? "add-contract-application-info" : "edit-contract-application-info", parameter); }); } /** * Set classifiers [Store Level] * @param {Object} classifiers * @param {String} merchantId */ setStoreClassifiers(classifiers, merchantId) { if (!classifiers) { return; } classifiers.forEach((classifier) => { classifier.merchantId = merchantId; this.createWSNode(WSTemplates.TemplateTypes.TT_STORE, "set-contract-classifier", classifier); }); } /** * Set AMEX parameters [Store Level] * @param {Object} store * @param {String} mode - create|edit */ setStoreAmex(store, mode) { // The AMEX parameter depend on store.address node if (!store?.address) { return; } const param = { merchantId: store.merchantId, merchantAmexId: store.merchantAmex ?? "", mcc: store.mcc, contractName: store.contractName, country: store.address.country, state: store.address.state, city: store.address.city, zipCode: store.address.zipCode, phone: store.address.mobilePhone, channel: "X" }; this.createWSNode(WSTemplates.TemplateTypes.TT_STORE, mode === WSRequest.Mode.M_CREATE ? "set-device-parms" : "edit-device-parms", param); } /** * * @param {Object} device */ setDeviceInfo(device) { device.serialNumber = device.serialNumber ?? ""; device.cutOffTime = device.cutOffTime ?? ""; device.startTime = device.startTime ?? ""; device.endTime = device.endTime ?? ""; device.macStatus = device.macStatus ?? ""; device.pbtStatus = device.pbtStatus ?? ""; device.enableImmediately = "Y"; device.productCode = device.deviceType?.includes(SoapOps.DeviceType.ECOMM_POS) ? SoapOps.ProductCode.ACQ_V1_ECOM : SoapOps.ProductCode.ACQ_V1_POS; // SI: Valor fijo. See modelo.xlsx device.terminalActive = "SI"; // NO: Terminales de tipo Ecommerce, POS. SI: para los terminales TOP o QR. See modelo.xlsx device.requiredPresentCard = (device.deviceType?.includes(SoapOps.DeviceType.ECOMM_POS) || device.deviceType?.includes(SoapOps.DeviceType.DEVICE_H2H) || device.deviceType?.includes(SoapOps.DeviceType.PC)) ? "NO" : "SI"; } /** * * @param {Object} device */ setDeviceConfig(device) { if (!device) { return; } device.classifiers?. forEach((classifier) => { classifier.terminalId = device.terminalId; this.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "set-contract-classifier", classifier); }); device.contractParameters?. forEach((param) => { param.terminalId = device.terminalId; this.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "set-contract-parameter", param); }); // Device enhanced parameters: // <wsin:AddParms> // EGW_HOME=egateway/pages_templates/KinPOS_json;EGW_TERM_GROUP=KINPOS_GROUP;TDS_GMT=+01:00;TDS_URL=https://test.com</ // </wsin:AddParms> let enh = ""; device.deviceParameters?. forEach((param) => { enh += `${param.code}=${param.value};`; }); // Validate enhanced parameters exists to set if (enh.length > 0) { this.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "set-device-enh-parameter-v2", { enhParameters: enh, terminalId: device.terminalId }); } device.tariffs?. forEach((tariff) => { tariff.terminalId = device.terminalId; this.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "set-service-fee-tariff", tariff); }); } } /** * Create a new merchant record in the database, an acquiring contract, address (Type: REG_ADDR) and contract classifiers */ export class WSClientCreateRequest extends WSRequest { /** * @param {Object} client - Client and Contract information */ constructor(client) { super(); if (!client) { return; } // Create contract level info client.contract = { branch: client.branch ?? "", institutionCode: env.bank_code, productCode: SoapOps.ProductCode.ACQ_V1_CORP, clientNumber: client.clientNumber ?? "", contractName: client.contractName ?? "", contractNumber: `${env.bank_code.slice(-3)}-C-${client.clientNumber}`, openDate: client.registrationDate ?? "", comment: client.comment ?? "" }; // jlugo: 2024-09-06. Add TAX Payer Id field </TIN> client.taxPayerId = client.taxPayerId ?? ""; //-- Complete WS and database information client.institutionCode = env.bank_code; client.clientTypeCode = SoapOps.ClientType.M_RES; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "create-merchant", client); super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "create-acquiring-contract-v2", client.contract); if (client.address) { client.address.addressTypeCode = SoapOps.AddressType.REG_ADDR; client.address.deliveryTypeCode = SoapOps.DeliveryType.EMAIL; client.address.clientNumber = client.clientNumber ?? "" client.address.contractNumber = client.contract.contractNumber ?? ""; client.address.activationDate = client.registrationDate ?? ""; client.address.phone = client.phone ?? ""; client.address.mobilePhone = client.mobilePhone ?? ""; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "create-contract-address-v2", client.address); } client?.classifiers?.forEach((classifier) => { classifier.contractNumber = client?.contract.contractNumber; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "set-contract-classifier", classifier); }); } } /** * Editing an acquiring contract [Client Level] */ export class WSClientEditRequest extends WSRequest { /** * @param {Object} client - Client and Contract information */ constructor(client) { super(); if (!client) { return; } // Create contract level info client.contract = { contractName: client.contractName ?? "", contractNumber: `${env.bank_code.slice(-3)}-C-${client.clientNumber}`, comment: client.comment ?? "" }; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "edit-merchant-v3", client); super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "edit-acquiring-contract", client.contract); if (client.address) { client.address.addressTypeCode = SoapOps.AddressType.REG_ADDR; client.address.deliveryTypeCode = SoapOps.DeliveryType.EMAIL; client.address.clientNumber = client.clientNumber ?? ""; client.address.contractNumber = client.contract.contractNumber ?? ""; client.address.phone = client.phone ?? ""; client.address.mobilePhone = client.mobilePhone ?? ""; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "edit-contract-address-v3", client.address); } client.classifiers?.forEach((classifier) => { classifier.contractNumber = client?.contract.contractNumber; super.createWSNode(WSTemplates.TemplateTypes.TT_MERCHANT, "set-contract-classifier", classifier); }); } } /** * Create a subcontract for a given contract (Level Division) */ export class WSDivisionCreateRequest extends WSRequest { /** * * @param {Object} division - Division contract information */ constructor(division) { super(); if (!division) { return; } division.contractNumber = `${env.bank_code.slice(-3)}-C-${division.clientNumber}`; // Client/Contract Liability Contract division.productCode = SoapOps.ProductCode.ACQ_V1_DIV; super.createWSNode(WSTemplates.TemplateTypes.TT_DIVISION, "create-acquiring-subcontract", division); } } /** * Editing an acquiring contract [Division Level] */ export class WSDivisionEditRequest extends WSRequest { /** * * @param {Object} division - Division contract information */ constructor(division) { super(); if (!division) { return; } super.createWSNode(WSTemplates.TemplateTypes.TT_DIVISION, "edit-acquiring-contract", division); } } /** * Create a subcontract for a given contract (Level Store) */ export class WSStoreCreateRequest extends WSRequest { /** * * @param {Object} store - Store contract information */ constructor(store) { super(); if (!store) { return; } store.productCode = SoapOps.ProductCode.ACQ_V1_STORE; super.createWSNode(WSTemplates.TemplateTypes.TT_STORE, "create-acquiring-subcontract", store); } } /** * Editing an acquiring contract [Store Level] */ export class WSStoreEditRequest extends WSRequest { /** * * @param {Object} store - Store information * @param {Boolean} isAmex - Edit AMEX parameters? * @returns */ constructor(store, isAmex) { super(); if (!store) { return; } super.createWSNode(WSTemplates.TemplateTypes.TT_STORE, "edit-acquiring-contract", store); if (store.address) { store.address.addressTypeCode = SoapOps.AddressType.OWS_PS; store.address.deliveryTypeCode = SoapOps.DeliveryType.EMAIL; super.createWSNode(WSTemplates.TemplateTypes.TT_STORE, "edit-acquiring-contract-address", store.address); } // // jlugo: 2024-may-29. Waiting for Way4 implementation. Line commented for production pass // jlugo: 2024-jun-05. Tested with JR in production, all parameters set ok! super.setStoreContractParameters(store.contractParameters, store.merchantId, WSRequest.Mode.M_EDIT); super.setStoreClassifiers(store.classifiers, store.merchantId); if (isAmex) { super.setStoreAmex(store, WSRequest.Mode.M_EDIT); } } } /** * Create a new special merchant contract address with the address type defined in "MERCHANT_ADDRESS_TYPE" global parameter * value. Default address type = "OWS_PS" (Address for Payment Scheme) * Set application contract's additional data * Set a contract classifiers (Level Store) * * NOTE: Because the store creation may fail due to duplicate contract number (same merchant id), we perform the address creation * after creating the store contract */ export class WSStoreConfigRequest extends WSRequest { /** * * @param {Object} store - Store information * @param {Boolean} isAmex - Create AMEX parameters? */ constructor(store, isAmex) { super(); if (!store) { return; } if (store.address) { store.address.addressTypeCode = SoapOps.AddressType.OWS_PS; store.address.deliveryTypeCode = SoapOps.DeliveryType.EMAIL; super.createWSNode(WSTemplates.TemplateTypes.TT_STORE, "create-acquiring-contract-address", store.address); } super.setStoreContractParameters(store.contractParameters, store.merchantId, WSRequest.Mode.M_CREATE); super.setStoreClassifiers(store.classifiers, store.merchantId); if (isAmex) { super.setStoreAmex(store, WSRequest.Mode.M_CREATE); } } } /** * Create a device contract and device for given account contract */ export class WSDeviceCreateRequest extends WSRequest { /** * * @param {Object} device - Device contract information */ constructor(device) { super(); if (!device) { return; } super.setDeviceInfo(device); super.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "create-device-v3", device); } } /** * Editing an acquiring contract [Device Level] */ export class WSDeviceEditRequest extends WSRequest { /** * * @param {Object} device - Device contract information * @returns */ constructor(device) { super(); if (!device) { return; } super.setDeviceInfo(device); super.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "edit-acquiring-contract", device); super.createWSNode(WSTemplates.TemplateTypes.TT_DEVICE, "edit-device-v2", device); super.setDeviceConfig(device); } } /** * Set a contract classifiers, contract parameters, enhanced parameter and service fee tariff [Level Device] */ export class WSDeviceConfigRequest extends WSRequest { /** * * @param {Object} device - Device parameters */ constructor(device) { super(); if (!device) { return; } super.setDeviceConfig(device); } } /** * Get information for a given acquiring contract */ export class WSContractRequest extends WSRequest { /** * * @param {String} contractNumber - Contract number for client or merchantID or terminal ID */ constructor(contractNumber) { super(); if (!contractNumber || contractNumber?.length === 0) { return; } const contract = { contractNumber: contractNumber }; super.createWSNode(WSTemplates.TemplateTypes.TT_CONTRACT, "get-acquiring-contract", contract); } } /** * Set device contract status for a given acquiring contract */ export class WSStatusRequest extends WSRequest { /** * * @param contractType - Contract type (client|division|store|device) * @param {String} contractNumber - Contract number for a client, merchantID or terminal ID * @param {String} status - Contract new status */ constructor(contractType, contractNumber, status) { super(); if (!contractNumber || contractNumber?.length === 0) { return; } const contract = { contractType: contractType, contractNumber: contractNumber, newStatus: status }; super.createWSNode(WSTemplates.TemplateTypes.TT_STATUS, "set-acquiring-contract-status", contract); super.createWSNode(WSTemplates.TemplateTypes.TT_STATUS, "get-acquiring-contract", contract); } }