@things-factory/worksheet-base 4.3.185 → 4.3.187

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 (133) hide show
  1. package/dist-server/constants/worksheet.js +3 -1
  2. package/dist-server/constants/worksheet.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/ecommerce-controller.js +4 -1
  4. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  5. package/dist-server/controllers/ecommerce/sellercraft-controller.js +10 -1
  6. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +1 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +19 -4
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/pos/xilnex-controller.js +5 -1
  12. package/dist-server/controllers/pos/xilnex-controller.js.map +1 -1
  13. package/dist-server/controllers/replenishment/index.js +18 -0
  14. package/dist-server/controllers/replenishment/index.js.map +1 -0
  15. package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js +455 -0
  16. package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js.map +1 -0
  17. package/dist-server/controllers/worksheet-controller.js +32 -9
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/entities/index.js +10 -2
  20. package/dist-server/entities/index.js.map +1 -1
  21. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +15 -1
  22. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
  23. package/dist-server/entities/warehouse-inventory-assignment-ranking.js +37 -0
  24. package/dist-server/entities/warehouse-inventory-assignment-ranking.js.map +1 -0
  25. package/dist-server/entities/worksheet.js +13 -9
  26. package/dist-server/entities/worksheet.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js +57 -0
  28. package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js.map +1 -0
  29. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +23 -1
  30. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +7 -1
  32. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js +19 -0
  34. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js.map +1 -0
  35. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js +2 -1
  36. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/index.js +5 -2
  38. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +37 -26
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +16 -2
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +290 -264
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js +12 -0
  48. package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js.map +1 -0
  49. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +142 -78
  50. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js +16 -0
  52. package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js.map +1 -0
  53. package/dist-server/graphql/resolvers/worksheet/putaway/index.js +4 -1
  54. package/dist-server/graphql/resolvers/worksheet/putaway/index.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js +15 -0
  56. package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js.map +1 -0
  57. package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js +16 -0
  58. package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js.map +1 -0
  59. package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js +81 -0
  60. package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js.map +1 -0
  61. package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js +17 -0
  62. package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js.map +1 -0
  63. package/dist-server/graphql/resolvers/worksheet/replenishment/index.js +6 -0
  64. package/dist-server/graphql/resolvers/worksheet/replenishment/index.js.map +1 -0
  65. package/dist-server/graphql/resolvers/worksheet/worksheet.js +1 -0
  66. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/worksheets.js +28 -2
  68. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  69. package/dist-server/graphql/types/worksheet/index.js +42 -1
  70. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  71. package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js +11 -0
  72. package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js.map +1 -0
  73. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  74. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  75. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  76. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  77. package/dist-server/index.js +1 -0
  78. package/dist-server/index.js.map +1 -1
  79. package/dist-server/utils/index.js +1 -0
  80. package/dist-server/utils/index.js.map +1 -1
  81. package/dist-server/utils/inventory-util.js +2 -0
  82. package/dist-server/utils/inventory-util.js.map +1 -1
  83. package/dist-server/utils/lmd-util.js +76 -0
  84. package/dist-server/utils/lmd-util.js.map +1 -0
  85. package/dist-server/utils/worksheet-no-generator.js +21 -1
  86. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  87. package/dist-server/utils/worksheet-util.js +3 -0
  88. package/dist-server/utils/worksheet-util.js.map +1 -1
  89. package/package.json +13 -13
  90. package/server/constants/worksheet.ts +3 -1
  91. package/server/controllers/ecommerce/ecommerce-controller.ts +4 -1
  92. package/server/controllers/ecommerce/sellercraft-controller.ts +15 -1
  93. package/server/controllers/index.ts +1 -1
  94. package/server/controllers/outbound/picking-worksheet-controller.ts +30 -10
  95. package/server/controllers/pos/xilnex-controller.ts +6 -1
  96. package/server/controllers/replenishment/index.ts +1 -0
  97. package/server/controllers/replenishment/replenishment-worksheet-controller.ts +632 -0
  98. package/server/controllers/worksheet-controller.ts +47 -13
  99. package/server/entities/index.ts +15 -2
  100. package/server/entities/warehouse-bizplace-onhand-inventory.ts +13 -1
  101. package/server/entities/warehouse-inventory-assignment-ranking.ts +19 -0
  102. package/server/entities/worksheet.ts +5 -1
  103. package/server/graphql/resolvers/worksheet/cancel-replenishment.ts +69 -0
  104. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +22 -1
  105. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +6 -1
  106. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.ts +30 -0
  107. package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +3 -1
  108. package/server/graphql/resolvers/worksheet/index.ts +8 -2
  109. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +81 -41
  110. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +16 -2
  111. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +347 -301
  112. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  113. package/server/graphql/resolvers/worksheet/picking/replenishment-picking.ts +27 -0
  114. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +177 -95
  115. package/server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.ts +25 -0
  116. package/server/graphql/resolvers/worksheet/putaway/index.ts +7 -1
  117. package/server/graphql/resolvers/worksheet/putaway/replenishment-putaway.ts +23 -0
  118. package/server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.ts +22 -0
  119. package/server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.ts +95 -0
  120. package/server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.ts +26 -0
  121. package/server/graphql/resolvers/worksheet/replenishment/index.ts +5 -0
  122. package/server/graphql/resolvers/worksheet/worksheet.ts +1 -0
  123. package/server/graphql/resolvers/worksheet/worksheets.ts +38 -3
  124. package/server/graphql/types/worksheet/index.ts +42 -1
  125. package/server/graphql/types/worksheet/replenish-inventory-patch.ts +8 -0
  126. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  127. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  128. package/server/index.ts +1 -0
  129. package/server/utils/index.ts +1 -0
  130. package/server/utils/inventory-util.ts +3 -0
  131. package/server/utils/lmd-util.ts +86 -0
  132. package/server/utils/worksheet-no-generator.ts +29 -1
  133. package/server/utils/worksheet-util.ts +4 -2
@@ -21,7 +21,8 @@ import {
21
21
  OrderPackage,
22
22
  OrderPackageItem,
23
23
  OrderProduct,
24
- ReleaseGood
24
+ ReleaseGood,
25
+ Replenishment
25
26
  } from '@things-factory/sales-base'
26
27
  import { Setting } from '@things-factory/setting-base'
27
28
  import { Domain } from '@things-factory/shell'
@@ -32,11 +33,13 @@ import {
32
33
  LoadingWorksheetController,
33
34
  PackingWorksheetController,
34
35
  PickingWorksheetController,
36
+ ReplenishmentWorksheetController,
35
37
  SellercraftController
36
38
  } from '../../../../controllers/'
37
39
  import { EcommerceController } from '../../../../controllers/ecommerce'
38
40
  import { WorksheetController } from '../../../../controllers/worksheet-controller'
39
41
  import { Worksheet, WorksheetDetail } from '../../../../entities'
42
+ import { createLmdParcel } from '../../../../utils'
40
43
 
41
44
  export const completePickingResolver = {
42
45
  async completePicking(_: any, { releaseGoodNo }, context: any) {
@@ -64,6 +67,11 @@ export async function completePicking(
64
67
  releaseGoodNo: string
65
68
  ): Promise<any> {
66
69
  const pickingWSCtrl: PickingWorksheetController = new PickingWorksheetController(tx, domain, user)
70
+ const replenishmentPickingWSCtrl: ReplenishmentWorksheetController = new ReplenishmentWorksheetController(
71
+ tx,
72
+ domain,
73
+ user
74
+ )
67
75
  let releaseGood: ReleaseGood = await tx.getRepository(ReleaseGood).findOne({
68
76
  where: { domain, name: releaseGoodNo },
69
77
  relations: [
@@ -72,7 +80,11 @@ export async function completePicking(
72
80
  'bizplace.domain',
73
81
  'bizplace.company',
74
82
  'bizplace.company.domain',
83
+ 'lastMileDelivery',
75
84
  'orderPackages',
85
+ 'orderPackages.orderPackageItems',
86
+ 'orderPackages.orderPackageItems.orderProduct',
87
+ 'orderPackages.orderPackageItems.orderProduct.product',
76
88
  'orderProducts',
77
89
  'orderProducts.product',
78
90
  'orderProducts.productDetail',
@@ -81,331 +93,354 @@ export async function completePicking(
81
93
  ]
82
94
  })
83
95
 
84
- const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
85
- 'worksheetDetails',
86
- 'worksheetDetails.targetInventory',
87
- 'worksheetDetails.targetInventory.inventory'
88
- ])
89
-
90
- const warehouseContactPoint: ContactPoint = await tx.getRepository(ContactPoint).findOne({
91
- where: {
92
- domain,
93
- type: 'WAREHOUSE'
94
- }
95
- })
96
+ if (releaseGood) {
97
+ const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.PICKING, [
98
+ 'worksheetDetails',
99
+ 'worksheetDetails.targetInventory',
100
+ 'worksheetDetails.targetInventory.inventory'
101
+ ])
102
+
103
+ const warehouseContactPoint: ContactPoint = await tx.getRepository(ContactPoint).findOne({
104
+ where: {
105
+ domain,
106
+ type: 'WAREHOUSE'
107
+ }
108
+ })
96
109
 
97
- const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
98
- const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
99
- const inventories: Inventory[] = targetInventories.map((ti: OrderInventory) => ti.inventory)
100
- const pickedTargetInventories: OrderInventory[] = targetInventories.filter(
101
- targetInventory => targetInventory.status === ORDER_INVENTORY_STATUS.PICKED
102
- )
110
+ const worksheetDetails: WorksheetDetail[] = worksheet.worksheetDetails
111
+ const targetInventories: OrderInventory[] = worksheetDetails.map((wsd: WorksheetDetail) => wsd.targetInventory)
112
+ const inventories: Inventory[] = targetInventories.map((ti: OrderInventory) => ti.inventory)
113
+ const pickedTargetInventories: OrderInventory[] = targetInventories.filter(
114
+ targetInventory => targetInventory.status === ORDER_INVENTORY_STATUS.PICKED
115
+ )
116
+
117
+ let foundObsoleteInventories = await pickingWSCtrl.completePicking(releaseGood, worksheet, inventories)
118
+
119
+ if (foundObsoleteInventories?.type) {
120
+ const orderSource: string = releaseGood.source
121
+ switch (orderSource) {
122
+ case ApplicationType.SELLERCRAFT:
123
+ const sellercraft: Sellercraft = await tx
124
+ .getRepository(Sellercraft)
125
+ .findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
126
+
127
+ if (sellercraft) {
128
+ const initSCOrderShipment = async sellercraft => {
129
+ await getManager().transaction(async txMgr => {
130
+ const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
131
+
132
+ if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
133
+ const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
134
+ where: { releaseGood },
135
+ relations: ['product', 'product.productDetails']
136
+ })
137
+ await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
138
+ }
103
139
 
104
- let foundObsoleteInventories = await pickingWSCtrl.completePicking(releaseGood, worksheet, inventories)
105
-
106
- if (foundObsoleteInventories?.type) {
107
- const orderSource: string = releaseGood.source
108
- switch (orderSource) {
109
- case ApplicationType.SELLERCRAFT:
110
- const sellercraft: Sellercraft = await tx
111
- .getRepository(Sellercraft)
112
- .findOne({ domain: releaseGood.bizplace.domain, status: SellercraftStatus.ACTIVE })
113
-
114
- if (sellercraft) {
115
- const initSCOrderShipment = async sellercraft => {
116
- await getManager().transaction(async txMgr => {
117
- const sellercraftCtrl: SellercraftController = new SellercraftController(txMgr, domain, user)
118
-
119
- if (!releaseGood?.orderPackages?.length && !releaseGood?.marketPackCallSuccess) {
120
- const orderProducts: OrderProduct[] = await txMgr.getRepository(OrderProduct).find({
121
- where: { releaseGood },
122
- relations: ['product', 'product.productDetails']
140
+ const rtsTriggerLevel: Setting = await txMgr.getRepository(Setting).findOne({
141
+ where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
123
142
  })
124
- await sellercraftCtrl.packOrder(sellercraft, { ...releaseGood, orderProducts })
125
- }
126
143
 
127
- const rtsTriggerLevel: Setting = await txMgr.getRepository(Setting).findOne({
128
- where: { domain, category: 'id-rule', name: 'rts-trigger-level' }
144
+ if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
145
+ await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
146
+ }
129
147
  })
130
-
131
- if (rtsTriggerLevel && parseInt(rtsTriggerLevel?.value || 0) == 1) {
132
- await sellercraftCtrl.initiateOrderShipment(sellercraft, releaseGood)
133
- }
134
- })
148
+ }
149
+ // asynchronouly call to initiate sellercraft order shipment/ RTS
150
+ initSCOrderShipment(sellercraft)
135
151
  }
136
- // asynchronouly call to initiate sellercraft order shipment/ RTS
137
- initSCOrderShipment(sellercraft)
138
- }
139
- break
140
-
141
- case ApplicationType.MMS:
142
- const companyDomain: Domain = releaseGood.bizplace.company.domain
143
- let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
144
- where: { orderNo: releaseGood.refNo, domain: companyDomain },
145
- relations: [
146
- 'marketplaceStore',
147
- 'marketplaceStore.marketplaceDistributors',
148
- 'marketplaceOrderItems',
149
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
150
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
151
- ]
152
- })
153
-
154
- if (marketplaceOrder) {
155
- const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
156
- const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
157
- let eTraxOption: boolean
152
+ break
153
+
154
+ case ApplicationType.MMS:
155
+ const companyDomain: Domain = releaseGood.bizplace.company.domain
156
+ let marketplaceOrder: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
157
+ where: { orderNo: releaseGood.refNo, domain: companyDomain },
158
+ relations: [
159
+ 'marketplaceStore',
160
+ 'marketplaceStore.marketplaceDistributors',
161
+ 'marketplaceOrderItems',
162
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
163
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
164
+ ]
165
+ })
166
+
167
+ if (marketplaceOrder) {
168
+ const ecommerceCtrl: EcommerceController = new EcommerceController(tx, domain, user)
169
+ const marketplaceStore: MarketplaceStore = marketplaceOrder.marketplaceStore
170
+ let eTraxOption: boolean
171
+
172
+ if (marketplaceStore?.isAutoUpdateShipment) {
173
+ await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
174
+
175
+ await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
176
+ }
158
177
 
159
- if (marketplaceStore?.isAutoUpdateShipment) {
160
- await ecommerceCtrl.createOrderComment(marketplaceStore, marketplaceOrder, ORDER_STATUS.PACKING)
178
+ if (!marketplaceOrder) {
179
+ throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
180
+ }
161
181
 
162
- await ecommerceCtrl.createOrderShip(releaseGood, marketplaceStore, marketplaceOrder, companyDomain)
163
- }
182
+ eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
183
+
184
+ // if eTrax option is true
185
+ if (eTraxOption) {
186
+ const marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems
187
+
188
+ // access every marketplaceOrderItems for shipping information you need
189
+ // trigger the controller from integration-lmd that trigger the API, build the parameters needed
190
+ // for etrax didn't support multi awb per order
191
+ const marketplaceOrderShippingItems: MarketplaceOrderShippingItem[] =
192
+ marketplaceOrderItems[0].marketplaceOrderShippingItems
193
+ const marketplaceOrderShipping: MarketplaceOrderShipping =
194
+ marketplaceOrderShippingItems[0].marketplaceOrderShipping
195
+ const lmd: LastMileDelivery = await tx.getRepository(LastMileDelivery).findOne({
196
+ where: {
197
+ domain,
198
+ platform: 'eTrax'
199
+ }
200
+ })
164
201
 
165
- if (!marketplaceOrder) {
166
- throw new Error('Failed to find ecommerce order, kindly contact our support team regarding this issue')
167
- }
202
+ //Get which transporter to use
203
+ const marketplaceTransporter: MarketplaceTransporter = await tx
204
+ .getRepository(MarketplaceTransporter)
205
+ .findOne({
206
+ where: { marketplaceStore: marketplaceOrder.marketplaceStore },
207
+ relations: ['pickupTransporter', 'deliveryTransporter']
208
+ })
168
209
 
169
- eTraxOption = marketplaceOrder?.marketplaceStore.eTrax
170
-
171
- // if eTrax option is true
172
- if (eTraxOption) {
173
- const marketplaceOrderItems: MarketplaceOrderItem[] = marketplaceOrder.marketplaceOrderItems
174
-
175
- // access every marketplaceOrderItems for shipping information you need
176
- // trigger the controller from integration-lmd that trigger the API, build the parameters needed
177
- // for etrax didn't support multi awb per order
178
- const marketplaceOrderShippingItems: MarketplaceOrderShippingItem[] =
179
- marketplaceOrderItems[0].marketplaceOrderShippingItems
180
- const marketplaceOrderShipping: MarketplaceOrderShipping =
181
- marketplaceOrderShippingItems[0].marketplaceOrderShipping
182
- const lmd: LastMileDelivery = await tx.getRepository(LastMileDelivery).findOne({
183
- where: {
184
- domain,
185
- platform: 'eTrax'
186
- }
187
- })
188
-
189
- //Get which transporter to use
190
- const marketplaceTransporter: MarketplaceTransporter = await tx
191
- .getRepository(MarketplaceTransporter)
192
- .findOne({
193
- where: { marketplaceStore: marketplaceOrder.marketplaceStore },
194
- relations: ['pickupTransporter', 'deliveryTransporter']
210
+ const resp = await LastMileAPI.createShipmentRequest(lmd, {
211
+ orderNo: marketplaceOrder.orderNo,
212
+ clientId: lmd.clientId,
213
+ clientType: lmd.clientType,
214
+ clientName: lmd.clientName,
215
+ transporterId: marketplaceTransporter.pickupTransporter.transporterId,
216
+ pickupName: warehouseContactPoint.name,
217
+ pickupAddress1: warehouseContactPoint.address,
218
+ pickupAddress2: warehouseContactPoint.address2,
219
+ pickupPostcode: warehouseContactPoint.postCode,
220
+ pickupState: warehouseContactPoint.state,
221
+ pickupCity: warehouseContactPoint.city,
222
+ pickupPhone: warehouseContactPoint.phone,
223
+ pickupEmail: warehouseContactPoint.email,
224
+ name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
225
+ address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
226
+ address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
227
+ postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
228
+ city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
229
+ state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
230
+ phone: marketplaceOrderShipping.phone1 || '',
231
+ email: marketplaceOrderShipping.email || '',
232
+ attentionTo: marketplaceOrderShipping.attentionTo,
233
+ quantity: marketplaceOrderItems.length
195
234
  })
196
235
 
197
- const resp = await LastMileAPI.createShipmentRequest(lmd, {
198
- orderNo: marketplaceOrder.orderNo,
199
- clientId: lmd.clientId,
200
- clientType: lmd.clientType,
201
- clientName: lmd.clientName,
202
- transporterId: marketplaceTransporter.pickupTransporter.transporterId,
203
- pickupName: warehouseContactPoint.name,
204
- pickupAddress1: warehouseContactPoint.address,
205
- pickupAddress2: warehouseContactPoint.address2,
206
- pickupPostcode: warehouseContactPoint.postCode,
207
- pickupState: warehouseContactPoint.state,
208
- pickupCity: warehouseContactPoint.city,
209
- pickupPhone: warehouseContactPoint.phone,
210
- pickupEmail: warehouseContactPoint.email,
211
- name: marketplaceOrderShipping?.attentionTo ? marketplaceOrderShipping.attentionTo.trim() : '',
212
- address1: marketplaceOrderShipping?.address1 ? marketplaceOrderShipping?.address1.trim() : '-',
213
- address2: marketplaceOrderShipping?.address2 ? marketplaceOrderShipping?.address2.trim() : '-',
214
- postCode: marketplaceOrderShipping?.postCode ? marketplaceOrderShipping?.postCode.trim() : '',
215
- city: marketplaceOrderShipping?.city ? marketplaceOrderShipping?.city.trim() : '',
216
- state: marketplaceOrderShipping?.state ? marketplaceOrderShipping?.state.trim() : '',
217
- phone: marketplaceOrderShipping.phone1 || '',
218
- email: marketplaceOrderShipping.email || '',
219
- attentionTo: marketplaceOrderShipping.attentionTo,
220
- quantity: marketplaceOrderItems.length
221
- })
222
-
223
- const delay = (ms: number) => {
224
- return new Promise(resolve => setTimeout(resolve, ms))
225
- }
236
+ const delay = (ms: number) => {
237
+ return new Promise(resolve => setTimeout(resolve, ms))
238
+ }
226
239
 
227
- if (resp.Status === 'SUCCESS') {
228
- //Success
229
- let awbObtained = false
230
- let retry = 0
231
- while (!awbObtained) {
232
- const marketplaceOrder2: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
233
- where: { releaseOrderId: releaseGood.id },
234
- relations: [
235
- 'marketplaceStore',
236
- 'marketplaceOrderItems',
237
- 'marketplaceOrderItems.marketplaceOrderShippingItems',
238
- 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
239
- ]
240
- })
241
- const orderShipping =
242
- marketplaceOrder2.marketplaceOrderItems[0].marketplaceOrderShippingItems[0].marketplaceOrderShipping
243
- if (orderShipping?.airwayBill) {
244
- awbObtained = true
245
- }
246
- await delay(5000)
247
- //Timeout after 15sec
248
- if (++retry > 3) {
249
- break
240
+ if (resp.Status === 'SUCCESS') {
241
+ //Success
242
+ let awbObtained = false
243
+ let retry = 0
244
+ while (!awbObtained) {
245
+ const marketplaceOrder2: MarketplaceOrder = await tx.getRepository(MarketplaceOrder).findOne({
246
+ where: { releaseOrderId: releaseGood.id },
247
+ relations: [
248
+ 'marketplaceStore',
249
+ 'marketplaceOrderItems',
250
+ 'marketplaceOrderItems.marketplaceOrderShippingItems',
251
+ 'marketplaceOrderItems.marketplaceOrderShippingItems.marketplaceOrderShipping'
252
+ ]
253
+ })
254
+ const orderShipping =
255
+ marketplaceOrder2.marketplaceOrderItems[0].marketplaceOrderShippingItems[0].marketplaceOrderShipping
256
+ if (orderShipping?.airwayBill) {
257
+ awbObtained = true
258
+ }
259
+ await delay(5000)
260
+ //Timeout after 15sec
261
+ if (++retry > 3) {
262
+ break
263
+ }
250
264
  }
265
+ } else {
266
+ if (resp?.AWBurl && resp?.TrackingNo)
267
+ await tx
268
+ .getRepository(MarketplaceOrderShipping)
269
+ .update(
270
+ { id: marketplaceOrderShipping.id },
271
+ { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo }
272
+ )
273
+ else throw resp
251
274
  }
252
- } else {
253
- if (resp?.AWBurl && resp?.TrackingNo)
254
- await tx
255
- .getRepository(MarketplaceOrderShipping)
256
- .update({ id: marketplaceOrderShipping.id }, { airwayBill: resp.AWBurl, trackingNo: resp.TrackingNo })
257
- else throw resp
258
275
  }
259
- }
260
276
 
261
- await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
262
- }
263
- break
264
-
265
- default:
266
- const orderPackage: OrderPackage = {
267
- name: OrderNoGenerator.orderPackage(),
268
- packageId: null,
269
- trackingNo: null,
270
- transporter: null,
271
- airwayBill: null,
272
- status: ORDER_STATUS.PROCESSING,
273
- releaseGood,
274
- domain: releaseGood.domain,
275
- bizplace: releaseGood.bizplace,
276
- creator: releaseGood.creator,
277
- updater: releaseGood.updater
278
- }
279
-
280
- let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
281
- const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
282
- return {
283
- name: OrderNoGenerator.orderPackageItem(),
284
- orderProduct: op,
277
+ await ecommerceCtrl.createOrderPackage(tx, marketplaceOrder, companyDomain, marketplaceStore, releaseGood)
278
+ }
279
+ break
280
+
281
+ default:
282
+ let orderPackage: OrderPackage = {
283
+ name: OrderNoGenerator.orderPackage(),
284
+ packageId: null,
285
+ trackingNo: null,
286
+ transporter: null,
287
+ airwayBill: null,
285
288
  status: ORDER_STATUS.PROCESSING,
286
- releaseQty: op.releaseQty,
287
- orderPackage: savedOrderPackage,
289
+ releaseGood,
288
290
  domain: releaseGood.domain,
289
291
  bizplace: releaseGood.bizplace,
290
292
  creator: releaseGood.creator,
291
293
  updater: releaseGood.updater
292
294
  }
293
- })
294
295
 
295
- await tx.getRepository(OrderPackageItem).save(orderPackageItems)
296
- break
297
- }
296
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
297
+ const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts.map(op => {
298
+ return {
299
+ name: OrderNoGenerator.orderPackageItem(),
300
+ orderProduct: op,
301
+ status: ORDER_STATUS.PROCESSING,
302
+ releaseQty: op.releaseQty,
303
+ orderPackage: savedOrderPackage,
304
+ domain: releaseGood.domain,
305
+ bizplace: releaseGood.bizplace,
306
+ creator: releaseGood.creator,
307
+ updater: releaseGood.updater
308
+ }
309
+ })
310
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
311
+ orderPackage.orderPackageItems = orderPackageItems
312
+ releaseGood.orderPackages = [orderPackage]
313
+ break
314
+ }
298
315
 
299
- const account: Account = await tx
300
- .getRepository(Account)
301
- .findOne({ where: { domain: releaseGood.bizplace.domain, status: 'active' }, relations: ['domain'] })
302
-
303
- // Xilnex Create Sales Order and Post Sales Order to Sales Invoice
304
- const createSalesOrder = async (account, tx) => {
305
- if (account) {
306
- if (account.platform == 'xilnex') {
307
- let integrationInfo: any = {
308
- xilnex: {
309
- accountId: account.accountId,
310
- startTime: new Date()
316
+ const account: Account = await tx
317
+ .getRepository(Account)
318
+ .findOne({ where: { domain: releaseGood.bizplace.domain, status: 'active' }, relations: ['domain'] })
319
+
320
+ // Xilnex Create Sales Order and Post Sales Order to Sales Invoice
321
+ const createSalesOrder = async (account, tx) => {
322
+ if (account) {
323
+ if (account.platform == 'xilnex') {
324
+ let integrationInfo: any = {
325
+ xilnex: {
326
+ accountId: account.accountId,
327
+ startTime: new Date()
328
+ }
311
329
  }
312
- }
313
330
 
314
- try {
315
- const salesOrder: any = await AccountingAPI.createSalesOrder(account, {
316
- releaseGood,
317
- orderProducts: releaseGood.orderProducts
318
- })
331
+ try {
332
+ const salesOrder: any = await AccountingAPI.createSalesOrder(account, {
333
+ releaseGood,
334
+ orderProducts: releaseGood.orderProducts
335
+ })
319
336
 
320
- if (salesOrder) {
321
- integrationInfo.xilnex = {
322
- ...integrationInfo.xilnex,
323
- salesOrderId: salesOrder.id,
324
- endTime: new Date()
325
- }
337
+ if (salesOrder) {
338
+ integrationInfo.xilnex = {
339
+ ...integrationInfo.xilnex,
340
+ salesOrderId: salesOrder.id,
341
+ endTime: new Date()
342
+ }
326
343
 
327
- try {
328
- const salesInvoice: any = await AccountingAPI.postSalesOrderToSalesInvoice(account, {
329
- orderId: salesOrder?.id || null
330
- })
344
+ try {
345
+ const salesInvoice: any = await AccountingAPI.postSalesOrderToSalesInvoice(account, {
346
+ orderId: salesOrder?.id || null
347
+ })
348
+
349
+ if (salesInvoice) {
350
+ integrationInfo.xilnex = {
351
+ ...integrationInfo.xilnex,
352
+ salesInvoiceId: salesInvoice.salesId,
353
+ endTime: new Date()
354
+ }
355
+
356
+ const salesOrderItems: any = salesInvoice.sale.items
357
+ await Promise.all(
358
+ releaseGood.orderProducts.map(async op => {
359
+ const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
360
+ if (matchedProduct) {
361
+ await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
362
+ }
363
+ })
364
+ )
331
365
 
332
- if (salesInvoice) {
366
+ await tx
367
+ .getRepository(ReleaseGood)
368
+ .update(
369
+ { id: releaseGood.id },
370
+ { collectionOrderNo: salesInvoice.salesId, integrationInfo, updater: releaseGood.updater }
371
+ )
372
+ }
373
+ } catch (error) {
333
374
  integrationInfo.xilnex = {
334
375
  ...integrationInfo.xilnex,
335
- salesInvoiceId: salesInvoice.salesId,
336
376
  endTime: new Date()
337
377
  }
338
378
 
339
- const salesOrderItems: any = salesInvoice.sale.items
340
- await Promise.all(
341
- releaseGood.orderProducts.map(async op => {
342
- const matchedProduct: any = salesOrderItems.find(soi => soi.itemId == op.productDetail.refCode)
343
- if (matchedProduct) {
344
- await tx.getRepository(OrderProduct).update({ id: op.id }, { refItemId: matchedProduct.id })
345
- }
346
- })
347
- )
348
-
349
379
  await tx
350
380
  .getRepository(ReleaseGood)
351
381
  .update(
352
382
  { id: releaseGood.id },
353
- { collectionOrderNo: salesInvoice.salesId, integrationInfo, updater: releaseGood.updater }
383
+ { integrationInfo, integrationFail: true, updater: releaseGood.updater }
354
384
  )
385
+ logger.error(`complete-picking[createSalesInvoice][${releaseGood.refNo}]: ${error}`)
355
386
  }
356
- } catch (error) {
357
- integrationInfo.xilnex = {
358
- ...integrationInfo.xilnex,
359
- endTime: new Date()
360
- }
361
-
362
- await tx
363
- .getRepository(ReleaseGood)
364
- .update(
365
- { id: releaseGood.id },
366
- { integrationInfo, integrationFail: true, updater: releaseGood.updater }
367
- )
368
- logger.error(`complete-picking[createSalesInvoice][${releaseGood.refNo}]: ${error}`)
369
387
  }
370
- }
371
- } catch (error) {
372
- integrationInfo.xilnex = {
373
- ...integrationInfo.xilnex,
374
- endTime: new Date()
375
- }
388
+ } catch (error) {
389
+ integrationInfo.xilnex = {
390
+ ...integrationInfo.xilnex,
391
+ endTime: new Date()
392
+ }
376
393
 
377
- await tx
378
- .getRepository(ReleaseGood)
379
- .update({ id: releaseGood.id }, { integrationInfo, integrationFail: true, updater: releaseGood.updater })
380
- logger.error(`complete-picking[createSalesOrder][${releaseGood.refNo}]: ${error}`)
394
+ await tx
395
+ .getRepository(ReleaseGood)
396
+ .update(
397
+ { id: releaseGood.id },
398
+ { integrationInfo, integrationFail: true, updater: releaseGood.updater }
399
+ )
400
+ logger.error(`complete-picking[createSalesOrder][${releaseGood.refNo}]: ${error}`)
401
+ }
381
402
  }
382
403
  }
383
404
  }
384
- }
385
405
 
386
- if (releaseGood.type == 'b2c') {
387
- await createSalesOrder(account, tx)
388
- }
406
+ if (releaseGood.type == 'b2c') {
407
+ await createSalesOrder(account, tx)
408
+ }
389
409
 
390
- if (releaseGood.packingOption) {
391
- const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
392
- await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
393
- } else {
394
- // Find Existing Loading Worksheet if any
395
- let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
396
- where: {
397
- releaseGood,
398
- type: WORKSHEET_TYPE.LOADING,
399
- status: WORKSHEET_STATUS.DEACTIVATED
400
- }
401
- })
410
+ if (releaseGood.packingOption) {
411
+ const packingWSCtrl: PackingWorksheetController = new PackingWorksheetController(tx, domain, user)
412
+ await packingWSCtrl.generatePackingWorksheet(releaseGoodNo)
413
+ } else {
414
+ // Find Existing Loading Worksheet if any
415
+ let existLoadingWorksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
416
+ where: {
417
+ releaseGood,
418
+ type: WORKSHEET_TYPE.LOADING,
419
+ status: WORKSHEET_STATUS.DEACTIVATED
420
+ }
421
+ })
402
422
 
403
- if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
404
- if (pickedTargetInventories.length > 0) {
423
+ if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
424
+ if (pickedTargetInventories.length > 0) {
425
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
426
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
427
+ releaseGoodNo,
428
+ pickedTargetInventories
429
+ )
430
+
431
+ if (!loadingWorksheet.worksheetDetails?.length) {
432
+ loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
433
+ }
434
+
435
+ const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
436
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
437
+ }
438
+ } else {
405
439
  const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
406
- let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
440
+ let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
407
441
  releaseGoodNo,
408
- pickedTargetInventories
442
+ pickedTargetInventories,
443
+ existLoadingWorksheet
409
444
  )
410
445
 
411
446
  if (!loadingWorksheet.worksheetDetails?.length) {
@@ -415,41 +450,37 @@ export async function completePicking(
415
450
  const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
416
451
  await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
417
452
  }
418
- } else {
419
- const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
420
- let loadingWorksheet: Worksheet = await loadingWSCtrl.updateLoadingWorksheet(
421
- releaseGoodNo,
422
- pickedTargetInventories,
423
- existLoadingWorksheet
424
- )
425
-
426
- if (!loadingWorksheet.worksheetDetails?.length) {
427
- loadingWorksheet = await pickingWSCtrl.findWorksheetById(loadingWorksheet.id)
428
- }
453
+ }
429
454
 
430
- const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
431
- await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
455
+ // trigger LMD API to create parcel
456
+ if (
457
+ releaseGood?.orderPackages?.length &&
458
+ releaseGood.lmdOption &&
459
+ releaseGood.lastMileDelivery &&
460
+ releaseGood?.orderPackages?.some(op => op.parcelId == null)
461
+ ) {
462
+ await createLmdParcel([releaseGood], tx)
432
463
  }
433
- }
434
- } else {
435
- //update inventories obsolete to true
436
- await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
464
+ //
465
+ } else {
466
+ //update inventories obsolete to true
467
+ await tx.getRepository(Inventory).update({ id: In(foundObsoleteInventories) }, { obsolete: true })
437
468
 
438
- foundObsoleteInventories = foundObsoleteInventories
439
- .map(inv => {
440
- return "'" + inv.trim() + "'"
441
- })
442
- .join(',')
469
+ foundObsoleteInventories = foundObsoleteInventories
470
+ .map(inv => {
471
+ return "'" + inv.trim() + "'"
472
+ })
473
+ .join(',')
443
474
 
444
- //update any orders that is assigned with obsolete inventories
445
- await tx.getRepository(ReleaseGood).query(`
475
+ //update any orders that is assigned with obsolete inventories
476
+ await tx.getRepository(ReleaseGood).query(`
446
477
  update release_goods rg set status = 'OBSOLETE'
447
478
  from order_inventories oi
448
479
  where oi.release_good_id = rg.id
449
480
  and oi.inventory_id in (${foundObsoleteInventories})
450
481
  and rg.status in ('PICKING', 'PENDING_WORKSHEET', 'READY_TO_PICK')`)
451
482
 
452
- await tx.getRepository(Worksheet).query(`
483
+ await tx.getRepository(Worksheet).query(`
453
484
  update worksheets w set status = 'DEACTIVATED', updater_id = '${user.id}', assignee_id = null
454
485
  from worksheet_details wd
455
486
  inner join order_inventories oi on oi.id = wd.target_inventory_id
@@ -457,6 +488,21 @@ export async function completePicking(
457
488
  and oi.inventory_id in (${foundObsoleteInventories})
458
489
  `)
459
490
 
460
- return true
491
+ return true
492
+ }
493
+ } else {
494
+ let replenishment: Replenishment = await tx.getRepository(Replenishment).findOne({
495
+ where: { domain, name: releaseGoodNo }
496
+ })
497
+
498
+ const worksheet: Worksheet = await pickingWSCtrl.findWorksheetByRefOrder(
499
+ replenishment,
500
+ WORKSHEET_TYPE.PICKING_REPLENISHMENT,
501
+ ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
502
+ )
503
+
504
+ await replenishmentPickingWSCtrl.completeReplenishmentPicking(replenishment, worksheet)
505
+
506
+ await replenishmentPickingWSCtrl.generatePutawayReplenishmentWorksheet(releaseGoodNo)
461
507
  }
462
508
  }