@things-factory/worksheet-base 4.3.185 → 4.3.187

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 (133) hide show
  1. package/dist-server/constants/worksheet.js +3 -1
  2. package/dist-server/constants/worksheet.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/ecommerce-controller.js +4 -1
  4. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  5. package/dist-server/controllers/ecommerce/sellercraft-controller.js +10 -1
  6. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  7. package/dist-server/controllers/index.js +1 -0
  8. package/dist-server/controllers/index.js.map +1 -1
  9. package/dist-server/controllers/outbound/picking-worksheet-controller.js +19 -4
  10. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  11. package/dist-server/controllers/pos/xilnex-controller.js +5 -1
  12. package/dist-server/controllers/pos/xilnex-controller.js.map +1 -1
  13. package/dist-server/controllers/replenishment/index.js +18 -0
  14. package/dist-server/controllers/replenishment/index.js.map +1 -0
  15. package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js +455 -0
  16. package/dist-server/controllers/replenishment/replenishment-worksheet-controller.js.map +1 -0
  17. package/dist-server/controllers/worksheet-controller.js +32 -9
  18. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  19. package/dist-server/entities/index.js +10 -2
  20. package/dist-server/entities/index.js.map +1 -1
  21. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +15 -1
  22. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -1
  23. package/dist-server/entities/warehouse-inventory-assignment-ranking.js +37 -0
  24. package/dist-server/entities/warehouse-inventory-assignment-ranking.js.map +1 -0
  25. package/dist-server/entities/worksheet.js +13 -9
  26. package/dist-server/entities/worksheet.js.map +1 -1
  27. package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js +57 -0
  28. package/dist-server/graphql/resolvers/worksheet/cancel-replenishment.js.map +1 -0
  29. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js +23 -1
  30. package/dist-server/graphql/resolvers/worksheet/confirm-cancellation-release-order.js.map +1 -1
  31. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js +7 -1
  32. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js +19 -0
  34. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.js.map +1 -0
  35. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js +2 -1
  36. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/index.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/index.js +5 -2
  38. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  39. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +37 -26
  40. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +16 -2
  42. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +290 -264
  44. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/picking/index.js +2 -1
  46. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js +12 -0
  48. package/dist-server/graphql/resolvers/worksheet/picking/replenishment-picking.js.map +1 -0
  49. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +142 -78
  50. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js +16 -0
  52. package/dist-server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.js.map +1 -0
  53. package/dist-server/graphql/resolvers/worksheet/putaway/index.js +4 -1
  54. package/dist-server/graphql/resolvers/worksheet/putaway/index.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js +15 -0
  56. package/dist-server/graphql/resolvers/worksheet/putaway/replenishment-putaway.js.map +1 -0
  57. package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js +16 -0
  58. package/dist-server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.js.map +1 -0
  59. package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js +81 -0
  60. package/dist-server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.js.map +1 -0
  61. package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js +17 -0
  62. package/dist-server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.js.map +1 -0
  63. package/dist-server/graphql/resolvers/worksheet/replenishment/index.js +6 -0
  64. package/dist-server/graphql/resolvers/worksheet/replenishment/index.js.map +1 -0
  65. package/dist-server/graphql/resolvers/worksheet/worksheet.js +1 -0
  66. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/worksheets.js +28 -2
  68. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  69. package/dist-server/graphql/types/worksheet/index.js +42 -1
  70. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  71. package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js +11 -0
  72. package/dist-server/graphql/types/worksheet/replenish-inventory-patch.js.map +1 -0
  73. package/dist-server/graphql/types/worksheet/worksheet-info.js +1 -0
  74. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  75. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  76. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  77. package/dist-server/index.js +1 -0
  78. package/dist-server/index.js.map +1 -1
  79. package/dist-server/utils/index.js +1 -0
  80. package/dist-server/utils/index.js.map +1 -1
  81. package/dist-server/utils/inventory-util.js +2 -0
  82. package/dist-server/utils/inventory-util.js.map +1 -1
  83. package/dist-server/utils/lmd-util.js +76 -0
  84. package/dist-server/utils/lmd-util.js.map +1 -0
  85. package/dist-server/utils/worksheet-no-generator.js +21 -1
  86. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  87. package/dist-server/utils/worksheet-util.js +3 -0
  88. package/dist-server/utils/worksheet-util.js.map +1 -1
  89. package/package.json +13 -13
  90. package/server/constants/worksheet.ts +3 -1
  91. package/server/controllers/ecommerce/ecommerce-controller.ts +4 -1
  92. package/server/controllers/ecommerce/sellercraft-controller.ts +15 -1
  93. package/server/controllers/index.ts +1 -1
  94. package/server/controllers/outbound/picking-worksheet-controller.ts +30 -10
  95. package/server/controllers/pos/xilnex-controller.ts +6 -1
  96. package/server/controllers/replenishment/index.ts +1 -0
  97. package/server/controllers/replenishment/replenishment-worksheet-controller.ts +632 -0
  98. package/server/controllers/worksheet-controller.ts +47 -13
  99. package/server/entities/index.ts +15 -2
  100. package/server/entities/warehouse-bizplace-onhand-inventory.ts +13 -1
  101. package/server/entities/warehouse-inventory-assignment-ranking.ts +19 -0
  102. package/server/entities/worksheet.ts +5 -1
  103. package/server/graphql/resolvers/worksheet/cancel-replenishment.ts +69 -0
  104. package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +22 -1
  105. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +6 -1
  106. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-replenishement-worksheet.ts +30 -0
  107. package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +3 -1
  108. package/server/graphql/resolvers/worksheet/index.ts +8 -2
  109. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +81 -41
  110. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +16 -2
  111. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +347 -301
  112. package/server/graphql/resolvers/worksheet/picking/index.ts +3 -1
  113. package/server/graphql/resolvers/worksheet/picking/replenishment-picking.ts +27 -0
  114. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +177 -95
  115. package/server/graphql/resolvers/worksheet/putaway/complete-replenishment-putaway.ts +25 -0
  116. package/server/graphql/resolvers/worksheet/putaway/index.ts +7 -1
  117. package/server/graphql/resolvers/worksheet/putaway/replenishment-putaway.ts +23 -0
  118. package/server/graphql/resolvers/worksheet/putaway/undo-replenishment-putaway.ts +22 -0
  119. package/server/graphql/resolvers/worksheet/putaway-replenishment-worksheet.ts +95 -0
  120. package/server/graphql/resolvers/worksheet/replenishment/activate-picking-replenishment.ts +26 -0
  121. package/server/graphql/resolvers/worksheet/replenishment/index.ts +5 -0
  122. package/server/graphql/resolvers/worksheet/worksheet.ts +1 -0
  123. package/server/graphql/resolvers/worksheet/worksheets.ts +38 -3
  124. package/server/graphql/types/worksheet/index.ts +42 -1
  125. package/server/graphql/types/worksheet/replenish-inventory-patch.ts +8 -0
  126. package/server/graphql/types/worksheet/worksheet-info.ts +1 -0
  127. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  128. package/server/index.ts +1 -0
  129. package/server/utils/index.ts +1 -0
  130. package/server/utils/inventory-util.ts +3 -0
  131. package/server/utils/lmd-util.ts +86 -0
  132. package/server/utils/worksheet-no-generator.ts +29 -1
  133. package/server/utils/worksheet-util.ts +4 -2
@@ -16,7 +16,8 @@ import {
16
16
  OrderVas,
17
17
  ReleaseGood,
18
18
  ReturnOrder,
19
- VasOrder
19
+ VasOrder,
20
+ Replenishment
20
21
  } from '@things-factory/sales-base'
21
22
  import { Domain } from '@things-factory/shell'
22
23
  import {
@@ -31,7 +32,14 @@ import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../constants'
31
32
  import { Worksheet, WorksheetDetail } from '../entities'
32
33
  import { WorksheetNoGenerator } from '../utils'
33
34
 
34
- export type ReferenceOrderType = ArrivalNotice | ReleaseGood | VasOrder | InventoryCheck | DeliveryOrder | ReturnOrder
35
+ export type ReferenceOrderType =
36
+ | ArrivalNotice
37
+ | ReleaseGood
38
+ | VasOrder
39
+ | InventoryCheck
40
+ | DeliveryOrder
41
+ | ReturnOrder
42
+ | Replenishment
35
43
  export type OrderTargetTypes = OrderProduct | OrderInventory | OrderVas
36
44
 
37
45
  export enum ReferenceOrderFields {
@@ -39,7 +47,8 @@ export enum ReferenceOrderFields {
39
47
  ReleaseGood = 'releaseGood',
40
48
  VasOrder = 'vasOrder',
41
49
  InventoryCheck = 'inventoryCheck',
42
- ReturnOrder = 'returnOrder'
50
+ ReturnOrder = 'returnOrder',
51
+ Replenishment = 'replenishment'
43
52
  }
44
53
 
45
54
  export enum OrderTargetFields {
@@ -121,6 +130,8 @@ export class WorksheetController {
121
130
  return ReferenceOrderFields.InventoryCheck
122
131
  } else if (refOrder instanceof ReturnOrder) {
123
132
  return ReferenceOrderFields.ReturnOrder
133
+ } else if (refOrder instanceof Replenishment) {
134
+ return ReferenceOrderFields.Replenishment
124
135
  } else {
125
136
  throw new Error(
126
137
  this.ERROR_MSG.VALIDITY.UNEXPECTED_FIELD_VALUE('refOrder', 'One of reference order type', refOrder)
@@ -247,13 +258,17 @@ export class WorksheetController {
247
258
  case ReferenceOrderFields.ReturnOrder:
248
259
  refOrder = await this.findRefOrder(ReturnOrder, refOrder, ['bizplace'])
249
260
  break
261
+
262
+ case ReferenceOrderFields.Replenishment:
263
+ refOrder = await this.findRefOrder(Replenishment, refOrder)
264
+ break
250
265
  }
251
266
  }
252
267
 
253
- const bizplace: Bizplace = refOrder.bizplace
268
+ const bizplace: Bizplace = refOrder?.bizplace
254
269
  const condition: FindOneOptions = {
255
270
  where: {
256
- bizplace,
271
+ bizplace: bizplace ? bizplace : null,
257
272
  domain: this.domain,
258
273
  type,
259
274
  [refOrderField]: refOrder
@@ -394,7 +409,10 @@ export class WorksheetController {
394
409
  additionalProps: Partial<Worksheet> = {}
395
410
  ): Promise<Worksheet> {
396
411
  let refOrderType: string = await this.getRefOrderField(refOrder)
397
- const bizplace: Bizplace = await this.extractBizplaceFromRefOrder(refOrder)
412
+ let bizplace: Bizplace
413
+ if (refOrderType !== 'replenishment') {
414
+ bizplace = await this.extractBizplaceFromRefOrder(refOrder)
415
+ }
398
416
 
399
417
  let existingWorksheet: Worksheet
400
418
  try {
@@ -411,10 +429,13 @@ export class WorksheetController {
411
429
 
412
430
  const worksheet: Partial<Worksheet> = {
413
431
  domain: this.domain,
414
- bizplace,
432
+ bizplace: bizplace ? bizplace : null,
415
433
  name: WorksheetNoGenerator.generate(type),
416
434
  type,
417
- status: WORKSHEET_STATUS.DEACTIVATED,
435
+ status:
436
+ refOrderType == 'replenishment' && type == WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT
437
+ ? WORKSHEET_STATUS.EXECUTING
438
+ : WORKSHEET_STATUS.DEACTIVATED,
418
439
  creator: this.user,
419
440
  updater: this.user,
420
441
  [refOrderType]: refOrder,
@@ -463,7 +484,11 @@ export class WorksheetController {
463
484
  orderTargets: OrderTargetTypes[],
464
485
  additionalProps: Partial<WorksheetDetail> = {}
465
486
  ): Promise<WorksheetDetail[]> {
466
- if (!worksheet.bizplace?.id) {
487
+ if (
488
+ !worksheet.bizplace?.id &&
489
+ type !== WORKSHEET_TYPE.PICKING_REPLENISHMENT &&
490
+ type !== WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT
491
+ ) {
467
492
  worksheet = await this.findWorksheetById(worksheet.id, ['bizplace'])
468
493
  }
469
494
  const bizplace: Bizplace = worksheet.bizplace
@@ -472,11 +497,12 @@ export class WorksheetController {
472
497
  const orderTargetField: string = this.getOrderTargetField(orderTarget)
473
498
  return {
474
499
  domain: this.domain,
475
- bizplace,
500
+ bizplace: bizplace ? bizplace : orderTarget.bizplace,
476
501
  worksheet,
477
502
  name: WorksheetNoGenerator.generate(type, true),
478
503
  type,
479
- status: WORKSHEET_STATUS.DEACTIVATED,
504
+ status:
505
+ type == WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT ? WORKSHEET_STATUS.EXECUTING : WORKSHEET_STATUS.DEACTIVATED,
480
506
  [orderTargetField]: orderTarget,
481
507
  creator: this.user,
482
508
  updater: this.user,
@@ -511,6 +537,8 @@ export class WorksheetController {
511
537
  entitySchema = InventoryCheck
512
538
  } else if (refOrder instanceof ReturnOrder) {
513
539
  entitySchema = ReturnOrder
540
+ } else if (refOrder instanceof Replenishment) {
541
+ entitySchema = Replenishment
514
542
  }
515
543
  }
516
544
 
@@ -746,7 +774,9 @@ export class WorksheetController {
746
774
  worksheetType === WORKSHEET_TYPE.PACKING ||
747
775
  worksheetType === WORKSHEET_TYPE.LOADING ||
748
776
  worksheetType === WORKSHEET_TYPE.WAREHOUSE_RETURN ||
749
- worksheetType === WORKSHEET_TYPE.UNLOADING_RETURN
777
+ worksheetType === WORKSHEET_TYPE.UNLOADING_RETURN ||
778
+ worksheetType === WORKSHEET_TYPE.PICKING_REPLENISHMENT ||
779
+ worksheetType === WORKSHEET_TYPE.PUTAWAY_REPLENISHMENT
750
780
  ) {
751
781
  let targetInventories: OrderInventory[] = worksheet.worksheetDetails
752
782
  .filter((wsd: WorksheetDetail) => wsd.status !== ORDER_INVENTORY_STATUS.REPLACED)
@@ -904,10 +934,11 @@ export class WorksheetController {
904
934
  worksheet.vasOrder ||
905
935
  worksheet.inventoryCheck ||
906
936
  worksheet.returnOrder ||
937
+ worksheet.replenishment ||
907
938
  null
908
939
  if (!refOrder) {
909
940
  const wsWithRefOrd: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne(worksheet.id, {
910
- relations: ['arrivalNotice', 'releaseGood', 'vasOrder', 'inventoryCheck', 'returnOrder']
941
+ relations: ['arrivalNotice', 'releaseGood', 'vasOrder', 'inventoryCheck', 'returnOrder', 'replenishment']
911
942
  })
912
943
 
913
944
  refOrder =
@@ -916,6 +947,7 @@ export class WorksheetController {
916
947
  wsWithRefOrd.vasOrder ||
917
948
  wsWithRefOrd.inventoryCheck ||
918
949
  wsWithRefOrd.returnOrder ||
950
+ wsWithRefOrd.replenishment ||
919
951
  null
920
952
  if (!refOrder) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheet.id))
921
953
  }
@@ -1221,6 +1253,8 @@ export class WorksheetController {
1221
1253
  entitySchema = InventoryCheck
1222
1254
  } else if (refOrder instanceof ReturnOrder) {
1223
1255
  entitySchema = ReturnOrder
1256
+ } else if (refOrder instanceof Replenishment) {
1257
+ entitySchema = Replenishment
1224
1258
  }
1225
1259
  }
1226
1260
 
@@ -1,8 +1,21 @@
1
1
  import { WarehouseBizplaceOnhandInventory } from './warehouse-bizplace-onhand-inventory'
2
+ import { WarehouseInventoryAssignmentRanking } from './warehouse-inventory-assignment-ranking'
2
3
  import { Worksheet } from './worksheet'
3
4
  import { WorksheetDetail } from './worksheet-detail'
4
5
  import { WorksheetMovement } from './worksheet-movement'
5
6
 
6
- export const entities = [Worksheet, WorksheetDetail, WorksheetMovement, WarehouseBizplaceOnhandInventory]
7
+ export const entities = [
8
+ Worksheet,
9
+ WorksheetDetail,
10
+ WorksheetMovement,
11
+ WarehouseBizplaceOnhandInventory,
12
+ WarehouseInventoryAssignmentRanking
13
+ ]
7
14
 
8
- export { WarehouseBizplaceOnhandInventory, Worksheet, WorksheetDetail, WorksheetMovement }
15
+ export {
16
+ WarehouseBizplaceOnhandInventory,
17
+ WarehouseInventoryAssignmentRanking,
18
+ Worksheet,
19
+ WorksheetDetail,
20
+ WorksheetMovement
21
+ }
@@ -16,6 +16,8 @@ import { ViewColumn, ViewEntity } from 'typeorm'
16
16
  COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0))) AS "remain_uom_value",
17
17
  COALESCE(sum(COALESCE(i.qty, 0::double precision))) AS "qty",
18
18
  COALESCE(sum(COALESCE(i.uom_value, 0::double precision))) AS "uom_value",
19
+ COALESCE(sum(COALESCE(i.transfer_qty, 0::double precision))) AS "transfer_qty",
20
+ COALESCE(sum(COALESCE(i.transfer_uom_value, 0::double precision))) AS "transfer_uom_value",
19
21
  'SINGLE' AS "group_type"
20
22
  FROM inventories i
21
23
  INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id AND l2.type NOT IN ('QUARANTINE', 'RESERVE')
@@ -43,6 +45,8 @@ import { ViewColumn, ViewEntity } from 'typeorm'
43
45
  COALESCE(MIN(FLOOR(pbs."available_uom_value")),0) AS "remain_uom_value",
44
46
  COALESCE(MIN(FLOOR(pbs."qty")), 0::double precision) AS "qty",
45
47
  COALESCE(MIN(FLOOR(pbs."uom_value")), 0::double precision) AS "uom_value",
48
+ COALESCE(MIN(FLOOR(pbs."transfer_qty")), 0::double precision) AS "transfer_qty",
49
+ COALESCE(MIN(FLOOR(pbs."transfer_uom_value")), 0::double precision) AS "transfer_uom_value",
46
50
  'BUNDLE' AS "group_type"
47
51
  FROM product_bundles pb
48
52
  INNER JOIN (
@@ -50,7 +54,9 @@ import { ViewColumn, ViewEntity } from 'typeorm'
50
54
  (SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0))) / min(pbs.bundle_qty) AS "available_qty",
51
55
  (SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0))) / min(pbs.bundle_qty) AS "available_uom_value",
52
56
  (sum(COALESCE(i.qty, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "qty",
53
- (sum(COALESCE(i.uom_value, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "uom_value"
57
+ (sum(COALESCE(i.uom_value, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "uom_value",
58
+ (sum(COALESCE(i.transfer_qty, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "transfer_qty",
59
+ (sum(COALESCE(i.transfer_uom_value, 0::double precision))) / min(pbs.bundle_qty)::double precision AS "transfer_uom_value"
54
60
  FROM product_bundle_settings pbs
55
61
  LEFT JOIN inventories i ON i.product_id = pbs.product_id AND i.status = 'STORED' AND i.obsolete = false
56
62
  INNER JOIN products p ON p.id = pbs.product_id AND CASE WHEN i.expiration_date is not null and p.shelf_life is not null then CURRENT_DATE < i.expiration_date - p.shelf_life else true end
@@ -112,6 +118,12 @@ export class WarehouseBizplaceOnhandInventory {
112
118
  @ViewColumn()
113
119
  remainUomValue: number
114
120
 
121
+ @ViewColumn()
122
+ transferQty: number
123
+
124
+ @ViewColumn()
125
+ transferUomValue: number
126
+
115
127
  @ViewColumn()
116
128
  groupType: string
117
129
  }
@@ -0,0 +1,19 @@
1
+ import { ViewColumn, ViewEntity } from 'typeorm'
2
+
3
+ @ViewEntity({
4
+ expression: `
5
+ select src.* from (select 0 as "rank", 'SHELF' as location_type
6
+ union all
7
+ select 1 as "rank", 'FLOOR' as location_type
8
+ union all
9
+ select 2 as "rank", 'STORAGE' as location_type
10
+ ) src
11
+ `
12
+ })
13
+ export class WarehouseInventoryAssignmentRanking {
14
+ @ViewColumn()
15
+ locationType: string
16
+
17
+ @ViewColumn()
18
+ rank: number
19
+ }
@@ -6,7 +6,8 @@ import {
6
6
  ReleaseGood,
7
7
  ShippingOrder,
8
8
  VasOrder,
9
- ReturnOrder
9
+ ReturnOrder,
10
+ Replenishment
10
11
  } from '@things-factory/sales-base'
11
12
  import { Domain } from '@things-factory/shell'
12
13
  import { Location } from '@things-factory/warehouse-base'
@@ -44,6 +45,9 @@ export class Worksheet {
44
45
  @ManyToOne(type => ReleaseGood)
45
46
  releaseGood: ReleaseGood
46
47
 
48
+ @ManyToOne(type => Replenishment)
49
+ replenishment: Replenishment
50
+
47
51
  @ManyToOne(type => ReturnOrder)
48
52
  returnOrder: ReturnOrder
49
53
 
@@ -0,0 +1,69 @@
1
+ import { In, Not, EntityManager } from 'typeorm'
2
+ import { Domain } from '@things-factory/shell'
3
+ import { Inventory } from '@things-factory/warehouse-base'
4
+ import { ORDER_INVENTORY_STATUS, ORDER_STATUS, OrderInventory, Replenishment } from '@things-factory/sales-base'
5
+ import { User } from '@things-factory/auth-base'
6
+ import { Worksheet, WorksheetDetail } from '../../../entities'
7
+
8
+ export const cancelReplenishment = {
9
+ async cancelReplenishment(_: any, { name }, context: any) {
10
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
11
+ let replenishment: Replenishment = await tx.getRepository(Replenishment).findOne({
12
+ where: { domain, name, status: Not(In([ORDER_STATUS.PICKING, ORDER_STATUS.PUTTING_AWAY])) },
13
+ relations: ['orderInventories', 'orderInventories.inventory', 'orderInventories.inventory.location']
14
+ })
15
+
16
+ if (!replenishment) throw new Error(`Replenishment doesn't exists.`)
17
+ let targetOIs: OrderInventory[] = replenishment.orderInventories
18
+
19
+ // change status to cancelled for order inventory that has not executed yet and remove locked qty
20
+
21
+ await Promise.all(
22
+ targetOIs.map(async (orderInventory: OrderInventory) => {
23
+ let inventory: Inventory = orderInventory.inventory
24
+
25
+ if (inventory && inventory.id) {
26
+ await tx
27
+ .createQueryBuilder()
28
+ .update(Inventory)
29
+ .set({
30
+ transferQty: () => `COALESCE("transfer_qty", 0) - ${orderInventory.releaseQty}`,
31
+ transferUomValue: () => `COALESCE("transfer_uom_value", 0) - ${orderInventory.releaseUomValue}`,
32
+ updater: user
33
+ })
34
+ .where('id = :id', { id: inventory.id })
35
+ .execute()
36
+ }
37
+
38
+ return orderInventory
39
+ })
40
+ )
41
+
42
+ await tx
43
+ .getRepository(OrderInventory)
44
+ .update(targetOIs, { status: ORDER_INVENTORY_STATUS.CANCELLED, updater: user })
45
+
46
+ let worksheet: Worksheet = await tx.getRepository(Worksheet).findOne({
47
+ where: { replenishment },
48
+ relations: ['worksheetDetails']
49
+ })
50
+
51
+ if (worksheet) {
52
+ let worksheetDetailIds = worksheet.worksheetDetails.map(wsd => wsd.id)
53
+
54
+ await tx
55
+ .getRepository(Worksheet)
56
+ .update({ id: worksheet.id }, { status: ORDER_INVENTORY_STATUS.CANCELLED, updater: this.user })
57
+
58
+ await tx
59
+ .getRepository(WorksheetDetail)
60
+ .update({ id: In(worksheetDetailIds) }, { status: ORDER_INVENTORY_STATUS.CANCELLED, updater: this.user })
61
+ }
62
+
63
+ await tx
64
+ .getRepository(Replenishment)
65
+ .update({ id: replenishment.id }, { status: ORDER_STATUS.CANCELLED, updater: this.user })
66
+
67
+ return worksheet
68
+ }
69
+ }
@@ -22,6 +22,7 @@ import {
22
22
  } from '@things-factory/warehouse-base'
23
23
 
24
24
  import { Worksheet, WorksheetDetail } from '../../../entities'
25
+ import { LastMileAPI } from '@things-factory/integration-lmd'
25
26
 
26
27
  export const confirmCancellationReleaseOrder = {
27
28
  async confirmCancellationReleaseOrder(_: any, { name }, context: any) {
@@ -35,7 +36,9 @@ export const confirmCancellationReleaseOrder = {
35
36
  'orderInventories',
36
37
  'orderInventories.inventory',
37
38
  'orderInventories.inventory.location',
38
- 'orderVass'
39
+ 'orderVass',
40
+ 'lastMileDelivery',
41
+ 'orderPackages'
39
42
  ]
40
43
  })
41
44
 
@@ -232,6 +235,24 @@ export const confirmCancellationReleaseOrder = {
232
235
  createSalesReturn(account)
233
236
  }
234
237
 
238
+ // cancel consignment for lmd orders
239
+ if (releaseGood?.lmdOption && releaseGood?.lastMileDelivery && releaseGood?.orderPackages) {
240
+ for (let op of releaseGood.orderPackages) {
241
+ if (op?.parcelId) {
242
+ let res = await LastMileAPI.deleteParcel({...releaseGood.lastMileDelivery, platform: 'lmdMiddleware'}, {
243
+ clientId: releaseGood.lastMileDelivery?.clientId,
244
+ clientPass: releaseGood.lastMileDelivery?.secretKey,
245
+ soldToAccountId: releaseGood.lastMileDelivery?.soldToAccountId,
246
+ pickupAccountId: releaseGood.lastMileDelivery?.pickupAccountId,
247
+ token: releaseGood.lastMileDelivery?.accessToken,
248
+ parcelId: op.parcelId,
249
+ warehouse: domain?.name
250
+ })
251
+ if (!res?.status) throw new Error('cannot cancel consignment note')
252
+ }
253
+ }
254
+ }
255
+
235
256
  return
236
257
  }
237
258
  }
@@ -13,7 +13,12 @@ import { Inventory, InventoryUtil, INVENTORY_TRANSACTION_TYPE } from '@things-fa
13
13
  export const generateReleaseGoodWorksheetResolver = {
14
14
  async generateReleaseGoodWorksheet(_: any, { releaseGoodNo, currentStatus = null }, context: any) {
15
15
  const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
16
- return await generatePickingWorksheet(tx, domain, user, releaseGoodNo, currentStatus)
16
+ let worksheet = await generatePickingWorksheet(tx, domain, user, releaseGoodNo, currentStatus)
17
+ if (worksheet) {
18
+ return true
19
+ } else {
20
+ return false
21
+ }
17
22
  }
18
23
  }
19
24
 
@@ -0,0 +1,30 @@
1
+ import { EntityManager } from 'typeorm'
2
+
3
+ import { User } from '@things-factory/auth-base'
4
+ import { OrderInventory } from '@things-factory/sales-base'
5
+ import { Domain } from '@things-factory/shell'
6
+
7
+ import { ReplenishmentWorksheetController } from '../../../../controllers'
8
+ import { Worksheet } from '../../../../entities'
9
+
10
+ export const generateReplenishmentWorksheetResolver = {
11
+ async generateReplenishmentWorksheets(_: any, { replenishmentNos }, context: any) {
12
+ const { tx, domain, user }: { tx: EntityManager; domain: Domain; user: User } = context.state
13
+
14
+ for (let i = 0; i < replenishmentNos.length; i++) {
15
+ await generateReplenishmentWorksheet(tx, domain, user, replenishmentNos[i])
16
+ }
17
+
18
+ return true
19
+ }
20
+ }
21
+
22
+ export async function generateReplenishmentWorksheet(
23
+ tx: EntityManager,
24
+ domain: Domain,
25
+ user: User,
26
+ replenishmentNo: string
27
+ ): Promise<Worksheet> {
28
+ const worksheetController: ReplenishmentWorksheetController = new ReplenishmentWorksheetController(tx, domain, user)
29
+ return await worksheetController.generateReplenishmentWorksheet(replenishmentNo)
30
+ }
@@ -8,6 +8,7 @@ import { generateMultipleReleaseGoodWorksheetResolver } from './generate-multipl
8
8
  import { generateVasOrderWorksheetResolver } from './generate-vas-order-worksheet'
9
9
  import { generateReturnOrderWorksheetResolver } from './generate-return-order-worksheet'
10
10
  import { generatePartialPutawayReturnWorksheetResolver } from './generate-partial-putaway-return-worksheet'
11
+ import { generateReplenishmentWorksheetResolver } from './generate-replenishement-worksheet'
11
12
 
12
13
  export const Mutations = {
13
14
  ...generateArrivalNoticeWorksheetResolver,
@@ -19,5 +20,6 @@ export const Mutations = {
19
20
  ...generateMultipleReleaseGoodWorksheetResolver,
20
21
  ...generateVasOrderWorksheetResolver,
21
22
  ...generateReturnOrderWorksheetResolver,
22
- ...generatePartialPutawayReturnWorksheetResolver
23
+ ...generatePartialPutawayReturnWorksheetResolver,
24
+ ...generateReplenishmentWorksheetResolver
23
25
  }
@@ -67,6 +67,9 @@ import { worksheetResolver } from './worksheet'
67
67
  import { worksheetByOrderNoResolver } from './worksheet-by-order-no'
68
68
  import { worksheetWithPaginationResolver } from './worksheet-with-pagination'
69
69
  import { worksheetsResolver } from './worksheets'
70
+ import { cancelReplenishment } from './cancel-replenishment'
71
+ import { Mutations as ReplenishmentMutations } from './replenishment'
72
+ import { putawayReplenishmentWorksheetResolver } from './putaway-replenishment-worksheet'
70
73
 
71
74
  export const Query = {
72
75
  ...worksheetsResolver,
@@ -102,7 +105,8 @@ export const Query = {
102
105
  ...sortingWorksheetResolver,
103
106
  ...findSortingReleaseOrdersByTaskNoResolver,
104
107
  ...findReleaseOrdersByTaskNoResolver,
105
- ...fetchDeliveryOrderROResolver
108
+ ...fetchDeliveryOrderROResolver,
109
+ ...putawayReplenishmentWorksheetResolver
106
110
  }
107
111
 
108
112
  export const Mutation = {
@@ -138,5 +142,7 @@ export const Mutation = {
138
142
  ...unpackingResolver,
139
143
  ...palletizingPallets,
140
144
  ...fetchSellercraftDocumentResolver,
141
- ...cancelDraftReleaseOrder
145
+ ...cancelDraftReleaseOrder,
146
+ ...cancelReplenishment,
147
+ ...ReplenishmentMutations
142
148
  }
@@ -1,16 +1,28 @@
1
- import { Brackets, getRepository, SelectQueryBuilder } from 'typeorm'
1
+ import {
2
+ Brackets,
3
+ getRepository,
4
+ SelectQueryBuilder
5
+ } from 'typeorm'
2
6
 
3
7
  import { User } from '@things-factory/auth-base'
4
8
  import { getPermittedBizplaceIds } from '@things-factory/biz-base'
5
9
  import { ORDER_INVENTORY_STATUS } from '@things-factory/sales-base'
6
- import { buildCondition, buildQuery, Domain } from '@things-factory/shell'
7
- import { Inventory, LOCATION_TYPE } from '@things-factory/warehouse-base'
10
+ import {
11
+ buildCondition,
12
+ buildQuery,
13
+ Domain
14
+ } from '@things-factory/shell'
15
+ import {
16
+ Inventory,
17
+ LOCATION_TYPE
18
+ } from '@things-factory/warehouse-base'
8
19
 
9
20
  export const inventoriesByPalletResolver = {
10
21
  async inventoriesByPallet(_: any, { filters, pagination, sortings, locationSortingRules }, context: any) {
11
22
  const { domain, user }: { domain: Domain; user: User } = context.state
12
23
  const params = { filters, pagination }
13
24
  let permittedBizplaceIds: string[] = await getPermittedBizplaceIds(domain, user)
25
+ const bizplaceId = params.filters.find(x => x.name == 'bizplace_id')
14
26
  const productFilters = params.filters.filter(x => x.name == 'productName')
15
27
  const recallFilters = params.filters.find(x => x.name === 'recall')
16
28
  const skipLockCheckFilters = params.filters.find(x => x.name === 'skipLockCheck')
@@ -18,17 +30,10 @@ export const inventoriesByPalletResolver = {
18
30
  skipLockCheckFilters && skipLockCheckFilters?.value ? skipLockCheckFilters?.value : false
19
31
  const productFilterColumns = ['sku', 'brandSku', 'name', 'description', 'brand', 'subBrand']
20
32
  params.filters = params.filters.filter(x => x.name != 'productName')
33
+ const batchIdFilters = params.filters.find(x => x.name == 'batchId')
21
34
 
22
- if (!params.filters.find((filter: any) => filter.name === 'bizplace')) {
23
- params.filters.push({
24
- name: 'bizplace',
25
- operator: 'in',
26
- value: permittedBizplaceIds,
27
- relation: true
28
- })
29
- } else {
30
- permittedBizplaceIds = params.filters.find(filter => filter.name === 'bizplace').value
31
- params.filters.find(filter => filter.name === 'bizplace').relation = true
35
+ if (!params.filters.find((filter: any) => filter.name === 'bizplace_id')) {
36
+ throw new Error('No Bizplace found')
32
37
  }
33
38
 
34
39
  const locationFilters = params.filters.find(x => x.name == 'locationName')
@@ -46,6 +51,8 @@ export const inventoriesByPalletResolver = {
46
51
  .leftJoinAndSelect('iv.creator', 'creator')
47
52
  .leftJoinAndSelect('iv.updater', 'updater')
48
53
  .andWhere('iv.qty > 0')
54
+ .andWhere('iv.transfer_qty <= 0')
55
+ .andWhere('iv.transfer_uom_value <= 0')
49
56
  .andWhere(
50
57
  `location.type ${recallFilters?.value === true ? '' : 'NOT'} IN ('${LOCATION_TYPE.QUARANTINE}', '${
51
58
  LOCATION_TYPE.RESERVE
@@ -63,12 +70,37 @@ export const inventoriesByPalletResolver = {
63
70
  oi.product_id = p2.id
64
71
  WHERE
65
72
  oi.status = '${ORDER_INVENTORY_STATUS.PENDING_SPLIT}'
66
- AND oi.bizplace_id IN (:...permittedBizplaceIds)
67
73
  AND oi.domain_id = (:domainId)
74
+ AND oi.bizplace_id = (:bizplaceId)
68
75
  )`,
69
- { permittedBizplaceIds, domainId: domain.id }
76
+ { bizplaceId: bizplaceId.value , domainId: domain.id }
70
77
  )
71
78
 
79
+ if (locationFilters) {
80
+ qb.andWhere
81
+ (`location.name ilike '${locationFilters.value}'`)
82
+ }
83
+
84
+ if (productFilters && productFilters.length > 0) {
85
+ let productInfo = productFilters[0]
86
+ qb.andWhere(
87
+ new Brackets(qb2 => {
88
+ productFilterColumns.forEach(filter => {
89
+ const condition = buildCondition(
90
+ 'product',
91
+ filter,
92
+ 'i_like',
93
+ productInfo.value,
94
+ false,
95
+ Object.keys(qb.getParameters()).length
96
+ )
97
+
98
+ qb2.orWhere(condition.clause, condition.parameters)
99
+ })
100
+ })
101
+ )
102
+ }
103
+
72
104
  if (!skipLockCheck) {
73
105
  qb.andWhere('CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END >= 0')
74
106
  qb.andWhere('iv.qty - CASE WHEN iv.lockedQty IS NULL THEN 0 ELSE iv.lockedQty END > 0')
@@ -76,8 +108,39 @@ export const inventoriesByPalletResolver = {
76
108
 
77
109
  if (recallFilters?.value === true) {
78
110
  qb.orWhere(
79
- '(iv.obsolete = true or case when iv.expiration_date is not null and product.shelf_life is not null then CURRENT_DATE > iv.expiration_date - product.shelf_life else true end)'
80
- )
111
+ '(iv.domain_id = (:domainId) and iv.bizplace_id = (:bizplaceId)'
112
+ )
113
+ if (locationFilters){
114
+ qb.andWhere
115
+ (`location.name ilike '${locationFilters.value}'`)
116
+ }
117
+ if (productFilters && productFilters.length > 0) {
118
+ let productInfo = productFilters[0]
119
+ qb.andWhere(
120
+ new Brackets(qb2 => {
121
+ productFilterColumns.forEach(filter => {
122
+ const condition = buildCondition(
123
+ 'product',
124
+ filter,
125
+ 'i_like',
126
+ productInfo.value,
127
+ false,
128
+ Object.keys(qb.getParameters()).length
129
+ )
130
+
131
+ qb2.orWhere(condition.clause, condition.parameters)
132
+ })
133
+ })
134
+ )
135
+ }
136
+ if (batchIdFilters) {
137
+ qb.andWhere(
138
+ `iv.batch_id ilike '${batchIdFilters.value}'`
139
+ )
140
+ }
141
+ qb.andWhere(
142
+ 'iv.obsolete = true and case when iv.expiration_date is not null and product.shelf_life is not null then CURRENT_DATE > iv.expiration_date - product.shelf_life else true end)'
143
+ )
81
144
  } else {
82
145
  qb.andWhere('iv.obsolete = false')
83
146
  qb.andWhere(
@@ -85,10 +148,6 @@ export const inventoriesByPalletResolver = {
85
148
  )
86
149
  }
87
150
 
88
- if (locationFilters) {
89
- qb.andWhere(`location.name ilike '${locationFilters.value}'`)
90
- }
91
-
92
151
  if (sortings?.length !== 0) {
93
152
  const arrChildSortData = ['productName', 'productSKU']
94
153
 
@@ -112,25 +171,6 @@ export const inventoriesByPalletResolver = {
112
171
  qb.addOrderBy('location.name', 'DESC')
113
172
  }
114
173
 
115
- if (productFilters && productFilters.length > 0) {
116
- let productInfo = productFilters[0]
117
- qb.andWhere(
118
- new Brackets(qb2 => {
119
- productFilterColumns.forEach(filter => {
120
- const condition = buildCondition(
121
- 'product',
122
- filter,
123
- 'i_like',
124
- productInfo.value,
125
- false,
126
- Object.keys(qb.getParameters()).length
127
- )
128
-
129
- qb2.orWhere(condition.clause, condition.parameters)
130
- })
131
- })
132
- )
133
- }
134
174
  let [items, total] = await qb.getManyAndCount()
135
175
 
136
176
  items = await Promise.all(
@@ -161,4 +201,4 @@ async function getRemainAmount(inventory: Inventory): Promise<{ remainQty: numbe
161
201
  remainQty: inventory.qty - (inventory.lockedQty || 0),
162
202
  remainUomValue: inventory.uomValue - (inventory.lockedUomValue || 0)
163
203
  }
164
- }
204
+ }