@things-factory/worksheet-base 4.3.155 → 4.3.156

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