@things-factory/sales-base 5.0.13 → 6.0.0-alpha.1
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/constants/order.js +4 -1
- package/dist-server/constants/order.js.map +1 -1
- package/dist-server/constants/release-good.js +5 -1
- package/dist-server/constants/release-good.js.map +1 -1
- package/dist-server/controllers/ecommerce/ecommerce-controller.js +1 -1
- package/dist-server/controllers/ecommerce/ecommerce-controller.js.map +1 -1
- package/dist-server/controllers/ecommerce/sellercraft-controller.js +102 -94
- package/dist-server/controllers/ecommerce/sellercraft-controller.js.map +1 -1
- package/dist-server/controllers/order-controller.js +7 -5
- package/dist-server/controllers/order-controller.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js +152 -65
- package/dist-server/service/arrival-notice/arrival-notice-mutation.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-query.js +15 -16
- package/dist-server/service/arrival-notice/arrival-notice-query.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice-types.js +1 -2
- package/dist-server/service/arrival-notice/arrival-notice-types.js.map +1 -1
- package/dist-server/service/arrival-notice/arrival-notice.js +7 -7
- package/dist-server/service/arrival-notice/arrival-notice.js.map +1 -1
- package/dist-server/service/claim/claim-mutation.js +15 -14
- package/dist-server/service/claim/claim-mutation.js.map +1 -1
- package/dist-server/service/claim/claim-query.js +8 -10
- package/dist-server/service/claim/claim-query.js.map +1 -1
- package/dist-server/service/claim/claim.js +7 -7
- package/dist-server/service/claim/claim.js.map +1 -1
- package/dist-server/service/claim-detail/claim-detail-mutation.js +9 -8
- package/dist-server/service/claim-detail/claim-detail-mutation.js.map +1 -1
- package/dist-server/service/claim-detail/claim-detail-query.js +9 -10
- package/dist-server/service/claim-detail/claim-detail-query.js.map +1 -1
- package/dist-server/service/claim-detail/claim-detail.js +3 -4
- package/dist-server/service/claim-detail/claim-detail.js.map +1 -1
- package/dist-server/service/claim-order/claim-order-mutation.js +9 -8
- package/dist-server/service/claim-order/claim-order-mutation.js.map +1 -1
- package/dist-server/service/claim-order/claim-order-query.js +9 -10
- package/dist-server/service/claim-order/claim-order-query.js.map +1 -1
- package/dist-server/service/claim-order/claim-order.js +3 -4
- package/dist-server/service/claim-order/claim-order.js.map +1 -1
- package/dist-server/service/collection-order/collection-order-mutation.js +15 -14
- package/dist-server/service/collection-order/collection-order-mutation.js.map +1 -1
- package/dist-server/service/collection-order/collection-order-query.js +14 -14
- package/dist-server/service/collection-order/collection-order-query.js.map +1 -1
- package/dist-server/service/collection-order/collection-order-types.js +4 -5
- package/dist-server/service/collection-order/collection-order-types.js.map +1 -1
- package/dist-server/service/collection-order/collection-order.js +7 -7
- package/dist-server/service/collection-order/collection-order.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order-mutation.js +138 -51
- package/dist-server/service/delivery-order/delivery-order-mutation.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order-query.js +51 -38
- package/dist-server/service/delivery-order/delivery-order-query.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order-types.js +22 -3
- package/dist-server/service/delivery-order/delivery-order-types.js.map +1 -1
- package/dist-server/service/delivery-order/delivery-order.js +92 -7
- package/dist-server/service/delivery-order/delivery-order.js.map +1 -1
- package/dist-server/service/draft-release-good/draft-release-good-mutation.js +157 -143
- package/dist-server/service/draft-release-good/draft-release-good-mutation.js.map +1 -1
- package/dist-server/service/draft-release-good/draft-release-good-query.js +54 -24
- package/dist-server/service/draft-release-good/draft-release-good-query.js.map +1 -1
- package/dist-server/service/draft-release-good/draft-release-good-type.js +3 -4
- package/dist-server/service/draft-release-good/draft-release-good-type.js.map +1 -1
- package/dist-server/service/draft-release-good/draft-release-good.js +11 -6
- package/dist-server/service/draft-release-good/draft-release-good.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note-mutation.js +12 -11
- package/dist-server/service/goods-receival-note/goods-receival-note-mutation.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note-query.js +104 -12
- package/dist-server/service/goods-receival-note/goods-receival-note-query.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note-types.js +67 -4
- package/dist-server/service/goods-receival-note/goods-receival-note-types.js.map +1 -1
- package/dist-server/service/goods-receival-note/goods-receival-note.js +46 -5
- package/dist-server/service/goods-receival-note/goods-receival-note.js.map +1 -1
- package/dist-server/service/inventory-check/inventory-check-mutation.js +6 -6
- package/dist-server/service/inventory-check/inventory-check-mutation.js.map +1 -1
- package/dist-server/service/inventory-check/inventory-check-query.js +8 -10
- package/dist-server/service/inventory-check/inventory-check-query.js.map +1 -1
- package/dist-server/service/inventory-check/inventory-check.js +5 -5
- package/dist-server/service/inventory-check/inventory-check.js.map +1 -1
- package/dist-server/service/invoice/invoice-mutation.js +5 -5
- package/dist-server/service/invoice/invoice-mutation.js.map +1 -1
- package/dist-server/service/invoice/invoice-query.js +7 -9
- package/dist-server/service/invoice/invoice-query.js.map +1 -1
- package/dist-server/service/invoice/invoice-types.js +2 -3
- package/dist-server/service/invoice/invoice-types.js.map +1 -1
- package/dist-server/service/invoice/invoice.js +3 -4
- package/dist-server/service/invoice/invoice.js.map +1 -1
- package/dist-server/service/invoice-product/invoice-product-mutation.js +1 -1
- package/dist-server/service/invoice-product/invoice-product-mutation.js.map +1 -1
- package/dist-server/service/invoice-product/invoice-product-query.js +7 -9
- package/dist-server/service/invoice-product/invoice-product-query.js.map +1 -1
- package/dist-server/service/invoice-product/invoice-product.js +5 -5
- package/dist-server/service/invoice-product/invoice-product.js.map +1 -1
- package/dist-server/service/job-sheet/job-sheet-mutation.js +5 -5
- package/dist-server/service/job-sheet/job-sheet-mutation.js.map +1 -1
- package/dist-server/service/job-sheet/job-sheet-query.js +6 -8
- package/dist-server/service/job-sheet/job-sheet-query.js.map +1 -1
- package/dist-server/service/job-sheet/job-sheet.js +5 -5
- package/dist-server/service/job-sheet/job-sheet.js.map +1 -1
- package/dist-server/service/manifest/manifest-mutation.js +84 -4
- package/dist-server/service/manifest/manifest-mutation.js.map +1 -1
- package/dist-server/service/manifest/manifest-query.js +52 -19
- package/dist-server/service/manifest/manifest-query.js.map +1 -1
- package/dist-server/service/manifest/manifest-type.js +8 -0
- package/dist-server/service/manifest/manifest-type.js.map +1 -1
- package/dist-server/service/manifest/manifest.js +8 -4
- package/dist-server/service/manifest/manifest.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory-mutation.js +3 -3
- package/dist-server/service/order-inventory/order-inventory-mutation.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory-query.js +202 -221
- package/dist-server/service/order-inventory/order-inventory-query.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory-types.js +15 -15
- package/dist-server/service/order-inventory/order-inventory-types.js.map +1 -1
- package/dist-server/service/order-inventory/order-inventory.js +45 -15
- package/dist-server/service/order-inventory/order-inventory.js.map +1 -1
- package/dist-server/service/order-product/order-product-mutation.js +2 -2
- package/dist-server/service/order-product/order-product-mutation.js.map +1 -1
- package/dist-server/service/order-product/order-product-query.js +44 -14
- package/dist-server/service/order-product/order-product-query.js.map +1 -1
- package/dist-server/service/order-product/order-product-types.js +18 -19
- package/dist-server/service/order-product/order-product-types.js.map +1 -1
- package/dist-server/service/order-product/order-product.js +14 -11
- package/dist-server/service/order-product/order-product.js.map +1 -1
- package/dist-server/service/order-tote/order-tote-mutation.js +2 -2
- package/dist-server/service/order-tote/order-tote-mutation.js.map +1 -1
- package/dist-server/service/order-tote/order-tote-query.js +13 -14
- package/dist-server/service/order-tote/order-tote-query.js.map +1 -1
- package/dist-server/service/order-tote/order-tote-types.js +4 -5
- package/dist-server/service/order-tote/order-tote-types.js.map +1 -1
- package/dist-server/service/order-tote/order-tote.js +6 -5
- package/dist-server/service/order-tote/order-tote.js.map +1 -1
- package/dist-server/service/order-tote-item/order-tote-item-mutation.js +2 -2
- package/dist-server/service/order-tote-item/order-tote-item-mutation.js.map +1 -1
- package/dist-server/service/order-tote-item/order-tote-item-query.js +7 -9
- package/dist-server/service/order-tote-item/order-tote-item-query.js.map +1 -1
- package/dist-server/service/order-tote-item/order-tote-item-types.js +5 -6
- package/dist-server/service/order-tote-item/order-tote-item-types.js.map +1 -1
- package/dist-server/service/order-tote-item/order-tote-item.js +2 -3
- package/dist-server/service/order-tote-item/order-tote-item.js.map +1 -1
- package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js +2 -2
- package/dist-server/service/order-tote-seal/order-tote-seal-mutation.js.map +1 -1
- package/dist-server/service/order-tote-seal/order-tote-seal-query.js +8 -10
- package/dist-server/service/order-tote-seal/order-tote-seal-query.js.map +1 -1
- package/dist-server/service/order-tote-seal/order-tote-seal-types.js +2 -3
- package/dist-server/service/order-tote-seal/order-tote-seal-types.js.map +1 -1
- package/dist-server/service/order-tote-seal/order-tote-seal.js +2 -3
- package/dist-server/service/order-tote-seal/order-tote-seal.js.map +1 -1
- package/dist-server/service/order-vas/order-vas-mutation.js +1 -1
- package/dist-server/service/order-vas/order-vas-mutation.js.map +1 -1
- package/dist-server/service/order-vas/order-vas-query.js +8 -10
- package/dist-server/service/order-vas/order-vas-query.js.map +1 -1
- package/dist-server/service/order-vas/order-vas-types.js +16 -17
- package/dist-server/service/order-vas/order-vas-types.js.map +1 -1
- package/dist-server/service/order-vas/order-vas.js +7 -7
- package/dist-server/service/order-vas/order-vas.js.map +1 -1
- package/dist-server/service/others/other-query.js +48 -30
- package/dist-server/service/others/other-query.js.map +1 -1
- package/dist-server/service/purchase-order/purchase-order-mutation.js +36 -34
- package/dist-server/service/purchase-order/purchase-order-mutation.js.map +1 -1
- package/dist-server/service/purchase-order/purchase-order-query.js +11 -12
- package/dist-server/service/purchase-order/purchase-order-query.js.map +1 -1
- package/dist-server/service/purchase-order/purchase-order-types.js +8 -9
- package/dist-server/service/purchase-order/purchase-order-types.js.map +1 -1
- package/dist-server/service/purchase-order/purchase-order.js +8 -8
- package/dist-server/service/purchase-order/purchase-order.js.map +1 -1
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.js +1 -1
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.js.map +1 -1
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-query.js +9 -10
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge-query.js.map +1 -1
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge.js +3 -4
- package/dist-server/service/purchase-order-other-charge/purchase-order-other-charge.js.map +1 -1
- package/dist-server/service/release-good/release-good-mutation.js +182 -94
- package/dist-server/service/release-good/release-good-mutation.js.map +1 -1
- package/dist-server/service/release-good/release-good-query.js +251 -172
- package/dist-server/service/release-good/release-good-query.js.map +1 -1
- package/dist-server/service/release-good/release-good-types.js +181 -9
- package/dist-server/service/release-good/release-good-types.js.map +1 -1
- package/dist-server/service/release-good/release-good.js +64 -13
- package/dist-server/service/release-good/release-good.js.map +1 -1
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-mutation.js +19 -14
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-mutation.js.map +1 -1
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-query.js +8 -10
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-query.js.map +1 -1
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-types.js +6 -7
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order-types.js.map +1 -1
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order.js +5 -5
- package/dist-server/service/retail-replenishment-order/retail-replenishment-order.js.map +1 -1
- package/dist-server/service/return-order/return-order-mutation.js +38 -27
- package/dist-server/service/return-order/return-order-mutation.js.map +1 -1
- package/dist-server/service/return-order/return-order-query.js +14 -16
- package/dist-server/service/return-order/return-order-query.js.map +1 -1
- package/dist-server/service/return-order/return-order-types.js +9 -9
- package/dist-server/service/return-order/return-order-types.js.map +1 -1
- package/dist-server/service/return-order/return-order.js +6 -6
- package/dist-server/service/return-order/return-order.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js +17 -13
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-mutation.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js +13 -14
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-query.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js +9 -9
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order-type.js.map +1 -1
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order.js +8 -8
- package/dist-server/service/reverse-kitting-order/reverse-kitting-order.js.map +1 -1
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js +4 -4
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.js.map +1 -1
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.js +7 -9
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.js.map +1 -1
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.js +4 -5
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-type.js.map +1 -1
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.js +7 -7
- package/dist-server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory.js.map +1 -1
- package/dist-server/service/shipping-order/shipping-order-mutation.js +2 -2
- package/dist-server/service/shipping-order/shipping-order-mutation.js.map +1 -1
- package/dist-server/service/shipping-order/shipping-order-query.js +9 -10
- package/dist-server/service/shipping-order/shipping-order-query.js.map +1 -1
- package/dist-server/service/shipping-order/shipping-order-types.js +21 -1
- package/dist-server/service/shipping-order/shipping-order-types.js.map +1 -1
- package/dist-server/service/shipping-order/shipping-order.js +27 -7
- package/dist-server/service/shipping-order/shipping-order.js.map +1 -1
- package/dist-server/service/transfer-order/transfer-order-mutation.js +19 -14
- package/dist-server/service/transfer-order/transfer-order-mutation.js.map +1 -1
- package/dist-server/service/transfer-order/transfer-order-query.js +8 -10
- package/dist-server/service/transfer-order/transfer-order-query.js.map +1 -1
- package/dist-server/service/transfer-order/transfer-order-types.js +1 -2
- package/dist-server/service/transfer-order/transfer-order-types.js.map +1 -1
- package/dist-server/service/transfer-order/transfer-order.js +5 -5
- package/dist-server/service/transfer-order/transfer-order.js.map +1 -1
- package/dist-server/service/vas/vas-mutation.js +2 -2
- package/dist-server/service/vas/vas-mutation.js.map +1 -1
- package/dist-server/service/vas/vas-query.js +8 -10
- package/dist-server/service/vas/vas-query.js.map +1 -1
- package/dist-server/service/vas/vas.js +3 -4
- package/dist-server/service/vas/vas.js.map +1 -1
- package/dist-server/service/vas-order/vas-order-mutation.js +20 -15
- package/dist-server/service/vas-order/vas-order-mutation.js.map +1 -1
- package/dist-server/service/vas-order/vas-order-query.js +11 -12
- package/dist-server/service/vas-order/vas-order-query.js.map +1 -1
- package/dist-server/service/vas-order/vas-order.js +5 -5
- package/dist-server/service/vas-order/vas-order.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/datetime-util.js +49 -0
- package/dist-server/utils/datetime-util.js.map +1 -0
- package/dist-server/utils/index.js +1 -0
- package/dist-server/utils/index.js.map +1 -1
- package/dist-server/utils/inventory-util.js +89 -29
- package/dist-server/utils/inventory-util.js.map +1 -1
- package/package.json +13 -13
- package/server/constants/order.ts +4 -1
- package/server/constants/release-good.ts +6 -3
- package/server/controllers/ecommerce/ecommerce-controller.ts +1 -1
- package/server/controllers/ecommerce/sellercraft-controller.ts +124 -107
- package/server/controllers/order-controller.ts +7 -5
- package/server/service/arrival-notice/arrival-notice-mutation.ts +204 -91
- package/server/service/arrival-notice/arrival-notice-query.ts +17 -17
- package/server/service/claim/claim-mutation.ts +20 -14
- package/server/service/claim/claim-query.ts +10 -9
- package/server/service/claim-detail/claim-detail-mutation.ts +16 -10
- package/server/service/claim-detail/claim-detail-query.ts +13 -8
- package/server/service/claim-order/claim-order-mutation.ts +16 -10
- package/server/service/claim-order/claim-order-query.ts +10 -8
- package/server/service/collection-order/collection-order-mutation.ts +31 -32
- package/server/service/collection-order/collection-order-query.ts +18 -15
- package/server/service/delivery-order/delivery-order-mutation.ts +206 -73
- package/server/service/delivery-order/delivery-order-query.ts +90 -53
- package/server/service/delivery-order/delivery-order-types.ts +15 -0
- package/server/service/delivery-order/delivery-order.ts +68 -0
- package/server/service/draft-release-good/draft-release-good-mutation.ts +208 -183
- package/server/service/draft-release-good/draft-release-good-query.ts +81 -44
- package/server/service/draft-release-good/draft-release-good.ts +7 -3
- package/server/service/goods-receival-note/goods-receival-note-mutation.ts +23 -18
- package/server/service/goods-receival-note/goods-receival-note-query.ts +126 -15
- package/server/service/goods-receival-note/goods-receival-note-types.ts +48 -0
- package/server/service/goods-receival-note/goods-receival-note.ts +32 -0
- package/server/service/inventory-check/inventory-check-mutation.ts +24 -19
- package/server/service/inventory-check/inventory-check-query.ts +10 -9
- package/server/service/invoice/invoice-mutation.ts +14 -11
- package/server/service/invoice/invoice-query.ts +8 -9
- package/server/service/invoice-product/invoice-product-mutation.ts +4 -4
- package/server/service/invoice-product/invoice-product-query.ts +8 -9
- package/server/service/job-sheet/job-sheet-mutation.ts +12 -10
- package/server/service/job-sheet/job-sheet-query.ts +16 -11
- package/server/service/manifest/manifest-mutation.ts +93 -8
- package/server/service/manifest/manifest-query.ts +73 -23
- package/server/service/manifest/manifest-type.ts +6 -0
- package/server/service/manifest/manifest.ts +6 -2
- package/server/service/order-inventory/order-inventory-mutation.ts +13 -12
- package/server/service/order-inventory/order-inventory-query.ts +226 -253
- package/server/service/order-inventory/order-inventory.ts +26 -2
- package/server/service/order-product/order-product-mutation.ts +11 -10
- package/server/service/order-product/order-product-query.ts +55 -18
- package/server/service/order-product/order-product.ts +7 -0
- package/server/service/order-tote/order-tote-mutation.ts +10 -9
- package/server/service/order-tote/order-tote-query.ts +13 -15
- package/server/service/order-tote/order-tote.ts +13 -2
- package/server/service/order-tote-item/order-tote-item-mutation.ts +10 -9
- package/server/service/order-tote-item/order-tote-item-query.ts +12 -18
- package/server/service/order-tote-seal/order-tote-seal-mutation.ts +10 -9
- package/server/service/order-tote-seal/order-tote-seal-query.ts +10 -11
- package/server/service/order-vas/order-vas-mutation.ts +4 -5
- package/server/service/order-vas/order-vas-query.ts +10 -9
- package/server/service/others/other-query.ts +76 -54
- package/server/service/purchase-order/purchase-order-mutation.ts +46 -46
- package/server/service/purchase-order/purchase-order-query.ts +13 -11
- package/server/service/purchase-order-other-charge/purchase-order-other-charge-mutation.ts +7 -7
- package/server/service/purchase-order-other-charge/purchase-order-other-charge-query.ts +14 -9
- package/server/service/release-good/release-good-mutation.ts +297 -134
- package/server/service/release-good/release-good-query.ts +268 -186
- package/server/service/release-good/release-good-types.ts +132 -4
- package/server/service/release-good/release-good.ts +55 -24
- package/server/service/retail-replenishment-order/retail-replenishment-order-mutation.ts +35 -29
- package/server/service/retail-replenishment-order/retail-replenishment-order-query.ts +13 -9
- package/server/service/retail-replenishment-order/retail-replenishment-order-types.ts +7 -5
- package/server/service/return-order/return-order-mutation.ts +82 -54
- package/server/service/return-order/return-order-query.ts +21 -19
- package/server/service/reverse-kitting-order/reverse-kitting-order-mutation.ts +38 -23
- package/server/service/reverse-kitting-order/reverse-kitting-order-query.ts +19 -16
- package/server/service/reverse-kitting-order/reverse-kitting-order.ts +2 -2
- package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-mutation.ts +9 -9
- package/server/service/reverse-kitting-order-inventory/reverse-kitting-order-inventory-query.ts +7 -8
- package/server/service/shipping-order/shipping-order-mutation.ts +11 -11
- package/server/service/shipping-order/shipping-order-query.ts +13 -11
- package/server/service/shipping-order/shipping-order-types.ts +16 -1
- package/server/service/shipping-order/shipping-order.ts +18 -2
- package/server/service/transfer-order/transfer-order-mutation.ts +34 -25
- package/server/service/transfer-order/transfer-order-query.ts +11 -10
- package/server/service/vas/vas-mutation.ts +13 -15
- package/server/service/vas/vas-query.ts +12 -10
- package/server/service/vas-order/vas-order-mutation.ts +38 -28
- package/server/service/vas-order/vas-order-query.ts +15 -13
- package/server/utils/datetime-util.ts +54 -0
- package/server/utils/index.ts +1 -0
- package/server/utils/inventory-util.ts +128 -34
- package/translations/en.json +4 -0
- package/translations/ko.json +6 -2
- package/translations/ms.json +5 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateTimeConverter = exports.DateGenerator = void 0;
|
|
4
|
+
class DateGenerator {
|
|
5
|
+
static generateDate() {
|
|
6
|
+
const today = new Date();
|
|
7
|
+
const year = today.getFullYear();
|
|
8
|
+
const month = today.getMonth();
|
|
9
|
+
const day = today.getDate();
|
|
10
|
+
const yy = String(year).substr(String(year).length - 2);
|
|
11
|
+
const mm = String(month + 1).padStart(2, '0');
|
|
12
|
+
const dd = String(day).padStart(2, '0');
|
|
13
|
+
return yy + mm + dd;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.DateGenerator = DateGenerator;
|
|
17
|
+
class DateTimeConverter {
|
|
18
|
+
static date(dateTime) {
|
|
19
|
+
let unloadDate = '';
|
|
20
|
+
if (dateTime) {
|
|
21
|
+
const unloadDateTime = new Date(dateTime);
|
|
22
|
+
var year = unloadDateTime.getFullYear();
|
|
23
|
+
var month = (1 + unloadDateTime.getMonth()).toString();
|
|
24
|
+
month = month.length > 1 ? month : '0' + month;
|
|
25
|
+
var day = unloadDateTime.getDate().toString();
|
|
26
|
+
day = day.length > 1 ? day : '0' + day;
|
|
27
|
+
unloadDate = day + '-' + month + '-' + year;
|
|
28
|
+
}
|
|
29
|
+
return unloadDate;
|
|
30
|
+
}
|
|
31
|
+
static datetime(dateTime, timezone) {
|
|
32
|
+
let unloadDate = '';
|
|
33
|
+
if (dateTime) {
|
|
34
|
+
const datetime = Number(dateTime);
|
|
35
|
+
const timezoneOffset = timezone * 60000;
|
|
36
|
+
const newUnloadDate = new Date(datetime - timezoneOffset).toISOString().slice(0, -1);
|
|
37
|
+
var dateTimeParts = newUnloadDate.split('T');
|
|
38
|
+
//handle date parts
|
|
39
|
+
var dateParts = dateTimeParts[0].split('-');
|
|
40
|
+
var newDate = DateTimeConverter.date(dateParts);
|
|
41
|
+
//handle time part
|
|
42
|
+
var timeParts = dateTimeParts[1].slice(0, -7);
|
|
43
|
+
unloadDate = newDate + ' ' + timeParts;
|
|
44
|
+
}
|
|
45
|
+
return unloadDate;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.DateTimeConverter = DateTimeConverter;
|
|
49
|
+
//# sourceMappingURL=datetime-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime-util.js","sourceRoot":"","sources":["../../server/utils/datetime-util.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IACxB,MAAM,CAAC,YAAY;QACjB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAA;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;QAE3B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;QAEvC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACrB,CAAC;CACF;AAbD,sCAaC;AAED,MAAa,iBAAiB;IAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ;QAClB,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,cAAc,GAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/C,IAAI,IAAI,GAAG,cAAc,CAAC,WAAW,EAAE,CAAA;YAEvC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;YACtD,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAA;YAE9C,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAA;YAC7C,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;YAEtC,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,IAAI,CAAA;SAC5C;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;QAChC,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,QAAQ,EAAE;YACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YACjC,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAA;YACvC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAEpF,IAAI,aAAa,GAAQ,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAEjD,mBAAmB;YACnB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3C,IAAI,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAE/C,kBAAkB;YAClB,IAAI,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAE7C,UAAU,GAAG,OAAO,GAAG,GAAG,GAAG,SAAS,CAAA;SACvC;QACD,OAAO,UAAU,CAAA;IACnB,CAAC;CACF;AAtCD,8CAsCC","sourcesContent":["export class DateGenerator {\n static generateDate() {\n const today = new Date()\n const year = today.getFullYear()\n const month = today.getMonth()\n const day = today.getDate()\n\n const yy = String(year).substr(String(year).length - 2)\n const mm = String(month + 1).padStart(2, '0')\n const dd = String(day).padStart(2, '0')\n\n return yy + mm + dd\n }\n}\n\nexport class DateTimeConverter {\n static date(dateTime) {\n let unloadDate = ''\n if (dateTime) {\n const unloadDateTime: Date = new Date(dateTime)\n var year = unloadDateTime.getFullYear()\n\n var month = (1 + unloadDateTime.getMonth()).toString()\n month = month.length > 1 ? month : '0' + month\n\n var day = unloadDateTime.getDate().toString()\n day = day.length > 1 ? day : '0' + day\n\n unloadDate = day + '-' + month + '-' + year\n }\n return unloadDate\n }\n\n static datetime(dateTime, timezone) {\n let unloadDate = ''\n if (dateTime) {\n const datetime = Number(dateTime)\n const timezoneOffset = timezone * 60000\n const newUnloadDate = new Date(datetime - timezoneOffset).toISOString().slice(0, -1)\n\n var dateTimeParts: any = newUnloadDate.split('T')\n\n //handle date parts\n var dateParts = dateTimeParts[0].split('-')\n var newDate = DateTimeConverter.date(dateParts)\n\n //handle time part\n var timeParts = dateTimeParts[1].slice(0, -7)\n\n unloadDate = newDate + ' ' + timeParts\n }\n return unloadDate\n }\n}\n"]}
|
|
@@ -3,4 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
4
|
tslib_1.__exportStar(require("./order-no-generator"), exports);
|
|
5
5
|
tslib_1.__exportStar(require("./inventory-util"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./datetime-util"), exports);
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC;AACpC,2DAAgC","sourcesContent":["export * from './order-no-generator'\nexport * from './inventory-util'\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/utils/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC;AACpC,2DAAgC;AAChC,0DAA+B","sourcesContent":["export * from './order-no-generator'\nexport * from './inventory-util'\nexport * from './datetime-util'\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports._composeTargetInventories = exports.switchLocationStatus = exports.InventoryUtil = void 0;
|
|
4
4
|
const typeorm_1 = require("typeorm");
|
|
5
5
|
const product_base_1 = require("@things-factory/product-base");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
6
7
|
const warehouse_base_1 = require("@things-factory/warehouse-base");
|
|
7
8
|
const constants_1 = require("../constants");
|
|
8
9
|
const errors_1 = require("../errors");
|
|
@@ -179,6 +180,7 @@ exports.InventoryUtil = {
|
|
|
179
180
|
let filters = params.filters;
|
|
180
181
|
const { domain } = context.state;
|
|
181
182
|
const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(bizplaces, filters, trxMgr);
|
|
183
|
+
const _groupType = filters.find(res => res.name == 'groupType');
|
|
182
184
|
let queryStrings = `
|
|
183
185
|
CREATE TEMP TABLE temp_inventory_product_group AS (
|
|
184
186
|
SELECT * FROM (
|
|
@@ -275,17 +277,35 @@ exports.InventoryUtil = {
|
|
|
275
277
|
${whereClause}
|
|
276
278
|
)
|
|
277
279
|
`;
|
|
280
|
+
let filterGroupTypeQuery;
|
|
281
|
+
if (_groupType) {
|
|
282
|
+
if (_groupType.value === 'SINGLE') {
|
|
283
|
+
filterGroupTypeQuery = `where "groupType"= 'SINGLE' `;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
filterGroupTypeQuery = `where "groupType"= 'BUNDLE' `;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
let sortingArr = params.sortings || [];
|
|
290
|
+
let sortedBy = [];
|
|
291
|
+
if (sortingArr.length > 0) {
|
|
292
|
+
sortingArr.forEach(element => {
|
|
293
|
+
if (element.desc) {
|
|
294
|
+
sortedBy.push(`"${element.name}" DESC `);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
sortedBy.push(`"${element.name}" `);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
278
301
|
await trxMgr.query(queryStrings, [domain.id]);
|
|
279
|
-
const [{ total }] = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`);
|
|
302
|
+
const [{ total }] = await trxMgr.query(`select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`);
|
|
280
303
|
let items = [];
|
|
281
304
|
if (params === null || params === void 0 ? void 0 : params.pagination) {
|
|
282
|
-
items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [
|
|
283
|
-
(params.pagination.page - 1) * params.pagination.limit,
|
|
284
|
-
params.pagination.limit
|
|
285
|
-
]);
|
|
305
|
+
items = await trxMgr.query(`select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''} OFFSET $1 LIMIT $2`, [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]);
|
|
286
306
|
}
|
|
287
307
|
else {
|
|
288
|
-
items = await trxMgr.query(`select * from temp_inventory_product_group`);
|
|
308
|
+
items = await trxMgr.query(`select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''}`);
|
|
289
309
|
}
|
|
290
310
|
await trxMgr.query(`drop table temp_inventory_product_group`);
|
|
291
311
|
return { items, total };
|
|
@@ -440,8 +460,8 @@ exports.InventoryUtil = {
|
|
|
440
460
|
});
|
|
441
461
|
},
|
|
442
462
|
async checkPalletDuplication(palletId, warehouseDomain, trxMgr) {
|
|
443
|
-
const duplicatedPalletCnt = await trxMgr.getRepository(warehouse_base_1.Inventory).
|
|
444
|
-
domain: warehouseDomain,
|
|
463
|
+
const duplicatedPalletCnt = await trxMgr.getRepository(warehouse_base_1.Inventory).countBy({
|
|
464
|
+
domain: { id: warehouseDomain.id },
|
|
445
465
|
palletId,
|
|
446
466
|
status: (0, typeorm_1.Not)((0, typeorm_1.Equal)(warehouse_base_1.INVENTORY_STATUS.TERMINATED))
|
|
447
467
|
});
|
|
@@ -449,7 +469,7 @@ exports.InventoryUtil = {
|
|
|
449
469
|
throw new Error(palletId + ` exists`);
|
|
450
470
|
const duplicatedReusablePalletCnt = await trxMgr.getRepository(warehouse_base_1.Pallet).count({
|
|
451
471
|
where: {
|
|
452
|
-
domain: warehouseDomain,
|
|
472
|
+
domain: { id: warehouseDomain.id },
|
|
453
473
|
name: palletId
|
|
454
474
|
}
|
|
455
475
|
});
|
|
@@ -467,7 +487,7 @@ exports.InventoryUtil = {
|
|
|
467
487
|
* @param trxMgr
|
|
468
488
|
* @returns orderInventories
|
|
469
489
|
*/
|
|
470
|
-
async autoAssignInventoryForRelease(product, orderInventory, packingType, locationSortingRules = [], customerBizplace, domain, trxMgr) {
|
|
490
|
+
async autoAssignInventoryForRelease(product, orderInventory, packingType, locationSortingRules = [], customerBizplace, domain, trxMgr, batchId) {
|
|
471
491
|
let qb = trxMgr.getRepository(warehouse_base_1.Inventory).createQueryBuilder('iv');
|
|
472
492
|
qb.leftJoinAndSelect('iv.location', 'loc')
|
|
473
493
|
.andWhere('"iv"."domain_id" = :domainId')
|
|
@@ -485,15 +505,49 @@ exports.InventoryUtil = {
|
|
|
485
505
|
status: warehouse_base_1.INVENTORY_STATUS.STORED,
|
|
486
506
|
locationTypes: [warehouse_base_1.LOCATION_TYPE.QUARANTINE, warehouse_base_1.LOCATION_TYPE.RESERVE]
|
|
487
507
|
});
|
|
488
|
-
if (
|
|
489
|
-
|
|
490
|
-
idx === 0
|
|
491
|
-
? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
492
|
-
: qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC');
|
|
493
|
-
});
|
|
508
|
+
if (batchId) {
|
|
509
|
+
qb.andWhere('"iv"."batch_id" = :batchId', { batchId: batchId });
|
|
494
510
|
}
|
|
495
|
-
|
|
496
|
-
|
|
511
|
+
let locationSorting = function (qb, locationSortingRules) {
|
|
512
|
+
if (locationSortingRules === null || locationSortingRules === void 0 ? void 0 : locationSortingRules.length) {
|
|
513
|
+
locationSortingRules.forEach((rule, idx) => {
|
|
514
|
+
idx === 0
|
|
515
|
+
? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')
|
|
516
|
+
: qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC');
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
qb.addOrderBy('"loc"."name"', 'ASC');
|
|
521
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC');
|
|
522
|
+
}
|
|
523
|
+
return qb;
|
|
524
|
+
};
|
|
525
|
+
switch (product === null || product === void 0 ? void 0 : product.pickingStrategy) {
|
|
526
|
+
case 'FIFO':
|
|
527
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC');
|
|
528
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
529
|
+
break;
|
|
530
|
+
case 'LIFO':
|
|
531
|
+
qb.addOrderBy('"iv"."created_at"', 'DESC');
|
|
532
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
533
|
+
break;
|
|
534
|
+
case 'FEFO':
|
|
535
|
+
qb.addOrderBy('"iv"."expiration_date"', 'ASC');
|
|
536
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC');
|
|
537
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
538
|
+
break;
|
|
539
|
+
case 'FMFO':
|
|
540
|
+
qb.addOrderBy('"iv"."manufacture_date"', 'ASC');
|
|
541
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC');
|
|
542
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
543
|
+
break;
|
|
544
|
+
case 'LOCATION':
|
|
545
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
546
|
+
break;
|
|
547
|
+
default:
|
|
548
|
+
qb.addOrderBy('"iv"."created_at"', 'ASC');
|
|
549
|
+
qb = locationSorting(qb, locationSortingRules);
|
|
550
|
+
break;
|
|
497
551
|
}
|
|
498
552
|
let inventories = await qb.getMany();
|
|
499
553
|
if (!(inventories === null || inventories === void 0 ? void 0 : inventories.length))
|
|
@@ -566,6 +620,8 @@ async function getConditions(bizplaces, filters, trxMgr, hasRemainingQty = true)
|
|
|
566
620
|
case 'productBrand':
|
|
567
621
|
whereClause += `AND LOWER("productBrand") LIKE '${value.toLowerCase()}'`;
|
|
568
622
|
break;
|
|
623
|
+
case 'productSKU':
|
|
624
|
+
whereClause += `AND LOWER("productSKU") LIKE '${value.toLowerCase()}'`;
|
|
569
625
|
case 'productName':
|
|
570
626
|
const products = await trxMgr.getRepository(product_base_1.Product).find({
|
|
571
627
|
select: ['id'],
|
|
@@ -690,8 +746,8 @@ async function updateInventory(inventory, trxMgr) {
|
|
|
690
746
|
}
|
|
691
747
|
async function generateInventoryHistory(inventory, refOrder, transactionType, qty, uomValue, user, trxMgr) {
|
|
692
748
|
var _a, _b, _c;
|
|
693
|
-
const invHistoryRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.InventoryHistory)) || (0,
|
|
694
|
-
const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0,
|
|
749
|
+
const invHistoryRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.InventoryHistory)) || (0, shell_1.getRepository)(warehouse_base_1.InventoryHistory);
|
|
750
|
+
const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, shell_1.getRepository)(warehouse_base_1.Inventory);
|
|
695
751
|
if (!(inventory === null || inventory === void 0 ? void 0 : inventory.id))
|
|
696
752
|
throw new Error(`Can't find out ID of inventory.`);
|
|
697
753
|
if (!(refOrder === null || refOrder === void 0 ? void 0 : refOrder.id) || !refOrder.name)
|
|
@@ -708,12 +764,15 @@ async function generateInventoryHistory(inventory, refOrder, transactionType, qt
|
|
|
708
764
|
}
|
|
709
765
|
const domain = inventory.domain;
|
|
710
766
|
const location = inventory.location;
|
|
711
|
-
const seq = await invHistoryRepo.
|
|
767
|
+
const seq = await invHistoryRepo.countBy({
|
|
768
|
+
domain: { id: inventory.domain.id },
|
|
769
|
+
palletId: inventory.palletId
|
|
770
|
+
});
|
|
712
771
|
let openingQty = 0;
|
|
713
772
|
let openingUomValue = 0;
|
|
714
773
|
if (seq) {
|
|
715
|
-
const lastInvHistory = await invHistoryRepo.
|
|
716
|
-
domain: inventory.domain,
|
|
774
|
+
const lastInvHistory = await invHistoryRepo.findOneBy({
|
|
775
|
+
domain: { id: inventory.domain.id },
|
|
717
776
|
palletId: inventory.palletId,
|
|
718
777
|
seq: seq - 1
|
|
719
778
|
});
|
|
@@ -767,12 +826,12 @@ async function generateInventoryHistory(inventory, refOrder, transactionType, qt
|
|
|
767
826
|
* @param trxMgr
|
|
768
827
|
*/
|
|
769
828
|
async function switchLocationStatus(domain, location, updater, trxMgr) {
|
|
770
|
-
const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0,
|
|
771
|
-
const locationRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Location)) || (0,
|
|
772
|
-
const allocatedItemsCnt = await invRepo.
|
|
773
|
-
domain,
|
|
829
|
+
const invRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Inventory)) || (0, shell_1.getRepository)(warehouse_base_1.Inventory);
|
|
830
|
+
const locationRepo = (trxMgr === null || trxMgr === void 0 ? void 0 : trxMgr.getRepository(warehouse_base_1.Location)) || (0, shell_1.getRepository)(warehouse_base_1.Location);
|
|
831
|
+
const allocatedItemsCnt = await invRepo.countBy({
|
|
832
|
+
domain: { id: domain.id },
|
|
774
833
|
status: warehouse_base_1.INVENTORY_STATUS.STORED,
|
|
775
|
-
location
|
|
834
|
+
location: { id: location.id }
|
|
776
835
|
});
|
|
777
836
|
if (!allocatedItemsCnt && location.status !== warehouse_base_1.LOCATION_STATUS.EMPTY) {
|
|
778
837
|
location = await locationRepo.save(Object.assign(Object.assign({}, location), { status: warehouse_base_1.LOCATION_STATUS.EMPTY, updater }));
|
|
@@ -796,7 +855,7 @@ function _composeTargetInventories(product, record, inventories) {
|
|
|
796
855
|
let idx = 0;
|
|
797
856
|
while (compReleaseQty < record.releaseQty) {
|
|
798
857
|
const inventory = inventories[idx];
|
|
799
|
-
const { packingType, packingSize, batchId, uom } = inventory;
|
|
858
|
+
const { packingType, packingSize, batchId, batchIdRef, uom } = inventory;
|
|
800
859
|
let orderInventory = new service_1.OrderInventory();
|
|
801
860
|
if (inventory.remainQty > leftReleaseQty) {
|
|
802
861
|
const uomValuePerQty = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100;
|
|
@@ -815,6 +874,7 @@ function _composeTargetInventories(product, record, inventories) {
|
|
|
815
874
|
packingType,
|
|
816
875
|
packingSize,
|
|
817
876
|
batchId,
|
|
877
|
+
batchIdRef,
|
|
818
878
|
uom,
|
|
819
879
|
product, type: constants_1.ORDER_TYPES.RELEASE_OF_GOODS }));
|
|
820
880
|
idx++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, getRepository, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n\n const { domain }: { domain: Domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n const { domain }: { domain: Domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(bizplaces: Bizplace[], params: ListParam, context: any, trxMgr: EntityManager) {\n try {\n let filters = params.filters\n const { domain }: { domain: Domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<Inventory> {\n let json_oi = JSON.stringify(\n orderInventories.map(x => {\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status ='STORED'\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).count({\n domain: warehouseDomain,\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: warehouseDomain,\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Partial<Inventory>,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = await updateInventory(inventory, trxMgr)\n } else {\n inventory = await createInventory(inventory, trxMgr)\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: [{ name: string; operator: string; value: any }],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n if (!inventory.id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.count({ domain: inventory.domain, palletId: inventory.palletId })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOne({\n domain: inventory.domain,\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.count({\n domain,\n status: INVENTORY_STATUS.STORED,\n location\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n uom\n }: { packingType: string; packingSize: number; batchId: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}
|
|
1
|
+
{"version":3,"file":"inventory-util.js","sourceRoot":"","sources":["../../server/utils/inventory-util.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager, Equal, In, Not, Raw, Repository, SelectQueryBuilder } from 'typeorm'\n\nimport { User } from '@things-factory/auth-base'\nimport { Bizplace } from '@things-factory/biz-base'\nimport { Product, ProductBundle } from '@things-factory/product-base'\nimport { Domain, Filter, getRepository, ListParam } from '@things-factory/shell'\nimport {\n Inventory,\n INVENTORY_STATUS,\n InventoryHistory,\n InventoryNoGenerator,\n Location,\n LOCATION_STATUS,\n LOCATION_TYPE,\n Pallet\n} from '@things-factory/warehouse-base'\n\nimport { ORDER_TYPES } from '../constants'\nimport { ValidationError } from '../errors'\nimport {\n ArrivalNotice,\n DeliveryOrder,\n InventoryCheck,\n OrderInventory,\n ReleaseGood,\n ReturnOrder,\n ReverseKittingOrder,\n VasOrder\n} from '../service'\n\nexport type ReferenceOrderType =\n | ArrivalNotice\n | ReleaseGood\n | VasOrder\n | InventoryCheck\n | DeliveryOrder\n | ReturnOrder\n | ReverseKittingOrder\n\nexport const InventoryUtil = {\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceProductInventory(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle, productDetailWhereClause } =\n await getConditions(bizplaces, filters, trxMgr, false)\n\n let productFilter = filters.find(itm => itm.name == 'productName')\n let inventoryBizplaceFilter = filters.find(itm => itm.name == 'bizplaceId')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group ON COMMIT DROP AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n pd.packing_type AS \"packingType\",\n pd.packing_size AS \"packingSize\",\n pd.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n COALESCE(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)),0) AS \"remainQty\",\n COALESCE(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)),0) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', pd.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM products p\n INNER join product_details pd on pd.product_id = p.id\n LEFT JOIN (\n SELECT i.* FROM inventories i \n INNER JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n AND i.domain_id = $1 AND i.status = 'STORED'\n ${inventoryBizplaceFilter ? `AND i.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n ) i ON i.product_id = pd.product_id\n AND i.packing_type = pd.packing_type \n and i.packing_size = pd.packing_size \n and i.uom = pd.uom \n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories, '${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE p.bizplace_id IN (${bizplaceIds})\n ${productDetailWhereClause}\n ${\n productFilter\n ? `AND (\n lower(p.sku) ilike '${productFilter.value}'\n OR lower(p.name) ilike '${productFilter.value}'\n OR lower(p.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY\n p.id,\n pd.packing_type,\n pd.packing_size,\n pd.uom\n UNION \n SELECT packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", '-' AS \"productBrand\", id AS \"productId\",\n COALESCE(MIN(FLOOR(pbs.\"availableQty\")),0) AS \"remainQty\", \n COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0) AS \"remainUomValue\", \n CONCAT(COALESCE(MIN(FLOOR(pbs.\"availableUomValue\")),0),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n LEFT JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1 AND i2.status = 'STORED'\n INNER JOIN locations l2 ON i2.location_id = l2.id \n LEFT JOIN oi ON oi.product_id = i2.product_id\n WHERE l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${inventoryBizplaceFilter ? `AND i2.bizplace_id = '${inventoryBizplaceFilter.value}'` : ``}\n GROUP BY \n pbs.product_id, \n pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n AND pb.bizplace_id IN (${bizplaceIds}) \n ${\n productFilter\n ? `AND (\n lower(pb.sku) ilike '${productFilter.value}'\n OR lower(pb.name) ilike '${productFilter.value}'\n OR lower(pb.description) ilike '${productFilter.value}'\n )\n `\n : ``\n }\n GROUP BY \n pb.packing_type, \n pb.packing_size, \n pb.name, \n pb.sku, \n pb.id\n )\n AS inv_prod_grp \n ${whereClause}\n order by \"productSKU\", \"productName\"\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group`)\n }\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Get all available product belonging to list of bizplaces\n * @param {[Object]} bizplaces\n * @param {Object} params\n * @param {Object} context\n * @param {Object} trxMgr\n * @returns { object } {items, total}\n */\n async bizplaceInventoryProductGroup(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { bizplaceIds, productWhereClause, bundleWhereClause, whereClause, batchBundle } = await getConditions(\n bizplaces,\n filters,\n trxMgr\n )\n\n const _groupType = filters.find(res => res.name == 'groupType')\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n round(cast(SUM(oi.release_qty) as numeric), 3) AS release_qty,\n round(cast(SUM(oi.release_uom_value) as numeric), 3) AS release_uom_value,\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.batch_id NOTNULL\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.batch_id,\n oi.batch_id_ref,\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.batch_id AS \"batchId\",\n i.batch_id_ref AS \"batchIdRef\",\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n ROUND(cast(SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) - MAX(COALESCE(bp.bundle_product_release_qty, 0)) as numeric), 3) AS \"remainQty\",\n ROUND(cast(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)) as numeric), 3) AS \"remainUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) - MAX(COALESCE(bp.bundle_product_release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\",\n 'SINGLE' AS \"groupType\"\n FROM\n inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON i.batch_id = oi.batch_id AND p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n LEFT JOIN (\n SELECT pbs.product_id, SUM(pbs.bundle_qty * src.release_qty) AS bundle_product_release_qty, SUM(pbs.bundle_qty * src.release_uom_value) AS bundle_product_release_uom_value \n FROM product_bundle_settings pbs\n INNER JOIN json_populate_recordset(NULL::order_inventories,'${batchBundle}') src ON src.product_id = pbs.product_bundle_id\n GROUP BY pbs.product_id\n ) bp on i.product_id = bp.product_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${productWhereClause}\n GROUP BY\n i.batch_id,\n i.batch_id_ref,\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n UNION \n SELECT 'BUNDLE' AS \"batchId\", null as \"batchIdRef\", packing_type, packing_size,'UNIT' AS \"uom\", name AS \"productName\", sku AS \"productSKU\", 'brand' AS \"productBrand\", id AS \"productId\",\n MIN(FLOOR(pbs.\"availableQty\")) AS \"remainQty\", \n MIN(FLOOR(pbs.\"availableUomValue\")) AS \"remainUomValue\", \n CONCAT(MIN(FLOOR(pbs.\"availableUomValue\")),' UNIT') AS \"remainUomValueWithUom\", \n 'BUNDLE' AS \"groupType\"\n FROM product_bundles pb\n INNER JOIN (\n SELECT pbs.product_id, pbs.product_bundle_id, min(pbs.bundle_qty),\n (SUM(COALESCE(i2.qty, 0)) - SUM(COALESCE(i2.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0))) / min(pbs.bundle_qty) AS \"availableQty\",\n (SUM(COALESCE(i2.uom_value, 0)) - SUM(COALESCE(i2.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0))) / min(pbs.bundle_qty) AS \"availableUomValue\"\n FROM product_bundle_settings pbs \n LEFT JOIN inventories i2 ON i2.product_id = pbs.product_id AND i2.domain_id = $1\n AND i2.bizplace_id IN (${bizplaceIds})\n AND i2.status = 'STORED'\n LEFT JOIN oi ON oi.product_id = i2.product_id\n GROUP BY pbs.product_id, pbs.product_bundle_id\n ) pbs ON pbs.product_bundle_id = pb.id\n ${bundleWhereClause}\n GROUP BY pb.packing_type, pb.packing_size, pb.name, pb.sku, pb.id\n )\n AS inv_prod_grp\n ${whereClause}\n )\n `\n\n let filterGroupTypeQuery\n\n if (_groupType) {\n if (_groupType.value === 'SINGLE') {\n filterGroupTypeQuery = `where \"groupType\"= 'SINGLE' `\n } else {\n filterGroupTypeQuery = `where \"groupType\"= 'BUNDLE' `\n }\n }\n\n let sortingArr = params.sortings || []\n\n let sortedBy = []\n\n if (sortingArr.length > 0) {\n sortingArr.forEach(element => {\n if (element.desc) {\n sortedBy.push(`\"${element.name}\" DESC `)\n } else {\n sortedBy.push(`\"${element.name}\" `)\n }\n })\n }\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(\n `select count(*) as total from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''}`\n )\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n } OFFSET $1 LIMIT $2`,\n [(params.pagination.page - 1) * params.pagination.limit, params.pagination.limit]\n )\n } else {\n items = await trxMgr.query(\n `select * from temp_inventory_product_group ${filterGroupTypeQuery ? filterGroupTypeQuery : ''} ${\n sortingArr.length > 0 ? ' Order by ' + sortedBy.toString() : ''\n }`\n )\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n async inventoryProductGroupOpenAPI(\n bizplaces: Bizplace[],\n params: ListParam,\n context: ResolverContext,\n trxMgr: EntityManager\n ) {\n try {\n let filters = params.filters\n const { domain } = context.state\n\n const { apiWhereClause } = await getConditions(bizplaces, filters, trxMgr)\n\n let queryStrings = `\n CREATE TEMP TABLE temp_inventory_product_group_open_api AS (\n SELECT * FROM (\n WITH oi as (\n SELECT\n SUM(oi.release_qty) AS release_qty,\n SUM(oi.release_uom_value) AS release_uom_value,\n oi.product_id,\n p.name AS product_name,\n oi.packing_type,\n oi.packing_size,\n oi.uom\n FROM\n order_inventories oi\n LEFT JOIN\n products p\n ON\n oi.product_id = p.id\n WHERE\n (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n AND oi.product_id NOTNULL\n AND oi.packing_type NOTNULL\n AND oi.packing_size NOTNULL\n AND oi.inventory_id IS NULL\n GROUP BY\n oi.product_id,\n oi.packing_type,\n oi.packing_size,\n oi.uom,\n p.name\n )\n SELECT\n i.packing_type AS \"packingType\",\n i.packing_size AS \"packingSize\",\n i.uom AS \"uom\",\n concat(p.name, ' (', p.description, ')') AS \"productName\",\n coalesce(p.sku, '') AS \"productSKU\",\n coalesce(p.brand, '') AS \"productBrand\",\n p.id AS \"productId\",\n SUM(COALESCE(i.qty, 0)) - SUM(COALESCE(i.locked_qty, 0)) - MAX(COALESCE(oi.release_qty, 0)) AS \"remainQty\",\n SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)) AS \"remainUomValue\",\n SUM(COALESCE(i.qty, 0)) AS \"totalQty\",\n SUM(COALESCE(i.uom_value, 0)) AS \"totalUomValue\",\n SUM(COALESCE(i.locked_qty, 0)) + MAX(COALESCE(oi.release_qty, 0)) AS \"totalLockedQty\",\n SUM(COALESCE(i.locked_uom_value, 0)) + MAX(COALESCE(oi.release_uom_value, 0)) AS \"totalLockedUomValue\",\n concat(SUM(COALESCE(i.uom_value, 0)) - SUM(COALESCE(i.locked_uom_value, 0)) - MAX(COALESCE(oi.release_uom_value, 0)), ' ', i.uom) AS \"remainUomValueWithUom\"\n FROM inventories i\n LEFT JOIN products p ON i.product_id = p.id\n LEFT JOIN oi ON p.name = oi.product_name AND i.packing_type = oi.packing_type AND i.packing_size = oi.packing_size AND i.uom = oi.uom\n LEFT JOIN locations l2 ON i.location_id = l2.id AND i.domain_id = l2.domain_id\n WHERE i.domain_id = $1\n AND l2.type NOT IN ('${LOCATION_TYPE.QUARANTINE}', '${LOCATION_TYPE.RESERVE}')\n ${apiWhereClause}\n GROUP BY\n p.id,\n i.packing_type,\n i.packing_size,\n i.uom\n )\n AS inv_prod_grp\n )\n `\n\n await trxMgr.query(queryStrings, [domain.id])\n\n const [{ total }]: any = await trxMgr.query(`select count(*) as total from temp_inventory_product_group_open_api`)\n let items: any[] = []\n\n if (params?.pagination) {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api OFFSET $1 LIMIT $2`, [\n (params.pagination.page - 1) * params.pagination.limit,\n params.pagination.limit\n ])\n } else {\n items = await trxMgr.query(`select * from temp_inventory_product_group_open_api`)\n }\n\n await trxMgr.query(`drop table temp_inventory_product_group_open_api`)\n\n return { items, total }\n } catch (error) {\n throw error\n }\n },\n\n /**\n * Validate warehouse partners product quantity\n * @param {Object} warehouseDomain -\n * @param {Object} partnerBizplace - {id}\n * @param {Object} orderInventories - [{id, qty}]\n * @param {Object} context\n * @param {Object} trxMgr\n */\n async validateWarehousePartnersProductsQuantity(\n warehouseDomain: Domain,\n partnerBizplace: Bizplace,\n orderInventories: OrderInventory[],\n context: any,\n trxMgr?: EntityManager\n ): Promise<Inventory> {\n let json_oi = JSON.stringify(\n orderInventories.map(x => {\n return {\n product_id: x.product.id,\n batch_id: x.batchId,\n packing_type: x.packingType,\n release_qty: x.releaseQty,\n uom: x.uom\n }\n })\n )\n\n let resultQb = await trxMgr.query(\n `\n select joi.product_id as \"productId\", joi.batch_id as \"batchId\", joi.packing_type as \"packingType\", joi.uom as \"uom\", joi.release_qty as \"releaseQty\",\n ROUND(cast(sum(i.qty - coalesce(i.locked_qty,0)) - coalesce(\n (\n select sum(oi.release_qty) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableQty\",\n ROUND(cast(sum(i.uom_value - coalesce(i.locked_uom_value ,0)) - coalesce(\n (\n select sum(oi.release_uom_value) from order_inventories oi \n where (oi.status = 'PENDING' or oi.status = 'PENDING_RECEIVE' or oi.status = 'PENDING_WORKSHEET' or oi.status = 'PENDING_SPLIT')\n and oi.inventory_id IS null\n and oi.product_id = joi.product_id\n and oi.batch_id = joi.batch_id\n and oi.packing_type = joi.packing_type\n and oi.uom = joi.uom\n and oi.domain_id = $1\n and oi.bizplace_id = $2\n ),0) as numeric), 3) as \"availableUomValue\"\n from json_populate_recordset(NULL::order_inventories,'${json_oi}') joi\n left join inventories i on joi.product_id = i.product_id \n and joi.batch_id = i.batch_id\n and joi.packing_type = i.packing_type and i.status ='STORED'\n and joi.uom = i.uom\n and i.domain_id = $1\n and i.bizplace_id = $2\n group by joi.product_id, joi.batch_id, joi.packing_type, joi.release_qty, joi.uom\n `,\n [warehouseDomain.id, partnerBizplace.id]\n )\n\n resultQb.forEach(itm => {\n if (itm.releaseQty > itm.availableQty) {\n throw new ValidationError({\n ...ValidationError.ERROR_CODES.RELEASE_QTY_OVER_LIMIT,\n detail: { data: JSON.stringify(resultQb) }\n })\n }\n })\n },\n\n async checkPalletDuplication(palletId: string, warehouseDomain: Domain, trxMgr: EntityManager): Promise<void> {\n const duplicatedPalletCnt: number = await trxMgr.getRepository(Inventory).countBy({\n domain: { id: warehouseDomain.id },\n palletId,\n status: Not(Equal(INVENTORY_STATUS.TERMINATED))\n })\n\n if (duplicatedPalletCnt) throw new Error(palletId + ` exists`)\n\n const duplicatedReusablePalletCnt: number = await trxMgr.getRepository(Pallet).count({\n where: {\n domain: { id: warehouseDomain.id },\n name: palletId\n }\n })\n\n if (duplicatedReusablePalletCnt) throw new Error(palletId + ` exists`)\n },\n\n /**\n * To pre-assign inventories automatically for orderInventories in Release Goods\n * @param product\n * @param orderInventory\n * @param packingType\n * @param locationSortingRules\n * @param customerBizplace\n * @param domain\n * @param trxMgr\n * @returns orderInventories\n */\n async autoAssignInventoryForRelease(\n product: Product,\n orderInventory: OrderInventory,\n packingType: string,\n locationSortingRules: any = [],\n customerBizplace: Bizplace,\n domain: Domain,\n trxMgr: EntityManager,\n batchId?: string\n ): Promise<OrderInventory[]> {\n let qb: SelectQueryBuilder<Inventory> = trxMgr.getRepository(Inventory).createQueryBuilder('iv')\n qb.leftJoinAndSelect('iv.location', 'loc')\n .andWhere('\"iv\".\"domain_id\" = :domainId')\n .andWhere('\"iv\".\"bizplace_id\" = :bizplaceId')\n .andWhere('\"iv\".\"packing_type\" = :packingType')\n .andWhere('\"iv\".\"product_id\" = :productId')\n .andWhere('\"iv\".\"status\" = :status')\n .andWhere('\"iv\".\"qty\" - COALESCE(\"iv\".\"locked_qty\", 0) > 0')\n .andWhere('\"loc\".\"type\" NOT IN (:...locationTypes)')\n .setParameters({\n domainId: domain.id,\n bizplaceId: customerBizplace.id,\n packingType: packingType,\n productId: product.id,\n status: INVENTORY_STATUS.STORED,\n locationTypes: [LOCATION_TYPE.QUARANTINE, LOCATION_TYPE.RESERVE]\n })\n\n if (batchId) {\n qb.andWhere('\"iv\".\"batch_id\" = :batchId', { batchId: batchId })\n }\n\n let locationSorting = function (qb: SelectQueryBuilder<Inventory>, locationSortingRules) {\n if (locationSortingRules?.length) {\n locationSortingRules.forEach((rule: { name: string; desc: boolean }, idx: number) => {\n idx === 0\n ? qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n : qb.addOrderBy(`loc.${rule.name}`, rule.desc ? 'DESC' : 'ASC')\n })\n } else {\n qb.addOrderBy('\"loc\".\"name\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n }\n return qb\n }\n\n switch (product?.pickingStrategy) {\n case 'FIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LIFO':\n qb.addOrderBy('\"iv\".\"created_at\"', 'DESC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FEFO':\n qb.addOrderBy('\"iv\".\"expiration_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'FMFO':\n qb.addOrderBy('\"iv\".\"manufacture_date\"', 'ASC')\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n case 'LOCATION':\n qb = locationSorting(qb, locationSortingRules)\n break\n default:\n qb.addOrderBy('\"iv\".\"created_at\"', 'ASC')\n qb = locationSorting(qb, locationSortingRules)\n break\n }\n\n let inventories: Inventory[] = await qb.getMany()\n if (!inventories?.length) throw new Error(`no inventories found for ${product.sku}`)\n\n inventories = inventories.map(inventory => {\n return {\n ...inventory,\n remainQty: inventory.qty - (inventory?.lockedQty || 0),\n remainUomValue: inventory.uomValue - (inventory?.lockedUomValue || 0)\n }\n })\n\n return _composeTargetInventories(product, orderInventory, inventories)\n },\n\n /**\n * @summary Do transaction on inventory record\n * @description It will update inventory after set a temp (domain, updater)\n * and then generate inventory history based on current changes\n */\n async transactionInventory(\n inventory: Partial<Inventory>,\n referenceOrder: ReferenceOrderType,\n changedQty: number,\n changedWeight: number,\n transactionType: string,\n user: User,\n trxMgr: EntityManager\n ): Promise<Inventory> {\n if (inventory.id) {\n inventory = await updateInventory(inventory, trxMgr)\n } else {\n inventory = await createInventory(inventory, trxMgr)\n }\n\n await generateInventoryHistory(inventory, referenceOrder, transactionType, changedQty, changedWeight, user, trxMgr)\n\n return inventory\n }\n}\n\ninterface Conditions {\n bizplaceIds: string\n productWhereClause: string\n bundleWhereClause: string\n whereClause: string\n batchBundle: string\n apiWhereClause: string\n productDetailWhereClause: string\n}\n\nasync function getConditions(\n bizplaces: Bizplace[],\n filters: Filter[],\n trxMgr: EntityManager,\n hasRemainingQty: Boolean = true\n): Promise<Conditions> {\n let bizplaceIds = bizplaces.map((bizplace: Bizplace) => `'${bizplace.id}'`).join()\n\n let productWhereClause = `\n AND i.status = 'STORED'\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let apiWhereClause = `\n AND i.bizplace_id IN (${bizplaceIds})\n `\n let bundleWhereClause = `\n WHERE pb.status = 'ACTIVATED'\n `\n\n let whereClause = hasRemainingQty ? ` WHERE \"remainQty\" > 0` : ` WHERE 1 = 1`\n\n let productDetailWhereClause = ``\n\n let batchBundle: string\n if (filters?.length) {\n await Promise.all(\n filters.map(async (filter: { name: string; operator: string; value: any }) => {\n const name = filter.name\n const operator = filter.operator.toLowerCase()\n let value = filter.value\n\n switch (name) {\n case 'productId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'productBundleId':\n if (operator == 'in')\n whereClause += `AND \"productId\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(itm => {\n return `'${itm}'`\n })\n .join(',')})`\n break\n\n case 'batchId':\n whereClause += `AND LOWER(\"batchId\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'batchIdRef':\n whereClause += `AND LOWER(\"batchIdRef\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productBrand':\n whereClause += `AND LOWER(\"productBrand\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'productSKU':\n whereClause += `AND LOWER(\"productSKU\") LIKE '${value.toLowerCase()}'`\n\n case 'productName':\n const products: Product[] = await trxMgr.getRepository(Product).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productIds: string = products\n .map((product: Product) => product.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productIds.length) {\n productWhereClause += `AND i.product_id IN (${productIds})`\n } else {\n productWhereClause += `AND i.product_id ISNULL`\n }\n\n // filter product bundle as product info\n const productBundles: ProductBundle[] = await trxMgr.getRepository(ProductBundle).find({\n select: ['id'],\n where: [\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n name: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n sku: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n },\n {\n bizplace: In(bizplaces.map((bizplace: Bizplace) => bizplace.id)),\n description: Raw(\n (alias: string) => `LOWER(${alias}) LIKE '${value.toLowerCase().trim().replace(/'/g, \"''\")}'`\n )\n }\n ]\n })\n\n const productBundleIds: string = productBundles\n .map((bundle: ProductBundle) => bundle.id)\n .map((id: string) => `'${id}'`)\n .join()\n\n if (productBundleIds.length) {\n bundleWhereClause += `AND pb.id IN (${productBundleIds})`\n } else {\n bundleWhereClause += `AND pb.id ISNULL`\n }\n break\n\n case 'packingType':\n whereClause += `AND LOWER(\"packingType\") LIKE '${value.toLowerCase()}'`\n break\n\n case 'showBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'bundle'`\n break\n\n case 'hideBundle':\n whereClause += `AND LOWER(\"groupType\") LIKE 'single'`\n break\n\n case 'batch_product':\n productWhereClause += `\n AND (i.batch_id, p.id, i.packing_type, i.packing_size) ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map(\n (v: { batchId: string; productId: string; packingType: string; packingSize: string }) =>\n `('${v.batchId}', '${v.productId}', '${v.packingType}', '${v.packingSize}')`\n )\n .join()})\n `\n break\n\n case 'batch_bundle':\n bundleWhereClause += `\n ${bundleWhereClause == '' ? 'WHERE' : 'AND'} pb.id ${operator === 'in' ? 'IN' : 'NOT IN'} (${value\n .map((v: { productId: string }) => `('${v.productId}')`)\n .join()})\n `\n break\n\n case 'product':\n productDetailWhereClause += `\n AND (pd.product_id, pd.packing_type, pd.packing_size, pd.uom) ${\n operator === 'in' ? 'IN' : 'NOT IN'\n } (${value\n .map(\n (v: { productId: string; packingType: string; packingSize: string; uom: string }) =>\n `('${v.productId}', '${v.packingType}', '${v.packingSize}', '${v.uom}')`\n )\n .join()})\n `\n break\n }\n })\n )\n\n batchBundle = JSON.stringify(\n filters\n .find(filter => filter.name === 'batch_bundle')\n ?.value.map(itm => {\n return {\n product_id: itm.productId,\n release_qty: itm?.releaseQty || 0,\n release_uom_value: itm?.releaseUomValue || 0\n }\n }) || []\n )\n }\n\n return {\n bizplaceIds,\n productWhereClause,\n apiWhereClause,\n bundleWhereClause,\n whereClause,\n batchBundle,\n productDetailWhereClause\n }\n}\n\nasync function createInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\n/**\n * @summary Update inventory record\n * @description It will update inventory after set a stamp (domain, updater)\n * The special point of this function is that this changes won't generate inventory history\n * If you want to generate inventory history automatically you would better to use transactionInventory function\n */\nasync function updateInventory(\n inventory: Partial<Inventory> | Partial<Inventory>[],\n trxMgr: EntityManager\n): Promise<Inventory | Inventory[]> {\n if (!inventory.id) throw new Error(`Target doesn't have ID`)\n return await trxMgr.getRepository(Inventory).save(inventory)\n}\n\nasync function generateInventoryHistory(\n inventory: Inventory,\n refOrder: any,\n transactionType: string,\n qty: number,\n uomValue: number,\n user: User,\n trxMgr?: EntityManager\n): Promise<InventoryHistory> {\n const invHistoryRepo: Repository<InventoryHistory> =\n trxMgr?.getRepository(InventoryHistory) || getRepository(InventoryHistory)\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n\n if (!inventory?.id) throw new Error(`Can't find out ID of inventory.`)\n if (!refOrder?.id || !refOrder.name) throw new Error(`Can't find out ID or Name of Reference Order`)\n if (\n !inventory?.domain ||\n !inventory?.bizplace ||\n !inventory?.product?.id ||\n !inventory?.warehouse?.id ||\n !inventory?.location?.id\n ) {\n inventory = await invRepo.findOne({\n where: { id: inventory.id },\n relations: ['domain', 'bizplace', 'product', 'warehouse', 'location']\n })\n }\n\n const domain: Domain = inventory.domain\n const location: Location = inventory.location\n\n const seq: number = await invHistoryRepo.countBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId\n })\n let openingQty: number = 0\n let openingUomValue: number = 0\n\n if (seq) {\n const lastInvHistory: InventoryHistory = await invHistoryRepo.findOneBy({\n domain: { id: inventory.domain.id },\n palletId: inventory.palletId,\n seq: seq - 1\n })\n openingQty = lastInvHistory.openingQty + lastInvHistory.qty\n openingUomValue = lastInvHistory.openingUomValue + lastInvHistory.uomValue\n }\n\n let inventoryHistory: InventoryHistory = new InventoryHistory()\n inventoryHistory.name = InventoryNoGenerator.inventoryHistoryName()\n inventoryHistory.description = inventory.description\n inventoryHistory.seq = seq\n inventoryHistory.palletId = inventory.palletId\n inventoryHistory.cartonId = inventory.cartonId\n inventoryHistory.batchId = inventory.batchId\n inventoryHistory.batchIdRef = inventory.batchIdRef\n inventoryHistory.status = inventory.status\n inventoryHistory.transactionType = transactionType\n inventoryHistory.refOrderId = refOrder?.id || null\n inventoryHistory.orderNo = refOrder?.name || null\n inventoryHistory.orderRefNo = refOrder?.refNo || null\n inventoryHistory.inventory = inventory\n inventoryHistory.product = inventory.product\n inventoryHistory.reusablePallet = inventory.reusablePallet\n inventoryHistory.zone = inventory.zone\n inventoryHistory.warehouse = inventory.warehouse\n inventoryHistory.location = inventory.location\n inventoryHistory.expirationDate = inventory.expirationDate\n inventoryHistory.packingType = inventory.packingType\n inventoryHistory.packingSize = inventory.packingSize\n inventoryHistory.uom = inventory.uom\n inventoryHistory.qty = qty\n inventoryHistory.openingQty = openingQty\n inventoryHistory.uomValue = uomValue\n inventoryHistory.openingUomValue = openingUomValue\n inventoryHistory.unitCost = inventory.unitCost\n inventoryHistory.domain = inventory.domain\n inventoryHistory.bizplace = inventory.bizplace\n inventoryHistory.creator = user\n inventoryHistory.updater = user\n\n inventoryHistory = await invHistoryRepo.save(inventoryHistory)\n\n if (inventory.lastSeq !== seq) {\n await invRepo.save({\n ...inventory,\n lastSeq: inventoryHistory.seq,\n updater: user\n })\n }\n\n await switchLocationStatus(domain, location, user, trxMgr)\n return inventoryHistory\n}\n\n/**\n * @description: Check location emptiness and update status of location\n * @param domain\n * @param location\n * @param updater\n * @param trxMgr\n */\nexport async function switchLocationStatus(\n domain: Domain,\n location: Location,\n updater: User,\n trxMgr?: EntityManager\n): Promise<Location> {\n const invRepo: Repository<Inventory> = trxMgr?.getRepository(Inventory) || getRepository(Inventory)\n const locationRepo: Repository<Location> = trxMgr?.getRepository(Location) || getRepository(Location)\n const allocatedItemsCnt: number = await invRepo.countBy({\n domain: { id: domain.id },\n status: INVENTORY_STATUS.STORED,\n location: { id: location.id }\n })\n\n if (!allocatedItemsCnt && location.status !== LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.EMPTY,\n updater\n })\n } else if (allocatedItemsCnt && location.status === LOCATION_STATUS.EMPTY) {\n location = await locationRepo.save({\n ...location,\n status: LOCATION_STATUS.OCCUPIED,\n updater\n })\n }\n\n return location\n}\n\nexport function _composeTargetInventories(product: Product, record: any, inventories: Inventory[]): OrderInventory[] {\n let leftReleaseQty: number = record.releaseQty\n let leftReleaseUomValue: number = record.releaseUomValue\n let compReleaseQty: number = 0\n let compReleaseUomValue: number = 0\n let totalInventoryQty: number = inventories.reduce((total, inventory) => total + inventory.remainQty, 0)\n\n if (totalInventoryQty < record.releaseQty) {\n throw new Error(`invalid release qty for ${product?.sku}`)\n }\n\n let orderInventories: Partial<OrderInventory[]> = []\n let idx = 0\n while (compReleaseQty < record.releaseQty) {\n const inventory = inventories[idx]\n const {\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom\n }: { packingType: string; packingSize: number; batchId: string; batchIdRef: string; uom: string } = inventory\n\n let orderInventory: OrderInventory = new OrderInventory()\n\n if (inventory.remainQty > leftReleaseQty) {\n const uomValuePerQty: number = Math.round((inventory.remainUomValue / inventory.remainQty) * 100) / 100\n\n compReleaseQty += leftReleaseQty\n compReleaseUomValue += leftReleaseUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: leftReleaseQty,\n releaseUomValue: Math.round(leftReleaseQty * uomValuePerQty * 100) / 100\n }\n } else {\n compReleaseQty += inventory.remainQty\n compReleaseUomValue += inventory.remainUomValue\n leftReleaseQty -= inventory.remainQty\n leftReleaseUomValue -= inventory.remainUomValue\n\n orderInventory = {\n ...orderInventory,\n releaseQty: inventory.remainQty,\n releaseUomValue: inventory.remainUomValue\n }\n }\n\n orderInventories.push({\n ...orderInventory,\n inventory,\n packingType,\n packingSize,\n batchId,\n batchIdRef,\n uom,\n product,\n type: ORDER_TYPES.RELEASE_OF_GOODS\n })\n\n idx++\n }\n\n return orderInventories\n}\n"]}
|