@things-factory/sales-base 4.3.516 → 4.3.518

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.
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./ecommerce-controller"), exports);
18
18
  __exportStar(require("./sellercraft-controller"), exports);
19
19
  __exportStar(require("./powrup-controller"), exports);
20
+ __exportStar(require("./webspert-controller"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAsC;AACtC,2DAAwC;AACxC,sDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAsC;AACtC,2DAAwC;AACxC,sDAAmC;AACnC,wDAAqC"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebspertController = void 0;
4
+ const typeorm_1 = require("typeorm");
5
+ const env_1 = require("@things-factory/env");
6
+ const warehouse_base_1 = require("@things-factory/warehouse-base");
7
+ const constants_1 = require("../../constants");
8
+ const service_1 = require("../../service");
9
+ const utils_1 = require("@things-factory/utils");
10
+ const utils_2 = require("../../utils");
11
+ // const { PerformanceObserver, performance } = require('node:perf_hooks')
12
+ class WebspertController {
13
+ static async packOrder(releaseGood, domain, user) {
14
+ await (0, typeorm_1.getConnection)().transaction(async (trx) => {
15
+ var _a;
16
+ releaseGood = await trx.getRepository(service_1.ReleaseGood).findOne({ where: { id: releaseGood.id, domain } });
17
+ // let releaseOrder = await trx.getRepository(ReleaseGood).findOne({ refNo: releaseGood.refNo, refNo2: releaseGood.refNo2, refNo3: releaseGood.refNo3, domain })
18
+ // // only recall if releaseGood exists and pack Order fail
19
+ if (!releaseGood && (releaseGood.packOrderFail == false))
20
+ return false;
21
+ try {
22
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/set_order_status_to_packed', {
23
+ order_identifier: releaseGood.refNo
24
+ }, domain, user);
25
+ if (results.status != 200) {
26
+ throw new Error(results.statusText);
27
+ }
28
+ if (((_a = results === null || results === void 0 ? void 0 : results.data) === null || _a === void 0 ? void 0 : _a.code) === 200) {
29
+ await updatePackOrderStatus(trx, releaseGood);
30
+ return true;
31
+ }
32
+ }
33
+ catch (error) {
34
+ env_1.logger.error(`webspert-controller[packOrder]: ${error}`);
35
+ await updatePackOrderStatus(trx, releaseGood, true);
36
+ return false;
37
+ }
38
+ });
39
+ }
40
+ static async fetchPackageAndDocument(releaseGood, domain, user) {
41
+ await (0, typeorm_1.getConnection)().transaction(async (trx) => {
42
+ let roUpdateFields = null;
43
+ let releaseOrder = await trx.getRepository(service_1.ReleaseGood).findOne({
44
+ where: { id: releaseGood.id, domain },
45
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
46
+ });
47
+ if (releaseOrder) {
48
+ try {
49
+ // capture update fields
50
+ roUpdateFields = {
51
+ lastMarketPackCall: new Date()
52
+ };
53
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/get_order_package', {
54
+ order_identifier: releaseOrder.refNo
55
+ }, domain, user);
56
+ if (results.status != 200) {
57
+ throw new Error(results.statusText);
58
+ }
59
+ roUpdateFields = await generatePackage(releaseOrder, results === null || results === void 0 ? void 0 : results.data.data.package, user, trx);
60
+ }
61
+ catch (error) {
62
+ roUpdateFields = {
63
+ packOrderFail: true
64
+ };
65
+ }
66
+ }
67
+ await updateRO(releaseGood.id, roUpdateFields, trx);
68
+ return await trx.getRepository(service_1.ReleaseGood).findOne({
69
+ where: { id: releaseGood.id, domain },
70
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
71
+ });
72
+ });
73
+ }
74
+ static async initiateShipment(releaseGood, orderPackages, domain, user) {
75
+ if (orderPackages == null || orderPackages.length == 0) {
76
+ if (releaseGood) {
77
+ orderPackages = await (0, typeorm_1.getRepository)(service_1.OrderPackage).find({ where: { releaseGood } });
78
+ }
79
+ else {
80
+ console.error('webspert-controller[initiateShipment]: releaseGood is not found');
81
+ return false;
82
+ }
83
+ }
84
+ await orderPackages.forEach(async (orderPackage) => {
85
+ try {
86
+ let results = await warehouse_base_1.WebspertController.sendRequestToAPI('order/set_order_status_to_ready_ship', {
87
+ package_id: orderPackage.packageId
88
+ }, domain, user);
89
+ if (results.status != 200) {
90
+ throw new Error(results.statusText);
91
+ }
92
+ await (0, typeorm_1.getRepository)(service_1.OrderPackage).update({ id: orderPackage.id }, { marketRtsCallSuccess: new Date() });
93
+ }
94
+ catch (error) {
95
+ await (0, typeorm_1.getRepository)(service_1.OrderPackage)
96
+ .createQueryBuilder()
97
+ .update(service_1.OrderPackage)
98
+ .set({ marketRtsCallRetry: () => `coalesce("market_rts_call_retry", 0) + 1` })
99
+ .where('id = :id', { id: orderPackage.id })
100
+ .execute();
101
+ env_1.logger.error(`webspert-controller[initiateShipment]: ${error}`);
102
+ }
103
+ });
104
+ }
105
+ static async triggerOrderProcesses(releaseGood, domain, user, triggerRTS) {
106
+ try {
107
+ const waitTime = 200;
108
+ releaseGood = await (0, typeorm_1.getRepository)(service_1.ReleaseGood).findOne({ where: { id: releaseGood.id, domain } });
109
+ // // only recall if fail
110
+ if (releaseGood.packOrderFail == false || releaseGood.packOrderFail === null) {
111
+ await this.packOrder(releaseGood, domain, user);
112
+ await (0, utils_1.sleep)(waitTime);
113
+ }
114
+ await this.fetchPackageAndDocument(releaseGood, domain, user);
115
+ await (0, utils_1.sleep)(waitTime);
116
+ if (triggerRTS) {
117
+ await this.initiateShipment(releaseGood, null, domain, user);
118
+ }
119
+ return true;
120
+ }
121
+ catch (error) {
122
+ env_1.logger.error(error);
123
+ }
124
+ }
125
+ }
126
+ exports.WebspertController = WebspertController;
127
+ async function updateRO(releaseGoodId, roUpdateFields, trxMgr) {
128
+ if (roUpdateFields) {
129
+ await trxMgr.getRepository(service_1.ReleaseGood).update({ id: releaseGoodId }, roUpdateFields);
130
+ }
131
+ }
132
+ async function generatePackage(releaseGood, packages, user, trxMgr) {
133
+ if (packages.length > 0) {
134
+ packages = await Promise.all(packages.map(async (pkg) => {
135
+ const [items, awbUrl, packageId, trackingNo, transporter] = [pkg.products, pkg.awb_link, pkg.package_id, pkg.tracking_number, pkg.transporter];
136
+ if (items.length < 1) {
137
+ throw new Error('No items found in package');
138
+ }
139
+ try {
140
+ let orderPackage = await trxMgr.getRepository(service_1.OrderPackage).findOne({
141
+ where: { packageId: packageId, releaseGood, domain: releaseGood.domain, bizplace: releaseGood.bizplace }
142
+ });
143
+ if (!orderPackage) {
144
+ orderPackage = await trxMgr.getRepository(service_1.OrderPackage).save({
145
+ name: utils_2.OrderNoGenerator.orderPackage(),
146
+ packageId: packageId,
147
+ airwayBill: awbUrl,
148
+ transporter,
149
+ trackingNo,
150
+ status: constants_1.ORDER_STATUS.PROCESSING,
151
+ releaseGood,
152
+ domain: releaseGood.domain,
153
+ bizplace: releaseGood.bizplace,
154
+ creator: releaseGood.creator,
155
+ updater: releaseGood.updater
156
+ });
157
+ }
158
+ else {
159
+ orderPackage = await trxMgr.getRepository(service_1.OrderPackage).save(Object.assign(Object.assign({}, orderPackage), { packageId: packageId, airwayBill: awbUrl, transporter,
160
+ trackingNo, updater: user }));
161
+ }
162
+ let orderPackageItems = await trxMgr.getRepository(service_1.OrderPackageItem).find({
163
+ where: { orderPackage },
164
+ relations: ['productDetail']
165
+ });
166
+ orderPackageItems = items.map(itm => {
167
+ const { sku, qty } = itm;
168
+ if (!sku) {
169
+ throw new Error(`universalIdentifier missing`);
170
+ }
171
+ const matchedOrderPackageItem = orderPackageItems.find(op => op.productDetail.refCode == sku && op.releaseQty == qty);
172
+ if (matchedOrderPackageItem) {
173
+ return matchedOrderPackageItem;
174
+ }
175
+ else {
176
+ const matchedOrderProduct = releaseGood.orderProducts.find(op => op.productDetail.refCode == sku);
177
+ return {
178
+ name: utils_2.OrderNoGenerator.orderPackageItem(),
179
+ orderProduct: matchedOrderProduct,
180
+ status: constants_1.ORDER_STATUS.PROCESSING,
181
+ releaseQty: qty,
182
+ orderPackage: orderPackage,
183
+ domain: releaseGood.domain,
184
+ bizplace: releaseGood.bizplace,
185
+ creator: releaseGood.creator,
186
+ updater: releaseGood.updater,
187
+ productDetail: matchedOrderProduct === null || matchedOrderProduct === void 0 ? void 0 : matchedOrderProduct.productDetail
188
+ };
189
+ }
190
+ });
191
+ await trxMgr.getRepository(service_1.OrderPackageItem).save(orderPackageItems);
192
+ return orderPackage;
193
+ }
194
+ catch (error) {
195
+ console.error(error);
196
+ }
197
+ }));
198
+ if (packages.length == packages.filter(pkg => pkg.packageId).length) {
199
+ return {
200
+ packageId: packages[0].packageId,
201
+ marketPackCallSuccess: new Date(),
202
+ lastMarketPackCall: new Date(),
203
+ updatedAt: new Date()
204
+ };
205
+ }
206
+ else {
207
+ return {
208
+ lastMarketPackCall: new Date(),
209
+ updatedAt: new Date()
210
+ };
211
+ }
212
+ }
213
+ }
214
+ async function updatePackOrderStatus(trx, releaseOrder, status = false) {
215
+ await trx.getRepository(service_1.ReleaseGood).update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status });
216
+ return true;
217
+ }
218
+ //# sourceMappingURL=webspert-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webspert-controller.js","sourceRoot":"","sources":["../../../server/controllers/ecommerce/webspert-controller.ts"],"names":[],"mappings":";;;AAAA,qCAAqE;AAErE,6CAA4C;AAI5C,mEAA6F;AAE7F,+CAA8C;AAC9C,2CAAyF;AAEzF,iDAA6C;AAC7C,uCAA8C;AAE9C,0EAA0E;AAE1E,MAAa,kBAAkB;IACtB,MAAM,CAAC,KAAK,CAAC,SAAS,CAC3B,WAAwB,EACxB,MAAc,EACd,IAAU;QAEV,MAAM,IAAA,uBAAa,GAAE,CAAC,WAAW,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;;YAC5C,WAAW,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,qBAAW,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YAErG,gKAAgK;YAEhK,2DAA2D;YAC3D,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAEtE,IAAI;gBACF,IAAI,OAAO,GAAG,MAAM,mCAAsB,CAAC,gBAAgB,CACzD,kCAAkC,EAClC;oBACE,gBAAgB,EAAE,WAAW,CAAC,KAAK;iBACpC,EACD,MAAM,EACN,IAAI,CACL,CAAA;gBACD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;iBACpC;gBAED,IAAI,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,0CAAE,IAAI,MAAK,GAAG,EAAE;oBAC/B,MAAM,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;oBAC7C,OAAO,IAAI,CAAA;iBACZ;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,YAAM,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAA;gBACxD,MAAM,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;gBACnD,OAAO,KAAK,CAAA;aACb;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,uBAAuB,CACzC,WAAwB,EACxB,MAAc,EACd,IAAU;QAEV,MAAM,IAAA,uBAAa,GAAE,CAAC,WAAW,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YAC5C,IAAI,cAAc,GAAyB,IAAI,CAAA;YAE/C,IAAI,YAAY,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,qBAAW,CAAC,CAAC,OAAO,CAAC;gBAC9D,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE;gBACrC,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,6BAA6B,CAAC;aAClF,CAAC,CAAA;YAEF,IAAI,YAAY,EAAE;gBAChB,IAAI;oBACF,wBAAwB;oBACxB,cAAc,GAAG;wBACf,kBAAkB,EAAE,IAAI,IAAI,EAAE;qBAC/B,CAAA;oBAED,IAAI,OAAO,GAAG,MAAM,mCAAsB,CAAC,gBAAgB,CACzD,yBAAyB,EACzB;wBACE,gBAAgB,EAAE,YAAY,CAAC,KAAK;qBACrC,EACD,MAAM,EACN,IAAI,CACL,CAAA;oBACD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE;wBACzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;qBACpC;oBAED,cAAc,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;iBAC5F;gBAAC,OAAO,KAAK,EAAE;oBACd,cAAc,GAAG;wBACf,aAAa,EAAE,IAAI;qBACpB,CAAA;iBACF;aACF;YAED,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,CAAA;YACnD,OAAO,MAAM,GAAG,CAAC,aAAa,CAAC,qBAAW,CAAC,CAAC,OAAO,CAAC;gBAClD,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE;gBACrC,SAAS,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,6BAA6B,CAAC;aAClF,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAClC,WAAwB,EACxB,aAA6B,EAC7B,MAAc,EACd,IAAU;QAEV,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;YACtD,IAAI,WAAW,EAAE;gBACf,aAAa,GAAG,MAAM,IAAA,uBAAa,EAAC,sBAAY,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;aACnF;iBACI;gBACH,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;gBAChF,OAAO,KAAK,CAAA;aACb;SACF;QAED,MAAM,aAAa,CAAC,OAAO,CAAC,KAAK,EAAC,YAAY,EAAC,EAAE;YAC/C,IAAI;gBACF,IAAI,OAAO,GAAQ,MAAM,mCAAsB,CAAC,gBAAgB,CAC9D,sCAAsC,EACtC;oBACE,UAAU,EAAE,YAAY,CAAC,SAAS;iBACnC,EACD,MAAM,EACN,IAAI,CACL,CAAA;gBACD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;iBACpC;gBAED,MAAM,IAAA,uBAAa,EAAC,sBAAY,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;aACxG;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,IAAA,uBAAa,EAAC,sBAAY,CAAC;qBAC9B,kBAAkB,EAAE;qBACpB,MAAM,CAAC,sBAAY,CAAC;qBACpB,GAAG,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,0CAA0C,EAAE,CAAC;qBAC7E,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC;qBAC1C,OAAO,EAAE,CAAA;gBAEZ,YAAM,CAAC,KAAK,CAAC,0CAA0C,KAAK,EAAE,CAAC,CAAA;aAChE;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,qBAAqB,CACvC,WAAwB,EACxB,MAAc,EACd,IAAU,EACV,UAAiB;QAEjB,IAAI;YACF,MAAM,QAAQ,GAAG,GAAG,CAAA;YAEpB,WAAW,GAAG,MAAM,IAAA,uBAAa,EAAC,qBAAW,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAA;YACjG,yBAAyB;YACzB,IAAI,WAAW,CAAC,aAAa,IAAI,KAAK,IAAI,WAAW,CAAC,aAAa,KAAK,IAAI,EAAE;gBAC5E,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC/C,MAAM,IAAA,aAAK,EAAC,QAAQ,CAAC,CAAA;aACtB;YAED,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC7D,MAAM,IAAA,aAAK,EAAC,QAAQ,CAAC,CAAA;YAErB,IAAI,UAAU,EAAE;gBACd,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;aAC7D;YAED,OAAO,IAAI,CAAA;SAEZ;QAAC,OAAO,KAAK,EAAE;YACd,YAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;SACpB;IACH,CAAC;CACF;AAhKD,gDAgKC;AAED,KAAK,UAAU,QAAQ,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM;IAC3D,IAAI,cAAc,EAAE;QAClB,MAAM,MAAM,CAAC,aAAa,CAAC,qBAAW,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,CAAC,CAAA;KACtF;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,WAAwB,EACxB,QAAe,EACf,IAAU,EACV,MAAqB;IAErB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACvB,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YACvB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;YAE9I,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;aAC7C;YAED,IAAI;gBACF,IAAI,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,sBAAY,CAAC,CAAC,OAAO,CAAC;oBAClE,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE;iBACzG,CAAC,CAAA;gBAEF,IAAI,CAAC,YAAY,EAAE;oBACjB,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,sBAAY,CAAC,CAAC,IAAI,CAAC;wBAC3D,IAAI,EAAE,wBAAgB,CAAC,YAAY,EAAE;wBACrC,SAAS,EAAE,SAAS;wBACpB,UAAU,EAAE,MAAM;wBAClB,WAAW;wBACX,UAAU;wBACV,MAAM,EAAE,wBAAY,CAAC,UAAU;wBAC/B,WAAW;wBACX,MAAM,EAAE,WAAW,CAAC,MAAM;wBAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;wBAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;wBAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;qBAC7B,CAAC,CAAA;iBACH;qBAAM;oBACL,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,sBAAY,CAAC,CAAC,IAAI,iCACvD,YAAY,KACf,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,WAAW;wBACX,UAAU,EACV,OAAO,EAAE,IAAI,IACb,CAAA;iBACH;gBAED,IAAI,iBAAiB,GAAuB,MAAM,MAAM,CAAC,aAAa,CAAC,0BAAgB,CAAC,CAAC,IAAI,CAAC;oBAC5F,KAAK,EAAE,EAAE,YAAY,EAAE;oBACvB,SAAS,EAAE,CAAC,eAAe,CAAC;iBAC7B,CAAC,CAAA;gBAEF,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAClC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;oBACxB,IAAI,CAAC,GAAG,EAAE;wBACR,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;qBAC/C;oBACD,MAAM,uBAAuB,GAAqB,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC,UAAU,IAAI,GAAG,CAAC,CAAA;oBAEvI,IAAI,uBAAuB,EAAE;wBAC3B,OAAO,uBAAuB,CAAA;qBAC/B;yBAAM;wBACL,MAAM,mBAAmB,GAAiB,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,IAAI,GAAG,CAAC,CAAA;wBAC/G,OAAO;4BACL,IAAI,EAAE,wBAAgB,CAAC,gBAAgB,EAAE;4BACzC,YAAY,EAAE,mBAAmB;4BACjC,MAAM,EAAE,wBAAY,CAAC,UAAU;4BAC/B,UAAU,EAAE,GAAG;4BACf,YAAY,EAAE,YAAY;4BAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;4BAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;4BAC9B,OAAO,EAAE,WAAW,CAAC,OAAO;4BAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;4BAC5B,aAAa,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,aAAa;yBAClD,CAAA;qBACF;gBACH,CAAC,CAAC,CAAA;gBAEF,MAAM,MAAM,CAAC,aAAa,CAAC,0BAAgB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAEpE,OAAO,YAAY,CAAA;aACpB;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;aACrB;QACH,CAAC,CAAC,CACH,CAAA;QAED,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;YACnE,OAAO;gBACL,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBAChC,qBAAqB,EAAE,IAAI,IAAI,EAAE;gBACjC,kBAAkB,EAAE,IAAI,IAAI,EAAE;gBAC9B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAA;SACF;aAAM;YACL,OAAO;gBACL,kBAAkB,EAAE,IAAI,IAAI,EAAE;gBAC9B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAA;SACF;KACF;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAG,EAAE,YAAY,EAAE,SAAkB,KAAK;IAC7E,MAAM,GAAG,CAAC,aAAa,CAAC,qBAAW,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/H,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -22,6 +22,7 @@ __exportStar(require("./constants"), exports);
22
22
  __exportStar(require("./errors"), exports);
23
23
  __exportStar(require("./controllers/ecommerce/sellercraft-controller"), exports);
24
24
  __exportStar(require("./controllers/ecommerce/powrup-controller"), exports);
25
+ __exportStar(require("./controllers/ecommerce"), exports);
25
26
  var release_good_logs_mutation_1 = require("./service/release-good-logs/release-good-logs-mutation");
26
27
  Object.defineProperty(exports, "createReleaseGoodLog", { enumerable: true, get: function () { return release_good_logs_mutation_1.createReleaseGoodLog; } });
27
28
  var draft_release_good_create_1 = require("./service/draft-release-good/draft-release-good-create");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,0CAAuB;AACvB,8CAA2B;AAC3B,2CAAwB;AACxB,iFAA8D;AAC9D,4EAAyD;AAEzD,qGAA6F;AAApF,kIAAA,oBAAoB,OAAA;AAC7B,oGAA+F;AAAtF,mIAAA,sBAAsB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,+CAA4B;AAC5B,0CAAuB;AACvB,8CAA2B;AAC3B,2CAAwB;AACxB,iFAA8D;AAC9D,4EAAyD;AACzD,0DAAuC;AAGvC,qGAA6F;AAApF,kIAAA,oBAAoB,OAAA;AAC7B,oGAA+F;AAAtF,mIAAA,sBAAsB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/sales-base",
3
- "version": "4.3.516",
3
+ "version": "4.3.518",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -23,20 +23,21 @@
23
23
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
24
24
  },
25
25
  "dependencies": {
26
- "@things-factory/attachment-base": "^4.3.452",
27
- "@things-factory/auth-base": "^4.3.452",
28
- "@things-factory/biz-base": "^4.3.452",
29
- "@things-factory/code-base": "^4.3.452",
30
- "@things-factory/integration-accounting": "^4.3.512",
31
- "@things-factory/integration-base": "^4.3.512",
32
- "@things-factory/integration-powrup": "^4.3.512",
33
- "@things-factory/integration-sftp": "^4.3.512",
34
- "@things-factory/notification": "^4.3.452",
35
- "@things-factory/product-base": "^4.3.495",
36
- "@things-factory/setting-base": "^4.3.452",
26
+ "@things-factory/attachment-base": "^4.3.518",
27
+ "@things-factory/auth-base": "^4.3.518",
28
+ "@things-factory/biz-base": "^4.3.518",
29
+ "@things-factory/code-base": "^4.3.518",
30
+ "@things-factory/integration-accounting": "^4.3.518",
31
+ "@things-factory/integration-base": "^4.3.518",
32
+ "@things-factory/integration-powrup": "^4.3.518",
33
+ "@things-factory/integration-sftp": "^4.3.518",
34
+ "@things-factory/notification": "^4.3.518",
35
+ "@things-factory/product-base": "^4.3.518",
36
+ "@things-factory/setting-base": "^4.3.518",
37
37
  "@things-factory/shell": "^4.3.434",
38
- "@things-factory/transport-base": "^4.3.452",
39
- "@things-factory/warehouse-base": "^4.3.516"
38
+ "@things-factory/transport-base": "^4.3.518",
39
+ "@things-factory/warehouse-base": "^4.3.518",
40
+ "axios": "1.7.7"
40
41
  },
41
- "gitHead": "e978cd97325cd1fe187d81e566f393f5d94093ea"
42
+ "gitHead": "463e272569a16f091b20eb9a99fdd8739fb99939"
42
43
  }
@@ -1,3 +1,4 @@
1
1
  export * from './ecommerce-controller'
2
2
  export * from './sellercraft-controller'
3
3
  export * from './powrup-controller'
4
+ export * from './webspert-controller'
@@ -0,0 +1,289 @@
1
+ import { EntityManager, getConnection, getRepository } from 'typeorm'
2
+
3
+ import { logger } from '@things-factory/env'
4
+ import { Domain, User } from '@things-factory/shell'
5
+ import { config } from '@things-factory/env'
6
+
7
+ import { WebspertController as BaseWebspertController } from '@things-factory/warehouse-base'
8
+
9
+ import { ORDER_STATUS } from '../../constants'
10
+ import { ReleaseGood, OrderProduct, OrderPackageItem, OrderPackage } from '../../service'
11
+
12
+ import { sleep } from '@things-factory/utils'
13
+ import { OrderNoGenerator } from '../../utils'
14
+
15
+ // const { PerformanceObserver, performance } = require('node:perf_hooks')
16
+
17
+ export class WebspertController {
18
+ public static async packOrder(
19
+ releaseGood: ReleaseGood,
20
+ domain: Domain,
21
+ user: User
22
+ ) {
23
+ await getConnection().transaction(async trx => {
24
+ releaseGood = await trx.getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
25
+
26
+ // let releaseOrder = await trx.getRepository(ReleaseGood).findOne({ refNo: releaseGood.refNo, refNo2: releaseGood.refNo2, refNo3: releaseGood.refNo3, domain })
27
+
28
+ // // only recall if releaseGood exists and pack Order fail
29
+ if (!releaseGood && (releaseGood.packOrderFail == false)) return false
30
+
31
+ try {
32
+ let results = await BaseWebspertController.sendRequestToAPI(
33
+ 'order/set_order_status_to_packed',
34
+ {
35
+ order_identifier: releaseGood.refNo
36
+ },
37
+ domain,
38
+ user
39
+ )
40
+ if (results.status != 200) {
41
+ throw new Error(results.statusText)
42
+ }
43
+
44
+ if (results?.data?.code === 200) {
45
+ await updatePackOrderStatus(trx, releaseGood)
46
+ return true
47
+ }
48
+ } catch (error) {
49
+ logger.error(`webspert-controller[packOrder]: ${error}`)
50
+ await updatePackOrderStatus(trx, releaseGood, true)
51
+ return false
52
+ }
53
+ })
54
+ }
55
+
56
+ public static async fetchPackageAndDocument(
57
+ releaseGood: ReleaseGood,
58
+ domain: Domain,
59
+ user: User
60
+ ) {
61
+ await getConnection().transaction(async trx => {
62
+ let roUpdateFields: Partial<ReleaseGood> = null
63
+
64
+ let releaseOrder = await trx.getRepository(ReleaseGood).findOne({
65
+ where: { id: releaseGood.id, domain },
66
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
67
+ })
68
+
69
+ if (releaseOrder) {
70
+ try {
71
+ // capture update fields
72
+ roUpdateFields = {
73
+ lastMarketPackCall: new Date()
74
+ }
75
+
76
+ let results = await BaseWebspertController.sendRequestToAPI(
77
+ 'order/get_order_package',
78
+ {
79
+ order_identifier: releaseOrder.refNo
80
+ },
81
+ domain,
82
+ user
83
+ )
84
+ if (results.status != 200) {
85
+ throw new Error(results.statusText)
86
+ }
87
+
88
+ roUpdateFields = await generatePackage(releaseOrder, results?.data.data.package, user, trx)
89
+ } catch (error) {
90
+ roUpdateFields = {
91
+ packOrderFail: true
92
+ }
93
+ }
94
+ }
95
+
96
+ await updateRO(releaseGood.id, roUpdateFields, trx)
97
+ return await trx.getRepository(ReleaseGood).findOne({
98
+ where: { id: releaseGood.id, domain },
99
+ relations: ['bizplace', 'domain', 'orderProducts', 'orderProducts.productDetail']
100
+ })
101
+ })
102
+ }
103
+
104
+ public static async initiateShipment(
105
+ releaseGood: ReleaseGood,
106
+ orderPackages: OrderPackage[],
107
+ domain: Domain,
108
+ user: User,
109
+ ) {
110
+ if (orderPackages == null || orderPackages.length == 0) {
111
+ if (releaseGood) {
112
+ orderPackages = await getRepository(OrderPackage).find({ where: { releaseGood } })
113
+ }
114
+ else {
115
+ console.error('webspert-controller[initiateShipment]: releaseGood is not found')
116
+ return false
117
+ }
118
+ }
119
+
120
+ await orderPackages.forEach(async orderPackage => {
121
+ try {
122
+ let results: any = await BaseWebspertController.sendRequestToAPI(
123
+ 'order/set_order_status_to_ready_ship',
124
+ {
125
+ package_id: orderPackage.packageId
126
+ },
127
+ domain,
128
+ user
129
+ )
130
+ if (results.status != 200) {
131
+ throw new Error(results.statusText)
132
+ }
133
+
134
+ await getRepository(OrderPackage).update({ id: orderPackage.id }, { marketRtsCallSuccess: new Date() })
135
+ } catch (error) {
136
+ await getRepository(OrderPackage)
137
+ .createQueryBuilder()
138
+ .update(OrderPackage)
139
+ .set({ marketRtsCallRetry: () => `coalesce("market_rts_call_retry", 0) + 1` })
140
+ .where('id = :id', { id: orderPackage.id })
141
+ .execute()
142
+
143
+ logger.error(`webspert-controller[initiateShipment]: ${error}`)
144
+ }
145
+ })
146
+ }
147
+
148
+ public static async triggerOrderProcesses(
149
+ releaseGood: ReleaseGood,
150
+ domain: Domain,
151
+ user: User,
152
+ triggerRTS: false
153
+ ) {
154
+ try {
155
+ const waitTime = 200
156
+
157
+ releaseGood = await getRepository(ReleaseGood).findOne({ where: { id: releaseGood.id, domain } })
158
+ // // only recall if fail
159
+ if (releaseGood.packOrderFail == false || releaseGood.packOrderFail === null) {
160
+ await this.packOrder(releaseGood, domain, user)
161
+ await sleep(waitTime)
162
+ }
163
+
164
+ await this.fetchPackageAndDocument(releaseGood, domain, user)
165
+ await sleep(waitTime)
166
+
167
+ if (triggerRTS) {
168
+ await this.initiateShipment(releaseGood, null, domain, user)
169
+ }
170
+
171
+ return true
172
+
173
+ } catch (error) {
174
+ logger.error(error)
175
+ }
176
+ }
177
+ }
178
+
179
+ async function updateRO(releaseGoodId, roUpdateFields, trxMgr) {
180
+ if (roUpdateFields) {
181
+ await trxMgr.getRepository(ReleaseGood).update({ id: releaseGoodId }, roUpdateFields)
182
+ }
183
+ }
184
+
185
+ async function generatePackage(
186
+ releaseGood: ReleaseGood,
187
+ packages: any[],
188
+ user: User,
189
+ trxMgr: EntityManager
190
+ ) {
191
+ if (packages.length > 0) {
192
+ packages = await Promise.all(
193
+ packages.map(async pkg => {
194
+ const [items, awbUrl, packageId, trackingNo, transporter] = [pkg.products, pkg.awb_link, pkg.package_id, pkg.tracking_number, pkg.transporter]
195
+
196
+ if (items.length < 1) {
197
+ throw new Error('No items found in package')
198
+ }
199
+
200
+ try {
201
+ let orderPackage = await trxMgr.getRepository(OrderPackage).findOne({
202
+ where: { packageId: packageId, releaseGood, domain: releaseGood.domain, bizplace: releaseGood.bizplace }
203
+ })
204
+
205
+ if (!orderPackage) {
206
+ orderPackage = await trxMgr.getRepository(OrderPackage).save({
207
+ name: OrderNoGenerator.orderPackage(),
208
+ packageId: packageId,
209
+ airwayBill: awbUrl,
210
+ transporter,
211
+ trackingNo,
212
+ status: ORDER_STATUS.PROCESSING,
213
+ releaseGood,
214
+ domain: releaseGood.domain,
215
+ bizplace: releaseGood.bizplace,
216
+ creator: releaseGood.creator,
217
+ updater: releaseGood.updater
218
+ })
219
+ } else {
220
+ orderPackage = await trxMgr.getRepository(OrderPackage).save({
221
+ ...orderPackage,
222
+ packageId: packageId,
223
+ airwayBill: awbUrl,
224
+ transporter,
225
+ trackingNo,
226
+ updater: user
227
+ })
228
+ }
229
+
230
+ let orderPackageItems: OrderPackageItem[] = await trxMgr.getRepository(OrderPackageItem).find({
231
+ where: { orderPackage },
232
+ relations: ['productDetail']
233
+ })
234
+
235
+ orderPackageItems = items.map(itm => {
236
+ const { sku, qty } = itm
237
+ if (!sku) {
238
+ throw new Error(`universalIdentifier missing`)
239
+ }
240
+ const matchedOrderPackageItem: OrderPackageItem = orderPackageItems.find(op => op.productDetail.refCode == sku && op.releaseQty == qty)
241
+
242
+ if (matchedOrderPackageItem) {
243
+ return matchedOrderPackageItem
244
+ } else {
245
+ const matchedOrderProduct: OrderProduct = releaseGood.orderProducts.find(op => op.productDetail.refCode == sku)
246
+ return {
247
+ name: OrderNoGenerator.orderPackageItem(),
248
+ orderProduct: matchedOrderProduct,
249
+ status: ORDER_STATUS.PROCESSING,
250
+ releaseQty: qty,
251
+ orderPackage: orderPackage,
252
+ domain: releaseGood.domain,
253
+ bizplace: releaseGood.bizplace,
254
+ creator: releaseGood.creator,
255
+ updater: releaseGood.updater,
256
+ productDetail: matchedOrderProduct?.productDetail
257
+ }
258
+ }
259
+ })
260
+
261
+ await trxMgr.getRepository(OrderPackageItem).save(orderPackageItems)
262
+
263
+ return orderPackage
264
+ } catch (error) {
265
+ console.error(error)
266
+ }
267
+ })
268
+ )
269
+
270
+ if (packages.length == packages.filter(pkg => pkg.packageId).length) {
271
+ return {
272
+ packageId: packages[0].packageId,
273
+ marketPackCallSuccess: new Date(),
274
+ lastMarketPackCall: new Date(),
275
+ updatedAt: new Date()
276
+ }
277
+ } else {
278
+ return {
279
+ lastMarketPackCall: new Date(),
280
+ updatedAt: new Date()
281
+ }
282
+ }
283
+ }
284
+ }
285
+
286
+ async function updatePackOrderStatus(trx, releaseOrder, status: Boolean = false) {
287
+ await trx.getRepository(ReleaseGood).update({ id: releaseOrder.id }, { lastMarketPackCall: new Date(), packOrderFail: status })
288
+ return true
289
+ }
package/server/index.ts CHANGED
@@ -5,6 +5,8 @@ export * from './constants'
5
5
  export * from './errors'
6
6
  export * from './controllers/ecommerce/sellercraft-controller'
7
7
  export * from './controllers/ecommerce/powrup-controller'
8
+ export * from './controllers/ecommerce'
9
+
8
10
 
9
11
  export { createReleaseGoodLog } from './service/release-good-logs/release-good-logs-mutation'
10
12
  export { DraftReleaseGoodCreate } from './service/draft-release-good/draft-release-good-create'