@things-factory/operato-hub 4.3.78 → 4.3.79-alpha.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.
Files changed (168) hide show
  1. package/dist-server/middlewares/business-middleware.js +4 -1
  2. package/dist-server/middlewares/business-middleware.js.map +1 -1
  3. package/dist-server/middlewares/store-middleware.js.map +1 -1
  4. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js +3 -2
  5. package/dist-server/routers/api/restful-apis/unstable/add-draft-release-order.js.map +1 -1
  6. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js +5 -2
  7. package/dist-server/routers/api/restful-apis/unstable/add-inbound-order.js.map +1 -1
  8. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js +4 -2
  9. package/dist-server/routers/api/restful-apis/unstable/add-release-order.js.map +1 -1
  10. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js +94 -0
  11. package/dist-server/routers/api/restful-apis/v1/company/add-contact-points.js.map +1 -0
  12. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js +208 -0
  13. package/dist-server/routers/api/restful-apis/v1/company/add-marketplace-order.js.map +1 -0
  14. package/dist-server/routers/api/restful-apis/v1/company/add-product.js +65 -0
  15. package/dist-server/routers/api/restful-apis/v1/company/add-product.js.map +1 -0
  16. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js +97 -0
  17. package/dist-server/routers/api/restful-apis/v1/company/cancel-marketplace-order.js.map +1 -0
  18. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js +50 -0
  19. package/dist-server/routers/api/restful-apis/v1/company/get-bizplace-list.js.map +1 -0
  20. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js +63 -0
  21. package/dist-server/routers/api/restful-apis/v1/company/get-contact-point-list.js.map +1 -0
  22. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js +110 -0
  23. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.js.map +1 -0
  24. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js +52 -0
  25. package/dist-server/routers/api/restful-apis/v1/company/get-marketplace-store-list.js.map +1 -0
  26. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js +90 -0
  27. package/dist-server/routers/api/restful-apis/v1/company/get-partner-list.js.map +1 -0
  28. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js +99 -0
  29. package/dist-server/routers/api/restful-apis/v1/company/get-product-list.js.map +1 -0
  30. package/dist-server/routers/api/restful-apis/v1/company/index.js +14 -0
  31. package/dist-server/routers/api/restful-apis/v1/company/index.js.map +1 -0
  32. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js +65 -0
  33. package/dist-server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.js.map +1 -0
  34. package/dist-server/routers/api/restful-apis/v1/index.js +2 -31
  35. package/dist-server/routers/api/restful-apis/v1/index.js.map +1 -1
  36. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js +29 -0
  37. package/dist-server/routers/api/restful-apis/v1/middlewares/business-middleware.js.map +1 -0
  38. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js +40 -0
  39. package/dist-server/routers/api/restful-apis/v1/middlewares/index.js.map +1 -0
  40. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js +23 -0
  41. package/dist-server/routers/api/restful-apis/v1/middlewares/logging-middleware.js.map +1 -0
  42. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js +32 -0
  43. package/dist-server/routers/api/restful-apis/v1/middlewares/store-middleware.js.map +1 -0
  44. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js +53 -0
  45. package/dist-server/routers/api/restful-apis/v1/middlewares/validation-middleware.js.map +1 -0
  46. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js +31 -0
  47. package/dist-server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.js.map +1 -0
  48. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js +71 -0
  49. package/dist-server/routers/api/restful-apis/v1/utils/error-util.js.map +1 -0
  50. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js +201 -0
  51. package/dist-server/routers/api/restful-apis/v1/utils/expected-parameters.js.map +1 -0
  52. package/dist-server/routers/api/restful-apis/v1/utils/params.js +293 -0
  53. package/dist-server/routers/api/restful-apis/v1/utils/params.js.map +1 -0
  54. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js +90 -0
  55. package/dist-server/routers/api/restful-apis/v1/utils/validate-util.js.map +1 -0
  56. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js +277 -0
  57. package/dist-server/routers/api/restful-apis/v1/warehouse/add-inbound-order.js.map +1 -0
  58. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js +810 -0
  59. package/dist-server/routers/api/restful-apis/v1/warehouse/add-release-order.js.map +1 -0
  60. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js +116 -0
  61. package/dist-server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.js.map +1 -0
  62. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js +140 -0
  63. package/dist-server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.js.map +1 -0
  64. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js +100 -0
  65. package/dist-server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.js.map +1 -0
  66. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js +78 -0
  67. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.js.map +1 -0
  68. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js +96 -0
  69. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.js.map +1 -0
  70. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js +244 -0
  71. package/dist-server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.js.map +1 -0
  72. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js +96 -0
  73. package/dist-server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.js.map +1 -0
  74. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js +94 -0
  75. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-details.js.map +1 -0
  76. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js +112 -0
  77. package/dist-server/routers/api/restful-apis/v1/warehouse/get-release-order-list.js.map +1 -0
  78. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js +13 -0
  79. package/dist-server/routers/api/restful-apis/v1/warehouse/index.js.map +1 -0
  80. package/package.json +54 -54
  81. package/server/middlewares/business-middleware.ts +5 -1
  82. package/server/middlewares/store-middleware.ts +1 -0
  83. package/server/routers/api/restful-apis/unstable/add-draft-release-order.ts +3 -2
  84. package/server/routers/api/restful-apis/unstable/add-inbound-order.ts +5 -2
  85. package/server/routers/api/restful-apis/unstable/add-release-order.ts +4 -2
  86. package/server/routers/api/restful-apis/v1/company/add-contact-points.ts +94 -0
  87. package/server/routers/api/restful-apis/v1/company/add-marketplace-order.ts +242 -0
  88. package/server/routers/api/restful-apis/v1/company/add-product.ts +78 -0
  89. package/server/routers/api/restful-apis/v1/company/cancel-marketplace-order.ts +102 -0
  90. package/server/routers/api/restful-apis/v1/company/get-bizplace-list.ts +56 -0
  91. package/server/routers/api/restful-apis/v1/company/get-contact-point-list.ts +69 -0
  92. package/server/routers/api/restful-apis/v1/company/get-marketplace-order-shipping-list.ts +118 -0
  93. package/server/routers/api/restful-apis/v1/company/get-marketplace-store-list.ts +58 -0
  94. package/server/routers/api/restful-apis/v1/company/get-partner-list.ts +97 -0
  95. package/server/routers/api/restful-apis/v1/company/get-product-list.ts +105 -0
  96. package/server/routers/api/restful-apis/v1/company/index.ts +11 -0
  97. package/server/routers/api/restful-apis/v1/company/update-marketplace-order-delivered.ts +70 -0
  98. package/server/routers/api/restful-apis/v1/index.ts +2 -31
  99. package/server/routers/api/restful-apis/v1/middlewares/business-middleware.ts +31 -0
  100. package/server/routers/api/restful-apis/v1/middlewares/index.ts +26 -0
  101. package/server/routers/api/restful-apis/v1/middlewares/logging-middleware.ts +24 -0
  102. package/server/routers/api/restful-apis/v1/middlewares/store-middleware.ts +34 -0
  103. package/server/routers/api/restful-apis/v1/middlewares/validation-middleware.ts +50 -0
  104. package/server/routers/api/restful-apis/v1/middlewares/warehouse-middleware.ts +31 -0
  105. package/server/routers/api/restful-apis/v1/utils/error-util.ts +70 -0
  106. package/server/routers/api/restful-apis/v1/utils/expected-parameters.ts +199 -0
  107. package/server/routers/api/restful-apis/v1/utils/params.ts +291 -0
  108. package/server/routers/api/restful-apis/v1/utils/validate-util.ts +74 -0
  109. package/server/routers/api/restful-apis/v1/warehouse/add-inbound-order.ts +361 -0
  110. package/server/routers/api/restful-apis/v1/warehouse/add-release-order.ts +1000 -0
  111. package/server/routers/api/restful-apis/v1/warehouse/cancel-inbound-order.ts +139 -0
  112. package/server/routers/api/restful-apis/v1/warehouse/get-delivery-order-list.ts +144 -0
  113. package/server/routers/api/restful-apis/v1/warehouse/get-goods-received-note-list.ts +109 -0
  114. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-details.ts +74 -0
  115. package/server/routers/api/restful-apis/v1/warehouse/get-inbound-order-list.ts +99 -0
  116. package/server/routers/api/restful-apis/v1/warehouse/get-inventory-product-group-list.ts +295 -0
  117. package/server/routers/api/restful-apis/v1/warehouse/get-onhand-inventory-list.ts +99 -0
  118. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-details.ts +97 -0
  119. package/server/routers/api/restful-apis/v1/warehouse/get-release-order-list.ts +116 -0
  120. package/server/routers/api/restful-apis/v1/warehouse/index.ts +10 -0
  121. package/dist-server/routers/api/restful-apis/v1/bizplace.js +0 -45
  122. package/dist-server/routers/api/restful-apis/v1/bizplace.js.map +0 -1
  123. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js +0 -103
  124. package/dist-server/routers/api/restful-apis/v1/get-contact-point-list.js.map +0 -1
  125. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js +0 -47
  126. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-detail.js.map +0 -1
  127. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js +0 -124
  128. package/dist-server/routers/api/restful-apis/v1/get-delivery-order-list.js.map +0 -1
  129. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js +0 -164
  130. package/dist-server/routers/api/restful-apis/v1/get-delivery-orders.js.map +0 -1
  131. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js +0 -120
  132. package/dist-server/routers/api/restful-apis/v1/get-goods-received-notes.js.map +0 -1
  133. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js +0 -115
  134. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-detail.js.map +0 -1
  135. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js +0 -125
  136. package/dist-server/routers/api/restful-apis/v1/get-inbound-order-list.js.map +0 -1
  137. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js +0 -88
  138. package/dist-server/routers/api/restful-apis/v1/get-inventory-overall-product-group.js.map +0 -1
  139. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js +0 -79
  140. package/dist-server/routers/api/restful-apis/v1/get-marketplace-store-list.js.map +0 -1
  141. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js +0 -110
  142. package/dist-server/routers/api/restful-apis/v1/get-onhand-inventories.js.map +0 -1
  143. package/dist-server/routers/api/restful-apis/v1/get-partners.js +0 -23
  144. package/dist-server/routers/api/restful-apis/v1/get-partners.js.map +0 -1
  145. package/dist-server/routers/api/restful-apis/v1/get-products.js +0 -210
  146. package/dist-server/routers/api/restful-apis/v1/get-products.js.map +0 -1
  147. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js +0 -122
  148. package/dist-server/routers/api/restful-apis/v1/get-release-order-detail.js.map +0 -1
  149. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js +0 -191
  150. package/dist-server/routers/api/restful-apis/v1/get-release-order-list.js.map +0 -1
  151. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js +0 -20
  152. package/dist-server/routers/api/restful-apis/v1/get-warehouses.js.map +0 -1
  153. package/server/routers/api/restful-apis/v1/bizplace.ts +0 -45
  154. package/server/routers/api/restful-apis/v1/get-contact-point-list.ts +0 -110
  155. package/server/routers/api/restful-apis/v1/get-delivery-order-detail.ts +0 -46
  156. package/server/routers/api/restful-apis/v1/get-delivery-order-list.ts +0 -121
  157. package/server/routers/api/restful-apis/v1/get-delivery-orders.ts +0 -178
  158. package/server/routers/api/restful-apis/v1/get-goods-received-notes.ts +0 -134
  159. package/server/routers/api/restful-apis/v1/get-inbound-order-detail.ts +0 -128
  160. package/server/routers/api/restful-apis/v1/get-inbound-order-list.ts +0 -126
  161. package/server/routers/api/restful-apis/v1/get-inventory-overall-product-group.ts +0 -99
  162. package/server/routers/api/restful-apis/v1/get-marketplace-store-list.ts +0 -81
  163. package/server/routers/api/restful-apis/v1/get-onhand-inventories.ts +0 -125
  164. package/server/routers/api/restful-apis/v1/get-partners.ts +0 -24
  165. package/server/routers/api/restful-apis/v1/get-products.ts +0 -216
  166. package/server/routers/api/restful-apis/v1/get-release-order-detail.ts +0 -134
  167. package/server/routers/api/restful-apis/v1/get-release-order-list.ts +0 -198
  168. package/server/routers/api/restful-apis/v1/get-warehouses.ts +0 -18
@@ -0,0 +1,810 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const typeorm_1 = require("typeorm");
4
+ const uuid_1 = require("uuid");
5
+ const api_1 = require("@things-factory/api");
6
+ const biz_base_1 = require("@things-factory/biz-base");
7
+ const id_rule_base_1 = require("@things-factory/id-rule-base");
8
+ const integration_sellercraft_1 = require("@things-factory/integration-sellercraft");
9
+ const marketplace_base_1 = require("@things-factory/marketplace-base");
10
+ const product_base_1 = require("@things-factory/product-base");
11
+ const sales_base_1 = require("@things-factory/sales-base");
12
+ const setting_base_1 = require("@things-factory/setting-base");
13
+ const warehouse_base_1 = require("@things-factory/warehouse-base");
14
+ // import { ValidationError } from '../../../../errors/index'
15
+ const middlewares_1 = require("../middlewares");
16
+ const error_util_1 = require("../utils/error-util");
17
+ const debug = require('debug')('things-factory:operato-hub:restful-api:unstable:add-release-order');
18
+ const apiVersion = 'v1';
19
+ api_1.restfulApiRouter.post(`/${apiVersion}/warehouse/add-release-order`, middlewares_1.businessMiddleware, middlewares_1.validationMiddleware, middlewares_1.loggingMiddleware, async (context, next) => {
20
+ return await (0, typeorm_1.getConnection)().transaction(async (tx) => {
21
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
22
+ const { client, domain, user, application } = context.state;
23
+ const { bizplaceId: customerBizplaceId } = context.request.body;
24
+ const { t } = context;
25
+ const bodyReq = context.request.body.data;
26
+ const requiredDraft = bodyReq.hasOwnProperty('requiredDraft') ? bodyReq.requiredDraft : true;
27
+ let releaseGood;
28
+ let massagedData = { orderProducts: [], combinedItems: [] };
29
+ // const isAutoAssign: Boolean = bodyReq.hasOwnProperty('isAutoAssign') ? bodyReq.isAutoAssign : true
30
+ try {
31
+ if (!customerBizplaceId)
32
+ throw new error_util_1.ApiError('E04', 'warehouse id not found');
33
+ if (typeof bodyReq === undefined || !((_a = Object.keys(bodyReq)) === null || _a === void 0 ? void 0 : _a.length)) {
34
+ throw new error_util_1.ApiError('E01', 'invalid body request format');
35
+ }
36
+ debug('post:/add-release-order request.body', bodyReq);
37
+ // get customer company's bizplace
38
+ const custCompanyBizplace = await (0, biz_base_1.getCompanyBizplace)(null, null, customerBizplaceId, tx);
39
+ const customerBizplace = await tx.getRepository(biz_base_1.Bizplace).findOne({
40
+ where: { id: customerBizplaceId },
41
+ relations: ['domain']
42
+ });
43
+ // conditional validation
44
+ if (bodyReq.ownTransport && !bodyReq.collectionOrderNo)
45
+ throw new error_util_1.ApiError('E03', 'collectionOrderNo');
46
+ if (bodyReq.exportOption && !bodyReq.shippingOrder)
47
+ throw new error_util_1.ApiError('E03', 'shippingOrder');
48
+ bodyReq.exportOption;
49
+ releaseGood = {
50
+ domain,
51
+ bizplace: customerBizplace,
52
+ companyBizplace: custCompanyBizplace,
53
+ courierOption: bodyReq.courierOption,
54
+ collectionOrderNo: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.collectionOrderNo,
55
+ exportOption: bodyReq.exportOption,
56
+ ownTransport: bodyReq.ownTransport,
57
+ packingOption: bodyReq.packingOption,
58
+ refNo: bodyReq.refNo,
59
+ refNo2: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.refNo2,
60
+ refNo3: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.refNo3,
61
+ releaseDate: bodyReq.releaseDate,
62
+ type: bodyReq.type,
63
+ marketplaceOrderStatus: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.marketplaceOrderStatus,
64
+ remark: (bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.remark) || null,
65
+ billingAddress: ((_b = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.billTo) === null || _b === void 0 ? void 0 : _b.billingAddress) || null,
66
+ deliveryAddress1: ((_c = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _c === void 0 ? void 0 : _c.deliveryAddress1) || null,
67
+ deliveryAddress2: ((_d = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _d === void 0 ? void 0 : _d.deliveryAddress2) || null,
68
+ deliveryAddress3: ((_e = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _e === void 0 ? void 0 : _e.deliveryAddress3) || null,
69
+ deliveryAddress4: ((_f = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _f === void 0 ? void 0 : _f.deliveryAddress4) || null,
70
+ deliveryAddress5: ((_g = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _g === void 0 ? void 0 : _g.deliveryAddress5) || null,
71
+ attentionTo: ((_h = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _h === void 0 ? void 0 : _h.attentionTo) || null,
72
+ attentionCompany: ((_j = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _j === void 0 ? void 0 : _j.attentionCompany) || null,
73
+ city: ((_k = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _k === void 0 ? void 0 : _k.city) || null,
74
+ state: ((_l = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _l === void 0 ? void 0 : _l.state) || null,
75
+ postalCode: ((_m = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _m === void 0 ? void 0 : _m.postalCode) || null,
76
+ country: ((_o = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _o === void 0 ? void 0 : _o.country) || null,
77
+ phone1: ((_p = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _p === void 0 ? void 0 : _p.phone1) || null,
78
+ phone2: ((_q = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _q === void 0 ? void 0 : _q.phone2) || null,
79
+ email: ((_r = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.deliverTo) === null || _r === void 0 ? void 0 : _r.email) || null,
80
+ transporter: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.transporter,
81
+ trackingNo: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.trackingNo,
82
+ airwayBill: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.airwayBill,
83
+ invoice: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.invoice,
84
+ packageId: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.packageId,
85
+ storeName: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.storeName,
86
+ storeId: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.storeId,
87
+ routeId: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.routeId,
88
+ stopId: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.stopId,
89
+ source: application === null || application === void 0 ? void 0 : application.type,
90
+ shippingOrder: {
91
+ shipName: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.ShippingOrder.shipName,
92
+ containerNo: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder.containerNo,
93
+ loadType: (_s = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder) === null || _s === void 0 ? void 0 : _s.loadType,
94
+ from: (_t = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder) === null || _t === void 0 ? void 0 : _t.from,
95
+ to: (_u = bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder) === null || _u === void 0 ? void 0 : _u.to,
96
+ containerArrivalDate: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder.containerArrivalDate,
97
+ containerLeavingDate: bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.shippingOrder.containerLeavingDate
98
+ }
99
+ };
100
+ // check existing order
101
+ await checkExistingOrder(releaseGood, customerBizplace, bodyReq === null || bodyReq === void 0 ? void 0 : bodyReq.checkDuplicationValidation, context, tx);
102
+ // massage data
103
+ massagedData = await massageOrderItems(releaseGood, bodyReq.orderInventories, context);
104
+ // validation
105
+ let errorList = [];
106
+ await Promise.all(massagedData.combinedItems.map(async (item) => {
107
+ let itemList = await tx.query(`
108
+ select wboi.* from warehouse_bizplace_onhand_inventories wboi
109
+ where wboi."domainId"= $1 and
110
+ wboi."bizplaceId" = $2 and
111
+ wboi."groupType" = 'SINGLE' and
112
+ wboi."productId" = $3 and
113
+ wboi."packingType" = $4 and
114
+ wboi."packingSize" = $5 and
115
+ wboi."uom" = $6 and
116
+ wboi."remainQty" >= $7 and
117
+ wboi."remainUomValue" >= $8
118
+ `, [
119
+ domain.id,
120
+ customerBizplace.id,
121
+ item.product.id,
122
+ item.packingType,
123
+ item.packingSize,
124
+ item.uom,
125
+ item.releaseQty,
126
+ item.releaseUomValue
127
+ ]);
128
+ if (itemList.length <= 0) {
129
+ errorList.push(JSON.stringify({
130
+ code: 'insufficient stock',
131
+ sku: item.product.sku,
132
+ packingType: item.packingType,
133
+ packingSize: item.packingSize,
134
+ uom: item.uom,
135
+ qty: item.releaseQty,
136
+ uom_value: item.releaseUomValue
137
+ }));
138
+ }
139
+ console.log();
140
+ }));
141
+ if (errorList.length > 0) {
142
+ throw new error_util_1.ApiError('E01', `insufficient stock, ${errorList.join(', ')}`);
143
+ }
144
+ // assignment
145
+ // console.time('assign')
146
+ let assignedOrderProducts = await assignToInventory(massagedData.orderProducts, customerBizplace, context, tx);
147
+ // console.timeEnd('assign')
148
+ // create order
149
+ // console.time('save')
150
+ let result = await createReleaseGood(releaseGood, assignedOrderProducts, customerBizplace, context, tx);
151
+ // console.timeEnd('save')
152
+ let addReleaseGood = {
153
+ id: result.id,
154
+ roNo: result.name,
155
+ refNo: result.refNo,
156
+ refNo2: result.refNo2,
157
+ refNo3: result.refNo3,
158
+ status: result.status,
159
+ truckNo: result.truckNo,
160
+ ownTransport: result.ownTransport,
161
+ crossDocking: result.crossDocking,
162
+ marketplaceOrderStatus: result.marketplaceOrderStatus,
163
+ billingAddress: result.billingAddress,
164
+ deliveryAddress1: result.deliveryAddress1,
165
+ deliveryAddress2: result.deliveryAddress2,
166
+ deliveryAddress3: result.deliveryAddress3,
167
+ deliveryAddress4: result.deliveryAddress4,
168
+ deliveryAddress5: result.deliveryAddress5,
169
+ attentionTo: result.attentionTo,
170
+ attentionCompany: result.attentionCompany,
171
+ city: result.city,
172
+ state: result.state,
173
+ postalCode: result.postalCode,
174
+ country: result.country,
175
+ phone1: result.phone1,
176
+ phone2: result.phone2,
177
+ email: result.email,
178
+ transporter: result.transporter,
179
+ trackingNo: result.trackingNo,
180
+ airwayBill: result.airwayBill,
181
+ invoice: result.invoice,
182
+ type: result.type,
183
+ packageId: result.packageId,
184
+ storeName: result.storeName,
185
+ storeId: result.storeId,
186
+ routeId: result.routeId,
187
+ stopId: result.stopId,
188
+ exportOption: result.exportOption,
189
+ releaseDate: result.releaseDate,
190
+ collectionOrderNo: result.collectionOrderNo,
191
+ bizplace: { name: result.bizplace.name },
192
+ domain: { name: result.domain.name },
193
+ orderInventories: result.orderInventories
194
+ };
195
+ // return body
196
+ context.body = { result: { addReleaseGood } };
197
+ }
198
+ catch (error) {
199
+ if (error.errorCode) {
200
+ if (error.errorCode == 'INSUFFICIENT_STOCK' && requiredDraft) {
201
+ const result = await createDraftOrder(releaseGood, massagedData.orderProducts, context);
202
+ let createdDraftOrder = {
203
+ id: result.id,
204
+ name: result.name,
205
+ refNo: result.refNo,
206
+ refNo2: result.refNo2,
207
+ refNo3: result.refNo3,
208
+ status: result.status,
209
+ truckNo: result.truckNo,
210
+ ownTransport: result.ownTransport,
211
+ marketplaceOrderStatus: result.marketplaceOrderStatus,
212
+ billingAddress: result.billingAddress,
213
+ deliveryAddress1: result.deliveryAddress1,
214
+ deliveryAddress2: result.deliveryAddress2,
215
+ deliveryAddress3: result.deliveryAddress3,
216
+ deliveryAddress4: result.deliveryAddress4,
217
+ deliveryAddress5: result.deliveryAddress5,
218
+ attentionTo: result.attentionTo,
219
+ attentionCompany: result.attentionCompany,
220
+ city: result.city,
221
+ state: result.state,
222
+ postalCode: result.postalCode,
223
+ country: result.country,
224
+ phone1: result.phone1,
225
+ phone2: result.phone2,
226
+ email: result.email,
227
+ type: result.type,
228
+ packageId: result.packageId,
229
+ exportOption: result.exportOption,
230
+ releaseDate: result.releaseDate,
231
+ collectionOrderNo: result.collectionOrderNo,
232
+ bizplace: { name: result.bizplace.name },
233
+ domain: { name: result.domain.name }
234
+ };
235
+ context.body = { result: { createdDraftOrder } };
236
+ }
237
+ else {
238
+ if (error instanceof error_util_1.ApiError)
239
+ (0, error_util_1.ApiErrorHandler)(context, error);
240
+ else
241
+ (0, error_util_1.throwInternalServerError)(context, error);
242
+ }
243
+ }
244
+ else {
245
+ if (error instanceof error_util_1.ApiError)
246
+ (0, error_util_1.ApiErrorHandler)(context, error);
247
+ else
248
+ (0, error_util_1.throwInternalServerError)(context, error);
249
+ }
250
+ }
251
+ });
252
+ });
253
+ async function checkExistingOrder(releaseGood, bizplace, checkDuplicationValidation = true, context, tx) {
254
+ const { domain, user } = context.state;
255
+ const refNo = releaseGood.refNo;
256
+ const refNo2 = releaseGood.refNo2;
257
+ const refNo3 = releaseGood.refNo3;
258
+ if (checkDuplicationValidation) {
259
+ const foundDraftReleaseGood = await tx.getRepository(sales_base_1.DraftReleaseGood).findOne({
260
+ where: {
261
+ domain,
262
+ refNo: refNo || null,
263
+ refNo2: refNo2 || null,
264
+ refNo3: refNo3 || null,
265
+ status: (0, typeorm_1.Not)((0, typeorm_1.In)([sales_base_1.DRAFT_RELEASE_ORDER_STATUS.CANCELLED]))
266
+ }
267
+ });
268
+ if (foundDraftReleaseGood) {
269
+ throw new error_util_1.ApiError('E05', `existing draft release order found: ${foundDraftReleaseGood.name}`);
270
+ }
271
+ const sellercraft = await tx.getRepository(integration_sellercraft_1.Sellercraft).findOne({ domain: bizplace.domain });
272
+ if (sellercraft) {
273
+ const sellercraftCtrl = new sales_base_1.SellercraftController(tx, bizplace.domain, user);
274
+ await sellercraftCtrl.checkExistingReleaseGood(sellercraft, releaseGood);
275
+ }
276
+ else {
277
+ const foundReleaseGood = await tx.getRepository(sales_base_1.ReleaseGood).findOne({
278
+ where: {
279
+ domain: domain,
280
+ refNo,
281
+ status: (0, typeorm_1.Not)((0, typeorm_1.In)([sales_base_1.ORDER_STATUS.CANCELLED, sales_base_1.ORDER_STATUS.PENDING_CANCEL]))
282
+ },
283
+ relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
284
+ });
285
+ if (foundReleaseGood) {
286
+ const customerCompanyDomain = foundReleaseGood.bizplace.company.domain;
287
+ const marketplaceOrder = await tx.getRepository(marketplace_base_1.MarketplaceOrder).findOne({
288
+ where: { orderNo: refNo, domain: customerCompanyDomain }
289
+ });
290
+ // Need to restructure the validation
291
+ if (marketplaceOrder === null || marketplaceOrder === void 0 ? void 0 : marketplaceOrder.isSplitted) {
292
+ const refNo2 = releaseGood.refNo2;
293
+ const foundSplittedReleaseGood = await tx.getRepository(sales_base_1.ReleaseGood).findOne({
294
+ where: {
295
+ domain,
296
+ refNo2,
297
+ status: (0, typeorm_1.Not)((0, typeorm_1.In)([sales_base_1.ORDER_STATUS.CANCELLED, sales_base_1.ORDER_STATUS.PENDING_CANCEL]))
298
+ },
299
+ relations: ['bizplace', 'bizplace.domain', 'bizplace.company', 'bizplace.company.domain']
300
+ });
301
+ if (foundSplittedReleaseGood)
302
+ throw new error_util_1.ApiError('E05', `existing release order found: ${foundSplittedReleaseGood.name}`);
303
+ }
304
+ else {
305
+ throw new error_util_1.ApiError('E05', `existing release order found: ${foundReleaseGood.name}`);
306
+ }
307
+ }
308
+ }
309
+ }
310
+ }
311
+ async function createDraftOrder(releaseGood, orderProducts, context) {
312
+ return await (0, typeorm_1.getConnection)().transaction(async (tx) => {
313
+ return await (0, sales_base_1.createDraftReleaseGoodFunction)(null, releaseGood, orderProducts, null, [], context, tx);
314
+ });
315
+ }
316
+ async function createReleaseGood(releaseGood, orderProducts, bizplace, context, tx) {
317
+ try {
318
+ const { domain, user } = context.state;
319
+ const settingRepo = (tx === null || tx === void 0 ? void 0 : tx.getRepository(setting_base_1.Setting)) || (0, typeorm_1.getRepository)(setting_base_1.Setting);
320
+ if (orderProducts.length <= 0) {
321
+ throw new error_util_1.ApiError('E04', `no order items found: ${JSON.stringify(releaseGood)}`);
322
+ }
323
+ let newReleaseGood = new sales_base_1.ReleaseGood();
324
+ // find RO number rule setting
325
+ const roNoSetting = await settingRepo.findOne({
326
+ where: {
327
+ domain,
328
+ name: sales_base_1.ORDER_NUMBER_SETTING_KEY.RO_NUMBER_RULE
329
+ }
330
+ });
331
+ let shippingOrder;
332
+ if (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.shippingOrder) {
333
+ shippingOrder = await tx.getRepository(sales_base_1.ShippingOrder).save({
334
+ shipName: releaseGood.shippingOrder.shipName,
335
+ containerNo: releaseGood.shippingOrder.containerNo,
336
+ loadType: releaseGood.shippingOrder.loadType,
337
+ from: releaseGood.shippingOrder.from,
338
+ to: releaseGood.shippingOrder.to,
339
+ containerArrivalDate: releaseGood.shippingOrder.containerArrivalDate,
340
+ containerLeavingDate: releaseGood.shippingOrder.containerLeavingDate
341
+ });
342
+ }
343
+ newReleaseGood = {
344
+ name: roNoSetting
345
+ ? await (0, id_rule_base_1.generateId)({ domain, type: sales_base_1.ORDER_NUMBER_RULE_TYPE.RO_NUMBER, seed: {} })
346
+ : sales_base_1.OrderNoGenerator.releaseGood(),
347
+ domain: domain,
348
+ bizplace: bizplace,
349
+ collectionOrderNo: releaseGood.collectionOrderNo,
350
+ courierOption: releaseGood.courierOption,
351
+ exportOption: releaseGood.exportOption,
352
+ ownTransport: releaseGood.ownTransport,
353
+ packingOption: releaseGood.packingOption,
354
+ marketplaceOrderStatus: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.marketplaceOrderStatus) || null,
355
+ billingAddress: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.billingAddress) || null,
356
+ deliveryAddress1: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.deliveryAddress1) || null,
357
+ deliveryAddress2: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.deliveryAddress2) || null,
358
+ deliveryAddress3: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.deliveryAddress3) || null,
359
+ deliveryAddress4: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.deliveryAddress4) || null,
360
+ deliveryAddress5: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.deliveryAddress5) || null,
361
+ attentionTo: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.attentionTo) || null,
362
+ attentionCompany: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.attentionCompany) || null,
363
+ city: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.city) || null,
364
+ state: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.state) || null,
365
+ postalCode: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.postalCode) || null,
366
+ country: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.country) || null,
367
+ phone1: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.phone1) || null,
368
+ phone2: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.phone2) || null,
369
+ email: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.email) || null,
370
+ transporter: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.transporter,
371
+ trackingNo: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.trackingNo,
372
+ airwayBill: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.airwayBill,
373
+ invoice: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.invoice,
374
+ refNo: releaseGood.refNo,
375
+ refNo2: releaseGood.refNo2 || null,
376
+ refNo3: releaseGood.refNo3 || null,
377
+ remark: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.remark) || null,
378
+ releaseDate: releaseGood.releaseDate,
379
+ truckNo: releaseGood.truckNo,
380
+ type: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.type) ? releaseGood.type : 'b2b',
381
+ status: sales_base_1.ORDER_STATUS.PENDING_WORKSHEET,
382
+ storeName: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.storeName,
383
+ storeId: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.storeId,
384
+ routeId: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.routeId,
385
+ stopId: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.stopId,
386
+ packageId: (releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.packageId) || null,
387
+ noOfItems: orderProducts.length,
388
+ source: releaseGood === null || releaseGood === void 0 ? void 0 : releaseGood.source,
389
+ creator: user,
390
+ updater: user,
391
+ acceptedBy: user,
392
+ acceptedAt: new Date(),
393
+ shippingOrder: shippingOrder ? shippingOrder : null
394
+ };
395
+ let resultReleaseGood = await tx.getRepository(sales_base_1.ReleaseGood).save(newReleaseGood);
396
+ let combinedOrderInventories = [];
397
+ let savedOrderProducts = await Promise.all(orderProducts.map(async (orderProduct) => {
398
+ let orderInventories = orderProduct.orderInventories;
399
+ orderProduct = Object.assign(new sales_base_1.OrderProduct(), Object.assign(Object.assign({}, orderProduct), { name: (0, uuid_1.v4)(), domain: domain, bizplace: bizplace, releaseGood: resultReleaseGood, type: sales_base_1.ORDER_TYPES.RELEASE_OF_GOODS, status: sales_base_1.ORDER_PRODUCT_STATUS.ASSIGNED }));
400
+ let result = await tx.getRepository(sales_base_1.OrderProduct).save(orderProduct);
401
+ for (let oiIdx = 0; oiIdx < orderInventories.length; oiIdx++) {
402
+ let orderInventory = Object.assign(new sales_base_1.OrderInventory(), Object.assign(Object.assign({}, orderInventories[oiIdx]), { name: (0, uuid_1.v4)(), domain: domain, bizplace: bizplace, releaseGood: resultReleaseGood, type: sales_base_1.ORDER_TYPES.RELEASE_OF_GOODS, status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_WORKSHEET }));
403
+ await tx.getRepository(sales_base_1.OrderInventory).save(orderInventory);
404
+ combinedOrderInventories.push({
405
+ product: { name: orderInventory.product.name, sku: orderInventory.product.sku },
406
+ batchId: orderInventory.batchId,
407
+ packingType: orderInventory.packingType,
408
+ packingSize: orderInventory.packingSize,
409
+ releaseQty: orderInventory.releaseQty,
410
+ releaseUomValue: orderInventory.releaseUomValue
411
+ });
412
+ }
413
+ return result;
414
+ }));
415
+ newReleaseGood.orderProducts = savedOrderProducts;
416
+ newReleaseGood.orderInventories = combinedOrderInventories;
417
+ return newReleaseGood;
418
+ }
419
+ catch (error) {
420
+ if (error instanceof error_util_1.ApiError)
421
+ (0, error_util_1.ApiErrorHandler)(context, error);
422
+ else
423
+ (0, error_util_1.throwInternalServerError)(context, error);
424
+ }
425
+ }
426
+ async function massageOrderItems(releaseGood, inputOrderProducts, context) {
427
+ const { t } = context;
428
+ try {
429
+ let orderProducts = [];
430
+ let errorList = [];
431
+ //combine any repeated skus
432
+ inputOrderProducts = inputOrderProducts.reduce((acc, itm, idx) => {
433
+ let { sku, refCode } = itm.product;
434
+ let { packingType, packingSize, batchId, releaseQty } = itm;
435
+ if (!sku && !refCode) {
436
+ errorList.push(JSON.stringify({
437
+ code: 'INVALID_DATA',
438
+ message: 'sku or refCode not found',
439
+ sku: sku,
440
+ refCode: refCode,
441
+ packingType: packingType === null || packingType === void 0 ? void 0 : packingType.trim(),
442
+ packingSize: packingSize,
443
+ qty: releaseQty
444
+ }));
445
+ }
446
+ if (releaseQty <= 0) {
447
+ errorList.push(JSON.stringify({
448
+ code: 'INVALID_DATA',
449
+ message: 'negative stock request',
450
+ sku: sku,
451
+ refCode: refCode,
452
+ packingType: packingType === null || packingType === void 0 ? void 0 : packingType.trim(),
453
+ packingSize: packingSize,
454
+ qty: releaseQty
455
+ }));
456
+ }
457
+ let existingIndex = acc.findIndex(itm => (itm === null || itm === void 0 ? void 0 : itm.sku) == (sku === null || sku === void 0 ? void 0 : sku.trim()) &&
458
+ (itm === null || itm === void 0 ? void 0 : itm.refCode) == (refCode === null || refCode === void 0 ? void 0 : refCode.trim()) &&
459
+ (itm === null || itm === void 0 ? void 0 : itm.packingType) == (packingType === null || packingType === void 0 ? void 0 : packingType.trim()) &&
460
+ (itm === null || itm === void 0 ? void 0 : itm.packingSize) == packingSize);
461
+ if (existingIndex >= 0 && releaseQty > 0) {
462
+ acc[existingIndex].releaseQty = acc[existingIndex].releaseQty + releaseQty;
463
+ }
464
+ else {
465
+ acc.push({
466
+ sku: sku === null || sku === void 0 ? void 0 : sku.trim(),
467
+ refCode: refCode === null || refCode === void 0 ? void 0 : refCode.trim(),
468
+ packingType: packingType === null || packingType === void 0 ? void 0 : packingType.trim(),
469
+ packingSize: packingSize,
470
+ releaseQty: releaseQty
471
+ });
472
+ }
473
+ return acc;
474
+ }, []);
475
+ if (errorList.length > 0) {
476
+ throw new error_util_1.ApiError('E01', errorList.join(', '));
477
+ }
478
+ //find customer sku in system
479
+ await Promise.all(inputOrderProducts.map(async (inputOrderItem) => {
480
+ const sku = inputOrderItem.sku;
481
+ const refCode = inputOrderItem.refCode;
482
+ const packingType = inputOrderItem.packingType;
483
+ const packingSize = inputOrderItem.packingSize;
484
+ const qb = (0, typeorm_1.getRepository)(product_base_1.ProductDetail)
485
+ .createQueryBuilder('PD')
486
+ .innerJoinAndSelect('PD.product', 'PROD')
487
+ .where('PROD.bizplace_id = :bizplaceId', { bizplaceId: releaseGood.companyBizplace.id });
488
+ if (!sku && !refCode) {
489
+ throw new error_util_1.ApiError('E04', t('sku or refCode not found'));
490
+ }
491
+ if (refCode) {
492
+ qb.andWhere('PD.ref_code = :refCode', { refCode });
493
+ }
494
+ if (sku) {
495
+ qb.andWhere('PROD.sku = :sku', { sku });
496
+ }
497
+ if (packingType) {
498
+ qb.andWhere('PD.packing_type = :packingType', { packingType });
499
+ }
500
+ if ((!packingType && !refCode) || !packingSize) {
501
+ qb.andWhere('PD.is_default = :isDefault', { isDefault: true });
502
+ }
503
+ const productDetail = await qb.getOne();
504
+ // order Product based on product detail
505
+ if (productDetail) {
506
+ let newOrderProduct = Object.assign({}, inputOrderItem);
507
+ newOrderProduct = Object.assign(Object.assign({}, newOrderProduct), { product: productDetail.product, productDetail: productDetail, packingType: productDetail.packingType, packingSize: packingSize || productDetail.packingSize, uom: productDetail.uom, uomValue: productDetail.uomValue, refCode: inputOrderItem.refCode, releaseQty: inputOrderItem.releaseQty, releaseUomValue: inputOrderItem.releaseQty * (productDetail.uomValue || 1), packQty: 0, actualPackQty: 0, palletQty: 0, actualPalletQty: 0, type: 'RELEASE_OF_GOODS', status: sales_base_1.ORDER_PRODUCT_STATUS.ASSIGNED, batchId: '-' });
508
+ newOrderProduct.orderInventories = [
509
+ Object.assign(Object.assign({}, newOrderProduct), { packQty: 0, actualPackQty: 0, palletQty: 0, actualPalletQty: 0, type: 'RELEASE_OF_GOODS', status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_WORKSHEET })
510
+ ];
511
+ orderProducts.push(newOrderProduct);
512
+ }
513
+ if (!productDetail) {
514
+ const qb = (0, typeorm_1.getRepository)(product_base_1.ProductBundle)
515
+ .createQueryBuilder('PB')
516
+ .innerJoinAndSelect('PB.productBundleSettings', 'PBS')
517
+ .innerJoinAndSelect('PBS.productDetail', 'PBD')
518
+ .innerJoinAndSelect('PBD.product', 'PROD')
519
+ .where('PB.bizplace_id = :bizplaceId', { bizplaceId: releaseGood.companyBizplace.id });
520
+ if (!sku && !refCode) {
521
+ throw new error_util_1.ApiError('E04', 'sku or refCode not found');
522
+ }
523
+ if (refCode) {
524
+ qb.andWhere('PB.ref_code = :refCode', { refCode });
525
+ }
526
+ if (sku) {
527
+ qb.andWhere('PB.sku = :sku', { sku });
528
+ }
529
+ if (packingType) {
530
+ qb.andWhere('PB.packing_type = :packingType', { packingType });
531
+ }
532
+ const foundProductBundle = await qb.getOne();
533
+ if (foundProductBundle) {
534
+ let orderProduct = {
535
+ productBundle: foundProductBundle,
536
+ refCode,
537
+ packingType: foundProductBundle.packingType,
538
+ packingSize: packingSize || 1,
539
+ uom: inputOrderItem === null || inputOrderItem === void 0 ? void 0 : inputOrderItem.uom,
540
+ releaseQty: inputOrderItem.releaseQty,
541
+ releaseUomValue: inputOrderItem.releaseQty,
542
+ packQty: 0,
543
+ actualPackQty: 0,
544
+ palletQty: 0,
545
+ actualPalletQty: 0,
546
+ orderInventories: [],
547
+ type: 'RELEASE_OF_GOODS',
548
+ status: sales_base_1.ORDER_PRODUCT_STATUS.ASSIGNED,
549
+ batchId: '-'
550
+ };
551
+ const bundleProductSettings = foundProductBundle.productBundleSettings;
552
+ bundleProductSettings.map(bundleProductSetting => {
553
+ const productDetailBundle = bundleProductSetting.productDetail;
554
+ let newOrderInventory = {
555
+ product: productDetailBundle.product,
556
+ productDetail: productDetailBundle,
557
+ sku: productDetailBundle.product.sku,
558
+ packingType: productDetailBundle.packingType,
559
+ packingSize: productDetailBundle.packingSize,
560
+ uom: productDetailBundle.uom,
561
+ packQty: 0,
562
+ actualPackQty: 0,
563
+ palletQty: 0,
564
+ actualPalletQty: 0,
565
+ releaseQty: inputOrderItem.releaseQty * bundleProductSetting.bundleQty,
566
+ releaseUomValue: inputOrderItem.releaseQty *
567
+ bundleProductSetting.bundleQty *
568
+ (productDetailBundle.uomValue <= 0 ? 1 : productDetailBundle.uomValue),
569
+ type: 'RELEASE_OF_GOODS',
570
+ status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_WORKSHEET
571
+ };
572
+ orderProduct.orderInventories.push(newOrderInventory);
573
+ });
574
+ orderProducts.push(orderProduct);
575
+ }
576
+ else {
577
+ if (sku && refCode) {
578
+ throw new error_util_1.ApiError('E04', t(`error.sku ${sku} and refCode ${refCode} not exist in product / bundle master`));
579
+ }
580
+ if (sku) {
581
+ throw new error_util_1.ApiError('E04', t(`error.sku ${sku} not exist in product / bundle master`));
582
+ }
583
+ if (refCode) {
584
+ throw new error_util_1.ApiError('E04', t(`error.refCode ${refCode} not exist in product / bundle master`));
585
+ }
586
+ }
587
+ }
588
+ }));
589
+ //combine any repeated skus
590
+ let combinedItems = orderProducts.reduce((acc, op, idx) => {
591
+ let oi = (op === null || op === void 0 ? void 0 : op.orderInventories) || [];
592
+ oi.forEach(itm => {
593
+ let { sku, refCode } = itm.product;
594
+ let { packingType, packingSize, batchId, releaseQty, product, productDetail, uom } = itm;
595
+ if (!sku && !refCode) {
596
+ throw new error_util_1.ApiError('E04', t('error.sku or refCode not found'));
597
+ }
598
+ let existingIndex = acc.findIndex(itm => (itm === null || itm === void 0 ? void 0 : itm.sku) == (sku === null || sku === void 0 ? void 0 : sku.trim()) &&
599
+ (itm === null || itm === void 0 ? void 0 : itm.refCode) == (refCode === null || refCode === void 0 ? void 0 : refCode.trim()) &&
600
+ (itm === null || itm === void 0 ? void 0 : itm.packingType) == (packingType === null || packingType === void 0 ? void 0 : packingType.trim()) &&
601
+ (itm === null || itm === void 0 ? void 0 : itm.packingSize) == packingSize &&
602
+ (itm === null || itm === void 0 ? void 0 : itm.batchId) == (batchId === null || batchId === void 0 ? void 0 : batchId.trim()) &&
603
+ (itm === null || itm === void 0 ? void 0 : itm.uom) == (uom === null || uom === void 0 ? void 0 : uom.trim()));
604
+ if (existingIndex >= 0 && releaseQty > 0) {
605
+ acc[existingIndex].releaseQty = acc[existingIndex].releaseQty + releaseQty;
606
+ acc[existingIndex].releaseUomValue =
607
+ acc[existingIndex].releaseUomValue + releaseQty * (productDetail.uomValue <= 0 ? 1 : productDetail.uomValue);
608
+ }
609
+ else {
610
+ let updateObj = {
611
+ sku: sku === null || sku === void 0 ? void 0 : sku.trim(),
612
+ packingType: packingType === null || packingType === void 0 ? void 0 : packingType.trim(),
613
+ packingSize: packingSize,
614
+ uom: uom === null || uom === void 0 ? void 0 : uom.trim(),
615
+ releaseQty: releaseQty,
616
+ releaseUomValue: releaseQty * (productDetail.uomValue <= 0 ? 1 : productDetail.uomValue),
617
+ product,
618
+ productDetail
619
+ };
620
+ if (refCode)
621
+ updateObj['refCode'] = refCode.trim();
622
+ updateObj['batchId'] = batchId ? batchId === null || batchId === void 0 ? void 0 : batchId.trim() : '-';
623
+ acc.push(updateObj);
624
+ }
625
+ });
626
+ return acc;
627
+ }, []);
628
+ return { orderProducts, combinedItems };
629
+ }
630
+ catch (error) {
631
+ if (error instanceof error_util_1.ApiError)
632
+ (0, error_util_1.ApiErrorHandler)(context, error);
633
+ else
634
+ (0, error_util_1.throwInternalServerError)(context, error);
635
+ }
636
+ }
637
+ async function assignToInventory(orderProducts, customerBizplace, context, tx) {
638
+ const { client, domain, user } = context.state;
639
+ for (let opIdx = 0; opIdx < orderProducts.length; opIdx++) {
640
+ let orderProduct = orderProducts[opIdx];
641
+ let assignedOrderInventories = [];
642
+ const pickingProductSetting = await tx.getRepository(setting_base_1.Setting).findOne({
643
+ where: { domain, name: 'rule-for-picking-product' }
644
+ });
645
+ for (let oiIdx = 0; oiIdx < orderProducts[opIdx].orderInventories.length; oiIdx++) {
646
+ const orderInventory = orderProduct.orderInventories[oiIdx];
647
+ let sortings = [];
648
+ switch (orderInventory.product.pickingStrategy) {
649
+ case 'LIFO':
650
+ sortings.push({ name: 'iv.created_at', desc: true });
651
+ if (pickingProductSetting === null || pickingProductSetting === void 0 ? void 0 : pickingProductSetting.value) {
652
+ for (const [key, value] of Object.entries(JSON.parse(pickingProductSetting.value))) {
653
+ sortings.push({ name: `loc.${key}`, desc: value == 'DESC' ? true : false });
654
+ }
655
+ }
656
+ else {
657
+ sortings.push({ name: 'loc.name', desc: false }, { name: 'iv.created_at', desc: false });
658
+ }
659
+ break;
660
+ case 'FEFO':
661
+ sortings.push({ name: 'iv.expiration_date', desc: false }, { name: 'iv.created_at', desc: false });
662
+ if (pickingProductSetting === null || pickingProductSetting === void 0 ? void 0 : pickingProductSetting.value) {
663
+ for (const [key, value] of Object.entries(JSON.parse(pickingProductSetting.value))) {
664
+ sortings.push({ name: `loc.${key}`, desc: value == 'DESC' ? true : false });
665
+ }
666
+ }
667
+ else {
668
+ sortings.push({ name: 'loc.name', desc: false }, { name: 'iv.created_at', desc: false });
669
+ }
670
+ break;
671
+ case 'FMFO':
672
+ sortings.push({ name: 'iv.manufacture_date', desc: false }, { name: 'iv.created_at', desc: false });
673
+ if (pickingProductSetting === null || pickingProductSetting === void 0 ? void 0 : pickingProductSetting.value) {
674
+ for (const [key, value] of Object.entries(JSON.parse(pickingProductSetting.value))) {
675
+ sortings.push({ name: `loc.${key}`, desc: value == 'DESC' ? true : false });
676
+ }
677
+ }
678
+ else {
679
+ sortings.push({ name: 'loc.name', desc: false }, { name: 'iv.created_at', desc: false });
680
+ }
681
+ break;
682
+ case 'LOCATION':
683
+ if (pickingProductSetting === null || pickingProductSetting === void 0 ? void 0 : pickingProductSetting.value) {
684
+ for (const [key, value] of Object.entries(JSON.parse(pickingProductSetting.value))) {
685
+ sortings.push({ name: `loc.${key}`, desc: value == 'DESC' ? true : false });
686
+ }
687
+ }
688
+ else {
689
+ sortings.push({ name: 'loc.name', desc: false }, { name: 'iv.created_at', desc: false });
690
+ }
691
+ break;
692
+ //Every other case includes 'FIFO' will be applicable for this case
693
+ default:
694
+ sortings.push({ name: 'iv.created_at', desc: false });
695
+ if (pickingProductSetting === null || pickingProductSetting === void 0 ? void 0 : pickingProductSetting.value) {
696
+ for (const [key, value] of Object.entries(JSON.parse(pickingProductSetting.value))) {
697
+ sortings.push({ name: `loc.${key}`, desc: value == 'DESC' ? true : false });
698
+ }
699
+ }
700
+ else {
701
+ sortings.push({ name: 'loc.name', desc: false });
702
+ sortings.push({ name: 'iv.pallet_id', desc: false });
703
+ }
704
+ break;
705
+ }
706
+ let queryFilters = [];
707
+ let queryStrings = queryFilters.reduce((acc, itm, idx, arr) => {
708
+ acc.values.push(itm.filters);
709
+ switch (itm === null || itm === void 0 ? void 0 : itm.operator) {
710
+ case 'notin':
711
+ case 'in':
712
+ acc.query.push(`${itm.query} ${itm.operator == 'notin' ? 'NOT IN' : 'IN'} (${itm.filtes
713
+ .map((itm, idx) => {
714
+ return `$${acc.values.length + 1}`;
715
+ })
716
+ .join(',')})`);
717
+ break;
718
+ default:
719
+ acc.query.push(`${itm.query} ${(itm === null || itm === void 0 ? void 0 : itm.operator) ? itm.operator : '='} $${acc.values.length + 1}`);
720
+ break;
721
+ }
722
+ acc.query.push(`${itm.query} ${(itm === null || itm === void 0 ? void 0 : itm.operator) ? itm.operator : '='} $${acc.values.length + 1}`);
723
+ }, {
724
+ query: [],
725
+ values: []
726
+ });
727
+ let sortQuery = sortings
728
+ .map(itm => {
729
+ return `${itm.name} ${itm.desc ? 'DESC' : 'ASC'}`;
730
+ })
731
+ .join(`,`);
732
+ let updatedInventories = await tx.getRepository(warehouse_base_1.Inventory).query(`
733
+ update inventories tgt set locked_qty = coalesce(locked_qty,0) + src.reserve_qty,
734
+ locked_uom_value = coalesce(locked_uom_value,0) + src.reserve_uom_value,
735
+ updated_at = NOW(),
736
+ updater_id = $1
737
+ from (
738
+ select "id", "pallet_id","carton_id", "batch_id", "batch_id_ref", "unit", "uom", "packing_type", "packing_size", "manufacture_year",
739
+ "reserve_qty", (("uom_value"/"qty") * "reserve_qty") as "reserve_uom_value" from (
740
+ select "sort_seq", "id", "pallet_id", "batch_id", "batch_id_ref", "unit", "uom", "packing_type", "packing_size", "manufacture_year", "carton_id", "uom_value", "locked_uom_value", "qty", "locked_qty", "created_at",
741
+ "release_qty", "release_uom_value", lock_amount,
742
+ case when "lock_amount" < 0 then "available_qty" else "available_qty" - "lock_amount" end as "reserve_qty"
743
+ from (
744
+ select *,
745
+ qty - locked_qty as available_qty,
746
+ sum(qty - locked_qty - release_qty) over (order by sort_seq asc rows between unbounded preceding and current row) as lock_amount
747
+ from (
748
+ SELECT 0 as sort_seq, null as id, null as pallet_id, null as batch_id, null as batch_id_ref,
749
+ null as unit, '${orderInventory.uom}' as uom, '${orderInventory.packingType}' as packing_type, '${orderInventory.packingSize}' as packing_size,
750
+ null as manufacture_year, null as carton_id, 0 as uom_value, 0 as locked_uom_value, 0 as qty, 0 as locked_qty, null as created_at,
751
+ '${orderInventory.releaseQty}' as release_qty, '${orderInventory.releaseUomValue}' as release_uom_value
752
+ UNION
753
+ (
754
+ SELECT ROW_NUMBER() OVER(PARTITION BY iv.domain_id ORDER BY ${sortQuery}) as sort_seq,
755
+ iv.id, iv.pallet_id, iv.batch_id, iv.batch_id_ref,
756
+ iv.unit, iv.uom, iv.packing_type, iv.packing_size,
757
+ iv.manufacture_year, iv.carton_id, iv.uom_value,
758
+ coalesce(iv.locked_uom_value,0) as locked_uom_value, iv.qty, coalesce(iv.locked_qty,0) as locked_qty, iv.created_at,
759
+ 0 as release_qty, 0 as release_uom_value
760
+ FROM "inventories" "iv"
761
+ INNER JOIN "locations" "loc" ON "loc"."id"="iv"."location_id"
762
+ WHERE case when coalesce("iv"."locked_qty",0) < 0 then 0 else ("iv"."qty" - coalesce("iv"."locked_qty",0)) end > 0 AND
763
+ "iv"."domain_id" = $2 AND "iv"."bizplace_id" = $3 AND "iv"."packing_type" = $4 AND "iv"."packing_size" = $5 AND "iv"."product_id" = $6 AND "iv"."status" = $7 AND "loc"."type" NOT IN ($8, $9)
764
+ ${queryStrings.query.length > 0 ? `AND ${queryStrings.join(' AND ')}` : ''}
765
+ ORDER BY ${sortQuery}
766
+ )
767
+ ) dt1
768
+ ) dt2 where case when "lock_amount" < 0 then "available_qty" else "available_qty" - "lock_amount" end > 0
769
+ ) dt3 where sort_seq > 0
770
+ ) src where src.id = tgt.id
771
+ returning
772
+ tgt."id", tgt."qty", tgt."pallet_id", tgt."carton_id", tgt."batch_id", tgt."batch_id_ref", tgt."unit",
773
+ tgt."uom", tgt."packing_type", tgt."packing_size", tgt."manufacture_year",
774
+ tgt."locked_qty", tgt."uom_value", tgt."locked_uom_value", src."reserve_qty", src."reserve_uom_value";`, [
775
+ user.id,
776
+ domain.id,
777
+ customerBizplace.id,
778
+ orderInventory.packingType,
779
+ orderInventory.packingSize,
780
+ orderInventory.product.id,
781
+ warehouse_base_1.INVENTORY_STATUS.STORED,
782
+ warehouse_base_1.LOCATION_TYPE.QUARANTINE,
783
+ warehouse_base_1.LOCATION_TYPE.RESERVE,
784
+ ...queryStrings.values
785
+ ]);
786
+ let totalAssigned = updatedInventories[0].reduce((acc, inv) => {
787
+ return acc + inv.reserve_qty;
788
+ }, 0);
789
+ if (orderInventory.releaseQty != totalAssigned) {
790
+ throw new error_util_1.ApiError('E01', `insufficient stock:
791
+ ${JSON.stringify({
792
+ code: 'insufficient stock',
793
+ sku: orderInventory.product.sku,
794
+ packingType: orderInventory.packingType,
795
+ packingSize: orderInventory.packingSize,
796
+ uom: orderInventory.uom,
797
+ qty: orderInventory.releaseQty,
798
+ uom_value: orderInventory.releaseUomValue
799
+ })}`);
800
+ }
801
+ updatedInventories[0].forEach(inv => {
802
+ let oi = Object.assign(Object.assign({}, orderInventory), { inventory: { id: inv.id }, uom: inv.uom, packingType: inv.packing_type, batchId: inv.batch_id, releaseQty: inv.reserve_qty, releaseUomValue: inv.reserve_uom_value, pickedQty: 0, packedQty: 0, type: sales_base_1.ORDER_TYPES.RELEASE_OF_GOODS, status: sales_base_1.ORDER_INVENTORY_STATUS.PENDING_WORKSHEET, domain: { id: domain.id }, bizplace: { id: customerBizplace.id } });
803
+ assignedOrderInventories.push(oi);
804
+ });
805
+ }
806
+ orderProducts[opIdx].orderInventories = assignedOrderInventories;
807
+ }
808
+ return orderProducts;
809
+ }
810
+ //# sourceMappingURL=add-release-order.js.map