@things-factory/worksheet-base 5.0.0-alpha.3 → 5.0.0-alpha.30

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 (131) hide show
  1. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +301 -2
  2. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/loading-worksheet-controller.js +10 -0
  4. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +352 -11
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  10. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +110 -3
  12. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/render-grn.js +27 -3
  14. package/dist-server/controllers/render-grn.js.map +1 -1
  15. package/dist-server/controllers/render-invoices.js +103 -65
  16. package/dist-server/controllers/render-invoices.js.map +1 -1
  17. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  18. package/dist-server/controllers/render-orientage-grn.js +1 -0
  19. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  20. package/dist-server/controllers/render-ro-do.js +65 -1
  21. package/dist-server/controllers/render-ro-do.js.map +1 -1
  22. package/dist-server/controllers/worksheet-controller.js +15 -0
  23. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  25. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  27. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  29. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +16 -2
  31. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  32. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  33. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  35. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  37. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  38. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  39. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  40. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +152 -132
  41. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  42. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  43. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +0 -17
  45. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +4 -7
  49. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  51. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  52. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  53. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  55. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  57. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  59. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  61. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  63. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  64. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  65. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  66. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  68. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  69. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +4 -5
  70. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  71. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +4 -2
  72. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  73. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  74. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  75. package/dist-server/graphql/types/worksheet/index.js +30 -4
  76. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  77. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +3 -0
  78. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  79. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  80. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  81. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  82. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  83. package/dist-server/index.js +4 -0
  84. package/dist-server/index.js.map +1 -1
  85. package/dist-server/utils/inventory-util.js +14 -25
  86. package/dist-server/utils/inventory-util.js.map +1 -1
  87. package/package.json +17 -17
  88. package/server/controllers/inbound/unloading-worksheet-controller.ts +363 -6
  89. package/server/controllers/outbound/loading-worksheet-controller.ts +13 -0
  90. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  91. package/server/controllers/outbound/picking-worksheet-controller.ts +465 -16
  92. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  93. package/server/controllers/outbound/sorting-worksheet-controller.ts +149 -4
  94. package/server/controllers/render-grn.ts +39 -5
  95. package/server/controllers/render-invoices.ts +119 -72
  96. package/server/controllers/render-orientage-do.ts +11 -11
  97. package/server/controllers/render-orientage-grn.ts +12 -11
  98. package/server/controllers/render-ro-do.ts +93 -8
  99. package/server/controllers/worksheet-controller.ts +18 -2
  100. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  101. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  102. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  103. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +25 -6
  104. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  105. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  106. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  107. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  108. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  109. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  110. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +0 -18
  111. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  112. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +5 -7
  113. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  114. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +5 -4
  115. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +5 -4
  116. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  117. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  118. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  119. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  120. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  121. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  122. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  123. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +10 -12
  124. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +4 -2
  125. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  126. package/server/graphql/types/worksheet/index.ts +30 -4
  127. package/server/graphql/types/worksheet/worksheet-detail-info.ts +3 -0
  128. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  129. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  130. package/server/index.ts +4 -0
  131. package/server/utils/inventory-util.ts +15 -23
@@ -20,11 +20,14 @@ import {
20
20
  VAS_TYPES
21
21
  } from '@things-factory/sales-base'
22
22
  import { Domain } from '@things-factory/shell'
23
+ import { PartnerSetting, Setting } from '@things-factory/setting-base'
23
24
  import {
24
25
  Inventory,
26
+ INVENTORY_ITEM_SOURCE,
25
27
  INVENTORY_STATUS,
26
28
  INVENTORY_TRANSACTION_TYPE,
27
29
  InventoryHistory,
30
+ InventoryItem,
28
31
  InventoryNoGenerator,
29
32
  Location,
30
33
  Pallet,
@@ -33,7 +36,7 @@ import {
33
36
 
34
37
  import { RULE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
35
38
  import { Worksheet, WorksheetDetail } from '../../entities'
36
- import { DateGenerator } from '../../utils'
39
+ import { DateGenerator, generateInventoryHistory } from '../../utils'
37
40
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
38
41
 
39
42
  export type UnloadingWorksheetDetail = Partial<WorksheetDetail> & {
@@ -241,6 +244,189 @@ export class UnloadingWorksheetController extends VasWorksheetController {
241
244
  }
242
245
  }
243
246
 
247
+ async scanSerialNumberUnload(
248
+ worksheetDetailName: string,
249
+ serialNumber: string,
250
+ inventory: Partial<Inventory>
251
+ ): Promise<void> {
252
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
253
+ where: {
254
+ name: worksheetDetailName,
255
+ status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED))
256
+ },
257
+ relations: [
258
+ 'bizplace',
259
+ 'worksheet',
260
+ 'worksheet.arrivalNotice',
261
+ 'worksheet.returnOrder',
262
+ 'worksheet.bufferLocation',
263
+ 'worksheet.bufferLocation.warehouse',
264
+ 'targetProduct',
265
+ 'targetProduct.product',
266
+ 'targetProduct.product.productDetails',
267
+ 'targetProduct.product.productDetails.childProductDetail',
268
+ 'targetInventory',
269
+ 'targetInventory.product',
270
+ 'targetInventory.product.productDetails',
271
+ 'targetInventory.product.productDetails.childProductDetail'
272
+ ]
273
+ })
274
+ if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
275
+
276
+ if (!inventory?.palletId)
277
+ inventory.palletId = await generateId({
278
+ domain: this.domain,
279
+ type: RULE_TYPE.LOT_NUMBER_ID,
280
+ seed: { date: DateGenerator.generateDate() }
281
+ })
282
+
283
+ const bizplace: Bizplace = worksheetDetail.bizplace
284
+ const worksheet: Worksheet = worksheetDetail.worksheet
285
+ const arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
286
+ const returnOrder: ReturnOrder = worksheet.returnOrder
287
+ const targetProduct: OrderProduct = worksheetDetail.targetProduct
288
+ const targetInventory: OrderInventory = worksheetDetail.targetInventory
289
+ const product: Product = Boolean(arrivalNotice) ? targetProduct.product : targetInventory.product
290
+ const packingType: string = Boolean(arrivalNotice) ? targetProduct.packingType : targetInventory.packingType
291
+ const packingSize: number = Boolean(arrivalNotice) ? targetProduct.packingSize : targetInventory.packingSize
292
+ const batchId: string = Boolean(arrivalNotice) ? targetProduct.batchId : targetInventory.batchId
293
+ let qty: number = 0
294
+ let uom: string = Boolean(arrivalNotice) ? targetProduct.uom : targetInventory.uom
295
+ const cartonId: string = inventory.cartonId
296
+ const orderId: string = Boolean(arrivalNotice) ? arrivalNotice.id : returnOrder.id
297
+ await this.checkSerialNumberDuplication(serialNumber, product)
298
+
299
+ qty++
300
+
301
+ const invQb: SelectQueryBuilder<Inventory> = await this.trxMgr
302
+ .getRepository(Inventory)
303
+ .createQueryBuilder('INV')
304
+ .where('INV.domain_id = :domainId', { domainId: this.domain.id })
305
+ .andWhere('INV.bizplace_id = :bizplaceId', { bizplaceId: bizplace.id })
306
+ .andWhere('INV.product_id = :productId', { productId: product.id })
307
+ .andWhere('INV.batch_id = :batchId', { batchId: batchId })
308
+ .andWhere('INV.packing_type = :packingType', { packingType: packingType })
309
+ .andWhere('INV.packing_size = :packingSize', { packingSize: packingSize })
310
+
311
+ if (arrivalNotice) invQb.andWhere('INV.ref_order_id = :arrivalNoticeId', { arrivalNoticeId: arrivalNotice.id })
312
+ else if (returnOrder) invQb.andWhere('INV.ref_order_id = :returnOrderId', { returnOrderId: returnOrder.id })
313
+
314
+ if (inventory?.expirationDate) {
315
+ invQb.andWhere('INV.expiration_date = :expirationDate', {
316
+ expirationDate: inventory.expirationDate
317
+ })
318
+ }
319
+
320
+ if (inventory?.cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: inventory.cartonId })
321
+ else invQb.andWhere('INV.pallet_id = :palletId', { palletId: inventory.palletId })
322
+
323
+ let foundInventory: Inventory = await invQb.getOne()
324
+
325
+ const batchIdRef: string = Boolean(arrivalNotice) ? targetProduct.batchIdRef : null
326
+ const remark: string = Boolean(arrivalNotice) ? targetProduct.remark : targetInventory.remark
327
+ const manufactureDate: number = Boolean(arrivalNotice) ? targetProduct.manufactureDate : null
328
+ const location: Location = worksheet.bufferLocation
329
+ const warehouse: Warehouse = location.warehouse
330
+ const zone: string = location.zone
331
+ const unitCost: number = Boolean(arrivalNotice)
332
+ ? targetProduct?.unitPrice
333
+ ? ((targetProduct.packQty * targetProduct.unitPrice + targetProduct.miscAmt - targetProduct.discountAmt) *
334
+ (1 + targetProduct.taxRate / 100)) /
335
+ targetProduct.packQty
336
+ : 0
337
+ : null
338
+
339
+ if (!foundInventory) {
340
+ let newInventory: Partial<Inventory> = new Inventory()
341
+ newInventory.bizplace = bizplace
342
+ newInventory.domain = this.domain
343
+ newInventory.name = InventoryNoGenerator.inventoryName()
344
+ newInventory.palletId = inventory.palletId
345
+ newInventory.cartonId = inventory.cartonId
346
+ newInventory.batchId = batchId
347
+ newInventory.batchIdRef = batchIdRef
348
+ newInventory.product = product
349
+ newInventory.packingType = packingType
350
+ newInventory.packingSize = packingSize
351
+ newInventory.uom = uom
352
+ newInventory.remark = remark
353
+ newInventory.qty = qty
354
+ newInventory.uomValue =
355
+ Math.round(
356
+ qty *
357
+ (Boolean(arrivalNotice)
358
+ ? targetProduct.uomValue
359
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
360
+ 100
361
+ ) / 100
362
+ newInventory.manufactureDate = manufactureDate
363
+ newInventory.refOrderId = orderId
364
+ newInventory.unitCost = unitCost
365
+ if (inventory.reusablePallet?.id) {
366
+ newInventory.reusablePallet = await this.trxMgr.getRepository(Pallet).findOne(inventory.reusablePallet.id)
367
+ }
368
+ newInventory.orderProductId = Boolean(arrivalNotice) ? targetProduct.id : null
369
+ newInventory.orderInventoryId = Boolean(returnOrder) ? targetInventory.id : null
370
+ newInventory.warehouse = warehouse
371
+ newInventory.location = location
372
+ newInventory.zone = zone
373
+ newInventory.status = INVENTORY_STATUS.CHECKED
374
+ newInventory.creator = this.user
375
+
376
+ if (inventory?.expirationDate) {
377
+ newInventory.expirationDate = new Date(inventory.expirationDate)
378
+ }
379
+
380
+ if (arrivalNotice) {
381
+ targetProduct.actualPalletQty++
382
+ targetProduct.actualPackQty = Boolean(targetProduct.actualPackQty) ? targetProduct.actualPackQty + qty : qty
383
+ } else if (returnOrder) {
384
+ targetInventory.actualPalletQty++
385
+ targetInventory.actualPackQty = Boolean(targetInventory.actualPackQty)
386
+ ? targetInventory.actualPackQty + qty
387
+ : qty
388
+ }
389
+ foundInventory = await this.trxMgr.getRepository(Inventory).save(newInventory)
390
+ } else {
391
+ const updatedQty: number = foundInventory.qty + qty
392
+ foundInventory.expirationDate = new Date(foundInventory.expirationDate)
393
+ foundInventory.qty = updatedQty
394
+ foundInventory.uomValue +=
395
+ Math.round(
396
+ qty *
397
+ (Boolean(arrivalNotice)
398
+ ? targetProduct.uomValue
399
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
400
+ 100
401
+ ) / 100
402
+ if (arrivalNotice) targetProduct.actualPackQty = targetProduct.actualPackQty + qty
403
+ else if (returnOrder) targetInventory.actualPackQty = targetInventory.actualPackQty + qty
404
+ foundInventory = await this.trxMgr.getRepository(Inventory).save(foundInventory)
405
+ }
406
+
407
+ let inventoryItem: InventoryItem = new InventoryItem()
408
+ inventoryItem.name = InventoryNoGenerator.inventoryItemName()
409
+ inventoryItem.serialNumber = serialNumber
410
+ inventoryItem.status = foundInventory.status
411
+ inventoryItem.inboundOrderId = foundInventory.refOrderId
412
+ inventoryItem.product = product
413
+ inventoryItem.inventory = foundInventory
414
+ inventoryItem.source = INVENTORY_ITEM_SOURCE.INBOUND
415
+ inventoryItem.domain = this.domain
416
+ inventoryItem.creator = this.user
417
+ inventoryItem.updater = this.user
418
+
419
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
420
+
421
+ if (arrivalNotice) {
422
+ targetProduct.updater = this.user
423
+ this.updateOrderTargets([targetProduct])
424
+ } else if (returnOrder) {
425
+ targetInventory.updater = this.user
426
+ this.updateOrderTargets([targetInventory])
427
+ }
428
+ }
429
+
244
430
  async scanProductUnload(
245
431
  worksheetDetailName: string,
246
432
  productBarcode: string,
@@ -561,6 +747,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
561
747
  targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
562
748
  } else {
563
749
  targetProduct.actualPackQty--
750
+ // targetProduct.actualPalletQty--
564
751
  }
565
752
  targetProduct.updater = this.user
566
753
  await this.updateOrderTargets([targetProduct])
@@ -587,6 +774,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
587
774
  targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
588
775
  } else {
589
776
  targetInventory.actualPackQty--
777
+ // targetInventory.actualPalletQty--
590
778
  }
591
779
  targetInventory.updater = this.user
592
780
  await this.updateOrderTargets([targetInventory])
@@ -656,6 +844,60 @@ export class UnloadingWorksheetController extends VasWorksheetController {
656
844
  }
657
845
  }
658
846
 
847
+ async undoSerialNumberUnload(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
848
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
849
+ where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
850
+ relations: [
851
+ 'worksheet',
852
+ 'worksheet.arrivalNotice',
853
+ 'worksheet.returnOrder',
854
+ 'targetProduct',
855
+ 'targetProduct.product'
856
+ ]
857
+ })
858
+
859
+ let worksheet: Worksheet = worksheetDetail.worksheet
860
+ let arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
861
+ let returnOrder: ReturnOrder = worksheet.returnOrder
862
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
863
+ let targetProduct: OrderProduct = worksheetDetail.targetProduct
864
+ let inventoryItem: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
865
+ where: { domain: this.domain, id: inventoryItemId },
866
+ relations: ['inventory', 'product']
867
+ })
868
+ let inventory: Inventory = inventoryItem.inventory
869
+
870
+ await this.trxMgr.getRepository(InventoryItem).delete(inventoryItem.id)
871
+
872
+ inventory.qty--
873
+ inventory.uomValue =
874
+ Math.round(
875
+ inventory.qty *
876
+ (Boolean(arrivalNotice)
877
+ ? targetProduct.uomValue
878
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
879
+ 100
880
+ ) / 100
881
+ await this.trxMgr
882
+ .getRepository(Inventory)
883
+ .update({ id: inventory.id }, { qty: inventory.qty, uomValue: inventory.uomValue })
884
+
885
+ targetProduct.actualPackQty--
886
+
887
+ const inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
888
+ where: { domain: this.domain, inboundOrderId: arrivalNotice.id, inventory }
889
+ })
890
+
891
+ if (inventoryItems?.length == 0) {
892
+ await this.trxMgr.getRepository(Inventory).delete(inventory.id)
893
+
894
+ targetProduct.actualPalletQty--
895
+ }
896
+
897
+ targetProduct.updater = this.user
898
+ await this.updateOrderTargets([targetProduct])
899
+ }
900
+
659
901
  async activateUnloading(
660
902
  worksheetNo: string,
661
903
  unloadingWorksheetDetails: UnloadingWorksheetDetail[]
@@ -715,6 +957,70 @@ export class UnloadingWorksheetController extends VasWorksheetController {
715
957
  return worksheet
716
958
  }
717
959
 
960
+ async getProductScanningVal(arrivalNotice: ArrivalNotice) {
961
+ let productScanning: string = 'false'
962
+ const enableProductScanning: Setting = await this.trxMgr.getRepository(Setting).findOne({
963
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-product-scanning' }
964
+ })
965
+
966
+ if (enableProductScanning) productScanning = enableProductScanning.value
967
+
968
+ const partnerEnableProductScanning: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
969
+ where: { setting: enableProductScanning, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
970
+ })
971
+
972
+ if (partnerEnableProductScanning) productScanning = partnerEnableProductScanning.value
973
+
974
+ return productScanning
975
+ }
976
+
977
+ async getInputQtyVal(arrivalNotice: ArrivalNotice) {
978
+ let inputQty: string = 'false'
979
+ const enableInputQty: Setting = await this.trxMgr.getRepository(Setting).findOne({
980
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-input-qty' }
981
+ })
982
+
983
+ if (enableInputQty) inputQty = enableInputQty.value
984
+
985
+ const partnerEnableInputQty: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
986
+ where: { setting: enableInputQty, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
987
+ })
988
+
989
+ if (partnerEnableInputQty) inputQty = partnerEnableInputQty.value
990
+
991
+ return inputQty
992
+ }
993
+
994
+ // only creates inventory history upon partial or full unload when
995
+ // productScanning is true
996
+ // inputQty is false
997
+ async createInventoryHistory(arrivalNotice: ArrivalNotice, inventories?: Inventory[]) {
998
+ try {
999
+ if (inventories === undefined) {
1000
+ const inventoryList = await this.trxMgr.getRepository(Inventory).findAndCount({
1001
+ where: {
1002
+ domain: this.domain,
1003
+ refOrderId: arrivalNotice.id
1004
+ }
1005
+ })
1006
+
1007
+ inventories = inventoryList[0]
1008
+ }
1009
+
1010
+ for (const inventory of inventories) {
1011
+ await this.transactionInventory(
1012
+ inventory,
1013
+ arrivalNotice,
1014
+ inventory.qty,
1015
+ inventory.uomValue,
1016
+ INVENTORY_TRANSACTION_TYPE.UNLOADING
1017
+ )
1018
+ }
1019
+ } catch (e) {
1020
+ throw e
1021
+ }
1022
+ }
1023
+
718
1024
  async completeUnloading(
719
1025
  arrivalNoticeNo: string,
720
1026
  unloadingWorksheetDetails: Partial<WorksheetDetail>[]
@@ -722,7 +1028,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
722
1028
  let arrivalNotice: ArrivalNotice = await this.findRefOrder(
723
1029
  ArrivalNotice,
724
1030
  { domain: this.domain, name: arrivalNoticeNo, status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY]) },
725
- ['orderProducts', 'releaseGood']
1031
+ ['orderProducts', 'releaseGood', 'bizplace', 'bizplace.domain']
726
1032
  )
727
1033
 
728
1034
  if (arrivalNotice.crossDocking) {
@@ -785,6 +1091,47 @@ export class UnloadingWorksheetController extends VasWorksheetController {
785
1091
  await this.completeWorksheet(worksheet)
786
1092
  }
787
1093
 
1094
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1095
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1096
+ if (productScanning === 'true' && inputQty === 'false') await this.createInventoryHistory(arrivalNotice)
1097
+
1098
+ const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
1099
+ where: {
1100
+ domain: this.domain,
1101
+ refOrderId: arrivalNotice.id,
1102
+ status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED])
1103
+ },
1104
+ relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
1105
+ })
1106
+
1107
+ for (let inventory of inventories) {
1108
+ let inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
1109
+ where: { domain: this.domain, inventory }
1110
+ })
1111
+
1112
+ if (inventoryItems?.length) {
1113
+ inventory.status = INVENTORY_STATUS.STORED
1114
+
1115
+ await Promise.all(
1116
+ inventoryItems.map(async inventoryItem => {
1117
+ await this.trxMgr
1118
+ .getRepository(InventoryItem)
1119
+ .update({ id: inventoryItem.id }, { status: INVENTORY_STATUS.STORED })
1120
+ })
1121
+ )
1122
+
1123
+ await generateInventoryHistory(
1124
+ inventory,
1125
+ arrivalNotice,
1126
+ INVENTORY_TRANSACTION_TYPE.UNLOADING,
1127
+ inventory.qty,
1128
+ inventory.uomValue,
1129
+ this.user,
1130
+ this.trxMgr
1131
+ )
1132
+ }
1133
+ }
1134
+
788
1135
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
789
1136
  where: {
790
1137
  arrivalNotice,
@@ -828,10 +1175,15 @@ export class UnloadingWorksheetController extends VasWorksheetController {
828
1175
  arrivalNoticeNo: string,
829
1176
  unloadingWorksheetDetail: Partial<WorksheetDetail>[]
830
1177
  ): Promise<Worksheet> {
831
- const arrivalNotice: ArrivalNotice = await this.findRefOrder(ArrivalNotice, {
832
- name: arrivalNoticeNo,
833
- status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
834
- })
1178
+ const arrivalNotice: ArrivalNotice = await this.findRefOrder(
1179
+ ArrivalNotice,
1180
+ {
1181
+ domain: this.domain,
1182
+ name: arrivalNoticeNo,
1183
+ status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
1184
+ },
1185
+ ['bizplace', 'bizplace.domain']
1186
+ )
835
1187
 
836
1188
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(arrivalNotice, WORKSHEET_TYPE.UNLOADING, [
837
1189
  'worksheetDetails',
@@ -870,6 +1222,11 @@ export class UnloadingWorksheetController extends VasWorksheetController {
870
1222
  })
871
1223
  await this.trxMgr.getRepository(Inventory).save(inventories)
872
1224
 
1225
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1226
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1227
+ if (productScanning === 'true' && inputQty === 'false')
1228
+ await this.createInventoryHistory(arrivalNotice, inventories)
1229
+
873
1230
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
874
1231
  where: {
875
1232
  arrivalNotice,
@@ -118,6 +118,15 @@ export class LoadingWorksheetController extends VasWorksheetController {
118
118
  const pickedQty: number = targetInventory.releaseQty
119
119
  let inventory: Inventory = targetInventory.inventory
120
120
 
121
+ targetInventory.loadedAt = new Date()
122
+ targetInventory.loadedByUser = this.user;
123
+
124
+ let loadedBy: string[] = targetInventory.loadedBy ? (targetInventory.loadedBy).split(',') : []
125
+ if (!loadedBy.find(x => x == this.user.name)) {
126
+ loadedBy.push(this.user.name)
127
+ targetInventory.loadedBy = loadedBy.join(',')
128
+ }
129
+
121
130
  if (loadedQty > pickedQty) {
122
131
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('load', `loaded quantity can't exceed picked qty`))
123
132
  } else if (loadedQty == pickedQty) {
@@ -205,6 +214,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
205
214
  undoTargetOrderInventory.deliveryOrder = null
206
215
  undoTargetOrderInventory.updater = this.user
207
216
 
217
+ undoTargetOrderInventory.loadedAt = null
218
+ undoTargetOrderInventory.loadedByUser = null
219
+ undoTargetOrderInventory.loadedBy = null
220
+
208
221
  let prevTargetInventory: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
209
222
  where: {
210
223
  domain: this.domain,