@dotdev/harmony-sdk 1.3.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ export declare class HarmonyAPI {
22
22
  stockLevelLookup(params: StockLevelLookupQueryParams, sessionId: string): Promise<StockLevel[]>;
23
23
  stockLevelLookupByWarehouseQuickView(params: StockLevelLookupQueryParams, sessionId: string): Promise<StockLevel[]>;
24
24
  processSalesOrder(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<boolean>;
25
+ mapOrderPayloadToXml(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<string>;
25
26
  processReturns(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<boolean>;
26
27
  modifyExistingSalesOrder(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<boolean>;
27
28
  cancelExistingSalesOrder(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<boolean>;
@@ -71,6 +71,9 @@ export class HarmonyAPI {
71
71
  async processSalesOrder(params, sessionId) {
72
72
  return await this.pointOfSaleModule.processSalesOrder(params, sessionId);
73
73
  }
74
+ async mapOrderPayloadToXml(params, sessionId) {
75
+ return await this.pointOfSaleModule.mapOrderPayloadToXml(params, sessionId);
76
+ }
74
77
  async processReturns(params, sessionId) {
75
78
  return await this.pointOfSaleModule.processReturns(params, sessionId);
76
79
  }
@@ -57,6 +57,7 @@ export declare abstract class Utils {
57
57
  * @returns {string}
58
58
  */
59
59
  static toXml(obj: object, parent?: string): string;
60
+ static objectToXml(obj: any): string;
60
61
  static deleteUndefinedProps(obj: any): any;
61
62
  static deleteEmptyProps(obj: any): any;
62
63
  /**
@@ -1,5 +1,5 @@
1
1
  import { promisify } from "util";
2
- import { parseString } from "xml2js";
2
+ import xml2js, { parseString } from "xml2js";
3
3
  const parseXml = promisify(parseString);
4
4
  export class Utils {
5
5
  /**
@@ -94,23 +94,30 @@ export class Utils {
94
94
  const open = parent ? `<${parent}>` : "";
95
95
  const close = parent ? `</${parent}>` : "";
96
96
  if (Array.isArray(obj)) {
97
- str += obj.map((o) => open + Utils.toXml(o) + close).join("");
97
+ str += obj
98
+ .map((o) => [open, Utils.toXml(o), close].join("\n"))
99
+ .join("\n");
98
100
  }
99
101
  else if (typeof obj === "object") {
100
102
  let valStr = "";
101
103
  for (const k in obj) {
102
104
  const val = obj[k];
103
105
  if (!(val == null)) {
104
- valStr += `${Utils.toXml(val, k)}`;
106
+ valStr += `${Utils.toXml(val, k)}\n`;
105
107
  }
106
108
  }
107
- str += open + valStr + close;
109
+ str += [open, valStr, close].join("\n");
108
110
  }
109
111
  else {
110
112
  str += open + obj + close;
111
113
  }
112
114
  return str;
113
115
  }
116
+ // Function to convert object to xml using xml2js library
117
+ static objectToXml(obj) {
118
+ const builder = new xml2js.Builder({ headless: true });
119
+ return builder.buildObject(obj);
120
+ }
114
121
  static deleteUndefinedProps(obj) {
115
122
  Object.keys(obj).forEach((key) => obj[key] === undefined && delete obj[key]);
116
123
  return obj;
@@ -56,7 +56,7 @@ export function mapProcessSaleOrderQueryHeaders(params) {
56
56
  account_sale_flag: params?.accountSaleFlag,
57
57
  web_order_type: params?.webOrderType,
58
58
  };
59
- return Utils.toXml(Utils.deleteEmptyProps(body));
59
+ return Utils.deleteEmptyProps(body);
60
60
  }
61
61
  export function mapProcessSaleOrderQueryExtra(params) {
62
62
  // XML body in JSON format, to be converted to XML string
@@ -85,7 +85,7 @@ export function mapProcessSaleOrderQueryExtra(params) {
85
85
  billing_telephone_work: params?.billingTelephoneWork,
86
86
  customised_info: params?.customisedInfo,
87
87
  };
88
- return Utils.toXml(Utils.deleteEmptyProps(body));
88
+ return Utils.deleteEmptyProps(body);
89
89
  }
90
90
  export function mapProcessSaleOrderQueryStock(params) {
91
91
  // XML body in JSON format, to be converted to XML string
@@ -116,7 +116,7 @@ export function mapProcessSaleOrderQueryStock(params) {
116
116
  packs_per_carton: params?.packsPerCarton,
117
117
  size_pack_name: params?.sizePackName,
118
118
  };
119
- return Utils.toXml(Utils.deleteEmptyProps(body));
119
+ return Utils.deleteEmptyProps(body);
120
120
  }
121
121
  export function mapProcessSaleOrderQueryDebtor(params) {
122
122
  // XML body in JSON format, to be converted to XML string
@@ -138,5 +138,5 @@ export function mapProcessSaleOrderQueryDebtor(params) {
138
138
  gift_voucher_serial_no: params?.giftVoucherSerialNo,
139
139
  reservation_history_no: params?.reservationHistoryNo,
140
140
  };
141
- return Utils.toXml(Utils.deleteEmptyProps(body));
141
+ return Utils.deleteEmptyProps(body);
142
142
  }
@@ -13,6 +13,15 @@ export declare class PointOfSaleModule {
13
13
  * @returns {Promise<boolean>}
14
14
  */
15
15
  processSalesOrder(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<boolean>;
16
+ /**
17
+ * Function to map ProcessSaleOrderQueryParams to XML for sending to the Point Of Sale service
18
+ * This is a TEMPORARY workaround to have the XML payload returned to be saved to the database
19
+ * TODO: combine this into the returned value of the `processSalesOrder` function
20
+ *
21
+ * @param {ProcessSaleOrderQueryParams} params
22
+ * @param {string} sessionId
23
+ */
24
+ mapOrderPayloadToXml(params: ProcessSaleOrderQueryParams, sessionId: string): Promise<string>;
16
25
  /**
17
26
  * Function to call the ProcessReturns endpoint in Harmony Point Of Sale service
18
27
  *
@@ -1,6 +1,9 @@
1
- import { ApiHelper } from "../../helpers";
1
+ import { ApiHelper, Utils } from "../../helpers";
2
2
  import { ServiceAlias } from "../shared";
3
- import { mapProcessSaleOrderQueryParams } from "./mappings/process-sale-order.mapper";
3
+ import { mapProcessSaleOrderQueryDebtor, mapProcessSaleOrderQueryExtra, mapProcessSaleOrderQueryHeaders, mapProcessSaleOrderQueryParams, mapProcessSaleOrderQueryStock, } from "./mappings/process-sale-order.mapper";
4
+ import { promisify } from "util";
5
+ import { parseString } from "xml2js";
6
+ const parseXml = promisify(parseString);
4
7
  export class PointOfSaleModule {
5
8
  axiosInstance;
6
9
  SERVICE_URL = "PointOfSaleService/PointOfSaleService";
@@ -25,6 +28,48 @@ export class PointOfSaleModule {
25
28
  throw await ApiHelper.parseError(error);
26
29
  }
27
30
  }
31
+ /**
32
+ * Function to map ProcessSaleOrderQueryParams to XML for sending to the Point Of Sale service
33
+ * This is a TEMPORARY workaround to have the XML payload returned to be saved to the database
34
+ * TODO: combine this into the returned value of the `processSalesOrder` function
35
+ *
36
+ * @param {ProcessSaleOrderQueryParams} params
37
+ * @param {string} sessionId
38
+ */
39
+ async mapOrderPayloadToXml(params, sessionId) {
40
+ const methodName = ["ProcessSalesOrder", "Request"];
41
+ const soapNamespace = "S";
42
+ // Extract method name and construct corresponding properties for the body of the SOAP request and the response from the API
43
+ const bodyMethodName = Array.isArray(methodName)
44
+ ? methodName.join("")
45
+ : methodName;
46
+ const body = {
47
+ mode: params?.mode,
48
+ audit_no: params?.auditNo,
49
+ export_no: params?.exportNo,
50
+ header: mapProcessSaleOrderQueryHeaders(params?.header),
51
+ extra: mapProcessSaleOrderQueryExtra(params?.extra),
52
+ stock: params?.stock.map(mapProcessSaleOrderQueryStock),
53
+ debtor: mapProcessSaleOrderQueryDebtor((params?.debtor ?? [])[0]),
54
+ };
55
+ const soapBodyJson = {};
56
+ soapBodyJson[`${ServiceAlias.POINT_OF_SALE}:${bodyMethodName}`] =
57
+ body;
58
+ const soapBody = Utils.objectToXml(soapBodyJson);
59
+ const soapHeader = `
60
+ <${ServiceAlias.POINT_OF_SALE}:SessionId>${sessionId}</${ServiceAlias.POINT_OF_SALE}:SessionId>
61
+ `;
62
+ const fullXml = `
63
+ <${soapNamespace}:Envelope xmlns:${soapNamespace}="http://schemas.xmlsoap.org/soap/envelope/" xmlns:${ServiceAlias.POINT_OF_SALE}="http://${ServiceAlias.POINT_OF_SALE}.ws.fbsaust.com.au">
64
+ <${soapNamespace}:Header>${soapHeader}</${soapNamespace}:Header>
65
+ <${soapNamespace}:Body>
66
+ ${soapBody}
67
+ </${soapNamespace}:Body>
68
+ </${soapNamespace}:Envelope>
69
+ `;
70
+ const parsedJson = await parseXml(fullXml);
71
+ return Utils.objectToXml(parsedJson);
72
+ }
28
73
  /**
29
74
  * Function to call the ProcessReturns endpoint in Harmony Point Of Sale service
30
75
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotdev/harmony-sdk",
3
- "version": "1.3.1",
3
+ "version": "1.5.0",
4
4
  "description": "Harmony API SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",