@open-mercato/core 0.10.1-develop.7709.1.046124599c → 0.10.1-develop.7714.1.9dbb8200d8
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/asn/index.js +19 -0
- package/dist/generated/entities/asn/index.js.map +7 -0
- package/dist/generated/entities/putaway_task/index.js +25 -0
- package/dist/generated/entities/putaway_task/index.js.map +7 -0
- package/dist/generated/entities/receiving_line/index.js +21 -0
- package/dist/generated/entities/receiving_line/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +4 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +34 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js +22 -3
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +2 -2
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +40 -11
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +13 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/wms/acl.js +2 -0
- package/dist/modules/wms/acl.js.map +2 -2
- package/dist/modules/wms/api/asns/[id]/complete/route.js +61 -0
- package/dist/modules/wms/api/asns/[id]/complete/route.js.map +7 -0
- package/dist/modules/wms/api/asns/[id]/receive/route.js +68 -0
- package/dist/modules/wms/api/asns/[id]/receive/route.js.map +7 -0
- package/dist/modules/wms/api/asns/route.js +197 -0
- package/dist/modules/wms/api/asns/route.js.map +7 -0
- package/dist/modules/wms/api/inventory/helpers.js +42 -34
- package/dist/modules/wms/api/inventory/helpers.js.map +2 -2
- package/dist/modules/wms/api/inventory/receive/route.js +1 -1
- package/dist/modules/wms/api/inventory/receive/route.js.map +2 -2
- package/dist/modules/wms/api/listEnrichers.js +23 -0
- package/dist/modules/wms/api/listEnrichers.js.map +2 -2
- package/dist/modules/wms/api/putaway-tasks/[id]/assign/route.js +56 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/assign/route.js.map +7 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/cancel/route.js +56 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/cancel/route.js.map +7 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/complete/route.js +65 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/complete/route.js.map +7 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/start/route.js +56 -0
- package/dist/modules/wms/api/putaway-tasks/[id]/start/route.js.map +7 -0
- package/dist/modules/wms/api/putaway-tasks/create-from-balance/route.js +51 -0
- package/dist/modules/wms/api/putaway-tasks/create-from-balance/route.js.map +7 -0
- package/dist/modules/wms/api/putaway-tasks/route.js +192 -0
- package/dist/modules/wms/api/putaway-tasks/route.js.map +7 -0
- package/dist/modules/wms/api/receiving-lines/route.js +180 -0
- package/dist/modules/wms/api/receiving-lines/route.js.map +7 -0
- package/dist/modules/wms/api/scan/putaway/route.js +104 -0
- package/dist/modules/wms/api/scan/putaway/route.js.map +7 -0
- package/dist/modules/wms/api/scan/receive/route.js +109 -0
- package/dist/modules/wms/api/scan/receive/route.js.map +7 -0
- package/dist/modules/wms/api/scan/resolve-location/route.js +89 -0
- package/dist/modules/wms/api/scan/resolve-location/route.js.map +7 -0
- package/dist/modules/wms/api/scan/resolve-lot/route.js +89 -0
- package/dist/modules/wms/api/scan/resolve-lot/route.js.map +7 -0
- package/dist/modules/wms/backend/wms/asns/[id]/page.js +9 -0
- package/dist/modules/wms/backend/wms/asns/[id]/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/asns/[id]/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/asns/[id]/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/asns/page.js +9 -0
- package/dist/modules/wms/backend/wms/asns/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/asns/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/asns/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/putaway/page.js +9 -0
- package/dist/modules/wms/backend/wms/putaway/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/putaway/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/putaway/page.meta.js.map +7 -0
- package/dist/modules/wms/backend/wms/receiving/page.js +8 -0
- package/dist/modules/wms/backend/wms/receiving/page.js.map +7 -0
- package/dist/modules/wms/backend/wms/receiving/page.meta.js +18 -0
- package/dist/modules/wms/backend/wms/receiving/page.meta.js.map +7 -0
- package/dist/modules/wms/ce.js +27 -0
- package/dist/modules/wms/ce.js.map +2 -2
- package/dist/modules/wms/commands/asn.js +1746 -0
- package/dist/modules/wms/commands/asn.js.map +7 -0
- package/dist/modules/wms/commands/index.js +2 -0
- package/dist/modules/wms/commands/index.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +347 -243
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/putaway.js +945 -0
- package/dist/modules/wms/commands/putaway.js.map +7 -0
- package/dist/modules/wms/commands/shared.js +51 -0
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/AssignPutawayTaskDialog.js +278 -0
- package/dist/modules/wms/components/backend/AssignPutawayTaskDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/CompletePutawayTaskDialog.js +327 -0
- package/dist/modules/wms/components/backend/CompletePutawayTaskDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/CreateAsnDialog.js +404 -0
- package/dist/modules/wms/components/backend/CreateAsnDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/InventoryOperationsSection.js +16 -3
- package/dist/modules/wms/components/backend/InventoryOperationsSection.js.map +2 -2
- package/dist/modules/wms/components/backend/ReceiveAsnLineDialog.js +476 -0
- package/dist/modules/wms/components/backend/ReceiveAsnLineDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js +2 -2
- package/dist/modules/wms/components/backend/ReceiveInventoryDialog.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsAsnDetailPage.js +524 -0
- package/dist/modules/wms/components/backend/WmsAsnDetailPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsAsnsListPage.js +339 -0
- package/dist/modules/wms/components/backend/WmsAsnsListPage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +5 -6
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +5 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +14 -10
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsPutawayQueuePage.js +598 -0
- package/dist/modules/wms/components/backend/WmsPutawayQueuePage.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +5 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/asnCompleteOptimisticLock.js +32 -0
- package/dist/modules/wms/components/backend/asnCompleteOptimisticLock.js.map +7 -0
- package/dist/modules/wms/components/backend/asnReceivingLinesLoader.js +36 -0
- package/dist/modules/wms/components/backend/asnReceivingLinesLoader.js.map +7 -0
- package/dist/modules/wms/components/backend/inboundStatusUi.js +106 -0
- package/dist/modules/wms/components/backend/inboundStatusUi.js.map +7 -0
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +17 -0
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/putawayQueueOptimisticLock.js +14 -0
- package/dist/modules/wms/components/backend/putawayQueueOptimisticLock.js.map +7 -0
- package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js +4 -0
- package/dist/modules/wms/components/backend/useWmsInventoryMutationAccess.js.map +2 -2
- package/dist/modules/wms/data/enrichers.js +117 -12
- package/dist/modules/wms/data/enrichers.js.map +2 -2
- package/dist/modules/wms/data/entities.js +150 -1
- package/dist/modules/wms/data/entities.js.map +2 -2
- package/dist/modules/wms/data/validators.js +214 -0
- package/dist/modules/wms/data/validators.js.map +2 -2
- package/dist/modules/wms/events.js +12 -1
- package/dist/modules/wms/events.js.map +2 -2
- package/dist/modules/wms/extension-points.js +3 -1
- package/dist/modules/wms/extension-points.js.map +2 -2
- package/dist/modules/wms/lib/asnReceiving.js +124 -0
- package/dist/modules/wms/lib/asnReceiving.js.map +7 -0
- package/dist/modules/wms/lib/asnVendor.js +52 -0
- package/dist/modules/wms/lib/asnVendor.js.map +7 -0
- package/dist/modules/wms/lib/flashMutationError.js +4 -0
- package/dist/modules/wms/lib/flashMutationError.js.map +2 -2
- package/dist/modules/wms/lib/inventoryDisplayUi.js +24 -0
- package/dist/modules/wms/lib/inventoryDisplayUi.js.map +2 -2
- package/dist/modules/wms/lib/inventoryPolicy.js +17 -0
- package/dist/modules/wms/lib/inventoryPolicy.js.map +2 -2
- package/dist/modules/wms/lib/loadOperationalDashboard.js +67 -1
- package/dist/modules/wms/lib/loadOperationalDashboard.js.map +2 -2
- package/dist/modules/wms/lib/putaway.js +141 -0
- package/dist/modules/wms/lib/putaway.js.map +7 -0
- package/dist/modules/wms/lib/roleFeatures.js +3 -1
- package/dist/modules/wms/lib/roleFeatures.js.map +2 -2
- package/dist/modules/wms/lib/salesOrderInventoryAutomation.js +99 -1
- package/dist/modules/wms/lib/salesOrderInventoryAutomation.js.map +2 -2
- package/dist/modules/wms/lib/scanResolve.js +147 -0
- package/dist/modules/wms/lib/scanResolve.js.map +7 -0
- package/dist/modules/wms/lib/wmsIntegrationToggles.js +1 -1
- package/dist/modules/wms/lib/wmsIntegrationToggles.js.map +2 -2
- package/dist/modules/wms/migrations/Migration20260812120000.js +43 -0
- package/dist/modules/wms/migrations/Migration20260812120000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260812130000.js +30 -0
- package/dist/modules/wms/migrations/Migration20260812130000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260822120000.js +17 -0
- package/dist/modules/wms/migrations/Migration20260822120000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20260822130000.js +17 -0
- package/dist/modules/wms/migrations/Migration20260822130000.js.map +7 -0
- package/dist/modules/wms/migrations/Migration20261029120000.js +13 -0
- package/dist/modules/wms/migrations/Migration20261029120000.js.map +7 -0
- package/dist/modules/wms/search.js +85 -0
- package/dist/modules/wms/search.js.map +2 -2
- package/dist/modules/wms/subscribers/asn-line-received-reevaluate-reservations.js +14 -0
- package/dist/modules/wms/subscribers/asn-line-received-reevaluate-reservations.js.map +7 -0
- package/dist/modules/wms/subscribers/invalidate-enricher-cache-asn.js +12 -0
- package/dist/modules/wms/subscribers/invalidate-enricher-cache-asn.js.map +7 -0
- package/dist/modules/wms/subscribers/procurement-goods-receipt-created.js +163 -0
- package/dist/modules/wms/subscribers/procurement-goods-receipt-created.js.map +7 -0
- package/dist/modules/wms/subscribers/putaway-completed-reevaluate-reservations.js +14 -0
- package/dist/modules/wms/subscribers/putaway-completed-reevaluate-reservations.js.map +7 -0
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js +37 -8
- package/dist/modules/wms/widgets/injection/sales-order-stock-context/widget.client.js.map +2 -2
- package/generated/entities/asn/index.ts +8 -0
- package/generated/entities/putaway_task/index.ts +11 -0
- package/generated/entities/receiving_line/index.ts +9 -0
- package/generated/entities.ids.generated.ts +4 -1
- package/generated/entity-fields-registry.ts +34 -0
- package/package.json +7 -7
- 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/ko.json +2 -0
- package/src/modules/auth/i18n/pl.json +2 -0
- package/src/modules/communication_channels/i18n/de.json +2 -0
- package/src/modules/communication_channels/i18n/en.json +2 -0
- package/src/modules/communication_channels/i18n/es.json +2 -0
- package/src/modules/communication_channels/i18n/ko.json +2 -0
- package/src/modules/communication_channels/i18n/pl.json +2 -0
- package/src/modules/communication_channels/lib/sanitize-channel-html.ts +23 -3
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +44 -12
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +16 -2
- package/src/modules/wms/acl.ts +2 -0
- package/src/modules/wms/api/asns/[id]/complete/route.ts +62 -0
- package/src/modules/wms/api/asns/[id]/receive/route.ts +74 -0
- package/src/modules/wms/api/asns/route.ts +200 -0
- package/src/modules/wms/api/inventory/helpers.ts +57 -34
- package/src/modules/wms/api/inventory/receive/route.ts +2 -1
- package/src/modules/wms/api/listEnrichers.ts +38 -0
- package/src/modules/wms/api/putaway-tasks/[id]/assign/route.ts +56 -0
- package/src/modules/wms/api/putaway-tasks/[id]/cancel/route.ts +56 -0
- package/src/modules/wms/api/putaway-tasks/[id]/complete/route.ts +66 -0
- package/src/modules/wms/api/putaway-tasks/[id]/start/route.ts +56 -0
- package/src/modules/wms/api/putaway-tasks/create-from-balance/route.ts +50 -0
- package/src/modules/wms/api/putaway-tasks/route.ts +199 -0
- package/src/modules/wms/api/receiving-lines/route.ts +180 -0
- package/src/modules/wms/api/scan/putaway/route.ts +108 -0
- package/src/modules/wms/api/scan/receive/route.ts +118 -0
- package/src/modules/wms/api/scan/resolve-location/route.ts +92 -0
- package/src/modules/wms/api/scan/resolve-lot/route.ts +92 -0
- package/src/modules/wms/backend/wms/asns/[id]/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/asns/[id]/page.tsx +5 -0
- package/src/modules/wms/backend/wms/asns/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/asns/page.tsx +5 -0
- package/src/modules/wms/backend/wms/putaway/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/putaway/page.tsx +5 -0
- package/src/modules/wms/backend/wms/receiving/page.meta.ts +14 -0
- package/src/modules/wms/backend/wms/receiving/page.tsx +5 -0
- package/src/modules/wms/ce.ts +27 -0
- package/src/modules/wms/commands/asn.ts +2122 -0
- package/src/modules/wms/commands/index.ts +2 -0
- package/src/modules/wms/commands/inventory-actions.ts +413 -243
- package/src/modules/wms/commands/putaway.ts +1169 -0
- package/src/modules/wms/commands/shared.ts +51 -0
- package/src/modules/wms/components/backend/AssignPutawayTaskDialog.tsx +328 -0
- package/src/modules/wms/components/backend/CompletePutawayTaskDialog.tsx +366 -0
- package/src/modules/wms/components/backend/CreateAsnDialog.tsx +427 -0
- package/src/modules/wms/components/backend/InventoryOperationsSection.tsx +20 -2
- package/src/modules/wms/components/backend/ReceiveAsnLineDialog.tsx +535 -0
- package/src/modules/wms/components/backend/ReceiveInventoryDialog.tsx +2 -2
- package/src/modules/wms/components/backend/WmsAsnDetailPage.tsx +647 -0
- package/src/modules/wms/components/backend/WmsAsnsListPage.tsx +407 -0
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +4 -5
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +4 -5
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +12 -8
- package/src/modules/wms/components/backend/WmsPutawayQueuePage.tsx +677 -0
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +4 -5
- package/src/modules/wms/components/backend/asnCompleteOptimisticLock.ts +52 -0
- package/src/modules/wms/components/backend/asnReceivingLinesLoader.ts +83 -0
- package/src/modules/wms/components/backend/inboundStatusUi.ts +154 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -0
- package/src/modules/wms/components/backend/putawayQueueOptimisticLock.ts +20 -0
- package/src/modules/wms/components/backend/useWmsInventoryMutationAccess.ts +4 -0
- package/src/modules/wms/data/enrichers.ts +175 -13
- package/src/modules/wms/data/entities.ts +155 -0
- package/src/modules/wms/data/validators.ts +256 -0
- package/src/modules/wms/events.ts +11 -0
- package/src/modules/wms/extension-points.ts +2 -0
- package/src/modules/wms/i18n/de.json +205 -3
- package/src/modules/wms/i18n/en.json +205 -3
- package/src/modules/wms/i18n/es.json +205 -3
- package/src/modules/wms/i18n/ko.json +205 -3
- package/src/modules/wms/i18n/pl.json +205 -3
- package/src/modules/wms/lib/asnReceiving.ts +226 -0
- package/src/modules/wms/lib/asnVendor.ts +80 -0
- package/src/modules/wms/lib/flashMutationError.ts +4 -0
- package/src/modules/wms/lib/inventoryDisplayUi.ts +46 -0
- package/src/modules/wms/lib/inventoryPolicy.ts +31 -1
- package/src/modules/wms/lib/loadOperationalDashboard.ts +89 -1
- package/src/modules/wms/lib/putaway.ts +210 -0
- package/src/modules/wms/lib/roleFeatures.ts +2 -0
- package/src/modules/wms/lib/salesOrderInventoryAutomation.ts +150 -1
- package/src/modules/wms/lib/scanResolve.ts +185 -0
- package/src/modules/wms/lib/wmsIntegrationToggles.ts +2 -1
- package/src/modules/wms/migrations/.snapshot-open-mercato.json +1000 -0
- package/src/modules/wms/migrations/Migration20260812120000.ts +43 -0
- package/src/modules/wms/migrations/Migration20260812130000.ts +28 -0
- package/src/modules/wms/migrations/Migration20260822120000.ts +17 -0
- package/src/modules/wms/migrations/Migration20260822130000.ts +15 -0
- package/src/modules/wms/migrations/Migration20261029120000.ts +11 -0
- package/src/modules/wms/search.ts +95 -0
- package/src/modules/wms/subscribers/asn-line-received-reevaluate-reservations.ts +21 -0
- package/src/modules/wms/subscribers/invalidate-enricher-cache-asn.ts +12 -0
- package/src/modules/wms/subscribers/procurement-goods-receipt-created.ts +238 -0
- package/src/modules/wms/subscribers/putaway-completed-reevaluate-reservations.ts +21 -0
- package/src/modules/wms/widgets/injection/sales-order-stock-context/widget.client.tsx +63 -13
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/commands/putaway.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport { emitCrudSideEffects } from '@open-mercato/shared/lib/commands/helpers'\nimport { extractUndoPayload } from '@open-mercato/shared/lib/commands/undo'\nimport { LockMode } from '@mikro-orm/core'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { enforceCommandOptimisticLockWithGuards } from '@open-mercato/shared/lib/crud/optimistic-lock-command'\nimport type { DataEngine } from '@open-mercato/shared/lib/data/engine'\nimport type { JsonValue } from '@open-mercato/shared/lib/json'\nimport {\n InventoryBalance,\n PutawayTask,\n Warehouse,\n WarehouseLocation,\n type PutawayTaskStatus,\n} from '../data/entities'\nimport {\n putawayTaskAssignSchema,\n putawayTaskCancelSchema,\n putawayTaskCompleteSchema,\n putawayTaskCreateFromBalanceSchema,\n putawayTaskCreateSchema,\n putawayTaskStartSchema,\n putawayTaskUpdateSchema,\n type InventoryMoveInput,\n type PutawayTaskAssignInput,\n type PutawayTaskCancelInput,\n type PutawayTaskCompleteInput,\n type PutawayTaskCreateFromBalanceInput,\n type PutawayTaskCreateInput,\n type PutawayTaskStartInput,\n type PutawayTaskUpdateInput,\n} from '../data/validators'\nimport { emitWmsEvent } from '../events'\nimport {\n assertPutawayAssignable,\n assertPutawayCancellable,\n computeUncommittedPutawaySourceQuantity,\n hasUncommittedPutawaySourceQuantity,\n assertPutawayCompleteAuthorized,\n assertPutawayCompletable,\n assertPutawayConfirmedQuantity,\n assertPutawayDeletable,\n assertPutawayLifecycleFieldsForbidden,\n assertPutawayStartable,\n assertPutawayTargetLocationType,\n buildPutawayCompleteReferenceId,\n putawayResidualQuantity,\n} from '../lib/putaway'\nimport {\n applyInventoryMoveInTransaction,\n emitInventoryMoveSideEffects,\n findPutawayCompleteMovementByReference,\n type InventoryMoveMutationResult,\n} from './inventory-actions'\nimport {\n ensureOrganizationScope,\n ensureTenantScope,\n putawayTaskCrudEvents,\n putawayTaskCrudIndexer,\n requireId,\n toNumericString,\n WMS_INVENTORY_BALANCE_RESOURCE,\n WMS_PUTAWAY_TASK_RESOURCE,\n} from './shared'\n\ntype Scope = { tenantId: string; organizationId: string }\n\ntype PutawayTaskSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n warehouseId: string\n sourceLocationId: string\n targetLocationId: string | null\n catalogVariantId: string\n lotId: string | null\n quantity: string\n status: PutawayTaskStatus\n assignedTo: string | null\n priority: number\n metadata: JsonValue | null\n createdAt: string\n updatedAt: string\n}\n\nfunction resolveScope(\n ctx: CommandRuntimeContext,\n fallback?: { tenantId?: string | null; organizationId?: string | null },\n): Scope {\n const tenantId = fallback?.tenantId ?? ctx.auth?.tenantId ?? null\n const organizationId = fallback?.organizationId ?? ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null\n if (!tenantId || !organizationId) {\n throw new CrudHttpError(400, { error: 'Tenant and organization scope are required.' })\n }\n return { tenantId, organizationId }\n}\n\nfunction resolveEm(ctx: CommandRuntimeContext): EntityManager {\n return (ctx.container.resolve('em') as EntityManager).fork()\n}\n\ntype RbacServiceLike = {\n userHasAllFeatures?: (\n userId: string,\n features: string[],\n scope: { tenantId: string | null; organizationId: string | null },\n ) => Promise<boolean>\n}\n\nasync function resolvePutawayCompleteAuthorization(\n ctx: CommandRuntimeContext,\n scope: Scope,\n assignedTo: string | null | undefined,\n): Promise<void> {\n const actorUserId = typeof ctx.auth?.sub === 'string' ? ctx.auth.sub : null\n let canManagePutaway = false\n let canAdjustInventory = false\n if (actorUserId) {\n try {\n const rbacService = ctx.container.resolve('rbacService') as RbacServiceLike\n if (typeof rbacService.userHasAllFeatures === 'function') {\n ;[canManagePutaway, canAdjustInventory] = await Promise.all([\n rbacService.userHasAllFeatures(actorUserId, ['wms.manage_putaway'], scope),\n rbacService.userHasAllFeatures(actorUserId, ['wms.adjust_inventory'], scope),\n ])\n }\n } catch {\n // Fail closed when rbac is unavailable \u2014 do not fall back to raw auth feature tokens.\n }\n }\n assertPutawayCompleteAuthorized({\n canManagePutaway,\n canAdjustInventory,\n actorUserId,\n assignedTo,\n })\n}\n\nfunction toJsonValue(value: Record<string, unknown> | null | undefined): JsonValue | null | undefined {\n if (value === undefined) return undefined\n return (value ?? null) as JsonValue | null\n}\n\nfunction iso(value: Date | string): string {\n if (value instanceof Date) return value.toISOString()\n return new Date(value).toISOString()\n}\n\nfunction snapshotPutawayTask(record: PutawayTask): PutawayTaskSnapshot {\n const warehouseId = typeof record.warehouse === 'string' ? record.warehouse : record.warehouse.id\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n warehouseId,\n sourceLocationId: record.sourceLocationId,\n targetLocationId: record.targetLocationId ?? null,\n catalogVariantId: record.catalogVariantId,\n lotId: record.lotId ?? null,\n quantity: record.quantity,\n status: record.status,\n assignedTo: record.assignedTo ?? null,\n priority: Number(record.priority),\n metadata: (record.metadata ?? null) as JsonValue | null,\n createdAt: iso(record.createdAt),\n updatedAt: iso(record.updatedAt),\n }\n}\n\nasync function loadPutawayTask(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n id: string,\n): Promise<PutawayTask> {\n const task = await findOneWithDecryption(\n em,\n PutawayTask,\n { id, deletedAt: null },\n undefined,\n resolveScope(ctx),\n )\n if (!task) throw new CrudHttpError(404, { error: 'Putaway task not found.' })\n ensureTenantScope(ctx, task.tenantId)\n ensureOrganizationScope(ctx, task.organizationId)\n return task\n}\n\n/**\n * Load putaway task under PESSIMISTIC_WRITE inside an open TX, then run `fn`.\n * Re-assert lifecycle status inside `fn` after the lock \u2014 unlocked read \u2192 mutate\n * races with complete under READ COMMITTED (cancel can overwrite `done` and clear\n * putawayKey, letting ASN recreate putaway for already-moved stock).\n */\nasync function withLockedPutawayTask<T>(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n id: string,\n scope: Scope,\n fn: (task: PutawayTask, trx: EntityManager) => Promise<T>,\n): Promise<T> {\n return em.transactional(async (trx) => {\n const task = await findOneWithDecryption(\n trx,\n PutawayTask,\n { id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!task) throw new CrudHttpError(404, { error: 'Putaway task not found.' })\n ensureTenantScope(ctx, task.tenantId)\n ensureOrganizationScope(ctx, task.organizationId)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_PUTAWAY_TASK_RESOURCE,\n resourceId: task.id,\n current: task.updatedAt,\n request: ctx.request ?? null,\n })\n return fn(task, trx)\n })\n}\n\nasync function requireWarehouse(em: EntityManager, ctx: CommandRuntimeContext, warehouseId: string, scope: Scope) {\n const warehouse = await findOneWithDecryption(\n em,\n Warehouse,\n { id: warehouseId, deletedAt: null },\n undefined,\n scope,\n )\n if (!warehouse) throw new CrudHttpError(404, { error: 'Warehouse not found.' })\n ensureTenantScope(ctx, warehouse.tenantId)\n ensureOrganizationScope(ctx, warehouse.organizationId)\n return warehouse\n}\n\nasync function requireActiveLocation(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n locationId: string,\n warehouseId: string,\n scope: Scope,\n) {\n const location = await findOneWithDecryption(\n em,\n WarehouseLocation,\n { id: locationId, deletedAt: null },\n undefined,\n scope,\n )\n if (!location) throw new CrudHttpError(404, { error: 'Warehouse location not found.' })\n ensureTenantScope(ctx, location.tenantId)\n ensureOrganizationScope(ctx, location.organizationId)\n const locationWarehouseId = typeof location.warehouse === 'string' ? location.warehouse : location.warehouse.id\n if (locationWarehouseId !== warehouseId) {\n throw new CrudHttpError(422, { error: 'invalid_location' })\n }\n if (!location.isActive) {\n throw new CrudHttpError(422, { error: 'inactive_location' })\n }\n return location\n}\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim().length > 0) {\n const parsed = Number(value)\n if (Number.isFinite(parsed)) return parsed\n }\n return 0\n}\n\nasync function requireAvailableBalanceQuantity(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n input: {\n warehouseId: string\n sourceLocationId: string\n catalogVariantId: string\n lotId?: string | null\n serialNumber?: string | null\n quantity: number\n },\n scope: Scope,\n options?: { lock?: boolean; excludeTaskId?: string },\n) {\n const serialNumber = input.serialNumber?.trim() ? input.serialNumber.trim() : null\n const balance = await findOneWithDecryption(\n em,\n InventoryBalance,\n {\n warehouse: input.warehouseId,\n location: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lot: input.lotId ?? null,\n serialNumber,\n deletedAt: null,\n },\n options?.lock ? { lockMode: LockMode.PESSIMISTIC_WRITE } : undefined,\n scope,\n )\n if (!balance) {\n throw new CrudHttpError(409, { error: 'insufficient_stock' })\n }\n ensureTenantScope(ctx, balance.tenantId)\n ensureOrganizationScope(ctx, balance.organizationId)\n\n // Subtract open/in-progress putaway commitments so concurrent create-from-balance\n // cannot oversubscribe the same staging bucket (TOCTOU). When updating an\n // existing task, exclude it so its new quantity is compared against peers only.\n const openTasks = await findWithDecryption(\n em,\n PutawayTask,\n {\n warehouse: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId ?? null,\n serialNumber,\n status: { $in: ['open', 'in_progress'] },\n deletedAt: null,\n },\n undefined,\n scope,\n )\n const remaining = computeUncommittedPutawaySourceQuantity({\n quantityOnHand: toNumber(balance.quantityOnHand),\n quantityReserved: toNumber(balance.quantityReserved),\n quantityAllocated: toNumber(balance.quantityAllocated),\n openPutawayQuantities: openTasks\n .filter((task) => !(options?.excludeTaskId && task.id === options.excludeTaskId))\n .map((task) => toNumber(task.quantity)),\n })\n if (!hasUncommittedPutawaySourceQuantity(remaining, input.quantity)) {\n throw new CrudHttpError(409, { error: 'insufficient_stock' })\n }\n return balance\n}\n\nasync function emitPutawaySideEffects(\n ctx: CommandRuntimeContext,\n tasks: Array<{ entity: PutawayTask; action: 'created' | 'updated' | 'deleted' }>,\n) {\n const dataEngine = ctx.container.resolve('dataEngine') as DataEngine\n for (const entry of tasks) {\n await emitCrudSideEffects({\n dataEngine,\n action: entry.action,\n entity: entry.entity,\n identifiers: {\n id: entry.entity.id,\n organizationId: entry.entity.organizationId,\n tenantId: entry.entity.tenantId,\n },\n events: putawayTaskCrudEvents,\n indexer: putawayTaskCrudIndexer,\n })\n }\n}\n\nasync function buildCrudLog(\n ctx: CommandRuntimeContext,\n input: { tenantId?: string | null; organizationId?: string | null; id?: string | null } | undefined,\n resultId: string | null,\n actionKey: string,\n fallbackLabel: string,\n) {\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate(actionKey, fallbackLabel),\n resourceKind: WMS_PUTAWAY_TASK_RESOURCE,\n resourceId: resultId ?? input?.id ?? null,\n tenantId: input?.tenantId ?? ctx.auth?.tenantId ?? null,\n organizationId: input?.organizationId ?? ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null,\n }\n}\n\ntype PutawaySourceBucket = {\n warehouseId: string\n sourceLocationId: string\n catalogVariantId: string\n lotId: string | null\n serialNumber: string | null\n}\n\nfunction readPutawaySourceBucket(task: PutawayTask): PutawaySourceBucket {\n const warehouseId = typeof task.warehouse === 'string' ? task.warehouse : task.warehouse.id\n const serialNumber = task.serialNumber?.trim() ?? ''\n return {\n warehouseId,\n sourceLocationId: task.sourceLocationId,\n catalogVariantId: task.catalogVariantId,\n lotId: task.lotId ?? null,\n serialNumber: serialNumber.length > 0 ? serialNumber : null,\n }\n}\n\nfunction samePutawaySourceBucket(left: PutawaySourceBucket, right: PutawaySourceBucket): boolean {\n return (\n left.warehouseId === right.warehouseId &&\n left.sourceLocationId === right.sourceLocationId &&\n left.catalogVariantId === right.catalogVariantId &&\n (left.lotId ?? null) === (right.lotId ?? null) &&\n (left.serialNumber ?? null) === (right.serialNumber ?? null)\n )\n}\n\nasync function assertResultingPutawayCapacity(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n scope: Scope,\n input: {\n previous: PutawaySourceBucket\n next: PutawaySourceBucket\n previousQuantity: number\n nextQuantity: number\n excludeTaskId: string\n },\n): Promise<void> {\n const bucketChanged = !samePutawaySourceBucket(input.previous, input.next)\n const quantityIncreased = input.nextQuantity > input.previousQuantity + 0.000001\n if (!bucketChanged && !quantityIncreased) return\n await requireAvailableBalanceQuantity(\n em,\n ctx,\n {\n warehouseId: input.next.warehouseId,\n sourceLocationId: input.next.sourceLocationId,\n catalogVariantId: input.next.catalogVariantId,\n lotId: input.next.lotId,\n serialNumber: input.next.serialNumber,\n quantity: input.nextQuantity,\n },\n scope,\n { lock: true, excludeTaskId: input.excludeTaskId },\n )\n}\n\nasync function createOpenPutawayTask(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n input: PutawayTaskCreateInput & { putawayKey?: string | null; serialNumber?: string | null },\n): Promise<PutawayTask> {\n const scope = resolveScope(ctx, input)\n await requireWarehouse(em, ctx, input.warehouseId, scope)\n await requireActiveLocation(em, ctx, input.sourceLocationId, input.warehouseId, scope)\n if (input.targetLocationId) {\n await requireActiveLocation(em, ctx, input.targetLocationId, input.warehouseId, scope)\n }\n const task = em.create(PutawayTask, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n warehouse: em.getReference(Warehouse, input.warehouseId),\n sourceLocationId: input.sourceLocationId,\n targetLocationId: input.targetLocationId ?? null,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId ?? null,\n serialNumber: input.serialNumber?.trim() ? input.serialNumber.trim() : null,\n quantity: toNumericString(input.quantity),\n status: 'open',\n assignedTo: input.assignedTo ?? null,\n priority: input.priority ?? 5,\n putawayKey: input.putawayKey ?? null,\n metadata: toJsonValue(input.metadata) ?? null,\n })\n await em.persist(task).flush()\n return task\n}\n\nasync function ensureResidualPutawayTask(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n input: {\n scope: Scope\n warehouseId: string\n parent: PutawayTask\n residual: number\n },\n): Promise<void> {\n const residualKey = `wms:putaway-residual:${input.parent.id}`\n const existing = await findOneWithDecryption(\n em,\n PutawayTask,\n {\n organizationId: input.scope.organizationId,\n tenantId: input.scope.tenantId,\n putawayKey: residualKey,\n deletedAt: null,\n status: { $in: ['open', 'in_progress', 'done'] },\n },\n undefined,\n input.scope,\n )\n if (existing) return\n try {\n await createOpenPutawayTask(em, ctx, {\n organizationId: input.scope.organizationId,\n tenantId: input.scope.tenantId,\n warehouseId: input.warehouseId,\n sourceLocationId: input.parent.sourceLocationId,\n targetLocationId: null,\n catalogVariantId: input.parent.catalogVariantId,\n lotId: input.parent.lotId,\n serialNumber: input.parent.serialNumber ?? null,\n quantity: input.residual,\n assignedTo: input.parent.assignedTo,\n priority: input.parent.priority,\n putawayKey: residualKey,\n metadata: {\n source: 'putaway_residual',\n parentPutawayTaskId: input.parent.id,\n },\n })\n } catch (error) {\n const code = error && typeof error === 'object' ? (error as { code?: string }).code : undefined\n const name = error && typeof error === 'object' ? (error as { name?: string }).name : undefined\n if (code !== '23505' && name !== 'UniqueConstraintViolationException') throw error\n }\n}\n\nconst createPutawayTaskCommand: CommandHandler<PutawayTaskCreateInput, { taskId: string }> = {\n id: 'wms.putaway-tasks.create',\n async execute(rawInput, ctx) {\n const input = putawayTaskCreateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n // Same staging availability floor as create-from-balance: lock balance and\n // subtract open/in_progress putaway commitments before inserting.\n const task = await em.transactional(async (trx) => {\n await requireAvailableBalanceQuantity(\n trx,\n ctx,\n {\n warehouseId: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId,\n quantity: input.quantity,\n },\n scope,\n { lock: true },\n )\n return createOpenPutawayTask(trx, ctx, input)\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'created' }])\n void emitWmsEvent('wms.putaway.created', {\n id: task.id,\n warehouseId: input.warehouseId,\n sourceLocationId: task.sourceLocationId,\n targetLocationId: task.targetLocationId ?? null,\n catalogVariantId: task.catalogVariantId,\n quantity: task.quantity,\n tenantId: task.tenantId,\n organizationId: task.organizationId,\n }).catch(() => undefined)\n return { taskId: task.id }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.taskId) return null\n const task = await loadPutawayTask(resolveEm(ctx), ctx, result.taskId)\n return snapshotPutawayTask(task)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ after?: PutawayTaskSnapshot | null }>(logEntry)\n const after = payload?.after\n if (!after?.id) return\n const em = resolveEm(ctx)\n const scope = { tenantId: after.tenantId, organizationId: after.organizationId }\n // Only reverse pristine open creates \u2014 soft-deleting done frees putaway_key\n // uniqueness while stock already moved; in_progress/cancelled need lifecycle cmds.\n const task = await withLockedPutawayTask(em, ctx, after.id, scope, async (locked, trx) => {\n if (locked.status !== 'open') {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n locked.deletedAt = new Date()\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'deleted' }])\n },\n buildLog: async ({ snapshots, input, result, ctx }) => {\n const after = snapshots?.after as PutawayTaskSnapshot | undefined\n return {\n ...(await buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.create', 'Create putaway task')),\n snapshotAfter: after,\n payload: { undo: { after } },\n }\n },\n}\n\nconst updatePutawayTaskCommand: CommandHandler<PutawayTaskUpdateInput, { taskId: string }> = {\n id: 'wms.putaway-tasks.update',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Putaway task')\n const task = await loadPutawayTask(resolveEm(ctx), ctx, id)\n return { before: snapshotPutawayTask(task) }\n },\n async execute(rawInput, ctx) {\n assertPutawayLifecycleFieldsForbidden(rawInput)\n const input = putawayTaskUpdateSchema.parse(rawInput ?? {})\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx)\n // Same lock + re-assert as lifecycle cmds \u2014 unlocked load races with complete\n // and can rewrite quantity/locations/metadata on a done task.\n const task = await withLockedPutawayTask(em, ctx, input.id, scope, async (locked, trx) => {\n if (locked.status === 'done' || locked.status === 'cancelled') {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n const previousBucket = readPutawaySourceBucket(locked)\n const nextBucket: PutawaySourceBucket = {\n warehouseId: input.warehouseId ?? previousBucket.warehouseId,\n sourceLocationId: input.sourceLocationId ?? previousBucket.sourceLocationId,\n catalogVariantId: input.catalogVariantId ?? previousBucket.catalogVariantId,\n lotId: input.lotId !== undefined ? input.lotId : previousBucket.lotId,\n serialNumber: previousBucket.serialNumber,\n }\n const previousQty = toNumber(locked.quantity)\n const nextQty = input.quantity !== undefined ? Number(input.quantity) : previousQty\n const taskScope = resolveScope(ctx, {\n tenantId: locked.tenantId,\n organizationId: locked.organizationId,\n })\n if (input.warehouseId) {\n await requireWarehouse(trx, ctx, input.warehouseId, taskScope)\n }\n if (input.sourceLocationId) {\n await requireActiveLocation(trx, ctx, input.sourceLocationId, nextBucket.warehouseId, taskScope)\n }\n if (input.targetLocationId) {\n await requireActiveLocation(trx, ctx, input.targetLocationId, nextBucket.warehouseId, taskScope)\n }\n // Bucket moves oversubscribe even when quantity is omitted or unchanged.\n // Validate before assigning so a rejection leaves the locked row untouched.\n await assertResultingPutawayCapacity(trx, ctx, taskScope, {\n previous: previousBucket,\n next: nextBucket,\n previousQuantity: previousQty,\n nextQuantity: nextQty,\n excludeTaskId: locked.id,\n })\n if (input.warehouseId) {\n locked.warehouse = trx.getReference(Warehouse, input.warehouseId)\n }\n if (input.sourceLocationId) locked.sourceLocationId = input.sourceLocationId\n if (input.targetLocationId !== undefined) locked.targetLocationId = input.targetLocationId\n if (input.catalogVariantId !== undefined) locked.catalogVariantId = input.catalogVariantId\n if (input.lotId !== undefined) locked.lotId = input.lotId\n if (input.quantity !== undefined) locked.quantity = toNumericString(input.quantity)\n if (input.priority !== undefined) locked.priority = input.priority\n if (input.metadata !== undefined) locked.metadata = toJsonValue(input.metadata) ?? null\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n return { taskId: task.id }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.taskId) return null\n const task = await loadPutawayTask(resolveEm(ctx), ctx, result.taskId)\n return snapshotPutawayTask(task)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ before?: PutawayTaskSnapshot | null }>(logEntry)\n const before = payload?.before\n if (!before?.id) return\n const em = resolveEm(ctx)\n const scope = { tenantId: before.tenantId, organizationId: before.organizationId }\n // Lock + re-assert: refuse reopening done/cancelled (movement already posted).\n const task = await withLockedPutawayTask(em, ctx, before.id, scope, async (locked, trx) => {\n if (locked.status === 'done' || locked.status === 'cancelled') {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n if (before.status === 'done' || before.status === 'cancelled') {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n const previousBucket = readPutawaySourceBucket(locked)\n const restoredBucket: PutawaySourceBucket = {\n warehouseId: before.warehouseId,\n sourceLocationId: before.sourceLocationId,\n catalogVariantId: before.catalogVariantId,\n lotId: before.lotId ?? null,\n serialNumber: previousBucket.serialNumber,\n }\n await assertResultingPutawayCapacity(trx, ctx, scope, {\n previous: previousBucket,\n next: restoredBucket,\n previousQuantity: toNumber(locked.quantity),\n nextQuantity: toNumber(before.quantity),\n excludeTaskId: locked.id,\n })\n locked.warehouse = trx.getReference(Warehouse, before.warehouseId)\n locked.sourceLocationId = before.sourceLocationId\n locked.targetLocationId = before.targetLocationId\n locked.catalogVariantId = before.catalogVariantId\n locked.lotId = before.lotId\n locked.quantity = before.quantity\n locked.status = before.status\n locked.assignedTo = before.assignedTo\n locked.priority = before.priority\n locked.metadata = before.metadata\n locked.deletedAt = null\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n },\n buildLog: async ({ snapshots, input, result, ctx }) => {\n const before = snapshots?.before as PutawayTaskSnapshot | undefined\n const after = snapshots?.after as PutawayTaskSnapshot | undefined\n return {\n ...(await buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.update', 'Update putaway task')),\n snapshotBefore: before,\n snapshotAfter: after,\n payload: { undo: { before, after } },\n }\n },\n}\n\nconst deletePutawayTaskCommand: CommandHandler<{ id: string }, { taskId: string }> = {\n id: 'wms.putaway-tasks.delete',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Putaway task')\n const task = await loadPutawayTask(resolveEm(ctx), ctx, id)\n return { before: snapshotPutawayTask(task) }\n },\n async execute(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Putaway task')\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx)\n const task = await withLockedPutawayTask(em, ctx, id, scope, async (locked, trx) => {\n // Re-assert after lock \u2014 only cancelled is deletable. Done is permanent\n // history (soft-delete would free putaway_key uniqueness and allow ASN\n // receive to recreate an open putaway for already-moved stock).\n assertPutawayDeletable(locked.status)\n locked.deletedAt = new Date()\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'deleted' }])\n return { taskId: task.id }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ before?: PutawayTaskSnapshot | null }>(logEntry)\n const before = payload?.before\n if (!before?.id) return\n const em = resolveEm(ctx)\n const scope = { tenantId: before.tenantId, organizationId: before.organizationId }\n // Soft-deleted rows are excluded from withLockedPutawayTask; lock the\n // deleted row directly and re-assert cancelled before undelete.\n const task = await em.transactional(async (trx) => {\n const locked = await findOneWithDecryption(\n trx,\n PutawayTask,\n { id: before.id },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!locked) return null\n ensureTenantScope(ctx, locked.tenantId)\n ensureOrganizationScope(ctx, locked.organizationId)\n // Only cancelled tasks may be soft-deleted; refuse undelete if status drifted.\n if (locked.status !== 'cancelled') {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n if (!locked.deletedAt) return locked\n locked.deletedAt = null\n await trx.flush()\n return locked\n })\n if (!task) return\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n },\n buildLog: async ({ snapshots, input, result, ctx }) => {\n const before = snapshots?.before as PutawayTaskSnapshot | undefined\n return {\n ...(await buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.delete', 'Delete putaway task')),\n snapshotBefore: before,\n payload: { undo: { before } },\n }\n },\n}\n\nconst createPutawayTaskFromBalanceCommand: CommandHandler<\n PutawayTaskCreateFromBalanceInput,\n { taskId: string }\n> = {\n id: 'wms.putaway-tasks.create-from-balance',\n async execute(rawInput, ctx) {\n const input = putawayTaskCreateFromBalanceSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n // One TX: lock balance row, re-check available minus open putaway commitments,\n // then create \u2014 closes the TOCTOU oversubscribe window.\n const task = await em.transactional(async (trx) => {\n await requireAvailableBalanceQuantity(\n trx,\n ctx,\n {\n warehouseId: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId,\n quantity: input.quantity,\n },\n scope,\n { lock: true },\n )\n return createOpenPutawayTask(trx, ctx, {\n organizationId: input.organizationId,\n tenantId: input.tenantId,\n warehouseId: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n targetLocationId: input.targetLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId,\n quantity: input.quantity,\n priority: input.priority,\n assignedTo: input.assignedTo,\n metadata: {\n ...(input.metadata ?? {}),\n source: 'create_from_balance',\n },\n })\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'created' }])\n void emitWmsEvent('wms.putaway.created', {\n id: task.id,\n warehouseId: input.warehouseId,\n sourceLocationId: task.sourceLocationId,\n targetLocationId: task.targetLocationId ?? null,\n catalogVariantId: task.catalogVariantId,\n quantity: task.quantity,\n tenantId: task.tenantId,\n organizationId: task.organizationId,\n }).catch(() => undefined)\n return { taskId: task.id }\n },\n buildLog: async ({ input, result, ctx }) =>\n buildCrudLog(\n ctx,\n input,\n result?.taskId ?? null,\n 'wms.audit.putaway.createFromBalance',\n 'Create putaway task from balance',\n ),\n}\n\nconst assignPutawayTaskCommand: CommandHandler<PutawayTaskAssignInput, { taskId: string }> = {\n id: 'wms.putaway-tasks.assign',\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = putawayTaskAssignSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n const task = await withLockedPutawayTask(em, ctx, input.id, scope, async (locked, trx) => {\n assertPutawayAssignable(locked.status)\n locked.assignedTo = input.assignedTo\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n void emitWmsEvent('wms.putaway.assigned', {\n id: task.id,\n assignedTo: task.assignedTo,\n tenantId: task.tenantId,\n organizationId: task.organizationId,\n }).catch(() => undefined)\n return { taskId: task.id }\n },\n buildLog: async ({ input, result, ctx }) =>\n buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.assign', 'Assign putaway task'),\n}\n\nconst startPutawayTaskCommand: CommandHandler<PutawayTaskStartInput, { taskId: string }> = {\n id: 'wms.putaway-tasks.start',\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = putawayTaskStartSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n const task = await withLockedPutawayTask(em, ctx, input.id, scope, async (locked, trx) => {\n assertPutawayStartable(locked.status)\n locked.status = 'in_progress'\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n void emitWmsEvent('wms.putaway.started', {\n id: task.id,\n tenantId: task.tenantId,\n organizationId: task.organizationId,\n }).catch(() => undefined)\n return { taskId: task.id }\n },\n buildLog: async ({ input, result, ctx }) =>\n buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.start', 'Start putaway task'),\n}\n\nconst completePutawayTaskCommand: CommandHandler<\n PutawayTaskCompleteInput,\n { taskId: string; movementId: string }\n> = {\n id: 'wms.putaway-tasks.complete',\n // Stock-affecting \u2014 align with Phase 1 inventory undo policy.\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = putawayTaskCompleteSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const rootEm = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n const referenceId = buildPutawayCompleteReferenceId(input.id)\n\n type CompleteOutcome = {\n task: PutawayTask\n warehouseId: string\n taskQuantity: number\n moveResult: InventoryMoveMutationResult\n residual: number\n alreadyDone: boolean\n /** False when movement already existed and only status was finalized (retry-safe). */\n emitCompletedEvent: boolean\n }\n\n // One TX holds PESSIMISTIC_WRITE on the putaway task through move + status\n // update \u2014 nested unlocked commandBus move cannot share that lock.\n const outcome = await rootEm.transactional(async (trx): Promise<CompleteOutcome> => {\n const task = await findOneWithDecryption(\n trx,\n PutawayTask,\n { id: input.id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!task) throw new CrudHttpError(404, { error: 'Putaway task not found.' })\n ensureTenantScope(ctx, task.tenantId)\n ensureOrganizationScope(ctx, task.organizationId)\n await resolvePutawayCompleteAuthorization(ctx, scope, task.assignedTo)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_PUTAWAY_TASK_RESOURCE,\n resourceId: task.id,\n current: task.updatedAt,\n request: ctx.request ?? null,\n })\n\n const warehouseId = typeof task.warehouse === 'string' ? task.warehouse : task.warehouse.id\n const taskQuantity = toNumber(task.quantity)\n const existingByRef = await findPutawayCompleteMovementByReference(trx, scope, referenceId)\n\n if (task.status === 'done') {\n if (!existingByRef) {\n throw new CrudHttpError(409, { error: 'invalid_putaway_state' })\n }\n const existingQty = toNumber(existingByRef.quantity)\n if (Math.abs(existingQty - input.confirmedQuantity) > 0.000001) {\n throw new CrudHttpError(409, { error: 'putaway_complete_quantity_conflict' })\n }\n return {\n task,\n warehouseId,\n taskQuantity,\n moveResult: {\n movementId: existingByRef.id,\n warehouseId,\n catalogVariantId: task.catalogVariantId,\n quantity: existingQty,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n movementEntity: existingByRef,\n balances: [],\n idempotentReplay: true,\n },\n residual: 0,\n alreadyDone: true,\n emitCompletedEvent: false,\n }\n }\n\n assertPutawayCompletable(task.status)\n assertPutawayConfirmedQuantity(taskQuantity, input.confirmedQuantity)\n\n if (existingByRef) {\n const existingQty = toNumber(existingByRef.quantity)\n if (Math.abs(existingQty - input.confirmedQuantity) > 0.000001) {\n // Move already posted for this task with a different qty \u2014 refuse silent\n // double-move under a qty-dependent idempotency key.\n throw new CrudHttpError(409, { error: 'putaway_complete_quantity_conflict' })\n }\n // Move succeeded previously; finish status update on this retry.\n // Suppress wms.putaway.completed \u2014 movement already existed; only status is finalized.\n task.targetLocationId = input.targetLocationId\n task.status = 'done'\n task.quantity = toNumericString(input.confirmedQuantity)\n if (input.lotId) task.lotId = input.lotId\n await trx.flush()\n const residual = putawayResidualQuantity(taskQuantity, input.confirmedQuantity)\n if (residual > 0) {\n await ensureResidualPutawayTask(trx, ctx, {\n scope,\n warehouseId,\n parent: task,\n residual,\n })\n }\n return {\n task,\n warehouseId,\n taskQuantity,\n moveResult: {\n movementId: existingByRef.id,\n warehouseId,\n catalogVariantId: task.catalogVariantId,\n quantity: existingQty,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n movementEntity: existingByRef,\n balances: [],\n idempotentReplay: true,\n },\n residual,\n alreadyDone: false,\n emitCompletedEvent: false,\n }\n }\n\n await requireActiveLocation(trx, ctx, task.sourceLocationId, warehouseId, scope)\n const targetLocation = await requireActiveLocation(\n trx,\n ctx,\n input.targetLocationId,\n warehouseId,\n scope,\n )\n assertPutawayTargetLocationType(targetLocation.type)\n\n const moveInput: InventoryMoveInput = {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n warehouseId,\n fromLocationId: task.sourceLocationId,\n toLocationId: input.targetLocationId,\n catalogVariantId: task.catalogVariantId,\n lotId: input.lotId ?? task.lotId ?? undefined,\n serialNumber: task.serialNumber?.trim() || undefined,\n quantity: input.confirmedQuantity,\n type: 'putaway',\n reason: input.reason ?? 'Putaway task completion',\n referenceType: 'manual',\n referenceId,\n performedBy: input.performedBy,\n performedAt: input.performedAt,\n metadata: {\n ...(input.metadata ?? {}),\n putawayTaskId: task.id,\n source: 'putaway_task_complete',\n },\n }\n const moveResult = await applyInventoryMoveInTransaction(trx, ctx, moveInput)\n\n task.targetLocationId = input.targetLocationId\n task.status = 'done'\n task.quantity = toNumericString(input.confirmedQuantity)\n if (input.lotId) task.lotId = input.lotId\n await trx.flush()\n\n const residual = putawayResidualQuantity(taskQuantity, input.confirmedQuantity)\n if (residual > 0) {\n await ensureResidualPutawayTask(trx, ctx, {\n scope,\n warehouseId,\n parent: task,\n residual,\n })\n }\n\n return {\n task,\n warehouseId,\n taskQuantity,\n moveResult,\n residual,\n alreadyDone: false,\n emitCompletedEvent: true,\n }\n })\n\n if (!outcome.alreadyDone) {\n await emitPutawaySideEffects(ctx, [{ entity: outcome.task, action: 'updated' }])\n }\n await emitInventoryMoveSideEffects(ctx, outcome.moveResult)\n\n if (outcome.emitCompletedEvent) {\n void emitWmsEvent('wms.putaway.completed', {\n id: outcome.task.id,\n movementId: outcome.moveResult.movementId,\n warehouseId: outcome.warehouseId,\n sourceLocationId: outcome.task.sourceLocationId,\n targetLocationId: outcome.task.targetLocationId,\n catalogVariantId: outcome.task.catalogVariantId,\n quantity: toNumericString(input.confirmedQuantity),\n tenantId: outcome.task.tenantId,\n organizationId: outcome.task.organizationId,\n }).catch(() => undefined)\n }\n\n return { taskId: outcome.task.id, movementId: outcome.moveResult.movementId }\n },\n buildLog: async ({ input, result, ctx }) => ({\n ...(await buildCrudLog(\n ctx,\n input,\n result?.taskId ?? null,\n 'wms.audit.putaway.complete',\n 'Complete putaway task',\n )),\n context: { cacheAliases: [WMS_INVENTORY_BALANCE_RESOURCE, WMS_PUTAWAY_TASK_RESOURCE] },\n }),\n}\n\nconst cancelPutawayTaskCommand: CommandHandler<PutawayTaskCancelInput, { taskId: string }> = {\n id: 'wms.putaway-tasks.cancel',\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = putawayTaskCancelSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n const task = await withLockedPutawayTask(em, ctx, input.id, scope, async (locked, trx) => {\n // Re-assert after PESSIMISTIC_WRITE \u2014 concurrent complete may have set `done`.\n assertPutawayCancellable(locked.status)\n locked.status = 'cancelled'\n // Free the unique putaway_key so ASN receive can recreate for the same attempt\n // without unique violation / stranded staging stock.\n locked.putawayKey = null\n await trx.flush()\n return locked\n })\n await emitPutawaySideEffects(ctx, [{ entity: task, action: 'updated' }])\n void emitWmsEvent('wms.putaway.cancelled', {\n id: task.id,\n tenantId: task.tenantId,\n organizationId: task.organizationId,\n }).catch(() => undefined)\n return { taskId: task.id }\n },\n buildLog: async ({ input, result, ctx }) =>\n buildCrudLog(ctx, input, result?.taskId ?? null, 'wms.audit.putaway.cancel', 'Cancel putaway task'),\n}\n\nregisterCommand(createPutawayTaskCommand)\nregisterCommand(updatePutawayTaskCommand)\nregisterCommand(deletePutawayTaskCommand)\nregisterCommand(createPutawayTaskFromBalanceCommand)\nregisterCommand(assignPutawayTaskCommand)\nregisterCommand(startPutawayTaskCommand)\nregisterCommand(completePutawayTaskCommand)\nregisterCommand(cancelPutawayTaskCommand)\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AACpC,SAAS,0BAA0B;AACnC,SAAS,gBAAgB;AAEzB,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,uBAAuB,0BAA0B;AAC1D,SAAS,8CAA8C;AAGvD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OASK;AACP,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAsBP,SAAS,aACP,KACA,UACO;AACP,QAAM,WAAW,UAAU,YAAY,IAAI,MAAM,YAAY;AAC7D,QAAM,iBAAiB,UAAU,kBAAkB,IAAI,0BAA0B,IAAI,MAAM,SAAS;AACpG,MAAI,CAAC,YAAY,CAAC,gBAAgB;AAChC,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,8CAA8C,CAAC;AAAA,EACvF;AACA,SAAO,EAAE,UAAU,eAAe;AACpC;AAEA,SAAS,UAAU,KAA2C;AAC5D,SAAQ,IAAI,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC7D;AAUA,eAAe,oCACb,KACA,OACA,YACe;AACf,QAAM,cAAc,OAAO,IAAI,MAAM,QAAQ,WAAW,IAAI,KAAK,MAAM;AACvE,MAAI,mBAAmB;AACvB,MAAI,qBAAqB;AACzB,MAAI,aAAa;AACf,QAAI;AACF,YAAM,cAAc,IAAI,UAAU,QAAQ,aAAa;AACvD,UAAI,OAAO,YAAY,uBAAuB,YAAY;AACxD;AAAC,SAAC,kBAAkB,kBAAkB,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC1D,YAAY,mBAAmB,aAAa,CAAC,oBAAoB,GAAG,KAAK;AAAA,UACzE,YAAY,mBAAmB,aAAa,CAAC,sBAAsB,GAAG,KAAK;AAAA,QAC7E,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,kCAAgC;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,OAAiF;AACpG,MAAI,UAAU,OAAW,QAAO;AAChC,SAAQ,SAAS;AACnB;AAEA,SAAS,IAAI,OAA8B;AACzC,MAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,SAAO,IAAI,KAAK,KAAK,EAAE,YAAY;AACrC;AAEA,SAAS,oBAAoB,QAA0C;AACrE,QAAM,cAAc,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,OAAO,UAAU;AAC/F,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,gBAAgB,OAAO;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,kBAAkB,OAAO;AAAA,IACzB,kBAAkB,OAAO,oBAAoB;AAAA,IAC7C,kBAAkB,OAAO;AAAA,IACzB,OAAO,OAAO,SAAS;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO,cAAc;AAAA,IACjC,UAAU,OAAO,OAAO,QAAQ;AAAA,IAChC,UAAW,OAAO,YAAY;AAAA,IAC9B,WAAW,IAAI,OAAO,SAAS;AAAA,IAC/B,WAAW,IAAI,OAAO,SAAS;AAAA,EACjC;AACF;AAEA,eAAe,gBACb,IACA,KACA,IACsB;AACtB,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,EAAE,IAAI,WAAW,KAAK;AAAA,IACtB;AAAA,IACA,aAAa,GAAG;AAAA,EAClB;AACA,MAAI,CAAC,KAAM,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAC5E,oBAAkB,KAAK,KAAK,QAAQ;AACpC,0BAAwB,KAAK,KAAK,cAAc;AAChD,SAAO;AACT;AAQA,eAAe,sBACb,IACA,KACA,IACA,OACA,IACY;AACZ,SAAO,GAAG,cAAc,OAAO,QAAQ;AACrC,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA,EAAE,IAAI,WAAW,KAAK;AAAA,MACtB,EAAE,UAAU,SAAS,kBAAkB;AAAA,MACvC;AAAA,IACF;AACA,QAAI,CAAC,KAAM,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAC5E,sBAAkB,KAAK,KAAK,QAAQ;AACpC,4BAAwB,KAAK,KAAK,cAAc;AAChD,UAAM,uCAAuC,IAAI,WAAW;AAAA,MAC1D,cAAc;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,SAAS,IAAI,WAAW;AAAA,IAC1B,CAAC;AACD,WAAO,GAAG,MAAM,GAAG;AAAA,EACrB,CAAC;AACH;AAEA,eAAe,iBAAiB,IAAmB,KAA4B,aAAqB,OAAc;AAChH,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA,EAAE,IAAI,aAAa,WAAW,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,UAAW,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,uBAAuB,CAAC;AAC9E,oBAAkB,KAAK,UAAU,QAAQ;AACzC,0BAAwB,KAAK,UAAU,cAAc;AACrD,SAAO;AACT;AAEA,eAAe,sBACb,IACA,KACA,YACA,aACA,OACA;AACA,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA,EAAE,IAAI,YAAY,WAAW,KAAK;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,SAAU,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,gCAAgC,CAAC;AACtF,oBAAkB,KAAK,SAAS,QAAQ;AACxC,0BAAwB,KAAK,SAAS,cAAc;AACpD,QAAM,sBAAsB,OAAO,SAAS,cAAc,WAAW,SAAS,YAAY,SAAS,UAAU;AAC7G,MAAI,wBAAwB,aAAa;AACvC,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAAA,EAC5D;AACA,MAAI,CAAC,SAAS,UAAU;AACtB,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAwB;AACxC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO;AAChE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,OAAO,SAAS,MAAM,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAEA,eAAe,gCACb,IACA,KACA,OAQA,OACA,SACA;AACA,QAAM,eAAe,MAAM,cAAc,KAAK,IAAI,MAAM,aAAa,KAAK,IAAI;AAC9E,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,kBAAkB,MAAM;AAAA,MACxB,KAAK,MAAM,SAAS;AAAA,MACpB;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,SAAS,OAAO,EAAE,UAAU,SAAS,kBAAkB,IAAI;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAA,EAC9D;AACA,oBAAkB,KAAK,QAAQ,QAAQ;AACvC,0BAAwB,KAAK,QAAQ,cAAc;AAKnD,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AAAA,MACjB,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,MAAM;AAAA,MACxB,OAAO,MAAM,SAAS;AAAA,MACtB;AAAA,MACA,QAAQ,EAAE,KAAK,CAAC,QAAQ,aAAa,EAAE;AAAA,MACvC,WAAW;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,YAAY,wCAAwC;AAAA,IACxD,gBAAgB,SAAS,QAAQ,cAAc;AAAA,IAC/C,kBAAkB,SAAS,QAAQ,gBAAgB;AAAA,IACnD,mBAAmB,SAAS,QAAQ,iBAAiB;AAAA,IACrD,uBAAuB,UACpB,OAAO,CAAC,SAAS,EAAE,SAAS,iBAAiB,KAAK,OAAO,QAAQ,cAAc,EAC/E,IAAI,CAAC,SAAS,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC1C,CAAC;AACD,MAAI,CAAC,oCAAoC,WAAW,MAAM,QAAQ,GAAG;AACnE,UAAM,IAAI,cAAc,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,eAAe,uBACb,KACA,OACA;AACA,QAAM,aAAa,IAAI,UAAU,QAAQ,YAAY;AACrD,aAAW,SAAS,OAAO;AACzB,UAAM,oBAAoB;AAAA,MACxB;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,MACd,aAAa;AAAA,QACX,IAAI,MAAM,OAAO;AAAA,QACjB,gBAAgB,MAAM,OAAO;AAAA,QAC7B,UAAU,MAAM,OAAO;AAAA,MACzB;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,eAAe,aACb,KACA,OACA,UACA,WACA,eACA;AACA,QAAM,EAAE,UAAU,IAAI,MAAM,oBAAoB;AAChD,SAAO;AAAA,IACL,aAAa,UAAU,WAAW,aAAa;AAAA,IAC/C,cAAc;AAAA,IACd,YAAY,YAAY,OAAO,MAAM;AAAA,IACrC,UAAU,OAAO,YAAY,IAAI,MAAM,YAAY;AAAA,IACnD,gBAAgB,OAAO,kBAAkB,IAAI,0BAA0B,IAAI,MAAM,SAAS;AAAA,EAC5F;AACF;AAUA,SAAS,wBAAwB,MAAwC;AACvE,QAAM,cAAc,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,KAAK,UAAU;AACzF,QAAM,eAAe,KAAK,cAAc,KAAK,KAAK;AAClD,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,KAAK;AAAA,IACvB,kBAAkB,KAAK;AAAA,IACvB,OAAO,KAAK,SAAS;AAAA,IACrB,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,EACzD;AACF;AAEA,SAAS,wBAAwB,MAA2B,OAAqC;AAC/F,SACE,KAAK,gBAAgB,MAAM,eAC3B,KAAK,qBAAqB,MAAM,oBAChC,KAAK,qBAAqB,MAAM,qBAC/B,KAAK,SAAS,WAAW,MAAM,SAAS,UACxC,KAAK,gBAAgB,WAAW,MAAM,gBAAgB;AAE3D;AAEA,eAAe,+BACb,IACA,KACA,OACA,OAOe;AACf,QAAM,gBAAgB,CAAC,wBAAwB,MAAM,UAAU,MAAM,IAAI;AACzE,QAAM,oBAAoB,MAAM,eAAe,MAAM,mBAAmB;AACxE,MAAI,CAAC,iBAAiB,CAAC,kBAAmB;AAC1C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,MAAM,KAAK;AAAA,MACxB,kBAAkB,MAAM,KAAK;AAAA,MAC7B,kBAAkB,MAAM,KAAK;AAAA,MAC7B,OAAO,MAAM,KAAK;AAAA,MAClB,cAAc,MAAM,KAAK;AAAA,MACzB,UAAU,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA,EAAE,MAAM,MAAM,eAAe,MAAM,cAAc;AAAA,EACnD;AACF;AAEA,eAAe,sBACb,IACA,KACA,OACsB;AACtB,QAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,QAAM,iBAAiB,IAAI,KAAK,MAAM,aAAa,KAAK;AACxD,QAAM,sBAAsB,IAAI,KAAK,MAAM,kBAAkB,MAAM,aAAa,KAAK;AACrF,MAAI,MAAM,kBAAkB;AAC1B,UAAM,sBAAsB,IAAI,KAAK,MAAM,kBAAkB,MAAM,aAAa,KAAK;AAAA,EACvF;AACA,QAAM,OAAO,GAAG,OAAO,aAAa;AAAA,IAClC,gBAAgB,MAAM;AAAA,IACtB,UAAU,MAAM;AAAA,IAChB,WAAW,GAAG,aAAa,WAAW,MAAM,WAAW;AAAA,IACvD,kBAAkB,MAAM;AAAA,IACxB,kBAAkB,MAAM,oBAAoB;AAAA,IAC5C,kBAAkB,MAAM;AAAA,IACxB,OAAO,MAAM,SAAS;AAAA,IACtB,cAAc,MAAM,cAAc,KAAK,IAAI,MAAM,aAAa,KAAK,IAAI;AAAA,IACvE,UAAU,gBAAgB,MAAM,QAAQ;AAAA,IACxC,QAAQ;AAAA,IACR,YAAY,MAAM,cAAc;AAAA,IAChC,UAAU,MAAM,YAAY;AAAA,IAC5B,YAAY,MAAM,cAAc;AAAA,IAChC,UAAU,YAAY,MAAM,QAAQ,KAAK;AAAA,EAC3C,CAAC;AACD,QAAM,GAAG,QAAQ,IAAI,EAAE,MAAM;AAC7B,SAAO;AACT;AAEA,eAAe,0BACb,IACA,KACA,OAMe;AACf,QAAM,cAAc,wBAAwB,MAAM,OAAO,EAAE;AAC3D,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,MACE,gBAAgB,MAAM,MAAM;AAAA,MAC5B,UAAU,MAAM,MAAM;AAAA,MACtB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ,EAAE,KAAK,CAAC,QAAQ,eAAe,MAAM,EAAE;AAAA,IACjD;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACA,MAAI,SAAU;AACd,MAAI;AACF,UAAM,sBAAsB,IAAI,KAAK;AAAA,MACnC,gBAAgB,MAAM,MAAM;AAAA,MAC5B,UAAU,MAAM,MAAM;AAAA,MACtB,aAAa,MAAM;AAAA,MACnB,kBAAkB,MAAM,OAAO;AAAA,MAC/B,kBAAkB;AAAA,MAClB,kBAAkB,MAAM,OAAO;AAAA,MAC/B,OAAO,MAAM,OAAO;AAAA,MACpB,cAAc,MAAM,OAAO,gBAAgB;AAAA,MAC3C,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM,OAAO;AAAA,MACzB,UAAU,MAAM,OAAO;AAAA,MACvB,YAAY;AAAA,MACZ,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,qBAAqB,MAAM,OAAO;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,OAAO,SAAS,OAAO,UAAU,WAAY,MAA4B,OAAO;AACtF,UAAM,OAAO,SAAS,OAAO,UAAU,WAAY,MAA4B,OAAO;AACtF,QAAI,SAAS,WAAW,SAAS,qCAAsC,OAAM;AAAA,EAC/E;AACF;AAEA,MAAM,2BAAuF;AAAA,EAC3F,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,wBAAwB,MAAM,YAAY,CAAC,CAAC;AAC1D,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,KAAK,KAAK;AAGrC,UAAM,OAAO,MAAM,GAAG,cAAc,OAAO,QAAQ;AACjD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,UACE,aAAa,MAAM;AAAA,UACnB,kBAAkB,MAAM;AAAA,UACxB,kBAAkB,MAAM;AAAA,UACxB,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,aAAO,sBAAsB,KAAK,KAAK,KAAK;AAAA,IAC9C,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,SAAK,aAAa,uBAAuB;AAAA,MACvC,IAAI,KAAK;AAAA,MACT,aAAa,MAAM;AAAA,MACnB,kBAAkB,KAAK;AAAA,MACvB,kBAAkB,KAAK,oBAAoB;AAAA,MAC3C,kBAAkB,KAAK;AAAA,MACvB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,cAAc,OAAO,QAAQ,QAAQ,QAAQ;AAC3C,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,OAAO,MAAM,gBAAgB,UAAU,GAAG,GAAG,KAAK,OAAO,MAAM;AACrE,WAAO,oBAAoB,IAAI;AAAA,EACjC;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA2D,QAAQ;AACnF,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO,GAAI;AAChB,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe;AAG/E,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,QAAQ,QAAQ;AACxF,UAAI,OAAO,WAAW,QAAQ;AAC5B,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,MACjE;AACA,aAAO,YAAY,oBAAI,KAAK;AAC5B,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,UAAU,OAAO,EAAE,WAAW,OAAO,QAAQ,IAAI,MAAM;AACrD,UAAM,QAAQ,WAAW;AACzB,WAAO;AAAA,MACL,GAAI,MAAM,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,4BAA4B,qBAAqB;AAAA,MAC5G,eAAe;AAAA,MACf,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,MAAM,2BAAuF;AAAA,EAC3F,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,KAAK,UAAW,UAAqC,IAAI,cAAc;AAC7E,UAAM,OAAO,MAAM,gBAAgB,UAAU,GAAG,GAAG,KAAK,EAAE;AAC1D,WAAO,EAAE,QAAQ,oBAAoB,IAAI,EAAE;AAAA,EAC7C;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK;AAC3B,0CAAsC,QAAQ;AAC9C,UAAM,QAAQ,wBAAwB,MAAM,YAAY,CAAC,CAAC;AAC1D,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,GAAG;AAG9B,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,QAAQ,QAAQ;AACxF,UAAI,OAAO,WAAW,UAAU,OAAO,WAAW,aAAa;AAC7D,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,MACjE;AACA,YAAM,iBAAiB,wBAAwB,MAAM;AACrD,YAAM,aAAkC;AAAA,QACtC,aAAa,MAAM,eAAe,eAAe;AAAA,QACjD,kBAAkB,MAAM,oBAAoB,eAAe;AAAA,QAC3D,kBAAkB,MAAM,oBAAoB,eAAe;AAAA,QAC3D,OAAO,MAAM,UAAU,SAAY,MAAM,QAAQ,eAAe;AAAA,QAChE,cAAc,eAAe;AAAA,MAC/B;AACA,YAAM,cAAc,SAAS,OAAO,QAAQ;AAC5C,YAAM,UAAU,MAAM,aAAa,SAAY,OAAO,MAAM,QAAQ,IAAI;AACxE,YAAM,YAAY,aAAa,KAAK;AAAA,QAClC,UAAU,OAAO;AAAA,QACjB,gBAAgB,OAAO;AAAA,MACzB,CAAC;AACD,UAAI,MAAM,aAAa;AACrB,cAAM,iBAAiB,KAAK,KAAK,MAAM,aAAa,SAAS;AAAA,MAC/D;AACA,UAAI,MAAM,kBAAkB;AAC1B,cAAM,sBAAsB,KAAK,KAAK,MAAM,kBAAkB,WAAW,aAAa,SAAS;AAAA,MACjG;AACA,UAAI,MAAM,kBAAkB;AAC1B,cAAM,sBAAsB,KAAK,KAAK,MAAM,kBAAkB,WAAW,aAAa,SAAS;AAAA,MACjG;AAGA,YAAM,+BAA+B,KAAK,KAAK,WAAW;AAAA,QACxD,UAAU;AAAA,QACV,MAAM;AAAA,QACN,kBAAkB;AAAA,QAClB,cAAc;AAAA,QACd,eAAe,OAAO;AAAA,MACxB,CAAC;AACD,UAAI,MAAM,aAAa;AACrB,eAAO,YAAY,IAAI,aAAa,WAAW,MAAM,WAAW;AAAA,MAClE;AACA,UAAI,MAAM,iBAAkB,QAAO,mBAAmB,MAAM;AAC5D,UAAI,MAAM,qBAAqB,OAAW,QAAO,mBAAmB,MAAM;AAC1E,UAAI,MAAM,qBAAqB,OAAW,QAAO,mBAAmB,MAAM;AAC1E,UAAI,MAAM,UAAU,OAAW,QAAO,QAAQ,MAAM;AACpD,UAAI,MAAM,aAAa,OAAW,QAAO,WAAW,gBAAgB,MAAM,QAAQ;AAClF,UAAI,MAAM,aAAa,OAAW,QAAO,WAAW,MAAM;AAC1D,UAAI,MAAM,aAAa,OAAW,QAAO,WAAW,YAAY,MAAM,QAAQ,KAAK;AACnF,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,cAAc,OAAO,QAAQ,QAAQ,QAAQ;AAC3C,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,UAAM,OAAO,MAAM,gBAAgB,UAAU,GAAG,GAAG,KAAK,OAAO,MAAM;AACrE,WAAO,oBAAoB,IAAI;AAAA,EACjC;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA4D,QAAQ;AACpF,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,QAAQ,GAAI;AACjB,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAEjF,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,QAAQ,QAAQ;AACzF,UAAI,OAAO,WAAW,UAAU,OAAO,WAAW,aAAa;AAC7D,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,MACjE;AACA,UAAI,OAAO,WAAW,UAAU,OAAO,WAAW,aAAa;AAC7D,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,MACjE;AACA,YAAM,iBAAiB,wBAAwB,MAAM;AACrD,YAAM,iBAAsC;AAAA,QAC1C,aAAa,OAAO;AAAA,QACpB,kBAAkB,OAAO;AAAA,QACzB,kBAAkB,OAAO;AAAA,QACzB,OAAO,OAAO,SAAS;AAAA,QACvB,cAAc,eAAe;AAAA,MAC/B;AACA,YAAM,+BAA+B,KAAK,KAAK,OAAO;AAAA,QACpD,UAAU;AAAA,QACV,MAAM;AAAA,QACN,kBAAkB,SAAS,OAAO,QAAQ;AAAA,QAC1C,cAAc,SAAS,OAAO,QAAQ;AAAA,QACtC,eAAe,OAAO;AAAA,MACxB,CAAC;AACD,aAAO,YAAY,IAAI,aAAa,WAAW,OAAO,WAAW;AACjE,aAAO,mBAAmB,OAAO;AACjC,aAAO,mBAAmB,OAAO;AACjC,aAAO,mBAAmB,OAAO;AACjC,aAAO,QAAQ,OAAO;AACtB,aAAO,WAAW,OAAO;AACzB,aAAO,SAAS,OAAO;AACvB,aAAO,aAAa,OAAO;AAC3B,aAAO,WAAW,OAAO;AACzB,aAAO,WAAW,OAAO;AACzB,aAAO,YAAY;AACnB,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,UAAU,OAAO,EAAE,WAAW,OAAO,QAAQ,IAAI,MAAM;AACrD,UAAM,SAAS,WAAW;AAC1B,UAAM,QAAQ,WAAW;AACzB,WAAO;AAAA,MACL,GAAI,MAAM,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,4BAA4B,qBAAqB;AAAA,MAC5G,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,SAAS,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE;AAAA,IACrC;AAAA,EACF;AACF;AAEA,MAAM,2BAA+E;AAAA,EACnF,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,KAAK,UAAW,UAAqC,IAAI,cAAc;AAC7E,UAAM,OAAO,MAAM,gBAAgB,UAAU,GAAG,GAAG,KAAK,EAAE;AAC1D,WAAO,EAAE,QAAQ,oBAAoB,IAAI,EAAE;AAAA,EAC7C;AAAA,EACA,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,KAAK,UAAW,UAAqC,IAAI,cAAc;AAC7E,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,GAAG;AAC9B,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,IAAI,OAAO,OAAO,QAAQ,QAAQ;AAIlF,6BAAuB,OAAO,MAAM;AACpC,aAAO,YAAY,oBAAI,KAAK;AAC5B,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,MAAM,OAAO,EAAE,UAAU,IAAI,MAAM;AACjC,UAAM,UAAU,mBAA4D,QAAQ;AACpF,UAAM,SAAS,SAAS;AACxB,QAAI,CAAC,QAAQ,GAAI;AACjB,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,EAAE,UAAU,OAAO,UAAU,gBAAgB,OAAO,eAAe;AAGjF,UAAM,OAAO,MAAM,GAAG,cAAc,OAAO,QAAQ;AACjD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA,EAAE,IAAI,OAAO,GAAG;AAAA,QAChB,EAAE,UAAU,SAAS,kBAAkB;AAAA,QACvC;AAAA,MACF;AACA,UAAI,CAAC,OAAQ,QAAO;AACpB,wBAAkB,KAAK,OAAO,QAAQ;AACtC,8BAAwB,KAAK,OAAO,cAAc;AAElD,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,MACjE;AACA,UAAI,CAAC,OAAO,UAAW,QAAO;AAC9B,aAAO,YAAY;AACnB,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,QAAI,CAAC,KAAM;AACX,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,UAAU,OAAO,EAAE,WAAW,OAAO,QAAQ,IAAI,MAAM;AACrD,UAAM,SAAS,WAAW;AAC1B,WAAO;AAAA,MACL,GAAI,MAAM,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,4BAA4B,qBAAqB;AAAA,MAC5G,gBAAgB;AAAA,MAChB,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,MAAM,sCAGF;AAAA,EACF,IAAI;AAAA,EACJ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,mCAAmC,MAAM,YAAY,CAAC,CAAC;AACrE,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,KAAK,KAAK;AAGrC,UAAM,OAAO,MAAM,GAAG,cAAc,OAAO,QAAQ;AACjD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,UACE,aAAa,MAAM;AAAA,UACnB,kBAAkB,MAAM;AAAA,UACxB,kBAAkB,MAAM;AAAA,UACxB,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,aAAO,sBAAsB,KAAK,KAAK;AAAA,QACrC,gBAAgB,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,QACnB,kBAAkB,MAAM;AAAA,QACxB,kBAAkB,MAAM;AAAA,QACxB,kBAAkB,MAAM;AAAA,QACxB,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,YAAY,MAAM;AAAA,QAClB,UAAU;AAAA,UACR,GAAI,MAAM,YAAY,CAAC;AAAA,UACvB,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,SAAK,aAAa,uBAAuB;AAAA,MACvC,IAAI,KAAK;AAAA,MACT,aAAa,MAAM;AAAA,MACnB,kBAAkB,KAAK;AAAA,MACvB,kBAAkB,KAAK,oBAAoB;AAAA,MAC3C,kBAAkB,KAAK;AAAA,MACvB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,UAAU,OAAO,EAAE,OAAO,QAAQ,IAAI,MACpC;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,UAAU;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACJ;AAEA,MAAM,2BAAuF;AAAA,EAC3F,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,wBAAwB,MAAM,YAAY,CAAC,CAAC;AAC1D,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,QAAQ,QAAQ;AACxF,8BAAwB,OAAO,MAAM;AACrC,aAAO,aAAa,MAAM;AAC1B,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,SAAK,aAAa,wBAAwB;AAAA,MACxC,IAAI,KAAK;AAAA,MACT,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,UAAU,OAAO,EAAE,OAAO,QAAQ,IAAI,MACpC,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,4BAA4B,qBAAqB;AACtG;AAEA,MAAM,0BAAqF;AAAA,EACzF,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,uBAAuB,MAAM,YAAY,CAAC,CAAC;AACzD,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,QAAQ,QAAQ;AACxF,6BAAuB,OAAO,MAAM;AACpC,aAAO,SAAS;AAChB,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,SAAK,aAAa,uBAAuB;AAAA,MACvC,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,UAAU,OAAO,EAAE,OAAO,QAAQ,IAAI,MACpC,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,2BAA2B,oBAAoB;AACpG;AAEA,MAAM,6BAGF;AAAA,EACF,IAAI;AAAA;AAAA,EAEJ,YAAY;AAAA,EACZ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,0BAA0B,MAAM,YAAY,CAAC,CAAC;AAC5D,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,SAAS,UAAU,GAAG;AAC5B,UAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,UAAM,cAAc,gCAAgC,MAAM,EAAE;AAe5D,UAAM,UAAU,MAAM,OAAO,cAAc,OAAO,QAAkC;AAClF,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA,EAAE,IAAI,MAAM,IAAI,WAAW,KAAK;AAAA,QAChC,EAAE,UAAU,SAAS,kBAAkB;AAAA,QACvC;AAAA,MACF;AACA,UAAI,CAAC,KAAM,OAAM,IAAI,cAAc,KAAK,EAAE,OAAO,0BAA0B,CAAC;AAC5E,wBAAkB,KAAK,KAAK,QAAQ;AACpC,8BAAwB,KAAK,KAAK,cAAc;AAChD,YAAM,oCAAoC,KAAK,OAAO,KAAK,UAAU;AACrE,YAAM,uCAAuC,IAAI,WAAW;AAAA,QAC1D,cAAc;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,QACd,SAAS,IAAI,WAAW;AAAA,MAC1B,CAAC;AAED,YAAM,cAAc,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY,KAAK,UAAU;AACzF,YAAM,eAAe,SAAS,KAAK,QAAQ;AAC3C,YAAM,gBAAgB,MAAM,uCAAuC,KAAK,OAAO,WAAW;AAE1F,UAAI,KAAK,WAAW,QAAQ;AAC1B,YAAI,CAAC,eAAe;AAClB,gBAAM,IAAI,cAAc,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,QACjE;AACA,cAAM,cAAc,SAAS,cAAc,QAAQ;AACnD,YAAI,KAAK,IAAI,cAAc,MAAM,iBAAiB,IAAI,MAAU;AAC9D,gBAAM,IAAI,cAAc,KAAK,EAAE,OAAO,qCAAqC,CAAC;AAAA,QAC9E;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,YACV,YAAY,cAAc;AAAA,YAC1B;AAAA,YACA,kBAAkB,KAAK;AAAA,YACvB,UAAU;AAAA,YACV,UAAU,MAAM;AAAA,YAChB,gBAAgB,MAAM;AAAA,YACtB,gBAAgB;AAAA,YAChB,UAAU,CAAC;AAAA,YACX,kBAAkB;AAAA,UACpB;AAAA,UACA,UAAU;AAAA,UACV,aAAa;AAAA,UACb,oBAAoB;AAAA,QACtB;AAAA,MACF;AAEA,+BAAyB,KAAK,MAAM;AACpC,qCAA+B,cAAc,MAAM,iBAAiB;AAEpE,UAAI,eAAe;AACjB,cAAM,cAAc,SAAS,cAAc,QAAQ;AACnD,YAAI,KAAK,IAAI,cAAc,MAAM,iBAAiB,IAAI,MAAU;AAG9D,gBAAM,IAAI,cAAc,KAAK,EAAE,OAAO,qCAAqC,CAAC;AAAA,QAC9E;AAGA,aAAK,mBAAmB,MAAM;AAC9B,aAAK,SAAS;AACd,aAAK,WAAW,gBAAgB,MAAM,iBAAiB;AACvD,YAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,cAAM,IAAI,MAAM;AAChB,cAAMA,YAAW,wBAAwB,cAAc,MAAM,iBAAiB;AAC9E,YAAIA,YAAW,GAAG;AAChB,gBAAM,0BAA0B,KAAK,KAAK;AAAA,YACxC;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,UAAAA;AAAA,UACF,CAAC;AAAA,QACH;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,YACV,YAAY,cAAc;AAAA,YAC1B;AAAA,YACA,kBAAkB,KAAK;AAAA,YACvB,UAAU;AAAA,YACV,UAAU,MAAM;AAAA,YAChB,gBAAgB,MAAM;AAAA,YACtB,gBAAgB;AAAA,YAChB,UAAU,CAAC;AAAA,YACX,kBAAkB;AAAA,UACpB;AAAA,UACA,UAAAA;AAAA,UACA,aAAa;AAAA,UACb,oBAAoB;AAAA,QACtB;AAAA,MACF;AAEA,YAAM,sBAAsB,KAAK,KAAK,KAAK,kBAAkB,aAAa,KAAK;AAC/E,YAAM,iBAAiB,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AACA,sCAAgC,eAAe,IAAI;AAEnD,YAAM,YAAgC;AAAA,QACpC,gBAAgB,MAAM;AAAA,QACtB,UAAU,MAAM;AAAA,QAChB;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,cAAc,MAAM;AAAA,QACpB,kBAAkB,KAAK;AAAA,QACvB,OAAO,MAAM,SAAS,KAAK,SAAS;AAAA,QACpC,cAAc,KAAK,cAAc,KAAK,KAAK;AAAA,QAC3C,UAAU,MAAM;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,MAAM,UAAU;AAAA,QACxB,eAAe;AAAA,QACf;AAAA,QACA,aAAa,MAAM;AAAA,QACnB,aAAa,MAAM;AAAA,QACnB,UAAU;AAAA,UACR,GAAI,MAAM,YAAY,CAAC;AAAA,UACvB,eAAe,KAAK;AAAA,UACpB,QAAQ;AAAA,QACV;AAAA,MACF;AACA,YAAM,aAAa,MAAM,gCAAgC,KAAK,KAAK,SAAS;AAE5E,WAAK,mBAAmB,MAAM;AAC9B,WAAK,SAAS;AACd,WAAK,WAAW,gBAAgB,MAAM,iBAAiB;AACvD,UAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,YAAM,IAAI,MAAM;AAEhB,YAAM,WAAW,wBAAwB,cAAc,MAAM,iBAAiB;AAC9E,UAAI,WAAW,GAAG;AAChB,cAAM,0BAA0B,KAAK,KAAK;AAAA,UACxC;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,oBAAoB;AAAA,MACtB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ,aAAa;AACxB,YAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AAAA,IACjF;AACA,UAAM,6BAA6B,KAAK,QAAQ,UAAU;AAE1D,QAAI,QAAQ,oBAAoB;AAC9B,WAAK,aAAa,yBAAyB;AAAA,QACzC,IAAI,QAAQ,KAAK;AAAA,QACjB,YAAY,QAAQ,WAAW;AAAA,QAC/B,aAAa,QAAQ;AAAA,QACrB,kBAAkB,QAAQ,KAAK;AAAA,QAC/B,kBAAkB,QAAQ,KAAK;AAAA,QAC/B,kBAAkB,QAAQ,KAAK;AAAA,QAC/B,UAAU,gBAAgB,MAAM,iBAAiB;AAAA,QACjD,UAAU,QAAQ,KAAK;AAAA,QACvB,gBAAgB,QAAQ,KAAK;AAAA,MAC/B,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAC1B;AAEA,WAAO,EAAE,QAAQ,QAAQ,KAAK,IAAI,YAAY,QAAQ,WAAW,WAAW;AAAA,EAC9E;AAAA,EACA,UAAU,OAAO,EAAE,OAAO,QAAQ,IAAI,OAAO;AAAA,IAC3C,GAAI,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,EAAE,cAAc,CAAC,gCAAgC,yBAAyB,EAAE;AAAA,EACvF;AACF;AAEA,MAAM,2BAAuF;AAAA,EAC3F,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,MAAM,QAAQ,UAAU,KAAK;AAC3B,UAAM,QAAQ,wBAAwB,MAAM,YAAY,CAAC,CAAC;AAC1D,sBAAkB,KAAK,MAAM,QAAQ;AACrC,4BAAwB,KAAK,MAAM,cAAc;AACjD,UAAM,KAAK,UAAU,GAAG;AACxB,UAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,UAAM,OAAO,MAAM,sBAAsB,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,QAAQ,QAAQ;AAExF,+BAAyB,OAAO,MAAM;AACtC,aAAO,SAAS;AAGhB,aAAO,aAAa;AACpB,YAAM,IAAI,MAAM;AAChB,aAAO;AAAA,IACT,CAAC;AACD,UAAM,uBAAuB,KAAK,CAAC,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC,CAAC;AACvE,SAAK,aAAa,yBAAyB;AAAA,MACzC,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,MAAS;AACxB,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC3B;AAAA,EACA,UAAU,OAAO,EAAE,OAAO,QAAQ,IAAI,MACpC,aAAa,KAAK,OAAO,QAAQ,UAAU,MAAM,4BAA4B,qBAAqB;AACtG;AAEA,gBAAgB,wBAAwB;AACxC,gBAAgB,wBAAwB;AACxC,gBAAgB,wBAAwB;AACxC,gBAAgB,mCAAmC;AACnD,gBAAgB,wBAAwB;AACxC,gBAAgB,uBAAuB;AACvC,gBAAgB,0BAA0B;AAC1C,gBAAgB,wBAAwB;",
|
|
6
|
+
"names": ["residual"]
|
|
7
|
+
}
|
|
@@ -66,13 +66,60 @@ const inventoryMovementCrudEvents = {
|
|
|
66
66
|
tenantId: ctx.identifiers.tenantId
|
|
67
67
|
})
|
|
68
68
|
};
|
|
69
|
+
const asnCrudIndexer = {
|
|
70
|
+
entityType: E.wms.asn
|
|
71
|
+
};
|
|
72
|
+
const receivingLineCrudIndexer = {
|
|
73
|
+
entityType: E.wms.receiving_line
|
|
74
|
+
};
|
|
75
|
+
const asnCrudEvents = {
|
|
76
|
+
module: "wms",
|
|
77
|
+
entity: "asn",
|
|
78
|
+
persistent: true,
|
|
79
|
+
buildPayload: (ctx) => ({
|
|
80
|
+
id: ctx.identifiers.id,
|
|
81
|
+
organizationId: ctx.identifiers.organizationId,
|
|
82
|
+
tenantId: ctx.identifiers.tenantId
|
|
83
|
+
})
|
|
84
|
+
};
|
|
85
|
+
const receivingLineCrudEvents = {
|
|
86
|
+
module: "wms",
|
|
87
|
+
entity: "receiving_line",
|
|
88
|
+
persistent: true,
|
|
89
|
+
buildPayload: (ctx) => ({
|
|
90
|
+
id: ctx.identifiers.id,
|
|
91
|
+
organizationId: ctx.identifiers.organizationId,
|
|
92
|
+
tenantId: ctx.identifiers.tenantId
|
|
93
|
+
})
|
|
94
|
+
};
|
|
95
|
+
const putawayTaskCrudIndexer = {
|
|
96
|
+
entityType: E.wms.putaway_task
|
|
97
|
+
};
|
|
98
|
+
const putawayTaskCrudEvents = {
|
|
99
|
+
module: "wms",
|
|
100
|
+
entity: "putaway_task",
|
|
101
|
+
persistent: true,
|
|
102
|
+
buildPayload: (ctx) => ({
|
|
103
|
+
id: ctx.identifiers.id,
|
|
104
|
+
organizationId: ctx.identifiers.organizationId,
|
|
105
|
+
tenantId: ctx.identifiers.tenantId
|
|
106
|
+
})
|
|
107
|
+
};
|
|
69
108
|
const WMS_INVENTORY_BALANCE_RESOURCE = "wms.inventoryBalance";
|
|
70
109
|
const WMS_INVENTORY_RESERVATION_RESOURCE = "wms.inventoryReservation";
|
|
71
110
|
const WMS_INVENTORY_MOVEMENT_RESOURCE = "wms.inventoryMovement";
|
|
111
|
+
const WMS_ASN_RESOURCE = "wms.asn";
|
|
112
|
+
const WMS_RECEIVING_LINE_RESOURCE = "wms.receivingLine";
|
|
113
|
+
const WMS_PUTAWAY_TASK_RESOURCE = "wms.putawayTask";
|
|
72
114
|
export {
|
|
115
|
+
WMS_ASN_RESOURCE,
|
|
73
116
|
WMS_INVENTORY_BALANCE_RESOURCE,
|
|
74
117
|
WMS_INVENTORY_MOVEMENT_RESOURCE,
|
|
75
118
|
WMS_INVENTORY_RESERVATION_RESOURCE,
|
|
119
|
+
WMS_PUTAWAY_TASK_RESOURCE,
|
|
120
|
+
WMS_RECEIVING_LINE_RESOURCE,
|
|
121
|
+
asnCrudEvents,
|
|
122
|
+
asnCrudIndexer,
|
|
76
123
|
ensureOrganizationScope,
|
|
77
124
|
ensureTenantScope,
|
|
78
125
|
inventoryBalanceCrudEvents,
|
|
@@ -82,6 +129,10 @@ export {
|
|
|
82
129
|
inventoryReservationCrudEvents,
|
|
83
130
|
inventoryReservationCrudIndexer,
|
|
84
131
|
normalizeOptionalString,
|
|
132
|
+
putawayTaskCrudEvents,
|
|
133
|
+
putawayTaskCrudIndexer,
|
|
134
|
+
receivingLineCrudEvents,
|
|
135
|
+
receivingLineCrudIndexer,
|
|
85
136
|
requireId,
|
|
86
137
|
toNumericString,
|
|
87
138
|
warehouseCrudIndexer,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/wms/commands/shared.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { ensureOrganizationScope } from '@open-mercato/shared/lib/commands/scope'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n InventoryBalance,\n InventoryMovement,\n InventoryReservation,\n Warehouse,\n WarehouseZone,\n} from '../data/entities'\n\nexport function ensureTenantScope(ctx: CommandRuntimeContext, tenantId: string): void {\n const currentTenant = ctx.auth?.tenantId ?? null\n if (currentTenant && currentTenant !== tenantId) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nexport function requireId(id: string | null | undefined, label: string): string {\n if (typeof id === 'string' && id.trim().length > 0) return id.trim()\n throw new CrudHttpError(400, { error: `${label} id is required.` })\n}\n\nexport function normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function toNumericString(value: number | string | null | undefined, fallback = '0'): string {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return fallback\n}\n\n// CRUD indexer configs \u2014 used by emitCrudSideEffects to drive query_index updates.\n// Cache invalidation cross-aliases (e.g. balance lists invalidated when a reservation mutates)\n// are declared in command-level metadata.context.cacheAliases so the command bus picks them up.\nexport const inventoryBalanceCrudIndexer: CrudIndexerConfig<InventoryBalance> = {\n entityType: E.wms.inventory_balance,\n}\n\nexport const inventoryReservationCrudIndexer: CrudIndexerConfig<InventoryReservation> = {\n entityType: E.wms.inventory_reservation,\n}\n\nexport const inventoryMovementCrudIndexer: CrudIndexerConfig<InventoryMovement> = {\n entityType: E.wms.inventory_movement,\n}\n\n// Zones are read through the hybrid query engine, which projects `cf:*` out of\n// `entity_indexes` rather than joining `custom_field_values`. Without this indexer the\n// zone commands write custom field values that no read path can ever see (#5239).\nexport const warehouseZoneCrudIndexer: CrudIndexerConfig<WarehouseZone> = {\n entityType: E.wms.warehouse_zone,\n}\n\n// Warehouse list/search goes through the hybrid query engine. Writing a custom\n// field upserts `entity_indexes`; delete must tombstone that row. A leftover\n// live index document makes `indexAnyRows` true and hides later warehouses that\n// were never indexed (empty combobox on the same integration shard).\nexport const warehouseCrudIndexer: CrudIndexerConfig<Warehouse> = {\n entityType: E.wms.warehouse,\n}\n\nexport const inventoryBalanceCrudEvents: CrudEventsConfig<InventoryBalance> = {\n module: 'wms',\n entity: 'inventory_balance',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryReservationCrudEvents: CrudEventsConfig<InventoryReservation> = {\n module: 'wms',\n entity: 'inventory_reservation',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryMovementCrudEvents: CrudEventsConfig<InventoryMovement> = {\n module: 'wms',\n entity: 'inventory_movement',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\n// Cache alias resource kinds used to extend command-level cache invalidation\n// when a single mutation impacts multiple list resources.\nexport const WMS_INVENTORY_BALANCE_RESOURCE = 'wms.inventoryBalance'\nexport const WMS_INVENTORY_RESERVATION_RESOURCE = 'wms.inventoryReservation'\nexport const WMS_INVENTORY_MOVEMENT_RESOURCE = 'wms.inventoryMovement'\n\nexport { ensureOrganizationScope }\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,qBAAqB;AAC9B,SAAS,+BAA+B;AAExC,SAAS,SAAS;
|
|
4
|
+
"sourcesContent": ["import type { CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { ensureOrganizationScope } from '@open-mercato/shared/lib/commands/scope'\nimport type { CrudIndexerConfig, CrudEventsConfig } from '@open-mercato/shared/lib/crud/types'\nimport { E } from '#generated/entities.ids.generated'\nimport {\n Asn,\n InventoryBalance,\n InventoryMovement,\n InventoryReservation,\n PutawayTask,\n ReceivingLine,\n Warehouse,\n WarehouseZone,\n} from '../data/entities'\n\nexport function ensureTenantScope(ctx: CommandRuntimeContext, tenantId: string): void {\n const currentTenant = ctx.auth?.tenantId ?? null\n if (currentTenant && currentTenant !== tenantId) {\n throw new CrudHttpError(403, { error: 'Forbidden' })\n }\n}\n\nexport function requireId(id: string | null | undefined, label: string): string {\n if (typeof id === 'string' && id.trim().length > 0) return id.trim()\n throw new CrudHttpError(400, { error: `${label} id is required.` })\n}\n\nexport function normalizeOptionalString(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function toNumericString(value: number | string | null | undefined, fallback = '0'): string {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n return fallback\n}\n\n// CRUD indexer configs \u2014 used by emitCrudSideEffects to drive query_index updates.\n// Cache invalidation cross-aliases (e.g. balance lists invalidated when a reservation mutates)\n// are declared in command-level metadata.context.cacheAliases so the command bus picks them up.\nexport const inventoryBalanceCrudIndexer: CrudIndexerConfig<InventoryBalance> = {\n entityType: E.wms.inventory_balance,\n}\n\nexport const inventoryReservationCrudIndexer: CrudIndexerConfig<InventoryReservation> = {\n entityType: E.wms.inventory_reservation,\n}\n\nexport const inventoryMovementCrudIndexer: CrudIndexerConfig<InventoryMovement> = {\n entityType: E.wms.inventory_movement,\n}\n\n// Zones are read through the hybrid query engine, which projects `cf:*` out of\n// `entity_indexes` rather than joining `custom_field_values`. Without this indexer the\n// zone commands write custom field values that no read path can ever see (#5239).\nexport const warehouseZoneCrudIndexer: CrudIndexerConfig<WarehouseZone> = {\n entityType: E.wms.warehouse_zone,\n}\n\n// Warehouse list/search goes through the hybrid query engine. Writing a custom\n// field upserts `entity_indexes`; delete must tombstone that row. A leftover\n// live index document makes `indexAnyRows` true and hides later warehouses that\n// were never indexed (empty combobox on the same integration shard).\nexport const warehouseCrudIndexer: CrudIndexerConfig<Warehouse> = {\n entityType: E.wms.warehouse,\n}\n\nexport const inventoryBalanceCrudEvents: CrudEventsConfig<InventoryBalance> = {\n module: 'wms',\n entity: 'inventory_balance',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryReservationCrudEvents: CrudEventsConfig<InventoryReservation> = {\n module: 'wms',\n entity: 'inventory_reservation',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const inventoryMovementCrudEvents: CrudEventsConfig<InventoryMovement> = {\n module: 'wms',\n entity: 'inventory_movement',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const asnCrudIndexer: CrudIndexerConfig<Asn> = {\n entityType: E.wms.asn,\n}\n\nexport const receivingLineCrudIndexer: CrudIndexerConfig<ReceivingLine> = {\n entityType: E.wms.receiving_line,\n}\n\nexport const asnCrudEvents: CrudEventsConfig<Asn> = {\n module: 'wms',\n entity: 'asn',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const receivingLineCrudEvents: CrudEventsConfig<ReceivingLine> = {\n module: 'wms',\n entity: 'receiving_line',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\nexport const putawayTaskCrudIndexer: CrudIndexerConfig<PutawayTask> = {\n entityType: E.wms.putaway_task,\n}\n\nexport const putawayTaskCrudEvents: CrudEventsConfig<PutawayTask> = {\n module: 'wms',\n entity: 'putaway_task',\n persistent: true,\n buildPayload: (ctx) => ({\n id: ctx.identifiers.id,\n organizationId: ctx.identifiers.organizationId,\n tenantId: ctx.identifiers.tenantId,\n }),\n}\n\n// Cache alias resource kinds used to extend command-level cache invalidation\n// when a single mutation impacts multiple list resources.\nexport const WMS_INVENTORY_BALANCE_RESOURCE = 'wms.inventoryBalance'\nexport const WMS_INVENTORY_RESERVATION_RESOURCE = 'wms.inventoryReservation'\nexport const WMS_INVENTORY_MOVEMENT_RESOURCE = 'wms.inventoryMovement'\nexport const WMS_ASN_RESOURCE = 'wms.asn'\nexport const WMS_RECEIVING_LINE_RESOURCE = 'wms.receivingLine'\nexport const WMS_PUTAWAY_TASK_RESOURCE = 'wms.putawayTask'\n\nexport { ensureOrganizationScope }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
6
|
+
import { flashMutationError } from "../../lib/flashMutationError.js";
|
|
7
|
+
import { useGuardedMutation } from "@open-mercato/ui/backend/injection/useGuardedMutation";
|
|
8
|
+
import { ComboboxInput } from "@open-mercato/ui/backend/inputs/ComboboxInput";
|
|
9
|
+
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
10
|
+
import {
|
|
11
|
+
buildOptimisticLockHeader,
|
|
12
|
+
extractOptimisticLockConflict
|
|
13
|
+
} from "@open-mercato/ui/backend/utils/optimisticLock";
|
|
14
|
+
import { raiseCrudError } from "@open-mercato/ui/backend/utils/serverErrors";
|
|
15
|
+
import { surfaceRecordConflict } from "@open-mercato/ui/backend/conflicts";
|
|
16
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
17
|
+
import {
|
|
18
|
+
Dialog,
|
|
19
|
+
DialogContent,
|
|
20
|
+
DialogDescription,
|
|
21
|
+
DialogFooter,
|
|
22
|
+
DialogHeader,
|
|
23
|
+
DialogTitle
|
|
24
|
+
} from "@open-mercato/ui/primitives/dialog";
|
|
25
|
+
import { FormField } from "@open-mercato/ui/primitives/form-field";
|
|
26
|
+
import { KbdShortcut } from "@open-mercato/ui/primitives/kbd";
|
|
27
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
28
|
+
import {
|
|
29
|
+
loadAssigneeOptions,
|
|
30
|
+
resolveAssigneeLabel
|
|
31
|
+
} from "./inventoryMutationLoaders.js";
|
|
32
|
+
const formSchema = z.object({
|
|
33
|
+
assignedTo: z.string().uuid()
|
|
34
|
+
});
|
|
35
|
+
function AssignPutawayTaskDialog({
|
|
36
|
+
open,
|
|
37
|
+
onOpenChange,
|
|
38
|
+
access,
|
|
39
|
+
task,
|
|
40
|
+
onSuccess,
|
|
41
|
+
onConflict
|
|
42
|
+
}) {
|
|
43
|
+
const t = useT();
|
|
44
|
+
const { runMutation, retryLastMutation } = useGuardedMutation({
|
|
45
|
+
contextId: "wms-putaway-assign"
|
|
46
|
+
});
|
|
47
|
+
const mutationContext = React.useMemo(
|
|
48
|
+
() => ({ retryLastMutation }),
|
|
49
|
+
[retryLastMutation]
|
|
50
|
+
);
|
|
51
|
+
const [assignedTo, setAssignedTo] = React.useState("");
|
|
52
|
+
const [optionLabels, setOptionLabels] = React.useState({});
|
|
53
|
+
const [canListUsers, setCanListUsers] = React.useState(true);
|
|
54
|
+
const [fieldErrors, setFieldErrors] = React.useState({});
|
|
55
|
+
const [submitting, setSubmitting] = React.useState(false);
|
|
56
|
+
const [lockUpdatedAt, setLockUpdatedAt] = React.useState(null);
|
|
57
|
+
const lockUpdatedAtRef = React.useRef(null);
|
|
58
|
+
const assigneeFallback = React.useMemo(() => {
|
|
59
|
+
const userId = access.userId?.trim();
|
|
60
|
+
if (!userId) return void 0;
|
|
61
|
+
return {
|
|
62
|
+
userId,
|
|
63
|
+
label: t("wms.backend.putaway.assignee.me", "Me")
|
|
64
|
+
};
|
|
65
|
+
}, [access.userId, t]);
|
|
66
|
+
const closeDialog = React.useCallback(() => {
|
|
67
|
+
if (submitting) return;
|
|
68
|
+
onOpenChange(false);
|
|
69
|
+
}, [onOpenChange, submitting]);
|
|
70
|
+
const registerOptionLabels = React.useCallback((options) => {
|
|
71
|
+
setOptionLabels((prev) => {
|
|
72
|
+
const next = { ...prev };
|
|
73
|
+
for (const option of options) {
|
|
74
|
+
next[option.value] = option.label;
|
|
75
|
+
}
|
|
76
|
+
return next;
|
|
77
|
+
});
|
|
78
|
+
}, []);
|
|
79
|
+
React.useEffect(() => {
|
|
80
|
+
if (!open || !task) return;
|
|
81
|
+
const seedAssignee = task.assignedTo?.trim() || access.userId?.trim() || "";
|
|
82
|
+
setAssignedTo(seedAssignee);
|
|
83
|
+
setFieldErrors({});
|
|
84
|
+
setSubmitting(false);
|
|
85
|
+
const seed = task.updatedAt ?? null;
|
|
86
|
+
lockUpdatedAtRef.current = seed;
|
|
87
|
+
setLockUpdatedAt(seed);
|
|
88
|
+
if (assigneeFallback) {
|
|
89
|
+
void loadAssigneeOptions(void 0, assigneeFallback).then((result) => {
|
|
90
|
+
setCanListUsers(result.canListUsers);
|
|
91
|
+
registerOptionLabels(result.options);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}, [access.userId, assigneeFallback, open, registerOptionLabels, task]);
|
|
95
|
+
const resolveOptionLabel = React.useCallback(
|
|
96
|
+
(value) => {
|
|
97
|
+
if (!value) return "";
|
|
98
|
+
if (value === access.userId) return t("wms.backend.putaway.assignee.me", "Me");
|
|
99
|
+
return optionLabels[value] || value;
|
|
100
|
+
},
|
|
101
|
+
[access.userId, optionLabels, t]
|
|
102
|
+
);
|
|
103
|
+
const handleSubmit = React.useCallback(
|
|
104
|
+
async (event) => {
|
|
105
|
+
event?.preventDefault();
|
|
106
|
+
if (!task) return;
|
|
107
|
+
if (!access.scopeReady || !access.organizationId || !access.tenantId) {
|
|
108
|
+
flash(
|
|
109
|
+
t(
|
|
110
|
+
"wms.backend.inventory.mutations.errors.scope",
|
|
111
|
+
"Select an organization and sign in before posting inventory changes."
|
|
112
|
+
),
|
|
113
|
+
"error"
|
|
114
|
+
);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const parsed = formSchema.safeParse({ assignedTo: assignedTo.trim() });
|
|
118
|
+
if (!parsed.success) {
|
|
119
|
+
setFieldErrors({
|
|
120
|
+
assignedTo: t("wms.backend.putaway.assign.errors.assignee", "Select an assignee.")
|
|
121
|
+
});
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
setFieldErrors({});
|
|
125
|
+
setSubmitting(true);
|
|
126
|
+
let conflictHandled = false;
|
|
127
|
+
try {
|
|
128
|
+
await runMutation({
|
|
129
|
+
operation: async () => {
|
|
130
|
+
const call = await apiCall(
|
|
131
|
+
`/api/wms/putaway-tasks/${encodeURIComponent(task.id)}/assign`,
|
|
132
|
+
{
|
|
133
|
+
method: "POST",
|
|
134
|
+
headers: {
|
|
135
|
+
"content-type": "application/json",
|
|
136
|
+
...buildOptimisticLockHeader(lockUpdatedAtRef.current ?? void 0)
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
organizationId: access.organizationId,
|
|
140
|
+
tenantId: access.tenantId,
|
|
141
|
+
assignedTo: parsed.data.assignedTo
|
|
142
|
+
})
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
if (!call.ok) {
|
|
146
|
+
const refreshLockFromConflict = () => {
|
|
147
|
+
const conflict = extractOptimisticLockConflict({
|
|
148
|
+
status: call.status,
|
|
149
|
+
body: call.result
|
|
150
|
+
});
|
|
151
|
+
if (conflict?.currentUpdatedAt) {
|
|
152
|
+
lockUpdatedAtRef.current = conflict.currentUpdatedAt;
|
|
153
|
+
setLockUpdatedAt(conflict.currentUpdatedAt);
|
|
154
|
+
}
|
|
155
|
+
onConflict?.(task.id, call.status, call.result);
|
|
156
|
+
};
|
|
157
|
+
if (surfaceRecordConflict({ status: call.status, body: call.result }, t, {
|
|
158
|
+
onRefresh: refreshLockFromConflict
|
|
159
|
+
})) {
|
|
160
|
+
refreshLockFromConflict();
|
|
161
|
+
conflictHandled = true;
|
|
162
|
+
return {};
|
|
163
|
+
}
|
|
164
|
+
await raiseCrudError(
|
|
165
|
+
call.response,
|
|
166
|
+
t("wms.backend.putaway.errors.action", "Failed to update putaway task.")
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
return call.result ?? {};
|
|
170
|
+
},
|
|
171
|
+
context: mutationContext,
|
|
172
|
+
mutationPayload: { assignedTo: parsed.data.assignedTo }
|
|
173
|
+
});
|
|
174
|
+
if (conflictHandled) return;
|
|
175
|
+
flash(t("wms.backend.putaway.flash.assigned", "Putaway task assigned"), "success");
|
|
176
|
+
onSuccess?.();
|
|
177
|
+
closeDialog();
|
|
178
|
+
} catch (error) {
|
|
179
|
+
flashMutationError(error, t("wms.backend.putaway.errors.action", "Failed to update putaway task."), t);
|
|
180
|
+
} finally {
|
|
181
|
+
setSubmitting(false);
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
[
|
|
185
|
+
access.organizationId,
|
|
186
|
+
access.scopeReady,
|
|
187
|
+
access.tenantId,
|
|
188
|
+
assignedTo,
|
|
189
|
+
closeDialog,
|
|
190
|
+
mutationContext,
|
|
191
|
+
onConflict,
|
|
192
|
+
onSuccess,
|
|
193
|
+
runMutation,
|
|
194
|
+
t,
|
|
195
|
+
task
|
|
196
|
+
]
|
|
197
|
+
);
|
|
198
|
+
const handleKeyDown = React.useCallback(
|
|
199
|
+
(event) => {
|
|
200
|
+
if (event.key === "Escape") {
|
|
201
|
+
event.preventDefault();
|
|
202
|
+
closeDialog();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if ((event.metaKey || event.ctrlKey) && event.key === "Enter" && !submitting) {
|
|
206
|
+
event.preventDefault();
|
|
207
|
+
void handleSubmit();
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
[closeDialog, handleSubmit, submitting]
|
|
211
|
+
);
|
|
212
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: (next) => next ? onOpenChange(true) : closeDialog(), children: /* @__PURE__ */ jsxs(DialogContent, { className: "max-w-lg gap-0 overflow-hidden p-0", onKeyDown: handleKeyDown, children: [
|
|
213
|
+
/* @__PURE__ */ jsx("div", { className: "border-b px-6 py-4 pr-12", children: /* @__PURE__ */ jsxs(DialogHeader, { className: "space-y-1 text-left", children: [
|
|
214
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: t("wms.backend.putaway.assign.dialog.title", "Assign putaway task") }),
|
|
215
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: t(
|
|
216
|
+
"wms.backend.putaway.assign.dialog.description",
|
|
217
|
+
"Choose who should complete this putaway task."
|
|
218
|
+
) })
|
|
219
|
+
] }) }),
|
|
220
|
+
/* @__PURE__ */ jsxs("form", { onSubmit: (event) => void handleSubmit(event), className: "flex min-h-0 flex-1 flex-col", children: [
|
|
221
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4 overflow-y-auto px-6 py-6", children: [
|
|
222
|
+
/* @__PURE__ */ jsxs(
|
|
223
|
+
FormField,
|
|
224
|
+
{
|
|
225
|
+
label: t("wms.backend.putaway.columns.assignee", "Assignee"),
|
|
226
|
+
required: true,
|
|
227
|
+
error: fieldErrors.assignedTo,
|
|
228
|
+
children: [
|
|
229
|
+
canListUsers ? /* @__PURE__ */ jsx(
|
|
230
|
+
ComboboxInput,
|
|
231
|
+
{
|
|
232
|
+
value: assignedTo,
|
|
233
|
+
onChange: (next) => setAssignedTo(next.trim()),
|
|
234
|
+
loadSuggestions: async (query) => {
|
|
235
|
+
const result = await loadAssigneeOptions(query, assigneeFallback);
|
|
236
|
+
setCanListUsers(result.canListUsers);
|
|
237
|
+
registerOptionLabels(result.options);
|
|
238
|
+
return result.options.map((option) => ({
|
|
239
|
+
value: option.value,
|
|
240
|
+
label: option.label
|
|
241
|
+
}));
|
|
242
|
+
},
|
|
243
|
+
resolveLabel: (value) => {
|
|
244
|
+
const known = resolveOptionLabel(value);
|
|
245
|
+
if (known && known !== value) return known;
|
|
246
|
+
return resolveAssigneeLabel(value).then((label) => label ?? value);
|
|
247
|
+
},
|
|
248
|
+
placeholder: t(
|
|
249
|
+
"wms.backend.putaway.assign.dialog.assigneePlaceholder",
|
|
250
|
+
"Select assignee"
|
|
251
|
+
),
|
|
252
|
+
allowCustomValues: false,
|
|
253
|
+
disabled: submitting
|
|
254
|
+
}
|
|
255
|
+
) : /* @__PURE__ */ jsx("div", { className: "rounded-md border bg-muted/40 px-3 py-2.5 text-sm text-foreground", children: resolveOptionLabel(assignedTo) || assignedTo }),
|
|
256
|
+
!canListUsers ? /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: t(
|
|
257
|
+
"wms.backend.putaway.assign.dialog.assigneeLocked",
|
|
258
|
+
"Only the current user can be assigned without user-directory access."
|
|
259
|
+
) }) : null
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
),
|
|
263
|
+
lockUpdatedAt ? /* @__PURE__ */ jsx("span", { className: "sr-only", "data-testid": "assign-putaway-lock-token", children: lockUpdatedAt }) : null
|
|
264
|
+
] }),
|
|
265
|
+
/* @__PURE__ */ jsxs(DialogFooter, { bordered: false, className: "border-t px-6 py-4 sm:justify-between", children: [
|
|
266
|
+
/* @__PURE__ */ jsx(KbdShortcut, { keys: ["Ctrl/\u2318", "Enter"] }),
|
|
267
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
268
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: closeDialog, disabled: submitting, children: t("ui.actions.cancel", "Cancel") }),
|
|
269
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", disabled: submitting || !assignedTo.trim(), children: t("wms.backend.putaway.actions.assign", "Assign") })
|
|
270
|
+
] })
|
|
271
|
+
] })
|
|
272
|
+
] })
|
|
273
|
+
] }) });
|
|
274
|
+
}
|
|
275
|
+
export {
|
|
276
|
+
AssignPutawayTaskDialog
|
|
277
|
+
};
|
|
278
|
+
//# sourceMappingURL=AssignPutawayTaskDialog.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/wms/components/backend/AssignPutawayTaskDialog.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { flashMutationError } from '../../lib/flashMutationError'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { ComboboxInput } from '@open-mercato/ui/backend/inputs/ComboboxInput'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport {\n buildOptimisticLockHeader,\n extractOptimisticLockConflict,\n} from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { raiseCrudError } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { FormField } from '@open-mercato/ui/primitives/form-field'\nimport { KbdShortcut } from '@open-mercato/ui/primitives/kbd'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport {\n loadAssigneeOptions,\n resolveAssigneeLabel,\n} from './inventoryMutationLoaders'\nimport type { WmsInventoryMutationAccess } from './useWmsInventoryMutationAccess'\n\nexport type PutawayAssignTarget = {\n id: string\n assignedTo?: string | null\n updatedAt?: string | null\n}\n\ntype AssignPutawayTaskDialogProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n access: WmsInventoryMutationAccess\n task: PutawayAssignTarget | null\n onSuccess?: () => void\n onConflict?: (taskId: string, status: number, body: unknown) => void\n}\n\nconst formSchema = z.object({\n assignedTo: z.string().uuid(),\n})\n\nexport function AssignPutawayTaskDialog({\n open,\n onOpenChange,\n access,\n task,\n onSuccess,\n onConflict,\n}: AssignPutawayTaskDialogProps) {\n const t = useT()\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: 'wms-putaway-assign',\n })\n const mutationContext = React.useMemo(\n () => ({ retryLastMutation }),\n [retryLastMutation],\n )\n\n const [assignedTo, setAssignedTo] = React.useState('')\n const [optionLabels, setOptionLabels] = React.useState<Record<string, string>>({})\n const [canListUsers, setCanListUsers] = React.useState(true)\n const [fieldErrors, setFieldErrors] = React.useState<Record<string, string>>({})\n const [submitting, setSubmitting] = React.useState(false)\n const [lockUpdatedAt, setLockUpdatedAt] = React.useState<string | null>(null)\n const lockUpdatedAtRef = React.useRef<string | null>(null)\n\n const assigneeFallback = React.useMemo(() => {\n const userId = access.userId?.trim()\n if (!userId) return undefined\n return {\n userId,\n label: t('wms.backend.putaway.assignee.me', 'Me'),\n }\n }, [access.userId, t])\n\n const closeDialog = React.useCallback(() => {\n if (submitting) return\n onOpenChange(false)\n }, [onOpenChange, submitting])\n\n const registerOptionLabels = React.useCallback((options: Array<{ value: string; label: string }>) => {\n setOptionLabels((prev) => {\n const next = { ...prev }\n for (const option of options) {\n next[option.value] = option.label\n }\n return next\n })\n }, [])\n\n React.useEffect(() => {\n if (!open || !task) return\n const seedAssignee = task.assignedTo?.trim() || access.userId?.trim() || ''\n setAssignedTo(seedAssignee)\n setFieldErrors({})\n setSubmitting(false)\n const seed = task.updatedAt ?? null\n lockUpdatedAtRef.current = seed\n setLockUpdatedAt(seed)\n if (assigneeFallback) {\n void loadAssigneeOptions(undefined, assigneeFallback).then((result) => {\n setCanListUsers(result.canListUsers)\n registerOptionLabels(result.options)\n })\n }\n }, [access.userId, assigneeFallback, open, registerOptionLabels, task])\n\n const resolveOptionLabel = React.useCallback(\n (value: string) => {\n if (!value) return ''\n if (value === access.userId) return t('wms.backend.putaway.assignee.me', 'Me')\n return optionLabels[value] || value\n },\n [access.userId, optionLabels, t],\n )\n\n const handleSubmit = React.useCallback(\n async (event?: React.FormEvent) => {\n event?.preventDefault()\n if (!task) return\n if (!access.scopeReady || !access.organizationId || !access.tenantId) {\n flash(\n t(\n 'wms.backend.inventory.mutations.errors.scope',\n 'Select an organization and sign in before posting inventory changes.',\n ),\n 'error',\n )\n return\n }\n\n const parsed = formSchema.safeParse({ assignedTo: assignedTo.trim() })\n if (!parsed.success) {\n setFieldErrors({\n assignedTo: t('wms.backend.putaway.assign.errors.assignee', 'Select an assignee.'),\n })\n return\n }\n setFieldErrors({})\n setSubmitting(true)\n\n let conflictHandled = false\n try {\n await runMutation({\n operation: async () => {\n const call = await apiCall<{ ok?: boolean }>(\n `/api/wms/putaway-tasks/${encodeURIComponent(task.id)}/assign`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...buildOptimisticLockHeader(lockUpdatedAtRef.current ?? undefined),\n },\n body: JSON.stringify({\n organizationId: access.organizationId,\n tenantId: access.tenantId,\n assignedTo: parsed.data.assignedTo,\n }),\n },\n )\n if (!call.ok) {\n const refreshLockFromConflict = () => {\n const conflict = extractOptimisticLockConflict({\n status: call.status,\n body: call.result,\n })\n if (conflict?.currentUpdatedAt) {\n lockUpdatedAtRef.current = conflict.currentUpdatedAt\n setLockUpdatedAt(conflict.currentUpdatedAt)\n }\n onConflict?.(task.id, call.status, call.result)\n }\n if (\n surfaceRecordConflict({ status: call.status, body: call.result }, t, {\n onRefresh: refreshLockFromConflict,\n })\n ) {\n refreshLockFromConflict()\n conflictHandled = true\n return {}\n }\n await raiseCrudError(\n call.response,\n t('wms.backend.putaway.errors.action', 'Failed to update putaway task.'),\n )\n }\n return call.result ?? {}\n },\n context: mutationContext,\n mutationPayload: { assignedTo: parsed.data.assignedTo },\n })\n if (conflictHandled) return\n flash(t('wms.backend.putaway.flash.assigned', 'Putaway task assigned'), 'success')\n onSuccess?.()\n closeDialog()\n } catch (error) {\n flashMutationError(error, t('wms.backend.putaway.errors.action', 'Failed to update putaway task.'), t)\n } finally {\n setSubmitting(false)\n }\n },\n [\n access.organizationId,\n access.scopeReady,\n access.tenantId,\n assignedTo,\n closeDialog,\n mutationContext,\n onConflict,\n onSuccess,\n runMutation,\n t,\n task,\n ],\n )\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n closeDialog()\n return\n }\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter' && !submitting) {\n event.preventDefault()\n void handleSubmit()\n }\n },\n [closeDialog, handleSubmit, submitting],\n )\n\n return (\n <Dialog open={open} onOpenChange={(next) => (next ? onOpenChange(true) : closeDialog())}>\n <DialogContent className=\"max-w-lg gap-0 overflow-hidden p-0\" onKeyDown={handleKeyDown}>\n <div className=\"border-b px-6 py-4 pr-12\">\n <DialogHeader className=\"space-y-1 text-left\">\n <DialogTitle>{t('wms.backend.putaway.assign.dialog.title', 'Assign putaway task')}</DialogTitle>\n <DialogDescription>\n {t(\n 'wms.backend.putaway.assign.dialog.description',\n 'Choose who should complete this putaway task.',\n )}\n </DialogDescription>\n </DialogHeader>\n </div>\n\n <form onSubmit={(event) => void handleSubmit(event)} className=\"flex min-h-0 flex-1 flex-col\">\n <div className=\"space-y-4 overflow-y-auto px-6 py-6\">\n <FormField\n label={t('wms.backend.putaway.columns.assignee', 'Assignee')}\n required\n error={fieldErrors.assignedTo}\n >\n {canListUsers ? (\n <ComboboxInput\n value={assignedTo}\n onChange={(next) => setAssignedTo(next.trim())}\n loadSuggestions={async (query) => {\n const result = await loadAssigneeOptions(query, assigneeFallback)\n setCanListUsers(result.canListUsers)\n registerOptionLabels(result.options)\n return result.options.map((option) => ({\n value: option.value,\n label: option.label,\n }))\n }}\n resolveLabel={(value) => {\n const known = resolveOptionLabel(value)\n if (known && known !== value) return known\n return resolveAssigneeLabel(value).then((label) => label ?? value)\n }}\n placeholder={t(\n 'wms.backend.putaway.assign.dialog.assigneePlaceholder',\n 'Select assignee',\n )}\n allowCustomValues={false}\n disabled={submitting}\n />\n ) : (\n <div className=\"rounded-md border bg-muted/40 px-3 py-2.5 text-sm text-foreground\">\n {resolveOptionLabel(assignedTo) || assignedTo}\n </div>\n )}\n {!canListUsers ? (\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\n 'wms.backend.putaway.assign.dialog.assigneeLocked',\n 'Only the current user can be assigned without user-directory access.',\n )}\n </p>\n ) : null}\n </FormField>\n {lockUpdatedAt ? (\n <span className=\"sr-only\" data-testid=\"assign-putaway-lock-token\">\n {lockUpdatedAt}\n </span>\n ) : null}\n </div>\n\n <DialogFooter bordered={false} className=\"border-t px-6 py-4 sm:justify-between\">\n <KbdShortcut keys={['Ctrl/\u2318', 'Enter']} />\n <div className=\"flex gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={closeDialog} disabled={submitting}>\n {t('ui.actions.cancel', 'Cancel')}\n </Button>\n <Button type=\"submit\" disabled={submitting || !assignedTo.trim()}>\n {t('wms.backend.putaway.actions.assign', 'Assign')}\n </Button>\n </div>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|