@things-factory/worksheet-base 4.3.186 → 4.3.188

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