@things-factory/worksheet-base 4.3.238 → 4.3.241

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 (63) hide show
  1. package/dist-server/controllers/ecommerce/powrup-controller.js +3 -3
  2. package/dist-server/controllers/ecommerce/powrup-controller.js.map +1 -1
  3. package/dist-server/controllers/outbound/loading-worksheet-controller.js +36 -9
  4. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  5. package/dist-server/controllers/outbound/packing-worksheet-controller.js +1 -1
  6. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/outbound/picking-worksheet-controller.js +14 -8
  8. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/render-ro-do.js +21 -8
  10. package/dist-server/controllers/render-ro-do.js.map +1 -1
  11. package/dist-server/controllers/vas/vas-worksheet-controller.js +157 -31
  12. package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/worksheet-controller.js +21 -8
  14. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  15. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  16. package/dist-server/graphql/resolvers/worksheet/loading/undo-loading.js +4 -4
  17. package/dist-server/graphql/resolvers/worksheet/loading/undo-loading.js.map +1 -1
  18. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +62 -3
  19. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  20. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +1 -1
  21. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  22. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +1 -1
  23. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  24. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  25. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  26. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +19 -2
  27. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  28. package/dist-server/graphql/resolvers/worksheet/vas/complete-vas.js +22 -1
  29. package/dist-server/graphql/resolvers/worksheet/vas/complete-vas.js.map +1 -1
  30. package/dist-server/graphql/resolvers/worksheet/vas-worksheet.js +9 -7
  31. package/dist-server/graphql/resolvers/worksheet/vas-worksheet.js.map +1 -1
  32. package/dist-server/graphql/resolvers/worksheet/worksheet.js +31 -16
  33. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  34. package/dist-server/graphql/resolvers/worksheet-detail/create-worksheet-detail.js +3 -0
  35. package/dist-server/graphql/resolvers/worksheet-detail/create-worksheet-detail.js.map +1 -1
  36. package/dist-server/graphql/resolvers/worksheet-detail/worksheet-detail.js +1 -1
  37. package/dist-server/graphql/resolvers/worksheet-detail/worksheet-detail.js.map +1 -1
  38. package/dist-server/graphql/types/worksheet/index.js +2 -1
  39. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  40. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +1 -0
  41. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  42. package/package.json +11 -11
  43. package/server/controllers/ecommerce/powrup-controller.ts +3 -3
  44. package/server/controllers/outbound/loading-worksheet-controller.ts +38 -10
  45. package/server/controllers/outbound/packing-worksheet-controller.ts +1 -1
  46. package/server/controllers/outbound/picking-worksheet-controller.ts +15 -7
  47. package/server/controllers/render-ro-do.ts +25 -6
  48. package/server/controllers/vas/vas-worksheet-controller.ts +239 -49
  49. package/server/controllers/worksheet-controller.ts +21 -10
  50. package/server/graphql/resolvers/worksheet/loading/loading.ts +0 -2
  51. package/server/graphql/resolvers/worksheet/loading/undo-loading.ts +5 -4
  52. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +68 -2
  53. package/server/graphql/resolvers/worksheet/packing/packing.ts +1 -1
  54. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +1 -1
  55. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  56. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +21 -2
  57. package/server/graphql/resolvers/worksheet/vas/complete-vas.ts +27 -2
  58. package/server/graphql/resolvers/worksheet/vas-worksheet.ts +7 -5
  59. package/server/graphql/resolvers/worksheet/worksheet.ts +34 -13
  60. package/server/graphql/resolvers/worksheet-detail/create-worksheet-detail.ts +5 -1
  61. package/server/graphql/resolvers/worksheet-detail/worksheet-detail.ts +1 -1
  62. package/server/graphql/types/worksheet/index.ts +2 -1
  63. package/server/graphql/types/worksheet/worksheet-detail-info.ts +1 -0
@@ -1,13 +1,16 @@
1
- import { EntityManager, Equal, In, Not } from 'typeorm'
1
+ import { EntityManager, Equal, In, Not, getRepository, IsNull } from 'typeorm'
2
2
 
3
+ import { Domain } from '@things-factory/shell'
3
4
  import { User } from '@things-factory/auth-base'
4
5
  import { Bizplace } from '@things-factory/biz-base'
5
6
  import { Product } from '@things-factory/product-base'
6
7
  import {
7
8
  ArrivalNotice,
9
+ OrderInventory,
8
10
  ORDER_STATUS,
9
11
  ORDER_TYPES,
10
12
  ORDER_VAS_STATUS,
13
+ ORDER_INVENTORY_STATUS,
11
14
  OrderNoGenerator,
12
15
  OrderVas,
13
16
  ReleaseGood,
@@ -38,6 +41,8 @@ import {
38
41
  } from '../../graphql/resolvers/worksheet/vas-transactions'
39
42
  import { PackingUnits } from '../../graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging'
40
43
  import { ReferenceOrderType, WorksheetController } from '../worksheet-controller'
44
+ import { LoadingWorksheetController } from '../../controllers'
45
+ import { v4 as uuidv4 } from 'uuid'
41
46
 
42
47
  type CompleteTransactionType = (trxMgr: EntityManager, orderVas: OrderVas, user: User) => Promise<void>
43
48
 
@@ -681,7 +686,14 @@ export class VasWorksheetController extends WorksheetController {
681
686
  return inventory
682
687
  }
683
688
 
684
- async completeVAS(orderNo: string, orderType: string, vasWorksheetDetails: WorksheetDetail[]): Promise<Worksheet> {
689
+ async completeVAS(
690
+ tx: any,
691
+ domain: Domain,
692
+ user: User,
693
+ orderNo: string,
694
+ orderType: string,
695
+ vasWorksheetDetails: WorksheetDetail[]
696
+ ): Promise<Worksheet> {
685
697
  const ENTITY_MAP: { [key: string]: ArrivalNotice | ReleaseGood | VasOrder } = {
686
698
  [ORDER_TYPES.ARRIVAL_NOTICE]: ArrivalNotice,
687
699
  [ORDER_TYPES.RELEASE_OF_GOODS]: ReleaseGood,
@@ -695,7 +707,9 @@ export class VasWorksheetController extends WorksheetController {
695
707
  'worksheetDetails',
696
708
  'worksheetDetails.targetVas',
697
709
  'worksheetDetails.targetVas.vas',
698
- 'worksheetDetails.targetVas.inventory'
710
+ 'worksheetDetails.targetVas.inventory',
711
+ 'worksheetDetails.targetVas.orderVasItems',
712
+ 'worksheetDetails.targetVas.orderVasItems.vas'
699
713
  ])
700
714
 
701
715
  const isPureVAS: boolean = refOrder instanceof VasOrder
@@ -735,56 +749,59 @@ export class VasWorksheetController extends WorksheetController {
735
749
  }, [])
736
750
 
737
751
  for (const targetVas of targetVASs) {
738
- const { issue }: { issue: string } = foundWorksheetDetails.find(
739
- (wsd: WorksheetDetail) => wsd.targetVas.id === targetVas.id
740
- )
741
-
742
- // if (targetVas.operationGuide && (!issue || (targetVas.vas.name.toUpperCase() == VAS.REPACKAGING && issue))) {
743
- // await this.doOperationTransaction(targetVas)
744
- // } /*else if (targetVas.operationGuide && targetVas.vas.name.toUpperCase() === VAS.REPACKAGING && issue) {
745
- // await this.doOperationTransaction(targetVas)
746
- // }*/
752
+ if (targetVas.vas) {
753
+ // for old vas--> can be removed later
754
+ const { issue }: { issue: string } = foundWorksheetDetails.find(
755
+ (wsd: WorksheetDetail) => wsd.targetVas.id === targetVas.id
756
+ )
747
757
 
748
- if (targetVas.operationGuide && !issue) {
749
- await this.doOperationTransaction(targetVas)
750
- }
758
+ // if (targetVas.operationGuide && (!issue || (targetVas.vas.name.toUpperCase() == VAS.REPACKAGING && issue))) {
759
+ // await this.doOperationTransaction(targetVas)
760
+ // } /*else if (targetVas.operationGuide && targetVas.vas.name.toUpperCase() === VAS.REPACKAGING && issue) {
761
+ // await this.doOperationTransaction(targetVas)
762
+ // }*/
751
763
 
752
- if (targetVas.vas.name.toUpperCase() === VAS.UNPACKING && !(refOrder instanceof ArrivalNotice)) {
753
- // Update qty and uom value of parent inventory (only applies for pure vas and RO)
754
- const parentInventory: Inventory = targetVas.inventory
755
- let newParentInventory: Partial<Inventory> = Object.assign({}, parentInventory)
756
- newParentInventory.qty = parentInventory.qty - targetVas.qty
757
- newParentInventory.uomValue = Math.round((parentInventory.uomValue - targetVas.uomValue) * 100) / 100
758
- newParentInventory.lockedQty = parentInventory.lockedQty - targetVas.qty
759
- newParentInventory.lockedUomValue =
760
- Math.round((parentInventory.lockedUomValue - targetVas.uomValue) * 100) / 100
761
-
762
- // update qty and uomValue for VasOrder
763
- // if refOrder is from ReleaseGood, no need to update because this trxn is consider similar to LOADING trxn
764
- if (refOrder instanceof VasOrder) {
765
- await this.transactionInventory(
766
- newParentInventory,
767
- refOrder,
768
- -targetVas.qty,
769
- -targetVas.uomValue,
770
- INVENTORY_TRANSACTION_TYPE.UNPACKED
771
- )
772
- } else if (refOrder instanceof ReleaseGood) {
773
- await generateInventoryHistory(
774
- newParentInventory,
775
- refOrder,
776
- INVENTORY_TRANSACTION_TYPE.UNPACKED,
777
- 0,
778
- 0,
779
- this.user,
780
- this.trxMgr
781
- )
764
+ if (targetVas.operationGuide && !issue) {
765
+ await this.doOperationTransaction(targetVas)
782
766
  }
783
767
 
784
- // add TERMINATED status if inventory qty = 0
785
- if (newParentInventory.qty === 0) {
786
- newParentInventory.status = INVENTORY_STATUS.TERMINATED
787
- await this.transactionInventory(newParentInventory, refOrder, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
768
+ if (targetVas?.vas?.name.toUpperCase() === VAS.UNPACKING && !(refOrder instanceof ArrivalNotice)) {
769
+ // Update qty and uom value of parent inventory (only applies for pure vas and RO)
770
+ const parentInventory: Inventory = targetVas.inventory
771
+ let newParentInventory: Partial<Inventory> = Object.assign({}, parentInventory)
772
+ newParentInventory.qty = parentInventory.qty - targetVas.qty
773
+ newParentInventory.uomValue = Math.round((parentInventory.uomValue - targetVas.uomValue) * 100) / 100
774
+ newParentInventory.lockedQty = parentInventory.lockedQty - targetVas.qty
775
+ newParentInventory.lockedUomValue =
776
+ Math.round((parentInventory.lockedUomValue - targetVas.uomValue) * 100) / 100
777
+
778
+ // update qty and uomValue for VasOrder
779
+ // if refOrder is from ReleaseGood, no need to update because this trxn is consider similar to LOADING trxn
780
+ if (refOrder instanceof VasOrder) {
781
+ await this.transactionInventory(
782
+ newParentInventory,
783
+ refOrder,
784
+ -targetVas.qty,
785
+ -targetVas.uomValue,
786
+ INVENTORY_TRANSACTION_TYPE.UNPACKED
787
+ )
788
+ } else if (refOrder instanceof ReleaseGood) {
789
+ await generateInventoryHistory(
790
+ newParentInventory,
791
+ refOrder,
792
+ INVENTORY_TRANSACTION_TYPE.UNPACKED,
793
+ 0,
794
+ 0,
795
+ this.user,
796
+ this.trxMgr
797
+ )
798
+ }
799
+
800
+ // add TERMINATED status if inventory qty = 0
801
+ if (newParentInventory.qty === 0) {
802
+ newParentInventory.status = INVENTORY_STATUS.TERMINATED
803
+ await this.transactionInventory(newParentInventory, refOrder, 0, 0, INVENTORY_TRANSACTION_TYPE.TERMINATED)
804
+ }
788
805
  }
789
806
  }
790
807
  }
@@ -812,7 +829,180 @@ export class VasWorksheetController extends WorksheetController {
812
829
  ? ORDER_STATUS.LOADING
813
830
  : ORDER_STATUS.DONE
814
831
 
832
+ const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
833
+ domain: domain.id,
834
+ name: orderNo
835
+ })
836
+
837
+ let qbOrderVas = await getRepository(OrderVas).createQueryBuilder('ov')
838
+ qbOrderVas
839
+ .leftJoinAndSelect(OrderInventory, 'oi', 'oi.release_good_id = ov.release_good_id')
840
+ .leftJoinAndSelect('ov.releaseGood', 'releaseGood')
841
+ .leftJoinAndSelect('ov.product', 'product')
842
+ .leftJoinAndSelect('ov.productDetail', 'productDetail')
843
+ .leftJoinAndSelect('ov.newProduct', 'newProduct')
844
+ .leftJoinAndSelect('ov.newProductDetail', 'newProductDetail')
845
+ .andWhere('ov.domain_id = :domain')
846
+ .andWhere('ov.release_good_id = :releaseGood')
847
+ .andWhere('ov.new_product_id notnull')
848
+ .andWhere('ov.new_product_detail_id notnull')
849
+ .setParameters({ domain: domain.id, releaseGood: releaseGood.id })
850
+
851
+ const orderVasWithNewSku: OrderVas[] = await qbOrderVas.getMany()
852
+
853
+ // .find({
854
+ // domain,
855
+ // releaseGood,
856
+ // newTargetProduct: Not(IsNull()),
857
+ // newTargetProductDetail: Not(IsNull())
858
+ // })
859
+
860
+ if (orderVasWithNewSku.length > 0) {
861
+ // const productId = orderVasWithNewSku.map(ov => {
862
+ // return ov.product.id
863
+ // })
864
+
865
+ let qbOrderInventories = await getRepository(OrderInventory)
866
+ .createQueryBuilder('oi')
867
+ .leftJoinAndSelect('oi.product', 'product')
868
+ .leftJoinAndSelect('oi.productDetail', 'productDetail')
869
+ .leftJoinAndSelect('oi.domain', 'domain')
870
+ .leftJoinAndSelect('oi.bizplace', 'bizplace')
871
+ .leftJoinAndSelect('oi.releaseGood', 'releaseGood')
872
+ .leftJoinAndSelect('oi.inventory', 'inventory')
873
+ .leftJoinAndSelect('oi.orderProduct', 'orderProduct')
874
+ .andWhere('oi.domain_id = :domain')
875
+ .andWhere('oi.product_id IN (:...productId)')
876
+ // .andWhere('inventory.batch_id IN (:...batchId)')
877
+ .andWhere('oi.release_good_id = :releaseGood')
878
+ .setParameters({
879
+ domain: domain.id,
880
+ productId: orderVasWithNewSku.map(ov => {
881
+ return ov.product.id
882
+ }),
883
+ // batchId: orderVasWithNewSku.map(ov => {
884
+ // return ov.batchId
885
+ // }),
886
+ releaseGood: releaseGood.id
887
+ })
888
+
889
+ let orderInventoryOrderVas: OrderInventory[] = await qbOrderInventories.getMany()
890
+
891
+ let updateOrderInventory: OrderInventory[] = []
892
+
893
+ let orderInventory: OrderInventory = {}
894
+
895
+ let saveOrderInventory: OrderInventory[] = []
896
+
897
+ // for saving oi
898
+ let newTargetInventory: OrderInventory = new OrderInventory()
899
+
900
+ let newOi: OrderInventory
901
+ // fix inventory
902
+ orderVasWithNewSku.forEach(ov => {
903
+ orderInventory = orderInventoryOrderVas.filter(oi => {
904
+ if (oi.product.id == ov.product.id && oi.releaseQty > 0 && oi.batchId == ov.batchId) {
905
+ if (oi.batchId == ov.batchId) {
906
+ return oi
907
+ }
908
+ }
909
+ })
910
+ let qtyVas: number = ov.qty
911
+
912
+ try {
913
+ for (let i = 0; qtyVas !== 0; i++) {
914
+ const oi = orderInventory[i]
915
+ //update old OI
916
+ const updatedReleaseQty: number = qtyVas <= oi.releaseQty ? oi.releaseQty - qtyVas : 0
917
+ const updatedReleaseUomValue: number = parseFloat(
918
+ (updatedReleaseQty * (oi.releaseUomValue / oi.releaseQty)).toFixed(2)
919
+ )
920
+ updateOrderInventory = {
921
+ ...oi,
922
+ releaseQty: updatedReleaseQty,
923
+ pickedQty: oi.pickedQty,
924
+ status: updatedReleaseQty == 0 ? ORDER_INVENTORY_STATUS.TERMINATED : oi.status,
925
+ releaseUomValue: updatedReleaseUomValue,
926
+ updater: user,
927
+ updatedAt: new Date()
928
+ // cuFlag: 'M'
929
+ }
930
+
931
+ saveOrderInventory.push(updateOrderInventory)
932
+
933
+ // Duplicate oi for newSKU =
934
+ // new OrderInventory()
935
+ const newOiReleaseQty: number = qtyVas <= oi.releaseQty ? qtyVas : oi.releaseQty
936
+ //can delete
937
+ // const newOiReleaseUomValue: number = parseFloat((newOiReleaseQty * (ov.newUomValue / ov.qty)).toFixed(2))
938
+
939
+ newOi = {
940
+ ...oi,
941
+ id: uuidv4(),
942
+ name: uuidv4(),
943
+ // domain: orderInventory.domain,
944
+ // bizplace: orderInventory.bizplace,
945
+ // releaseGood: orderInventory.releaseGood,
946
+ // inventory: orderInventory.inventory,
947
+ orderProduct: null,
948
+ // status: orderInventory.status, // can remove
949
+ batchId: newOi ? `${newOi.batchId} , ${oi.batchId}` : oi.batchId,
950
+ type: ORDER_TYPES.VAS_ORDER,
951
+ status: ORDER_INVENTORY_STATUS.LOADING,
952
+ releaseQty: ov.outputQty,
953
+ pickedQty: 0,
954
+ packingType: ov.newPackingType,
955
+ packingSize: ov.newProductDetail.packingSize,
956
+ uom: ov.newUom,
957
+ releaseUomValue: ov.newUomValue,
958
+ product: ov.newProduct,
959
+ productId: ov.newProduct.id,
960
+ productDetail: ov.newProductDetail,
961
+ creator: user,
962
+ updater: user,
963
+ createdAt: new Date(),
964
+ updatedAt: new Date()
965
+ // cuFlag: '+'
966
+ }
967
+ qtyVas = qtyVas - newOiReleaseQty
968
+ newTargetInventory = newOi
969
+ }
970
+ saveOrderInventory.push(newTargetInventory)
971
+ } catch (e) {
972
+ console.log(e)
973
+ }
974
+ })
975
+ await tx.getRepository(OrderInventory).save(saveOrderInventory)
976
+ // await tx.getRepository(OrderInventory).save(updateOrderInventory)
977
+ // .update({ id: orderInventory.id }, updateOrderInventory)
978
+ }
979
+
980
+ let orderInventories: OrderInventory[] = await tx.getRepository(OrderInventory).find({
981
+ where: { domain: domain.id, releaseGood: releaseGood.id, status: Not(In([ORDER_INVENTORY_STATUS.TERMINATED])) }
982
+ // relations: ['product', 'productDetail', 'domain', 'bizplace', 'releaseGood', 'inventory', 'orderProduct']
983
+ })
984
+
985
+ // complete VAS worksheet
815
986
  worksheet = await this.completeWorksheet(worksheet, orderStatus)
987
+
988
+ //generate and activate loading worksheet
989
+ if (releaseGood) {
990
+ const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
991
+ let loadingWorksheet = await this.generateWorksheet(
992
+ WORKSHEET_TYPE.LOADING,
993
+ releaseGood,
994
+ orderInventories,
995
+ ORDER_STATUS.LOADING,
996
+ ORDER_INVENTORY_STATUS.LOADING
997
+ )
998
+ const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
999
+ await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
1000
+ // here
1001
+ // const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
1002
+ // const loadingWorksheetDetails: WorksheetDetail[] = loadingWorksheet.worksheetDetails
1003
+ // await loadingWSCtrl.activateLoading(loadingWorksheet.name, loadingWorksheetDetails)
1004
+ }
1005
+
816
1006
  return worksheet
817
1007
  }
818
1008
 
@@ -416,7 +416,7 @@ export class WorksheetController {
416
416
  let existingWorksheet: Worksheet
417
417
  try {
418
418
  existingWorksheet = await this.findWorksheetByRefOrder(refOrder, type)
419
- } catch (e) { }
419
+ } catch (e) {}
420
420
 
421
421
  if (existingWorksheet)
422
422
  throw new Error(
@@ -821,15 +821,26 @@ export class WorksheetController {
821
821
  worksheetType === WORKSHEET_TYPE.PICKING_REPLENISHMENT ||
822
822
  worksheetType === WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT
823
823
  ) {
824
- let targetInventories: OrderInventory[] = worksheet.worksheetDetails
825
- .filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
826
- .map((wsd: WorksheetDetail) => {
827
- let targetInventory: OrderInventory = wsd.targetInventory
828
- targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
829
- targetInventory.updater = this.user
830
- return targetInventory
831
- })
832
-
824
+ let targetInventories: OrderInventory[] = []
825
+ if (updatedRefOrderStatus == 'VAS') {
826
+ targetInventories = worksheet.worksheetDetails
827
+ .filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
828
+ .map((wsd: WorksheetDetail) => {
829
+ let targetInventory: OrderInventory = wsd.targetInventory
830
+ targetInventory.status = updatedRefOrderStatus
831
+ targetInventory.updater = this.user
832
+ return targetInventory
833
+ })
834
+ } else {
835
+ targetInventories = worksheet.worksheetDetails
836
+ .filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
837
+ .map((wsd: WorksheetDetail) => {
838
+ let targetInventory: OrderInventory = wsd.targetInventory
839
+ targetInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
840
+ targetInventory.updater = this.user
841
+ return targetInventory
842
+ })
843
+ }
833
844
  await this.updateOrderTargets(targetInventories)
834
845
  }
835
846
 
@@ -16,10 +16,8 @@ export const loadingResolver = {
16
16
  { domain, name: releaseGoodNo },
17
17
  ['bizplace', 'deliverTo']
18
18
  )
19
-
20
19
  const loadingWorksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
21
20
  let targetInventories: OrderInventory[] = worksheetDetails.map(itm => itm.targetInventory)
22
-
23
21
  const bizplace: Bizplace = releaseGood.bizplace
24
22
  orderInfo = {
25
23
  ...orderInfo,
@@ -5,9 +5,9 @@ import { EntityManager } from 'typeorm'
5
5
  import { LoadingWorksheetController } from '../../../../controllers'
6
6
 
7
7
  export const undoLoadingResolver = {
8
- async undoLoading(_: any, { deliveryOrder, palletIds }, context: any) {
8
+ async undoLoading(_: any, { deliveryOrder, palletIds, productIds }, context: any) {
9
9
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
10
- await undoLoading(tx, domain, user, deliveryOrder, palletIds)
10
+ await undoLoading(tx, domain, user, deliveryOrder, palletIds, productIds)
11
11
  }
12
12
  }
13
13
 
@@ -16,8 +16,9 @@ export async function undoLoading(
16
16
  domain: Domain,
17
17
  user: User,
18
18
  deliveryOrder: Partial<DeliveryOrder>,
19
- palletIds: string[]
19
+ palletIds: string[],
20
+ productIds: string[]
20
21
  ): Promise<void> {
21
22
  const worksheetController: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
22
- await worksheetController.undoLoading(deliveryOrder, palletIds)
23
+ await worksheetController.undoLoading(deliveryOrder, palletIds, productIds)
23
24
  }
@@ -6,6 +6,7 @@ import {
6
6
  OrderInventory,
7
7
  ReleaseGood,
8
8
  OrderTote,
9
+ OrderVas,
9
10
  OrderToteItem
10
11
  } from '@things-factory/sales-base'
11
12
  import { Domain } from '@things-factory/shell'
@@ -70,6 +71,7 @@ export const loadingWorksheetResolver = {
70
71
  },
71
72
  relations: [
72
73
  'targetInventory',
74
+ 'targetInventory.product',
73
75
  'targetInventory.orderProduct',
74
76
  'targetInventory.inventory',
75
77
  'targetInventory.inventory.location',
@@ -111,6 +113,20 @@ export const loadingWorksheetResolver = {
111
113
  foundWSD.sort((a, b) => (a.toteName > b.toteName ? 1 : -1))
112
114
  }
113
115
 
116
+ let foundOV: OrderVas[] = await getRepository(OrderVas).find({
117
+ where: {
118
+ domain,
119
+ releaseGood: releaseGood,
120
+ status: Not(Equal(WORKSHEET_STATUS.DONE))
121
+ },
122
+ relations: ['newProduct', 'product', 'newProductDetail']
123
+ })
124
+
125
+ if (foundOV.length > 0) {
126
+ foundWSD = await insertVas(foundWSD, foundOV)
127
+ // foundWSD = await formatLoadingDataVas(foundWSD)
128
+ }
129
+
114
130
  let worksheetDetailInfos = foundWSD
115
131
  .filter(itm => itm.targetInventory.releaseQty > 0)
116
132
  .map((loadingWSD: any) => {
@@ -121,7 +137,8 @@ export const loadingWorksheetResolver = {
121
137
  palletId: inventory.palletId,
122
138
  batchId: inventory.batchId,
123
139
  batchIdRef: inventory.batchIdRef,
124
- product: inventory.product,
140
+ product: targetInventory.product,
141
+ pickedQty: targetInventory.pickedQty,
125
142
  releaseQty: targetInventory.releaseQty,
126
143
  releaseUomValue: targetInventory.releaseUomValue,
127
144
  status: loadingWSD.status,
@@ -130,7 +147,8 @@ export const loadingWorksheetResolver = {
130
147
  packingType: inventory.packingType,
131
148
  packingSize: inventory.packingSize,
132
149
  inventory: targetInventory.inventory,
133
- toteName: loadingWSD.toteName
150
+ toteName: loadingWSD.toteName,
151
+ targetVas: loadingWSD.targetVas
134
152
  }
135
153
  })
136
154
 
@@ -146,3 +164,51 @@ export const loadingWorksheetResolver = {
146
164
  }
147
165
  }
148
166
  }
167
+
168
+ export async function insertVas(wsd, ov) {
169
+ wsd = wsd.map(wd => {
170
+ for (let i = 0; i < ov.length; i++) {
171
+ // if (ov[i].newTargetProduct) {
172
+ if (wd.targetInventory.productId == ov[i].product.id && wd.targetInventory.batchId == ov[i].batchId) {
173
+ wd.targetVas = ov[i]
174
+ }
175
+ // }
176
+ }
177
+ return wd
178
+ })
179
+ return wsd
180
+ // }
181
+ }
182
+
183
+ // export async function formatLoadingDataVas(wsd) {
184
+ // let formattedData: WorksheetDetail[] = []
185
+ // formattedData = wsd.map(wd => {
186
+ // if (wd.targetVas) {
187
+ // if (wd.targetVas.newTargetProduct) {
188
+ // const newQty = wd.targetInventory.releaseQty - wd.targetVas.qty
189
+ // wd.targetInventory.releaseQty = newQty
190
+ // wd.targetInventory.pickedQty = newQty
191
+ // const newSku: WorksheetDetail = {
192
+ // ...wd,
193
+ // targetVas: null,
194
+ // targetInventory: {
195
+ // ...wd.targetInventory,
196
+ // releaseQty: wd.targetVas.outputQty,
197
+ // pickedQty: wd.targetVas.outputQty,
198
+ // inventory: { ...wd.targetInventory.inventory, product: wd.targetVas.newTargetProduct }
199
+ // }
200
+ // }
201
+ // wsd.push(newSku)
202
+ // }
203
+ // }
204
+ // return wd
205
+ // })
206
+
207
+ // formattedData = wsd.splice(wd => wd.targetInventory.pickedQty == 0)
208
+
209
+ // // formattedData = formattedData.sort((a, b) =>
210
+ // // a.targetInventory.inventory.batchId > b ? 1 : a.targetVas && !b.targetVas ? -1 : a.targetVas && !b.targetVas ? 1 : 0
211
+ // // )
212
+
213
+ // return formattedData
214
+ // }
@@ -43,7 +43,7 @@ export async function packing(
43
43
  break
44
44
 
45
45
  case ApplicationType.POWRUP:
46
- const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
46
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
47
47
 
48
48
  if (powrup) {
49
49
  const powrupCtrl: PowrupController = new PowrupController(tx, domain, user)
@@ -212,7 +212,7 @@ export const packingWorksheetResolver = {
212
212
  break
213
213
 
214
214
  case ApplicationType.POWRUP:
215
- const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
215
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
216
216
 
217
217
  if (powrup) {
218
218
  // asynchronously get document from powrup
@@ -134,7 +134,7 @@ export async function completeBatchPicking(
134
134
  break
135
135
 
136
136
  case ApplicationType.POWRUP:
137
- const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
137
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
138
138
 
139
139
  if (powrup) {
140
140
  const initPowrupShipment = async (powrup: Powrup, foundReleaseGood: ReleaseGood) => {
@@ -23,6 +23,7 @@ import {
23
23
  OrderPackage,
24
24
  OrderPackageItem,
25
25
  OrderProduct,
26
+ OrderVas,
26
27
  ReleaseGood,
27
28
  Replenishment
28
29
  } from '@things-factory/sales-base'
@@ -43,6 +44,7 @@ import { EcommerceController } from '../../../../controllers/ecommerce'
43
44
  import { WorksheetController } from '../../../../controllers/worksheet-controller'
44
45
  import { Worksheet, WorksheetDetail } from '../../../../entities'
45
46
  import { createLmdParcel } from '../../../../utils'
47
+ import { activateVas } from '../vas/activate-vas'
46
48
 
47
49
  export const completePickingResolver = {
48
50
  async completePicking(_: any, { releaseGoodNo }, context: any) {
@@ -156,7 +158,7 @@ export async function completePicking(
156
158
  break
157
159
 
158
160
  case ApplicationType.POWRUP:
159
- const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true })
161
+ const powrup: Powrup = await tx.getRepository(Powrup).findOne({ active: true, platform: 'POWRUP' })
160
162
 
161
163
  if (powrup) {
162
164
  const initPowrupShipment = async powrup => {
@@ -400,8 +402,25 @@ export async function completePicking(
400
402
  }
401
403
  })
402
404
 
405
+ let orderVas: OrderVas[] = await tx.getRepository(OrderVas).find({ where: { domain: domain, releaseGood } })
406
+ if (orderVas) {
407
+ try {
408
+ const vasWorksheet: Worksheet = await tx
409
+ .getRepository(Worksheet)
410
+ .findOne({ where: { releaseGood, type: WORKSHEET_TYPE.VAS } })
411
+
412
+ const vasWorksheetDetails: WorksheetDetail[] = await tx
413
+ .getRepository(WorksheetDetail)
414
+ .find({ where: { domain: domain, worksheet: vasWorksheet.id } })
415
+
416
+ if (vasWorksheet) {
417
+ await activateVas(tx, domain, user, vasWorksheet.name, vasWorksheetDetails)
418
+ }
419
+ } catch (e) { }
420
+ }
421
+ // Can improve by applying "Else" since if got VAS user has to complete then only we generate loading worksheet
403
422
  if (!existLoadingWorksheet && !releaseGood.courierOption && !releaseGood.packingOption) {
404
- if (pickedTargetInventories.length > 0) {
423
+ if (pickedTargetInventories.length > 0 && orderVas.length == 0) {
405
424
  const loadingWSCtrl: LoadingWorksheetController = new LoadingWorksheetController(tx, domain, user)
406
425
  let loadingWorksheet: Worksheet = await loadingWSCtrl.generateLoadingWorksheet(
407
426
  releaseGoodNo,
@@ -1,7 +1,7 @@
1
1
  import { User } from '@things-factory/auth-base'
2
2
  import { ArrivalNotice, ReleaseGood } from '@things-factory/sales-base'
3
3
  import { Domain } from '@things-factory/shell'
4
- import { EntityManager } from 'typeorm'
4
+ import { EntityManager, getRepository, In } from 'typeorm'
5
5
  import { WORKSHEET_TYPE } from '../../../../constants'
6
6
  import { LoadingWorksheetController, PutawayWorksheetController, VasWorksheetController } from '../../../../controllers'
7
7
  import { Worksheet, WorksheetDetail } from '../../../../entities'
@@ -9,6 +9,24 @@ import { Worksheet, WorksheetDetail } from '../../../../entities'
9
9
  export const completeVasResolver = {
10
10
  async completeVas(_: any, { orderNo, orderType, worksheetDetails }, context: any) {
11
11
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
12
+ if (!worksheetDetails) {
13
+ const releaseGood: ReleaseGood = await getRepository(ReleaseGood).findOne({
14
+ domain: domain.id,
15
+ name: orderNo
16
+ })
17
+ const worksheet: Worksheet[] = await getRepository(Worksheet).find({
18
+ domain: domain.id,
19
+ releaseGood: releaseGood.id,
20
+ type: WORKSHEET_TYPE.VAS
21
+ })
22
+ const worksheetId = worksheet.map(w => {
23
+ return w.id
24
+ })
25
+ worksheetDetails = await getRepository(WorksheetDetail).find({
26
+ domain: domain.id,
27
+ worksheet: In(worksheetId)
28
+ })
29
+ }
12
30
  await completeVAS(tx, domain, user, orderNo, orderType, worksheetDetails)
13
31
  }
14
32
  }
@@ -22,7 +40,14 @@ export async function completeVAS(
22
40
  worksheetDetails: WorksheetDetail[]
23
41
  ): Promise<Worksheet> {
24
42
  const worksheetController: VasWorksheetController = new VasWorksheetController(tx, domain, user)
25
- let worksheet: Worksheet = await worksheetController.completeVAS(orderNo, orderType, worksheetDetails)
43
+ let worksheet: Worksheet = await worksheetController.completeVAS(
44
+ tx,
45
+ domain,
46
+ user,
47
+ orderNo,
48
+ orderType,
49
+ worksheetDetails
50
+ )
26
51
 
27
52
  // if (orderType === ORDER_TYPES.ARRIVAL_NOTICE) {
28
53
  // if (!worksheet.worksheetDetails?.length || !worksheet.arrivalNotice?.id) {