@things-factory/sales-base 4.3.636 → 4.3.637

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/arrival-notice/arrival-notice-mutation.js +34 -3
  2. package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
  3. package/dist-server/service/arrival-notice/arrival-notice-query.js +10 -3
  4. package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
  5. package/dist-server/service/arrival-notice/arrival-notice-types.js +2 -2
  6. package/dist-server/service/arrival-notice/arrival-notice-types.js.map +1 -1
  7. package/dist-server/service/inventory-check-item/inventory-check-item-types.js +48 -12
  8. package/dist-server/service/inventory-check-item/inventory-check-item-types.js.map +1 -1
  9. package/dist-server/service/inventory-check-item/inventory-check-item.js +56 -4
  10. package/dist-server/service/inventory-check-item/inventory-check-item.js.map +1 -1
  11. package/dist-server/service/order-inventory/order-inventory-query.js +5 -1
  12. package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
  13. package/dist-server/service/order-inventory/order-inventory-types.js +12 -12
  14. package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
  15. package/dist-server/service/order-inventory/order-inventory.js +189 -13
  16. package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
  17. package/dist-server/service/order-package-item/order-package-item-types.js +14 -2
  18. package/dist-server/service/order-package-item/order-package-item-types.js.map +1 -1
  19. package/dist-server/service/order-package-item/order-package-item.js +28 -2
  20. package/dist-server/service/order-package-item/order-package-item.js.map +1 -1
  21. package/dist-server/service/order-product/order-product-types.js +18 -18
  22. package/dist-server/service/order-product/order-product-types.js.map +1 -1
  23. package/dist-server/service/order-product/order-product.js +104 -13
  24. package/dist-server/service/order-product/order-product.js.map +1 -1
  25. package/dist-server/service/order-tote-item/order-tote-item-types.js +2 -2
  26. package/dist-server/service/order-tote-item/order-tote-item-types.js.map +1 -1
  27. package/dist-server/service/order-tote-item/order-tote-item.js +13 -1
  28. package/dist-server/service/order-tote-item/order-tote-item.js.map +1 -1
  29. package/dist-server/service/others/other-types.js +4 -0
  30. package/dist-server/service/others/other-types.js.map +1 -1
  31. package/dist-server/service/release-good/release-good-mutation.js +35 -6
  32. package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
  33. package/dist-server/service/release-good/release-good-query.js +24 -19
  34. package/dist-server/service/release-good/release-good-query.js.map +1 -1
  35. package/dist-server/service/release-good/release-good-types.js +1 -1
  36. package/dist-server/service/release-good/release-good-types.js.map +1 -1
  37. package/dist-server/utils/inventory-util.js +12 -8
  38. package/dist-server/utils/inventory-util.js.map +1 -1
  39. package/package.json +7 -7
  40. package/server/service/arrival-notice/arrival-notice-mutation.ts +40 -3
  41. package/server/service/arrival-notice/arrival-notice-query.ts +40 -68
  42. package/server/service/arrival-notice/arrival-notice-types.ts +4 -4
  43. package/server/service/inventory-check-item/inventory-check-item-types.ts +37 -10
  44. package/server/service/inventory-check-item/inventory-check-item.ts +52 -4
  45. package/server/service/order-inventory/order-inventory-query.ts +5 -0
  46. package/server/service/order-inventory/order-inventory-types.ts +12 -12
  47. package/server/service/order-inventory/order-inventory.ts +171 -13
  48. package/server/service/order-package-item/order-package-item-types.ts +12 -3
  49. package/server/service/order-package-item/order-package-item.ts +26 -2
  50. package/server/service/order-product/order-product-types.ts +18 -18
  51. package/server/service/order-product/order-product.ts +96 -12
  52. package/server/service/order-tote-item/order-tote-item-types.ts +3 -3
  53. package/server/service/order-tote-item/order-tote-item.ts +12 -1
  54. package/server/service/others/other-types.ts +3 -0
  55. package/server/service/release-good/release-good-mutation.ts +51 -9
  56. package/server/service/release-good/release-good-query.ts +89 -124
  57. package/server/service/release-good/release-good-types.ts +1 -1
  58. package/server/utils/inventory-util.ts +44 -54
@@ -1,4 +1,4 @@
1
- import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
1
+ import { Field, Float, ID, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
3
  import { OrderPackageItem } from './order-package-item'
4
4
 
@@ -9,6 +9,12 @@ export class NewOrderPackageItem {
9
9
 
10
10
  @Field({ nullable: true })
11
11
  status?: string
12
+
13
+ @Field(type => Float, { nullable: true })
14
+ releaseQty?: number
15
+
16
+ @Field(type => Float, { nullable: true })
17
+ packedQty?: number
12
18
  }
13
19
 
14
20
  @InputType()
@@ -19,9 +25,12 @@ export class OrderPackageItemPatch {
19
25
  @Field({ nullable: true })
20
26
  name?: string
21
27
 
22
- @Field({ nullable: true })
28
+ @Field(type => Float, { nullable: true })
23
29
  releaseQty?: number
24
30
 
31
+ @Field(type => Float, { nullable: true })
32
+ packedQty?: number
33
+
25
34
  @Field({ nullable: true })
26
35
  status?: string
27
36
 
@@ -46,6 +55,6 @@ export class TrackingInformation {
46
55
  @Field(type => String)
47
56
  sku: string
48
57
 
49
- @Field(type => String)
58
+ @Field(type => Float)
50
59
  releaseQty: number
51
60
  }
@@ -70,11 +70,35 @@ export class OrderPackageItem {
70
70
  @Field({ nullable: true })
71
71
  status?: string
72
72
 
73
- @Column({ nullable: true })
73
+ @Column({
74
+ type: 'decimal',
75
+ scale: 3,
76
+ nullable: true,
77
+ transformer: {
78
+ to: (value: string | null) => value,
79
+ from: (value: string | null) => {
80
+ if (value === null || value === undefined) return null
81
+ const parsed = parseFloat(value)
82
+ return isNaN(parsed) ? null : parsed
83
+ }
84
+ }
85
+ })
74
86
  @Field({ nullable: true })
75
87
  releaseQty: number
76
88
 
77
- @Column({ nullable: true })
89
+ @Column({
90
+ type: 'decimal',
91
+ scale: 3,
92
+ nullable: true,
93
+ transformer: {
94
+ to: (value: string | null) => value,
95
+ from: (value: string | null) => {
96
+ if (value === null || value === undefined) return null
97
+ const parsed = parseFloat(value)
98
+ return isNaN(parsed) ? null : parsed
99
+ }
100
+ }
101
+ })
78
102
  @Field({ nullable: true })
79
103
  packedQty: number
80
104
 
@@ -132,25 +132,25 @@ export class OrderProductPatch {
132
132
  @Field(type => Float, { nullable: true })
133
133
  unpackUomValue: number
134
134
 
135
- @Field(type => Int, { nullable: true })
135
+ @Field(type => Float, { nullable: true })
136
136
  packQty: number
137
137
 
138
- @Field(type => Int, { nullable: true })
138
+ @Field(type => Float, { nullable: true })
139
139
  adjustedPackQty: number
140
140
 
141
- @Field(type => Int, { nullable: true })
141
+ @Field(type => Float, { nullable: true })
142
142
  actualPackQty: number
143
143
 
144
- @Field(type => Int, { nullable: true })
144
+ @Field(type => Float, { nullable: true })
145
145
  unpackQty: number
146
146
 
147
- @Field(type => Int, { nullable: true })
147
+ @Field(type => Float, { nullable: true })
148
148
  palletQty: number
149
149
 
150
- @Field(type => Int, { nullable: true })
150
+ @Field(type => Float, { nullable: true })
151
151
  actualPalletQty: number
152
152
 
153
- @Field(type => Int, { nullable: true })
153
+ @Field(type => Float, { nullable: true })
154
154
  adjustedPalletQty: number
155
155
 
156
156
  @Field({ nullable: true })
@@ -162,7 +162,7 @@ export class OrderProductPatch {
162
162
  @Field({ nullable: true })
163
163
  totalUomValue: string
164
164
 
165
- @Field(type => Int, { nullable: true })
165
+ @Field(type => Float, { nullable: true })
166
166
  releaseQty: number
167
167
 
168
168
  @Field(type => Float, { nullable: true })
@@ -282,37 +282,37 @@ export class NewOrderProduct {
282
282
  @Field(type => Float, { nullable: true })
283
283
  unpackUomValue: number
284
284
 
285
- @Field(type => Int, { nullable: true })
285
+ @Field(type => Float, { nullable: true })
286
286
  packQty: number
287
287
 
288
- @Field(type => Int, { nullable: true })
288
+ @Field(type => Float, { nullable: true })
289
289
  adjustedPackQty: number
290
290
 
291
- @Field(type => Int, { nullable: true })
291
+ @Field(type => Float, { nullable: true })
292
292
  actualPackQty: number
293
293
 
294
- @Field(type => Int, { nullable: true })
294
+ @Field(type => Float, { nullable: true })
295
295
  unpackQty: number
296
296
 
297
- @Field(type => Int, { nullable: true })
297
+ @Field(type => Float, { nullable: true })
298
298
  palletQty: number
299
299
 
300
- @Field(type => Int, { nullable: true })
300
+ @Field(type => Float, { nullable: true })
301
301
  actualPalletQty: number
302
302
 
303
- @Field(type => Int, { nullable: true })
303
+ @Field(type => Float, { nullable: true })
304
304
  adjustedPalletQty: number
305
305
 
306
306
  @Field({ nullable: true })
307
- palletId: string
307
+ adjustedTotalUomValue: string
308
308
 
309
309
  @Field({ nullable: true })
310
- adjustedTotalUomValue: string
310
+ palletId: string
311
311
 
312
312
  @Field({ nullable: true })
313
313
  totalUomValue: string
314
314
 
315
- @Field(type => Int, { nullable: true })
315
+ @Field(type => Float, { nullable: true })
316
316
  releaseQty: number
317
317
 
318
318
  @Field(type => Float, { nullable: true })
@@ -254,25 +254,101 @@ export class OrderProduct {
254
254
  @Field({ nullable: true })
255
255
  adjustedUomValue: number
256
256
 
257
- @Column('float', { nullable: true })
257
+ @Column({
258
+ nullable: true,
259
+ type: 'decimal',
260
+ scale: 3,
261
+ transformer: {
262
+ to: (value: string | null) => value,
263
+ from: (value: string | null) => {
264
+ if (value === null || value === undefined) return null
265
+ const parsed = parseFloat(value)
266
+ return isNaN(parsed) ? null : parsed
267
+ }
268
+ }
269
+ })
270
+ @Field({ nullable: true })
271
+ unpackQty: number
272
+
273
+ @Column({
274
+ nullable: true,
275
+ type: 'decimal',
276
+ scale: 3,
277
+ transformer: {
278
+ to: (value: string | null) => value,
279
+ from: (value: string | null) => {
280
+ if (value === null || value === undefined) return null
281
+ const parsed = parseFloat(value)
282
+ return isNaN(parsed) ? null : parsed
283
+ }
284
+ }
285
+ })
258
286
  @Field({ nullable: true })
259
287
  unpackUomValue: number
260
288
 
261
- @Column()
262
- @Field()
289
+ @Column({
290
+ nullable: true,
291
+ type: 'decimal',
292
+ scale: 3,
293
+ transformer: {
294
+ to: (value: string | null) => value,
295
+ from: (value: string | null) => {
296
+ if (value === null || value === undefined) return null
297
+ const parsed = parseFloat(value)
298
+ return isNaN(parsed) ? null : parsed
299
+ }
300
+ }
301
+ })
302
+ @Field({ nullable: true })
263
303
  packQty: number
264
304
 
265
- @Column({ nullable: true })
305
+ @Column({
306
+ nullable: true,
307
+ type: 'decimal',
308
+ scale: 3,
309
+ transformer: {
310
+ to: (value: string | null) => value,
311
+ from: (value: string | null) => {
312
+ if (value === null || value === undefined) return null
313
+ const parsed = parseFloat(value)
314
+ return isNaN(parsed) ? null : parsed
315
+ }
316
+ }
317
+ })
266
318
  @Field({ nullable: true })
267
319
  adjustedPackQty: number
268
320
 
269
- @Column({ nullable: true })
321
+ @Column({
322
+ nullable: true,
323
+ type: 'decimal',
324
+ scale: 3,
325
+ transformer: {
326
+ to: (value: string | null) => value,
327
+ from: (value: string | null) => {
328
+ if (value === null || value === undefined) return null
329
+ const parsed = parseFloat(value)
330
+ return isNaN(parsed) ? null : parsed
331
+ }
332
+ }
333
+ })
270
334
  @Field({ nullable: true })
271
335
  actualPackQty: number
272
336
 
273
- @Column('float', { nullable: true })
337
+ @Column({
338
+ nullable: true,
339
+ type: 'decimal',
340
+ scale: 3,
341
+ transformer: {
342
+ to: (value: string | null) => value,
343
+ from: (value: string | null) => {
344
+ if (value === null || value === undefined) return null
345
+ const parsed = parseFloat(value)
346
+ return isNaN(parsed) ? null : parsed
347
+ }
348
+ }
349
+ })
274
350
  @Field({ nullable: true })
275
- unpackQty: number
351
+ releaseUomValue: number
276
352
 
277
353
  @Column('float', { nullable: true })
278
354
  @Field({ nullable: true })
@@ -326,14 +402,22 @@ export class OrderProduct {
326
402
  @Field({ nullable: true })
327
403
  adjustedTotalUomValue: string
328
404
 
329
- @Column({ nullable: true })
405
+ @Column({
406
+ nullable: true,
407
+ type: 'decimal',
408
+ scale: 3,
409
+ transformer: {
410
+ to: (value: string | null) => value,
411
+ from: (value: string | null) => {
412
+ if (value === null || value === undefined) return null
413
+ const parsed = parseFloat(value)
414
+ return isNaN(parsed) ? null : parsed
415
+ }
416
+ }
417
+ })
330
418
  @Field({ nullable: true })
331
419
  releaseQty: number
332
420
 
333
- @Column({ nullable: true, type: 'float' })
334
- @Field({ nullable: true })
335
- releaseUomValue: number
336
-
337
421
  @Column({ nullable: true })
338
422
  @Field({ nullable: true })
339
423
  remark: string
@@ -1,4 +1,4 @@
1
- import { Field, InputType, Int, ObjectType } from 'type-graphql'
1
+ import { Field, Float, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
3
  import { ObjectRef } from '@things-factory/shell'
4
4
 
@@ -30,7 +30,7 @@ export class NewOrderToteItem {
30
30
  @Field(type => ObjectRef, { nullable: true })
31
31
  orderTote: ObjectRef
32
32
 
33
- @Field(type => Int)
33
+ @Field(type => Float, { nullable: true })
34
34
  qty: number
35
35
  }
36
36
 
@@ -51,6 +51,6 @@ export class OrderToteItemPatch {
51
51
  @Field(type => ObjectRef, { nullable: true })
52
52
  orderTote: ObjectRef
53
53
 
54
- @Field(type => Int)
54
+ @Field(type => Float, { nullable: true })
55
55
  qty: number
56
56
  }
@@ -47,7 +47,18 @@ export class OrderToteItem {
47
47
  @RelationId((orderToteItem: OrderToteItem) => orderToteItem.orderTote)
48
48
  orderToteId: string
49
49
 
50
- @Column('int')
50
+ @Column({
51
+ type: 'decimal',
52
+ scale: 3,
53
+ transformer: {
54
+ to: (value: string | null) => value,
55
+ from: (value: string | null) => {
56
+ if (value === null || value === undefined) return null
57
+ const parsed = parseFloat(value)
58
+ return isNaN(parsed) ? null : parsed
59
+ }
60
+ }
61
+ })
51
62
  @Field({ nullable: true })
52
63
  qty?: number
53
64
 
@@ -37,6 +37,9 @@ export class InventoryProductGroup {
37
37
  @Field({ nullable: true })
38
38
  productBrand: string
39
39
 
40
+ @Field({ nullable: true })
41
+ isInventoryDecimal: boolean
42
+
40
43
  @Field({ nullable: true })
41
44
  packingType: string
42
45
 
@@ -65,6 +65,40 @@ import { editVas } from '../vas'
65
65
  import { ReleaseGood } from './release-good'
66
66
  import { bulkReleaseGoodsAvailableItemsFunction } from './release-good-query'
67
67
 
68
+ // Utility function for safe decimal arithmetic
69
+ function safeDecimalOperation(value1: number, value2: number, operation: 'add' | 'subtract' | 'multiply'): number {
70
+ // Convert to string with fixed precision to avoid floating point issues
71
+ const num1 = parseFloat(value1.toFixed(3))
72
+ const num2 = parseFloat(value2.toFixed(3))
73
+
74
+ let result: number
75
+ switch (operation) {
76
+ case 'add':
77
+ result = num1 + num2
78
+ break
79
+ case 'subtract':
80
+ result = num1 - num2
81
+ break
82
+ case 'multiply':
83
+ result = num1 * num2
84
+ break
85
+ default:
86
+ throw new Error('Invalid operation')
87
+ }
88
+
89
+ // Ensure result is within valid range and has correct precision
90
+ if (result < 0) {
91
+ throw new Error('Decimal value cannot be negative')
92
+ }
93
+
94
+ // Check if result exceeds maximum precision (10 digits total with 3 decimal places)
95
+ if (result > 9999999.999) {
96
+ throw new Error('Decimal value exceeds maximum allowed precision')
97
+ }
98
+
99
+ return parseFloat(result.toFixed(3))
100
+ }
101
+
68
102
  @Resolver(ReleaseGood)
69
103
  export class ReleaseGoodMutation {
70
104
  @Directive('@privilege(category: "order_customer", privilege: "mutation")')
@@ -444,8 +478,8 @@ export async function deleteReleaseGood(tx: EntityManager, name: string, user: U
444
478
 
445
479
  await tx.getRepository(Inventory).save({
446
480
  ...oi.inventory,
447
- lockedQty: oi.inventory.lockedQty - oi.releaseQty,
448
- lockedUomValue: oi.inventory.lockedUomValue - oi.releaseUomValue,
481
+ lockedQty: safeDecimalOperation(oi.inventory.lockedQty, oi.releaseQty, 'subtract'),
482
+ lockedUomValue: safeDecimalOperation(oi.inventory.lockedUomValue, oi.releaseUomValue, 'subtract'),
449
483
  updater: user
450
484
  })
451
485
  }
@@ -806,8 +840,12 @@ export async function generateReleaseGoodFunction(
806
840
  pbSettings.forEach(pbs => {
807
841
  splitOI = {
808
842
  ...oi,
809
- releaseQty: oi.releaseQty * pbs.bundleQty,
810
- releaseUomValue: oi.releaseUomValue * pbs.bundleQty * pbs.product.primaryValue,
843
+ releaseQty: safeDecimalOperation(oi.releaseQty, pbs.bundleQty, 'multiply'),
844
+ releaseUomValue: safeDecimalOperation(
845
+ safeDecimalOperation(oi.releaseUomValue, pbs.bundleQty, 'multiply'),
846
+ pbs.product.primaryValue,
847
+ 'multiply'
848
+ ),
811
849
  packingType: pbs.product.packingType,
812
850
  batchId: '',
813
851
  product: {
@@ -1397,8 +1435,8 @@ export async function rejectReleaseGood(
1397
1435
 
1398
1436
  await tx.getRepository(Inventory).save({
1399
1437
  ...oi.inventory,
1400
- lockedQty: oi.inventory.lockedQty - oi.releaseQty,
1401
- lockedUomValue: oi.inventory.lockedUomValue - oi.releaseUomValue,
1438
+ lockedQty: safeDecimalOperation(oi.inventory.lockedQty, oi.releaseQty, 'subtract'),
1439
+ lockedUomValue: safeDecimalOperation(oi.inventory.lockedUomValue, oi.releaseUomValue, 'subtract'),
1402
1440
  updater: user
1403
1441
  })
1404
1442
  }
@@ -1889,7 +1927,11 @@ function extractRawReleaseGoods(rawReleaseGoods): Partial<ReleaseGood[]> {
1889
1927
 
1890
1928
  // if there is duplicated SKU, merge them and sum up the releaseQty
1891
1929
  if (duplicateSkuIdx >= 0) {
1892
- releaseGoods[idx].orderInventories[duplicateSkuIdx].releaseQty += item.releaseQty
1930
+ releaseGoods[idx].orderInventories[duplicateSkuIdx].releaseQty = safeDecimalOperation(
1931
+ releaseGoods[idx].orderInventories[duplicateSkuIdx].releaseQty,
1932
+ item.releaseQty,
1933
+ 'add'
1934
+ )
1893
1935
  } else {
1894
1936
  releaseGoods[idx].orderInventories.push({
1895
1937
  sku: item.sku,
@@ -1897,8 +1939,8 @@ function extractRawReleaseGoods(rawReleaseGoods): Partial<ReleaseGood[]> {
1897
1939
  packingType: item.packingType,
1898
1940
  packingSize: item.packingSize,
1899
1941
  uom: item.uom,
1900
- releaseQty: item.releaseQty,
1901
- releaseUomValue: item.releaseUomValue
1942
+ releaseQty: parseFloat(item.releaseQty.toFixed(3)),
1943
+ releaseUomValue: parseFloat(item.releaseUomValue.toFixed(3))
1902
1944
  })
1903
1945
  }
1904
1946
  } else {