@things-factory/worksheet-base 4.0.0-y.0 → 4.0.0

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 (173) hide show
  1. package/dist-server/controllers/ecommerce/ecommerce-controller.js +23 -9
  2. package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/index.js +1 -0
  4. package/dist-server/controllers/ecommerce/index.js.map +1 -1
  5. package/dist-server/controllers/ecommerce/sellercraft-controller.js +168 -0
  6. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -0
  7. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +6 -5
  8. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/index.js +1 -0
  10. package/dist-server/controllers/index.js.map +1 -1
  11. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js +43 -8
  12. package/dist-server/controllers/inspect/cycle-count-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/packing-worksheet-controller.js +16 -1
  14. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/picking-worksheet-controller.js +17 -9
  16. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/render-grn.js +192 -0
  18. package/dist-server/controllers/render-grn.js.map +1 -0
  19. package/dist-server/controllers/render-job-sheet.js +51 -35
  20. package/dist-server/controllers/render-job-sheet.js.map +1 -1
  21. package/dist-server/controllers/render-kimeda-grn.js +12 -5
  22. package/dist-server/controllers/render-kimeda-grn.js.map +1 -1
  23. package/dist-server/controllers/render-ro-do.js +19 -5
  24. package/dist-server/controllers/render-ro-do.js.map +1 -1
  25. package/dist-server/controllers/render-seebuu-grn.js +9 -3
  26. package/dist-server/controllers/render-seebuu-grn.js.map +1 -1
  27. package/dist-server/controllers/vas/vas-worksheet-controller.js +75 -14
  28. package/dist-server/controllers/vas/vas-worksheet-controller.js.map +1 -1
  29. package/dist-server/controllers/worksheet-controller.js +61 -8
  30. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  31. package/dist-server/graphql/resolvers/pallet/pallet-outbound.js +1 -1
  32. package/dist-server/graphql/resolvers/pallet/pallet-outbound.js.map +1 -1
  33. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +23 -1
  34. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  35. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet.js +4 -2
  36. package/dist-server/graphql/resolvers/worksheet/cycle-count-worksheet.js.map +1 -1
  37. package/dist-server/graphql/resolvers/worksheet/fetch-sellercraft-airway-bill.js +25 -0
  38. package/dist-server/graphql/resolvers/worksheet/fetch-sellercraft-airway-bill.js.map +1 -0
  39. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-cycle-count-worksheet.js +4 -4
  40. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-cycle-count-worksheet.js.map +1 -1
  41. package/dist-server/graphql/resolvers/worksheet/index.js +5 -4
  42. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  43. package/dist-server/graphql/resolvers/worksheet/not-tally-target-inventories.js +2 -2
  44. package/dist-server/graphql/resolvers/worksheet/not-tally-target-inventories.js.map +1 -1
  45. package/dist-server/graphql/resolvers/worksheet/packing/activate-packing.js +13 -1
  46. package/dist-server/graphql/resolvers/worksheet/packing/activate-packing.js.map +1 -1
  47. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js +24 -38
  48. package/dist-server/graphql/resolvers/worksheet/packing/complete-packing.js.map +1 -1
  49. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +13 -1
  50. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  51. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +13 -1
  52. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  53. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +60 -19
  54. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  55. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js +20 -1
  56. package/dist-server/graphql/resolvers/worksheet/picking/activate-batch-picking.js.map +1 -1
  57. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js +24 -14
  58. package/dist-server/graphql/resolvers/worksheet/picking/activate-picking.js.map +1 -1
  59. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-inventories.js +4 -4
  60. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-inventories.js.map +1 -1
  61. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +19 -0
  62. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  63. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +124 -149
  64. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  65. package/dist-server/graphql/resolvers/worksheet/picking/undo-picking-assignment.js +4 -4
  66. package/dist-server/graphql/resolvers/worksheet/picking/undo-picking-assignment.js.map +1 -1
  67. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +2 -1
  68. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  69. package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js +1 -1
  70. package/dist-server/graphql/resolvers/worksheet/recommend-putway-location.js.map +1 -1
  71. package/dist-server/graphql/resolvers/worksheet/replace-picking-pallets.js +13 -4
  72. package/dist-server/graphql/resolvers/worksheet/replace-picking-pallets.js.map +1 -1
  73. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js +21 -2
  74. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js.map +1 -1
  75. package/dist-server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.js +18 -1
  76. package/dist-server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.js.map +1 -1
  77. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js +302 -11
  78. package/dist-server/graphql/resolvers/worksheet/vas-transactions/common-utils.js.map +1 -1
  79. package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.js.map +1 -1
  80. package/dist-server/graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging.js.map +1 -1
  81. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/complete-repackaging.js +137 -31
  82. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/complete-repackaging.js.map +1 -1
  83. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/repackaging.js +157 -42
  84. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/repackaging.js.map +1 -1
  85. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/undo-repackaging.js +35 -21
  86. package/dist-server/graphql/resolvers/worksheet/vas-transactions/repackaging/undo-repackaging.js.map +1 -1
  87. package/dist-server/graphql/resolvers/worksheet/worksheet.js +33 -27
  88. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  89. package/dist-server/graphql/resolvers/worksheet/worksheets.js +39 -10
  90. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  91. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +1 -1
  92. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  93. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +3 -2
  94. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  95. package/dist-server/graphql/resolvers/worksheet-detail/worksheet-details-by-product-group.js +3 -2
  96. package/dist-server/graphql/resolvers/worksheet-detail/worksheet-details-by-product-group.js.map +1 -1
  97. package/dist-server/graphql/types/index.js +2 -1
  98. package/dist-server/graphql/types/index.js.map +1 -1
  99. package/dist-server/graphql/types/pallet/index.js +10 -0
  100. package/dist-server/graphql/types/pallet/index.js.map +1 -0
  101. package/dist-server/graphql/types/worksheet/airwaybill.js +10 -0
  102. package/dist-server/graphql/types/worksheet/airwaybill.js.map +1 -0
  103. package/dist-server/graphql/types/worksheet/index.js +10 -2
  104. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  105. package/dist-server/graphql/types/worksheet/worksheet-info.js +2 -0
  106. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  107. package/dist-server/graphql/types/worksheet-detail/index.js +2 -1
  108. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  109. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js +1 -0
  110. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js.map +1 -1
  111. package/dist-server/routes.js +10 -6
  112. package/dist-server/routes.js.map +1 -1
  113. package/dist-server/utils/inventory-util.js +7 -3
  114. package/dist-server/utils/inventory-util.js.map +1 -1
  115. package/package.json +16 -15
  116. package/server/controllers/ecommerce/ecommerce-controller.ts +37 -10
  117. package/server/controllers/ecommerce/index.ts +1 -0
  118. package/server/controllers/ecommerce/sellercraft-controller.ts +223 -0
  119. package/server/controllers/inbound/unloading-worksheet-controller.ts +16 -13
  120. package/server/controllers/index.ts +1 -0
  121. package/server/controllers/inspect/cycle-count-worksheet-controller.ts +108 -43
  122. package/server/controllers/outbound/packing-worksheet-controller.ts +21 -4
  123. package/server/controllers/outbound/picking-worksheet-controller.ts +26 -11
  124. package/server/controllers/render-grn.ts +218 -0
  125. package/server/controllers/render-job-sheet.ts +51 -39
  126. package/server/controllers/render-kimeda-grn.ts +16 -12
  127. package/server/controllers/render-ro-do.ts +22 -6
  128. package/server/controllers/render-seebuu-grn.ts +12 -12
  129. package/server/controllers/vas/vas-worksheet-controller.ts +104 -23
  130. package/server/controllers/worksheet-controller.ts +87 -22
  131. package/server/graphql/resolvers/pallet/pallet-outbound.ts +2 -1
  132. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +30 -2
  133. package/server/graphql/resolvers/worksheet/cycle-count-worksheet.ts +7 -4
  134. package/server/graphql/resolvers/worksheet/fetch-sellercraft-airway-bill.ts +30 -0
  135. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-cycle-count-worksheet.ts +18 -3
  136. package/server/graphql/resolvers/worksheet/index.ts +6 -4
  137. package/server/graphql/resolvers/worksheet/not-tally-target-inventories.ts +4 -2
  138. package/server/graphql/resolvers/worksheet/packing/activate-packing.ts +20 -3
  139. package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +30 -49
  140. package/server/graphql/resolvers/worksheet/packing/packing.ts +22 -3
  141. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +22 -3
  142. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +71 -20
  143. package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +32 -3
  144. package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +31 -17
  145. package/server/graphql/resolvers/worksheet/picking/assign-picking-inventories.ts +4 -3
  146. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +31 -3
  147. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +143 -175
  148. package/server/graphql/resolvers/worksheet/picking/undo-picking-assignment.ts +5 -4
  149. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +5 -2
  150. package/server/graphql/resolvers/worksheet/recommend-putway-location.ts +1 -1
  151. package/server/graphql/resolvers/worksheet/replace-picking-pallets.ts +22 -9
  152. package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +27 -4
  153. package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.ts +23 -2
  154. package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +452 -14
  155. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.ts +36 -1
  156. package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging.ts +8 -2
  157. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/complete-repackaging.ts +185 -56
  158. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/repackaging.ts +210 -54
  159. package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/undo-repackaging.ts +64 -32
  160. package/server/graphql/resolvers/worksheet/worksheet.ts +67 -62
  161. package/server/graphql/resolvers/worksheet/worksheets.ts +51 -13
  162. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +1 -0
  163. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +2 -1
  164. package/server/graphql/resolvers/worksheet-detail/worksheet-details-by-product-group.ts +2 -1
  165. package/server/graphql/types/index.ts +2 -1
  166. package/server/graphql/types/pallet/index.ts +6 -0
  167. package/server/graphql/types/worksheet/airwaybill.ts +7 -0
  168. package/server/graphql/types/worksheet/index.ts +10 -2
  169. package/server/graphql/types/worksheet/worksheet-info.ts +2 -0
  170. package/server/graphql/types/worksheet-detail/index.ts +2 -1
  171. package/server/graphql/types/worksheet-detail/inventory-detail.ts +1 -0
  172. package/server/routes.ts +11 -6
  173. package/server/utils/inventory-util.ts +14 -5
@@ -1,32 +1,41 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
2
4
  import { Bizplace } from '@things-factory/biz-base'
3
- import { ArrivalNotice, OrderVas, ReleaseGood } from '@things-factory/sales-base'
5
+ import { Product } from '@things-factory/product-base'
6
+ import { OrderVas } from '@things-factory/sales-base'
4
7
  import { Domain } from '@things-factory/shell'
5
8
  import { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
6
- import { EntityManager } from 'typeorm'
7
- import {
8
- createLoadingWorksheet,
9
- createPutawayWorksheet,
10
- deductProductAmount,
11
- getCurrentAmount,
12
- upsertInventory
13
- } from '../common-utils'
9
+
10
+ import { deductProductAmount, temporaryGetCurrentAmount, upsertInventory } from '../common-utils'
14
11
  import {
12
+ FeaturedInventoryInterface,
15
13
  OperationGuideInterface,
16
14
  PackingUnits,
17
- PalletChangesInterface,
18
15
  RefOrderType,
19
16
  RepackagingGuide,
20
- RepackedInvInfo
17
+ RepackedInvInfo,
18
+ TemporaryPalletChangesInterface
21
19
  } from '../interfaces'
22
20
 
23
21
  export async function completeRepackaging(trxMgr: EntityManager, orderVas: OrderVas, user: User): Promise<void> {
24
22
  orderVas = await trxMgr.getRepository(OrderVas).findOne(orderVas.id, {
25
- relations: ['domain', 'bizplace', 'inventory', 'inventory.product', 'arrivalNotice', 'releaseGood', 'vasOrder']
23
+ relations: [
24
+ 'domain',
25
+ 'bizplace',
26
+ 'inventory',
27
+ 'inventory.product',
28
+ 'inventory.productDetail',
29
+ 'arrivalNotice',
30
+ 'releaseGood',
31
+ 'vasOrder',
32
+ 'vas'
33
+ ]
26
34
  })
27
35
  const domain: Domain = orderVas.domain
28
36
  const bizplace: Bizplace = orderVas.bizplace
29
37
  let originInv: Inventory = orderVas.inventory
38
+ let transactionType: string = INVENTORY_TRANSACTION_TYPE.REPACKAGING
30
39
  const operationGuide: OperationGuideInterface<RepackagingGuide> = JSON.parse(orderVas.operationGuide)
31
40
  const operationGuideData: RepackagingGuide = operationGuide.data
32
41
  const packingUnit: string = operationGuideData.packingUnit
@@ -34,20 +43,43 @@ export async function completeRepackaging(trxMgr: EntityManager, orderVas: Order
34
43
  const toPackingType: string = operationGuideData.toPackingType
35
44
  const { arrivalNotice, releaseGood, vasOrder } = orderVas
36
45
  const refOrder: RefOrderType = arrivalNotice || releaseGood || vasOrder
46
+ const repackedInvs: RepackedInvInfo[] = operationGuideData.repackedInvs
47
+ const repackedFroms: TemporaryPalletChangesInterface[] = extractRepackedFroms(
48
+ operationGuideData,
49
+ orderVas,
50
+ packingUnit
51
+ )
37
52
 
38
- const repackedInvs: RepackedInvInfo[] = extractRepackedInvs(operationGuideData, originInv)
39
- let originQty: number = 0
40
- let originUomValue: number = 0
53
+ if (orderVas.vas && orderVas.vas.operationGuide === 'vas-repack-relabel') {
54
+ transactionType = INVENTORY_TRANSACTION_TYPE.REPACKAGING_RELABELING
55
+ const toProduct: any = operationGuideData.toProduct
56
+
57
+ // please add domain filter as well
58
+ const foundProduct: Product = await trxMgr.getRepository(Product).findOne({
59
+ where: {
60
+ id: toProduct.product.id,
61
+ sku: toProduct.product.sku,
62
+ name: toProduct.product.name
63
+ }
64
+ })
65
+
66
+ if (!foundProduct) {
67
+ throw new Error(`Cannot find product with SKU ${toProduct.product.sku}`)
68
+ }
69
+
70
+ originInv.product = foundProduct
71
+ originInv.batchId = operationGuideData.toBatchId
72
+ originInv.productDetail = toProduct.productDetailId
73
+ }
41
74
 
42
75
  // create repacked inventories based on repackedInvs
43
76
  for (const ri of repackedInvs) {
44
- const repackedFromList: PalletChangesInterface[] = ri.repackedFrom.filter(
45
- (rf: PalletChangesInterface) => rf.toPalletId === ri.palletId
77
+ const repackedFromList: TemporaryPalletChangesInterface[] = ri.repackedFrom.filter(
78
+ (rf: TemporaryPalletChangesInterface) => rf.toPalletId === ri.palletId
46
79
  )
47
- const { qty, uomValue } = getCurrentAmount(repackedFromList, ri.palletId)
48
- const repackedPkgQty: number = packingUnit === PackingUnits.QTY ? qty / stdAmount : uomValue / stdAmount
49
80
 
50
- const changedInv: Inventory = await upsertInventory(
81
+ const { qty, uomValue } = temporaryGetCurrentAmount(repackedFromList, ri.palletId, packingUnit, stdAmount)
82
+ /* const changedInv: Inventory = */ await upsertInventory(
51
83
  trxMgr,
52
84
  domain,
53
85
  bizplace,
@@ -57,49 +89,146 @@ export async function completeRepackaging(trxMgr: EntityManager, orderVas: Order
57
89
  ri.palletId,
58
90
  ri.locationName,
59
91
  toPackingType,
60
- repackedPkgQty,
92
+ packingUnit == PackingUnits.QTY ? qty : ri.repackedPkgQty,
61
93
  uomValue,
62
- INVENTORY_TRANSACTION_TYPE.REPACKAGING
94
+ transactionType,
95
+ stdAmount,
96
+ packingUnit
63
97
  )
98
+ }
99
+
100
+ for (const rf of repackedFroms) {
101
+ let foundInventory: Inventory = await trxMgr.getRepository(Inventory).findOne({
102
+ where: {
103
+ domain,
104
+ bizplace,
105
+ palletId: rf.fromPalletId
106
+ }
107
+ })
64
108
 
65
- // accumulate qty and uomValue to update originInv in one shot
66
- originQty += qty
67
- originUomValue += uomValue
68
-
69
- // Create worksheet if it's related with Arrival Notice or Release Order
70
- if (refOrder instanceof ArrivalNotice) {
71
- // await createPutawayWorksheet(trxMgr, domain, bizplace, refOrder, originInv, changedInv, user)
72
- await createPutawayWorksheet(trxMgr, domain, bizplace, user, refOrder, originInv, changedInv)
73
- } else if (refOrder instanceof ReleaseGood) {
74
- // await createLoadingWorksheet(trxMgr, domain, bizplace, refOrder, originInv, changedInv, user)
75
- await createLoadingWorksheet(trxMgr, domain, bizplace, user, refOrder, originInv, changedInv)
109
+ if (foundInventory) {
110
+ let reducedQty: number
111
+ let reducedUomValue: number
112
+
113
+ if (packingUnit == PackingUnits.QTY) {
114
+ reducedQty = rf.reducedUnitQty / rf.packingSize
115
+ reducedUomValue = rf.reducedUomValue
116
+ } else if (packingUnit == PackingUnits.UOM) {
117
+ // reducedQty will remain 0 if there is remaining uomValue
118
+ reducedQty = foundInventory.uomValue - rf.reducedUomValue == 0 ? 1 : 0
119
+ reducedUomValue = rf.reducedUomValue
120
+ }
121
+
122
+ foundInventory = await deductProductAmount(
123
+ trxMgr,
124
+ domain,
125
+ bizplace,
126
+ user,
127
+ refOrder,
128
+ foundInventory,
129
+ reducedQty,
130
+ getRoundedAmount(reducedUomValue, 1000),
131
+ transactionType,
132
+ rf.originalQty,
133
+ getRoundedAmount(rf.originalUomValue, 1000),
134
+ rf.currentUnitQty,
135
+ rf.currentUomValue
136
+ )
76
137
  }
77
138
  }
139
+ }
140
+
141
+ function extractRepackedFroms(
142
+ operationGuideData: RepackagingGuide,
143
+ orderVas: OrderVas,
144
+ packingUnit: string
145
+ ): Partial<TemporaryPalletChangesInterface[]> {
146
+ return (
147
+ operationGuideData.repackedInvs
148
+ .reduce((acc, ri: RepackedInvInfo) => {
149
+ acc = [...acc, ...ri.repackedFrom]
150
+ return acc
151
+ }, [])
152
+ // .flat()
153
+ .reduce((acc, inv) => {
154
+ let foundInv = acc.find(a => a.fromPalletId == inv.fromPalletId)
155
+ if (foundInv) {
156
+ if (packingUnit == PackingUnits.QTY) {
157
+ foundInv.reducedUnitQty += inv.reducedUnitQty
158
+ foundInv.reducedUomValue += inv.reducedUomValue
159
+ } else if (packingUnit == PackingUnits.UOM) {
160
+ foundInv.reducedQty += inv.reducedQty
161
+ foundInv.reducedUomValue += inv.reducedUomValue
162
+ }
163
+ } else {
164
+ if (packingUnit == PackingUnits.QTY) {
165
+ acc.push({
166
+ fromPalletId: inv.fromPalletId,
167
+ reducedUnitQty: inv.reducedUnitQty,
168
+ reducedUomValue: inv.reducedUomValue,
169
+ packingSize: inv.packingSize
170
+ })
171
+ } else if (packingUnit == PackingUnits.UOM) {
172
+ acc.push({
173
+ fromPalletId: inv.fromPalletId,
174
+ reducedQty: inv.reducedQty,
175
+ reducedUomValue: inv.reducedUomValue,
176
+ packingSize: inv.packingSize
177
+ })
178
+ }
179
+ }
180
+
181
+ return acc
182
+ }, [])
183
+ .map((pc: TemporaryPalletChangesInterface) => {
184
+ const featuredInvs: FeaturedInventoryInterface[] = operationGuideData.featuredInvs || []
185
+ const foundFeaturedInv = featuredInvs.find(
186
+ (inv: FeaturedInventoryInterface) => inv.palletId === pc.fromPalletId
187
+ )
188
+
189
+ let originalQty: number
190
+ let originalUomValue: number
78
191
 
79
- // Deduct amount of product on original pallet or order inventory (Case for release order)
80
- originInv = await deductProductAmount(
81
- trxMgr,
82
- domain,
83
- bizplace,
84
- user,
85
- refOrder,
86
- originInv,
87
- originQty,
88
- originUomValue,
89
- INVENTORY_TRANSACTION_TYPE.REPACKAGING
192
+ if (foundFeaturedInv) {
193
+ originalQty = foundFeaturedInv.originalQty
194
+ originalUomValue = foundFeaturedInv.originalUomValue
195
+
196
+ if (packingUnit == PackingUnits.QTY) {
197
+ pc.currentUnitQty = foundFeaturedInv.currentUnitQty
198
+ } else if (packingUnit == PackingUnits.UOM) {
199
+ pc.currentUomValue = foundFeaturedInv.currentUomValue
200
+ }
201
+ } else {
202
+ originalQty =
203
+ packingUnit == PackingUnits.UOM
204
+ ? orderVas.qty
205
+ : orderVas.qty -
206
+ featuredInvs.reduce((qty: number, inv: FeaturedInventoryInterface) => {
207
+ return qty + inv.originalQty
208
+ }, 0)
209
+
210
+ originalUomValue =
211
+ orderVas.uomValue -
212
+ featuredInvs.reduce((uomValue: number, inv: FeaturedInventoryInterface) => {
213
+ return uomValue + inv.originalUomValue
214
+ }, 0)
215
+
216
+ if (packingUnit == PackingUnits.QTY) {
217
+ pc.currentUnitQty = originalQty - pc.reducedUnitQty / pc.packingSize
218
+ } else if (packingUnit == PackingUnits.UOM) {
219
+ pc.currentUomValue = getRoundedAmount(originalUomValue - pc.reducedUomValue)
220
+ }
221
+ }
222
+
223
+ return {
224
+ ...pc,
225
+ originalQty,
226
+ originalUomValue
227
+ }
228
+ })
90
229
  )
91
230
  }
92
231
 
93
- function extractRepackedInvs(operationGuideData: RepackagingGuide, originInv: Inventory): RepackedInvInfo[] {
94
- return operationGuideData.repackedInvs
95
- .filter((ri: RepackedInvInfo) => {
96
- const isPalletIncluded: boolean = Boolean(
97
- ri.repackedFrom.find((rf: PalletChangesInterface) => rf.fromPalletId === originInv.palletId)
98
- )
99
- if (isPalletIncluded) return ri
100
- })
101
- .map((ri: RepackedInvInfo) => {
102
- ri.repackedFrom = ri.repackedFrom.filter((rf: PalletChangesInterface) => rf.fromPalletId === originInv.palletId)
103
- return ri
104
- })
232
+ function getRoundedAmount(value: number, decimalPlace: number = 100): number {
233
+ return Math.round((value + Number.EPSILON) * decimalPlace) / decimalPlace
105
234
  }
@@ -1,25 +1,28 @@
1
+ import { EntityManager } from 'typeorm'
2
+
1
3
  import { User } from '@things-factory/auth-base'
2
4
  import { Bizplace } from '@things-factory/biz-base'
3
5
  import { OrderVas } from '@things-factory/sales-base'
4
6
  import { Domain } from '@things-factory/shell'
5
7
  import { Inventory, Location, Warehouse } from '@things-factory/warehouse-base'
6
- import { EntityManager } from 'typeorm'
8
+
7
9
  import { Worksheet, WorksheetDetail } from '../../../../../entities'
8
10
  import { checkPalletDuplication, checkPalletIdenticallity } from '../../../../../utils'
9
11
  import { executeVas } from '../../vas/execute-vas'
10
12
  import {
11
13
  assignInventory,
12
- getRemainInventoryAmount,
13
14
  getWorksheetDetailByName,
15
+ temporaryGetRemainInventoryAmount,
14
16
  updateRelatedOrderVas
15
17
  } from '../common-utils'
16
18
  import {
19
+ FeaturedInventoryInterface,
17
20
  OperationGuideInterface,
18
21
  PackingUnits,
19
- PalletChangesInterface,
20
22
  RefOrderType,
21
23
  RepackagingGuide,
22
- RepackedInvInfo
24
+ RepackedInvInfo,
25
+ TemporaryPalletChangesInterface
23
26
  } from '../interfaces'
24
27
 
25
28
  export const repackagingResolver = {
@@ -52,7 +55,7 @@ export const repackagingResolver = {
52
55
 
53
56
  // Check whether there's duplicated inventory in warehouse.
54
57
  if (await checkPalletDuplication(domain, bizplace, toPalletId, tx))
55
- throw new Error(`The Pallet ID (${toPalletId}) is duplicated.`)
58
+ throw new Error(`The lot ID (${toPalletId}) is duplicated.`)
56
59
 
57
60
  // Init refOrder
58
61
  const { arrivalNotice, releaseGood, vasOrder }: { [key: string]: RefOrderType } = targetVas
@@ -69,65 +72,142 @@ export const repackagingResolver = {
69
72
 
70
73
  let operationGuide: OperationGuideInterface<RepackagingGuide> = JSON.parse(targetVas.operationGuide)
71
74
  let operationGuideData: RepackagingGuide = operationGuide.data
72
- if (!operationGuideData.repackedInvs) operationGuideData.repackedInvs = []
73
- // const palletChanges: PalletChangesInterface[] = operationGuideData.repackedInvs
74
- // .map((ri: RepackedInvInfo) => ri.repackedFrom)
75
- // .flat()
76
-
77
- const palletChanges: PalletChangesInterface[] = []
78
-
79
- const { remainQty, remainUomValue } = await getRemainInventoryAmount(
80
- tx,
81
- refOrder,
82
- domain,
83
- bizplace,
84
- originInv,
85
- palletChanges,
86
- fromPalletId
87
- )
88
- const unitUomValue: number = remainUomValue / remainQty
75
+ let featuredInvs: FeaturedInventoryInterface[] = operationGuideData.featuredInvs
89
76
  const packingUnit: string = operationGuideData.packingUnit
90
77
  const stdAmount: number = operationGuideData.stdAmount
78
+
79
+ let repackedInvs: RepackedInvInfo[] = operationGuideData.repackedInvs
80
+
81
+ if (repackedInvs?.length && repackedInvs.some((inv: RepackedInvInfo) => inv.palletId == toPalletId))
82
+ throw new Error(`Unable to repack into the same lot ID ${toPalletId}`)
83
+
84
+ let palletChanges: TemporaryPalletChangesInterface[] = []
85
+
86
+ if (repackedInvs && repackedInvs.length) {
87
+ palletChanges = repackedInvs.reduce((acc, ri: RepackedInvInfo) => {
88
+ acc = [...acc, ...ri.repackedFrom]
89
+ return acc
90
+ }, [])
91
+ // .map((ri: RepackedInvInfo) => ri.repackedFrom).flat()
92
+ } else if (!repackedInvs) {
93
+ operationGuideData.repackedInvs = []
94
+ }
95
+
96
+ // get remainUnitQty of originInv (from previous repackaging actions)
97
+ let remainOriginInv: { remainUomValue: number; remainUnitQty: number } = {
98
+ remainUomValue: 0,
99
+ remainUnitQty: 0
100
+ }
101
+ let remainUomValue: number = 0
102
+ let remainUnitQty: number = 0
103
+
104
+ try {
105
+ remainOriginInv = await temporaryGetRemainInventoryAmount(
106
+ tx,
107
+ refOrder,
108
+ domain,
109
+ bizplace,
110
+ originInv,
111
+ palletChanges,
112
+ fromPalletId
113
+ )
114
+
115
+ remainUomValue = remainOriginInv.remainUomValue
116
+ remainUnitQty = remainOriginInv.remainUnitQty
117
+ } catch (err) {}
118
+
119
+ let repackedFroms: TemporaryPalletChangesInterface[] = []
91
120
  let repackedInv: RepackedInvInfo = getRepackedInv(operationGuideData, toPalletId, locationName)
121
+ let isCompleted: boolean = false
122
+ const repackagingAmount: number = stdAmount * packageQty
92
123
 
93
- let isCompleted: boolean = false // Flag for calling executeVas function to change status of worksheet detail
94
124
  if (packingUnit === PackingUnits.QTY) {
95
- const packingSize: number = originInv.packingSize
96
- const reducedQty: number =
97
- remainQty >= (stdAmount * packageQty) / packingSize ? (stdAmount * packageQty) / packingSize : remainQty
98
- const repackedFrom: PalletChangesInterface = {
99
- fromPalletId,
100
- toPalletId,
101
- reducedQty,
102
- reducedUomValue: reducedQty * unitUomValue
125
+ const singleUnitUomValue: number = originInv.uomValue / (originInv.qty * originInv.packingSize)
126
+ // const singleUnitUomValue: number = getRoundedAmount(
127
+ // originInv.uomValue / (originInv.qty * originInv.packingSize),
128
+ // 10000
129
+ // )
130
+
131
+ if (featuredInvs?.length && repackagingAmount > remainUnitQty) {
132
+ const inventoriesChanges = deductedFeaturedInventories(
133
+ featuredInvs,
134
+ repackagingAmount,
135
+ remainUnitQty,
136
+ toPalletId,
137
+ 'currentUnitQty'
138
+ )
139
+
140
+ operationGuideData.featuredInvs = inventoriesChanges.featuredInvs
141
+ repackedFroms = [...repackedFroms, ...inventoriesChanges.repackedFroms]
142
+
143
+ if (remainUnitQty > 0) {
144
+ repackedFroms.push({
145
+ fromPalletId,
146
+ toPalletId,
147
+ reducedUnitQty: remainUnitQty,
148
+ reducedUomValue: remainUnitQty * singleUnitUomValue,
149
+ packingSize: originInv.packingSize
150
+ })
151
+ }
152
+ } else if (remainUnitQty >= repackagingAmount) {
153
+ repackedFroms.push({
154
+ fromPalletId,
155
+ toPalletId,
156
+ reducedUnitQty: repackagingAmount,
157
+ reducedUomValue: repackagingAmount * singleUnitUomValue,
158
+ packingSize: originInv.packingSize
159
+ })
103
160
  }
104
161
 
105
- repackedInv.repackedFrom.push(repackedFrom)
162
+ repackedInv.repackedFrom = repackedFroms
106
163
  const totalPackedQty: number = repackedInv.repackedFrom.reduce(
107
- (qty: number, rf: PalletChangesInterface) => (qty += rf.reducedQty),
164
+ (qty: number, rf: TemporaryPalletChangesInterface) => (qty += rf.reducedUnitQty),
108
165
  0
109
166
  )
110
- repackedInv.repackedPkgQty = (totalPackedQty * packingSize) / stdAmount
111
- isCompleted = remainQty <= stdAmount * packageQty
167
+ repackedInv.repackedPkgQty = totalPackedQty / stdAmount
168
+ isCompleted = operationGuideData.requiredPackageQty == 0
112
169
  } else if (packingUnit === PackingUnits.UOM) {
113
- // Case 1. When batchProcess is true => Reduce as much as remainUomValue to complete this repackaging task
114
- // Case 2. When from pallet has more products than std amount => Reduce as much as stdAmount
115
- // Case 3. When from pallet has less products than std amount => Reduce as much as remainUomValue
116
- const reducedUomValue: number = remainUomValue >= stdAmount * packageQty ? stdAmount * packageQty : remainUomValue
117
- const repackedFrom: PalletChangesInterface = {
118
- fromPalletId,
119
- toPalletId,
120
- reducedUomValue,
121
- reducedQty: reducedUomValue / unitUomValue
170
+ if (featuredInvs?.length && repackagingAmount > remainUomValue) {
171
+ const inventoriesChanges = deductedFeaturedInventories(
172
+ featuredInvs,
173
+ repackagingAmount,
174
+ remainUomValue,
175
+ toPalletId,
176
+ 'currentUomValue'
177
+ )
178
+
179
+ operationGuideData.featuredInvs = inventoriesChanges.featuredInvs
180
+ repackedFroms = [...repackedFroms, ...inventoriesChanges.repackedFroms]
181
+
182
+ if (remainUomValue > 0) {
183
+ repackedFroms.push({
184
+ fromPalletId,
185
+ toPalletId,
186
+ reducedQty: 0,
187
+ reducedUomValue: remainUomValue,
188
+ // reducedUomValue: getRoundedAmount(remainUomValue),
189
+ packingSize: originInv.packingSize
190
+ })
191
+ }
192
+ } else if (remainUomValue >= repackagingAmount) {
193
+ repackedFroms.push({
194
+ fromPalletId,
195
+ toPalletId,
196
+ reducedQty: 0,
197
+ reducedUomValue: repackagingAmount,
198
+ // reducedUomValue: getRoundedAmount(repackagingAmount),
199
+ packingSize: originInv.packingSize
200
+ })
122
201
  }
123
202
 
124
- repackedInv.repackedFrom.push(repackedFrom)
203
+ repackedInv.repackedFrom = repackedFroms
125
204
  const totalPackedUomValue: number = repackedInv.repackedFrom.reduce(
126
- (uomValue: number, rf: PalletChangesInterface) => (uomValue += rf.reducedUomValue),
205
+ (qty: number, rf: TemporaryPalletChangesInterface) => (qty += rf.reducedUomValue),
127
206
  0
128
207
  )
129
208
  repackedInv.repackedPkgQty = totalPackedUomValue / stdAmount
130
- isCompleted = remainUomValue <= stdAmount * packageQty
209
+ // repackedInv.repackedPkgQty = getRoundedAmount(totalPackedUomValue / stdAmount)
210
+ isCompleted = operationGuideData.requiredPackageQty == 0
131
211
  }
132
212
 
133
213
  // Get total required package qty to complete this VAS Task
@@ -138,18 +218,24 @@ export const repackagingResolver = {
138
218
  wsd.worksheet,
139
219
  targetVas,
140
220
  packingUnit,
141
- stdAmount
221
+ stdAmount,
222
+ operationGuideData?.remainder || 0
142
223
  )
143
224
  // Get total repacked package qty until this transaction
144
225
  const repackedPackageQty: number = getRepackedPackageQty(operationGuideData.repackedInvs)
145
- const remainRequiredPackageQty: number = requiredPackageQty - repackedPackageQty
226
+ const remainRequiredPackageQty: number = getRoundedAmount(requiredPackageQty - repackedPackageQty)
146
227
 
147
- operationGuide.data.requiredPackageQty = remainRequiredPackageQty
148
- operationGuide.data.repackedInvs = operationGuideData.repackedInvs
228
+ // const requiredPackageQty: number = operationGuideData.requiredPackageQty - repackedPackageQty
229
+
230
+ operationGuide.data = {
231
+ ...operationGuideData,
232
+ requiredPackageQty: remainRequiredPackageQty
233
+ }
149
234
 
150
235
  // Update every order vas to share same operation guide
151
236
  await updateRelatedOrderVas<RepackagingGuide>(tx, domain, bizplace, wsd, targetVas, operationGuide, user)
152
237
 
238
+ // ######################### KIV DULU YANG NI #########################
153
239
  if (isCompleted || remainRequiredPackageQty === 0) {
154
240
  await executeVas(tx, domain, user, wsd)
155
241
  }
@@ -182,7 +268,8 @@ async function getRequiredPackageQty(
182
268
  worksheet: Worksheet,
183
269
  currentOV: OrderVas,
184
270
  packingUnit: string,
185
- stdAmount: number
271
+ stdAmount: number,
272
+ remainder: number
186
273
  ): Promise<number> {
187
274
  const relatedWSDs: WorksheetDetail[] = await tx.getRepository(WorksheetDetail).find({
188
275
  where: { domain, bizplace, worksheet },
@@ -206,9 +293,9 @@ async function getRequiredPackageQty(
206
293
  )
207
294
 
208
295
  if (packingUnit === PackingUnits.QTY) {
209
- return qty / stdAmount
296
+ return (qty - remainder) / stdAmount
210
297
  } else if (packingUnit === PackingUnits.UOM) {
211
- return uomValue / stdAmount
298
+ return Math.floor(uomValue / stdAmount)
212
299
  }
213
300
  }
214
301
 
@@ -236,3 +323,72 @@ function getRepackedInv(operationGuideData: RepackagingGuide, palletId: string,
236
323
 
237
324
  return repackedInv
238
325
  }
326
+
327
+ /**
328
+ * @description To transfer qty or uom value from featured inventories into origin inventory
329
+ * If and only if the origin inventory has insufficient amount
330
+ *
331
+ * @param {FeaturedInventoryInterface} featuredInvs
332
+ * @param {Number} repackagingAmount
333
+ * @param {Number} remainingAmount
334
+ * @param {String} packingUnit -- value is strictly for qty / uomValue
335
+ */
336
+ function deductedFeaturedInventories(
337
+ featuredInvs: FeaturedInventoryInterface[],
338
+ repackagingAmount: number,
339
+ remainingAmount: number,
340
+ toPalletId: string,
341
+ packingUnit: string
342
+ ): { featuredInvs: FeaturedInventoryInterface[]; repackedFroms: TemporaryPalletChangesInterface[] } {
343
+ let requiredAmount: number = getRoundedAmount(repackagingAmount - remainingAmount)
344
+ const repackedFroms: TemporaryPalletChangesInterface[] = []
345
+
346
+ featuredInvs = featuredInvs.map(inv => {
347
+ if (requiredAmount > 0 && inv[packingUnit] > 0) {
348
+ let reducedAmount: number = requiredAmount
349
+
350
+ if (inv[packingUnit] >= requiredAmount) {
351
+ inv[packingUnit] = inv[packingUnit] - requiredAmount
352
+ // inv[packingUnit] = getRoundedAmount(inv[packingUnit] - requiredAmount)
353
+ requiredAmount = 0
354
+ } else {
355
+ requiredAmount = requiredAmount - inv[packingUnit]
356
+ // requiredAmount = getRoundedAmount(requiredAmount - inv[packingUnit])
357
+ reducedAmount = inv[packingUnit]
358
+ inv[packingUnit] = 0
359
+ }
360
+
361
+ switch (packingUnit) {
362
+ case 'currentUnitQty':
363
+ repackedFroms.push({
364
+ fromPalletId: inv.palletId,
365
+ toPalletId,
366
+ reducedUnitQty: reducedAmount,
367
+ reducedUomValue: reducedAmount * inv.uomValuePerQty,
368
+ // reducedUomValue: getRoundedAmount(reducedAmount * inv.uomValuePerQty),
369
+ packingSize: featuredInvs.find(inv => inv.palletId == inv.palletId).packingSize
370
+ })
371
+ break
372
+
373
+ case 'currentUomValue':
374
+ repackedFroms.push({
375
+ fromPalletId: inv.palletId,
376
+ toPalletId,
377
+ reducedQty: 0,
378
+ reducedUomValue: reducedAmount,
379
+ // reducedUomValue: getRoundedAmount(reducedAmount),
380
+ packingSize: featuredInvs.find(inv => inv.palletId == inv.palletId).packingSize
381
+ })
382
+ break
383
+ }
384
+ }
385
+
386
+ return inv
387
+ })
388
+
389
+ return { featuredInvs, repackedFroms }
390
+ }
391
+
392
+ function getRoundedAmount(value, decimalPlace = 100) {
393
+ return Math.round((value + Number.EPSILON) * decimalPlace) / decimalPlace
394
+ }