@open-mercato/core 0.6.7-develop.6669.1.40b669666b → 0.6.7-develop.6670.1.4efa7961c6
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/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/inventory_balance/index.js +21 -0
- package/dist/generated/entities/inventory_balance/index.js.map +7 -0
- package/dist/generated/entities/inventory_lot/index.js +19 -0
- package/dist/generated/entities/inventory_lot/index.js.map +7 -0
- package/dist/generated/entities/inventory_movement/index.js +35 -0
- package/dist/generated/entities/inventory_movement/index.js.map +7 -0
- package/dist/generated/entities/inventory_reservation/index.js +23 -0
- package/dist/generated/entities/inventory_reservation/index.js.map +7 -0
- package/dist/generated/entities/product_inventory_profile/index.js +21 -0
- package/dist/generated/entities/product_inventory_profile/index.js.map +7 -0
- package/dist/generated/entities/sales_order_warehouse_assignment/index.js +11 -0
- package/dist/generated/entities/sales_order_warehouse_assignment/index.js.map +7 -0
- package/dist/generated/entities/warehouse/index.js +25 -0
- package/dist/generated/entities/warehouse/index.js.map +7 -0
- package/dist/generated/entities/warehouse_location/index.js +21 -0
- package/dist/generated/entities/warehouse_location/index.js.map +7 -0
- package/dist/generated/entities/warehouse_zone/index.js +11 -0
- package/dist/generated/entities/warehouse_zone/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +12 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +98 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +12 -4
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/lib/backendChrome.js +1 -0
- package/dist/modules/auth/lib/backendChrome.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +16 -17
- package/dist/modules/auth/services/rbacService.js.map +2 -2
- package/dist/modules/catalog/api/products/route.js +3 -0
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/catalog/api/variants/route.js +3 -0
- package/dist/modules/catalog/api/variants/route.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +6 -6
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/sales/api/documents/factory.js +1 -0
- package/dist/modules/sales/api/documents/factory.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +53 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -2
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/events.js +2 -0
- package/dist/modules/sales/events.js.map +2 -2
- package/dist/modules/sales/widgets/injection/order-items-context.js +11 -0
- package/dist/modules/sales/widgets/injection/order-items-context.js.map +7 -0
- package/dist/modules/wms/acl.js +18 -0
- package/dist/modules/wms/acl.js.map +7 -0
- package/dist/modules/wms/analytics.js +11 -0
- package/dist/modules/wms/analytics.js.map +7 -0
- package/dist/modules/wms/api/dashboard/operational/route.js +80 -0
- package/dist/modules/wms/api/dashboard/operational/route.js.map +7 -0
- package/dist/modules/wms/api/interceptors.js +90 -0
- package/dist/modules/wms/api/interceptors.js.map +7 -0
- package/dist/modules/wms/api/inventory/adjust/route.js +51 -0
- package/dist/modules/wms/api/inventory/adjust/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/allocate/route.js +51 -0
- package/dist/modules/wms/api/inventory/allocate/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/balances/route.js +172 -0
- package/dist/modules/wms/api/inventory/balances/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/cycle-count/route.js +52 -0
- package/dist/modules/wms/api/inventory/cycle-count/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/helpers.js +113 -0
- package/dist/modules/wms/api/inventory/helpers.js.map +7 -0
- package/dist/modules/wms/api/inventory/import/apply/route.js +46 -0
- package/dist/modules/wms/api/inventory/import/apply/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/import/helpers.js +195 -0
- package/dist/modules/wms/api/inventory/import/helpers.js.map +7 -0
- package/dist/modules/wms/api/inventory/import/template/route.js +32 -0
- package/dist/modules/wms/api/inventory/import/template/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/import/validate/route.js +54 -0
- package/dist/modules/wms/api/inventory/import/validate/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/move/route.js +51 -0
- package/dist/modules/wms/api/inventory/move/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/movements/route.js +164 -0
- package/dist/modules/wms/api/inventory/movements/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/receive/route.js +50 -0
- package/dist/modules/wms/api/inventory/receive/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/release/route.js +44 -0
- package/dist/modules/wms/api/inventory/release/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/reservations/route.js +128 -0
- package/dist/modules/wms/api/inventory/reservations/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/reserve/route.js +59 -0
- package/dist/modules/wms/api/inventory/reserve/route.js.map +7 -0
- package/dist/modules/wms/api/inventory-profiles/route.js +178 -0
- package/dist/modules/wms/api/inventory-profiles/route.js.map +7 -0
- package/dist/modules/wms/api/listEnrichers.js +181 -0
- package/dist/modules/wms/api/listEnrichers.js.map +7 -0
- package/dist/modules/wms/api/listSearch.js +77 -0
- package/dist/modules/wms/api/listSearch.js.map +7 -0
- package/dist/modules/wms/api/locations/route.js +172 -0
- package/dist/modules/wms/api/locations/route.js.map +7 -0
- package/dist/modules/wms/api/lots/route.js +204 -0
- package/dist/modules/wms/api/lots/route.js.map +7 -0
- package/dist/modules/wms/api/openapi.js +27 -0
- package/dist/modules/wms/api/openapi.js.map +7 -0
- package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js +54 -0
- package/dist/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.js.map +7 -0
- package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js +279 -0
- package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js.map +7 -0
- package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js +56 -0
- package/dist/modules/wms/api/sales-orders/assign-warehouse/route.js.map +7 -0
- package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js +43 -0
- package/dist/modules/wms/api/sales-orders/unassign-warehouse/route.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +181 -0
- package/dist/modules/wms/api/warehouses/route.js.map +7 -0
- package/dist/modules/wms/api/zones/route.js +159 -0
- package/dist/modules/wms/api/zones/route.js.map +7 -0
- package/dist/modules/wms/backend/config/wms/page.js +9 -0
- package/dist/modules/wms/backend/config/wms/page.js.map +7 -0
- package/dist/modules/wms/backend/config/wms/page.meta.js +18 -0
- package/dist/modules/wms/backend/config/wms/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/page.js +9 -0
- package/dist/modules/wms/backend/page.js.map +7 -0
- package/dist/modules/wms/backend/page.meta.js +16 -0
- package/dist/modules/wms/backend/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/inventory/page.js +9 -0
- package/dist/modules/wms/backend/wms/inventory/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/inventory/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/inventory/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/location/[id]/page.js +9 -0
- package/dist/modules/wms/backend/wms/location/[id]/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/location/[id]/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/location/[id]/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/locations/page.js +10 -0
- package/dist/modules/wms/backend/wms/locations/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/locations/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/locations/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/lot/[id]/page.js +9 -0
- package/dist/modules/wms/backend/wms/lot/[id]/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/lot/[id]/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/lots/page.js +9 -0
- package/dist/modules/wms/backend/wms/lots/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/lots/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/lots/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/movements/page.js +22 -0
- package/dist/modules/wms/backend/wms/movements/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/movements/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/movements/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/reservations/page.js +23 -0
- package/dist/modules/wms/backend/wms/reservations/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/reservations/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/reservations/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/sku/[id]/page.js +9 -0
- package/dist/modules/wms/backend/wms/sku/[id]/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/sku/[id]/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/warehouses/page.js +10 -0
- package/dist/modules/wms/backend/wms/warehouses/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/warehouses/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/warehouses/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/zones/page.js +10 -0
- package/dist/modules/wms/backend/wms/zones/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/zones/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/zones/page.meta.js.map +7 -0
- package/dist/modules/wms/ce.js +80 -0
- package/dist/modules/wms/ce.js.map +7 -0
- package/dist/modules/wms/cli.js +83 -0
- package/dist/modules/wms/cli.js.map +7 -0
- package/dist/modules/wms/commands/configuration.js +1519 -0
- package/dist/modules/wms/commands/configuration.js.map +7 -0
- package/dist/modules/wms/commands/index.js +4 -0
- package/dist/modules/wms/commands/index.js.map +7 -0
- package/dist/modules/wms/commands/inventory-actions.js +1539 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +7 -0
- package/dist/modules/wms/commands/sales-order-assignment.js +277 -0
- package/dist/modules/wms/commands/sales-order-assignment.js.map +7 -0
- package/dist/modules/wms/commands/shared.js +82 -0
- package/dist/modules/wms/commands/shared.js.map +7 -0
- package/dist/modules/wms/components/backend/AdjustInventoryDialog.js +755 -0
- package/dist/modules/wms/components/backend/AdjustInventoryDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js +269 -0
- package/dist/modules/wms/components/backend/ChangeLotStatusDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/CycleCountWizardDialog.js +1783 -0
- package/dist/modules/wms/components/backend/CycleCountWizardDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ImportInventoryDialog.js +766 -0
- package/dist/modules/wms/components/backend/ImportInventoryDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/InventoryOperationsSection.js +119 -0
- package/dist/modules/wms/components/backend/InventoryOperationsSection.js.map +7 -0
- package/dist/modules/wms/components/backend/LocationEditDialog.js +140 -0
- package/dist/modules/wms/components/backend/LocationEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/MoveInventoryDialog.js +791 -0
- package/dist/modules/wms/components/backend/MoveInventoryDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js +656 -0
- package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +344 -0
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ReserveInventoryDialog.js +475 -0
- package/dist/modules/wms/components/backend/ReserveInventoryDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +1112 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +908 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +1015 -0
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +1049 -0
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +297 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +757 -0
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +975 -0
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +7 -0
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +710 -0
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +7 -0
- package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js +79 -0
- package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js.map +7 -0
- package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js +24 -0
- package/dist/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.js.map +7 -0
- package/dist/modules/wms/components/backend/wmsLookupLoaders.js +55 -0
- package/dist/modules/wms/components/backend/wmsLookupLoaders.js.map +7 -0
- package/dist/modules/wms/data/enrichers.js +501 -0
- package/dist/modules/wms/data/enrichers.js.map +7 -0
- package/dist/modules/wms/data/entities.js +467 -0
- package/dist/modules/wms/data/entities.js.map +7 -0
- package/dist/modules/wms/data/validators.js +399 -0
- package/dist/modules/wms/data/validators.js.map +7 -0
- package/dist/modules/wms/di.js +27 -0
- package/dist/modules/wms/di.js.map +7 -0
- package/dist/modules/wms/events.js +42 -0
- package/dist/modules/wms/events.js.map +7 -0
- package/dist/modules/wms/index.js +17 -0
- package/dist/modules/wms/index.js.map +7 -0
- package/dist/modules/wms/lib/catalogInventoryProfileIntent.js +54 -0
- package/dist/modules/wms/lib/catalogInventoryProfileIntent.js.map +7 -0
- package/dist/modules/wms/lib/catalogInventoryProfileSync.js +144 -0
- package/dist/modules/wms/lib/catalogInventoryProfileSync.js.map +7 -0
- package/dist/modules/wms/lib/expiry.js +29 -0
- package/dist/modules/wms/lib/expiry.js.map +7 -0
- package/dist/modules/wms/lib/flashMutationError.js +51 -0
- package/dist/modules/wms/lib/flashMutationError.js.map +7 -0
- package/dist/modules/wms/lib/inventoryDisplayUi.js +188 -0
- package/dist/modules/wms/lib/inventoryDisplayUi.js.map +7 -0
- package/dist/modules/wms/lib/inventoryIdempotency.js +37 -0
- package/dist/modules/wms/lib/inventoryIdempotency.js.map +7 -0
- package/dist/modules/wms/lib/inventoryImportCsv.js +173 -0
- package/dist/modules/wms/lib/inventoryImportCsv.js.map +7 -0
- package/dist/modules/wms/lib/inventoryImportService.js +468 -0
- package/dist/modules/wms/lib/inventoryImportService.js.map +7 -0
- package/dist/modules/wms/lib/inventoryMutationUi.js +25 -0
- package/dist/modules/wms/lib/inventoryMutationUi.js.map +7 -0
- package/dist/modules/wms/lib/inventoryPolicy.js +61 -0
- package/dist/modules/wms/lib/inventoryPolicy.js.map +7 -0
- package/dist/modules/wms/lib/inventoryReconciliation.js +193 -0
- package/dist/modules/wms/lib/inventoryReconciliation.js.map +7 -0
- package/dist/modules/wms/lib/inventoryTrackingValidation.js +13 -0
- package/dist/modules/wms/lib/inventoryTrackingValidation.js.map +7 -0
- package/dist/modules/wms/lib/loadOperationalDashboard.js +580 -0
- package/dist/modules/wms/lib/loadOperationalDashboard.js.map +7 -0
- package/dist/modules/wms/lib/lowStockBalanceFilter.js +49 -0
- package/dist/modules/wms/lib/lowStockBalanceFilter.js.map +7 -0
- package/dist/modules/wms/lib/primaryWarehousePolicy.js +32 -0
- package/dist/modules/wms/lib/primaryWarehousePolicy.js.map +7 -0
- package/dist/modules/wms/lib/roleFeatures.js +30 -0
- package/dist/modules/wms/lib/roleFeatures.js.map +7 -0
- package/dist/modules/wms/lib/salesOrderInventoryAutomation.js +291 -0
- package/dist/modules/wms/lib/salesOrderInventoryAutomation.js.map +7 -0
- package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js +54 -0
- package/dist/modules/wms/lib/salesOrderWarehouseAssignment.js.map +7 -0
- package/dist/modules/wms/lib/wmsIntegrationToggles.js +71 -0
- package/dist/modules/wms/lib/wmsIntegrationToggles.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260428110546.js +78 -0
- package/dist/modules/wms/migrations/Migration20260428110546.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260527120000.js +15 -0
- package/dist/modules/wms/migrations/Migration20260527120000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260527140000.js +37 -0
- package/dist/modules/wms/migrations/Migration20260527140000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260613120000.js +23 -0
- package/dist/modules/wms/migrations/Migration20260613120000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260616090000.js +13 -0
- package/dist/modules/wms/migrations/Migration20260616090000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260707180000.js +15 -0
- package/dist/modules/wms/migrations/Migration20260707180000.js.map +7 -0
- package/dist/modules/wms/notifications.client.js +18 -0
- package/dist/modules/wms/notifications.client.js.map +7 -0
- package/dist/modules/wms/notifications.js +53 -0
- package/dist/modules/wms/notifications.js.map +7 -0
- package/dist/modules/wms/search.js +196 -0
- package/dist/modules/wms/search.js.map +7 -0
- package/dist/modules/wms/setup.js +30 -0
- package/dist/modules/wms/setup.js.map +7 -0
- package/dist/modules/wms/subscribers/low-stock-notification.js +40 -0
- package/dist/modules/wms/subscribers/low-stock-notification.js.map +7 -0
- package/dist/modules/wms/subscribers/reservation-shortfall-notification.js +69 -0
- package/dist/modules/wms/subscribers/reservation-shortfall-notification.js.map +7 -0
- package/dist/modules/wms/subscribers/sales-order-cancelled-release.js +14 -0
- package/dist/modules/wms/subscribers/sales-order-cancelled-release.js.map +7 -0
- package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js +14 -0
- package/dist/modules/wms/subscribers/sales-order-confirmed-reserve.js.map +7 -0
- package/dist/modules/wms/translations.js +10 -0
- package/dist/modules/wms/translations.js.map +7 -0
- package/dist/modules/wms/vector.js +9 -0
- package/dist/modules/wms/vector.js.map +7 -0
- package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js +200 -0
- package/dist/modules/wms/widgets/injection/catalog-inventory-profile/widget.js.map +7 -0
- package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js +104 -0
- package/dist/modules/wms/widgets/injection/order-items-stock-column/widget.js.map +7 -0
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js +389 -0
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js.map +7 -0
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js +16 -0
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.js.map +7 -0
- package/dist/modules/wms/widgets/injection-table.js +36 -0
- package/dist/modules/wms/widgets/injection-table.js.map +7 -0
- package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js +150 -0
- package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js.map +7 -0
- package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js +186 -0
- package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js.map +7 -0
- package/dist/modules/wms/widgets/notifications/index.js +7 -0
- package/dist/modules/wms/widgets/notifications/index.js.map +7 -0
- package/generated/entities/inventory_balance/index.ts +9 -0
- package/generated/entities/inventory_lot/index.ts +8 -0
- package/generated/entities/inventory_movement/index.ts +16 -0
- package/generated/entities/inventory_reservation/index.ts +10 -0
- package/generated/entities/product_inventory_profile/index.ts +9 -0
- package/generated/entities/sales_order_warehouse_assignment/index.ts +4 -0
- package/generated/entities/warehouse/index.ts +11 -0
- package/generated/entities/warehouse_location/index.ts +9 -0
- package/generated/entities/warehouse_zone/index.ts +4 -0
- package/generated/entities.ids.generated.ts +12 -0
- package/generated/entity-fields-registry.ts +98 -0
- package/package.json +7 -7
- package/src/modules/auth/backend/roles/page.tsx +13 -4
- package/src/modules/auth/i18n/de.json +2 -0
- package/src/modules/auth/i18n/en.json +2 -0
- package/src/modules/auth/i18n/es.json +2 -0
- package/src/modules/auth/i18n/pl.json +2 -0
- package/src/modules/auth/lib/backendChrome.tsx +1 -0
- package/src/modules/auth/services/rbacService.ts +25 -21
- package/src/modules/catalog/api/products/route.ts +3 -0
- package/src/modules/catalog/api/variants/route.ts +3 -0
- package/src/modules/query_index/lib/engine.ts +18 -6
- package/src/modules/sales/api/documents/factory.ts +1 -0
- package/src/modules/sales/commands/documents.ts +71 -0
- package/src/modules/sales/components/documents/ItemsSection.tsx +58 -0
- package/src/modules/sales/events.ts +2 -0
- package/src/modules/sales/widgets/injection/order-items-context.ts +15 -0
- package/src/modules/wms/acl.ts +14 -0
- package/src/modules/wms/analytics.ts +9 -0
- package/src/modules/wms/api/dashboard/operational/route.ts +83 -0
- package/src/modules/wms/api/interceptors.ts +108 -0
- package/src/modules/wms/api/inventory/adjust/route.ts +50 -0
- package/src/modules/wms/api/inventory/allocate/route.ts +50 -0
- package/src/modules/wms/api/inventory/balances/route.ts +178 -0
- package/src/modules/wms/api/inventory/cycle-count/route.ts +51 -0
- package/src/modules/wms/api/inventory/helpers.ts +128 -0
- package/src/modules/wms/api/inventory/import/apply/route.ts +47 -0
- package/src/modules/wms/api/inventory/import/helpers.ts +223 -0
- package/src/modules/wms/api/inventory/import/template/route.ts +31 -0
- package/src/modules/wms/api/inventory/import/validate/route.ts +56 -0
- package/src/modules/wms/api/inventory/move/route.ts +50 -0
- package/src/modules/wms/api/inventory/movements/route.ts +164 -0
- package/src/modules/wms/api/inventory/receive/route.ts +49 -0
- package/src/modules/wms/api/inventory/release/route.ts +43 -0
- package/src/modules/wms/api/inventory/reservations/route.ts +128 -0
- package/src/modules/wms/api/inventory/reserve/route.ts +59 -0
- package/src/modules/wms/api/inventory-profiles/route.ts +177 -0
- package/src/modules/wms/api/listEnrichers.ts +312 -0
- package/src/modules/wms/api/listSearch.ts +121 -0
- package/src/modules/wms/api/locations/route.ts +171 -0
- package/src/modules/wms/api/lots/route.ts +205 -0
- package/src/modules/wms/api/openapi.ts +28 -0
- package/src/modules/wms/api/sales-orders/[salesOrderId]/re-run-reservation/route.ts +58 -0
- package/src/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.ts +306 -0
- package/src/modules/wms/api/sales-orders/assign-warehouse/route.ts +57 -0
- package/src/modules/wms/api/sales-orders/unassign-warehouse/route.ts +43 -0
- package/src/modules/wms/api/warehouses/route.ts +181 -0
- package/src/modules/wms/api/zones/route.ts +158 -0
- package/src/modules/wms/backend/config/wms/page.meta.ts +14 -0
- package/src/modules/wms/backend/config/wms/page.tsx +5 -0
- package/src/modules/wms/backend/page.meta.ts +12 -0
- package/src/modules/wms/backend/page.tsx +5 -0
- package/src/modules/wms/backend/wms/inventory/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/inventory/page.tsx +5 -0
- package/src/modules/wms/backend/wms/location/[id]/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/location/[id]/page.tsx +5 -0
- package/src/modules/wms/backend/wms/locations/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/locations/page.tsx +12 -0
- package/src/modules/wms/backend/wms/lot/[id]/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/lot/[id]/page.tsx +5 -0
- package/src/modules/wms/backend/wms/lots/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/lots/page.tsx +5 -0
- package/src/modules/wms/backend/wms/movements/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/movements/page.tsx +23 -0
- package/src/modules/wms/backend/wms/reservations/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/reservations/page.tsx +24 -0
- package/src/modules/wms/backend/wms/sku/[id]/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/sku/[id]/page.tsx +5 -0
- package/src/modules/wms/backend/wms/warehouses/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/warehouses/page.tsx +12 -0
- package/src/modules/wms/backend/wms/zones/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/zones/page.tsx +12 -0
- package/src/modules/wms/ce.ts +76 -0
- package/src/modules/wms/cli.ts +96 -0
- package/src/modules/wms/commands/configuration.ts +1844 -0
- package/src/modules/wms/commands/index.ts +3 -0
- package/src/modules/wms/commands/inventory-actions.ts +1866 -0
- package/src/modules/wms/commands/sales-order-assignment.ts +346 -0
- package/src/modules/wms/commands/shared.ts +90 -0
- package/src/modules/wms/components/backend/AdjustInventoryDialog.tsx +820 -0
- package/src/modules/wms/components/backend/ChangeLotStatusDialog.tsx +312 -0
- package/src/modules/wms/components/backend/CycleCountWizardDialog.tsx +2007 -0
- package/src/modules/wms/components/backend/ImportInventoryDialog.tsx +1018 -0
- package/src/modules/wms/components/backend/InventoryOperationsSection.tsx +159 -0
- package/src/modules/wms/components/backend/LocationEditDialog.tsx +185 -0
- package/src/modules/wms/components/backend/MoveInventoryDialog.tsx +907 -0
- package/src/modules/wms/components/backend/ReceiveInventoryDialog.tsx +695 -0
- package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +424 -0
- package/src/modules/wms/components/backend/ReserveInventoryDialog.tsx +511 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +1340 -0
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +1132 -0
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +1310 -0
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +1355 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +359 -0
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +958 -0
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +1245 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +960 -0
- package/src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts +89 -0
- package/src/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.ts +32 -0
- package/src/modules/wms/components/backend/wmsLookupLoaders.ts +78 -0
- package/src/modules/wms/data/enrichers.ts +718 -0
- package/src/modules/wms/data/entities.ts +436 -0
- package/src/modules/wms/data/validators.ts +463 -0
- package/src/modules/wms/di.ts +25 -0
- package/src/modules/wms/events.ts +41 -0
- package/src/modules/wms/i18n/de.json +1051 -0
- package/src/modules/wms/i18n/en.json +1051 -0
- package/src/modules/wms/i18n/es.json +1051 -0
- package/src/modules/wms/i18n/pl.json +1051 -0
- package/src/modules/wms/index.ts +15 -0
- package/src/modules/wms/lib/catalogInventoryProfileIntent.ts +65 -0
- package/src/modules/wms/lib/catalogInventoryProfileSync.ts +199 -0
- package/src/modules/wms/lib/expiry.ts +30 -0
- package/src/modules/wms/lib/flashMutationError.ts +74 -0
- package/src/modules/wms/lib/inventoryDisplayUi.ts +249 -0
- package/src/modules/wms/lib/inventoryIdempotency.ts +54 -0
- package/src/modules/wms/lib/inventoryImportCsv.ts +212 -0
- package/src/modules/wms/lib/inventoryImportService.ts +629 -0
- package/src/modules/wms/lib/inventoryMutationUi.ts +21 -0
- package/src/modules/wms/lib/inventoryPolicy.ts +111 -0
- package/src/modules/wms/lib/inventoryReconciliation.ts +263 -0
- package/src/modules/wms/lib/inventoryTrackingValidation.ts +23 -0
- package/src/modules/wms/lib/loadOperationalDashboard.ts +776 -0
- package/src/modules/wms/lib/lowStockBalanceFilter.ts +74 -0
- package/src/modules/wms/lib/primaryWarehousePolicy.ts +46 -0
- package/src/modules/wms/lib/roleFeatures.ts +32 -0
- package/src/modules/wms/lib/salesOrderInventoryAutomation.ts +390 -0
- package/src/modules/wms/lib/salesOrderWarehouseAssignment.ts +78 -0
- package/src/modules/wms/lib/wmsIntegrationToggles.ts +81 -0
- package/src/modules/wms/migrations/.snapshot-open-mercato.json +2880 -0
- package/src/modules/wms/migrations/Migration20260428110546.ts +91 -0
- package/src/modules/wms/migrations/Migration20260527120000.ts +15 -0
- package/src/modules/wms/migrations/Migration20260527140000.ts +35 -0
- package/src/modules/wms/migrations/Migration20260613120000.ts +21 -0
- package/src/modules/wms/migrations/Migration20260616090000.ts +11 -0
- package/src/modules/wms/migrations/Migration20260707180000.ts +13 -0
- package/src/modules/wms/notifications.client.ts +18 -0
- package/src/modules/wms/notifications.ts +51 -0
- package/src/modules/wms/search.ts +230 -0
- package/src/modules/wms/setup.ts +29 -0
- package/src/modules/wms/subscribers/low-stock-notification.ts +54 -0
- package/src/modules/wms/subscribers/reservation-shortfall-notification.ts +98 -0
- package/src/modules/wms/subscribers/sales-order-cancelled-release.ts +21 -0
- package/src/modules/wms/subscribers/sales-order-confirmed-reserve.ts +21 -0
- package/src/modules/wms/translations.ts +6 -0
- package/src/modules/wms/vector.ts +7 -0
- package/src/modules/wms/widgets/injection/catalog-inventory-profile/widget.ts +238 -0
- package/src/modules/wms/widgets/injection/order-items-stock-column/widget.tsx +153 -0
- package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.client.tsx +476 -0
- package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.ts +15 -0
- package/src/modules/wms/widgets/injection-table.ts +34 -0
- package/src/modules/wms/widgets/notifications/WmsLowStockRenderer.tsx +153 -0
- package/src/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.tsx +194 -0
- package/src/modules/wms/widgets/notifications/index.ts +2 -0
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
2
|
+
import { E } from "../../../generated/entities.ids.generated.js";
|
|
3
|
+
import { InventoryBalance, InventoryReservation, ProductInventoryProfile, SalesOrderWarehouseAssignment, Warehouse } from "./entities.js";
|
|
4
|
+
import { resolvePrimaryWarehouseId } from "../lib/primaryWarehousePolicy.js";
|
|
5
|
+
import { resolveWmsIntegrationToggleEnabled } from "../lib/wmsIntegrationToggles.js";
|
|
6
|
+
const EMPTY_ENRICHMENT = {
|
|
7
|
+
_wms: {
|
|
8
|
+
assignedWarehouseId: null,
|
|
9
|
+
assignedWarehouseName: null,
|
|
10
|
+
isExplicitlyAssigned: false,
|
|
11
|
+
stockSummary: [],
|
|
12
|
+
reservationSummary: {
|
|
13
|
+
status: "unreserved",
|
|
14
|
+
reservationIds: []
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const EMPTY_CATALOG_ENRICHMENT = {
|
|
19
|
+
_wms: {
|
|
20
|
+
inventoryProfile: null,
|
|
21
|
+
stockSummary: [],
|
|
22
|
+
reorderStatus: {
|
|
23
|
+
state: "no_profile",
|
|
24
|
+
available: "0",
|
|
25
|
+
reorderPoint: "0",
|
|
26
|
+
safetyStock: "0"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function extractRecordId(record) {
|
|
31
|
+
return typeof record.id === "string" && record.id.trim().length > 0 ? record.id : null;
|
|
32
|
+
}
|
|
33
|
+
function extractOrderIdFromLine(line) {
|
|
34
|
+
return typeof line.order_id === "string" && line.order_id.length > 0 ? line.order_id : null;
|
|
35
|
+
}
|
|
36
|
+
function extractProductIdFromVariant(variant) {
|
|
37
|
+
return typeof variant.product_id === "string" && variant.product_id.length > 0 ? variant.product_id : null;
|
|
38
|
+
}
|
|
39
|
+
function extractWarehouseId(reservation) {
|
|
40
|
+
const relation = reservation.warehouse;
|
|
41
|
+
return typeof relation?.id === "string" ? relation.id : null;
|
|
42
|
+
}
|
|
43
|
+
function addToMap(map, key, value) {
|
|
44
|
+
const numeric = typeof value === "number" ? value : Number(value ?? 0);
|
|
45
|
+
map.set(key, (map.get(key) ?? 0) + numeric);
|
|
46
|
+
}
|
|
47
|
+
function formatQuantity(value) {
|
|
48
|
+
if (!Number.isFinite(value) || value === 0) return "0";
|
|
49
|
+
const normalized = value.toFixed(4).replace(/\.?0+$/, "");
|
|
50
|
+
return normalized.length > 0 ? normalized : "0";
|
|
51
|
+
}
|
|
52
|
+
function toInventoryProfileSummary(profile) {
|
|
53
|
+
return {
|
|
54
|
+
profileId: profile.id,
|
|
55
|
+
catalogProductId: profile.catalogProductId,
|
|
56
|
+
catalogVariantId: profile.catalogVariantId ?? null,
|
|
57
|
+
defaultUom: profile.defaultUom,
|
|
58
|
+
defaultStrategy: profile.defaultStrategy,
|
|
59
|
+
trackLot: profile.trackLot,
|
|
60
|
+
trackSerial: profile.trackSerial,
|
|
61
|
+
trackExpiration: profile.trackExpiration,
|
|
62
|
+
reorderPoint: profile.reorderPoint,
|
|
63
|
+
safetyStock: profile.safetyStock
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function resolveReservationStatus(requiredQuantity, reservedQuantity) {
|
|
67
|
+
if (requiredQuantity <= 0 || reservedQuantity <= 0) return "unreserved";
|
|
68
|
+
if (reservedQuantity + 1e-4 < requiredQuantity) return "partially_reserved";
|
|
69
|
+
return "fully_reserved";
|
|
70
|
+
}
|
|
71
|
+
function resolveReorderStatus(availableQuantity, profile) {
|
|
72
|
+
if (!profile) {
|
|
73
|
+
return {
|
|
74
|
+
state: "no_profile",
|
|
75
|
+
available: formatQuantity(availableQuantity),
|
|
76
|
+
reorderPoint: "0",
|
|
77
|
+
safetyStock: "0"
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const reorderPoint = Number(profile.reorderPoint);
|
|
81
|
+
const safetyStock = Number(profile.safetyStock);
|
|
82
|
+
let state = "healthy";
|
|
83
|
+
if (availableQuantity <= safetyStock) {
|
|
84
|
+
state = "below_safety_stock";
|
|
85
|
+
} else if (availableQuantity <= reorderPoint) {
|
|
86
|
+
state = "below_reorder_point";
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
state,
|
|
90
|
+
available: formatQuantity(availableQuantity),
|
|
91
|
+
reorderPoint: profile.reorderPoint,
|
|
92
|
+
safetyStock: profile.safetyStock
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function buildBalanceSummaryByVariant(balances) {
|
|
96
|
+
const byVariant = /* @__PURE__ */ new Map();
|
|
97
|
+
for (const balance of balances) {
|
|
98
|
+
const current = byVariant.get(balance.catalogVariantId) ?? {
|
|
99
|
+
onHand: 0,
|
|
100
|
+
reserved: 0,
|
|
101
|
+
allocated: 0,
|
|
102
|
+
available: 0
|
|
103
|
+
};
|
|
104
|
+
current.onHand += Number(balance.quantityOnHand);
|
|
105
|
+
current.reserved += Number(balance.quantityReserved);
|
|
106
|
+
current.allocated += Number(balance.quantityAllocated);
|
|
107
|
+
current.available += Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated);
|
|
108
|
+
byVariant.set(balance.catalogVariantId, current);
|
|
109
|
+
}
|
|
110
|
+
return byVariant;
|
|
111
|
+
}
|
|
112
|
+
function buildStockSummaryItem(catalogVariantId, aggregate) {
|
|
113
|
+
return {
|
|
114
|
+
catalogVariantId,
|
|
115
|
+
onHand: formatQuantity(aggregate?.onHand ?? 0),
|
|
116
|
+
reserved: formatQuantity(aggregate?.reserved ?? 0),
|
|
117
|
+
allocated: formatQuantity(aggregate?.allocated ?? 0),
|
|
118
|
+
available: formatQuantity(aggregate?.available ?? 0)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function isSalesOrderInventoryEnabled(context) {
|
|
122
|
+
const container = context.container;
|
|
123
|
+
if (!container?.resolve) return true;
|
|
124
|
+
try {
|
|
125
|
+
const featureTogglesService = container.resolve("featureTogglesService");
|
|
126
|
+
const em = container.resolve("em");
|
|
127
|
+
if (!featureTogglesService || !em) return true;
|
|
128
|
+
return resolveWmsIntegrationToggleEnabled(
|
|
129
|
+
featureTogglesService,
|
|
130
|
+
em,
|
|
131
|
+
"wms_integration_sales_order_inventory",
|
|
132
|
+
context.tenantId
|
|
133
|
+
);
|
|
134
|
+
} catch {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function loadExplicitAssignments(em, orderIds, scope) {
|
|
139
|
+
if (orderIds.length === 0) return [];
|
|
140
|
+
return findWithDecryption(
|
|
141
|
+
em,
|
|
142
|
+
SalesOrderWarehouseAssignment,
|
|
143
|
+
{
|
|
144
|
+
salesOrderId: { $in: orderIds },
|
|
145
|
+
organizationId: scope.organizationId,
|
|
146
|
+
tenantId: scope.tenantId,
|
|
147
|
+
deletedAt: null
|
|
148
|
+
},
|
|
149
|
+
void 0,
|
|
150
|
+
scope
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
async function loadWarehousesByIds(em, warehouseIds, scope) {
|
|
154
|
+
if (warehouseIds.length === 0) return [];
|
|
155
|
+
return findWithDecryption(
|
|
156
|
+
em,
|
|
157
|
+
Warehouse,
|
|
158
|
+
{
|
|
159
|
+
id: { $in: warehouseIds },
|
|
160
|
+
organizationId: scope.organizationId,
|
|
161
|
+
tenantId: scope.tenantId,
|
|
162
|
+
deletedAt: null
|
|
163
|
+
},
|
|
164
|
+
void 0,
|
|
165
|
+
scope
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
async function loadOrderLines(context, orderIds, scope) {
|
|
169
|
+
if (orderIds.length === 0) return [];
|
|
170
|
+
const container = context.container;
|
|
171
|
+
const queryEngine = container.resolve("queryEngine");
|
|
172
|
+
const result = await queryEngine.query(E.sales.sales_order_line, {
|
|
173
|
+
tenantId: scope.tenantId,
|
|
174
|
+
organizationId: scope.organizationId,
|
|
175
|
+
filters: { order_id: { $in: orderIds } },
|
|
176
|
+
fields: ["id", "order_id", "product_variant_id", "quantity", "line_number", "status"],
|
|
177
|
+
sort: [{ field: "line_number", dir: "asc" }],
|
|
178
|
+
page: { page: 1, pageSize: 5e3 }
|
|
179
|
+
});
|
|
180
|
+
return result.items;
|
|
181
|
+
}
|
|
182
|
+
async function loadReservations(em, orderIds, scope) {
|
|
183
|
+
if (orderIds.length === 0) return [];
|
|
184
|
+
return findWithDecryption(
|
|
185
|
+
em,
|
|
186
|
+
InventoryReservation,
|
|
187
|
+
{
|
|
188
|
+
sourceType: "order",
|
|
189
|
+
sourceId: { $in: orderIds },
|
|
190
|
+
organizationId: scope.organizationId,
|
|
191
|
+
tenantId: scope.tenantId,
|
|
192
|
+
deletedAt: null
|
|
193
|
+
},
|
|
194
|
+
{ orderBy: { createdAt: "asc" } },
|
|
195
|
+
scope
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
async function loadBalances(em, variantIds, scope) {
|
|
199
|
+
if (variantIds.length === 0) return [];
|
|
200
|
+
return findWithDecryption(
|
|
201
|
+
em,
|
|
202
|
+
InventoryBalance,
|
|
203
|
+
{
|
|
204
|
+
catalogVariantId: { $in: variantIds },
|
|
205
|
+
organizationId: scope.organizationId,
|
|
206
|
+
tenantId: scope.tenantId,
|
|
207
|
+
deletedAt: null
|
|
208
|
+
},
|
|
209
|
+
void 0,
|
|
210
|
+
scope
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
async function loadCatalogVariants(context, productIds, scope) {
|
|
214
|
+
if (productIds.length === 0) return [];
|
|
215
|
+
const container = context.container;
|
|
216
|
+
const queryEngine = container.resolve("queryEngine");
|
|
217
|
+
const result = await queryEngine.query(E.catalog.catalog_product_variant, {
|
|
218
|
+
tenantId: scope.tenantId,
|
|
219
|
+
organizationId: scope.organizationId,
|
|
220
|
+
filters: { product_id: { $in: productIds } },
|
|
221
|
+
fields: ["id", "product_id"],
|
|
222
|
+
sort: [{ field: "created_at", dir: "asc" }],
|
|
223
|
+
page: { page: 1, pageSize: 5e3 }
|
|
224
|
+
});
|
|
225
|
+
return result.items;
|
|
226
|
+
}
|
|
227
|
+
async function loadProductInventoryProfiles(em, productIds, scope) {
|
|
228
|
+
if (productIds.length === 0) return [];
|
|
229
|
+
return findWithDecryption(
|
|
230
|
+
em,
|
|
231
|
+
ProductInventoryProfile,
|
|
232
|
+
{
|
|
233
|
+
catalogProductId: { $in: productIds },
|
|
234
|
+
catalogVariantId: null,
|
|
235
|
+
organizationId: scope.organizationId,
|
|
236
|
+
tenantId: scope.tenantId,
|
|
237
|
+
deletedAt: null
|
|
238
|
+
},
|
|
239
|
+
void 0,
|
|
240
|
+
scope
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
async function loadVariantInventoryProfiles(em, variantIds, scope) {
|
|
244
|
+
if (variantIds.length === 0) return [];
|
|
245
|
+
return findWithDecryption(
|
|
246
|
+
em,
|
|
247
|
+
ProductInventoryProfile,
|
|
248
|
+
{
|
|
249
|
+
catalogVariantId: { $in: variantIds },
|
|
250
|
+
organizationId: scope.organizationId,
|
|
251
|
+
tenantId: scope.tenantId,
|
|
252
|
+
deletedAt: null
|
|
253
|
+
},
|
|
254
|
+
void 0,
|
|
255
|
+
scope
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
const salesOrderInventoryEnricher = {
|
|
259
|
+
id: "wms.sales-order-inventory",
|
|
260
|
+
targetEntity: E.sales.sales_order,
|
|
261
|
+
features: ["wms.view"],
|
|
262
|
+
priority: 40,
|
|
263
|
+
timeout: 2e3,
|
|
264
|
+
fallback: EMPTY_ENRICHMENT,
|
|
265
|
+
async enrichOne(record, context) {
|
|
266
|
+
return (await this.enrichMany([record], context))[0];
|
|
267
|
+
},
|
|
268
|
+
async enrichMany(records, context) {
|
|
269
|
+
if (records.length === 0) return records;
|
|
270
|
+
const enabled = await isSalesOrderInventoryEnabled(context);
|
|
271
|
+
if (!enabled) return records;
|
|
272
|
+
const orderIds = records.map(extractRecordId).filter((value) => Boolean(value));
|
|
273
|
+
if (orderIds.length === 0) {
|
|
274
|
+
return records.map((record) => ({ ...record, ...EMPTY_ENRICHMENT }));
|
|
275
|
+
}
|
|
276
|
+
const em = context.em.fork();
|
|
277
|
+
const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
|
|
278
|
+
const lines = await loadOrderLines(context, orderIds, scope);
|
|
279
|
+
const variantIds = Array.from(
|
|
280
|
+
new Set(
|
|
281
|
+
lines.map((line) => line.product_variant_id).filter((value) => typeof value === "string" && value.length > 0)
|
|
282
|
+
)
|
|
283
|
+
);
|
|
284
|
+
const [reservations, balances, primaryWarehouseId, explicitAssignments] = await Promise.all([
|
|
285
|
+
loadReservations(em, orderIds, scope),
|
|
286
|
+
loadBalances(em, variantIds, scope),
|
|
287
|
+
resolvePrimaryWarehouseId(em, scope),
|
|
288
|
+
loadExplicitAssignments(em, orderIds, scope)
|
|
289
|
+
]);
|
|
290
|
+
const explicitWarehouseIdsByOrder = /* @__PURE__ */ new Map();
|
|
291
|
+
for (const assignment of explicitAssignments) {
|
|
292
|
+
const warehouseRel = assignment.warehouse;
|
|
293
|
+
const warehouseId = warehouseRel?.id;
|
|
294
|
+
if (warehouseId) {
|
|
295
|
+
explicitWarehouseIdsByOrder.set(assignment.salesOrderId, warehouseId);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const reservationWarehouseIds = reservations.map(extractWarehouseId).filter((value) => typeof value === "string" && value.length > 0);
|
|
299
|
+
const allRelevantWarehouseIds = Array.from(
|
|
300
|
+
/* @__PURE__ */ new Set([
|
|
301
|
+
...Array.from(explicitWarehouseIdsByOrder.values()),
|
|
302
|
+
...reservationWarehouseIds,
|
|
303
|
+
...primaryWarehouseId ? [primaryWarehouseId] : []
|
|
304
|
+
])
|
|
305
|
+
);
|
|
306
|
+
const warehouses = await loadWarehousesByIds(em, allRelevantWarehouseIds, scope);
|
|
307
|
+
const warehouseNamesById = new Map(warehouses.map((w) => [w.id, w.name]));
|
|
308
|
+
const variantAvailability = /* @__PURE__ */ new Map();
|
|
309
|
+
const variantReserved = /* @__PURE__ */ new Map();
|
|
310
|
+
for (const balance of balances) {
|
|
311
|
+
addToMap(
|
|
312
|
+
variantAvailability,
|
|
313
|
+
balance.catalogVariantId,
|
|
314
|
+
Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated)
|
|
315
|
+
);
|
|
316
|
+
addToMap(variantReserved, balance.catalogVariantId, balance.quantityReserved);
|
|
317
|
+
}
|
|
318
|
+
const variantOrderBySalesOrder = /* @__PURE__ */ new Map();
|
|
319
|
+
const requiredBySalesOrder = /* @__PURE__ */ new Map();
|
|
320
|
+
for (const line of lines) {
|
|
321
|
+
const orderId = extractOrderIdFromLine(line);
|
|
322
|
+
const variantId = line.product_variant_id ?? null;
|
|
323
|
+
if (!orderId || !variantId) continue;
|
|
324
|
+
const variantOrder = variantOrderBySalesOrder.get(orderId) ?? [];
|
|
325
|
+
if (!variantOrder.includes(variantId)) {
|
|
326
|
+
variantOrder.push(variantId);
|
|
327
|
+
variantOrderBySalesOrder.set(orderId, variantOrder);
|
|
328
|
+
}
|
|
329
|
+
requiredBySalesOrder.set(orderId, (requiredBySalesOrder.get(orderId) ?? 0) + Number(line.quantity));
|
|
330
|
+
}
|
|
331
|
+
const activeReservationsBySalesOrder = /* @__PURE__ */ new Map();
|
|
332
|
+
const reservedBySalesOrder = /* @__PURE__ */ new Map();
|
|
333
|
+
for (const reservation of reservations) {
|
|
334
|
+
if (reservation.status !== "active") continue;
|
|
335
|
+
const orderId = reservation.sourceId;
|
|
336
|
+
const activeReservations = activeReservationsBySalesOrder.get(orderId) ?? [];
|
|
337
|
+
activeReservations.push(reservation);
|
|
338
|
+
activeReservationsBySalesOrder.set(orderId, activeReservations);
|
|
339
|
+
reservedBySalesOrder.set(orderId, (reservedBySalesOrder.get(orderId) ?? 0) + Number(reservation.quantity));
|
|
340
|
+
}
|
|
341
|
+
return records.map((record) => {
|
|
342
|
+
const orderId = extractRecordId(record);
|
|
343
|
+
if (!orderId) {
|
|
344
|
+
return { ...record, ...EMPTY_ENRICHMENT };
|
|
345
|
+
}
|
|
346
|
+
const reservationsForOrder = activeReservationsBySalesOrder.get(orderId) ?? [];
|
|
347
|
+
const warehouseIds = Array.from(
|
|
348
|
+
new Set(
|
|
349
|
+
reservationsForOrder.map(extractWarehouseId).filter((value) => typeof value === "string" && value.length > 0)
|
|
350
|
+
)
|
|
351
|
+
);
|
|
352
|
+
const variantIdsForOrder = variantOrderBySalesOrder.get(orderId) ?? [];
|
|
353
|
+
const explicitWarehouseId = explicitWarehouseIdsByOrder.get(orderId) ?? null;
|
|
354
|
+
const isExplicitlyAssigned = explicitWarehouseId !== null;
|
|
355
|
+
let assignedWarehouseId;
|
|
356
|
+
if (isExplicitlyAssigned) {
|
|
357
|
+
assignedWarehouseId = explicitWarehouseId;
|
|
358
|
+
} else if (warehouseIds.length === 1) {
|
|
359
|
+
assignedWarehouseId = warehouseIds[0];
|
|
360
|
+
} else if (warehouseIds.length === 0 && primaryWarehouseId) {
|
|
361
|
+
assignedWarehouseId = primaryWarehouseId;
|
|
362
|
+
} else {
|
|
363
|
+
assignedWarehouseId = null;
|
|
364
|
+
}
|
|
365
|
+
const assignedWarehouseName = assignedWarehouseId ? warehouseNamesById.get(assignedWarehouseId) ?? null : null;
|
|
366
|
+
return {
|
|
367
|
+
...record,
|
|
368
|
+
_wms: {
|
|
369
|
+
assignedWarehouseId,
|
|
370
|
+
assignedWarehouseName,
|
|
371
|
+
isExplicitlyAssigned,
|
|
372
|
+
stockSummary: variantIdsForOrder.map((catalogVariantId) => ({
|
|
373
|
+
catalogVariantId,
|
|
374
|
+
available: formatQuantity(variantAvailability.get(catalogVariantId) ?? 0),
|
|
375
|
+
reserved: formatQuantity(variantReserved.get(catalogVariantId) ?? 0)
|
|
376
|
+
})),
|
|
377
|
+
reservationSummary: {
|
|
378
|
+
status: resolveReservationStatus(
|
|
379
|
+
requiredBySalesOrder.get(orderId) ?? 0,
|
|
380
|
+
reservedBySalesOrder.get(orderId) ?? 0
|
|
381
|
+
),
|
|
382
|
+
reservationIds: reservationsForOrder.map((reservation) => reservation.id)
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
const catalogProductInventoryEnricher = {
|
|
390
|
+
id: "wms.catalog-product-inventory",
|
|
391
|
+
targetEntity: E.catalog.catalog_product,
|
|
392
|
+
features: ["wms.view"],
|
|
393
|
+
priority: 40,
|
|
394
|
+
timeout: 2e3,
|
|
395
|
+
fallback: EMPTY_CATALOG_ENRICHMENT,
|
|
396
|
+
async enrichOne(record, context) {
|
|
397
|
+
return (await this.enrichMany([record], context))[0];
|
|
398
|
+
},
|
|
399
|
+
async enrichMany(records, context) {
|
|
400
|
+
if (records.length === 0) return records;
|
|
401
|
+
const productIds = records.map(extractRecordId).filter((value) => Boolean(value));
|
|
402
|
+
if (productIds.length === 0) {
|
|
403
|
+
return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }));
|
|
404
|
+
}
|
|
405
|
+
const em = context.em.fork();
|
|
406
|
+
const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
|
|
407
|
+
const variants = await loadCatalogVariants(context, productIds, scope);
|
|
408
|
+
const variantIds = variants.map((variant) => variant.id).filter((value) => typeof value === "string" && value.length > 0);
|
|
409
|
+
const [productProfiles, balances] = await Promise.all([
|
|
410
|
+
loadProductInventoryProfiles(em, productIds, scope),
|
|
411
|
+
loadBalances(em, variantIds, scope)
|
|
412
|
+
]);
|
|
413
|
+
const profileByProductId = new Map(
|
|
414
|
+
productProfiles.map((profile) => [profile.catalogProductId, profile])
|
|
415
|
+
);
|
|
416
|
+
const balanceByVariantId = buildBalanceSummaryByVariant(balances);
|
|
417
|
+
const variantIdsByProductId = /* @__PURE__ */ new Map();
|
|
418
|
+
for (const variant of variants) {
|
|
419
|
+
const productId = extractProductIdFromVariant(variant);
|
|
420
|
+
if (!productId || typeof variant.id !== "string") continue;
|
|
421
|
+
const entries = variantIdsByProductId.get(productId) ?? [];
|
|
422
|
+
entries.push(variant.id);
|
|
423
|
+
variantIdsByProductId.set(productId, entries);
|
|
424
|
+
}
|
|
425
|
+
return records.map((record) => {
|
|
426
|
+
const productId = extractRecordId(record);
|
|
427
|
+
if (!productId) {
|
|
428
|
+
return { ...record, ...EMPTY_CATALOG_ENRICHMENT };
|
|
429
|
+
}
|
|
430
|
+
const profile = profileByProductId.get(productId) ?? null;
|
|
431
|
+
const stockSummary = (variantIdsByProductId.get(productId) ?? []).map(
|
|
432
|
+
(variantId) => buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))
|
|
433
|
+
);
|
|
434
|
+
const totalAvailable = stockSummary.reduce(
|
|
435
|
+
(sum, item) => sum + Number(item.available),
|
|
436
|
+
0
|
|
437
|
+
);
|
|
438
|
+
return {
|
|
439
|
+
...record,
|
|
440
|
+
_wms: {
|
|
441
|
+
inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,
|
|
442
|
+
stockSummary,
|
|
443
|
+
reorderStatus: resolveReorderStatus(totalAvailable, profile)
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
const catalogVariantInventoryEnricher = {
|
|
450
|
+
id: "wms.catalog-variant-inventory",
|
|
451
|
+
targetEntity: E.catalog.catalog_product_variant,
|
|
452
|
+
features: ["wms.view"],
|
|
453
|
+
priority: 40,
|
|
454
|
+
timeout: 2e3,
|
|
455
|
+
fallback: EMPTY_CATALOG_ENRICHMENT,
|
|
456
|
+
async enrichOne(record, context) {
|
|
457
|
+
return (await this.enrichMany([record], context))[0];
|
|
458
|
+
},
|
|
459
|
+
async enrichMany(records, context) {
|
|
460
|
+
if (records.length === 0) return records;
|
|
461
|
+
const variantIds = records.map(extractRecordId).filter((value) => Boolean(value));
|
|
462
|
+
if (variantIds.length === 0) {
|
|
463
|
+
return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }));
|
|
464
|
+
}
|
|
465
|
+
const em = context.em.fork();
|
|
466
|
+
const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
|
|
467
|
+
const [profiles, balances] = await Promise.all([
|
|
468
|
+
loadVariantInventoryProfiles(em, variantIds, scope),
|
|
469
|
+
loadBalances(em, variantIds, scope)
|
|
470
|
+
]);
|
|
471
|
+
const profileByVariantId = new Map(
|
|
472
|
+
profiles.filter((profile) => typeof profile.catalogVariantId === "string").map((profile) => [profile.catalogVariantId, profile])
|
|
473
|
+
);
|
|
474
|
+
const balanceByVariantId = buildBalanceSummaryByVariant(balances);
|
|
475
|
+
return records.map((record) => {
|
|
476
|
+
const variantId = extractRecordId(record);
|
|
477
|
+
if (!variantId) {
|
|
478
|
+
return { ...record, ...EMPTY_CATALOG_ENRICHMENT };
|
|
479
|
+
}
|
|
480
|
+
const profile = profileByVariantId.get(variantId) ?? null;
|
|
481
|
+
const stockSummary = [buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))];
|
|
482
|
+
return {
|
|
483
|
+
...record,
|
|
484
|
+
_wms: {
|
|
485
|
+
inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,
|
|
486
|
+
stockSummary,
|
|
487
|
+
reorderStatus: resolveReorderStatus(Number(stockSummary[0]?.available ?? 0), profile)
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
const enrichers = [
|
|
494
|
+
salesOrderInventoryEnricher,
|
|
495
|
+
catalogProductInventoryEnricher,
|
|
496
|
+
catalogVariantInventoryEnricher
|
|
497
|
+
];
|
|
498
|
+
export {
|
|
499
|
+
enrichers
|
|
500
|
+
};
|
|
501
|
+
//# sourceMappingURL=enrichers.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/data/enrichers.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { ResponseEnricher, EnricherContext } from '@open-mercato/shared/lib/crud/response-enricher'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport type { FeatureTogglesService } from '@open-mercato/core/modules/feature_toggles/lib/feature-flag-check'\nimport type { QueryEngine } from '@open-mercato/shared/lib/query/types'\nimport { E } from '#generated/entities.ids.generated'\nimport { InventoryBalance, InventoryReservation, ProductInventoryProfile, SalesOrderWarehouseAssignment, Warehouse } from './entities'\nimport { resolvePrimaryWarehouseId } from '../lib/primaryWarehousePolicy'\n\ntype SalesOrderRecord = Record<string, unknown> & { id?: string }\ntype CatalogProductRecord = Record<string, unknown> & { id?: string }\ntype CatalogVariantRecord = Record<string, unknown> & { id?: string; product_id?: string; productId?: string }\n\ntype SalesOrderLineRow = {\n id?: string\n order_id?: string | null\n product_variant_id?: string | null\n quantity?: string | number | null\n line_number?: number | null\n status?: string | null\n}\n\ntype CatalogVariantRow = {\n id?: string\n product_id?: string | null\n}\ntype ReservationStatus = 'unreserved' | 'partially_reserved' | 'fully_reserved'\ntype ReorderState = 'no_profile' | 'healthy' | 'below_reorder_point' | 'below_safety_stock'\n\ntype InventoryProfileSummary = {\n profileId: string\n catalogProductId: string\n catalogVariantId: string | null\n defaultUom: string\n defaultStrategy: string\n trackLot: boolean\n trackSerial: boolean\n trackExpiration: boolean\n reorderPoint: string\n safetyStock: string\n}\n\ntype StockSummaryItem = {\n catalogVariantId: string\n onHand: string\n reserved: string\n allocated: string\n available: string\n}\n\ntype ReorderStatus = {\n state: ReorderState\n available: string\n reorderPoint: string\n safetyStock: string\n}\n\ntype SalesOrderWmsEnrichment = {\n _wms: {\n assignedWarehouseId: string | null\n assignedWarehouseName: string | null\n isExplicitlyAssigned: boolean\n stockSummary: Array<{\n catalogVariantId: string\n available: string\n reserved: string\n }>\n reservationSummary: {\n status: ReservationStatus\n reservationIds: string[]\n }\n }\n}\n\ntype CatalogWmsEnrichment = {\n _wms: {\n inventoryProfile: InventoryProfileSummary | null\n stockSummary: StockSummaryItem[]\n reorderStatus: ReorderStatus\n }\n}\n\ntype EnricherScope = EnricherContext & { em: EntityManager }\ntype Scope = { organizationId: string; tenantId: string }\ntype BalanceAggregate = { onHand: number; reserved: number; allocated: number; available: number }\n\nimport { resolveWmsIntegrationToggleEnabled } from '../lib/wmsIntegrationToggles'\nconst EMPTY_ENRICHMENT: SalesOrderWmsEnrichment = {\n _wms: {\n assignedWarehouseId: null,\n assignedWarehouseName: null,\n isExplicitlyAssigned: false,\n stockSummary: [],\n reservationSummary: {\n status: 'unreserved',\n reservationIds: [],\n },\n },\n}\n\nconst EMPTY_CATALOG_ENRICHMENT: CatalogWmsEnrichment = {\n _wms: {\n inventoryProfile: null,\n stockSummary: [],\n reorderStatus: {\n state: 'no_profile',\n available: '0',\n reorderPoint: '0',\n safetyStock: '0',\n },\n },\n}\n\nfunction extractRecordId(record: SalesOrderRecord): string | null {\n return typeof record.id === 'string' && record.id.trim().length > 0 ? record.id : null\n}\n\nfunction extractOrderIdFromLine(line: SalesOrderLineRow): string | null {\n return typeof line.order_id === 'string' && line.order_id.length > 0 ? line.order_id : null\n}\n\nfunction extractProductIdFromVariant(variant: CatalogVariantRow): string | null {\n return typeof variant.product_id === 'string' && variant.product_id.length > 0\n ? variant.product_id\n : null\n}\n\nfunction extractWarehouseId(reservation: InventoryReservation): string | null {\n const relation = reservation.warehouse as { id?: string } | undefined\n return typeof relation?.id === 'string' ? relation.id : null\n}\n\nfunction addToMap(map: Map<string, number>, key: string, value: string | number | null | undefined) {\n const numeric = typeof value === 'number' ? value : Number(value ?? 0)\n map.set(key, (map.get(key) ?? 0) + numeric)\n}\n\nfunction formatQuantity(value: number): string {\n if (!Number.isFinite(value) || value === 0) return '0'\n const normalized = value.toFixed(4).replace(/\\.?0+$/, '')\n return normalized.length > 0 ? normalized : '0'\n}\n\nfunction toInventoryProfileSummary(profile: ProductInventoryProfile): InventoryProfileSummary {\n return {\n profileId: profile.id,\n catalogProductId: profile.catalogProductId,\n catalogVariantId: profile.catalogVariantId ?? null,\n defaultUom: profile.defaultUom,\n defaultStrategy: profile.defaultStrategy,\n trackLot: profile.trackLot,\n trackSerial: profile.trackSerial,\n trackExpiration: profile.trackExpiration,\n reorderPoint: profile.reorderPoint,\n safetyStock: profile.safetyStock,\n }\n}\n\nfunction resolveReservationStatus(requiredQuantity: number, reservedQuantity: number): ReservationStatus {\n if (requiredQuantity <= 0 || reservedQuantity <= 0) return 'unreserved'\n if (reservedQuantity + 0.0001 < requiredQuantity) return 'partially_reserved'\n return 'fully_reserved'\n}\n\nfunction resolveReorderStatus(\n availableQuantity: number,\n profile: ProductInventoryProfile | null | undefined,\n): ReorderStatus {\n if (!profile) {\n return {\n state: 'no_profile',\n available: formatQuantity(availableQuantity),\n reorderPoint: '0',\n safetyStock: '0',\n }\n }\n\n const reorderPoint = Number(profile.reorderPoint)\n const safetyStock = Number(profile.safetyStock)\n let state: ReorderState = 'healthy'\n\n if (availableQuantity <= safetyStock) {\n state = 'below_safety_stock'\n } else if (availableQuantity <= reorderPoint) {\n state = 'below_reorder_point'\n }\n\n return {\n state,\n available: formatQuantity(availableQuantity),\n reorderPoint: profile.reorderPoint,\n safetyStock: profile.safetyStock,\n }\n}\n\nfunction buildBalanceSummaryByVariant(\n balances: InventoryBalance[],\n): Map<string, BalanceAggregate> {\n const byVariant = new Map<string, BalanceAggregate>()\n\n for (const balance of balances) {\n const current = byVariant.get(balance.catalogVariantId) ?? {\n onHand: 0,\n reserved: 0,\n allocated: 0,\n available: 0,\n }\n\n current.onHand += Number(balance.quantityOnHand)\n current.reserved += Number(balance.quantityReserved)\n current.allocated += Number(balance.quantityAllocated)\n current.available +=\n Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated)\n\n byVariant.set(balance.catalogVariantId, current)\n }\n\n return byVariant\n}\n\nfunction buildStockSummaryItem(\n catalogVariantId: string,\n aggregate: BalanceAggregate | undefined,\n): StockSummaryItem {\n return {\n catalogVariantId,\n onHand: formatQuantity(aggregate?.onHand ?? 0),\n reserved: formatQuantity(aggregate?.reserved ?? 0),\n allocated: formatQuantity(aggregate?.allocated ?? 0),\n available: formatQuantity(aggregate?.available ?? 0),\n }\n}\n\nasync function isSalesOrderInventoryEnabled(context: EnricherContext): Promise<boolean> {\n const container = context.container as { resolve?: (name: string) => unknown } | undefined\n if (!container?.resolve) return true\n try {\n const featureTogglesService = container.resolve('featureTogglesService') as FeatureTogglesService | undefined\n const em = container.resolve('em') as EntityManager | undefined\n if (!featureTogglesService || !em) return true\n return resolveWmsIntegrationToggleEnabled(\n featureTogglesService,\n em,\n 'wms_integration_sales_order_inventory',\n context.tenantId,\n )\n } catch {\n return true\n }\n}\n\nasync function loadExplicitAssignments(\n em: EntityManager,\n orderIds: string[],\n scope: Scope,\n): Promise<SalesOrderWarehouseAssignment[]> {\n if (orderIds.length === 0) return []\n return findWithDecryption(\n em,\n SalesOrderWarehouseAssignment,\n {\n salesOrderId: { $in: orderIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadWarehousesByIds(\n em: EntityManager,\n warehouseIds: string[],\n scope: Scope,\n): Promise<Warehouse[]> {\n if (warehouseIds.length === 0) return []\n return findWithDecryption(\n em,\n Warehouse,\n {\n id: { $in: warehouseIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadOrderLines(\n context: EnricherContext,\n orderIds: string[],\n scope: Scope,\n): Promise<SalesOrderLineRow[]> {\n if (orderIds.length === 0) return []\n // Read sales order lines via QueryEngine instead of importing the sales ORM\n // entity. Keeps the WMS module decoupled from sales internals; queryEngine\n // resolves the base table via Mikro-ORM metadata.\n const container = context.container as { resolve: (name: string) => unknown }\n const queryEngine = container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<SalesOrderLineRow>(E.sales.sales_order_line, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n filters: { order_id: { $in: orderIds } },\n fields: ['id', 'order_id', 'product_variant_id', 'quantity', 'line_number', 'status'],\n sort: [{ field: 'line_number', dir: 'asc' as never }],\n page: { page: 1, pageSize: 5000 },\n })\n return result.items\n}\n\nasync function loadReservations(\n em: EntityManager,\n orderIds: string[],\n scope: Scope,\n): Promise<InventoryReservation[]> {\n if (orderIds.length === 0) return []\n return findWithDecryption(\n em,\n InventoryReservation,\n {\n sourceType: 'order',\n sourceId: { $in: orderIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n { orderBy: { createdAt: 'asc' } },\n scope,\n )\n}\n\nasync function loadBalances(\n em: EntityManager,\n variantIds: string[],\n scope: Scope,\n): Promise<InventoryBalance[]> {\n if (variantIds.length === 0) return []\n return findWithDecryption(\n em,\n InventoryBalance,\n {\n catalogVariantId: { $in: variantIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadCatalogVariants(\n context: EnricherContext,\n productIds: string[],\n scope: Scope,\n): Promise<CatalogVariantRow[]> {\n if (productIds.length === 0) return []\n const container = context.container as { resolve: (name: string) => unknown }\n const queryEngine = container.resolve('queryEngine') as QueryEngine\n const result = await queryEngine.query<CatalogVariantRow>(E.catalog.catalog_product_variant, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n filters: { product_id: { $in: productIds } },\n fields: ['id', 'product_id'],\n sort: [{ field: 'created_at', dir: 'asc' as never }],\n page: { page: 1, pageSize: 5000 },\n })\n return result.items\n}\n\nasync function loadProductInventoryProfiles(\n em: EntityManager,\n productIds: string[],\n scope: Scope,\n): Promise<ProductInventoryProfile[]> {\n if (productIds.length === 0) return []\n return findWithDecryption(\n em,\n ProductInventoryProfile,\n {\n catalogProductId: { $in: productIds },\n catalogVariantId: null,\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nasync function loadVariantInventoryProfiles(\n em: EntityManager,\n variantIds: string[],\n scope: Scope,\n): Promise<ProductInventoryProfile[]> {\n if (variantIds.length === 0) return []\n return findWithDecryption(\n em,\n ProductInventoryProfile,\n {\n catalogVariantId: { $in: variantIds },\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nconst salesOrderInventoryEnricher: ResponseEnricher<SalesOrderRecord, SalesOrderWmsEnrichment> = {\n id: 'wms.sales-order-inventory',\n targetEntity: E.sales.sales_order,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<SalesOrderRecord & SalesOrderWmsEnrichment>\n const enabled = await isSalesOrderInventoryEnabled(context)\n if (!enabled) return records as Array<SalesOrderRecord & SalesOrderWmsEnrichment>\n\n const orderIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (orderIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const lines = await loadOrderLines(context, orderIds, scope)\n\n const variantIds = Array.from(\n new Set(\n lines\n .map((line) => line.product_variant_id)\n .filter((value): value is string => typeof value === 'string' && value.length > 0),\n ),\n )\n\n const [reservations, balances, primaryWarehouseId, explicitAssignments] = await Promise.all([\n loadReservations(em, orderIds, scope),\n loadBalances(em, variantIds, scope),\n resolvePrimaryWarehouseId(em, scope),\n loadExplicitAssignments(em, orderIds, scope),\n ])\n\n const explicitWarehouseIdsByOrder = new Map<string, string>()\n for (const assignment of explicitAssignments) {\n const warehouseRel = assignment.warehouse as { id?: string } | undefined\n const warehouseId = warehouseRel?.id\n if (warehouseId) {\n explicitWarehouseIdsByOrder.set(assignment.salesOrderId, warehouseId)\n }\n }\n\n const reservationWarehouseIds = reservations\n .map(extractWarehouseId)\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n const allRelevantWarehouseIds = Array.from(\n new Set([\n ...Array.from(explicitWarehouseIdsByOrder.values()),\n ...reservationWarehouseIds,\n ...(primaryWarehouseId ? [primaryWarehouseId] : []),\n ]),\n )\n const warehouses = await loadWarehousesByIds(em, allRelevantWarehouseIds, scope)\n const warehouseNamesById = new Map(warehouses.map((w) => [w.id, w.name]))\n\n const variantAvailability = new Map<string, number>()\n const variantReserved = new Map<string, number>()\n for (const balance of balances) {\n addToMap(\n variantAvailability,\n balance.catalogVariantId,\n Number(balance.quantityOnHand) - Number(balance.quantityReserved) - Number(balance.quantityAllocated),\n )\n addToMap(variantReserved, balance.catalogVariantId, balance.quantityReserved)\n }\n\n const variantOrderBySalesOrder = new Map<string, string[]>()\n const requiredBySalesOrder = new Map<string, number>()\n\n for (const line of lines) {\n const orderId = extractOrderIdFromLine(line)\n const variantId = line.product_variant_id ?? null\n if (!orderId || !variantId) continue\n\n const variantOrder = variantOrderBySalesOrder.get(orderId) ?? []\n if (!variantOrder.includes(variantId)) {\n variantOrder.push(variantId)\n variantOrderBySalesOrder.set(orderId, variantOrder)\n }\n requiredBySalesOrder.set(orderId, (requiredBySalesOrder.get(orderId) ?? 0) + Number(line.quantity))\n }\n\n const activeReservationsBySalesOrder = new Map<string, InventoryReservation[]>()\n const reservedBySalesOrder = new Map<string, number>()\n\n for (const reservation of reservations) {\n if (reservation.status !== 'active') continue\n const orderId = reservation.sourceId\n const activeReservations = activeReservationsBySalesOrder.get(orderId) ?? []\n activeReservations.push(reservation)\n activeReservationsBySalesOrder.set(orderId, activeReservations)\n reservedBySalesOrder.set(orderId, (reservedBySalesOrder.get(orderId) ?? 0) + Number(reservation.quantity))\n }\n\n return records.map((record) => {\n const orderId = extractRecordId(record)\n if (!orderId) {\n return { ...record, ...EMPTY_ENRICHMENT }\n }\n\n const reservationsForOrder = activeReservationsBySalesOrder.get(orderId) ?? []\n const warehouseIds = Array.from(\n new Set(\n reservationsForOrder\n .map(extractWarehouseId)\n .filter((value): value is string => typeof value === 'string' && value.length > 0),\n ),\n )\n const variantIdsForOrder = variantOrderBySalesOrder.get(orderId) ?? []\n\n const explicitWarehouseId = explicitWarehouseIdsByOrder.get(orderId) ?? null\n const isExplicitlyAssigned = explicitWarehouseId !== null\n\n let assignedWarehouseId: string | null\n if (isExplicitlyAssigned) {\n assignedWarehouseId = explicitWarehouseId\n } else if (warehouseIds.length === 1) {\n assignedWarehouseId = warehouseIds[0]\n } else if (warehouseIds.length === 0 && primaryWarehouseId) {\n assignedWarehouseId = primaryWarehouseId\n } else {\n assignedWarehouseId = null\n }\n\n const assignedWarehouseName = assignedWarehouseId\n ? (warehouseNamesById.get(assignedWarehouseId) ?? null)\n : null\n\n return {\n ...record,\n _wms: {\n assignedWarehouseId,\n assignedWarehouseName,\n isExplicitlyAssigned,\n stockSummary: variantIdsForOrder.map((catalogVariantId) => ({\n catalogVariantId,\n available: formatQuantity(variantAvailability.get(catalogVariantId) ?? 0),\n reserved: formatQuantity(variantReserved.get(catalogVariantId) ?? 0),\n })),\n reservationSummary: {\n status: resolveReservationStatus(\n requiredBySalesOrder.get(orderId) ?? 0,\n reservedBySalesOrder.get(orderId) ?? 0,\n ),\n reservationIds: reservationsForOrder.map((reservation) => reservation.id),\n },\n },\n }\n })\n },\n}\n\nconst catalogProductInventoryEnricher: ResponseEnricher<CatalogProductRecord, CatalogWmsEnrichment> = {\n id: 'wms.catalog-product-inventory',\n targetEntity: E.catalog.catalog_product,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_CATALOG_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<CatalogProductRecord & CatalogWmsEnrichment>\n\n const productIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (productIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const variants = await loadCatalogVariants(context, productIds, scope)\n const variantIds = variants\n .map((variant) => variant.id)\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n const [productProfiles, balances] = await Promise.all([\n loadProductInventoryProfiles(em, productIds, scope),\n loadBalances(em, variantIds, scope),\n ])\n\n const profileByProductId = new Map(\n productProfiles.map((profile) => [profile.catalogProductId, profile] as const),\n )\n const balanceByVariantId = buildBalanceSummaryByVariant(balances)\n const variantIdsByProductId = new Map<string, string[]>()\n\n for (const variant of variants) {\n const productId = extractProductIdFromVariant(variant)\n if (!productId || typeof variant.id !== 'string') continue\n const entries = variantIdsByProductId.get(productId) ?? []\n entries.push(variant.id)\n variantIdsByProductId.set(productId, entries)\n }\n\n return records.map((record) => {\n const productId = extractRecordId(record)\n if (!productId) {\n return { ...record, ...EMPTY_CATALOG_ENRICHMENT }\n }\n\n const profile = profileByProductId.get(productId) ?? null\n const stockSummary = (variantIdsByProductId.get(productId) ?? []).map((variantId) =>\n buildStockSummaryItem(variantId, balanceByVariantId.get(variantId)),\n )\n const totalAvailable = stockSummary.reduce(\n (sum, item) => sum + Number(item.available),\n 0,\n )\n\n return {\n ...record,\n _wms: {\n inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,\n stockSummary,\n reorderStatus: resolveReorderStatus(totalAvailable, profile),\n },\n }\n })\n },\n}\n\nconst catalogVariantInventoryEnricher: ResponseEnricher<CatalogVariantRecord, CatalogWmsEnrichment> = {\n id: 'wms.catalog-variant-inventory',\n targetEntity: E.catalog.catalog_product_variant,\n features: ['wms.view'],\n priority: 40,\n timeout: 2000,\n fallback: EMPTY_CATALOG_ENRICHMENT,\n\n async enrichOne(record, context: EnricherScope) {\n return (await this.enrichMany!([record], context))[0]\n },\n\n async enrichMany(records, context: EnricherScope) {\n if (records.length === 0) return records as Array<CatalogVariantRecord & CatalogWmsEnrichment>\n\n const variantIds = records\n .map(extractRecordId)\n .filter((value): value is string => Boolean(value))\n\n if (variantIds.length === 0) {\n return records.map((record) => ({ ...record, ...EMPTY_CATALOG_ENRICHMENT }))\n }\n\n const em = context.em.fork()\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n\n const [profiles, balances] = await Promise.all([\n loadVariantInventoryProfiles(em, variantIds, scope),\n loadBalances(em, variantIds, scope),\n ])\n\n const profileByVariantId = new Map(\n profiles\n .filter((profile): profile is ProductInventoryProfile & { catalogVariantId: string } => typeof profile.catalogVariantId === 'string')\n .map((profile) => [profile.catalogVariantId, profile] as const),\n )\n const balanceByVariantId = buildBalanceSummaryByVariant(balances)\n\n return records.map((record) => {\n const variantId = extractRecordId(record)\n if (!variantId) {\n return { ...record, ...EMPTY_CATALOG_ENRICHMENT }\n }\n\n const profile = profileByVariantId.get(variantId) ?? null\n const stockSummary = [buildStockSummaryItem(variantId, balanceByVariantId.get(variantId))]\n\n return {\n ...record,\n _wms: {\n inventoryProfile: profile ? toInventoryProfileSummary(profile) : null,\n stockSummary,\n reorderStatus: resolveReorderStatus(Number(stockSummary[0]?.available ?? 0), profile),\n },\n }\n })\n },\n}\n\nexport const enrichers: ResponseEnricher[] = [\n salesOrderInventoryEnricher,\n catalogProductInventoryEnricher,\n catalogVariantInventoryEnricher,\n]\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|