@open-mercato/core 0.6.7-develop.6661.1.0043ed1d03 → 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/customer_accounts/migrations/Migration20260724120000_customer_accounts.js +56 -0
- package/dist/modules/customer_accounts/migrations/Migration20260724120000_customer_accounts.js.map +7 -0
- package/dist/modules/directory/api/organizations/route.js +1 -1
- package/dist/modules/directory/api/organizations/route.js.map +1 -1
- package/dist/modules/entities/api/definitions.js +2 -0
- package/dist/modules/entities/api/definitions.js.map +2 -2
- package/dist/modules/entities/lib/helpers.js +1 -0
- package/dist/modules/entities/lib/helpers.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/api/quotes/accept/route.js +7 -2
- package/dist/modules/sales/api/quotes/accept/route.js.map +2 -2
- package/dist/modules/sales/api/quotes/public/[token]/route.js +2 -1
- package/dist/modules/sales/api/quotes/public/[token]/route.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/lib/publicQuoteTenantScope.js +24 -0
- package/dist/modules/sales/lib/publicQuoteTenantScope.js.map +7 -0
- 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/customer_accounts/migrations/Migration20260724120000_customer_accounts.ts +96 -0
- package/src/modules/directory/api/organizations/route.ts +1 -1
- package/src/modules/entities/api/definitions.ts +2 -0
- package/src/modules/entities/lib/helpers.ts +1 -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/api/quotes/accept/route.ts +9 -2
- package/src/modules/sales/api/quotes/public/[token]/route.ts +2 -1
- 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/lib/publicQuoteTenantScope.ts +49 -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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/wms/components/backend/inventoryMutationLoaders.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport {\n buildQuery,\n loadCatalogVariantOptions,\n loadWarehouseOptions,\n} from './wmsLookupLoaders'\n\nexport { buildQuery, loadCatalogVariantOptions, loadWarehouseOptions }\n\ntype PagedResponse<T> = {\n items: T[]\n total: number\n totalPages: number\n}\n\ntype InventoryLotListRow = {\n id?: string | null\n lot_number?: string | null\n expires_at?: string | null\n}\n\nasync function loadCrudOptionsByIds<T>(\n endpoint: string,\n ids: string[],\n mapItem: (item: T) => CrudFieldOption | null,\n): Promise<CrudFieldOption[]> {\n const normalizedIds = [...new Set(ids.map((id) => id.trim()).filter(Boolean))]\n if (normalizedIds.length === 0) return []\n const params = buildQuery({\n page: 1,\n pageSize: normalizedIds.length,\n ids: normalizedIds.join(','),\n })\n const call = await apiCall<PagedResponse<T>>(`${endpoint}?${params}`)\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map(mapItem)\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\nexport async function resolveCatalogVariantLabel(catalogVariantId: string): Promise<string | null> {\n const id = catalogVariantId.trim()\n if (!id) return null\n const params = buildQuery({ page: 1, pageSize: 1, id })\n const call = await apiCall<PagedResponse<{ id?: string | null; name?: string | null; sku?: string | null }>>(\n `/api/catalog/variants?${params}`,\n )\n if (!call.ok) return null\n const item = call.result?.items?.[0]\n if (!item) return null\n return item.sku?.trim() || item.name?.trim() || id\n}\n\nexport async function resolveWarehouseLabel(warehouseId: string): Promise<string | null> {\n const [option] = await loadCrudOptionsByIds<{ id?: string | null; name?: string | null; code?: string | null }>(\n '/api/wms/warehouses',\n [warehouseId],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n return { value, label: item.name || item.code || value }\n },\n )\n return option?.label ?? null\n}\n\nexport async function resolveLocationLabel(locationId: string): Promise<string | null> {\n const [option] = await loadCrudOptionsByIds<{ id?: string | null; code?: string | null }>(\n '/api/wms/locations',\n [locationId],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n return { value, label: item.code || value }\n },\n )\n return option?.label ?? null\n}\n\nexport async function resolveLotLabel(lotId: string): Promise<string | null> {\n const [option] = await loadCrudOptionsByIds<InventoryLotListRow>(\n '/api/wms/lots',\n [lotId],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const lotNumber = item.lot_number?.trim() || value\n const expiresAt = item.expires_at?.trim()\n const label = expiresAt ? `${lotNumber} \u00B7 exp ${expiresAt.slice(0, 10)}` : lotNumber\n return { value, label }\n },\n )\n return option?.label ?? null\n}\n\nexport async function resolveLotNumberFromId(lotId: string): Promise<string | null> {\n const [option] = await loadCrudOptionsByIds<InventoryLotListRow>(\n '/api/wms/lots',\n [lotId],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n const lotNumber = item.lot_number?.trim()\n if (!value || !lotNumber) return null\n return { value, label: lotNumber }\n },\n )\n return option?.label ?? null\n}\n\nexport async function resolveCatalogVariantSku(catalogVariantId: string): Promise<string | null> {\n const id = catalogVariantId.trim()\n if (!id) return null\n const params = buildQuery({ page: 1, pageSize: 1, id })\n const call = await apiCall<PagedResponse<{ id?: string | null; sku?: string | null }>>(\n `/api/catalog/variants?${params}`,\n )\n if (!call.ok) return null\n const sku = call.result?.items?.[0]?.sku?.trim()\n return sku || null\n}\n\ntype InventoryProfileListRow = {\n track_lot?: boolean | null\n track_serial?: boolean | null\n}\n\nexport async function loadInventoryProfileForVariant(\n catalogVariantId: string,\n): Promise<InventoryProfileListRow | null> {\n const variantId = catalogVariantId.trim()\n if (!variantId) return null\n const params = buildQuery({ page: 1, pageSize: 1, catalogVariantId: variantId })\n const call = await apiCall<PagedResponse<InventoryProfileListRow>>(\n `/api/wms/inventory-profiles?${params}`,\n )\n if (!call.ok) return null\n return call.result?.items?.[0] ?? null\n}\n\nexport async function findLotIdByNumber(\n catalogVariantId: string,\n lotNumber: string,\n): Promise<string | null> {\n const variantId = catalogVariantId.trim()\n const normalizedLotNumber = lotNumber.trim()\n if (!variantId || !normalizedLotNumber) return null\n\n const params = buildQuery({\n page: 1,\n pageSize: 20,\n catalogVariantId: variantId,\n search: normalizedLotNumber,\n })\n const call = await apiCall<PagedResponse<InventoryLotListRow>>(`/api/wms/lots?${params}`)\n if (!call.ok) return null\n\n const match = (call.result?.items ?? []).find(\n (item) => item.lot_number?.trim().toLowerCase() === normalizedLotNumber.toLowerCase(),\n )\n return typeof match?.id === 'string' ? match.id : null\n}\n\nexport class InventoryLotMutationError extends Error {\n constructor(message = 'Failed to resolve inventory lot.') {\n super(message)\n this.name = 'InventoryLotMutationError'\n }\n}\n\nexport async function ensureLotIdForInventoryMutation(input: {\n catalogVariantId: string\n lotNumber: string\n organizationId: string\n tenantId: string\n}): Promise<string> {\n const lotNumber = input.lotNumber.trim()\n if (!lotNumber) {\n throw new InventoryLotMutationError('Lot number is required.')\n }\n\n const existingId = await findLotIdByNumber(input.catalogVariantId, lotNumber)\n if (existingId) return existingId\n\n const sku = await resolveCatalogVariantSku(input.catalogVariantId)\n if (!sku) {\n throw new InventoryLotMutationError('Could not resolve SKU for the selected variant.')\n }\n\n const call = await apiCall<{ id?: string | null }>('/api/wms/lots', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n catalogVariantId: input.catalogVariantId,\n sku,\n lotNumber,\n status: 'available',\n }),\n })\n\n if (!call.ok) {\n const racedId = await findLotIdByNumber(input.catalogVariantId, lotNumber)\n if (racedId) return racedId\n throw new InventoryLotMutationError('Failed to create inventory lot.')\n }\n\n const createdId = call.result?.id?.trim()\n if (createdId) return createdId\n\n const resolvedId = await findLotIdByNumber(input.catalogVariantId, lotNumber)\n if (resolvedId) return resolvedId\n\n throw new InventoryLotMutationError('Failed to resolve created inventory lot.')\n}\n\ntype LocationListRow = {\n id?: string | null\n code?: string | null\n type?: string | null\n}\n\ntype ZoneListRow = {\n id?: string | null\n name?: string | null\n code?: string | null\n warehouse_id?: string | null\n warehouseId?: string | null\n}\n\nexport type ZoneCrudFieldOption = CrudFieldOption & {\n warehouseId?: string\n}\n\nfunction readZoneWarehouseId(item: ZoneListRow): string | null {\n if (typeof item.warehouse_id === 'string' && item.warehouse_id.trim()) {\n return item.warehouse_id.trim()\n }\n if (typeof item.warehouseId === 'string' && item.warehouseId.trim()) {\n return item.warehouseId.trim()\n }\n return null\n}\n\ntype AuthUserListRow = {\n id?: string | null\n email?: string | null\n roles?: string[] | null\n}\n\nexport type AssigneeOptionsResult = {\n options: CrudFieldOption[]\n canListUsers: boolean\n}\n\nexport type BalanceLookupErrorCode = 'LOOKUP_FAILED' | 'LOT_REQUIRED' | 'LOT_NOT_FOUND'\n\nexport class BalanceLookupError extends Error {\n code: BalanceLookupErrorCode\n /** Lot IDs present at the ambiguous location (set when `code === 'LOT_REQUIRED'`). */\n candidateLotIds: string[]\n\n constructor(\n message = 'Failed to load inventory balance.',\n code: BalanceLookupErrorCode = 'LOOKUP_FAILED',\n candidateLotIds: string[] = [],\n ) {\n super(message)\n this.name = 'BalanceLookupError'\n this.code = code\n this.candidateLotIds = candidateLotIds\n }\n}\n\nexport class ScopeEstimateError extends Error {\n constructor(message = 'Failed to estimate cycle count scope.') {\n super(message)\n this.name = 'ScopeEstimateError'\n }\n}\n\nfunction compareLocationCodes(left: string, right: string): number {\n return left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' })\n}\n\nfunction isLocationCodeWithinRange(\n code: string,\n fromCode?: string | null,\n toCode?: string | null,\n): boolean {\n const from = fromCode?.trim()\n const to = toCode?.trim()\n if (from && compareLocationCodes(code, from) < 0) return false\n if (to && compareLocationCodes(code, to) > 0) return false\n return true\n}\n\nexport function formatCycleCountZoneLabel(\n baseLabel: string,\n stats?: { expectedSkus: number; binCount: number },\n): string {\n const trimmed = baseLabel.trim()\n if (!trimmed || !stats) return trimmed\n return `${trimmed} \u00B7 ${stats.expectedSkus} SKUs \u00B7 ${stats.binCount} bins`\n}\n\nexport function mapLocationOptions(items: LocationListRow[]): CrudFieldOption[] {\n return items\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const label = item.code || value\n return { value, label }\n })\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\nexport async function loadAllLocations(\n warehouseId: string,\n filters: { type?: string; search?: string },\n): Promise<LocationListRow[]> {\n const items: LocationListRow[] = []\n let page = 1\n let totalPages = 1\n\n while (page <= totalPages && page <= 10) {\n const params = buildQuery({\n page,\n pageSize: 100,\n warehouseId,\n type: filters.type,\n search: filters.search?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<LocationListRow>>(`/api/wms/locations?${params}`)\n if (!call.ok) break\n items.push(...(call.result?.items ?? []))\n totalPages = call.result?.totalPages ?? 1\n page += 1\n }\n\n return items\n}\n\nexport function filterLocationsByCodeRange(\n locations: LocationListRow[],\n fromCode?: string | null,\n toCode?: string | null,\n): LocationListRow[] {\n const from = fromCode?.trim()\n const to = toCode?.trim()\n if (!from && !to) return locations\n return locations.filter((location) => {\n const code = location.code?.trim()\n if (!code) return false\n return isLocationCodeWithinRange(code, from, to)\n })\n}\n\nasync function loadLocationPage(\n warehouseId: string,\n filters: { type?: string; search?: string; page?: number; pageSize?: number },\n): Promise<PagedResponse<LocationListRow>> {\n const params = buildQuery({\n page: filters.page ?? 1,\n pageSize: filters.pageSize ?? 50,\n warehouseId,\n type: filters.type,\n search: filters.search?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<LocationListRow>>(`/api/wms/locations?${params}`)\n if (!call.ok) {\n throw new BalanceLookupError('Failed to load warehouse locations.')\n }\n return call.result ?? { items: [], total: 0, totalPages: 0 }\n}\n\nexport async function loadLocationOptions(\n warehouseId: string,\n query?: string,\n): Promise<CrudFieldOption[]> {\n if (!warehouseId) return []\n try {\n const page = await loadLocationPage(warehouseId, { search: query })\n return mapLocationOptions(page.items ?? [])\n } catch {\n return []\n }\n}\n\nexport async function loadBinLocationOptions(\n warehouseId: string,\n query?: string,\n): Promise<CrudFieldOption[]> {\n if (!warehouseId) return []\n try {\n const page = await loadLocationPage(warehouseId, { type: 'bin', search: query })\n return mapLocationOptions(page.items ?? [])\n } catch {\n return []\n }\n}\n\nexport async function loadZoneOptions(\n warehouseId: string,\n query?: string,\n): Promise<ZoneCrudFieldOption[]> {\n const scopedWarehouseId = warehouseId.trim()\n if (!scopedWarehouseId) return []\n const params = buildQuery({\n page: 1,\n pageSize: 50,\n warehouseId: scopedWarehouseId,\n search: query?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<ZoneListRow>>(`/api/wms/zones?${params}`)\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const label = item.name?.trim() || item.code?.trim() || value\n const zoneWarehouseId = readZoneWarehouseId(item)\n return {\n value,\n label,\n ...(zoneWarehouseId ? { warehouseId: zoneWarehouseId } : {}),\n }\n })\n .filter((option): option is ZoneCrudFieldOption => option !== null)\n}\n\nexport async function resolveZoneLabel(zoneId: string): Promise<string | null> {\n const [option] = await loadCrudOptionsByIds<ZoneListRow>(\n '/api/wms/zones',\n [zoneId],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n return { value, label: item.name?.trim() || item.code?.trim() || value }\n },\n )\n return option?.label ?? null\n}\n\nexport async function resolveZoneWarehouseId(zoneId: string): Promise<string | null> {\n const id = zoneId.trim()\n if (!id) return null\n const [option] = await loadCrudOptionsByIds<ZoneListRow>(\n '/api/wms/zones',\n [id],\n (item) => {\n const value = typeof item.id === 'string' ? item.id : null\n const warehouseId = readZoneWarehouseId(item)\n if (!value || !warehouseId) return null\n return { value, label: warehouseId }\n },\n )\n return option?.label ?? null\n}\n\nexport async function loadAssigneeOptions(\n query?: string,\n fallback?: { userId: string; label: string },\n): Promise<AssigneeOptionsResult> {\n const fallbackUserId = fallback?.userId.trim()\n const fallbackLabel = fallback?.label.trim()\n const fallbackOption =\n fallbackUserId && fallbackLabel\n ? [{ value: fallbackUserId, label: fallbackLabel }]\n : []\n\n const params = buildQuery({\n page: 1,\n pageSize: 50,\n search: query?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<AuthUserListRow>>(`/api/auth/users?${params}`)\n if (!call.ok) {\n return {\n options: fallbackOption,\n canListUsers: false,\n }\n }\n\n const options = (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const email = item.email?.trim() || value\n const role = item.roles?.find((entry) => entry.trim().length > 0)?.trim()\n const label = role ? `${email} (${role})` : email\n return { value, label }\n })\n .filter((option): option is CrudFieldOption => option !== null)\n\n return {\n options,\n canListUsers: true,\n }\n}\n\nexport async function resolveAssigneeLabel(userId: string): Promise<string | null> {\n const params = buildQuery({ page: 1, pageSize: 1, id: userId.trim() })\n const call = await apiCall<PagedResponse<AuthUserListRow>>(`/api/auth/users?${params}`)\n if (!call.ok) return null\n const item = call.result?.items?.[0]\n if (!item?.id) return null\n const email = item.email?.trim() || item.id\n const role = item.roles?.find((entry) => entry.trim().length > 0)?.trim()\n return role ? `${email} (${role})` : email\n}\n\nexport async function fetchCycleCountScopeEstimate(input: {\n warehouseId: string\n fromLocationId?: string | null\n toLocationId?: string | null\n}): Promise<{ expectedSkus: number; binCount: number }> {\n const warehouseId = input.warehouseId.trim()\n if (!warehouseId) return { expectedSkus: 0, binCount: 0 }\n\n const bins = await loadAllLocations(warehouseId, { type: 'bin' })\n const locationById = new Map(\n bins\n .map((location) => {\n const id = location.id?.trim()\n return id ? [id, location] as const : null\n })\n .filter((entry): entry is readonly [string, LocationListRow] => entry !== null),\n )\n\n const fromCode = input.fromLocationId ? locationById.get(input.fromLocationId.trim())?.code : undefined\n const toCode = input.toLocationId ? locationById.get(input.toLocationId.trim())?.code : undefined\n const scopedBins = filterLocationsByCodeRange(bins, fromCode, toCode)\n const scopedBinIds = new Set(\n scopedBins.map((location) => location.id?.trim()).filter((id): id is string => Boolean(id)),\n )\n const binCount = scopedBinIds.size\n\n const variantIds = new Set<string>()\n let page = 1\n let totalPages = 1\n\n while (page <= totalPages && page <= 10) {\n const params = buildQuery({\n page,\n pageSize: 100,\n warehouseId,\n })\n const call = await apiCall<PagedResponse<{ catalog_variant_id?: string | null; location_id?: string | null; quantity_on_hand?: string | number | null }>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) {\n throw new ScopeEstimateError()\n }\n\n for (const row of call.result?.items ?? []) {\n const locationId = row.location_id?.trim()\n const variantId = row.catalog_variant_id?.trim()\n const onHand = Number(row.quantity_on_hand ?? 0)\n if (!locationId || !variantId || !Number.isFinite(onHand) || onHand <= 0) continue\n if (scopedBinIds.size > 0 && !scopedBinIds.has(locationId)) continue\n variantIds.add(variantId)\n }\n\n totalPages = call.result?.totalPages ?? 1\n page += 1\n }\n\n return { expectedSkus: variantIds.size, binCount }\n}\n\nexport type InventoryBalanceLookupRow = {\n lot_id?: string | null\n quantity_on_hand?: string | number | null\n quantity_available?: number | null\n}\n\nfunction normalizeBalanceLotId(value: string | null | undefined): string | null {\n const trimmed = value?.trim()\n return trimmed || null\n}\n\nfunction readBalanceAvailable(row: InventoryBalanceLookupRow): number {\n const available = Number(row.quantity_available ?? row.quantity_on_hand ?? 0)\n return Number.isFinite(available) ? available : 0\n}\n\nfunction selectBalanceLookupRow(\n items: InventoryBalanceLookupRow[],\n lotId?: string | null,\n): InventoryBalanceLookupRow | null {\n if (items.length === 0) return null\n if (items.length === 1) return items[0]\n\n const normalizedLotId = normalizeBalanceLotId(lotId)\n if (normalizedLotId) {\n const exactMatch = items.find(\n (row) => normalizeBalanceLotId(row.lot_id) === normalizedLotId,\n )\n if (exactMatch) return exactMatch\n throw new BalanceLookupError('No balance bucket matches the selected lot.', 'LOT_NOT_FOUND')\n }\n\n const withoutLot = items.filter((row) => !normalizeBalanceLotId(row.lot_id))\n if (withoutLot.length === 1) return withoutLot[0]\n\n const candidateLotIds = [\n ...new Set(\n items\n .map((row) => normalizeBalanceLotId(row.lot_id))\n .filter((id): id is string => Boolean(id)),\n ),\n ]\n throw new BalanceLookupError(\n 'Multiple balance buckets match this location; specify a lot.',\n 'LOT_REQUIRED',\n candidateLotIds,\n )\n}\n\nexport async function fetchBalanceAvailable(input: {\n warehouseId: string\n locationId: string\n catalogVariantId: string\n lotId?: string | null\n}): Promise<number> {\n const params = buildQuery({\n page: 1,\n pageSize: 20,\n warehouseId: input.warehouseId,\n locationId: input.locationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<InventoryBalanceLookupRow>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) {\n throw new BalanceLookupError()\n }\n const row = selectBalanceLookupRow(call.result?.items ?? [], input.lotId)\n if (!row) return 0\n return readBalanceAvailable(row)\n}\n\nfunction mapInventoryLotListRowToOption(item: InventoryLotListRow): CrudFieldOption | null {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const lotNumber = item.lot_number?.trim() || value\n const expiresAt = item.expires_at?.trim()\n const label = expiresAt ? `${lotNumber} \u00B7 exp ${expiresAt.slice(0, 10)}` : lotNumber\n return { value, label }\n}\n\nfunction mapInventoryLotListRowToLotNumberOption(item: InventoryLotListRow): CrudFieldOption | null {\n const lotNumber = item.lot_number?.trim()\n if (!lotNumber) return null\n const expiresAt = item.expires_at?.trim()\n const label = expiresAt ? `${lotNumber} \u00B7 exp ${expiresAt.slice(0, 10)}` : lotNumber\n return { value: lotNumber, label }\n}\n\nasync function loadInventoryLotListOptions(\n catalogVariantId: string,\n query: string | undefined,\n mapItem: (item: InventoryLotListRow) => CrudFieldOption | null,\n): Promise<CrudFieldOption[]> {\n if (!catalogVariantId) return []\n const params = buildQuery({\n page: 1,\n pageSize: 50,\n catalogVariantId,\n status: 'available',\n search: query?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<InventoryLotListRow>>(`/api/wms/lots?${params}`)\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map(mapItem)\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\nexport async function loadLotOptions(\n catalogVariantId: string,\n query?: string,\n): Promise<CrudFieldOption[]> {\n return loadInventoryLotListOptions(catalogVariantId, query, mapInventoryLotListRowToOption)\n}\n\n/** Resolve display options for known lot IDs (e.g. candidates from a LOT_REQUIRED balance lookup). */\nexport async function loadLotOptionsByIds(lotIds: string[]): Promise<CrudFieldOption[]> {\n return loadCrudOptionsByIds<InventoryLotListRow>(\n '/api/wms/lots',\n lotIds,\n mapInventoryLotListRowToOption,\n )\n}\n\n// Scopes lot suggestions to the lots actually present in the given warehouse\n// location's balance buckets, instead of every lot ever created for the\n// variant. This is what backs the LOT_REQUIRED disambiguation flow: when a\n// location holds multiple lot-bearing balances for the same variant, the\n// candidates offered here are exactly the ones `selectBalanceLookupRow` would\n// otherwise reject as ambiguous.\nexport async function loadLotOptionsForBalanceLocation(input: {\n warehouseId: string\n locationId: string\n catalogVariantId: string\n query?: string\n}): Promise<CrudFieldOption[]> {\n const warehouseId = input.warehouseId.trim()\n const locationId = input.locationId.trim()\n const catalogVariantId = input.catalogVariantId.trim()\n if (!warehouseId || !locationId || !catalogVariantId) return []\n\n const params = buildQuery({\n page: 1,\n pageSize: 50,\n warehouseId,\n locationId,\n catalogVariantId,\n })\n const call = await apiCall<PagedResponse<InventoryBalanceLookupRow>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) return []\n\n const lotIds = [\n ...new Set(\n (call.result?.items ?? [])\n .map((row) => normalizeBalanceLotId(row.lot_id))\n .filter((id): id is string => Boolean(id)),\n ),\n ]\n if (lotIds.length === 0) return []\n\n const options = await loadCrudOptionsByIds<InventoryLotListRow>(\n '/api/wms/lots',\n lotIds,\n mapInventoryLotListRowToOption,\n )\n\n const query = input.query?.trim().toLowerCase()\n if (!query) return options\n return options.filter((option) => option.label.toLowerCase().includes(query))\n}\n\nexport async function loadLotNumberOptions(\n catalogVariantId: string,\n query?: string,\n): Promise<CrudFieldOption[]> {\n return loadInventoryLotListOptions(catalogVariantId, query, mapInventoryLotListRowToLotNumberOption)\n}\n\nexport class ScopeQueueError extends Error {\n constructor(message = 'Failed to build cycle count scope queue.') {\n super(message)\n this.name = 'ScopeQueueError'\n }\n}\n\nexport type ScopeQueueItem = {\n locationId: string\n locationCode: string\n catalogVariantId: string\n lotId: string | null\n expectedOnHand: number\n}\n\nexport async function buildCycleCountScopeQueue(input: {\n warehouseId: string\n fromLocationId?: string | null\n toLocationId?: string | null\n}): Promise<ScopeQueueItem[]> {\n const warehouseId = input.warehouseId.trim()\n if (!warehouseId) return []\n\n const bins = await loadAllLocations(warehouseId, { type: 'bin' })\n const binById = new Map(\n bins\n .map((b) => {\n const id = b.id?.trim()\n return id ? ([id, b] as const) : null\n })\n .filter((entry): entry is readonly [string, LocationListRow] => entry !== null),\n )\n\n const fromCode = input.fromLocationId?.trim()\n ? binById.get(input.fromLocationId.trim())?.code\n : undefined\n const toCode = input.toLocationId?.trim()\n ? binById.get(input.toLocationId.trim())?.code\n : undefined\n\n const scopedBins = filterLocationsByCodeRange(bins, fromCode, toCode)\n const scopedBinIds = new Set(\n scopedBins.map((b) => b.id?.trim()).filter((id): id is string => Boolean(id)),\n )\n\n if (scopedBinIds.size === 0) return []\n\n type BalanceRow = {\n catalog_variant_id?: string | null\n location_id?: string | null\n lot_id?: string | null\n quantity_on_hand?: string | number | null\n }\n\n const items: ScopeQueueItem[] = []\n let page = 1\n let totalPages = 1\n\n while (page <= totalPages && page <= 20) {\n const params = buildQuery({ page, pageSize: 100, warehouseId })\n const call = await apiCall<PagedResponse<BalanceRow>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) throw new ScopeQueueError()\n\n for (const row of call.result?.items ?? []) {\n const locationId = row.location_id?.trim()\n const variantId = row.catalog_variant_id?.trim()\n const lotId = row.lot_id?.trim() || null\n const onHand = Number(row.quantity_on_hand ?? 0)\n\n if (!locationId || !variantId) continue\n if (!scopedBinIds.has(locationId)) continue\n if (!Number.isFinite(onHand) || onHand <= 0) continue\n\n const bin = binById.get(locationId)\n items.push({\n locationId,\n locationCode: bin?.code?.trim() ?? locationId,\n catalogVariantId: variantId,\n lotId,\n expectedOnHand: onHand,\n })\n }\n\n totalPages = call.result?.totalPages ?? 1\n page += 1\n }\n\n items.sort((a, b) => {\n const cmp = a.locationCode.localeCompare(b.locationCode, undefined, {\n numeric: true,\n sensitivity: 'base',\n })\n return cmp !== 0 ? cmp : a.catalogVariantId.localeCompare(b.catalogVariantId)\n })\n\n return items\n}\n\nexport async function fetchVariantReorderPoint(catalogVariantId: string): Promise<number> {\n if (!catalogVariantId) return 0\n const params = buildQuery({\n page: 1,\n pageSize: 1,\n catalogVariantId,\n })\n const call = await apiCall<PagedResponse<{ reorder_point?: string | number | null }>>(\n `/api/wms/inventory-profiles?${params}`,\n )\n if (!call.ok) return 0\n const row = call.result?.items?.[0]\n if (!row) return 0\n const reorderPoint = Number(row.reorder_point ?? 0)\n return Number.isFinite(reorderPoint) ? reorderPoint : 0\n}\n\nexport type LocationCapacitySnapshot = {\n capacityUnits: number | null\n totalOnHand: number\n}\n\nasync function fetchLocationCapacityUnits(locationId: string): Promise<number | null> {\n const id = locationId.trim()\n if (!id) return null\n const params = buildQuery({ page: 1, pageSize: 1, ids: id })\n const call = await apiCall<PagedResponse<{ id?: string | null; capacity_units?: string | number | null }>>(\n `/api/wms/locations?${params}`,\n )\n if (!call.ok) return null\n const raw = call.result?.items?.[0]?.capacity_units\n if (raw == null) return null\n const value = Number(raw)\n return Number.isFinite(value) ? value : null\n}\n\nconst LOCATION_TOTAL_ON_HAND_PAGE_SIZE = 100\nconst LOCATION_TOTAL_ON_HAND_MAX_PAGES = 50\n\nasync function fetchLocationTotalOnHand(input: {\n warehouseId: string\n locationId: string\n}): Promise<number> {\n const locationId = input.locationId.trim()\n if (!locationId) return 0\n let sum = 0\n let page = 1\n let totalPages = 1\n do {\n const params = buildQuery({\n page,\n pageSize: LOCATION_TOTAL_ON_HAND_PAGE_SIZE,\n warehouseId: input.warehouseId,\n locationId,\n })\n const call = await apiCall<PagedResponse<{ quantity_on_hand?: string | number | null }>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) break\n for (const row of call.result?.items ?? []) {\n const value = Number(row.quantity_on_hand ?? 0)\n if (Number.isFinite(value)) sum += value\n }\n totalPages = call.result?.totalPages ?? 1\n page += 1\n } while (page <= totalPages && page <= LOCATION_TOTAL_ON_HAND_MAX_PAGES)\n return sum\n}\n\nexport async function fetchLocationCapacitySnapshot(input: {\n warehouseId: string\n locationId: string\n}): Promise<LocationCapacitySnapshot> {\n const [capacityUnits, totalOnHand] = await Promise.all([\n fetchLocationCapacityUnits(input.locationId),\n fetchLocationTotalOnHand(input),\n ])\n return { capacityUnits, totalOnHand }\n}\n\nexport async function fetchBalanceOnHand(input: {\n warehouseId: string\n locationId: string\n catalogVariantId: string\n lotId?: string | null\n}): Promise<number> {\n const params = buildQuery({\n page: 1,\n pageSize: 20,\n warehouseId: input.warehouseId,\n locationId: input.locationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId?.trim() || undefined,\n })\n const call = await apiCall<PagedResponse<InventoryBalanceLookupRow>>(\n `/api/wms/inventory/balances?${params}`,\n )\n if (!call.ok) {\n throw new BalanceLookupError()\n }\n const row = selectBalanceLookupRow(call.result?.items ?? [], input.lotId)\n if (!row) return 0\n const onHand = Number(row.quantity_on_hand ?? 0)\n return Number.isFinite(onHand) ? onHand : 0\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
4
|
+
import { useOrganizationScopeDetail } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
|
|
5
|
+
import { hasFeature } from "@open-mercato/shared/security/features";
|
|
6
|
+
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
7
|
+
const logger = createLogger("wms");
|
|
8
|
+
function useWmsInventoryMutationAccess() {
|
|
9
|
+
const { organizationId, tenantId } = useOrganizationScopeDetail();
|
|
10
|
+
const [granted, setGranted] = React.useState([]);
|
|
11
|
+
const [userId, setUserId] = React.useState(null);
|
|
12
|
+
const [loading, setLoading] = React.useState(true);
|
|
13
|
+
React.useEffect(() => {
|
|
14
|
+
let cancelled = false;
|
|
15
|
+
setLoading(true);
|
|
16
|
+
async function load() {
|
|
17
|
+
try {
|
|
18
|
+
const call = await apiCall("/api/auth/feature-check", {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: { "content-type": "application/json" },
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
features: [
|
|
23
|
+
"wms.adjust_inventory",
|
|
24
|
+
"wms.manage_inventory",
|
|
25
|
+
"wms.receive_inventory",
|
|
26
|
+
"wms.cycle_count",
|
|
27
|
+
"wms.import",
|
|
28
|
+
"wms.manage_reservations",
|
|
29
|
+
"wms.manage_locations",
|
|
30
|
+
"wms.manage_warehouses",
|
|
31
|
+
"wms.manage_zones"
|
|
32
|
+
]
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
if (!cancelled) {
|
|
36
|
+
setGranted(Array.isArray(call.result?.granted) ? call.result.granted : []);
|
|
37
|
+
setUserId(typeof call.result?.userId === "string" ? call.result.userId : null);
|
|
38
|
+
}
|
|
39
|
+
} catch (error) {
|
|
40
|
+
logger.error("feature check failed", { component: "useWmsInventoryMutationAccess", err: error });
|
|
41
|
+
if (!cancelled) {
|
|
42
|
+
setGranted([]);
|
|
43
|
+
setUserId(null);
|
|
44
|
+
}
|
|
45
|
+
} finally {
|
|
46
|
+
if (!cancelled) setLoading(false);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
void load();
|
|
50
|
+
return () => {
|
|
51
|
+
cancelled = true;
|
|
52
|
+
};
|
|
53
|
+
}, [organizationId, tenantId]);
|
|
54
|
+
const scopeReady = Boolean(organizationId && tenantId && userId);
|
|
55
|
+
return {
|
|
56
|
+
loading,
|
|
57
|
+
organizationId,
|
|
58
|
+
tenantId,
|
|
59
|
+
userId,
|
|
60
|
+
scopeReady,
|
|
61
|
+
canAdjust: hasFeature(granted, "wms.adjust_inventory"),
|
|
62
|
+
canManage: hasFeature(granted, "wms.manage_inventory"),
|
|
63
|
+
canReceive: hasFeature(granted, "wms.receive_inventory"),
|
|
64
|
+
canCycleCount: hasFeature(granted, "wms.cycle_count"),
|
|
65
|
+
canImport: hasFeature(granted, "wms.import"),
|
|
66
|
+
canMove: hasFeature(granted, "wms.adjust_inventory"),
|
|
67
|
+
canRelease: hasFeature(granted, "wms.manage_reservations"),
|
|
68
|
+
canReserve: hasFeature(granted, "wms.manage_reservations"),
|
|
69
|
+
canAllocate: hasFeature(granted, "wms.manage_reservations"),
|
|
70
|
+
canManageLocations: hasFeature(granted, "wms.manage_locations"),
|
|
71
|
+
canManageWarehouses: hasFeature(granted, "wms.manage_warehouses"),
|
|
72
|
+
canManageZones: hasFeature(granted, "wms.manage_zones"),
|
|
73
|
+
canManageLots: hasFeature(granted, "wms.manage_inventory")
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
useWmsInventoryMutationAccess
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=useWmsInventoryMutationAccess.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeDetail } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('wms')\n\ntype FeatureCheckResponse = {\n ok?: boolean\n granted?: string[]\n userId?: string\n}\n\nexport type WmsInventoryMutationAccess = ReturnType<typeof useWmsInventoryMutationAccess>\n\nexport function useWmsInventoryMutationAccess() {\n const { organizationId, tenantId } = useOrganizationScopeDetail()\n const [granted, setGranted] = React.useState<string[]>([])\n const [userId, setUserId] = React.useState<string | null>(null)\n const [loading, setLoading] = React.useState(true)\n\n React.useEffect(() => {\n let cancelled = false\n setLoading(true)\n async function load() {\n try {\n const call = await apiCall<FeatureCheckResponse>('/api/auth/feature-check', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n features: [\n 'wms.adjust_inventory',\n 'wms.manage_inventory',\n 'wms.receive_inventory',\n 'wms.cycle_count',\n 'wms.import',\n 'wms.manage_reservations',\n 'wms.manage_locations',\n 'wms.manage_warehouses',\n 'wms.manage_zones',\n ],\n }),\n })\n if (!cancelled) {\n setGranted(Array.isArray(call.result?.granted) ? call.result.granted : [])\n setUserId(typeof call.result?.userId === 'string' ? call.result.userId : null)\n }\n } catch (error) {\n logger.error('feature check failed', { component: 'useWmsInventoryMutationAccess', err: error })\n if (!cancelled) {\n setGranted([])\n setUserId(null)\n }\n } finally {\n if (!cancelled) setLoading(false)\n }\n }\n void load()\n return () => {\n cancelled = true\n }\n }, [organizationId, tenantId])\n\n const scopeReady = Boolean(organizationId && tenantId && userId)\n\n return {\n loading,\n organizationId,\n tenantId,\n userId,\n scopeReady,\n canAdjust: hasFeature(granted, 'wms.adjust_inventory'),\n canManage: hasFeature(granted, 'wms.manage_inventory'),\n canReceive: hasFeature(granted, 'wms.receive_inventory'),\n canCycleCount: hasFeature(granted, 'wms.cycle_count'),\n canImport: hasFeature(granted, 'wms.import'),\n canMove: hasFeature(granted, 'wms.adjust_inventory'),\n canRelease: hasFeature(granted, 'wms.manage_reservations'),\n canReserve: hasFeature(granted, 'wms.manage_reservations'),\n canAllocate: hasFeature(granted, 'wms.manage_reservations'),\n canManageLocations: hasFeature(granted, 'wms.manage_locations'),\n canManageWarehouses: hasFeature(granted, 'wms.manage_warehouses'),\n canManageZones: hasFeature(granted, 'wms.manage_zones'),\n canManageLots: hasFeature(granted, 'wms.manage_inventory'),\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAEA,YAAY,WAAW;AACvB,SAAS,eAAe;AACxB,SAAS,kCAAkC;AAC3C,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAE7B,MAAM,SAAS,aAAa,KAAK;AAU1B,SAAS,gCAAgC;AAC9C,QAAM,EAAE,gBAAgB,SAAS,IAAI,2BAA2B;AAChE,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAmB,CAAC,CAAC;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAwB,IAAI;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAS,IAAI;AAEjD,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY;AAChB,eAAW,IAAI;AACf,mBAAe,OAAO;AACpB,UAAI;AACF,cAAM,OAAO,MAAM,QAA8B,2BAA2B;AAAA,UAC1E,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB,UAAU;AAAA,cACR;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD,YAAI,CAAC,WAAW;AACd,qBAAW,MAAM,QAAQ,KAAK,QAAQ,OAAO,IAAI,KAAK,OAAO,UAAU,CAAC,CAAC;AACzE,oBAAU,OAAO,KAAK,QAAQ,WAAW,WAAW,KAAK,OAAO,SAAS,IAAI;AAAA,QAC/E;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,wBAAwB,EAAE,WAAW,iCAAiC,KAAK,MAAM,CAAC;AAC/F,YAAI,CAAC,WAAW;AACd,qBAAW,CAAC,CAAC;AACb,oBAAU,IAAI;AAAA,QAChB;AAAA,MACF,UAAE;AACA,YAAI,CAAC,UAAW,YAAW,KAAK;AAAA,MAClC;AAAA,IACF;AACA,SAAK,KAAK;AACV,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,QAAM,aAAa,QAAQ,kBAAkB,YAAY,MAAM;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,WAAW,SAAS,sBAAsB;AAAA,IACrD,WAAW,WAAW,SAAS,sBAAsB;AAAA,IACrD,YAAY,WAAW,SAAS,uBAAuB;AAAA,IACvD,eAAe,WAAW,SAAS,iBAAiB;AAAA,IACpD,WAAW,WAAW,SAAS,YAAY;AAAA,IAC3C,SAAS,WAAW,SAAS,sBAAsB;AAAA,IACnD,YAAY,WAAW,SAAS,yBAAyB;AAAA,IACzD,YAAY,WAAW,SAAS,yBAAyB;AAAA,IACzD,aAAa,WAAW,SAAS,yBAAyB;AAAA,IAC1D,oBAAoB,WAAW,SAAS,sBAAsB;AAAA,IAC9D,qBAAqB,WAAW,SAAS,uBAAuB;AAAA,IAChE,gBAAgB,WAAW,SAAS,kBAAkB;AAAA,IACtD,eAAe,WAAW,SAAS,sBAAsB;AAAA,EAC3D;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { useSearchParams } from "next/navigation";
|
|
4
|
+
function parseLowStockFilter(value) {
|
|
5
|
+
if (value === "belowReorder" || value === "belowSafety") return value;
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
function readWmsInventoryScopeParams(searchParams) {
|
|
9
|
+
return {
|
|
10
|
+
warehouseId: searchParams.get("warehouseId")?.trim() ?? "",
|
|
11
|
+
catalogVariantId: searchParams.get("catalogVariantId")?.trim() ?? "",
|
|
12
|
+
lotId: searchParams.get("lotId")?.trim() ?? "",
|
|
13
|
+
lowStock: parseLowStockFilter(searchParams.get("lowStock"))
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function useWmsInventoryScopeFromSearchParams() {
|
|
17
|
+
const searchParams = useSearchParams();
|
|
18
|
+
return React.useMemo(() => readWmsInventoryScopeParams(searchParams), [searchParams]);
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
readWmsInventoryScopeParams,
|
|
22
|
+
useWmsInventoryScopeFromSearchParams
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=useWmsInventoryScopeFromSearchParams.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/wms/components/backend/useWmsInventoryScopeFromSearchParams.ts"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\n\nexport type WmsLowStockFilter = 'belowReorder' | 'belowSafety'\n\nexport type WmsInventoryScopeParams = {\n warehouseId: string\n catalogVariantId: string\n lotId: string\n lowStock: WmsLowStockFilter | null\n}\n\nfunction parseLowStockFilter(value: string | null): WmsLowStockFilter | null {\n if (value === 'belowReorder' || value === 'belowSafety') return value\n return null\n}\n\nexport function readWmsInventoryScopeParams(searchParams: URLSearchParams): WmsInventoryScopeParams {\n return {\n warehouseId: searchParams.get('warehouseId')?.trim() ?? '',\n catalogVariantId: searchParams.get('catalogVariantId')?.trim() ?? '',\n lotId: searchParams.get('lotId')?.trim() ?? '',\n lowStock: parseLowStockFilter(searchParams.get('lowStock')),\n }\n}\n\nexport function useWmsInventoryScopeFromSearchParams(): WmsInventoryScopeParams {\n const searchParams = useSearchParams()\n return React.useMemo(() => readWmsInventoryScopeParams(searchParams), [searchParams])\n}\n"],
|
|
5
|
+
"mappings": ";AAEA,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAWhC,SAAS,oBAAoB,OAAgD;AAC3E,MAAI,UAAU,kBAAkB,UAAU,cAAe,QAAO;AAChE,SAAO;AACT;AAEO,SAAS,4BAA4B,cAAwD;AAClG,SAAO;AAAA,IACL,aAAa,aAAa,IAAI,aAAa,GAAG,KAAK,KAAK;AAAA,IACxD,kBAAkB,aAAa,IAAI,kBAAkB,GAAG,KAAK,KAAK;AAAA,IAClE,OAAO,aAAa,IAAI,OAAO,GAAG,KAAK,KAAK;AAAA,IAC5C,UAAU,oBAAoB,aAAa,IAAI,UAAU,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,uCAAgE;AAC9E,QAAM,eAAe,gBAAgB;AACrC,SAAO,MAAM,QAAQ,MAAM,4BAA4B,YAAY,GAAG,CAAC,YAAY,CAAC;AACtF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
2
|
+
function buildQuery(params) {
|
|
3
|
+
const search = new URLSearchParams();
|
|
4
|
+
for (const [key, value] of Object.entries(params)) {
|
|
5
|
+
if (value === void 0 || value === "") continue;
|
|
6
|
+
search.set(key, String(value));
|
|
7
|
+
}
|
|
8
|
+
return search.toString();
|
|
9
|
+
}
|
|
10
|
+
function mergeLabelCacheEntries(prev, entries) {
|
|
11
|
+
let next = null;
|
|
12
|
+
for (const entry of entries) {
|
|
13
|
+
if (prev[entry.value] !== entry.label) {
|
|
14
|
+
if (!next) next = { ...prev };
|
|
15
|
+
next[entry.value] = entry.label;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return next ?? prev;
|
|
19
|
+
}
|
|
20
|
+
async function loadWarehouseOptions(query) {
|
|
21
|
+
const params = buildQuery({ page: 1, pageSize: 50, search: query?.trim() || void 0 });
|
|
22
|
+
const call = await apiCall(
|
|
23
|
+
`/api/wms/warehouses?${params}`
|
|
24
|
+
);
|
|
25
|
+
if (!call.ok) return [];
|
|
26
|
+
return (call.result?.items ?? []).map((item) => {
|
|
27
|
+
const value = typeof item.id === "string" ? item.id : null;
|
|
28
|
+
if (!value) return null;
|
|
29
|
+
const label = item.name || item.code || value;
|
|
30
|
+
return { value, label };
|
|
31
|
+
}).filter((option) => option !== null);
|
|
32
|
+
}
|
|
33
|
+
async function loadCatalogVariantOptions(query) {
|
|
34
|
+
const params = buildQuery({ page: 1, pageSize: 25, search: query?.trim() || void 0 });
|
|
35
|
+
const call = await apiCall(
|
|
36
|
+
`/api/catalog/variants?${params}`
|
|
37
|
+
);
|
|
38
|
+
if (!call.ok) return [];
|
|
39
|
+
return (call.result?.items ?? []).map((item) => {
|
|
40
|
+
const value = typeof item.id === "string" ? item.id : null;
|
|
41
|
+
if (!value) return null;
|
|
42
|
+
const sku = item.sku?.trim() || null;
|
|
43
|
+
const name = item.name?.trim() || null;
|
|
44
|
+
const label = sku || name || value;
|
|
45
|
+
const description = sku && name && sku !== name ? name : null;
|
|
46
|
+
return { value, label, description };
|
|
47
|
+
}).filter((option) => option !== null);
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
buildQuery,
|
|
51
|
+
loadCatalogVariantOptions,
|
|
52
|
+
loadWarehouseOptions,
|
|
53
|
+
mergeLabelCacheEntries
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=wmsLookupLoaders.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/wms/components/backend/wmsLookupLoaders.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CrudFieldOption } from '@open-mercato/ui/backend/CrudForm'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\n\ntype PagedResponse<T> = {\n items: T[]\n total: number\n totalPages: number\n}\n\n// Extends CrudFieldOption with an optional description shown below the label in the dropdown.\n// Used by variant comboboxes where label=SKU and description=product name for readability.\nexport type CatalogVariantOption = CrudFieldOption & { description: string | null }\n\nexport function buildQuery(params: Record<string, string | number | undefined>) {\n const search = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === '') continue\n search.set(key, String(value))\n }\n return search.toString()\n}\n\n// Merges new label entries into a cache without creating a fresh object\n// reference when nothing actually changed. Callers that feed the result back\n// into React state (e.g. after every ComboboxInput suggestion fetch) rely on\n// this bail-out \u2014 otherwise a new object identity on every fetch retriggers\n// downstream effects that depend on that state, looping indefinitely.\nexport function mergeLabelCacheEntries(\n prev: Record<string, string>,\n entries: Array<{ value: string; label: string }>,\n): Record<string, string> {\n let next: Record<string, string> | null = null\n for (const entry of entries) {\n if (prev[entry.value] !== entry.label) {\n if (!next) next = { ...prev }\n next[entry.value] = entry.label\n }\n }\n return next ?? prev\n}\n\nexport async function loadWarehouseOptions(query?: string): Promise<CrudFieldOption[]> {\n const params = buildQuery({ page: 1, pageSize: 50, search: query?.trim() || undefined })\n const call = await apiCall<PagedResponse<{ id?: string | null; name?: string | null; code?: string | null }>>(\n `/api/wms/warehouses?${params}`,\n )\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const label = item.name || item.code || value\n return { value, label }\n })\n .filter((option): option is CrudFieldOption => option !== null)\n}\n\n// label=SKU so that fillCombobox helpers searching by SKU can match the dropdown button text\n// and so that input.value after selection equals the SKU typed by the user/test.\n// description=name provides human-readable context beneath the SKU in the dropdown.\nexport async function loadCatalogVariantOptions(query?: string): Promise<CatalogVariantOption[]> {\n const params = buildQuery({ page: 1, pageSize: 25, search: query?.trim() || undefined })\n const call = await apiCall<PagedResponse<{ id?: string | null; name?: string | null; sku?: string | null }>>(\n `/api/catalog/variants?${params}`,\n )\n if (!call.ok) return []\n return (call.result?.items ?? [])\n .map((item) => {\n const value = typeof item.id === 'string' ? item.id : null\n if (!value) return null\n const sku = item.sku?.trim() || null\n const name = item.name?.trim() || null\n const label = sku || name || value\n const description = sku && name && sku !== name ? name : null\n return { value, label, description }\n })\n .filter((option): option is CatalogVariantOption => option !== null)\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,eAAe;AAYjB,SAAS,WAAW,QAAqD;AAC9E,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,UAAU,GAAI;AACzC,WAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,EAC/B;AACA,SAAO,OAAO,SAAS;AACzB;AAOO,SAAS,uBACd,MACA,SACwB;AACxB,MAAI,OAAsC;AAC1C,aAAW,SAAS,SAAS;AAC3B,QAAI,KAAK,MAAM,KAAK,MAAM,MAAM,OAAO;AACrC,UAAI,CAAC,KAAM,QAAO,EAAE,GAAG,KAAK;AAC5B,WAAK,MAAM,KAAK,IAAI,MAAM;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAEA,eAAsB,qBAAqB,OAA4C;AACrF,QAAM,SAAS,WAAW,EAAE,MAAM,GAAG,UAAU,IAAI,QAAQ,OAAO,KAAK,KAAK,OAAU,CAAC;AACvF,QAAM,OAAO,MAAM;AAAA,IACjB,uBAAuB,MAAM;AAAA,EAC/B;AACA,MAAI,CAAC,KAAK,GAAI,QAAO,CAAC;AACtB,UAAQ,KAAK,QAAQ,SAAS,CAAC,GAC5B,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACtD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AACxC,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB,CAAC,EACA,OAAO,CAAC,WAAsC,WAAW,IAAI;AAClE;AAKA,eAAsB,0BAA0B,OAAiD;AAC/F,QAAM,SAAS,WAAW,EAAE,MAAM,GAAG,UAAU,IAAI,QAAQ,OAAO,KAAK,KAAK,OAAU,CAAC;AACvF,QAAM,OAAO,MAAM;AAAA,IACjB,yBAAyB,MAAM;AAAA,EACjC;AACA,MAAI,CAAC,KAAK,GAAI,QAAO,CAAC;AACtB,UAAQ,KAAK,QAAQ,SAAS,CAAC,GAC5B,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACtD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK;AAChC,UAAM,OAAO,KAAK,MAAM,KAAK,KAAK;AAClC,UAAM,QAAQ,OAAO,QAAQ;AAC7B,UAAM,cAAc,OAAO,QAAQ,QAAQ,OAAO,OAAO;AACzD,WAAO,EAAE,OAAO,OAAO,YAAY;AAAA,EACrC,CAAC,EACA,OAAO,CAAC,WAA2C,WAAW,IAAI;AACvE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|