@things-factory/sales-base 4.3.769 → 4.3.771

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 (58) hide show
  1. package/dist-server/service/draft-release-good/draft-release-good-create.js +138 -139
  2. package/dist-server/service/draft-release-good/draft-release-good-create.js.map +1 -1
  3. package/dist-server/service/index.js +16 -2
  4. package/dist-server/service/index.js.map +1 -1
  5. package/dist-server/service/loading-package-items/index.js +9 -0
  6. package/dist-server/service/loading-package-items/index.js.map +1 -0
  7. package/dist-server/service/loading-package-items/loading-package-items-mutation.js +120 -0
  8. package/dist-server/service/loading-package-items/loading-package-items-mutation.js.map +1 -0
  9. package/dist-server/service/loading-package-items/loading-package-items-query.js +87 -0
  10. package/dist-server/service/loading-package-items/loading-package-items-query.js.map +1 -0
  11. package/dist-server/service/loading-package-items/loading-package-items-type.js +77 -0
  12. package/dist-server/service/loading-package-items/loading-package-items-type.js.map +1 -0
  13. package/dist-server/service/loading-package-items/loading-package-items.js +173 -0
  14. package/dist-server/service/loading-package-items/loading-package-items.js.map +1 -0
  15. package/dist-server/service/loading-packages/index.js +9 -0
  16. package/dist-server/service/loading-packages/index.js.map +1 -0
  17. package/dist-server/service/loading-packages/loading-packages-mutation.js +151 -0
  18. package/dist-server/service/loading-packages/loading-packages-mutation.js.map +1 -0
  19. package/dist-server/service/loading-packages/loading-packages-query.js +316 -0
  20. package/dist-server/service/loading-packages/loading-packages-query.js.map +1 -0
  21. package/dist-server/service/loading-packages/loading-packages-type.js +77 -0
  22. package/dist-server/service/loading-packages/loading-packages-type.js.map +1 -0
  23. package/dist-server/service/loading-packages/loading-packages.js +138 -0
  24. package/dist-server/service/loading-packages/loading-packages.js.map +1 -0
  25. package/dist-server/service/order-inventory/order-inventory.js +1 -0
  26. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  27. package/dist-server/service/release-good/release-good-mutation.js +48 -15
  28. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  29. package/dist-server/service/release-good/release-good-query.js +61 -3
  30. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  31. package/dist-server/service/release-good/release-good-types.js +15 -1
  32. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  33. package/dist-server/service/release-good/release-good.js +4 -0
  34. package/dist-server/service/release-good/release-good.js.map +1 -1
  35. package/dist-server/utils/inventory-util.js +6 -2
  36. package/dist-server/utils/inventory-util.js.map +1 -1
  37. package/dist-server/utils/order-no-generator.js +8 -0
  38. package/dist-server/utils/order-no-generator.js.map +1 -1
  39. package/package.json +8 -8
  40. package/server/service/draft-release-good/draft-release-good-create.ts +201 -206
  41. package/server/service/index.ts +16 -2
  42. package/server/service/loading-package-items/index.ts +6 -0
  43. package/server/service/loading-package-items/loading-package-items-mutation.ts +112 -0
  44. package/server/service/loading-package-items/loading-package-items-query.ts +43 -0
  45. package/server/service/loading-package-items/loading-package-items-type.ts +45 -0
  46. package/server/service/loading-package-items/loading-package-items.ts +140 -0
  47. package/server/service/loading-packages/index.ts +6 -0
  48. package/server/service/loading-packages/loading-packages-mutation.ts +150 -0
  49. package/server/service/loading-packages/loading-packages-query.ts +272 -0
  50. package/server/service/loading-packages/loading-packages-type.ts +45 -0
  51. package/server/service/loading-packages/loading-packages.ts +110 -0
  52. package/server/service/order-inventory/order-inventory.ts +1 -0
  53. package/server/service/release-good/release-good-mutation.ts +49 -21
  54. package/server/service/release-good/release-good-query.ts +103 -36
  55. package/server/service/release-good/release-good-types.ts +9 -0
  56. package/server/service/release-good/release-good.ts +5 -1
  57. package/server/utils/inventory-util.ts +7 -2
  58. package/server/utils/order-no-generator.ts +12 -0
@@ -8,6 +8,7 @@ import { logger } from '@things-factory/env'
8
8
  import { buildQuery, Domain, Filter, ListParam, Pagination, Sorting } from '@things-factory/shell'
9
9
  import { Inventory, LOCATION_TYPE } from '@things-factory/warehouse-base'
10
10
 
11
+ // import { Worksheet, WORKSHEET_TYPE, WORKSHEET_STATUS } from '@things-factory/worksheet-base'
11
12
  import { ATTACHMENT_TYPE, ORDER_INVENTORY_STATUS, ORDER_STATUS, ORDER_VAS_STATUS } from '../../constants'
12
13
  import { convertExcelDateToISO } from '../../utils/datetime-util'
13
14
  import { OrderInventory } from '../order-inventory/order-inventory'
@@ -657,6 +658,61 @@ export class ReleaseGoodQuery {
657
658
 
658
659
  let [items, total] = await qb.getManyAndCount()
659
660
 
661
+ const releaseGoodIds = items.map(item => item.id)
662
+
663
+ // Original entity-based approach (requires @things-factory/worksheet-base dependency)
664
+ // const allWorksheetsRaw: any[] = releaseGoodIds.length > 0
665
+ // ? await getRepository(Worksheet)
666
+ // .createQueryBuilder('ws')
667
+ // .leftJoin('ws.releaseGood', 'rg')
668
+ // .where('ws.domain_id = :domainId', { domainId: domain.id })
669
+ // .andWhere('rg.id IN (:...releaseGoodIds)', { releaseGoodIds })
670
+ // .select([
671
+ // 'ws.id as id',
672
+ // 'ws.type as type',
673
+ // 'ws.status as status',
674
+ // 'ws.name as name',
675
+ // 'ws.updated_at as updated_at',
676
+ // 'rg.id as releaseGoodId'
677
+ // ])
678
+ // .orderBy('ws.updated_at', 'DESC')
679
+ // .getRawMany()
680
+ // : []
681
+
682
+ // Direct table query (no dependency needed)
683
+ const allWorksheetsRaw: any[] = releaseGoodIds.length > 0
684
+ ? await getRepository(ReleaseGood).query(
685
+ `
686
+ SELECT
687
+ ws.id as id,
688
+ ws.type as type,
689
+ ws.status as status,
690
+ ws.name as name,
691
+ ws.updated_at as updated_at,
692
+ rg.id as "releaseGoodId"
693
+ FROM worksheets ws
694
+ LEFT JOIN release_goods rg ON ws.release_good_id = rg.id
695
+ WHERE ws.domain_id = $1 AND rg.id = ANY($2)
696
+ ORDER BY ws.updated_at DESC
697
+ `,
698
+ [domain.id, releaseGoodIds]
699
+ )
700
+ : []
701
+
702
+ const worksheetMap = new Map<string, { id: string; type: string; status: string; name: string }>()
703
+ for (const ws of allWorksheetsRaw) {
704
+ const releaseGoodId = ws.releaseGoodId
705
+ const key = `${releaseGoodId}_${ws.type}`
706
+ if (!worksheetMap.has(key)) {
707
+ worksheetMap.set(key, {
708
+ id: ws.id,
709
+ type: ws.type,
710
+ status: ws.status,
711
+ name: ws.name
712
+ })
713
+ }
714
+ }
715
+
660
716
  items = await Promise.all(
661
717
  items
662
718
  .filter(item => {
@@ -667,43 +723,53 @@ export class ReleaseGoodQuery {
667
723
  where: { releaseGood: item, domain, bizplace: item.bizplace }
668
724
  })
669
725
 
670
- let newPlatformCode
671
-
672
- if (item.platformCode) {
673
- if (item.platformCode == 'LZD') {
674
- newPlatformCode = 'Lazada'
675
- } else if (item.platformCode == 'SHP') {
676
- newPlatformCode = 'Shopee'
677
- } else if (item.platformCode == 'TTK') {
678
- newPlatformCode = 'Tiktok'
679
- } else if (item.platformCode == 'SPF') {
680
- newPlatformCode = 'Shopify'
681
- }
726
+ let newPlatformCode
727
+
728
+ if (item.platformCode) {
729
+ if (item.platformCode == 'LZD') {
730
+ newPlatformCode = 'Lazada'
731
+ } else if (item.platformCode == 'SHP') {
732
+ newPlatformCode = 'Shopee'
733
+ } else if (item.platformCode == 'TTK') {
734
+ newPlatformCode = 'Tiktok'
735
+ } else if (item.platformCode == 'SPF') {
736
+ newPlatformCode = 'Shopify'
682
737
  }
738
+ }
683
739
 
684
- if (
685
- item.lastMileDelivery &&
686
- item.lastMileDelivery.isTms &&
687
- item.lastMileDelivery.platform === 'VERSA_FLEET'
688
- ) {
689
- item.refNo2 = item.vehicleNo ? item.vehicleNo : item.refNo2
690
- }
740
+ if (
741
+ item.lastMileDelivery &&
742
+ item.lastMileDelivery.isTms &&
743
+ item.lastMileDelivery.platform === 'VERSA_FLEET'
744
+ ) {
745
+ item.refNo2 = item.vehicleNo ? item.vehicleNo : item.refNo2
746
+ }
691
747
 
692
- return {
693
- ...item,
694
- platformCode: newPlatformCode ? newPlatformCode : item.platformCode,
695
- transporter: orderPackages?.length
696
- ? [
697
- ...new Set(
698
- orderPackages.map(op => {
699
- return op.transporter
700
- })
701
- )
702
- ].join(', ')
703
- : null,
704
- orderRemark: item?.remark ? true : false
705
- }
706
- })
748
+ const worksheetStatus = (item.status === 'PROCESSING' || item.status === 'PARTIAL_PROCESSING') ? 'LOADING' : item.status
749
+ const worksheetKey = `${item.id}_${worksheetStatus}`
750
+ const worksheet = worksheetMap.get(worksheetKey) || null
751
+
752
+ return {
753
+ ...item,
754
+ platformCode: newPlatformCode ? newPlatformCode : item.platformCode,
755
+ transporter: orderPackages?.length
756
+ ? [
757
+ ...new Set(
758
+ orderPackages.map(op => {
759
+ return op.transporter
760
+ })
761
+ )
762
+ ].join(', ')
763
+ : null,
764
+ orderRemark: item?.remark ? true : false,
765
+ activeWorksheet: worksheet
766
+ ? {
767
+ type: worksheet.type,
768
+ status: worksheet.status
769
+ }
770
+ : null
771
+ }
772
+ })
707
773
  )
708
774
  console.timeEnd('t1')
709
775
  return { items, total }
@@ -1067,7 +1133,7 @@ export async function bulkReleaseGoodsAvailableItemsFunction(
1067
1133
  AND i.uom = foo.uom
1068
1134
  AND i.domain_id = $1
1069
1135
  AND i.bizplace_id = $2
1070
- WHERE l.type NOT IN ($3, $4)
1136
+ WHERE l.type NOT IN ($3, $4, $8)
1071
1137
  AND i.status = 'STORED'
1072
1138
  AND i.obsolete = false
1073
1139
  AND i.transfer_qty <= 0
@@ -1100,7 +1166,8 @@ export async function bulkReleaseGoodsAvailableItemsFunction(
1100
1166
  LOCATION_TYPE.RESERVE,
1101
1167
  uniqueWarehouseCodes.length === 1 ? uniqueWarehouseCodes[0] : null,
1102
1168
  uniqueBatchIds.length === 1 ? uniqueBatchIds[0] : null,
1103
- releaseShelfLifeOverride
1169
+ releaseShelfLifeOverride,
1170
+ LOCATION_TYPE.DAMAGE
1104
1171
  ]
1105
1172
  )
1106
1173
 
@@ -184,6 +184,15 @@ export class ItemCounts {
184
184
  pending: number
185
185
  }
186
186
 
187
+ @ObjectType()
188
+ export class WorksheetBasicInfo {
189
+ @Field({ nullable: true })
190
+ type?: string
191
+
192
+ @Field({ nullable: true })
193
+ status?: string
194
+ }
195
+
187
196
  @ObjectType()
188
197
  export class TabCountItem {
189
198
  @Field()
@@ -35,7 +35,8 @@ import {
35
35
  ShippingOrder,
36
36
  ShippingOrderInfo,
37
37
  ItemCounts,
38
- TabCounts
38
+ TabCounts,
39
+ WorksheetBasicInfo
39
40
  } from '../'
40
41
  import { ReleaseOrderType } from '../../constants'
41
42
 
@@ -678,4 +679,7 @@ export class ReleaseGood {
678
679
 
679
680
  @Field(() => TabCounts, { nullable: true })
680
681
  tabCounts: TabCounts
682
+
683
+ @Field(() => WorksheetBasicInfo, { nullable: true })
684
+ activeWorksheet?: WorksheetBasicInfo
681
685
  }
@@ -949,7 +949,7 @@ export const InventoryUtil = {
949
949
 
950
950
  let locationTypes = [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]
951
951
 
952
- if (recall === false) {
952
+ if (recall !== true) {
953
953
  locationTypes.push(LOCATION_TYPE.DAMAGE)
954
954
  }
955
955
 
@@ -1413,7 +1413,8 @@ export function _composeTargetInventories(
1413
1413
 
1414
1414
  let orderInventories: Partial<OrderInventory[]> = []
1415
1415
  let idx = 0
1416
- while (compReleaseQty < record.releaseQty) {
1416
+ const EPSILON = 1e-6
1417
+ while (compReleaseQty + EPSILON < record.releaseQty && idx < inventories.length) {
1417
1418
  const inventory = inventories[idx]
1418
1419
  const {
1419
1420
  packingType,
@@ -1466,5 +1467,9 @@ export function _composeTargetInventories(
1466
1467
  idx++
1467
1468
  }
1468
1469
 
1470
+ if (orderInventories.length === 0) {
1471
+ throw new Error(`no inventories could be allocated for ${product?.sku}`)
1472
+ }
1473
+
1469
1474
  return orderInventories
1470
1475
  }
@@ -78,6 +78,18 @@ export class OrderNoGenerator {
78
78
  return `OPKI-${uuidv4()}`
79
79
  }
80
80
 
81
+ static loadingPackage() {
82
+ const currentDate = new Date()
83
+ const randomString = Math.random().toString(36).slice(2, 5)
84
+ return `LPK${currentDate.getFullYear()}${
85
+ currentDate.getMonth() + 1
86
+ }${currentDate.getDate()}${currentDate.getHours()}${currentDate.getMinutes()}${currentDate.getSeconds()}${currentDate.getMilliseconds()}${randomString}`
87
+ }
88
+
89
+ static loadingPackageItem() {
90
+ return `LPKI-${uuidv4()}`
91
+ }
92
+
81
93
  static invoiceProduct() {
82
94
  return `IP-${uuidv4()}`
83
95
  }