@things-factory/worksheet-base 4.3.539 → 4.3.541

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.
@@ -1,6 +1,7 @@
1
1
  import { EntityManager, Equal, getConnection, getManager, In, IsNull, Not } from 'typeorm'
2
+ import { v4 as uuidv4 } from 'uuid'
2
3
 
3
- import { ApplicationType } from '@things-factory/auth-base'
4
+ import { ApplicationType, User } from '@things-factory/auth-base'
4
5
  import { Bizplace } from '@things-factory/biz-base'
5
6
  import { logger } from '@things-factory/env'
6
7
  import { generateId } from '@things-factory/id-rule-base'
@@ -26,6 +27,7 @@ import {
26
27
  OrderToteItem,
27
28
  OrderToteSeal,
28
29
  OrderVas,
30
+ OrderConsignment,
29
31
  PowrupController,
30
32
  ReleaseGood,
31
33
  WebspertController
@@ -52,6 +54,7 @@ import { SellercraftController } from '../../controllers'
52
54
  import { ActiveWorksheetPickingView, Worksheet, WorksheetDetail } from '../../entities'
53
55
  import { inventoriesByStrategy, isInventoryObsolete, WorksheetNoGenerator } from '../../utils'
54
56
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
57
+ import { sortingProductResolver } from 'server/graphql/resolvers/worksheet/sorting/sorting-product'
55
58
 
56
59
  export class PickingWorksheetController extends VasWorksheetController {
57
60
  async generatePickingWorksheet(releaseGoodNo: string, currentStatus: string = null): Promise<Worksheet> {
@@ -260,9 +263,21 @@ export class PickingWorksheetController extends VasWorksheetController {
260
263
  ]
261
264
  })
262
265
 
263
- worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages }
266
+ let orderConsignments: OrderConsignment[] = await this.trxMgr.getRepository(OrderConsignment).find({
267
+ where: { releaseGood: worksheet.releaseGood },
268
+ relations: [
269
+ 'orderPackages',
270
+ 'orderPackages.orderPackageItems',
271
+ 'orderPackages.orderPackageItems.orderProduct',
272
+ 'orderPackages.orderPackageItems.orderProduct.product',
273
+ 'orderPackages.orderPackageItems.orderProduct.productDetail'
274
+ ]
275
+ })
276
+
277
+ worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
264
278
 
265
279
  let releaseGood: ReleaseGood = Object.assign(new ReleaseGood(), worksheet.releaseGood)
280
+ let newReleaseGood: ReleaseGood
266
281
 
267
282
  // assign inventory if unassigned
268
283
  if (!releaseGood.assignedInventory) {
@@ -370,22 +385,37 @@ export class PickingWorksheetController extends VasWorksheetController {
370
385
 
371
386
  default:
372
387
  if (!releaseGood?.orderPackages?.length) {
373
- let orderPackage: OrderPackage = {
374
- name: OrderNoGenerator.orderPackage(),
375
- packageId: null,
376
- trackingNo: null,
377
- transporter: null,
378
- airwayBill: releaseGood?.airwayBill,
379
- invoice: releaseGood?.invoice,
380
- status: ORDER_STATUS.PROCESSING,
381
- releaseGood,
382
- domain: releaseGood.domain,
383
- bizplace: releaseGood.bizplace,
384
- creator: this.user,
385
- updater: this.user
388
+ let mps = releaseGood?.lastMileDelivery?.mps
389
+ switch (mps) {
390
+ case true:
391
+ newReleaseGood = await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
392
+ break
393
+ case false:
394
+ case undefined:
395
+ let orderConsignment: OrderConsignment = await createOrderConsignment(
396
+ this.trxMgr,
397
+ {},
398
+ releaseGood,
399
+ this.user
400
+ )
401
+ let orderPackage: OrderPackage = {
402
+ name: OrderNoGenerator.orderPackage(),
403
+ packageId: null,
404
+ trackingNo: null,
405
+ transporter: null,
406
+ airwayBill: releaseGood?.airwayBill,
407
+ invoice: releaseGood?.invoice,
408
+ status: ORDER_STATUS.PROCESSING,
409
+ releaseGood,
410
+ domain: releaseGood.domain,
411
+ bizplace: releaseGood.bizplace,
412
+ creator: this.user,
413
+ updater: this.user,
414
+ orderConsignment: orderConsignment
415
+ }
416
+ newReleaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
417
+ break
386
418
  }
387
- worksheet.releaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
388
- //worksheet.releaseGood = releaseGood
389
419
  }
390
420
  break
391
421
  }
@@ -393,6 +423,10 @@ export class PickingWorksheetController extends VasWorksheetController {
393
423
  logger.error(`picking-worksheet-controller[activatePicking]: ${error}`)
394
424
  }
395
425
 
426
+ if (newReleaseGood) {
427
+ worksheet.releaseGood = newReleaseGood
428
+ }
429
+
396
430
  return worksheet
397
431
  }
398
432
 
@@ -408,13 +442,19 @@ export class PickingWorksheetController extends VasWorksheetController {
408
442
  .leftJoinAndSelect('w.releaseGood', 'rg')
409
443
  .leftJoinAndSelect('rg.domain', 'rgd')
410
444
  .leftJoinAndSelect('rg.lastMileDelivery', 'lmd')
411
- .leftJoinAndSelect('rg.orderPackages', 'rgop')
412
- .leftJoinAndSelect('rgop.orderPackageItems', 'rgopi')
413
- .leftJoinAndSelect('rgopi.orderProduct', 'op2')
445
+ .leftJoinAndSelect('rg.orderPackages', 'op')
446
+ .leftJoinAndSelect('op.orderPackageItems', 'opi')
447
+ .leftJoinAndSelect('opi.orderProduct', 'op2')
414
448
  .leftJoinAndSelect('op2.product', 'p')
415
449
  .leftJoinAndSelect('op2.productDetail', 'pd')
416
- .leftJoinAndSelect('rg.bizplace', 'rgbz')
417
- .leftJoinAndSelect('rgbz.domain', 'bzd')
450
+ .leftJoinAndSelect('rg.orderConsignments', 'oc')
451
+ .leftJoinAndSelect('oc.orderPackages', 'ocop')
452
+ .leftJoinAndSelect('ocop.orderPackageItems', 'ocpi')
453
+ .leftJoinAndSelect('ocpi.orderProduct', 'ocp2')
454
+ .leftJoinAndSelect('ocp2.product', 'ocp')
455
+ .leftJoinAndSelect('ocp2.productDetail', 'ocpd')
456
+ .leftJoinAndSelect('rg.bizplace', 'rgb')
457
+ .leftJoinAndSelect('rgb.domain', 'rgbd')
418
458
  .leftJoinAndSelect('b.domain', 'bd')
419
459
  .leftJoinAndSelect('b.company', 'c')
420
460
  .leftJoinAndSelect('c.domain', 'cd')
@@ -498,30 +538,52 @@ export class PickingWorksheetController extends VasWorksheetController {
498
538
  // retrieve order inventory
499
539
  const pickingOrderInventory: OrderInventory[] = await this.trxMgr.getRepository(OrderInventory).find({
500
540
  where: { domain: this.domain, refWorksheetId: worksheet.id, status: ORDER_STATUS.PICKING },
501
- relations: [
502
- 'releaseGood',
503
- 'releaseGood.domain',
504
- 'releaseGood.lastMileDelivery',
505
- 'releaseGood.bizplace',
506
- 'releaseGood.bizplace.domain',
507
- 'releaseGood.orderPackages',
508
- 'releaseGood.orderPackages.orderPackageItems',
509
- 'releaseGood.orderPackages.orderPackageItems.orderProduct',
510
- 'releaseGood.orderPackages.orderPackageItems.orderProduct.product',
511
- 'releaseGood.orderPackages.orderPackageItems.orderProduct.productDetail',
512
- 'releaseGood.orderProducts',
513
- 'releaseGood.orderProducts.productDetail',
514
- 'releaseGood.orderProducts.product'
515
- ]
541
+ relations: ['releaseGood']
516
542
  })
517
543
 
518
- let releaseGoods: ReleaseGood[] = pickingOrderInventory.reduce((data, oi: OrderInventory) => {
519
- if (!data.find(x => x.id == oi.releaseGood.id)) {
520
- data.push(oi.releaseGood)
544
+ const releaseGoodIds = pickingOrderInventory.reduce((data, order) => {
545
+ const id = order.releaseGood.id
546
+ if (!data.includes(id)) {
547
+ data.push(id)
521
548
  }
522
549
  return data
523
550
  }, [])
524
551
 
552
+ let releaseGoods: ReleaseGood[] = await this.trxMgr.getRepository(ReleaseGood).find({
553
+ where: { id: In(releaseGoodIds) },
554
+ relations: [
555
+ 'domain',
556
+ 'lastMileDelivery',
557
+ 'bizplace',
558
+ 'bizplace.domain',
559
+ 'orderPackages',
560
+ 'orderPackages.orderPackageItems',
561
+ 'orderPackages.orderPackageItems.orderProduct',
562
+ 'orderPackages.orderPackageItems.orderProduct.product',
563
+ 'orderPackages.orderPackageItems.orderProduct.productDetail',
564
+ 'orderProducts',
565
+ 'orderProducts.productDetail',
566
+ 'orderProducts.product',
567
+ 'orderConsignments',
568
+ 'orderConsignments.orderPackages',
569
+ 'orderConsignments.orderPackages.orderPackageItems',
570
+ 'orderConsignments.orderPackages.orderPackageItems.orderProduct',
571
+ 'orderConsignments.orderPackages.orderPackageItems.orderProduct.product',
572
+ 'orderConsignments.orderPackages.orderPackageItems.orderProduct.productDetail'
573
+ ]
574
+ })
575
+
576
+ pickingOrderInventory.forEach(order => {
577
+ order.releaseGood = releaseGoods.find(rg => rg.id === order.releaseGood.id)
578
+ })
579
+
580
+ // let releaseGoodss: ReleaseGood[] = pickingOrderInventory.reduce((data, oi: OrderInventory) => {
581
+ // if (!data.find(x => x.id == oi.releaseGood.id)) {
582
+ // data.push(oi.releaseGood)
583
+ // }
584
+ // return data
585
+ // }, [])
586
+
525
587
  // massage data and trigger SC pack order asynchronously
526
588
  if (releaseGoods?.length) {
527
589
  releaseGoods = await Promise.all(
@@ -588,21 +650,37 @@ export class PickingWorksheetController extends VasWorksheetController {
588
650
 
589
651
  default:
590
652
  if (!releaseGood?.orderPackages?.length) {
591
- let orderPackage: OrderPackage = {
592
- name: OrderNoGenerator.orderPackage(),
593
- packageId: null,
594
- trackingNo: null,
595
- transporter: null,
596
- airwayBill: releaseGood?.airwayBill,
597
- invoice: releaseGood?.invoice,
598
- status: ORDER_STATUS.PROCESSING,
599
- releaseGood,
600
- domain: releaseGood.domain,
601
- bizplace: releaseGood.bizplace,
602
- creator: this.user,
603
- updater: this.user
653
+ let mps = releaseGood?.lastMileDelivery?.mps
654
+ switch (mps) {
655
+ case true:
656
+ await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
657
+ break
658
+ case false:
659
+ case undefined:
660
+ let orderConsignment: OrderConsignment = await createOrderConsignment(
661
+ this.trxMgr,
662
+ {},
663
+ releaseGood,
664
+ this.user
665
+ )
666
+ let orderPackage: OrderPackage = {
667
+ name: OrderNoGenerator.orderPackage(),
668
+ packageId: null,
669
+ trackingNo: null,
670
+ transporter: null,
671
+ airwayBill: releaseGood?.airwayBill,
672
+ invoice: releaseGood?.invoice,
673
+ status: ORDER_STATUS.PROCESSING,
674
+ releaseGood,
675
+ domain: releaseGood.domain,
676
+ bizplace: releaseGood.bizplace,
677
+ creator: this.user,
678
+ updater: this.user,
679
+ orderConsignment: orderConsignment
680
+ }
681
+ await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
682
+ break
604
683
  }
605
- releaseGood = await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
606
684
  }
607
685
  break
608
686
  }
@@ -618,7 +696,17 @@ export class PickingWorksheetController extends VasWorksheetController {
618
696
  }
619
697
  })
620
698
  )
621
- await this.trxMgr.getRepository(ReleaseGood).save(releaseGoods)
699
+
700
+ await Promise.all(
701
+ releaseGoods.map(rg =>
702
+ this.trxMgr.getRepository(ReleaseGood).update(rg.id, {
703
+ status: rg.status,
704
+ updater: this.user,
705
+ assignedInventory: true,
706
+ updatedAt: () => 'CURRENT_TIMESTAMP'
707
+ })
708
+ )
709
+ )
622
710
  }
623
711
 
624
712
  for (const releaseGood of releaseGoods) {
@@ -2550,38 +2638,62 @@ export class PickingWorksheetController extends VasWorksheetController {
2550
2638
 
2551
2639
  await getManager().transaction(async (tx: EntityManager) => {
2552
2640
  const worksheetRepo = tx.getRepository(Worksheet)
2553
- let worksheet = await worksheetRepo
2554
- .createQueryBuilder('w')
2555
- .leftJoinAndSelect('w.releaseGood', 'rg')
2556
- .leftJoinAndSelect('rg.bizplace', 'rg_b')
2557
- .leftJoinAndSelect('rg.domain', 'rg_d')
2558
- .leftJoinAndSelect('rg.lastMileDelivery', 'rg_lmd')
2559
- .leftJoinAndSelect('rg_b.domain', 'b_d')
2560
- .leftJoinAndSelect('rg.orderProducts', 'rg_op')
2561
- .leftJoinAndSelect('rg_op.product', 'op_p')
2562
- .leftJoinAndSelect('rg_op.productDetail', 'op_pd')
2563
- .leftJoinAndSelect('rg_op.productBundle', 'op_pb')
2564
- .leftJoinAndSelect('op_pb.productBundleSettings', 'pb_ps')
2565
- .leftJoinAndSelect('pb_ps.productDetail', 'ps_pd')
2566
- .leftJoinAndSelect('op_pd.product', 'pd_p')
2567
- .leftJoinAndSelect('rg.orderPackages', 'rg_opc')
2568
- .leftJoinAndSelect('rg_opc.orderPackageItems', 'opc_opi')
2569
- .leftJoinAndSelect('opc_opi.orderProduct', 'opi_op')
2570
- .leftJoinAndSelect('opi_op.product', 'op_p2')
2571
- .leftJoinAndSelect('opi_op.productDetail', 'op_pd2')
2572
- .leftJoinAndSelect('w.domain', 'd')
2573
- .leftJoinAndSelect('w.bizplace', 'b')
2574
- .leftJoinAndSelect('b.company', 'c')
2575
- .leftJoinAndSelect('c.domain', 'c_d')
2576
- .leftJoinAndSelect('w.worksheetDetails', 'wd')
2577
- .leftJoinAndSelect('wd.targetInventory', 'ti')
2578
- .leftJoinAndSelect('ti.product', 'tp')
2579
- .where('w.id = :worksheetId', { worksheetId: worksheetId })
2580
- .andWhere('w.bizplace_id = :bizplaceId', { bizplaceId: bizplaceId })
2581
- .getOne()
2641
+
2642
+ let worksheet: Worksheet = await worksheetRepo.findOne({
2643
+ where: { id: worksheetId, bizplace: bizplaceId },
2644
+ relations: [
2645
+ 'domain',
2646
+ 'bizplace',
2647
+ 'bizplace.company',
2648
+ 'bizplace.company.domain',
2649
+ 'releaseGood',
2650
+ 'releaseGood.bizplace',
2651
+ 'releaseGood.domain',
2652
+ 'releaseGood.lastMileDelivery',
2653
+ 'releaseGood.bizplace.domain',
2654
+ 'worksheetDetails',
2655
+ 'worksheetDetails.targetInventory',
2656
+ 'worksheetDetails.targetInventory.product'
2657
+ ]
2658
+ })
2582
2659
 
2583
2660
  let worksheetDetails: WorksheetDetail[]
2584
2661
 
2662
+ let orderProducts: OrderProduct[] = await tx.getRepository(OrderProduct).find({
2663
+ where: { releaseGood: worksheet.releaseGood },
2664
+ relations: [
2665
+ 'product',
2666
+ 'productDetail',
2667
+ 'productBundle',
2668
+ 'productBundle.productBundleSettings',
2669
+ 'productBundle.productBundleSettings.productDetail',
2670
+ 'productDetail.product'
2671
+ ]
2672
+ })
2673
+
2674
+ let orderPackages: OrderPackage[] = await tx.getRepository(OrderPackage).find({
2675
+ where: { releaseGood: worksheet.releaseGood },
2676
+ relations: [
2677
+ 'orderPackageItems',
2678
+ 'orderPackageItems.orderProduct',
2679
+ 'orderPackageItems.orderProduct.product',
2680
+ 'orderPackageItems.orderProduct.product.productDetails'
2681
+ ]
2682
+ })
2683
+
2684
+ let orderConsignments: OrderConsignment[] = await tx.getRepository(OrderConsignment).find({
2685
+ where: { releaseGood: worksheet.releaseGood },
2686
+ relations: [
2687
+ 'orderPackages',
2688
+ 'orderPackages.orderPackageItems',
2689
+ 'orderPackages.orderPackageItems.orderProduct',
2690
+ 'orderPackages.orderPackageItems.orderProduct.product',
2691
+ 'orderPackages.orderPackageItems.orderProduct.product.productDetails'
2692
+ ]
2693
+ })
2694
+
2695
+ worksheet.releaseGood = { ...worksheet.releaseGood, orderProducts, orderPackages, orderConsignments }
2696
+
2585
2697
  if (worksheet.releaseGood?.assignedInventory == false) {
2586
2698
  worksheetDetails = await this.assignInventoriesForUnassignedOrder(worksheet, tx)
2587
2699
  worksheet.worksheetDetails = worksheetDetails
@@ -2683,23 +2795,42 @@ export class PickingWorksheetController extends VasWorksheetController {
2683
2795
  WebspertController.triggerOrderProcesses(releaseGood, this.domain, this.user)
2684
2796
  break
2685
2797
 
2798
+ case ApplicationType.MMS:
2799
+ break
2800
+
2686
2801
  default:
2687
2802
  if (!releaseGood?.orderPackages?.length) {
2688
- let orderPackage: OrderPackage = {
2689
- name: OrderNoGenerator.orderPackage(),
2690
- packageId: null,
2691
- trackingNo: null,
2692
- transporter: null,
2693
- airwayBill: releaseGood?.airwayBill,
2694
- invoice: releaseGood?.invoice,
2695
- status: ORDER_STATUS.PROCESSING,
2696
- releaseGood,
2697
- domain: releaseGood.domain,
2698
- bizplace: releaseGood.bizplace,
2699
- creator: this.user,
2700
- updater: this.user
2803
+ let mps = releaseGood?.lastMileDelivery?.mps
2804
+ switch (mps) {
2805
+ case true:
2806
+ await splitOrderConsignment(this.trxMgr, releaseGood, this.user, this.domain)
2807
+ break
2808
+ case false:
2809
+ case undefined:
2810
+ let orderConsignment: OrderConsignment = await createOrderConsignment(
2811
+ this.trxMgr,
2812
+ {},
2813
+ releaseGood,
2814
+ this.user
2815
+ )
2816
+ let orderPackage: OrderPackage = {
2817
+ name: OrderNoGenerator.orderPackage(),
2818
+ packageId: null,
2819
+ trackingNo: null,
2820
+ transporter: null,
2821
+ airwayBill: releaseGood?.airwayBill,
2822
+ invoice: releaseGood?.invoice,
2823
+ status: ORDER_STATUS.PROCESSING,
2824
+ releaseGood,
2825
+ domain: releaseGood.domain,
2826
+ bizplace: releaseGood.bizplace,
2827
+ creator: this.user,
2828
+ updater: this.user,
2829
+ orderConsignment: orderConsignment
2830
+ }
2831
+ await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
2832
+ break
2701
2833
  }
2702
- await createOrderPackageAndItems(this.trxMgr, releaseGood, orderPackage)
2703
2834
  }
2704
2835
  break
2705
2836
  }
@@ -2722,44 +2853,375 @@ export async function createOrderPackageAndItems(
2722
2853
  releaseGood: ReleaseGood,
2723
2854
  orderPackage: OrderPackage
2724
2855
  ): Promise<ReleaseGood> {
2725
- let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
2856
+ try {
2857
+ let savedOrderPackage: OrderPackage = await tx.getRepository(OrderPackage).save(orderPackage)
2726
2858
 
2727
- const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts
2728
- .map(op => {
2729
- if (op.product) {
2730
- return {
2731
- name: OrderNoGenerator.orderPackageItem(),
2732
- orderProduct: op,
2733
- status: ORDER_STATUS.PROCESSING,
2734
- releaseQty: op.releaseQty,
2735
- orderPackage: savedOrderPackage,
2736
- domain: releaseGood.domain,
2737
- bizplace: releaseGood.bizplace,
2738
- creator: releaseGood.creator,
2739
- updater: releaseGood.updater,
2740
- productDetail: op.productDetail
2859
+ const orderPackageItems: OrderPackageItem[] = releaseGood.orderProducts
2860
+ .map(op => {
2861
+ if (op.product) {
2862
+ return {
2863
+ id: uuidv4(),
2864
+ name: OrderNoGenerator.orderPackageItem(),
2865
+ orderProduct: op,
2866
+ status: ORDER_STATUS.PROCESSING,
2867
+ releaseQty: op.releaseQty,
2868
+ orderPackage: savedOrderPackage,
2869
+ domain: releaseGood.domain,
2870
+ bizplace: releaseGood.bizplace,
2871
+ creator: releaseGood.creator,
2872
+ updater: releaseGood.updater,
2873
+ productDetail: op.productDetail
2874
+ }
2875
+ } else {
2876
+ let productBundle = op.productBundle
2877
+ return productBundle.productBundleSettings.map(pbs => ({
2878
+ name: OrderNoGenerator.orderPackageItem(),
2879
+ orderProduct: op,
2880
+ status: ORDER_STATUS.PROCESSING,
2881
+ releaseQty: op.releaseQty * pbs.bundleQty,
2882
+ orderPackage: savedOrderPackage,
2883
+ domain: releaseGood.domain,
2884
+ bizplace: releaseGood.bizplace,
2885
+ creator: releaseGood.creator,
2886
+ updater: releaseGood.updater,
2887
+ productDetail: pbs.productDetail
2888
+ }))
2741
2889
  }
2890
+ })
2891
+ .flat()
2892
+
2893
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
2894
+ orderPackage.orderPackageItems = orderPackageItems
2895
+ releaseGood.orderPackages = [orderPackage]
2896
+
2897
+ return releaseGood
2898
+ } catch (e) {
2899
+ logger.error(`error:${e}`)
2900
+ }
2901
+ }
2902
+
2903
+ export async function splitOrderConsignment(
2904
+ tx: EntityManager,
2905
+ releaseGood: ReleaseGood,
2906
+ user: User,
2907
+ domain: Domain
2908
+ ): Promise<any> {
2909
+ try {
2910
+ let currentConsignment = { id: uuidv4(), totalWeight: 0, orderPackages: [] }
2911
+ let totalConsignments = []
2912
+ let currOrderProducts = []
2913
+ let totalConsignmentWeight = 0
2914
+
2915
+ let orderProducts: OrderProduct = releaseGood.orderProducts
2916
+ let maxConsignmentWeight = releaseGood.lastMileDelivery.consignmentWeight
2917
+
2918
+ //sort product according to packingType
2919
+ let sortOrderProducts = await sortingProduct(orderProducts)
2920
+
2921
+ //initialise new orderConsignment created
2922
+ const createdNewConsignment = () => ({
2923
+ id: uuidv4(),
2924
+ totalWeight: 0,
2925
+ orderPackages: []
2926
+ })
2927
+
2928
+ //push orderPackage & packageItems into consigment
2929
+ const createPackageConsignment = (consignment, packageWeight, releaseGood, orderProduct, releaseQty, user) => {
2930
+ consignment.totalWeight += packageWeight
2931
+
2932
+ currentConsignment.orderPackages.push({
2933
+ id: uuidv4(),
2934
+ name: OrderNoGenerator.orderPackage(),
2935
+ packageId: null,
2936
+ trackingNo: null,
2937
+ transporter: null,
2938
+ airwayBill: releaseGood?.airwayBill,
2939
+ invoice: releaseGood?.invoice,
2940
+ status: ORDER_STATUS.PROCESSING,
2941
+ releaseGood,
2942
+ domain: releaseGood.domain,
2943
+ bizplace: releaseGood.bizplace,
2944
+ creator: user,
2945
+ updater: user,
2946
+ orderPackageItems: [
2947
+ {
2948
+ id: uuidv4(),
2949
+ name: OrderNoGenerator.orderPackageItem(),
2950
+ releaseQty: releaseQty,
2951
+ orderProduct: orderProduct,
2952
+ domain: releaseGood.domain,
2953
+ bizplace: releaseGood.bizplace,
2954
+ creator: releaseGood.creator,
2955
+ updater: releaseGood.updater,
2956
+ productDetail: orderProduct.productDetail
2957
+ }
2958
+ ]
2959
+ })
2960
+ }
2961
+
2962
+ const createPackage = op => {
2963
+ let releaseQty = op.productDetail.packingType.toLowerCase() === 'carton' ? 1 : op.releaseQty
2964
+ let packageWeight =
2965
+ op.productDetail.packingType.toLowerCase() === 'carton'
2966
+ ? op.productDetail.grossWeight
2967
+ : op.productDetail.grossWeight * releaseQty
2968
+
2969
+ const isCarton = op.productDetail.packingType.toLowerCase() === 'carton'
2970
+ totalConsignmentWeight += packageWeight
2971
+ const requiresNewConsignment = totalConsignmentWeight >= maxConsignmentWeight
2972
+
2973
+ if (isCarton || op.releaseQty > 1) {
2974
+ if (requiresNewConsignment) {
2975
+ //push the current consignment to create new consignment
2976
+ totalConsignments.push(currentConsignment)
2977
+
2978
+ //Initialise the totalConsignment weight to the new data
2979
+ totalConsignmentWeight = packageWeight + 0
2980
+ currentConsignment = createdNewConsignment()
2981
+ }
2982
+ createPackageConsignment(currentConsignment, packageWeight, releaseGood, op, releaseQty, user)
2742
2983
  } else {
2743
- let productBundle = op.productBundle
2744
- return productBundle.productBundleSettings.map(pbs => ({
2745
- name: OrderNoGenerator.orderPackageItem(),
2746
- orderProduct: op,
2747
- status: ORDER_STATUS.PROCESSING,
2748
- releaseQty: op.releaseQty * pbs.bundleQty,
2749
- orderPackage: savedOrderPackage,
2750
- domain: releaseGood.domain,
2751
- bizplace: releaseGood.bizplace,
2752
- creator: releaseGood.creator,
2753
- updater: releaseGood.updater,
2754
- productDetail: pbs.productDetail
2755
- }))
2984
+ currOrderProducts.push(op)
2985
+ }
2986
+ }
2987
+
2988
+ sortOrderProducts.forEach(item => {
2989
+ if (item.packingType.toLowerCase() === 'carton') {
2990
+ for (let i = 0; i < item.releaseQty; i++) {
2991
+ createPackage(item)
2992
+ }
2993
+ } else {
2994
+ createPackage(item)
2756
2995
  }
2757
2996
  })
2758
- .flat()
2759
2997
 
2760
- await tx.getRepository(OrderPackageItem).save(orderPackageItems)
2761
- orderPackage.orderPackageItems = orderPackageItems
2762
- releaseGood.orderPackages = [orderPackage]
2998
+ // Add any remaining items to the last orderPackage
2999
+ if (currOrderProducts.length > 0) {
3000
+ let availableConsignment
3001
+
3002
+ for (let i = 0; i < currOrderProducts.length; i++) {
3003
+ let op = currOrderProducts[i]
3004
+ let releaseQty = op.releaseQty
3005
+ let currProductWeight = op.productDetail.grossWeight * op.releaseQty
3006
+ let lastOrderPackage = currentConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
3007
+
3008
+ //push the product into last current consignment orderPackage
3009
+ if (currentConsignment.totalWeight + currProductWeight < maxConsignmentWeight) {
3010
+ if (lastOrderPackage) {
3011
+ lastOrderPackage.orderPackageItems.push({
3012
+ id: uuidv4(),
3013
+ name: OrderNoGenerator.orderPackageItem(),
3014
+ releaseQty: op.releaseQty,
3015
+ orderProduct: op,
3016
+ domain: releaseGood.domain,
3017
+ bizplace: releaseGood.bizplace,
3018
+ creator: releaseGood.creator,
3019
+ updater: releaseGood.updater,
3020
+ productDetail: op.productDetail
3021
+ })
3022
+ } else {
3023
+ await createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
3024
+ }
3025
+ } else {
3026
+ //push the currentConsignment into list of all the consignments
3027
+ if (!totalConsignments.some(tc => tc.id === currentConsignment.id)) {
3028
+ totalConsignments.push(currentConsignment)
3029
+ }
3030
+
3031
+ //find one order consignment to include the product
3032
+ availableConsignment = totalConsignments.find(tc => {
3033
+ tc.totalWeight += currProductWeight < maxConsignmentWeight
3034
+ })
3035
+
3036
+ if (availableConsignment) {
3037
+ let lastOrderPackage = availableConsignment.orderPackages[currentConsignment.orderPackages.length - 1]
3038
+ lastOrderPackage.orderPackageItems.push({
3039
+ id: uuidv4(),
3040
+ name: OrderNoGenerator.orderPackageItem(),
3041
+ releaseQty: op.releaseQty,
3042
+ orderProducts: op,
3043
+ domain: releaseGood.domain,
3044
+ bizplace: releaseGood.bizplace,
3045
+ creator: releaseGood.creator,
3046
+ updater: releaseGood.updater,
3047
+ productDetail: op.productDetail
3048
+ })
3049
+
3050
+ //update the totalConsignment data
3051
+ totalConsignments = totalConsignments.map(tc => {
3052
+ tc.id === availableConsignment.id ? availableConsignment : tc
3053
+ })
3054
+ } else {
3055
+ //create new consignment if no consignment available
3056
+ currentConsignment = createdNewConsignment()
3057
+ createPackageConsignment(currentConsignment, currProductWeight, releaseGood, op, releaseQty, user)
3058
+
3059
+ totalConsignments.push(currentConsignment)
3060
+ }
3061
+ }
3062
+ }
3063
+ }
3064
+
3065
+ //totalConsignments.length < 1 ? totalConsignments.push(currentConsignment) : totalConsignments
2763
3066
 
2764
- return releaseGood
3067
+ const existingConsignment = totalConsignments.find(tc => tc.id === currentConsignment.id)
3068
+
3069
+ if (!existingConsignment) {
3070
+ totalConsignments.push(currentConsignment)
3071
+ }
3072
+
3073
+ let orderConsignment = totalConsignments
3074
+ let newReleaseGood = await createConsignmentWithMultipackage(tx, orderConsignment, releaseGood, user, domain)
3075
+
3076
+ return newReleaseGood
3077
+ } catch (e) {
3078
+ logger.error(`[lmd-create-consignment-notes]: ${e} `)
3079
+ }
3080
+ }
3081
+
3082
+ export async function createOrderConsignment(
3083
+ tx: EntityManager,
3084
+ orderCons: OrderConsignment,
3085
+ releaseGood: ReleaseGood,
3086
+ user: User
3087
+ ): Promise<OrderConsignment> {
3088
+ try {
3089
+ let orderConsignment: OrderConsignment = {
3090
+ id: uuidv4(),
3091
+ name: OrderNoGenerator.orderConsignment(),
3092
+ noOfPackages: orderCons?.orderPackages?.length ? orderCons.orderPackages.length : 1,
3093
+ domain: releaseGood.domain,
3094
+ bizplace: releaseGood.bizplace,
3095
+ releaseGood: releaseGood,
3096
+ orderPackages: [],
3097
+ creator: user,
3098
+ updater: user
3099
+ }
3100
+
3101
+ orderConsignment = await tx.getRepository(OrderConsignment).save(orderConsignment)
3102
+ return orderConsignment
3103
+ } catch (e) {
3104
+ logger.error(`[lmd-create-order-consignment]: ${e} `)
3105
+ }
3106
+ }
3107
+
3108
+ export async function createConsignmentPackage(
3109
+ tx: EntityManager,
3110
+ orderPackageData: any,
3111
+ releaseGood: ReleaseGood,
3112
+ user: User,
3113
+ orderConsignment: OrderConsignment
3114
+ ): Promise<OrderPackage> {
3115
+ try {
3116
+ const orderPackage: OrderPackage = {
3117
+ id: uuidv4(),
3118
+ name: OrderNoGenerator.orderPackage(),
3119
+ packageId: null,
3120
+ trackingNo: null,
3121
+ transporter: null,
3122
+ airwayBill: releaseGood?.airwayBill,
3123
+ invoice: releaseGood?.invoice,
3124
+ status: ORDER_STATUS.PROCESSING,
3125
+ releaseGood,
3126
+ domain: releaseGood.domain,
3127
+ bizplace: releaseGood.bizplace,
3128
+ creator: user,
3129
+ updater: user,
3130
+ orderConsignment
3131
+ }
3132
+ return tx.getRepository(OrderPackage).save(orderPackage)
3133
+ } catch (e) {
3134
+ logger.error(`[lmd-create-order-package]: ${e} `)
3135
+ }
3136
+ }
3137
+
3138
+ export async function createConsignmentPackageItem(
3139
+ tx: EntityManager,
3140
+ orderPackageItemsData: any[],
3141
+ savedOrderPackage: OrderPackage,
3142
+ releaseGood: ReleaseGood
3143
+ ): Promise<OrderPackageItem[]> {
3144
+ try {
3145
+ const orderPackageItems: OrderPackageItem[] = orderPackageItemsData.map(opi => ({
3146
+ id: opi.id,
3147
+ name: opi.name,
3148
+ orderProduct: opi.orderProduct,
3149
+ status: ORDER_STATUS.PROCESSING,
3150
+ releaseQty: opi.releaseQty,
3151
+ orderPackage: savedOrderPackage,
3152
+ domain: releaseGood.domain,
3153
+ bizplace: releaseGood.bizplace,
3154
+ creator: releaseGood.creator,
3155
+ updater: releaseGood.updater,
3156
+ productDetail: opi.productDetail
3157
+ }))
3158
+
3159
+ await tx.getRepository(OrderPackageItem).save(orderPackageItems)
3160
+ return orderPackageItems
3161
+ } catch (e) {
3162
+ logger.error(`[lmd-create-order-package]: ${e} `)
3163
+ }
3164
+ }
3165
+
3166
+ export async function createConsignmentWithMultipackage(
3167
+ tx: EntityManager,
3168
+ orderConsList: OrderConsignment[],
3169
+ releaseGood: ReleaseGood,
3170
+ user: User,
3171
+ domain: Domain
3172
+ ): Promise<any> {
3173
+ try {
3174
+ let newOrderPackages = []
3175
+ let newOrderConsignments: OrderConsignment = []
3176
+
3177
+ for (const orderCons of orderConsList) {
3178
+ const savedOrderConsignment = await createOrderConsignment(tx, orderCons, releaseGood, user)
3179
+
3180
+ for (const currentPackage of orderCons.orderPackages) {
3181
+ const savedOrderPackage = await createConsignmentPackage(
3182
+ tx,
3183
+ currentPackage,
3184
+ releaseGood,
3185
+ user,
3186
+ savedOrderConsignment
3187
+ )
3188
+ const orderPackageItems = await createConsignmentPackageItem(
3189
+ tx,
3190
+ currentPackage.orderPackageItems,
3191
+ savedOrderPackage,
3192
+ releaseGood
3193
+ )
3194
+
3195
+ savedOrderPackage.orderPackageItems = orderPackageItems
3196
+ savedOrderConsignment.orderPackages.push(savedOrderPackage)
3197
+ newOrderPackages.push(savedOrderPackage)
3198
+ }
3199
+ newOrderConsignments.push(savedOrderConsignment)
3200
+ }
3201
+
3202
+ releaseGood.orderConsignments = newOrderConsignments
3203
+ releaseGood.orderPackages = newOrderPackages
3204
+
3205
+ return releaseGood
3206
+ } catch (error) {
3207
+ console.error('Error creating consignment with multiple packages:', error)
3208
+ throw error
3209
+ }
3210
+ }
3211
+
3212
+ export async function sortingProduct(orderProducts): Promise<any> {
3213
+ try {
3214
+ orderProducts.sort((a, b) => {
3215
+ if (a.product.packingType !== b.product.packingType) {
3216
+ return a.product.packingType < b.product.packingType ? -1 : 1
3217
+ }
3218
+ if (a.product.sku !== b.product.sku) {
3219
+ return a.product.sku < b.product.sku ? -1 : 1
3220
+ }
3221
+ return 0
3222
+ })
3223
+ return orderProducts
3224
+ } catch (e) {
3225
+ logger.error(`[lmd-sort-product]: ${e} `)
3226
+ }
2765
3227
  }