@things-factory/worksheet-base 8.0.0-beta.9 → 8.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.
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js +2 -0
- package/dist-server/controllers/inbound/unloading-worksheet-controller.js.map +1 -1
- package/dist-server/graphql/resolvers/worksheet/vas-candidates.d.ts +2 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/inventory-util.d.ts +2 -0
- package/package.json +17 -17
- package/server/constants/index.ts +5 -0
- package/server/constants/rule-type.ts +4 -0
- package/server/constants/target-type.ts +6 -0
- package/server/constants/template.ts +12 -0
- package/server/constants/transaction-type.ts +9 -0
- package/server/constants/worksheet.ts +38 -0
- package/server/controllers/ecommerce/ecommerce-controller.ts +209 -0
- package/server/controllers/ecommerce/index.ts +2 -0
- package/server/controllers/ecommerce/sellercraft-controller.ts +358 -0
- package/server/controllers/inbound/index.ts +4 -0
- package/server/controllers/inbound/putaway-returning-worksheet-controller.ts +450 -0
- package/server/controllers/inbound/putaway-worksheet-controller.ts +454 -0
- package/server/controllers/inbound/unloading-returning-worksheet-controller.ts +291 -0
- package/server/controllers/inbound/unloading-worksheet-controller.ts +1400 -0
- package/server/controllers/index.ts +21 -0
- package/server/controllers/inspect/cycle-count-worksheet-controller.ts +537 -0
- package/server/controllers/inspect/index.ts +1 -0
- package/server/controllers/outbound/index.ts +5 -0
- package/server/controllers/outbound/loading-worksheet-controller.ts +377 -0
- package/server/controllers/outbound/packing-worksheet-controller.ts +449 -0
- package/server/controllers/outbound/picking-worksheet-controller.ts +1769 -0
- package/server/controllers/outbound/returning-worksheet-controller.ts +254 -0
- package/server/controllers/outbound/sorting-worksheet-controller.ts +554 -0
- package/server/controllers/render-elccl-grn.ts +228 -0
- package/server/controllers/render-fm-grn.ts +287 -0
- package/server/controllers/render-grn.ts +285 -0
- package/server/controllers/render-invoices.ts +201 -0
- package/server/controllers/render-job-sheet.ts +208 -0
- package/server/controllers/render-kimeda-grn.ts +185 -0
- package/server/controllers/render-manifest.ts +76 -0
- package/server/controllers/render-manual-do.ts +227 -0
- package/server/controllers/render-orientage-do.ts +376 -0
- package/server/controllers/render-orientage-grn.ts +191 -0
- package/server/controllers/render-po.ts +182 -0
- package/server/controllers/render-ro-do.ts +404 -0
- package/server/controllers/render-seebuu-grn.ts +208 -0
- package/server/controllers/vas/index.ts +1 -0
- package/server/controllers/vas/vas-worksheet-controller.ts +848 -0
- package/server/controllers/worksheet-controller.ts +1267 -0
- package/server/entities/index.ts +8 -0
- package/server/entities/warehouse-bizplace-onhand-inventory.ts +148 -0
- package/server/entities/worksheet-detail.ts +106 -0
- package/server/entities/worksheet-movement.ts +34 -0
- package/server/entities/worksheet.ts +100 -0
- package/server/graphql/index.ts +7 -0
- package/server/graphql/resolvers/index.ts +8 -0
- package/server/graphql/resolvers/pallet/index.ts +7 -0
- package/server/graphql/resolvers/pallet/pallet-outbound.ts +92 -0
- package/server/graphql/resolvers/worksheet/batch-picking-worksheet.ts +137 -0
- package/server/graphql/resolvers/worksheet/cancel-draft-release-order.ts +20 -0
- package/server/graphql/resolvers/worksheet/check-inventory-release.ts +37 -0
- package/server/graphql/resolvers/worksheet/check-stock-take-current-location.ts +63 -0
- package/server/graphql/resolvers/worksheet/confirm-cancellation-release-order.ts +213 -0
- package/server/graphql/resolvers/worksheet/create-worksheet.ts +21 -0
- package/server/graphql/resolvers/worksheet/cross-dock-picking.ts +173 -0
- package/server/graphql/resolvers/worksheet/cycle-count-adjustment.ts +211 -0
- package/server/graphql/resolvers/worksheet/cycle-count-worksheet.ts +79 -0
- package/server/graphql/resolvers/worksheet/delete-worksheet.ts +21 -0
- package/server/graphql/resolvers/worksheet/delivery-order-by-worksheet.ts +104 -0
- package/server/graphql/resolvers/worksheet/fetch-delivery-order-ro.ts +191 -0
- package/server/graphql/resolvers/worksheet/fetch-sellercraft-document.ts +69 -0
- package/server/graphql/resolvers/worksheet/find-release-orders-by-task-no.ts +36 -0
- package/server/graphql/resolvers/worksheet/find-release-orders-by-worksheet-no.ts +29 -0
- package/server/graphql/resolvers/worksheet/find-sorting-release-orders-by-task-no.ts +80 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-arrival-notice-worksheet.ts +100 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-batch-picking-worksheet.ts +26 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-cycle-count-worksheet.ts +51 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-multiple-release-good-worksheet.ts +17 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-partial-putaway-return-worksheet.ts +69 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-partial-putaway-worksheet.ts +65 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-putaway-worksheet.ts +54 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-release-good-worksheet.ts +114 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-return-order-worksheet.ts +45 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/generate-vas-order-worksheet.ts +35 -0
- package/server/graphql/resolvers/worksheet/generate-worksheet/index.ts +23 -0
- package/server/graphql/resolvers/worksheet/having-vas.ts +45 -0
- package/server/graphql/resolvers/worksheet/index.ts +142 -0
- package/server/graphql/resolvers/worksheet/inspecting/activate-cycle-count.ts +24 -0
- package/server/graphql/resolvers/worksheet/inspecting/add-extra-pallet.ts +49 -0
- package/server/graphql/resolvers/worksheet/inspecting/check-missing-pallet.ts +18 -0
- package/server/graphql/resolvers/worksheet/inspecting/complete-inspection.ts +41 -0
- package/server/graphql/resolvers/worksheet/inspecting/index.ts +17 -0
- package/server/graphql/resolvers/worksheet/inspecting/inspecting.ts +30 -0
- package/server/graphql/resolvers/worksheet/inspecting/relocate-pallet.ts +46 -0
- package/server/graphql/resolvers/worksheet/inspecting/undo-inspection.ts +23 -0
- package/server/graphql/resolvers/worksheet/inventories-by-pallet.ts +150 -0
- package/server/graphql/resolvers/worksheet/loaded-inventories.ts +40 -0
- package/server/graphql/resolvers/worksheet/loading/activate-loading.ts +73 -0
- package/server/graphql/resolvers/worksheet/loading/complete-loading.ts +165 -0
- package/server/graphql/resolvers/worksheet/loading/index.ts +11 -0
- package/server/graphql/resolvers/worksheet/loading/loading.ts +46 -0
- package/server/graphql/resolvers/worksheet/loading/undo-loading.ts +25 -0
- package/server/graphql/resolvers/worksheet/loading-worksheet.ts +150 -0
- package/server/graphql/resolvers/worksheet/not-tally-target-inventories.ts +34 -0
- package/server/graphql/resolvers/worksheet/packing/activate-packing.ts +69 -0
- package/server/graphql/resolvers/worksheet/packing/complete-packing.ts +102 -0
- package/server/graphql/resolvers/worksheet/packing/index.ts +13 -0
- package/server/graphql/resolvers/worksheet/packing/packing.ts +59 -0
- package/server/graphql/resolvers/worksheet/packing/scan-product-packing.ts +70 -0
- package/server/graphql/resolvers/worksheet/packing/undo-serial-number-packing.ts +24 -0
- package/server/graphql/resolvers/worksheet/packing-worksheet.ts +378 -0
- package/server/graphql/resolvers/worksheet/palletizing-pallets.ts +142 -0
- package/server/graphql/resolvers/worksheet/pending-cancellation-release-order.ts +234 -0
- package/server/graphql/resolvers/worksheet/picking/activate-batch-picking.ts +40 -0
- package/server/graphql/resolvers/worksheet/picking/activate-picking.ts +98 -0
- package/server/graphql/resolvers/worksheet/picking/assign-picking-inventories.ts +50 -0
- package/server/graphql/resolvers/worksheet/picking/assign-picking-worker.ts +44 -0
- package/server/graphql/resolvers/worksheet/picking/batch-picking.ts +32 -0
- package/server/graphql/resolvers/worksheet/picking/complete-batch-picking.ts +137 -0
- package/server/graphql/resolvers/worksheet/picking/complete-picking.ts +282 -0
- package/server/graphql/resolvers/worksheet/picking/fetch-and-assign-picking-task.ts +121 -0
- package/server/graphql/resolvers/worksheet/picking/index.ts +31 -0
- package/server/graphql/resolvers/worksheet/picking/my-picking-assignment-status.ts +35 -0
- package/server/graphql/resolvers/worksheet/picking/picking-assignment-status-by-user.ts +96 -0
- package/server/graphql/resolvers/worksheet/picking/picking.ts +55 -0
- package/server/graphql/resolvers/worksheet/picking/scan-product-batch-picking.ts +52 -0
- package/server/graphql/resolvers/worksheet/picking/scan-product-picking.ts +25 -0
- package/server/graphql/resolvers/worksheet/picking/seal-tote.ts +25 -0
- package/server/graphql/resolvers/worksheet/picking/undo-picking-assignment.ts +31 -0
- package/server/graphql/resolvers/worksheet/picking/undo-serial-number-picking.ts +24 -0
- package/server/graphql/resolvers/worksheet/picking-worksheet.ts +147 -0
- package/server/graphql/resolvers/worksheet/proceed-extra-products.ts +242 -0
- package/server/graphql/resolvers/worksheet/putaway/activate-putaway.ts +51 -0
- package/server/graphql/resolvers/worksheet/putaway/complete-putaway.ts +105 -0
- package/server/graphql/resolvers/worksheet/putaway/index.ts +11 -0
- package/server/graphql/resolvers/worksheet/putaway/putaway.ts +26 -0
- package/server/graphql/resolvers/worksheet/putaway/undo-putaway.ts +25 -0
- package/server/graphql/resolvers/worksheet/putaway-return/activate-putaway-return.ts +55 -0
- package/server/graphql/resolvers/worksheet/putaway-return/complete-putaway-return.ts +38 -0
- package/server/graphql/resolvers/worksheet/putaway-return/index.ts +11 -0
- package/server/graphql/resolvers/worksheet/putaway-return/putaway-return.ts +30 -0
- package/server/graphql/resolvers/worksheet/putaway-return/undo-putaway-return.ts +29 -0
- package/server/graphql/resolvers/worksheet/putaway-returning-worksheet.ts +83 -0
- package/server/graphql/resolvers/worksheet/putaway-worksheet.ts +82 -0
- package/server/graphql/resolvers/worksheet/recommend-putway-location.ts +133 -0
- package/server/graphql/resolvers/worksheet/reject-cancellation-release-order.ts +186 -0
- package/server/graphql/resolvers/worksheet/relocate-pallet.ts +67 -0
- package/server/graphql/resolvers/worksheet/replace-picking-pallets.ts +127 -0
- package/server/graphql/resolvers/worksheet/return-worksheet.ts +70 -0
- package/server/graphql/resolvers/worksheet/returning/activate-return.ts +24 -0
- package/server/graphql/resolvers/worksheet/returning/complete-return.ts +39 -0
- package/server/graphql/resolvers/worksheet/returning/index.ts +9 -0
- package/server/graphql/resolvers/worksheet/returning/returning.ts +26 -0
- package/server/graphql/resolvers/worksheet/sorting/activate-sorting.ts +25 -0
- package/server/graphql/resolvers/worksheet/sorting/complete-order-sorting.ts +40 -0
- package/server/graphql/resolvers/worksheet/sorting/complete-worksheet-sorting.ts +23 -0
- package/server/graphql/resolvers/worksheet/sorting/index.ts +13 -0
- package/server/graphql/resolvers/worksheet/sorting/scan-product-sorting.ts +31 -0
- package/server/graphql/resolvers/worksheet/sorting/sorting-product.ts +32 -0
- package/server/graphql/resolvers/worksheet/sorting-worksheet.ts +87 -0
- package/server/graphql/resolvers/worksheet/transfer.ts +176 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories-by-reusable-pallet.ts +54 -0
- package/server/graphql/resolvers/worksheet/unloaded-inventories.ts +78 -0
- package/server/graphql/resolvers/worksheet/unloading/activate-unloading.ts +56 -0
- package/server/graphql/resolvers/worksheet/unloading/complete-product-scan-unload.ts +25 -0
- package/server/graphql/resolvers/worksheet/unloading/complete-unloading-partially.ts +25 -0
- package/server/graphql/resolvers/worksheet/unloading/complete-unloading.ts +76 -0
- package/server/graphql/resolvers/worksheet/unloading/index.ts +21 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-product-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/scan-serial-number-unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-serial-number-unload.ts +24 -0
- package/server/graphql/resolvers/worksheet/unloading/undo-unloading.ts +25 -0
- package/server/graphql/resolvers/worksheet/unloading/unload.ts +26 -0
- package/server/graphql/resolvers/worksheet/unloading-return/activate-unloading-return.ts +28 -0
- package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-return-partially.ts +29 -0
- package/server/graphql/resolvers/worksheet/unloading-return/complete-unload-returning.ts +91 -0
- package/server/graphql/resolvers/worksheet/unloading-return/index.ts +9 -0
- package/server/graphql/resolvers/worksheet/unloading-return-worksheet.ts +75 -0
- package/server/graphql/resolvers/worksheet/unloading-worksheet.ts +98 -0
- package/server/graphql/resolvers/worksheet/update-worksheet.ts +25 -0
- package/server/graphql/resolvers/worksheet/vas/activate-vas.ts +25 -0
- package/server/graphql/resolvers/worksheet/vas/assign-vas-inventories.ts +25 -0
- package/server/graphql/resolvers/worksheet/vas/complete-vas.ts +72 -0
- package/server/graphql/resolvers/worksheet/vas/execute-vas.ts +31 -0
- package/server/graphql/resolvers/worksheet/vas/index.ts +15 -0
- package/server/graphql/resolvers/worksheet/vas/undo-vas-inventory.ts +24 -0
- package/server/graphql/resolvers/worksheet/vas/undo-vas.ts +24 -0
- package/server/graphql/resolvers/worksheet/vas-candidates.ts +177 -0
- package/server/graphql/resolvers/worksheet/vas-inventories.ts +41 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/common-utils.ts +1182 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/index.ts +5 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/index.ts +56 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/relabeling.ts +20 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/repackaging.ts +27 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/repalletizing.ts +14 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/interfaces/unpacking.ts +14 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/check-relabelable.ts +96 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/complete-relabeling.ts +93 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/index.ts +4 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/relabeling.ts +105 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/relabeling/undo-relabeling.ts +40 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/complete-repackaging.ts +236 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/index.ts +3 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/repackaging.ts +402 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repackaging/undo-repackaging.ts +166 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/complete-repalletizing.ts +116 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/index.ts +3 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/repalletizing.ts +167 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/repalletizing/undo-repalletizing.ts +74 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/complete-unpacking.ts +20 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/index.ts +2 -0
- package/server/graphql/resolvers/worksheet/vas-transactions/unpacking/unpacking.ts +164 -0
- package/server/graphql/resolvers/worksheet/vas-worksheet.ts +110 -0
- package/server/graphql/resolvers/worksheet/worksheet-by-order-no.ts +43 -0
- package/server/graphql/resolvers/worksheet/worksheet-with-pagination.ts +46 -0
- package/server/graphql/resolvers/worksheet/worksheet.ts +330 -0
- package/server/graphql/resolvers/worksheet/worksheets.ts +493 -0
- package/server/graphql/resolvers/worksheet-detail/check-progressing-pallet.ts +22 -0
- package/server/graphql/resolvers/worksheet-detail/create-worksheet-detail.ts +38 -0
- package/server/graphql/resolvers/worksheet-detail/delete-worksheet-detail.ts +18 -0
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details-by-bulk.ts +206 -0
- package/server/graphql/resolvers/worksheet-detail/generate-batch-picking-worksheet-details.ts +165 -0
- package/server/graphql/resolvers/worksheet-detail/generate-carton-id.ts +26 -0
- package/server/graphql/resolvers/worksheet-detail/generate-pallet-id.ts +94 -0
- package/server/graphql/resolvers/worksheet-detail/generate-picking-worksheet-details.ts +259 -0
- package/server/graphql/resolvers/worksheet-detail/generate-release-good-worksheet-details.ts +142 -0
- package/server/graphql/resolvers/worksheet-detail/index.ts +34 -0
- package/server/graphql/resolvers/worksheet-detail/regenerate-release-good-worksheet-details.ts +165 -0
- package/server/graphql/resolvers/worksheet-detail/update-worksheet-detail.ts +39 -0
- package/server/graphql/resolvers/worksheet-detail/worksheet-detail.ts +19 -0
- package/server/graphql/resolvers/worksheet-detail/worksheet-details-by-product-group.ts +56 -0
- package/server/graphql/resolvers/worksheet-detail/worksheet-details.ts +21 -0
- package/server/graphql/resolvers/worksheet-movement/create-worksheet-movement.ts +17 -0
- package/server/graphql/resolvers/worksheet-movement/delete-worksheet-movement.ts +12 -0
- package/server/graphql/resolvers/worksheet-movement/index.ts +17 -0
- package/server/graphql/resolvers/worksheet-movement/update-worksheet-movement.ts +15 -0
- package/server/graphql/resolvers/worksheet-movement/worksheet-movement.ts +10 -0
- package/server/graphql/resolvers/worksheet-movement/worksheet-movements.ts +14 -0
- package/server/graphql/types/index.ts +15 -0
- package/server/graphql/types/pallet/index.ts +12 -0
- package/server/graphql/types/pallet/pallet.ts +7 -0
- package/server/graphql/types/worksheet/arrival-notice-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/batch-pick-worksheet-info.ts +9 -0
- package/server/graphql/types/worksheet/contact-point-info.ts +12 -0
- package/server/graphql/types/worksheet/cycle-count-worksheet.ts +16 -0
- package/server/graphql/types/worksheet/delivery-info.ts +11 -0
- package/server/graphql/types/worksheet/delivery-order-info.ts +25 -0
- package/server/graphql/types/worksheet/delivery-order-ro.ts +15 -0
- package/server/graphql/types/worksheet/delivery-worksheet.ts +7 -0
- package/server/graphql/types/worksheet/executing-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/find-release-orders-by-task-no.ts +8 -0
- package/server/graphql/types/worksheet/goods-delivery-note.ts +8 -0
- package/server/graphql/types/worksheet/index.ts +750 -0
- package/server/graphql/types/worksheet/inventory-check-worksheet.ts +7 -0
- package/server/graphql/types/worksheet/loaded-worksheet-detail.ts +9 -0
- package/server/graphql/types/worksheet/multiple-release-good-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/my-picking-assignment-status.ts +9 -0
- package/server/graphql/types/worksheet/new-worksheet.ts +10 -0
- package/server/graphql/types/worksheet/picking-assignment-status.ts +9 -0
- package/server/graphql/types/worksheet/product-approval.ts +11 -0
- package/server/graphql/types/worksheet/release-good-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/return-order-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/sellercraft-document.ts +8 -0
- package/server/graphql/types/worksheet/vas-order-worksheet.ts +7 -0
- package/server/graphql/types/worksheet/vas-worksheet.ts +8 -0
- package/server/graphql/types/worksheet/worksheet-detail-info.ts +68 -0
- package/server/graphql/types/worksheet/worksheet-info.ts +33 -0
- package/server/graphql/types/worksheet/worksheet-list.ts +8 -0
- package/server/graphql/types/worksheet/worksheet-patch.ts +19 -0
- package/server/graphql/types/worksheet/worksheet-with-pagination.ts +9 -0
- package/server/graphql/types/worksheet/worksheet.ts +34 -0
- package/server/graphql/types/worksheet-detail/index.ts +81 -0
- package/server/graphql/types/worksheet-detail/inventory-detail.ts +39 -0
- package/server/graphql/types/worksheet-detail/new-worksheet-detail.ts +20 -0
- package/server/graphql/types/worksheet-detail/pallet-info.ts +8 -0
- package/server/graphql/types/worksheet-detail/worksheet-detail-list.ts +8 -0
- package/server/graphql/types/worksheet-detail/worksheet-detail-patch.ts +28 -0
- package/server/graphql/types/worksheet-detail/worksheet-detail.ts +29 -0
- package/server/graphql/types/worksheet-movement/index.ts +30 -0
- package/server/graphql/types/worksheet-movement/new-worksheet-movement.ts +8 -0
- package/server/graphql/types/worksheet-movement/worksheet-movement-list.ts +8 -0
- package/server/graphql/types/worksheet-movement/worksheet-movement-patch.ts +8 -0
- package/server/graphql/types/worksheet-movement/worksheet-movement.ts +10 -0
- package/server/index.ts +14 -0
- package/server/middlewares/index.ts +3 -0
- package/server/migrations/index.ts +9 -0
- package/server/routes.ts +80 -0
- package/server/utils/datetime-util.ts +54 -0
- package/server/utils/index.ts +4 -0
- package/server/utils/inventory-util.ts +390 -0
- package/server/utils/worksheet-no-generator.ts +206 -0
- package/server/utils/worksheet-util.ts +85 -0
|
@@ -0,0 +1,1182 @@
|
|
|
1
|
+
import { EntityManager, Equal, In, IsNull, Not } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { User } from '@things-factory/auth-base'
|
|
4
|
+
import { Bizplace } from '@things-factory/biz-base'
|
|
5
|
+
import {
|
|
6
|
+
ArrivalNotice,
|
|
7
|
+
ORDER_INVENTORY_STATUS,
|
|
8
|
+
ORDER_TYPES,
|
|
9
|
+
OrderInventory,
|
|
10
|
+
OrderNoGenerator,
|
|
11
|
+
OrderVas,
|
|
12
|
+
ReleaseGood
|
|
13
|
+
} from '@things-factory/sales-base'
|
|
14
|
+
import { Domain } from '@things-factory/shell'
|
|
15
|
+
import {
|
|
16
|
+
Inventory,
|
|
17
|
+
INVENTORY_STATUS,
|
|
18
|
+
INVENTORY_TRANSACTION_TYPE,
|
|
19
|
+
InventoryNoGenerator,
|
|
20
|
+
Location,
|
|
21
|
+
Pallet,
|
|
22
|
+
Warehouse
|
|
23
|
+
} from '@things-factory/warehouse-base'
|
|
24
|
+
|
|
25
|
+
import { WORKSHEET_STATUS, WORKSHEET_TYPE } from '../../../../constants'
|
|
26
|
+
import { Worksheet, WorksheetDetail } from '../../../../entities'
|
|
27
|
+
import { generateInventoryHistory, WorksheetNoGenerator } from '../../../../utils'
|
|
28
|
+
import {
|
|
29
|
+
OperationGuideInterface,
|
|
30
|
+
PackingUnits,
|
|
31
|
+
PalletChangesInterface,
|
|
32
|
+
RefOrderType,
|
|
33
|
+
TemporaryPalletChangesInterface
|
|
34
|
+
} from './interfaces'
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @description Find worksheet detail by name
|
|
38
|
+
* this function will include every relations with worksheet detail for processing VAS
|
|
39
|
+
*
|
|
40
|
+
* @param {EntityManager} trxMgr
|
|
41
|
+
* @param {Domain} domain
|
|
42
|
+
* @param {String} name
|
|
43
|
+
*/
|
|
44
|
+
export async function getWorksheetDetailByName(
|
|
45
|
+
trxMgr: EntityManager,
|
|
46
|
+
domain: Domain,
|
|
47
|
+
name: string
|
|
48
|
+
): Promise<WorksheetDetail> {
|
|
49
|
+
const worksheetDetail: WorksheetDetail = await trxMgr.getRepository(WorksheetDetail).findOne({
|
|
50
|
+
where: { domain: { id: domain.id }, name },
|
|
51
|
+
relations: [
|
|
52
|
+
'bizplace',
|
|
53
|
+
'targetVas',
|
|
54
|
+
'targetVas.inventory',
|
|
55
|
+
'targetVas.inventory.product',
|
|
56
|
+
'targetVas.vas',
|
|
57
|
+
'targetVas.arrivalNotice',
|
|
58
|
+
'targetVas.releaseGood',
|
|
59
|
+
'targetVas.shippingOrder',
|
|
60
|
+
'targetVas.vasOrder',
|
|
61
|
+
'targetVas.targetProduct',
|
|
62
|
+
'worksheet'
|
|
63
|
+
]
|
|
64
|
+
})
|
|
65
|
+
if (!worksheetDetail) throw new Error(`Couldn't find target worksheet detail`)
|
|
66
|
+
if (!worksheetDetail.targetVas)
|
|
67
|
+
throw new Error(`Couldn't find any related target vas, using current worksheet detail`)
|
|
68
|
+
return worksheetDetail
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @description Update every related order vas to share same operationGuide data
|
|
73
|
+
*
|
|
74
|
+
* @param {EntityManager} trxMgr
|
|
75
|
+
* @param {Domain} domain
|
|
76
|
+
* @param {Bizplace} bizplace
|
|
77
|
+
* @param {WorksheetDetail} wsd
|
|
78
|
+
* @param {OrderVas} targetVas
|
|
79
|
+
* @param {OperationGuideInterface<T>} operationGuide
|
|
80
|
+
* @param {User} user
|
|
81
|
+
*/
|
|
82
|
+
export async function updateRelatedOrderVas<T>(
|
|
83
|
+
trxMgr: EntityManager,
|
|
84
|
+
domain: Domain,
|
|
85
|
+
bizplace: Bizplace,
|
|
86
|
+
wsd: WorksheetDetail,
|
|
87
|
+
targetVas: OrderVas,
|
|
88
|
+
operationGuide: OperationGuideInterface<T>,
|
|
89
|
+
user: User
|
|
90
|
+
//@ts-ignore
|
|
91
|
+
): Promise<OrderVas> {
|
|
92
|
+
const worksheet: Worksheet = wsd.worksheet
|
|
93
|
+
const relatedWSDs: WorksheetDetail[] = await trxMgr.getRepository(WorksheetDetail).find({
|
|
94
|
+
where: { domain: { id: domain.id }, bizplace: { id: bizplace.id }, worksheet: { id: worksheet.id } },
|
|
95
|
+
relations: ['targetVas', 'targetVas.vas']
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const relatedOVs: OrderVas[] = relatedWSDs
|
|
99
|
+
.map((wsd: WorksheetDetail) => wsd.targetVas)
|
|
100
|
+
.filter((ov: OrderVas) => ov.set === targetVas.set && ov.vas.id === targetVas.vas.id)
|
|
101
|
+
.map((ov: OrderVas) => {
|
|
102
|
+
return {
|
|
103
|
+
...ov,
|
|
104
|
+
operationGuide: JSON.stringify(operationGuide),
|
|
105
|
+
updater: user
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
await trxMgr.getRepository(OrderVas).save(relatedOVs)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @description Return current amount of pallet
|
|
114
|
+
* @param {PalletChangesInterface[]} palletChanges
|
|
115
|
+
* @param {String} palletId
|
|
116
|
+
*/
|
|
117
|
+
export function getCurrentAmount(
|
|
118
|
+
palletChanges: PalletChangesInterface[],
|
|
119
|
+
palletId: string
|
|
120
|
+
): { qty: number; uomValue: number } {
|
|
121
|
+
return palletChanges
|
|
122
|
+
.filter((pc: PalletChangesInterface) => pc.toPalletId === palletId)
|
|
123
|
+
.reduce(
|
|
124
|
+
(currentAmount: { qty: number; uomValue: number }, pc: PalletChangesInterface) => {
|
|
125
|
+
return {
|
|
126
|
+
qty: currentAmount.qty + pc.reducedQty,
|
|
127
|
+
uomValue: currentAmount.uomValue + pc.reducedUomValue
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
{ qty: 0, uomValue: 0 }
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @description Return reduced amount of pallet
|
|
136
|
+
* @param {PalletChangesInterface[]} palletChanges
|
|
137
|
+
* @param {String} palletId
|
|
138
|
+
*/
|
|
139
|
+
export function getReducedAmount(
|
|
140
|
+
palletChanges: PalletChangesInterface[],
|
|
141
|
+
palletId: string
|
|
142
|
+
): { reducedQty: number; reducedUomValue: number } {
|
|
143
|
+
return palletChanges
|
|
144
|
+
.filter((pc: PalletChangesInterface) => pc.fromPalletId === palletId)
|
|
145
|
+
.reduce(
|
|
146
|
+
(reducedAmount: { reducedQty: number; reducedUomValue: number }, pc: PalletChangesInterface) => {
|
|
147
|
+
return {
|
|
148
|
+
reducedQty: reducedAmount.reducedQty + pc.reducedQty || 0,
|
|
149
|
+
reducedUomValue: reducedAmount.reducedUomValue + pc.reducedUomValue || 0
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
{ reducedQty: 0, reducedUomValue: 0 }
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @description Get remain qty of inventory or order inventory (For release good case)
|
|
158
|
+
*
|
|
159
|
+
* @param {EntityManager} trxMgr
|
|
160
|
+
* @param {ArrivalNotice | ReleaseGood | VasOrder} refOrder
|
|
161
|
+
* @param {Domain} domain
|
|
162
|
+
* @param {Bizplace} bizplace
|
|
163
|
+
* @param {Inventory} originInv
|
|
164
|
+
* @param {RepackedInvInfo[]} repackedInvs
|
|
165
|
+
* @param {String} palletId
|
|
166
|
+
*/
|
|
167
|
+
export async function getRemainInventoryAmount(
|
|
168
|
+
trxMgr: EntityManager,
|
|
169
|
+
refOrder: RefOrderType,
|
|
170
|
+
domain: Domain,
|
|
171
|
+
bizplace: Bizplace,
|
|
172
|
+
originInv: Inventory,
|
|
173
|
+
palletChanges: PalletChangesInterface[],
|
|
174
|
+
palletId: string
|
|
175
|
+
): Promise<{ remainQty: number; remainUomValue: number }> {
|
|
176
|
+
let remainQty: number = 0
|
|
177
|
+
let remainUomValue: number = 0
|
|
178
|
+
const { reducedQty, reducedUomValue } = getReducedAmount(palletChanges, palletId)
|
|
179
|
+
if (refOrder instanceof ReleaseGood) {
|
|
180
|
+
// Find loading order inventory to figure out uomValue
|
|
181
|
+
const orderInv: OrderInventory = await trxMgr.getRepository(OrderInventory).findOne({
|
|
182
|
+
where: {
|
|
183
|
+
domain: { id: domain.id },
|
|
184
|
+
bizplace: { id: bizplace.id },
|
|
185
|
+
inventory: { id: originInv.id },
|
|
186
|
+
releaseGood: { id: refOrder.id },
|
|
187
|
+
type: ORDER_TYPES.RELEASE_OF_GOODS
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
|
|
191
|
+
remainQty = orderInv.releaseQty - reducedQty
|
|
192
|
+
remainUomValue = orderInv.releaseUomValue - reducedUomValue
|
|
193
|
+
} else {
|
|
194
|
+
remainQty = originInv.qty - reducedQty
|
|
195
|
+
remainUomValue = originInv.uomValue - reducedUomValue
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (remainQty <= 0 || remainUomValue <= 0) throw new Error(`There's no more remaining product on the pallet`)
|
|
199
|
+
return { remainQty, remainUomValue }
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** REMARK
|
|
203
|
+
* @farishelmi created temporary function @temporaryGetReducedAmount and
|
|
204
|
+
* @temporaryGetRemainInventoryAmount specifically for @Repackaging
|
|
205
|
+
* - because in repackaging we need to calculate based on unit qty of a product
|
|
206
|
+
* - eg: Carton of 12 Cokes repack into Boxes of 6 Cokes
|
|
207
|
+
* - this function should be merged with its origin once the logic in other vas is updated
|
|
208
|
+
* */
|
|
209
|
+
|
|
210
|
+
export function temporaryGetCurrentAmount(
|
|
211
|
+
palletChanges: TemporaryPalletChangesInterface[],
|
|
212
|
+
palletId: string,
|
|
213
|
+
packingUnit: string,
|
|
214
|
+
stdAmount: number
|
|
215
|
+
): { qty: number; uomValue: number } {
|
|
216
|
+
return palletChanges
|
|
217
|
+
.filter((pc: TemporaryPalletChangesInterface) => pc.toPalletId === palletId)
|
|
218
|
+
.reduce(
|
|
219
|
+
(currentAmount: { qty: number; uomValue: number }, pc: TemporaryPalletChangesInterface) => {
|
|
220
|
+
if (packingUnit == PackingUnits.QTY) {
|
|
221
|
+
return {
|
|
222
|
+
qty: currentAmount.qty + pc.reducedUnitQty / stdAmount,
|
|
223
|
+
uomValue: currentAmount.uomValue + pc.reducedUomValue
|
|
224
|
+
}
|
|
225
|
+
} else if (packingUnit == PackingUnits.UOM) {
|
|
226
|
+
return {
|
|
227
|
+
qty: currentAmount.qty + pc.reducedQty,
|
|
228
|
+
uomValue: currentAmount.uomValue + pc.reducedUomValue
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
return { qty: 0, uomValue: 0 }
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
{ qty: 0, uomValue: 0 }
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @description need to consider unit amount because we have packingSize for each packingType
|
|
240
|
+
* @param palletChanges
|
|
241
|
+
* @param palletId
|
|
242
|
+
* @returns reducedUomValue: used for packingUnit == UOM
|
|
243
|
+
* @returns reducedUnitQty: used for packingUnit == QTY
|
|
244
|
+
*/
|
|
245
|
+
export function temporaryGetReducedAmount(
|
|
246
|
+
palletChanges: TemporaryPalletChangesInterface[],
|
|
247
|
+
palletId: string
|
|
248
|
+
): { reducedUomValue: number; reducedUnitQty: number } {
|
|
249
|
+
return palletChanges
|
|
250
|
+
.filter((pc: TemporaryPalletChangesInterface) => pc.fromPalletId === palletId)
|
|
251
|
+
.reduce(
|
|
252
|
+
(
|
|
253
|
+
reducedAmount: {
|
|
254
|
+
reducedUomValue: number
|
|
255
|
+
reducedUnitQty: number
|
|
256
|
+
},
|
|
257
|
+
pc: TemporaryPalletChangesInterface
|
|
258
|
+
) => {
|
|
259
|
+
return {
|
|
260
|
+
reducedUomValue: reducedAmount.reducedUomValue + pc.reducedUomValue || 0,
|
|
261
|
+
reducedUnitQty: reducedAmount.reducedUnitQty + pc.reducedUnitQty || 0
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
{ reducedUomValue: 0, reducedUnitQty: 0 }
|
|
265
|
+
)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export async function temporaryGetRemainInventoryAmount(
|
|
269
|
+
trxMgr: EntityManager,
|
|
270
|
+
refOrder: RefOrderType,
|
|
271
|
+
domain: Domain,
|
|
272
|
+
bizplace: Bizplace,
|
|
273
|
+
originInv: Inventory,
|
|
274
|
+
palletChanges: TemporaryPalletChangesInterface[],
|
|
275
|
+
palletId: string
|
|
276
|
+
): Promise<{ remainUomValue: number; remainUnitQty: number }> {
|
|
277
|
+
let remainUomValue: number = 0
|
|
278
|
+
let remainUnitQty: number = 0
|
|
279
|
+
|
|
280
|
+
const packingSize: number = originInv.packingSize
|
|
281
|
+
const { reducedUomValue, reducedUnitQty } = temporaryGetReducedAmount(palletChanges, palletId)
|
|
282
|
+
if (refOrder instanceof ReleaseGood) {
|
|
283
|
+
// Find loading order inventory to figure out uomValue
|
|
284
|
+
const orderInv: OrderInventory = await trxMgr.getRepository(OrderInventory).findOne({
|
|
285
|
+
where: {
|
|
286
|
+
domain: { id: domain.id },
|
|
287
|
+
bizplace: { id: bizplace.id },
|
|
288
|
+
inventory: { id: originInv.id },
|
|
289
|
+
releaseGood: { id: refOrder.id },
|
|
290
|
+
type: ORDER_TYPES.RELEASE_OF_GOODS
|
|
291
|
+
}
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
remainUomValue = orderInv.releaseUomValue - reducedUomValue
|
|
295
|
+
remainUnitQty = orderInv.releaseQty * packingSize - reducedUnitQty
|
|
296
|
+
} else {
|
|
297
|
+
remainUomValue = originInv.uomValue - reducedUomValue
|
|
298
|
+
remainUnitQty = originInv.qty * packingSize - reducedUnitQty
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (remainUomValue <= 0 || remainUnitQty <= 0) throw new Error(`There's no more remaining product on the pallet`)
|
|
302
|
+
return { remainUomValue, remainUnitQty }
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export async function updateOriginInventories(
|
|
306
|
+
trxMgr: EntityManager,
|
|
307
|
+
domain: Domain,
|
|
308
|
+
bizplace: Bizplace,
|
|
309
|
+
user: User,
|
|
310
|
+
refOrder: RefOrderType,
|
|
311
|
+
repackedFroms: Partial<TemporaryPalletChangesInterface[]>,
|
|
312
|
+
packingUnit: string,
|
|
313
|
+
transactionType: string
|
|
314
|
+
): Promise<Inventory[]> {
|
|
315
|
+
const inventories: Inventory[] = []
|
|
316
|
+
|
|
317
|
+
for (let inv of repackedFroms) {
|
|
318
|
+
let foundInventory: Inventory = await trxMgr.getRepository(Inventory).findOne({
|
|
319
|
+
where: {
|
|
320
|
+
domain: { id: domain.id },
|
|
321
|
+
bizplace: { id: bizplace.id },
|
|
322
|
+
palletId: inv.fromPalletId,
|
|
323
|
+
status: Not(Equal(INVENTORY_STATUS.TERMINATED))
|
|
324
|
+
}
|
|
325
|
+
})
|
|
326
|
+
|
|
327
|
+
if (foundInventory) {
|
|
328
|
+
let repackedPkgQty: number = 0
|
|
329
|
+
let repackedPkgUomValue: number = 0
|
|
330
|
+
|
|
331
|
+
switch (packingUnit) {
|
|
332
|
+
case PackingUnits.QTY:
|
|
333
|
+
repackedPkgQty = inv.reducedUnitQty / inv.packingSize
|
|
334
|
+
repackedPkgUomValue = inv.reducedUomValue // it should be called reducedUomValue instead. sbb dh kira smua dgn packingsize
|
|
335
|
+
break
|
|
336
|
+
|
|
337
|
+
case PackingUnits.UOM:
|
|
338
|
+
// repackedPkgQty = inv.reducedQty / inv.packingSize
|
|
339
|
+
// repackedPkgUomValue = rf.reducedUomValue
|
|
340
|
+
break
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
foundInventory = await trxMgr.getRepository(Inventory).save({
|
|
344
|
+
...foundInventory,
|
|
345
|
+
qty: repackedPkgQty,
|
|
346
|
+
uomValue: repackedPkgUomValue,
|
|
347
|
+
creator: user,
|
|
348
|
+
updater: user
|
|
349
|
+
})
|
|
350
|
+
|
|
351
|
+
await generateInventoryHistory(
|
|
352
|
+
foundInventory,
|
|
353
|
+
refOrder,
|
|
354
|
+
transactionType,
|
|
355
|
+
repackedPkgQty,
|
|
356
|
+
repackedPkgUomValue,
|
|
357
|
+
user,
|
|
358
|
+
trxMgr
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
inventories.push(foundInventory)
|
|
362
|
+
} else {
|
|
363
|
+
throw new Error(`${inv.fromPalletId} is not exist in inventory. Hence, qty cannot be updated.`)
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return inventories
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
//// @farishelmi What is the difference between upsertInventory vs temporaryUpsertInventory? If it is repeated function, kindly remove one of them.
|
|
371
|
+
export async function temporaryUpsertInventory(
|
|
372
|
+
trxMgr: EntityManager,
|
|
373
|
+
domain: Domain,
|
|
374
|
+
bizplace: Bizplace,
|
|
375
|
+
user: User,
|
|
376
|
+
originInv: Inventory,
|
|
377
|
+
refOrder: RefOrderType,
|
|
378
|
+
palletId: string,
|
|
379
|
+
locationName: string,
|
|
380
|
+
packingType: string,
|
|
381
|
+
addedQty: number,
|
|
382
|
+
addedUomValue: number,
|
|
383
|
+
transactionType: string,
|
|
384
|
+
stdAmount?: number,
|
|
385
|
+
packingUnit?: string
|
|
386
|
+
): Promise<Inventory> {
|
|
387
|
+
const location: Location = await trxMgr.getRepository(Location).findOne({
|
|
388
|
+
where: { domain: { id: domain.id }, name: locationName },
|
|
389
|
+
relations: ['warehouse']
|
|
390
|
+
})
|
|
391
|
+
if (!location) throw new Error(`Location is not found by (${locationName})`)
|
|
392
|
+
const warehouse: Warehouse = location.warehouse
|
|
393
|
+
const zone: string = location.zone
|
|
394
|
+
|
|
395
|
+
let inv: Inventory = await trxMgr.getRepository(Inventory).findOne({
|
|
396
|
+
where: {
|
|
397
|
+
domain: { id: domain.id },
|
|
398
|
+
bizplace: { id: bizplace.id },
|
|
399
|
+
palletId,
|
|
400
|
+
batchId: originInv.batchId,
|
|
401
|
+
product: { id: originInv.product.id },
|
|
402
|
+
packingType,
|
|
403
|
+
packingSize: stdAmount,
|
|
404
|
+
refOrderId: originInv.refOrderId,
|
|
405
|
+
status: Not(Equal(INVENTORY_STATUS.TERMINATED))
|
|
406
|
+
},
|
|
407
|
+
relations: ['product', 'refInventory']
|
|
408
|
+
})
|
|
409
|
+
|
|
410
|
+
// Create new inventory
|
|
411
|
+
if (!inv) {
|
|
412
|
+
let newInventory: Inventory = new Inventory()
|
|
413
|
+
|
|
414
|
+
inv = {
|
|
415
|
+
...newInventory,
|
|
416
|
+
domain,
|
|
417
|
+
bizplace,
|
|
418
|
+
palletId,
|
|
419
|
+
name: InventoryNoGenerator.inventoryName(),
|
|
420
|
+
packingType,
|
|
421
|
+
qty: addedQty,
|
|
422
|
+
//@ts-ignore
|
|
423
|
+
weight: 0,
|
|
424
|
+
uomValue: addedUomValue,
|
|
425
|
+
lockedQty: 0,
|
|
426
|
+
lockedUomValue: 0,
|
|
427
|
+
packingSize: packingUnit == PackingUnits.QTY ? stdAmount : 1,
|
|
428
|
+
warehouse,
|
|
429
|
+
location,
|
|
430
|
+
zone,
|
|
431
|
+
creator: user,
|
|
432
|
+
updater: user
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Save changed inventory
|
|
436
|
+
inv = await trxMgr.getRepository(Inventory).save(inv)
|
|
437
|
+
|
|
438
|
+
// Check whether the pallet is resuable or not
|
|
439
|
+
const pallet: Pallet = await trxMgr.getRepository(Pallet).findOne({
|
|
440
|
+
where: { domain: { id: domain.id }, name: palletId, inventory: IsNull() }
|
|
441
|
+
})
|
|
442
|
+
// If it's exists => it's reusable pallet and need to update it's inventory field
|
|
443
|
+
if (pallet) {
|
|
444
|
+
pallet.inventory = inv
|
|
445
|
+
pallet.updater = user
|
|
446
|
+
await trxMgr.getRepository(Pallet).save(pallet)
|
|
447
|
+
}
|
|
448
|
+
} else {
|
|
449
|
+
// Update inventory
|
|
450
|
+
inv.qty += addedQty
|
|
451
|
+
inv.uomValue += addedUomValue
|
|
452
|
+
inv.warehouse = warehouse
|
|
453
|
+
inv.location = location
|
|
454
|
+
inv.zone = location.zone
|
|
455
|
+
inv.updater = user
|
|
456
|
+
|
|
457
|
+
// Save changed inventory
|
|
458
|
+
inv = await trxMgr.getRepository(Inventory).save(inv)
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Create inventory history
|
|
462
|
+
await generateInventoryHistory(inv, refOrder, transactionType, addedQty, addedUomValue, user, trxMgr)
|
|
463
|
+
|
|
464
|
+
return inv
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
//// @farishelmi What is the difference between deductProductAmount vs temporaryDeductProductAmount? If it is repeated function, kindly remove one of them.
|
|
468
|
+
export async function temporaryDeductProductAmount(
|
|
469
|
+
trxMgr: EntityManager,
|
|
470
|
+
domain: Domain,
|
|
471
|
+
bizplace: Bizplace,
|
|
472
|
+
user: User,
|
|
473
|
+
refOrder: RefOrderType,
|
|
474
|
+
originInv: Inventory,
|
|
475
|
+
reducedQty: number,
|
|
476
|
+
reducedUomValue: number,
|
|
477
|
+
transactionType: string,
|
|
478
|
+
originalQty?: number,
|
|
479
|
+
originalUomValue?: number,
|
|
480
|
+
currentUnitQty?: number,
|
|
481
|
+
currentUomValue?: number
|
|
482
|
+
) {
|
|
483
|
+
if (refOrder instanceof ReleaseGood) {
|
|
484
|
+
const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
|
|
485
|
+
where: {
|
|
486
|
+
domain: { id: domain.id },
|
|
487
|
+
bizplace: { id: bizplace.id },
|
|
488
|
+
releaseGood: refOrder,
|
|
489
|
+
type: WORKSHEET_TYPE.LOADING
|
|
490
|
+
},
|
|
491
|
+
relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
|
|
492
|
+
})
|
|
493
|
+
|
|
494
|
+
if (!loadingWS)
|
|
495
|
+
throw new Error(
|
|
496
|
+
`Picking process is not finished yet. Please complete picking first before complete Repalletizing`
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
let orderInv: OrderInventory = loadingWS.worksheetDetails
|
|
500
|
+
.map((wsd: WorksheetDetail) => wsd.targetInventory)
|
|
501
|
+
.find((oi: OrderInventory) => oi.inventory.id === originInv.id)
|
|
502
|
+
if (!orderInv) {
|
|
503
|
+
throw new Error(`Failed to find order inventory (Pallet ID: ${originInv.palletId})`)
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
orderInv.releaseQty -= reducedQty
|
|
507
|
+
orderInv.releaseUomValue -= reducedUomValue
|
|
508
|
+
orderInv.updater = user
|
|
509
|
+
|
|
510
|
+
await trxMgr.getRepository(OrderInventory).save(orderInv)
|
|
511
|
+
} else {
|
|
512
|
+
// currentUnitQty > 0 only belongs to PackingUnits.QTY
|
|
513
|
+
if (currentUnitQty > 0) {
|
|
514
|
+
const unitUomValue: number = originInv.uomValue / originInv.qty
|
|
515
|
+
|
|
516
|
+
reducedQty = Math.floor((originalQty * originInv.packingSize - currentUnitQty) / originInv.packingSize)
|
|
517
|
+
reducedUomValue = unitUomValue * reducedQty
|
|
518
|
+
|
|
519
|
+
originInv.qty -= reducedQty
|
|
520
|
+
originInv.uomValue -= reducedUomValue
|
|
521
|
+
originInv.lockedQty -= originalQty
|
|
522
|
+
originInv.lockedUomValue -= originalUomValue
|
|
523
|
+
originInv.updater = user
|
|
524
|
+
|
|
525
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
526
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
527
|
+
|
|
528
|
+
// minus 1 because remain unit qty only exist if the unitQty < 1
|
|
529
|
+
if (originInv.qty - 1 == 0) {
|
|
530
|
+
originInv.status = INVENTORY_STATUS.TERMINATED
|
|
531
|
+
originInv.qty = 0
|
|
532
|
+
originInv.uomValue = 0
|
|
533
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
534
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -1, -unitUomValue, user, trxMgr)
|
|
535
|
+
|
|
536
|
+
const newQty: number = currentUnitQty
|
|
537
|
+
const newUomValue: number = (unitUomValue / originInv.packingSize) * newQty
|
|
538
|
+
|
|
539
|
+
originInv.qty = newQty
|
|
540
|
+
originInv.uomValue = newUomValue
|
|
541
|
+
originInv.packingSize = 1
|
|
542
|
+
originInv.status = INVENTORY_STATUS.STORED
|
|
543
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
544
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, newQty, newUomValue, user, trxMgr)
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// currentUnitUomValue > 0 only belongs to PackingUnits.QTY
|
|
548
|
+
} else if (currentUomValue > 0) {
|
|
549
|
+
reducedUomValue = Math.round((originalUomValue - currentUomValue + Number.EPSILON) * 100) / 100
|
|
550
|
+
|
|
551
|
+
originInv.qty -= reducedQty
|
|
552
|
+
originInv.uomValue -= reducedUomValue
|
|
553
|
+
originInv.lockedQty -= originalQty
|
|
554
|
+
originInv.lockedUomValue -= originalUomValue
|
|
555
|
+
originInv.updater = user
|
|
556
|
+
|
|
557
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
558
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
559
|
+
} else {
|
|
560
|
+
originInv.qty -= reducedQty
|
|
561
|
+
originInv.uomValue -= reducedUomValue
|
|
562
|
+
originInv.lockedQty -= originalQty
|
|
563
|
+
originInv.lockedUomValue -= originalUomValue
|
|
564
|
+
originInv.updater = user
|
|
565
|
+
originInv.status = originInv.qty > 0 ? INVENTORY_STATUS.STORED : INVENTORY_STATUS.TERMINATED
|
|
566
|
+
|
|
567
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
568
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
569
|
+
|
|
570
|
+
if (originInv.qty <= 0 || originInv.uomValue <= 0) {
|
|
571
|
+
originInv.status = INVENTORY_STATUS.TERMINATED
|
|
572
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
573
|
+
await generateInventoryHistory(originInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
return originInv
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* @description Assign inventory to targetVas
|
|
583
|
+
* When Vas order comes together with Arrival Notice or Release Good
|
|
584
|
+
* The vas worksheet is activated automatically by to complete unloading/picking worksheet.
|
|
585
|
+
* As a result user can't activate it manually, which means no assignment for every specific vas tasks.
|
|
586
|
+
* For this case inventory should be assigned while processing the VAS Order.
|
|
587
|
+
*/
|
|
588
|
+
export async function assignInventory(
|
|
589
|
+
trxMgr: EntityManager,
|
|
590
|
+
domain: Domain,
|
|
591
|
+
bizplace: Bizplace,
|
|
592
|
+
user: User,
|
|
593
|
+
wsd: WorksheetDetail,
|
|
594
|
+
refOrder: ArrivalNotice | ReleaseGood,
|
|
595
|
+
targetVas: OrderVas,
|
|
596
|
+
palletId: string
|
|
597
|
+
): Promise<OrderVas> {
|
|
598
|
+
let inventory: Inventory
|
|
599
|
+
|
|
600
|
+
if (refOrder instanceof ArrivalNotice) {
|
|
601
|
+
// Case 1. When the VAS Order comes with Arrival Notice
|
|
602
|
+
inventory = await trxMgr.getRepository(Inventory).findOne({
|
|
603
|
+
where: {
|
|
604
|
+
domain: { id: domain.id },
|
|
605
|
+
bizplace: { id: bizplace.id },
|
|
606
|
+
palletId,
|
|
607
|
+
status: In([INVENTORY_STATUS.UNLOADED, INVENTORY_STATUS.PUTTING_AWAY]),
|
|
608
|
+
refOrderId: refOrder.id
|
|
609
|
+
}
|
|
610
|
+
})
|
|
611
|
+
if (!inventory) throw new Error(`Counldn't find unloaded inventory by pallet ID: (${palletId})`)
|
|
612
|
+
|
|
613
|
+
// Check current inventory has enough qty of product to complete this target vas.
|
|
614
|
+
if (targetVas.qty > inventory.qty) {
|
|
615
|
+
// If it doesn't have enough, Need to create new worksheet detail and target vas without inventory assignment
|
|
616
|
+
// So the user can proceed it with another inventory
|
|
617
|
+
targetVas = await addNewVasTask(targetVas, inventory.qty, inventory.uomValue, domain, bizplace, user, trxMgr, wsd)
|
|
618
|
+
}
|
|
619
|
+
} else if (refOrder instanceof ReleaseGood) {
|
|
620
|
+
// Case 2. When the VAS Order comes with Release Good
|
|
621
|
+
// In this case, every available inventories are picked by picking worksheet.
|
|
622
|
+
// So target inventories should be found by relation with order inventory which has PICKED status
|
|
623
|
+
//@ts-ignore
|
|
624
|
+
let pickedOrdInv: OrderInventory = await trxMgr.getRepository(OrderInventory).find({
|
|
625
|
+
where: {
|
|
626
|
+
domain: { id: domain.id },
|
|
627
|
+
bizplace: { id: bizplace.id },
|
|
628
|
+
releaseGood: { id: refOrder.id },
|
|
629
|
+
status: ORDER_INVENTORY_STATUS.PICKED
|
|
630
|
+
},
|
|
631
|
+
relations: ['inventory']
|
|
632
|
+
})
|
|
633
|
+
//@ts-ignore
|
|
634
|
+
pickedOrdInv = pickedOrdInv.find((oi: OrderInventory) => oi.inventory.palletId === palletId)
|
|
635
|
+
inventory = pickedOrdInv?.inventory
|
|
636
|
+
if (!inventory) throw new Error(`Couldn't find picked inventory by pallet ID: ${palletId}`)
|
|
637
|
+
|
|
638
|
+
// Check current target inventory (picked inventory) has enough qty of product to complete this target vas.
|
|
639
|
+
// And available qty of products also restriced by picking. (Because customer requests do some vas for Release Order)
|
|
640
|
+
if (targetVas.qty > pickedOrdInv.releaseQty) {
|
|
641
|
+
// If it doesn't have enough, Need to create new worksheet detail and target vas without inventory assignment
|
|
642
|
+
// So the user can proceed it with another inventory
|
|
643
|
+
targetVas = await addNewVasTask(
|
|
644
|
+
targetVas,
|
|
645
|
+
pickedOrdInv.releaseQty,
|
|
646
|
+
pickedOrdInv.releaseUomValue,
|
|
647
|
+
domain,
|
|
648
|
+
bizplace,
|
|
649
|
+
user,
|
|
650
|
+
trxMgr,
|
|
651
|
+
wsd
|
|
652
|
+
)
|
|
653
|
+
}
|
|
654
|
+
} else {
|
|
655
|
+
//@ts-ignore
|
|
656
|
+
throw new Error(`Reference Order (${refOrder.name}) is not expected.`)
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
targetVas.inventory = inventory
|
|
660
|
+
targetVas.updater = user
|
|
661
|
+
return await trxMgr.getRepository(OrderVas).save(targetVas)
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/**
|
|
665
|
+
* Dismiss assigne inventory when user click undo to remove
|
|
666
|
+
* proceed pallet for relabel, repack, repack
|
|
667
|
+
*
|
|
668
|
+
* @param {EntityManager} trxMgr
|
|
669
|
+
* @param {WorksheetDetail} wsd
|
|
670
|
+
* @param {OrderVas} targetVas
|
|
671
|
+
* @param {PalletChangesInterface[]} palletChanges
|
|
672
|
+
* @param {String} palletId
|
|
673
|
+
*/
|
|
674
|
+
export async function dismissInventory(
|
|
675
|
+
trxMgr: EntityManager,
|
|
676
|
+
wsd: WorksheetDetail,
|
|
677
|
+
targetVas: OrderVas,
|
|
678
|
+
palletChanges: PalletChangesInterface[],
|
|
679
|
+
palletId: string
|
|
680
|
+
) {
|
|
681
|
+
// If there's no more item assigned with current from pallet id
|
|
682
|
+
if (!palletChanges.find((rf: PalletChangesInterface) => rf.fromPalletId === palletId)) {
|
|
683
|
+
targetVas.inventory = null
|
|
684
|
+
const worksheet: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
|
|
685
|
+
where: { id: wsd.worksheet.id },
|
|
686
|
+
relations: [
|
|
687
|
+
'worksheetDetails',
|
|
688
|
+
'worksheetDetails.targetVas',
|
|
689
|
+
'worksheetDetails.targetVas.vas',
|
|
690
|
+
'worksheetDetails.targetVas.inventory'
|
|
691
|
+
]
|
|
692
|
+
})
|
|
693
|
+
|
|
694
|
+
const nonFinishedWSD: WorksheetDetail = worksheet.worksheetDetails.find(
|
|
695
|
+
(otherWSD: WorksheetDetail) =>
|
|
696
|
+
otherWSD.id !== wsd.id &&
|
|
697
|
+
otherWSD.targetVas.set === wsd.targetVas.set &&
|
|
698
|
+
otherWSD.targetVas.vas.id === wsd.targetVas.vas.id &&
|
|
699
|
+
otherWSD.status !== WORKSHEET_STATUS.DONE
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
if (nonFinishedWSD) {
|
|
703
|
+
// If there non finished same VAS, delete undo target record (worksheet detail & order vas)
|
|
704
|
+
// Add qty and uomValue for non finished vas task
|
|
705
|
+
await trxMgr.getRepository(WorksheetDetail).delete(wsd.id)
|
|
706
|
+
await trxMgr.getRepository(OrderVas).delete(targetVas.id)
|
|
707
|
+
|
|
708
|
+
nonFinishedWSD.targetVas.qty += targetVas.qty
|
|
709
|
+
nonFinishedWSD.targetVas.uomValue += targetVas.uomValue
|
|
710
|
+
await trxMgr.getRepository(OrderVas).save(nonFinishedWSD.targetVas)
|
|
711
|
+
} else {
|
|
712
|
+
// If there no non finished same VAS, dismiss inventory for the record
|
|
713
|
+
targetVas.inventory = null
|
|
714
|
+
await trxMgr.getRepository(OrderVas).save(wsd.targetVas)
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* @description Create nw VAS Worksheet Detail & Order Vas
|
|
721
|
+
* Without inventory assignment
|
|
722
|
+
*/
|
|
723
|
+
export async function addNewVasTask(
|
|
724
|
+
targetVas: OrderVas,
|
|
725
|
+
currentOrderQty: number,
|
|
726
|
+
currentOrderUomValue: number,
|
|
727
|
+
domain: Domain,
|
|
728
|
+
bizplace: Bizplace,
|
|
729
|
+
user: User,
|
|
730
|
+
trxMgr: EntityManager,
|
|
731
|
+
wsd: WorksheetDetail
|
|
732
|
+
): Promise<OrderVas> {
|
|
733
|
+
// Create new order vas & worksheet detail
|
|
734
|
+
const copiedTargetVas: OrderVas = Object.assign({}, targetVas)
|
|
735
|
+
//@ts-ignore
|
|
736
|
+
delete copiedTargetVas.id
|
|
737
|
+
|
|
738
|
+
let newTargetVas: OrderVas = {
|
|
739
|
+
...copiedTargetVas,
|
|
740
|
+
domain,
|
|
741
|
+
bizplace,
|
|
742
|
+
name: OrderNoGenerator.orderVas(),
|
|
743
|
+
qty: targetVas.qty - currentOrderQty,
|
|
744
|
+
uomValue: targetVas.uomValue - currentOrderUomValue,
|
|
745
|
+
creator: user,
|
|
746
|
+
updater: user
|
|
747
|
+
}
|
|
748
|
+
newTargetVas = await trxMgr.getRepository(OrderVas).save(newTargetVas)
|
|
749
|
+
|
|
750
|
+
const copiedWSD: WorksheetDetail = Object.assign({}, wsd)
|
|
751
|
+
delete copiedWSD.id
|
|
752
|
+
|
|
753
|
+
const newWSD: WorksheetDetail = {
|
|
754
|
+
...copiedWSD,
|
|
755
|
+
domain,
|
|
756
|
+
bizplace,
|
|
757
|
+
name: WorksheetNoGenerator.vasDetail(),
|
|
758
|
+
seq: wsd.seq++,
|
|
759
|
+
targetVas: newTargetVas,
|
|
760
|
+
creator: user,
|
|
761
|
+
updater: user
|
|
762
|
+
}
|
|
763
|
+
await trxMgr.getRepository(WorksheetDetail).save(newWSD)
|
|
764
|
+
|
|
765
|
+
targetVas.qty = currentOrderQty
|
|
766
|
+
targetVas.uomValue = currentOrderUomValue
|
|
767
|
+
return targetVas
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
export async function upsertInventory(
|
|
771
|
+
trxMgr: EntityManager,
|
|
772
|
+
domain: Domain,
|
|
773
|
+
bizplace: Bizplace,
|
|
774
|
+
user: User,
|
|
775
|
+
originInv: Inventory,
|
|
776
|
+
refOrder: RefOrderType,
|
|
777
|
+
palletId: string,
|
|
778
|
+
locationName: string,
|
|
779
|
+
packingType: string,
|
|
780
|
+
addedQty: number,
|
|
781
|
+
addedUomValue: number,
|
|
782
|
+
transactionType: string,
|
|
783
|
+
stdAmount?: number,
|
|
784
|
+
packingUnit?: string
|
|
785
|
+
): Promise<Inventory> {
|
|
786
|
+
const location: Location = await trxMgr.getRepository(Location).findOne({
|
|
787
|
+
where: { domain: { id: domain.id }, name: locationName },
|
|
788
|
+
relations: ['warehouse']
|
|
789
|
+
})
|
|
790
|
+
if (!location) throw new Error(`Location is not found by (${locationName})`)
|
|
791
|
+
const warehouse: Warehouse = location.warehouse
|
|
792
|
+
const zone: string = location.zone
|
|
793
|
+
|
|
794
|
+
let inv: Inventory = await trxMgr.getRepository(Inventory).findOne({
|
|
795
|
+
where: {
|
|
796
|
+
domain: { id: domain.id },
|
|
797
|
+
bizplace: { id: bizplace.id },
|
|
798
|
+
palletId,
|
|
799
|
+
batchId: originInv.batchId,
|
|
800
|
+
product: { id: originInv.product.id },
|
|
801
|
+
packingType,
|
|
802
|
+
packingSize: stdAmount,
|
|
803
|
+
refOrderId: originInv.refOrderId,
|
|
804
|
+
status: Not(Equal(INVENTORY_STATUS.TERMINATED))
|
|
805
|
+
},
|
|
806
|
+
relations: ['product', 'refInventory']
|
|
807
|
+
})
|
|
808
|
+
|
|
809
|
+
// Create new inventory
|
|
810
|
+
if (!inv) {
|
|
811
|
+
const copiedInv: Inventory = Object.assign({}, originInv)
|
|
812
|
+
//@ts-ignore
|
|
813
|
+
delete copiedInv.id
|
|
814
|
+
|
|
815
|
+
inv = {
|
|
816
|
+
...copiedInv,
|
|
817
|
+
domain,
|
|
818
|
+
bizplace,
|
|
819
|
+
palletId,
|
|
820
|
+
name: InventoryNoGenerator.inventoryName(),
|
|
821
|
+
packingType,
|
|
822
|
+
qty: addedQty,
|
|
823
|
+
//@ts-ignore
|
|
824
|
+
weight: 0,
|
|
825
|
+
uomValue: addedUomValue,
|
|
826
|
+
lockedQty: 0,
|
|
827
|
+
lockedUomValue: 0,
|
|
828
|
+
packingSize: packingUnit == PackingUnits.QTY ? stdAmount : 1,
|
|
829
|
+
warehouse,
|
|
830
|
+
location,
|
|
831
|
+
zone,
|
|
832
|
+
creator: user,
|
|
833
|
+
updater: user
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Save changed inventory
|
|
837
|
+
inv = await trxMgr.getRepository(Inventory).save(inv)
|
|
838
|
+
|
|
839
|
+
// Check whether the pallet is resuable or not
|
|
840
|
+
const pallet: Pallet = await trxMgr.getRepository(Pallet).findOne({
|
|
841
|
+
where: { domain: { id: domain.id }, name: palletId, inventory: IsNull() }
|
|
842
|
+
})
|
|
843
|
+
// If it's exists => it's reusable pallet and need to update it's inventory field
|
|
844
|
+
if (pallet) {
|
|
845
|
+
pallet.inventory = inv
|
|
846
|
+
pallet.updater = user
|
|
847
|
+
await trxMgr.getRepository(Pallet).save(pallet)
|
|
848
|
+
}
|
|
849
|
+
} else {
|
|
850
|
+
// Update inventory
|
|
851
|
+
inv.qty += addedQty
|
|
852
|
+
inv.uomValue += addedUomValue
|
|
853
|
+
inv.warehouse = warehouse
|
|
854
|
+
inv.location = location
|
|
855
|
+
inv.zone = location.zone
|
|
856
|
+
inv.updater = user
|
|
857
|
+
|
|
858
|
+
// Save changed inventory
|
|
859
|
+
inv = await trxMgr.getRepository(Inventory).save(inv)
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
// Create inventory history
|
|
863
|
+
await generateInventoryHistory(inv, refOrder, transactionType, addedQty, addedUomValue, user, trxMgr)
|
|
864
|
+
|
|
865
|
+
return inv
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
export async function deductProductAmount(
|
|
869
|
+
trxMgr: EntityManager,
|
|
870
|
+
domain: Domain,
|
|
871
|
+
bizplace: Bizplace,
|
|
872
|
+
user: User,
|
|
873
|
+
refOrder: RefOrderType,
|
|
874
|
+
originInv: Inventory,
|
|
875
|
+
reducedQty: number,
|
|
876
|
+
reducedUomValue: number,
|
|
877
|
+
transactionType: string,
|
|
878
|
+
originalQty?: number,
|
|
879
|
+
originalUomValue?: number,
|
|
880
|
+
currentUnitQty?: number,
|
|
881
|
+
currentUomValue?: number
|
|
882
|
+
) {
|
|
883
|
+
if (refOrder instanceof ReleaseGood) {
|
|
884
|
+
const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
|
|
885
|
+
where: {
|
|
886
|
+
domain: { id: domain.id },
|
|
887
|
+
bizplace: { id: bizplace.id },
|
|
888
|
+
releaseGood: { id: refOrder.id },
|
|
889
|
+
type: WORKSHEET_TYPE.LOADING
|
|
890
|
+
},
|
|
891
|
+
relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
|
|
892
|
+
})
|
|
893
|
+
|
|
894
|
+
if (!loadingWS)
|
|
895
|
+
throw new Error(
|
|
896
|
+
`Picking process is not finished yet. Please complete picking first before complete Repalletizing`
|
|
897
|
+
)
|
|
898
|
+
|
|
899
|
+
const orderInv: OrderInventory = loadingWS.worksheetDetails
|
|
900
|
+
.map((wsd: WorksheetDetail) => wsd.targetInventory)
|
|
901
|
+
.find((oi: OrderInventory) => oi.inventory.id === originInv.id)
|
|
902
|
+
if (!orderInv) {
|
|
903
|
+
throw new Error(`Failed to find order inventory (Pallet ID: ${originInv.palletId})`)
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
orderInv.releaseQty -= reducedQty
|
|
907
|
+
orderInv.releaseUomValue -= reducedUomValue
|
|
908
|
+
orderInv.updater = user
|
|
909
|
+
|
|
910
|
+
await trxMgr.getRepository(OrderInventory).save(orderInv)
|
|
911
|
+
} else {
|
|
912
|
+
// currentUnitQty > 0 only belongs to PackingUnits.QTY
|
|
913
|
+
if (currentUnitQty > 0) {
|
|
914
|
+
const unitUomValue: number = originInv.uomValue / originInv.qty
|
|
915
|
+
|
|
916
|
+
reducedQty = Math.floor((originalQty * originInv.packingSize - currentUnitQty) / originInv.packingSize)
|
|
917
|
+
reducedUomValue = unitUomValue * reducedQty
|
|
918
|
+
|
|
919
|
+
originInv.qty -= reducedQty
|
|
920
|
+
originInv.uomValue -= reducedUomValue
|
|
921
|
+
originInv.lockedQty -= reducedQty
|
|
922
|
+
originInv.lockedUomValue -= reducedUomValue
|
|
923
|
+
originInv.updater = user
|
|
924
|
+
|
|
925
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
926
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
927
|
+
|
|
928
|
+
// minus 1 because remain unit qty only exist if the unitQty < 1
|
|
929
|
+
if (originInv.qty - 1 == 0) {
|
|
930
|
+
originInv.status = INVENTORY_STATUS.TERMINATED
|
|
931
|
+
originInv.qty = 0
|
|
932
|
+
originInv.uomValue = 0
|
|
933
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
934
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -1, -unitUomValue, user, trxMgr)
|
|
935
|
+
|
|
936
|
+
const newQty: number = currentUnitQty
|
|
937
|
+
const newUomValue: number = (unitUomValue / originInv.packingSize) * newQty
|
|
938
|
+
|
|
939
|
+
originInv.qty = newQty
|
|
940
|
+
originInv.uomValue = newUomValue
|
|
941
|
+
originInv.packingSize = 1
|
|
942
|
+
originInv.status = INVENTORY_STATUS.STORED
|
|
943
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
944
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, newQty, newUomValue, user, trxMgr)
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
// currentUnitUomValue > 0 only belongs to PackingUnits.UOM
|
|
948
|
+
} else if (currentUomValue > 0) {
|
|
949
|
+
reducedUomValue = Math.round((originalUomValue - currentUomValue + Number.EPSILON) * 100) / 100
|
|
950
|
+
|
|
951
|
+
originInv.qty -= reducedQty
|
|
952
|
+
originInv.uomValue -= reducedUomValue
|
|
953
|
+
originInv.lockedQty -= reducedQty
|
|
954
|
+
originInv.lockedUomValue -= reducedUomValue
|
|
955
|
+
originInv.updater = user
|
|
956
|
+
|
|
957
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
958
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
959
|
+
} else {
|
|
960
|
+
originInv.qty -= reducedQty
|
|
961
|
+
originInv.uomValue -= reducedUomValue
|
|
962
|
+
originInv.lockedQty -= reducedQty
|
|
963
|
+
originInv.lockedUomValue -= reducedUomValue
|
|
964
|
+
originInv.updater = user
|
|
965
|
+
originInv.status = originInv.qty > 0 ? INVENTORY_STATUS.STORED : INVENTORY_STATUS.TERMINATED
|
|
966
|
+
|
|
967
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
968
|
+
await generateInventoryHistory(originInv, refOrder, transactionType, -reducedQty, -reducedUomValue, user, trxMgr)
|
|
969
|
+
|
|
970
|
+
if (originInv.qty <= 0 || originInv.uomValue <= 0) {
|
|
971
|
+
originInv.status = INVENTORY_STATUS.TERMINATED
|
|
972
|
+
originInv = await trxMgr.getRepository(Inventory).save(originInv)
|
|
973
|
+
await generateInventoryHistory(originInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
return originInv
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
export async function createPutawayWorksheet(
|
|
982
|
+
trxMgr: EntityManager,
|
|
983
|
+
domain: Domain,
|
|
984
|
+
bizplace: Bizplace,
|
|
985
|
+
user: User,
|
|
986
|
+
refOrder: ArrivalNotice,
|
|
987
|
+
originInv: Inventory,
|
|
988
|
+
changedInv: Inventory
|
|
989
|
+
): Promise<void> {
|
|
990
|
+
const putawayWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
|
|
991
|
+
where: {
|
|
992
|
+
domain: { id: domain.id },
|
|
993
|
+
bizplace: { id: bizplace.id },
|
|
994
|
+
arrivalNotice: { id: refOrder.id },
|
|
995
|
+
type: WORKSHEET_TYPE.PUTAWAY
|
|
996
|
+
},
|
|
997
|
+
relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
|
|
998
|
+
})
|
|
999
|
+
|
|
1000
|
+
if (!putawayWS) {
|
|
1001
|
+
throw new Error(
|
|
1002
|
+
`Unloading process is not finished yet. Please complete unloading first before complete Repalletizing`
|
|
1003
|
+
)
|
|
1004
|
+
}
|
|
1005
|
+
const putawayWSDs: WorksheetDetail[] = putawayWS.worksheetDetails
|
|
1006
|
+
|
|
1007
|
+
const originalWSD: WorksheetDetail = putawayWSDs.find(
|
|
1008
|
+
(wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === originInv.id
|
|
1009
|
+
)
|
|
1010
|
+
const originOrdInv: OrderInventory = originalWSD.targetInventory
|
|
1011
|
+
const sameTargetWSD: WorksheetDetail = putawayWSDs.find(
|
|
1012
|
+
(wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === changedInv.id
|
|
1013
|
+
)
|
|
1014
|
+
|
|
1015
|
+
if (!sameTargetWSD) {
|
|
1016
|
+
// Create new order inventory
|
|
1017
|
+
const copiedOrdInv: OrderInventory = Object.assign({}, originOrdInv)
|
|
1018
|
+
//@ts-ignore
|
|
1019
|
+
delete copiedOrdInv.id
|
|
1020
|
+
|
|
1021
|
+
let newOrdInv: OrderInventory = {
|
|
1022
|
+
...copiedOrdInv,
|
|
1023
|
+
domain,
|
|
1024
|
+
bizplace,
|
|
1025
|
+
name: OrderNoGenerator.orderInventory(),
|
|
1026
|
+
type: ORDER_TYPES.ARRIVAL_NOTICE,
|
|
1027
|
+
arrivalNotice: refOrder,
|
|
1028
|
+
inventory: changedInv,
|
|
1029
|
+
creator: user,
|
|
1030
|
+
updater: user
|
|
1031
|
+
}
|
|
1032
|
+
newOrdInv = await trxMgr.getRepository(OrderInventory).save(newOrdInv)
|
|
1033
|
+
|
|
1034
|
+
const copiedWSD: WorksheetDetail = Object.assign({}, originalWSD)
|
|
1035
|
+
delete copiedWSD.id
|
|
1036
|
+
|
|
1037
|
+
let newWSD: WorksheetDetail = {
|
|
1038
|
+
...copiedWSD,
|
|
1039
|
+
domain,
|
|
1040
|
+
bizplace,
|
|
1041
|
+
worksheet: putawayWS,
|
|
1042
|
+
name: WorksheetNoGenerator.putawayDetail(),
|
|
1043
|
+
targetInventory: newOrdInv,
|
|
1044
|
+
type: WORKSHEET_TYPE.PUTAWAY,
|
|
1045
|
+
creator: user,
|
|
1046
|
+
updater: user
|
|
1047
|
+
}
|
|
1048
|
+
newWSD = await trxMgr.getRepository(WorksheetDetail).save(newWSD)
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
// Update origin order inventory
|
|
1052
|
+
if (originInv.status === INVENTORY_STATUS.TERMINATED) {
|
|
1053
|
+
await trxMgr.getRepository(WorksheetDetail).delete(originalWSD.id)
|
|
1054
|
+
|
|
1055
|
+
originOrdInv.status = ORDER_INVENTORY_STATUS.DONE
|
|
1056
|
+
originOrdInv.updater = user
|
|
1057
|
+
await trxMgr.getRepository(OrderInventory).save(originOrdInv)
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
export async function createLoadingWorksheet(
|
|
1062
|
+
trxMgr: EntityManager,
|
|
1063
|
+
domain: Domain,
|
|
1064
|
+
bizplace: Bizplace,
|
|
1065
|
+
user: User,
|
|
1066
|
+
refOrder: ReleaseGood,
|
|
1067
|
+
originInv: OrderInventory,
|
|
1068
|
+
changedInv: Inventory
|
|
1069
|
+
): Promise<void> {
|
|
1070
|
+
const changedQty: number = changedInv.qty
|
|
1071
|
+
const changedUomValue: number = changedInv.uomValue
|
|
1072
|
+
const loadingWS: Worksheet = await trxMgr.getRepository(Worksheet).findOne({
|
|
1073
|
+
where: {
|
|
1074
|
+
domain: { id: domain.id },
|
|
1075
|
+
bizplace: { id: bizplace.id },
|
|
1076
|
+
releaseGood: { id: refOrder.id },
|
|
1077
|
+
type: WORKSHEET_TYPE.LOADING
|
|
1078
|
+
},
|
|
1079
|
+
relations: ['worksheetDetails', 'worksheetDetails.targetInventory', 'worksheetDetails.targetInventory.inventory']
|
|
1080
|
+
})
|
|
1081
|
+
|
|
1082
|
+
if (!loadingWS) {
|
|
1083
|
+
throw new Error(`Picking process is not finished yet. Please complete picking first before complete Repalletizing`)
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
const loadingWSDs: WorksheetDetail[] = loadingWS.worksheetDetails
|
|
1087
|
+
|
|
1088
|
+
const originalWSD: WorksheetDetail = loadingWSDs.find(
|
|
1089
|
+
(wsd: WorksheetDetail) => wsd.targetInventory.inventory.id === originInv.id
|
|
1090
|
+
)
|
|
1091
|
+
const originOrdInv: OrderInventory = originalWSD.targetInventory
|
|
1092
|
+
const sameTargetWSD: WorksheetDetail = loadingWSDs.find((wsd: WorksheetDetail) => {
|
|
1093
|
+
const targetOI: OrderInventory = wsd.targetInventory
|
|
1094
|
+
const targetInv: Inventory = targetOI.inventory
|
|
1095
|
+
const targetUnitUomValue: number = targetOI.releaseUomValue / targetOI.releaseQty
|
|
1096
|
+
const changeUnitUomValue: number = changedUomValue / changedQty
|
|
1097
|
+
|
|
1098
|
+
if (
|
|
1099
|
+
targetInv.palletId === changedInv.palletId &&
|
|
1100
|
+
targetInv.batchId === changedInv.batchId &&
|
|
1101
|
+
targetInv.packingType === changedInv.packingType &&
|
|
1102
|
+
targetUnitUomValue === changeUnitUomValue
|
|
1103
|
+
) {
|
|
1104
|
+
return wsd
|
|
1105
|
+
}
|
|
1106
|
+
})
|
|
1107
|
+
|
|
1108
|
+
if (!sameTargetWSD) {
|
|
1109
|
+
// Create new order inventory
|
|
1110
|
+
const copiedOrderInv: OrderInventory = Object.assign({}, originOrdInv)
|
|
1111
|
+
//@ts-ignore
|
|
1112
|
+
delete copiedOrderInv.id
|
|
1113
|
+
|
|
1114
|
+
let newOrdInv: OrderInventory = await trxMgr.getRepository(OrderInventory).save({
|
|
1115
|
+
...copiedOrderInv,
|
|
1116
|
+
domain,
|
|
1117
|
+
bizplace,
|
|
1118
|
+
releaseQty: changedQty,
|
|
1119
|
+
releaseUomValue: changedUomValue,
|
|
1120
|
+
name: OrderNoGenerator.orderInventory(),
|
|
1121
|
+
type: ORDER_TYPES.RELEASE_OF_GOODS,
|
|
1122
|
+
releaseGood: refOrder,
|
|
1123
|
+
inventory: changedInv,
|
|
1124
|
+
creator: user,
|
|
1125
|
+
updater: user
|
|
1126
|
+
})
|
|
1127
|
+
newOrdInv = await trxMgr.getRepository(OrderInventory).save(newOrdInv)
|
|
1128
|
+
|
|
1129
|
+
const copiedWSD: WorksheetDetail = Object.assign({}, originalWSD)
|
|
1130
|
+
delete copiedWSD.id
|
|
1131
|
+
|
|
1132
|
+
let newWSD: WorksheetDetail = {
|
|
1133
|
+
...copiedWSD,
|
|
1134
|
+
domain,
|
|
1135
|
+
bizplace,
|
|
1136
|
+
worksheet: loadingWS,
|
|
1137
|
+
name: WorksheetNoGenerator.loadingDetail(),
|
|
1138
|
+
targetInventory: newOrdInv,
|
|
1139
|
+
type: WORKSHEET_TYPE.LOADING,
|
|
1140
|
+
creator: user,
|
|
1141
|
+
updater: user
|
|
1142
|
+
}
|
|
1143
|
+
await trxMgr.getRepository(WorksheetDetail).save(newWSD)
|
|
1144
|
+
} else {
|
|
1145
|
+
let sameTargetInv: OrderInventory = sameTargetWSD.targetInventory
|
|
1146
|
+
sameTargetInv.releaseQty += changedQty
|
|
1147
|
+
sameTargetInv.releaseUomValue += changedUomValue
|
|
1148
|
+
sameTargetInv.updater = user
|
|
1149
|
+
await trxMgr.getRepository(OrderInventory).save(sameTargetInv)
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
// Update inventory to PICKED inventory
|
|
1153
|
+
changedInv = await trxMgr.getRepository(Inventory).save({
|
|
1154
|
+
...changedInv,
|
|
1155
|
+
qty: changedInv.qty - changedQty,
|
|
1156
|
+
uomValue: changedInv.uomValue - changedUomValue,
|
|
1157
|
+
updater: user
|
|
1158
|
+
})
|
|
1159
|
+
|
|
1160
|
+
// Generate PICKING inventory history
|
|
1161
|
+
await generateInventoryHistory(
|
|
1162
|
+
changedInv,
|
|
1163
|
+
refOrder,
|
|
1164
|
+
INVENTORY_TRANSACTION_TYPE.PICKING,
|
|
1165
|
+
-changedQty,
|
|
1166
|
+
-changedUomValue,
|
|
1167
|
+
user,
|
|
1168
|
+
trxMgr
|
|
1169
|
+
)
|
|
1170
|
+
|
|
1171
|
+
// Generate TERMINATED inventory history
|
|
1172
|
+
await generateInventoryHistory(changedInv, refOrder, INVENTORY_TRANSACTION_TYPE.TERMINATED, 0, 0, user, trxMgr)
|
|
1173
|
+
|
|
1174
|
+
// Delete worksheet detail & order inventory
|
|
1175
|
+
// If order inventory doesn't have release qty any more
|
|
1176
|
+
if (originOrdInv.releaseQty <= 0) {
|
|
1177
|
+
await trxMgr.getRepository(WorksheetDetail).delete(originalWSD.id)
|
|
1178
|
+
originInv.status = ORDER_INVENTORY_STATUS.DONE
|
|
1179
|
+
originInv.updater = user
|
|
1180
|
+
await trxMgr.getRepository(OrderInventory).save(originInv)
|
|
1181
|
+
}
|
|
1182
|
+
}
|