@things-factory/worksheet-base 5.0.0-alpha.5 → 5.0.0-alpha.52

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 (243) hide show
  1. package/dist-server/constants/template.js +1 -0
  2. package/dist-server/constants/template.js.map +1 -1
  3. package/dist-server/controllers/ecommerce/sellercraft-controller.js +24 -10
  4. package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
  5. package/dist-server/controllers/inbound/putaway-worksheet-controller.js +22 -13
  6. package/dist-server/controllers/inbound/putaway-worksheet-controller.js.map +1 -1
  7. package/dist-server/controllers/inbound/unloading-worksheet-controller.js +309 -4
  8. package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
  9. package/dist-server/controllers/index.js +2 -0
  10. package/dist-server/controllers/index.js.map +1 -1
  11. package/dist-server/controllers/outbound/loading-worksheet-controller.js +56 -9
  12. package/dist-server/controllers/outbound/loading-worksheet-controller.js.map +1 -1
  13. package/dist-server/controllers/outbound/packing-worksheet-controller.js +172 -7
  14. package/dist-server/controllers/outbound/packing-worksheet-controller.js.map +1 -1
  15. package/dist-server/controllers/outbound/picking-worksheet-controller.js +500 -18
  16. package/dist-server/controllers/outbound/picking-worksheet-controller.js.map +1 -1
  17. package/dist-server/controllers/outbound/returning-worksheet-controller.js +11 -1
  18. package/dist-server/controllers/outbound/returning-worksheet-controller.js.map +1 -1
  19. package/dist-server/controllers/outbound/sorting-worksheet-controller.js +215 -12
  20. package/dist-server/controllers/outbound/sorting-worksheet-controller.js.map +1 -1
  21. package/dist-server/controllers/render-fm-grn.js +229 -0
  22. package/dist-server/controllers/render-fm-grn.js.map +1 -0
  23. package/dist-server/controllers/render-grn.js +77 -45
  24. package/dist-server/controllers/render-grn.js.map +1 -1
  25. package/dist-server/controllers/render-invoices.js +103 -65
  26. package/dist-server/controllers/render-invoices.js.map +1 -1
  27. package/dist-server/controllers/render-manifest.js +12 -5
  28. package/dist-server/controllers/render-manifest.js.map +1 -1
  29. package/dist-server/controllers/render-orientage-do.js.map +1 -1
  30. package/dist-server/controllers/render-orientage-grn.js +1 -0
  31. package/dist-server/controllers/render-orientage-grn.js.map +1 -1
  32. package/dist-server/controllers/render-po.js +147 -0
  33. package/dist-server/controllers/render-po.js.map +1 -0
  34. package/dist-server/controllers/render-ro-do.js +65 -1
  35. package/dist-server/controllers/render-ro-do.js.map +1 -1
  36. package/dist-server/controllers/worksheet-controller.js +23 -1
  37. package/dist-server/controllers/worksheet-controller.js.map +1 -1
  38. package/dist-server/entities/index.js +2 -1
  39. package/dist-server/entities/index.js.map +1 -1
  40. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js +174 -0
  41. package/dist-server/entities/warehouse-bizplace-onhand-inventory.js.map +1 -0
  42. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js +14 -1
  43. package/dist-server/graphql/resolvers/worksheet/batch-picking-worksheet.js.map +1 -1
  44. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js +17 -0
  45. package/dist-server/graphql/resolvers/worksheet/cancel-draft-release-order.js.map +1 -0
  46. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js +12 -4
  47. package/dist-server/graphql/resolvers/worksheet/cycle-count-adjustment.js.map +1 -1
  48. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js +30 -1
  49. package/dist-server/graphql/resolvers/worksheet/find-release-orders-by-task-no.js.map +1 -1
  50. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js +27 -23
  51. package/dist-server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.js.map +1 -1
  52. package/dist-server/graphql/resolvers/worksheet/index.js +2 -1
  53. package/dist-server/graphql/resolvers/worksheet/index.js.map +1 -1
  54. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js +3 -0
  55. package/dist-server/graphql/resolvers/worksheet/inventories-by-pallet.js.map +1 -1
  56. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js +48 -2
  57. package/dist-server/graphql/resolvers/worksheet/loading/complete-loading.js.map +1 -1
  58. package/dist-server/graphql/resolvers/worksheet/loading/loading.js +3 -10
  59. package/dist-server/graphql/resolvers/worksheet/loading/loading.js.map +1 -1
  60. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js +55 -21
  61. package/dist-server/graphql/resolvers/worksheet/loading-worksheet.js.map +1 -1
  62. package/dist-server/graphql/resolvers/worksheet/packing/index.js +2 -1
  63. package/dist-server/graphql/resolvers/worksheet/packing/index.js.map +1 -1
  64. package/dist-server/graphql/resolvers/worksheet/packing/packing.js +4 -4
  65. package/dist-server/graphql/resolvers/worksheet/packing/packing.js.map +1 -1
  66. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js +4 -4
  67. package/dist-server/graphql/resolvers/worksheet/packing/scan-product-packing.js.map +1 -1
  68. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js +15 -0
  69. package/dist-server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.js.map +1 -0
  70. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js +153 -132
  71. package/dist-server/graphql/resolvers/worksheet/packing-worksheet.js.map +1 -1
  72. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js +2 -5
  73. package/dist-server/graphql/resolvers/worksheet/palletizing-pallets.js.map +1 -1
  74. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js +13 -10
  75. package/dist-server/graphql/resolvers/worksheet/picking/assign-picking-worker.js.map +1 -1
  76. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js +1 -1
  77. package/dist-server/graphql/resolvers/worksheet/picking/complete-batch-picking.js.map +1 -1
  78. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js +14 -25
  79. package/dist-server/graphql/resolvers/worksheet/picking/complete-picking.js.map +1 -1
  80. package/dist-server/graphql/resolvers/worksheet/picking/index.js +3 -1
  81. package/dist-server/graphql/resolvers/worksheet/picking/index.js.map +1 -1
  82. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js +49 -58
  83. package/dist-server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.js.map +1 -1
  84. package/dist-server/graphql/resolvers/worksheet/picking/picking.js +4 -4
  85. package/dist-server/graphql/resolvers/worksheet/picking/picking.js.map +1 -1
  86. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js +4 -4
  87. package/dist-server/graphql/resolvers/worksheet/picking/scan-product-picking.js.map +1 -1
  88. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js +15 -0
  89. package/dist-server/graphql/resolvers/worksheet/picking/seal-tote.js.map +1 -0
  90. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js +15 -0
  91. package/dist-server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.js.map +1 -0
  92. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js +10 -1
  93. package/dist-server/graphql/resolvers/worksheet/picking-worksheet.js.map +1 -1
  94. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js +36 -0
  95. package/dist-server/graphql/resolvers/worksheet/putaway/complete-putaway.js.map +1 -1
  96. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js +11 -6
  97. package/dist-server/graphql/resolvers/worksheet/sorting/complete-order-sorting.js.map +1 -1
  98. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js +4 -4
  99. package/dist-server/graphql/resolvers/worksheet/sorting/scan-product-sorting.js.map +1 -1
  100. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js +4 -4
  101. package/dist-server/graphql/resolvers/worksheet/sorting/sorting-product.js.map +1 -1
  102. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js +6 -0
  103. package/dist-server/graphql/resolvers/worksheet/sorting-worksheet.js.map +1 -1
  104. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js +3 -2
  105. package/dist-server/graphql/resolvers/worksheet/unloaded-inventories.js.map +1 -1
  106. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js +0 -21
  107. package/dist-server/graphql/resolvers/worksheet/unloading/complete-unloading.js.map +1 -1
  108. package/dist-server/graphql/resolvers/worksheet/unloading/index.js +3 -1
  109. package/dist-server/graphql/resolvers/worksheet/unloading/index.js.map +1 -1
  110. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js +15 -0
  111. package/dist-server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.js.map +1 -0
  112. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js +15 -0
  113. package/dist-server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.js.map +1 -0
  114. package/dist-server/graphql/resolvers/worksheet/unloading/unload.js.map +1 -1
  115. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js +3 -1
  116. package/dist-server/graphql/resolvers/worksheet/unloading-worksheet.js.map +1 -1
  117. package/dist-server/graphql/resolvers/worksheet/worksheet.js +2 -0
  118. package/dist-server/graphql/resolvers/worksheet/worksheet.js.map +1 -1
  119. package/dist-server/graphql/resolvers/worksheet/worksheets.js +45 -5
  120. package/dist-server/graphql/resolvers/worksheet/worksheets.js.map +1 -1
  121. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js +13 -8
  122. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.js.map +1 -1
  123. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js +19 -4
  124. package/dist-server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.js.map +1 -1
  125. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js +24 -34
  126. package/dist-server/graphql/resolvers/worksheet-detail/generate-pallet-id.js.map +1 -1
  127. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js +12 -3
  128. package/dist-server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.js.map +1 -1
  129. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js +10 -2
  130. package/dist-server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.js.map +1 -1
  131. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js +2 -5
  132. package/dist-server/graphql/resolvers/worksheet-movement/create-worksheet-movement.js.map +1 -1
  133. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js +11 -0
  134. package/dist-server/graphql/types/worksheet/find-release-orders-by-task-no.js.map +1 -0
  135. package/dist-server/graphql/types/worksheet/index.js +52 -11
  136. package/dist-server/graphql/types/worksheet/index.js.map +1 -1
  137. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js +1 -0
  138. package/dist-server/graphql/types/worksheet/loaded-worksheet-detail.js.map +1 -1
  139. package/dist-server/graphql/types/worksheet/picking-assignment-status.js +2 -2
  140. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js +8 -3
  141. package/dist-server/graphql/types/worksheet/worksheet-detail-info.js.map +1 -1
  142. package/dist-server/graphql/types/worksheet/worksheet-info.js +3 -0
  143. package/dist-server/graphql/types/worksheet/worksheet-info.js.map +1 -1
  144. package/dist-server/graphql/types/worksheet/worksheet-patch.js +1 -0
  145. package/dist-server/graphql/types/worksheet/worksheet-patch.js.map +1 -1
  146. package/dist-server/graphql/types/worksheet/worksheet.js +1 -0
  147. package/dist-server/graphql/types/worksheet/worksheet.js.map +1 -1
  148. package/dist-server/graphql/types/worksheet-detail/index.js +0 -2
  149. package/dist-server/graphql/types/worksheet-detail/index.js.map +1 -1
  150. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js +5 -2
  151. package/dist-server/graphql/types/worksheet-detail/inventory-detail.js.map +1 -1
  152. package/dist-server/graphql/types/worksheet-detail/worksheet-detail-patch.js +1 -1
  153. package/dist-server/index.js +5 -0
  154. package/dist-server/index.js.map +1 -1
  155. package/dist-server/routes.js +12 -0
  156. package/dist-server/routes.js.map +1 -1
  157. package/dist-server/utils/inventory-util.js +14 -25
  158. package/dist-server/utils/inventory-util.js.map +1 -1
  159. package/dist-server/utils/worksheet-no-generator.js +25 -28
  160. package/dist-server/utils/worksheet-no-generator.js.map +1 -1
  161. package/package.json +17 -17
  162. package/server/constants/template.ts +1 -0
  163. package/server/controllers/ecommerce/sellercraft-controller.ts +38 -10
  164. package/server/controllers/inbound/putaway-worksheet-controller.ts +27 -13
  165. package/server/controllers/inbound/unloading-worksheet-controller.ts +376 -8
  166. package/server/controllers/index.ts +3 -0
  167. package/server/controllers/outbound/loading-worksheet-controller.ts +94 -15
  168. package/server/controllers/outbound/packing-worksheet-controller.ts +224 -9
  169. package/server/controllers/outbound/picking-worksheet-controller.ts +653 -24
  170. package/server/controllers/outbound/returning-worksheet-controller.ts +12 -1
  171. package/server/controllers/outbound/sorting-worksheet-controller.ts +303 -18
  172. package/server/controllers/render-fm-grn.ts +266 -0
  173. package/server/controllers/render-grn.ts +95 -52
  174. package/server/controllers/render-invoices.ts +119 -72
  175. package/server/controllers/render-manifest.ts +12 -5
  176. package/server/controllers/render-orientage-do.ts +11 -11
  177. package/server/controllers/render-orientage-grn.ts +12 -11
  178. package/server/controllers/render-po.ts +170 -0
  179. package/server/controllers/render-ro-do.ts +93 -8
  180. package/server/controllers/worksheet-controller.ts +32 -3
  181. package/server/entities/index.ts +2 -1
  182. package/server/entities/warehouse-bizplace-onhand-inventory.ts +147 -0
  183. package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +14 -0
  184. package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +27 -0
  185. package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +15 -5
  186. package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +35 -2
  187. package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +35 -25
  188. package/server/graphql/resolvers/worksheet/index.ts +3 -1
  189. package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +2 -0
  190. package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +67 -8
  191. package/server/graphql/resolvers/worksheet/loading/loading.ts +5 -12
  192. package/server/graphql/resolvers/worksheet/loading-worksheet.ts +66 -13
  193. package/server/graphql/resolvers/worksheet/packing/index.ts +3 -1
  194. package/server/graphql/resolvers/worksheet/packing/packing.ts +5 -4
  195. package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +9 -4
  196. package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
  197. package/server/graphql/resolvers/worksheet/packing-worksheet.ts +167 -145
  198. package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +2 -2
  199. package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +15 -11
  200. package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +1 -1
  201. package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +18 -31
  202. package/server/graphql/resolvers/worksheet/picking/index.ts +5 -1
  203. package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +62 -61
  204. package/server/graphql/resolvers/worksheet/picking/picking.ts +30 -4
  205. package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +7 -4
  206. package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
  207. package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
  208. package/server/graphql/resolvers/worksheet/picking-worksheet.ts +13 -2
  209. package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +45 -2
  210. package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +13 -9
  211. package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +6 -4
  212. package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +6 -4
  213. package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +6 -0
  214. package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +6 -2
  215. package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +0 -25
  216. package/server/graphql/resolvers/worksheet/unloading/index.ts +4 -0
  217. package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
  218. package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
  219. package/server/graphql/resolvers/worksheet/unloading/unload.ts +3 -1
  220. package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +3 -1
  221. package/server/graphql/resolvers/worksheet/worksheet.ts +2 -0
  222. package/server/graphql/resolvers/worksheet/worksheets.ts +64 -5
  223. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +30 -14
  224. package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +39 -11
  225. package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +46 -49
  226. package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +15 -3
  227. package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +18 -1
  228. package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +2 -2
  229. package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
  230. package/server/graphql/types/worksheet/index.ts +52 -11
  231. package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +1 -0
  232. package/server/graphql/types/worksheet/picking-assignment-status.ts +2 -2
  233. package/server/graphql/types/worksheet/worksheet-detail-info.ts +8 -3
  234. package/server/graphql/types/worksheet/worksheet-info.ts +3 -0
  235. package/server/graphql/types/worksheet/worksheet-patch.ts +1 -0
  236. package/server/graphql/types/worksheet/worksheet.ts +1 -0
  237. package/server/graphql/types/worksheet-detail/index.ts +0 -2
  238. package/server/graphql/types/worksheet-detail/inventory-detail.ts +5 -2
  239. package/server/graphql/types/worksheet-detail/worksheet-detail-patch.ts +1 -1
  240. package/server/index.ts +5 -0
  241. package/server/routes.ts +17 -0
  242. package/server/utils/inventory-util.ts +15 -23
  243. package/server/utils/worksheet-no-generator.ts +25 -25
@@ -20,11 +20,14 @@ import {
20
20
  VAS_TYPES
21
21
  } from '@things-factory/sales-base'
22
22
  import { Domain } from '@things-factory/shell'
23
+ import { PartnerSetting, Setting } from '@things-factory/setting-base'
23
24
  import {
24
25
  Inventory,
26
+ INVENTORY_ITEM_SOURCE,
25
27
  INVENTORY_STATUS,
26
28
  INVENTORY_TRANSACTION_TYPE,
27
29
  InventoryHistory,
30
+ InventoryItem,
28
31
  InventoryNoGenerator,
29
32
  Location,
30
33
  Pallet,
@@ -33,7 +36,7 @@ import {
33
36
 
34
37
  import { RULE_TYPE, WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
35
38
  import { Worksheet, WorksheetDetail } from '../../entities'
36
- import { DateGenerator } from '../../utils'
39
+ import { DateGenerator, generateInventoryHistory } from '../../utils'
37
40
  import { VasWorksheetController } from '../vas/vas-worksheet-controller'
38
41
 
39
42
  export type UnloadingWorksheetDetail = Partial<WorksheetDetail> & {
@@ -98,6 +101,10 @@ export class UnloadingWorksheetController extends VasWorksheetController {
98
101
  ]
99
102
  })
100
103
  if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
104
+ const targetProduct: OrderProduct = worksheetDetail.targetProduct
105
+
106
+ if (targetProduct && targetProduct.status == ORDER_PRODUCT_STATUS.EDITED)
107
+ throw new Error('this product is pending for changes approval')
101
108
 
102
109
  const bizplace: Bizplace = worksheetDetail.bizplace
103
110
  const companyDomain: Domain = bizplace?.company?.domain
@@ -105,7 +112,6 @@ export class UnloadingWorksheetController extends VasWorksheetController {
105
112
  const arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
106
113
  const returnOrder: ReturnOrder = worksheet.returnOrder
107
114
  const orderId: string = Boolean(arrivalNotice?.id) ? arrivalNotice.id : returnOrder.id
108
- const targetProduct: OrderProduct = worksheetDetail.targetProduct
109
115
  const targetInventory: OrderInventory = worksheetDetail?.targetInventory
110
116
  const originInventory: OrderInventory = targetInventory ? targetInventory.inventory : null
111
117
  const batchId: string = Boolean(arrivalNotice) ? targetProduct.batchId : targetInventory.batchId
@@ -241,6 +247,193 @@ export class UnloadingWorksheetController extends VasWorksheetController {
241
247
  }
242
248
  }
243
249
 
250
+ async scanSerialNumberUnload(
251
+ worksheetDetailName: string,
252
+ serialNumber: string,
253
+ inventory: Partial<Inventory>
254
+ ): Promise<void> {
255
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
256
+ where: {
257
+ name: worksheetDetailName,
258
+ status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED))
259
+ },
260
+ relations: [
261
+ 'bizplace',
262
+ 'worksheet',
263
+ 'worksheet.arrivalNotice',
264
+ 'worksheet.returnOrder',
265
+ 'worksheet.bufferLocation',
266
+ 'worksheet.bufferLocation.warehouse',
267
+ 'targetProduct',
268
+ 'targetProduct.product',
269
+ 'targetProduct.product.productDetails',
270
+ 'targetProduct.product.productDetails.childProductDetail',
271
+ 'targetInventory',
272
+ 'targetInventory.product',
273
+ 'targetInventory.product.productDetails',
274
+ 'targetInventory.product.productDetails.childProductDetail'
275
+ ]
276
+ })
277
+ if (!worksheetDetail) throw new Error(this.ERROR_MSG.FIND.NO_RESULT(worksheetDetailName))
278
+
279
+ if (!inventory?.palletId)
280
+ inventory.palletId = await generateId({
281
+ domain: this.domain,
282
+ type: RULE_TYPE.LOT_NUMBER_ID,
283
+ seed: { date: DateGenerator.generateDate() }
284
+ })
285
+
286
+ const targetProduct: OrderProduct = worksheetDetail.targetProduct
287
+
288
+ if (targetProduct.status == ORDER_PRODUCT_STATUS.EDITED)
289
+ throw new Error('this product is pending for changes approval')
290
+
291
+ const bizplace: Bizplace = worksheetDetail.bizplace
292
+ const worksheet: Worksheet = worksheetDetail.worksheet
293
+ const arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
294
+ const returnOrder: ReturnOrder = worksheet.returnOrder
295
+ const targetInventory: OrderInventory = worksheetDetail.targetInventory
296
+ const product: Product = Boolean(arrivalNotice) ? targetProduct.product : targetInventory.product
297
+ const packingType: string = Boolean(arrivalNotice) ? targetProduct.packingType : targetInventory.packingType
298
+ const packingSize: number = Boolean(arrivalNotice) ? targetProduct.packingSize : targetInventory.packingSize
299
+ const batchId: string = Boolean(arrivalNotice) ? targetProduct.batchId : targetInventory.batchId
300
+ let qty: number = 0
301
+ let uom: string = Boolean(arrivalNotice) ? targetProduct.uom : targetInventory.uom
302
+ const cartonId: string = inventory.cartonId
303
+ const orderId: string = Boolean(arrivalNotice) ? arrivalNotice.id : returnOrder.id
304
+ await this.checkSerialNumberDuplication(serialNumber, product)
305
+
306
+ qty++
307
+
308
+ const invQb: SelectQueryBuilder<Inventory> = await this.trxMgr
309
+ .getRepository(Inventory)
310
+ .createQueryBuilder('INV')
311
+ .where('INV.domain_id = :domainId', { domainId: this.domain.id })
312
+ .andWhere('INV.bizplace_id = :bizplaceId', { bizplaceId: bizplace.id })
313
+ .andWhere('INV.product_id = :productId', { productId: product.id })
314
+ .andWhere('INV.batch_id = :batchId', { batchId: batchId })
315
+ .andWhere('INV.packing_type = :packingType', { packingType: packingType })
316
+ .andWhere('INV.packing_size = :packingSize', { packingSize: packingSize })
317
+
318
+ if (arrivalNotice) invQb.andWhere('INV.ref_order_id = :arrivalNoticeId', { arrivalNoticeId: arrivalNotice.id })
319
+ else if (returnOrder) invQb.andWhere('INV.ref_order_id = :returnOrderId', { returnOrderId: returnOrder.id })
320
+
321
+ if (inventory?.expirationDate) {
322
+ invQb.andWhere('INV.expiration_date = :expirationDate', {
323
+ expirationDate: inventory.expirationDate
324
+ })
325
+ }
326
+
327
+ if (inventory?.cartonId) invQb.andWhere('INV.carton_id = :cartonId', { cartonId: inventory.cartonId })
328
+ else invQb.andWhere('INV.pallet_id = :palletId', { palletId: inventory.palletId })
329
+
330
+ let foundInventory: Inventory = await invQb.getOne()
331
+
332
+ const batchIdRef: string = Boolean(arrivalNotice) ? targetProduct.batchIdRef : null
333
+ const remark: string = Boolean(arrivalNotice) ? targetProduct.remark : targetInventory.remark
334
+ const manufactureDate: number = Boolean(arrivalNotice) ? targetProduct.manufactureDate : null
335
+ const location: Location = worksheet.bufferLocation
336
+ const warehouse: Warehouse = location.warehouse
337
+ const zone: string = location.zone
338
+ const unitCost: number = Boolean(arrivalNotice)
339
+ ? targetProduct?.unitPrice
340
+ ? ((targetProduct.packQty * targetProduct.unitPrice + targetProduct.miscAmt - targetProduct.discountAmt) *
341
+ (1 + targetProduct.taxRate / 100)) /
342
+ targetProduct.packQty
343
+ : 0
344
+ : null
345
+
346
+ if (!foundInventory) {
347
+ let newInventory: Partial<Inventory> = new Inventory()
348
+ newInventory.bizplace = bizplace
349
+ newInventory.domain = this.domain
350
+ newInventory.name = InventoryNoGenerator.inventoryName()
351
+ newInventory.palletId = inventory.palletId
352
+ newInventory.cartonId = inventory.cartonId
353
+ newInventory.batchId = batchId
354
+ newInventory.batchIdRef = batchIdRef
355
+ newInventory.product = product
356
+ newInventory.packingType = packingType
357
+ newInventory.packingSize = packingSize
358
+ newInventory.uom = uom
359
+ newInventory.remark = remark
360
+ newInventory.qty = qty
361
+ newInventory.uomValue =
362
+ Math.round(
363
+ qty *
364
+ (Boolean(arrivalNotice)
365
+ ? targetProduct.uomValue
366
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
367
+ 100
368
+ ) / 100
369
+ newInventory.manufactureDate = manufactureDate
370
+ newInventory.refOrderId = orderId
371
+ newInventory.unitCost = unitCost
372
+ if (inventory.reusablePallet?.id) {
373
+ newInventory.reusablePallet = await this.trxMgr.getRepository(Pallet).findOne(inventory.reusablePallet.id)
374
+ }
375
+ newInventory.orderProductId = Boolean(arrivalNotice) ? targetProduct.id : null
376
+ newInventory.orderInventoryId = Boolean(returnOrder) ? targetInventory.id : null
377
+ newInventory.warehouse = warehouse
378
+ newInventory.location = location
379
+ newInventory.zone = zone
380
+ newInventory.status = INVENTORY_STATUS.CHECKED
381
+ newInventory.creator = this.user
382
+
383
+ if (inventory?.expirationDate) {
384
+ newInventory.expirationDate = new Date(inventory.expirationDate)
385
+ }
386
+
387
+ if (arrivalNotice) {
388
+ targetProduct.actualPalletQty++
389
+ targetProduct.actualPackQty = Boolean(targetProduct.actualPackQty) ? targetProduct.actualPackQty + qty : qty
390
+ } else if (returnOrder) {
391
+ targetInventory.actualPalletQty++
392
+ targetInventory.actualPackQty = Boolean(targetInventory.actualPackQty)
393
+ ? targetInventory.actualPackQty + qty
394
+ : qty
395
+ }
396
+ foundInventory = await this.trxMgr.getRepository(Inventory).save(newInventory)
397
+ } else {
398
+ const updatedQty: number = foundInventory.qty + qty
399
+ foundInventory.expirationDate = new Date(foundInventory.expirationDate)
400
+ foundInventory.qty = updatedQty
401
+ foundInventory.uomValue +=
402
+ Math.round(
403
+ qty *
404
+ (Boolean(arrivalNotice)
405
+ ? targetProduct.uomValue
406
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
407
+ 100
408
+ ) / 100
409
+ if (arrivalNotice) targetProduct.actualPackQty = targetProduct.actualPackQty + qty
410
+ else if (returnOrder) targetInventory.actualPackQty = targetInventory.actualPackQty + qty
411
+ foundInventory = await this.trxMgr.getRepository(Inventory).save(foundInventory)
412
+ }
413
+
414
+ let inventoryItem: InventoryItem = new InventoryItem()
415
+ inventoryItem.name = InventoryNoGenerator.inventoryItemName()
416
+ inventoryItem.serialNumber = serialNumber
417
+ inventoryItem.status = foundInventory.status
418
+ inventoryItem.inboundOrderId = foundInventory.refOrderId
419
+ inventoryItem.product = product
420
+ inventoryItem.inventory = foundInventory
421
+ inventoryItem.source = INVENTORY_ITEM_SOURCE.INBOUND
422
+ inventoryItem.domain = this.domain
423
+ inventoryItem.creator = this.user
424
+ inventoryItem.updater = this.user
425
+
426
+ await this.trxMgr.getRepository(InventoryItem).save(inventoryItem)
427
+
428
+ if (arrivalNotice) {
429
+ targetProduct.updater = this.user
430
+ this.updateOrderTargets([targetProduct])
431
+ } else if (returnOrder) {
432
+ targetInventory.updater = this.user
433
+ this.updateOrderTargets([targetInventory])
434
+ }
435
+ }
436
+
244
437
  async scanProductUnload(
245
438
  worksheetDetailName: string,
246
439
  productBarcode: string,
@@ -277,11 +470,15 @@ export class UnloadingWorksheetController extends VasWorksheetController {
277
470
  seed: { date: DateGenerator.generateDate() }
278
471
  })
279
472
 
473
+ const targetProduct: OrderProduct = worksheetDetail.targetProduct
474
+
475
+ if (targetProduct.status == ORDER_PRODUCT_STATUS.EDITED)
476
+ throw new Error('this product is pending for changes approval')
477
+
280
478
  const bizplace: Bizplace = worksheetDetail.bizplace
281
479
  const worksheet: Worksheet = worksheetDetail.worksheet
282
480
  const arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
283
481
  const returnOrder: ReturnOrder = worksheet.returnOrder
284
- const targetProduct: OrderProduct = worksheetDetail.targetProduct
285
482
  const targetInventory: OrderInventory = worksheetDetail.targetInventory
286
483
  const product: Product = Boolean(arrivalNotice) ? targetProduct.product : targetInventory.product
287
484
  const packingType: string = Boolean(arrivalNotice) ? targetProduct.packingType : targetInventory.packingType
@@ -561,6 +758,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
561
758
  targetProduct.status = ORDER_PRODUCT_STATUS.UNLOADING
562
759
  } else {
563
760
  targetProduct.actualPackQty--
761
+ // targetProduct.actualPalletQty--
564
762
  }
565
763
  targetProduct.updater = this.user
566
764
  await this.updateOrderTargets([targetProduct])
@@ -587,6 +785,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
587
785
  targetInventory.status = ORDER_PRODUCT_STATUS.UNLOADING
588
786
  } else {
589
787
  targetInventory.actualPackQty--
788
+ // targetInventory.actualPalletQty--
590
789
  }
591
790
  targetInventory.updater = this.user
592
791
  await this.updateOrderTargets([targetInventory])
@@ -656,6 +855,60 @@ export class UnloadingWorksheetController extends VasWorksheetController {
656
855
  }
657
856
  }
658
857
 
858
+ async undoSerialNumberUnload(worksheetDetailName: string, inventoryItemId: string): Promise<void> {
859
+ const worksheetDetail: WorksheetDetail = await this.trxMgr.getRepository(WorksheetDetail).findOne({
860
+ where: { name: worksheetDetailName, domain: this.domain, status: Not(Equal(WORKSHEET_STATUS.DEACTIVATED)) },
861
+ relations: [
862
+ 'worksheet',
863
+ 'worksheet.arrivalNotice',
864
+ 'worksheet.returnOrder',
865
+ 'targetProduct',
866
+ 'targetProduct.product'
867
+ ]
868
+ })
869
+
870
+ let worksheet: Worksheet = worksheetDetail.worksheet
871
+ let arrivalNotice: ArrivalNotice = worksheet.arrivalNotice
872
+ let returnOrder: ReturnOrder = worksheet.returnOrder
873
+ let targetInventory: OrderInventory = worksheetDetail.targetInventory
874
+ let targetProduct: OrderProduct = worksheetDetail.targetProduct
875
+ let inventoryItem: InventoryItem = await this.trxMgr.getRepository(InventoryItem).findOne({
876
+ where: { domain: this.domain, id: inventoryItemId },
877
+ relations: ['inventory', 'product']
878
+ })
879
+ let inventory: Inventory = inventoryItem.inventory
880
+
881
+ await this.trxMgr.getRepository(InventoryItem).delete(inventoryItem.id)
882
+
883
+ inventory.qty--
884
+ inventory.uomValue =
885
+ Math.round(
886
+ inventory.qty *
887
+ (Boolean(arrivalNotice)
888
+ ? targetProduct.uomValue
889
+ : targetInventory.returnUomValue / targetInventory.returnQty) *
890
+ 100
891
+ ) / 100
892
+ await this.trxMgr
893
+ .getRepository(Inventory)
894
+ .update({ id: inventory.id }, { qty: inventory.qty, uomValue: inventory.uomValue })
895
+
896
+ targetProduct.actualPackQty--
897
+
898
+ const inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
899
+ where: { domain: this.domain, inboundOrderId: arrivalNotice.id, inventory }
900
+ })
901
+
902
+ if (inventoryItems?.length == 0) {
903
+ await this.trxMgr.getRepository(Inventory).delete(inventory.id)
904
+
905
+ targetProduct.actualPalletQty--
906
+ }
907
+
908
+ targetProduct.updater = this.user
909
+ await this.updateOrderTargets([targetProduct])
910
+ }
911
+
659
912
  async activateUnloading(
660
913
  worksheetNo: string,
661
914
  unloadingWorksheetDetails: UnloadingWorksheetDetail[]
@@ -715,6 +968,70 @@ export class UnloadingWorksheetController extends VasWorksheetController {
715
968
  return worksheet
716
969
  }
717
970
 
971
+ async getProductScanningVal(arrivalNotice: ArrivalNotice) {
972
+ let productScanning: string = 'false'
973
+ const enableProductScanning: Setting = await this.trxMgr.getRepository(Setting).findOne({
974
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-product-scanning' }
975
+ })
976
+
977
+ if (enableProductScanning) productScanning = enableProductScanning.value
978
+
979
+ const partnerEnableProductScanning: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
980
+ where: { setting: enableProductScanning, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
981
+ })
982
+
983
+ if (partnerEnableProductScanning) productScanning = partnerEnableProductScanning.value
984
+
985
+ return productScanning
986
+ }
987
+
988
+ async getInputQtyVal(arrivalNotice: ArrivalNotice) {
989
+ let inputQty: string = 'false'
990
+ const enableInputQty: Setting = await this.trxMgr.getRepository(Setting).findOne({
991
+ where: { domain: this.domain, category: 'id-rule', name: 'enable-input-qty' }
992
+ })
993
+
994
+ if (enableInputQty) inputQty = enableInputQty.value
995
+
996
+ const partnerEnableInputQty: PartnerSetting = await this.trxMgr.getRepository(PartnerSetting).findOne({
997
+ where: { setting: enableInputQty, domain: this.domain, partnerDomain: arrivalNotice.bizplace?.domain }
998
+ })
999
+
1000
+ if (partnerEnableInputQty) inputQty = partnerEnableInputQty.value
1001
+
1002
+ return inputQty
1003
+ }
1004
+
1005
+ // only creates inventory history upon partial or full unload when
1006
+ // productScanning is true
1007
+ // inputQty is false
1008
+ async createInventoryHistory(arrivalNotice: ArrivalNotice, inventories?: Inventory[]) {
1009
+ try {
1010
+ if (inventories === undefined) {
1011
+ const inventoryList = await this.trxMgr.getRepository(Inventory).findAndCount({
1012
+ where: {
1013
+ domain: this.domain,
1014
+ refOrderId: arrivalNotice.id
1015
+ }
1016
+ })
1017
+
1018
+ inventories = inventoryList[0]
1019
+ }
1020
+
1021
+ for (const inventory of inventories) {
1022
+ await this.transactionInventory(
1023
+ inventory,
1024
+ arrivalNotice,
1025
+ inventory.qty,
1026
+ inventory.uomValue,
1027
+ INVENTORY_TRANSACTION_TYPE.UNLOADING
1028
+ )
1029
+ }
1030
+ } catch (e) {
1031
+ throw e
1032
+ }
1033
+ }
1034
+
718
1035
  async completeUnloading(
719
1036
  arrivalNoticeNo: string,
720
1037
  unloadingWorksheetDetails: Partial<WorksheetDetail>[]
@@ -722,7 +1039,7 @@ export class UnloadingWorksheetController extends VasWorksheetController {
722
1039
  let arrivalNotice: ArrivalNotice = await this.findRefOrder(
723
1040
  ArrivalNotice,
724
1041
  { domain: this.domain, name: arrivalNoticeNo, status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY]) },
725
- ['orderProducts', 'releaseGood']
1042
+ ['orderProducts', 'releaseGood', 'bizplace', 'bizplace.domain']
726
1043
  )
727
1044
 
728
1045
  if (arrivalNotice.crossDocking) {
@@ -785,6 +1102,47 @@ export class UnloadingWorksheetController extends VasWorksheetController {
785
1102
  await this.completeWorksheet(worksheet)
786
1103
  }
787
1104
 
1105
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1106
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1107
+ if (productScanning === 'true' && inputQty === 'false') await this.createInventoryHistory(arrivalNotice)
1108
+
1109
+ const inventories: Inventory[] = await this.trxMgr.getRepository(Inventory).find({
1110
+ where: {
1111
+ domain: this.domain,
1112
+ refOrderId: arrivalNotice.id,
1113
+ status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.CHECKED])
1114
+ },
1115
+ relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']
1116
+ })
1117
+
1118
+ for (let inventory of inventories) {
1119
+ let inventoryItems: InventoryItem[] = await this.trxMgr.getRepository(InventoryItem).find({
1120
+ where: { domain: this.domain, inventory }
1121
+ })
1122
+
1123
+ if (inventoryItems?.length) {
1124
+ inventory.status = INVENTORY_STATUS.STORED
1125
+
1126
+ await Promise.all(
1127
+ inventoryItems.map(async inventoryItem => {
1128
+ await this.trxMgr
1129
+ .getRepository(InventoryItem)
1130
+ .update({ id: inventoryItem.id }, { status: INVENTORY_STATUS.STORED })
1131
+ })
1132
+ )
1133
+
1134
+ await generateInventoryHistory(
1135
+ inventory,
1136
+ arrivalNotice,
1137
+ INVENTORY_TRANSACTION_TYPE.UNLOADING,
1138
+ inventory.qty,
1139
+ inventory.uomValue,
1140
+ this.user,
1141
+ this.trxMgr
1142
+ )
1143
+ }
1144
+ }
1145
+
788
1146
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
789
1147
  where: {
790
1148
  arrivalNotice,
@@ -828,10 +1186,15 @@ export class UnloadingWorksheetController extends VasWorksheetController {
828
1186
  arrivalNoticeNo: string,
829
1187
  unloadingWorksheetDetail: Partial<WorksheetDetail>[]
830
1188
  ): Promise<Worksheet> {
831
- const arrivalNotice: ArrivalNotice = await this.findRefOrder(ArrivalNotice, {
832
- name: arrivalNoticeNo,
833
- status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
834
- })
1189
+ const arrivalNotice: ArrivalNotice = await this.findRefOrder(
1190
+ ArrivalNotice,
1191
+ {
1192
+ domain: this.domain,
1193
+ name: arrivalNoticeNo,
1194
+ status: In([ORDER_STATUS.PROCESSING, ORDER_STATUS.PUTTING_AWAY])
1195
+ },
1196
+ ['bizplace', 'bizplace.domain']
1197
+ )
835
1198
 
836
1199
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(arrivalNotice, WORKSHEET_TYPE.UNLOADING, [
837
1200
  'worksheetDetails',
@@ -870,6 +1233,11 @@ export class UnloadingWorksheetController extends VasWorksheetController {
870
1233
  })
871
1234
  await this.trxMgr.getRepository(Inventory).save(inventories)
872
1235
 
1236
+ const productScanning = await this.getProductScanningVal(arrivalNotice)
1237
+ const inputQty = await this.getInputQtyVal(arrivalNotice)
1238
+ if (productScanning === 'true' && inputQty === 'false')
1239
+ await this.createInventoryHistory(arrivalNotice, inventories)
1240
+
873
1241
  let vasWorksheet: Worksheet = await this.trxMgr.getRepository(Worksheet).findOne({
874
1242
  where: {
875
1243
  arrivalNotice,
@@ -7,7 +7,10 @@ export * from './render-kimeda-grn'
7
7
  export * from './render-orientage-grn'
8
8
  export * from './render-orientage-do'
9
9
  export * from './render-seebuu-grn'
10
+ export * from './render-fm-grn'
10
11
  export * from './render-manifest'
12
+ export * from './render-po'
13
+
11
14
 
12
15
  /* Worksheet Controllers */
13
16
  export * from './worksheet-controller'
@@ -1,4 +1,4 @@
1
- import { Equal, Not } from 'typeorm'
1
+ import { Equal, Not, In } from 'typeorm'
2
2
 
3
3
  import { Bizplace } from '@things-factory/biz-base'
4
4
  import {
@@ -8,9 +8,11 @@ import {
8
8
  ORDER_TYPES,
9
9
  OrderInventory,
10
10
  OrderNoGenerator,
11
- ReleaseGood
11
+ ReleaseGood,
12
+ OrderToteItem,
13
+ OrderTote
12
14
  } from '@things-factory/sales-base'
13
- import { Inventory, INVENTORY_TRANSACTION_TYPE } from '@things-factory/warehouse-base'
15
+ import { Inventory, INVENTORY_TRANSACTION_TYPE, Tote, TOTE_STATUS } from '@things-factory/warehouse-base'
14
16
 
15
17
  import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../constants'
16
18
  import { Worksheet, WorksheetDetail } from '../../entities'
@@ -95,8 +97,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
95
97
 
96
98
  async loading(
97
99
  releaseGoodNo: string,
98
- worksheetDetails: Partial<WorksheetDetail & { loadedQty: number }>[]
99
- ): Promise<void> {
100
+ worksheetDetails: Partial<WorksheetDetail & { loadedQty: number } & { toteName: string }>[]
101
+ ): Promise<any> {
100
102
  const releaseGood: ReleaseGood = await this.findRefOrder(
101
103
  ReleaseGood,
102
104
  { domain: this.domain, name: releaseGoodNo },
@@ -104,20 +106,29 @@ export class LoadingWorksheetController extends VasWorksheetController {
104
106
  )
105
107
  const bizplace: Bizplace = releaseGood.bizplace
106
108
 
107
- for (let worksheetDetail of worksheetDetails) {
108
- const loadedQty: number = worksheetDetail.loadedQty
109
- worksheetDetail = await this.findExecutableWorksheetDetailByName(worksheetDetail.name, WORKSHEET_TYPE.LOADING, [
110
- 'worksheet',
111
- 'targetInventory',
112
- 'targetInventory.inventory',
113
- 'targetInventory.product'
114
- ])
109
+ for (let i = 0; i < worksheetDetails.length; i++) {
110
+ const loadedQty: number = worksheetDetails[i].loadedQty
111
+ const toteName: string = worksheetDetails[i].toteName
112
+ let worksheetDetail = await this.findExecutableWorksheetDetailByName(
113
+ worksheetDetails[i].name,
114
+ WORKSHEET_TYPE.LOADING,
115
+ ['worksheet', 'targetInventory', 'targetInventory.inventory', 'targetInventory.product']
116
+ )
115
117
 
116
118
  const worksheet: Worksheet = worksheetDetail.worksheet
117
119
  let targetInventory: OrderInventory = worksheetDetail.targetInventory
118
120
  const pickedQty: number = targetInventory.releaseQty
119
121
  let inventory: Inventory = targetInventory.inventory
120
122
 
123
+ targetInventory.loadedAt = new Date()
124
+ targetInventory.loadedByUser = this.user
125
+
126
+ let loadedBy: string[] = targetInventory.loadedBy ? targetInventory.loadedBy.split(',') : []
127
+ if (!loadedBy.find(x => x == this.user.name)) {
128
+ loadedBy.push(this.user.name)
129
+ targetInventory.loadedBy = loadedBy.join(',')
130
+ }
131
+
121
132
  if (loadedQty > pickedQty) {
122
133
  throw new Error(this.ERROR_MSG.VALIDITY.CANT_PROCEED_STEP_BY('load', `loaded quantity can't exceed picked qty`))
123
134
  } else if (loadedQty == pickedQty) {
@@ -165,11 +176,56 @@ export class LoadingWorksheetController extends VasWorksheetController {
165
176
  newTargetInventory.updater = this.user
166
177
  newTargetInventory = await this.trxMgr.getRepository(OrderInventory).save(newTargetInventory)
167
178
 
168
- await this.createWorksheetDetails(worksheet, WORKSHEET_TYPE.LOADING, [newTargetInventory], {
169
- status: WORKSHEET_STATUS.EXECUTING
179
+ if (toteName) {
180
+ let foundOrderTote = await this.trxMgr
181
+ .getRepository(OrderTote)
182
+ .findOne({ where: { name: toteName, releaseGood } })
183
+
184
+ let foundOrderToteItems = await this.trxMgr
185
+ .getRepository(OrderToteItem)
186
+ .find({ where: { orderInventory: targetInventory.id } })
187
+
188
+ let foundOrderToteItemIds = foundOrderToteItems.map((itm: OrderToteItem) => itm.id)
189
+
190
+ await this.trxMgr
191
+ .getRepository(OrderToteItem)
192
+ .update({ id: In(foundOrderToteItemIds) }, { orderInventory: newTargetInventory })
193
+
194
+ let foundOrderToteItem: OrderToteItem = await this.trxMgr
195
+ .getRepository(OrderToteItem)
196
+ .findOne({ where: { orderInventory: newTargetInventory.id, orderTote: foundOrderTote, qty: loadedQty } })
197
+
198
+ await this.trxMgr
199
+ .getRepository(OrderToteItem)
200
+ .update({ id: foundOrderToteItem.id }, { orderInventory: targetInventory.id })
201
+ }
202
+
203
+ let newWorksheetDetail: any = await this.createWorksheetDetails(
204
+ worksheet,
205
+ WORKSHEET_TYPE.LOADING,
206
+ [newTargetInventory],
207
+ {
208
+ status: WORKSHEET_STATUS.EXECUTING
209
+ }
210
+ )
211
+
212
+ let worksheetDetailName = worksheetDetails[i].name
213
+ worksheetDetails = worksheetDetails.map(record => {
214
+ if (record.name == worksheetDetailName && !record?.targetInventory) {
215
+ return {
216
+ ...record,
217
+ name: newWorksheetDetail[0].name
218
+ }
219
+ } else {
220
+ return record
221
+ }
170
222
  })
223
+
224
+ worksheetDetails[i].name = worksheetDetailName
171
225
  }
172
226
 
227
+ worksheetDetails[i].targetInventory = targetInventory
228
+
173
229
  await generateInventoryHistory(
174
230
  inventory,
175
231
  releaseGood,
@@ -180,6 +236,8 @@ export class LoadingWorksheetController extends VasWorksheetController {
180
236
  this.trxMgr
181
237
  )
182
238
  }
239
+
240
+ return worksheetDetails
183
241
  }
184
242
 
185
243
  async undoLoading(deliveryOrder: Partial<DeliveryOrder>, palletIds: string[]): Promise<void> {
@@ -205,6 +263,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
205
263
  undoTargetOrderInventory.deliveryOrder = null
206
264
  undoTargetOrderInventory.updater = this.user
207
265
 
266
+ undoTargetOrderInventory.loadedAt = null
267
+ undoTargetOrderInventory.loadedByUser = null
268
+ undoTargetOrderInventory.loadedBy = null
269
+
208
270
  let prevTargetInventory: OrderInventory = await this.trxMgr.getRepository(OrderInventory).findOne({
209
271
  where: {
210
272
  domain: this.domain,
@@ -215,6 +277,10 @@ export class LoadingWorksheetController extends VasWorksheetController {
215
277
  }
216
278
  })
217
279
 
280
+ let undoOrderToteItem: OrderToteItem = await this.trxMgr
281
+ .getRepository(OrderToteItem)
282
+ .findOne({ where: { orderInventory: undoTargetOrderInventory } })
283
+
218
284
  if (prevTargetInventory) {
219
285
  // If there's prev target inventory
220
286
  // Merge qty and uomValue into prev target inventory
@@ -223,6 +289,13 @@ export class LoadingWorksheetController extends VasWorksheetController {
223
289
  prevTargetInventory.updater = this.user
224
290
  await this.updateOrderTargets([prevTargetInventory])
225
291
 
292
+ //Update order tote item if any
293
+ if (undoOrderToteItem) {
294
+ undoOrderToteItem.orderInventoryId = prevTargetInventory.id
295
+ undoOrderToteItem.orderInventory = prevTargetInventory
296
+ await this.trxMgr.getRepository(OrderToteItem).save(undoOrderToteItem)
297
+ }
298
+
226
299
  // Terminate undo target order inventory
227
300
  undoTargetOrderInventory.status = ORDER_INVENTORY_STATUS.TERMINATED
228
301
  await this.updateOrderTargets([undoTargetOrderInventory])
@@ -269,6 +342,12 @@ export class LoadingWorksheetController extends VasWorksheetController {
269
342
  status: ORDER_STATUS.LOADING
270
343
  })
271
344
 
345
+ const orderToteIds = await (
346
+ await this.trxMgr.getRepository(OrderTote).find({ where: { releaseGood }, relations: ['tote'] })
347
+ ).map((record: OrderTote) => record?.toteId)
348
+
349
+ await this.trxMgr.getRepository(Tote).update({ id: In(orderToteIds) }, { status: TOTE_STATUS.DISPATCHED })
350
+
272
351
  const worksheet: Worksheet = await this.findWorksheetByRefOrder(releaseGood, WORKSHEET_TYPE.LOADING, [
273
352
  'worksheetDetails',
274
353
  'worksheetDetails.targetInventory'