api-beep-onboarding
Version:
Oracle OCI FaaS for Api Beep Onboarding library
576 lines (466 loc) • 17.6 kB
JavaScript
/**
*
* 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);
}
}