@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/asn.ts"],
|
|
4
|
+
"sourcesContent": ["import type { CommandHandler, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport { registerCommand } from '@open-mercato/shared/lib/commands'\nimport { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'\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 Asn,\n InventoryBalance,\n PutawayTask,\n ReceivingLine,\n Warehouse,\n WarehouseLocation,\n type AsnStatus,\n type ReceivingLineQcStatus,\n} from '../data/entities'\nimport { requireVendorIfPresent as requireVendorIfPresentLookup } from '../lib/asnVendor'\nimport {\n asnCloseSchema,\n asnCreateSchema,\n asnReceiveLineSchema,\n asnUpdateSchema,\n receivingLineCreateSchema,\n receivingLineUpdateSchema,\n type AsnCloseInput,\n type AsnCreateInput,\n type AsnReceiveLineInput,\n type AsnUpdateInput,\n type InventoryReceiveInput,\n type ReceivingLineCreateInput,\n type ReceivingLineUpdateInput,\n} from '../data/validators'\nimport { emitWmsEvent } from '../events'\nimport {\n assertAsnQcTransition,\n assertReceivingLineLifecycleFieldsForbidden,\n buildAsnReceivePutawayKey,\n buildAsnReceiveReferenceId,\n hasAsnDeleteBlockingLineActivity,\n isAsnCloseable,\n resolveAsnReceiveAttempt,\n resolvePutawayQuantityForAlreadyAtTargetRetry,\n shouldEnsurePutawayOnAlreadyAtTarget,\n shouldRecreatePutawayOnAlreadyAtTarget,\n shouldWriteStockOnQcPass,\n} from '../lib/asnReceiving'\nimport {\n computeUncommittedPutawaySourceQuantity,\n selectCoveringOpenPutawayTask,\n} from '../lib/putaway'\nimport {\n applyInventoryReceiveInTransaction,\n emitInventoryReceiveSideEffects,\n type InventoryReceiveMutationResult,\n} from './inventory-actions'\nimport {\n asnCrudEvents,\n asnCrudIndexer,\n ensureOrganizationScope,\n ensureTenantScope,\n normalizeOptionalString,\n putawayTaskCrudEvents,\n putawayTaskCrudIndexer,\n receivingLineCrudEvents,\n receivingLineCrudIndexer,\n requireId,\n toNumericString,\n WMS_ASN_RESOURCE,\n WMS_INVENTORY_BALANCE_RESOURCE,\n WMS_RECEIVING_LINE_RESOURCE,\n} from './shared'\n\ntype Scope = { tenantId: string; organizationId: string }\n\ntype AsnSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n warehouseId: string\n vendorId: string | null\n status: AsnStatus\n expectedAt: string\n referenceNumber: string | null\n notes: string | null\n metadata: JsonValue | null\n createdAt: string\n updatedAt: string\n}\n\ntype ReceivingLineSnapshot = {\n id: string\n organizationId: string\n tenantId: string\n asnId: string\n catalogVariantId: string\n expectedQty: string\n receivedQty: string\n lotNumber: string | null\n serialNumbers: string[] | null\n qcStatus: ReceivingLineQcStatus\n targetStagingLocationId: string | null\n rejectionReason: string | null\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\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\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 snapshotAsn(record: Asn): AsnSnapshot {\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 vendorId: record.vendorId ?? null,\n status: record.status,\n expectedAt: iso(record.expectedAt),\n referenceNumber: record.referenceNumber ?? null,\n notes: record.notes ?? null,\n metadata: (record.metadata ?? null) as JsonValue | null,\n createdAt: iso(record.createdAt),\n updatedAt: iso(record.updatedAt),\n }\n}\n\nfunction snapshotReceivingLine(record: ReceivingLine): ReceivingLineSnapshot {\n const asnId = typeof record.asn === 'string' ? record.asn : record.asn.id\n return {\n id: record.id,\n organizationId: record.organizationId,\n tenantId: record.tenantId,\n asnId,\n catalogVariantId: record.catalogVariantId,\n expectedQty: record.expectedQty,\n receivedQty: record.receivedQty,\n lotNumber: record.lotNumber ?? null,\n serialNumbers: Array.isArray(record.serialNumbers) ? [...record.serialNumbers] : null,\n qcStatus: record.qcStatus,\n targetStagingLocationId: record.targetStagingLocationId ?? null,\n rejectionReason: record.rejectionReason ?? null,\n metadata: (record.metadata ?? null) as JsonValue | null,\n createdAt: iso(record.createdAt),\n updatedAt: iso(record.updatedAt),\n }\n}\n\nasync function loadAsn(em: EntityManager, ctx: CommandRuntimeContext, id: string): Promise<Asn> {\n const asn = await findOneWithDecryption(em, Asn, { id, deletedAt: null }, undefined, resolveScope(ctx))\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n return asn\n}\n\n/**\n * Load ASN under PESSIMISTIC_WRITE inside an open TX, then run `fn`.\n * Same serialization as receive-line: activity re-check + header mutate /\n * soft-delete must hold the ASN row lock so concurrent receive cannot commit\n * receipt/QC after the check but before flush under READ COMMITTED.\n */\nasync function withLockedAsn<T>(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n id: string,\n scope: Scope,\n fn: (asn: Asn, trx: EntityManager) => Promise<T>,\n): Promise<T> {\n return em.transactional(async (trx) => {\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n return fn(asn, trx)\n })\n}\n\n/**\n * Lock ASN then receiving line (same order as receive / update / delete execute),\n * then run `fn`. Used by receiving-line create/update/delete undo so concurrent\n * receive cannot post receipt/QC between an unlocked activity check and flush.\n * Returns null when the line is missing (or soft-deleted when `requireActiveLine`).\n */\nasync function withLockedAsnReceivingLine<T>(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n lineId: string,\n scope: Scope,\n options: { requireActiveLine: boolean },\n fn: (args: { asn: Asn; line: ReceivingLine; trx: EntityManager }) => Promise<T>,\n): Promise<T | null> {\n return em.transactional(async (trx) => {\n const unlocked = await findOneWithDecryption(trx, ReceivingLine, { id: lineId }, undefined, scope)\n if (!unlocked) return null\n if (options.requireActiveLine && unlocked.deletedAt) return null\n ensureTenantScope(ctx, unlocked.tenantId)\n ensureOrganizationScope(ctx, unlocked.organizationId)\n const asnId = typeof unlocked.asn === 'string' ? unlocked.asn : unlocked.asn.id\n\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: asnId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n\n const locked = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id: lineId },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!locked) return null\n if (options.requireActiveLine && locked.deletedAt) return null\n ensureTenantScope(ctx, locked.tenantId)\n ensureOrganizationScope(ctx, locked.organizationId)\n return fn({ asn, line: locked, trx })\n })\n}\n\nasync function loadReceivingLine(\n em: EntityManager,\n ctx: CommandRuntimeContext,\n id: string,\n): Promise<ReceivingLine> {\n const line = await findOneWithDecryption(\n em,\n ReceivingLine,\n { id, deletedAt: null },\n undefined,\n resolveScope(ctx),\n )\n if (!line) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, line.tenantId)\n ensureOrganizationScope(ctx, line.organizationId)\n return line\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 requireStagingLocation(\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.type !== 'staging' && location.type !== 'dock') {\n throw new CrudHttpError(422, { error: 'invalid_staging_location' })\n }\n if (!location.isActive) {\n throw new CrudHttpError(422, { error: 'inactive_location' })\n }\n return location\n}\n\nasync function requireVendorIfPresent(\n ctx: CommandRuntimeContext,\n vendorId: string | null | undefined,\n scope: Scope,\n) {\n await requireVendorIfPresentLookup(ctx.container, vendorId, scope)\n}\n\nfunction isUniqueConstraintError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false\n const code = (error as { code?: string }).code\n if (code === '23505') return true\n const name = (error as { name?: string }).name\n return name === 'UniqueConstraintViolationException'\n}\n\nasync function findExistingPutawayForReceipt(\n em: EntityManager,\n scope: Scope,\n putawayKey: string,\n): Promise<PutawayTask | null> {\n return findOneWithDecryption(\n em,\n PutawayTask,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n putawayKey,\n deletedAt: null,\n status: { $in: ['open', 'in_progress', 'done'] },\n },\n undefined,\n scope,\n )\n}\n\n/** Cancel nulls putaway_key; recover qty/lot via metadata.putawayKey (not a capped scan). */\nasync function findCancelledPutawayForReceipt(\n em: EntityManager,\n scope: Scope,\n putawayKey: string,\n): Promise<PutawayTask | null> {\n const rows = await em.getConnection().execute<Array<{ id: string }>>(\n `select id\n from wms_putaway_tasks\n where organization_id = ?\n and tenant_id = ?\n and deleted_at is null\n and status = 'cancelled'\n and metadata->>'putawayKey' = ?\n order by updated_at desc\n limit 1`,\n [scope.organizationId, scope.tenantId, putawayKey],\n )\n const id = rows[0]?.id\n if (!id) return null\n return findOneWithDecryption(\n em,\n PutawayTask,\n { id, deletedAt: null, status: 'cancelled' },\n undefined,\n scope,\n )\n}\n\n/**\n * Staging floor for already-at-target putaway recreate: on-hand minus\n * reserved/allocated minus open/in_progress putaway commitments. Returns null\n * when there is no balance row (nothing left to put away).\n */\nasync function resolveUncommittedStagingPutawayQuantity(\n em: EntityManager,\n scope: Scope,\n input: {\n warehouseId: string\n sourceLocationId: string\n catalogVariantId: string\n lotId: string | null\n serialNumber?: string | null\n },\n options?: { lock?: boolean },\n): Promise<{ remaining: number; openTasks: PutawayTask[] } | null> {\n const serialNumber = input.serialNumber?.trim() ? input.serialNumber.trim() : null\n // Same row lock as requireAvailableBalanceQuantity(..., { lock: true }). Hold it\n // through the caller's task insert \u2014 the lock lives until this transaction ends.\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) return null\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 return {\n remaining: computeUncommittedPutawaySourceQuantity({\n quantityOnHand: toNumber(balance.quantityOnHand),\n quantityReserved: toNumber(balance.quantityReserved),\n quantityAllocated: toNumber(balance.quantityAllocated),\n openPutawayQuantities: openTasks.map((task) => toNumber(task.quantity)),\n }),\n openTasks,\n }\n}\n\nasync function findOrCreatePutawayForReceipt(\n em: EntityManager,\n scope: Scope,\n putawayKey: string,\n input: {\n warehouseId: string\n sourceLocationId: string\n catalogVariantId: string\n lotId: string | null\n quantity: number\n serialNumber?: string | null\n asnId: string\n lineId: string\n metadata?: Record<string, unknown> | null\n },\n): Promise<{ task: PutawayTask; created: boolean }> {\n const existing = await findExistingPutawayForReceipt(em, scope, putawayKey)\n if (existing) return { task: existing, created: false }\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: null,\n catalogVariantId: input.catalogVariantId,\n lotId: input.lotId,\n serialNumber: input.serialNumber?.trim() ? input.serialNumber.trim() : null,\n quantity: toNumericString(input.quantity),\n status: 'open',\n assignedTo: null,\n priority: 5,\n putawayKey,\n metadata: {\n ...(input.metadata ?? {}),\n asnId: input.asnId,\n receivingLineId: input.lineId,\n putawayKey,\n source: 'asn_receive',\n ...(input.serialNumber?.trim() ? { serialNumber: input.serialNumber.trim() } : {}),\n } as JsonValue,\n })\n try {\n await em.persist(task).flush()\n return { task, created: true }\n } catch (error) {\n if (!isUniqueConstraintError(error)) throw error\n const raced = await findExistingPutawayForReceipt(em, scope, putawayKey)\n if (raced) return { task: raced, created: false }\n throw error\n }\n}\n\nasync function emitAsnReceivePutawayCreatedSideEffects(\n ctx: CommandRuntimeContext,\n scope: Scope,\n putaway: PutawayTask,\n warehouseId: string,\n): Promise<void> {\n let de: DataEngine | null = null\n try {\n de = ctx.container.resolve('dataEngine') as DataEngine\n } catch {\n de = null\n }\n if (de) {\n await emitCrudSideEffects({\n dataEngine: de,\n action: 'created',\n entity: putaway,\n identifiers: {\n id: putaway.id,\n organizationId: putaway.organizationId,\n tenantId: putaway.tenantId,\n },\n indexer: putawayTaskCrudIndexer,\n events: putawayTaskCrudEvents,\n })\n }\n void emitWmsEvent('wms.putaway.created', {\n id: putaway.id,\n warehouseId,\n sourceLocationId: putaway.sourceLocationId,\n targetLocationId: putaway.targetLocationId ?? null,\n catalogVariantId: putaway.catalogVariantId,\n quantity: putaway.quantity,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\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 resourceKind: string,\n) {\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate(actionKey, fallbackLabel),\n resourceKind,\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\nfunction assertAsnMutable(asn: Asn) {\n if (asn.status === 'closed' || asn.status === 'received') {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n}\n\n/** Open/in-progress putaway linked to this ASN via metadata.asnId (ASN receive path). */\nasync function hasOpenPutawayForAsn(\n em: EntityManager,\n scope: Scope,\n asnId: string,\n): Promise<boolean> {\n const rows = await em.getConnection().execute<Array<{ hit: number }>>(\n `select 1 as hit\n from wms_putaway_tasks\n where organization_id = ?\n and tenant_id = ?\n and deleted_at is null\n and status in ('open', 'in_progress')\n and metadata->>'asnId' = ?\n limit 1`,\n [scope.organizationId, scope.tenantId, asnId],\n )\n return rows.length > 0\n}\n\nfunction resolveSerialNumbers(input: AsnReceiveLineInput): string[] {\n if (!input.serialNumbers?.length) return []\n return input.serialNumbers.map((value) => value.trim()).filter((value) => value.length > 0)\n}\n\nfunction normalizeStoredSerials(values: string[] | null | undefined): string[] {\n if (!values?.length) return []\n return values.map((value) => value.trim()).filter((value) => value.length > 0)\n}\n\n/** Reject repeated serials after trim. Callers must not collapse the list and still advance qty. */\nfunction assertUniqueSerialNumbers(serialNumbers: string[]): void {\n const seen = new Set<string>()\n for (const serialNumber of serialNumbers) {\n if (seen.has(serialNumber)) {\n throw new CrudHttpError(422, { error: 'duplicate_serial' })\n }\n seen.add(serialNumber)\n }\n}\n\n/** A later batch must not receive a serial already stored on a partially received line. */\nfunction assertIncomingSerialsAreNew(\n incoming: string[],\n stored: string[] | null | undefined,\n): void {\n const known = new Set(normalizeStoredSerials(stored))\n for (const serialNumber of incoming) {\n if (known.has(serialNumber)) {\n throw new CrudHttpError(422, { error: 'duplicate_serial' })\n }\n }\n}\n\nfunction mergeReceivedSerials(stored: string[] | null | undefined, incoming: string[]): string[] {\n const next = normalizeStoredSerials(stored)\n const seen = new Set(next)\n for (const serialNumber of incoming) {\n if (seen.has(serialNumber)) continue\n seen.add(serialNumber)\n next.push(serialNumber)\n }\n return next\n}\n\nfunction recordReceivedSerials(\n line: ReceivingLine,\n incoming: string[],\n priorReceivedQty: number,\n): void {\n if (incoming.length === 0) return\n line.serialNumbers =\n priorReceivedQty > 0.000001 ? mergeReceivedSerials(line.serialNumbers, incoming) : incoming\n}\n\nasync function emitAsnSideEffects(\n ctx: CommandRuntimeContext,\n affected: {\n asns?: Array<{ entity: Asn; action: 'created' | 'updated' | 'deleted' }>\n lines?: Array<{ entity: ReceivingLine; action: 'created' | 'updated' | 'deleted' }>\n },\n) {\n let de: DataEngine | null = null\n try {\n de = ctx.container.resolve('dataEngine') as DataEngine\n } catch {\n de = null\n }\n if (!de) return\n for (const { entity, action } of affected.asns ?? []) {\n await emitCrudSideEffects({\n dataEngine: de,\n action,\n entity,\n identifiers: {\n id: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n },\n indexer: asnCrudIndexer,\n events: asnCrudEvents,\n })\n }\n for (const { entity, action } of affected.lines ?? []) {\n await emitCrudSideEffects({\n dataEngine: de,\n action,\n entity,\n identifiers: {\n id: entity.id,\n organizationId: entity.organizationId,\n tenantId: entity.tenantId,\n },\n indexer: receivingLineCrudIndexer,\n events: receivingLineCrudEvents,\n })\n }\n}\n\nconst createAsnCommand: CommandHandler<AsnCreateInput, { asnId: string; lineIds: string[] }> = {\n id: 'wms.asns.create',\n async execute(rawInput, ctx) {\n const input = asnCreateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n await requireWarehouse(em, ctx, input.warehouseId, scope)\n await requireVendorIfPresent(ctx, input.vendorId, scope)\n // Terminal received/closed are rejected by asnWritableStatusSchema at parse time.\n const status = input.status ?? 'draft'\n\n const createdLines: ReceivingLine[] = []\n let asn!: Asn\n await withAtomicFlush(\n em,\n [\n () => {\n asn = em.create(Asn, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n warehouse: em.getReference(Warehouse, input.warehouseId),\n vendorId: input.vendorId ?? null,\n status,\n expectedAt: input.expectedAt,\n referenceNumber: normalizeOptionalString(input.referenceNumber ?? undefined),\n // sourceKey is server/system-only (auth null). Authenticated HTTP creates ignore it.\n sourceKey:\n ctx.auth == null\n ? normalizeOptionalString(input.sourceKey ?? undefined)\n : null,\n notes: normalizeOptionalString(input.notes ?? undefined),\n metadata: toJsonValue(input.metadata ?? null) ?? null,\n })\n em.persist(asn)\n },\n () => {\n for (const lineInput of input.lines ?? []) {\n const line = em.create(ReceivingLine, {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n asn,\n catalogVariantId: lineInput.catalogVariantId,\n expectedQty: toNumericString(lineInput.expectedQty),\n receivedQty: '0',\n lotNumber: normalizeOptionalString(lineInput.lotNumber ?? undefined),\n serialNumbers: lineInput.serialNumbers ?? null,\n qcStatus: 'pending',\n targetStagingLocationId: lineInput.targetStagingLocationId ?? null,\n metadata: toJsonValue(lineInput.metadata ?? null) ?? null,\n })\n em.persist(line)\n createdLines.push(line)\n }\n },\n ],\n { transaction: true, label: 'wms.asns.create' },\n )\n\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: asn, action: 'created' }],\n lines: createdLines.map((entity) => ({ entity, action: 'created' as const })),\n })\n\n void emitWmsEvent('wms.asn.created', {\n id: asn.id,\n warehouseId: input.warehouseId,\n vendorId: input.vendorId ?? null,\n status: asn.status,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\n\n return { asnId: asn.id, lineIds: createdLines.map((line) => line.id) }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.asnId) return null\n const em = resolveEm(ctx)\n const asn = await loadAsn(em, ctx, result.asnId)\n return snapshotAsn(asn)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{\n after?: AsnSnapshot | null\n lineIds?: string[] | null\n }>(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 // Idempotent when already soft-deleted (unlocked probe); lock only the active path.\n const existing = await findOneWithDecryption(em, Asn, { id: after.id }, undefined, scope)\n if (!existing || existing.deletedAt) return\n // Hold ASN row lock through activity re-check + soft-delete (same race as delete execute).\n const locked = await withLockedAsn(em, ctx, after.id, scope, async (asn, trx) => {\n // Refuse soft-delete undo after receipt/complete (same floor as delete execute).\n assertAsnMutable(asn)\n // Lines added after create share this ASN. The create log's lineIds are only\n // the original set \u2014 guard and cascade every active line under the ASN lock.\n const lines = await findWithDecryption(\n trx,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n scope,\n )\n if (hasAsnDeleteBlockingLineActivity(lines)) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n const deletedAt = new Date()\n asn.deletedAt = deletedAt\n for (const line of lines) {\n line.deletedAt = deletedAt\n }\n await trx.flush()\n return { asn, lines }\n })\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: locked.asn, action: 'deleted' }],\n lines: locked.lines.map((entity) => ({ entity, action: 'deleted' as const })),\n })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input,\n result?.asnId ?? null,\n 'wms.audit.asn.create',\n 'Create ASN',\n WMS_ASN_RESOURCE,\n )\n const after = snapshots?.after as AsnSnapshot | undefined\n return {\n ...base,\n snapshotAfter: after,\n payload: { undo: { after, lineIds: result?.lineIds ?? [] } },\n }\n },\n}\n\nconst updateAsnCommand: CommandHandler<AsnUpdateInput, { asnId: string }> = {\n id: 'wms.asns.update',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'ASN')\n const em = resolveEm(ctx)\n const asn = await loadAsn(em, ctx, id)\n // Same floor as receive / line CRUD / delete \u2014 received/closed headers are immutable.\n assertAsnMutable(asn)\n return { before: snapshotAsn(asn) }\n },\n async execute(rawInput, ctx) {\n const input = asnUpdateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId ?? ctx.auth?.tenantId ?? '')\n if (input.organizationId) ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n // Lock ASN through activity re-check + header mutate so concurrent receive-line\n // cannot post receipt/QC after the check but before flush.\n const asn = await withLockedAsn(em, ctx, input.id, resolveScope(ctx), async (asn, trx) => {\n // Refuse received/closed before any field write so PUT cannot demote status or\n // move warehouseId after stock/lines have been posted.\n assertAsnMutable(asn)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: asn.id,\n current: asn.updatedAt,\n request: ctx.request ?? null,\n })\n const scope = resolveScope(ctx, {\n tenantId: asn.tenantId,\n organizationId: asn.organizationId,\n })\n // Same floor as delete: after any line receipt/QC, refuse header edits\n // (warehouseId would desync staged stock / later receives).\n const lines = await findWithDecryption(\n trx,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n scope,\n )\n if (hasAsnDeleteBlockingLineActivity(lines)) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n if (input.warehouseId) {\n await requireWarehouse(trx, ctx, input.warehouseId, scope)\n asn.warehouse = trx.getReference(Warehouse, input.warehouseId)\n }\n if (input.vendorId !== undefined) {\n await requireVendorIfPresent(ctx, input.vendorId, scope)\n asn.vendorId = input.vendorId\n }\n if (input.status !== undefined) {\n // Terminal received/closed are rejected by asnWritableStatusSchema at parse time.\n asn.status = input.status\n }\n if (input.expectedAt !== undefined) asn.expectedAt = input.expectedAt\n if (input.referenceNumber !== undefined) {\n asn.referenceNumber = normalizeOptionalString(input.referenceNumber ?? undefined)\n }\n if (input.notes !== undefined) asn.notes = normalizeOptionalString(input.notes ?? undefined)\n if (input.metadata !== undefined) asn.metadata = toJsonValue(input.metadata) ?? null\n await trx.flush()\n return asn\n })\n await emitAsnSideEffects(ctx, { asns: [{ entity: asn, action: 'updated' }] })\n void emitWmsEvent('wms.asn.updated', {\n id: asn.id,\n status: asn.status,\n tenantId: asn.tenantId,\n organizationId: asn.organizationId,\n }).catch(() => undefined)\n return { asnId: asn.id }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.asnId) return null\n const em = resolveEm(ctx)\n const asn = await loadAsn(em, ctx, result.asnId)\n return snapshotAsn(asn)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ before?: AsnSnapshot | 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 // Hold ASN row lock through activity re-check + snapshot restore (same race as execute).\n const asn = await withLockedAsn(em, ctx, before.id, scope, async (asn, trx) => {\n // Refuse restoring header snapshot after receipt/complete \u2014 would demote\n // received/closed \u2192 draft/in_transit and/or rewrite warehouseId past stock.\n assertAsnMutable(asn)\n const lines = await findWithDecryption(\n trx,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n scope,\n )\n if (hasAsnDeleteBlockingLineActivity(lines)) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n asn.warehouse = trx.getReference(Warehouse, before.warehouseId)\n asn.vendorId = before.vendorId\n asn.status = before.status\n asn.expectedAt = new Date(before.expectedAt)\n asn.referenceNumber = before.referenceNumber\n asn.notes = before.notes\n asn.metadata = before.metadata\n asn.deletedAt = null\n await trx.flush()\n return asn\n })\n await emitAsnSideEffects(ctx, { asns: [{ entity: asn, action: 'updated' }] })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input,\n result?.asnId ?? null,\n 'wms.audit.asn.update',\n 'Update ASN',\n WMS_ASN_RESOURCE,\n )\n const before = snapshots?.before as AsnSnapshot | undefined\n const after = snapshots?.after as AsnSnapshot | undefined\n return {\n ...base,\n snapshotBefore: before,\n snapshotAfter: after,\n payload: { undo: { before, after } },\n }\n },\n}\n\nconst deleteAsnCommand: CommandHandler<{ id: string }, { asnId: string; lineIds: string[] }> = {\n id: 'wms.asns.delete',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'ASN')\n const em = resolveEm(ctx)\n const asn = await loadAsn(em, ctx, id)\n const lines = await findWithDecryption(\n em,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n { tenantId: asn.tenantId, organizationId: asn.organizationId },\n )\n return {\n before: snapshotAsn(asn),\n lineIds: lines.map((line) => line.id),\n }\n },\n async execute(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'ASN')\n const em = resolveEm(ctx)\n // Lock ASN through activity/putaway re-check + soft-delete so concurrent\n // receive-line cannot stage stock after the check but before flush.\n const locked = await withLockedAsn(em, ctx, id, resolveScope(ctx), async (asn, trx) => {\n assertAsnMutable(asn)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: asn.id,\n current: asn.updatedAt,\n request: ctx.request ?? null,\n })\n const scope = { tenantId: asn.tenantId, organizationId: asn.organizationId }\n // Re-query active lines under the ASN lock (create also locks ASN) so a line\n // inserted after prepare cannot remain active on a soft-deleted ASN.\n const lines = await findWithDecryption(\n trx,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n scope,\n )\n // Refuse when any line has receipt/QC activity (same floor as receiving-line delete)\n // so soft-delete cannot free source_key while staging stock/movements remain.\n if (hasAsnDeleteBlockingLineActivity(lines)) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n if (await hasOpenPutawayForAsn(trx, scope, asn.id)) {\n throw new CrudHttpError(409, { error: 'asn_has_open_putaway' })\n }\n const deletedAt = new Date()\n asn.deletedAt = deletedAt\n for (const line of lines) {\n line.deletedAt = deletedAt\n }\n await trx.flush()\n return { asn, lines }\n })\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: locked.asn, action: 'deleted' }],\n lines: locked.lines.map((entity) => ({ entity, action: 'deleted' as const })),\n })\n return { asnId: locked.asn.id, lineIds: locked.lines.map((line) => line.id) }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{\n before?: AsnSnapshot | null\n lineIds?: string[] | null\n }>(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 const asn = await findOneWithDecryption(em, Asn, { id: before.id }, undefined, scope)\n if (!asn) return\n // Soft-delete frees (organization_id, source_key); procurement may create a\n // replacement. Refuse undelete when another active ASN already holds the key.\n const sourceKey = normalizeOptionalString(asn.sourceKey ?? undefined)\n if (sourceKey) {\n const clash = await findOneWithDecryption(\n em,\n Asn,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n sourceKey,\n deletedAt: null,\n id: { $ne: asn.id },\n },\n undefined,\n scope,\n )\n if (clash) {\n throw new CrudHttpError(409, { error: 'asn_source_key_conflict' })\n }\n }\n asn.deletedAt = null\n const lineIds = Array.isArray(payload?.lineIds) ? payload.lineIds : []\n const restoredLines: ReceivingLine[] = []\n if (lineIds.length > 0) {\n const lines = await findWithDecryption(\n em,\n ReceivingLine,\n { id: { $in: lineIds }, asn: asn.id },\n undefined,\n scope,\n )\n for (const line of lines) {\n line.deletedAt = null\n restoredLines.push(line)\n }\n }\n try {\n await em.flush()\n } catch (error) {\n if (sourceKey && isUniqueConstraintError(error)) {\n throw new CrudHttpError(409, { error: 'asn_source_key_conflict' })\n }\n throw error\n }\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: asn, action: 'updated' }],\n lines: restoredLines.map((entity) => ({ entity, action: 'updated' as const })),\n })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input as { id?: string },\n result?.asnId ?? null,\n 'wms.audit.asn.delete',\n 'Delete ASN',\n WMS_ASN_RESOURCE,\n )\n const before = snapshots?.before as AsnSnapshot | undefined\n // Execute re-queries under the ASN lock. Persist that set, not prepare's snapshot:\n // line create does not bump the ASN version, so a child inserted after prepare is\n // deleted here and must be the undo payload.\n const lineIds = result?.lineIds ?? []\n return {\n ...base,\n snapshotBefore: before,\n payload: { undo: { before, lineIds } },\n }\n },\n}\n\nconst createReceivingLineCommand: CommandHandler<ReceivingLineCreateInput, { lineId: string }> = {\n id: 'wms.receiving-lines.create',\n async execute(rawInput, ctx) {\n const input = receivingLineCreateSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n // Hold ASN row lock through mutable assert + insert so concurrent ASN delete\n // cannot soft-delete the header after an unlocked snapshot and leave an orphan line.\n const line = await withLockedAsn(em, ctx, input.asnId, resolveScope(ctx, input), async (asn, trx) => {\n assertAsnMutable(asn)\n const created = trx.create(ReceivingLine, {\n organizationId: asn.organizationId,\n tenantId: asn.tenantId,\n asn,\n catalogVariantId: input.catalogVariantId,\n expectedQty: toNumericString(input.expectedQty),\n receivedQty: '0',\n lotNumber: normalizeOptionalString(input.lotNumber ?? undefined),\n serialNumbers: input.serialNumbers ?? null,\n qcStatus: 'pending',\n targetStagingLocationId: input.targetStagingLocationId ?? null,\n metadata: toJsonValue(input.metadata ?? null) ?? null,\n })\n trx.persist(created)\n await trx.flush()\n return created\n })\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'created' }] })\n return { lineId: line.id }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.lineId) return null\n const em = resolveEm(ctx)\n const line = await loadReceivingLine(em, ctx, result.lineId)\n return snapshotReceivingLine(line)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ after?: ReceivingLineSnapshot | 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 // Lock ASN then line (same order as delete execute) and re-check activity\n // under the locks so concurrent receive cannot post stock then lose the line.\n const line = await withLockedAsnReceivingLine(\n em,\n ctx,\n after.id,\n scope,\n { requireActiveLine: true },\n async ({ asn, line, trx }) => {\n assertAsnMutable(asn)\n // Same floor as line delete \u2014 refuse soft-delete after receipt/QC.\n if (hasAsnDeleteBlockingLineActivity([line])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n line.deletedAt = new Date()\n await trx.flush()\n return line\n },\n )\n if (!line) return\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'deleted' }] })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input,\n result?.lineId ?? null,\n 'wms.audit.receivingLine.create',\n 'Create receiving line',\n WMS_RECEIVING_LINE_RESOURCE,\n )\n const after = snapshots?.after as ReceivingLineSnapshot | undefined\n return { ...base, snapshotAfter: after, payload: { undo: { after } } }\n },\n}\n\nconst updateReceivingLineCommand: CommandHandler<ReceivingLineUpdateInput, { lineId: string }> = {\n id: 'wms.receiving-lines.update',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Receiving line')\n const em = resolveEm(ctx)\n const line = await loadReceivingLine(em, ctx, id)\n return { before: snapshotReceivingLine(line) }\n },\n async execute(rawInput, ctx) {\n assertReceivingLineLifecycleFieldsForbidden(rawInput)\n const input = receivingLineUpdateSchema.parse(rawInput ?? {})\n const rootEm = resolveEm(ctx)\n\n // Lock ASN then line (same order as receive) and re-check activity under\n // the locks so concurrent receive cannot post stock while we rewrite variant/qty/staging.\n const line = await rootEm.transactional(async (trx) => {\n const unlocked = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id: input.id, deletedAt: null },\n undefined,\n resolveScope(ctx),\n )\n if (!unlocked) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, unlocked.tenantId)\n ensureOrganizationScope(ctx, unlocked.organizationId)\n const asnId = typeof unlocked.asn === 'string' ? unlocked.asn : unlocked.asn.id\n const scope = { tenantId: unlocked.tenantId, organizationId: unlocked.organizationId }\n\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: asnId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n assertAsnMutable(asn)\n\n const locked = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id: input.id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!locked) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, locked.tenantId)\n ensureOrganizationScope(ctx, locked.organizationId)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_RECEIVING_LINE_RESOURCE,\n resourceId: locked.id,\n current: locked.updatedAt,\n request: ctx.request ?? null,\n })\n // Same floor as receiving-line delete \u2014 refuse mutating lines after receipt/QC.\n if (hasAsnDeleteBlockingLineActivity([locked])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n if (input.catalogVariantId !== undefined) locked.catalogVariantId = input.catalogVariantId\n if (input.expectedQty !== undefined) locked.expectedQty = toNumericString(input.expectedQty)\n if (input.lotNumber !== undefined) {\n locked.lotNumber = normalizeOptionalString(input.lotNumber ?? undefined)\n }\n if (input.serialNumbers !== undefined) locked.serialNumbers = input.serialNumbers\n if (input.targetStagingLocationId !== undefined) {\n locked.targetStagingLocationId = input.targetStagingLocationId\n }\n if (input.metadata !== undefined) locked.metadata = toJsonValue(input.metadata) ?? null\n await trx.flush()\n return locked\n })\n\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'updated' }] })\n return { lineId: line.id }\n },\n captureAfter: async (_input, result, ctx) => {\n if (!result?.lineId) return null\n const em = resolveEm(ctx)\n const line = await loadReceivingLine(em, ctx, result.lineId)\n return snapshotReceivingLine(line)\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ before?: ReceivingLineSnapshot | 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 ASN then line (same order as execute/receive) and re-check activity\n // under the locks so concurrent receive cannot commit then undo demote qty/QC.\n const line = await withLockedAsnReceivingLine(\n em,\n ctx,\n before.id,\n scope,\n { requireActiveLine: false },\n async ({ asn, line, trx }) => {\n assertAsnMutable(asn)\n // Refuse restoring snapshot that would clear receipt/QC while stock remains\n // (same floor as receiving-line delete).\n if (hasAsnDeleteBlockingLineActivity([line])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n if (hasAsnDeleteBlockingLineActivity([before])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n line.catalogVariantId = before.catalogVariantId\n line.expectedQty = before.expectedQty\n line.receivedQty = before.receivedQty\n line.lotNumber = before.lotNumber\n line.serialNumbers = before.serialNumbers\n line.qcStatus = before.qcStatus\n line.targetStagingLocationId = before.targetStagingLocationId\n line.rejectionReason = before.rejectionReason\n line.metadata = before.metadata\n line.deletedAt = null\n await trx.flush()\n return line\n },\n )\n if (!line) return\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'updated' }] })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input,\n result?.lineId ?? null,\n 'wms.audit.receivingLine.update',\n 'Update receiving line',\n WMS_RECEIVING_LINE_RESOURCE,\n )\n const before = snapshots?.before as ReceivingLineSnapshot | undefined\n const after = snapshots?.after as ReceivingLineSnapshot | undefined\n return {\n ...base,\n snapshotBefore: before,\n snapshotAfter: after,\n payload: { undo: { before, after } },\n }\n },\n}\n\nconst deleteReceivingLineCommand: CommandHandler<{ id: string }, { lineId: string }> = {\n id: 'wms.receiving-lines.delete',\n async prepare(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Receiving line')\n const em = resolveEm(ctx)\n const line = await loadReceivingLine(em, ctx, id)\n return { before: snapshotReceivingLine(line) }\n },\n async execute(rawInput, ctx) {\n const id = requireId((rawInput as { id?: string } | null)?.id, 'Receiving line')\n const rootEm = resolveEm(ctx)\n\n // Lock ASN then line (same order as update/receive) and re-check activity under\n // the locks so concurrent QC-pass cannot post stock between the guard and flush.\n const line = await rootEm.transactional(async (trx) => {\n const unlocked = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id, deletedAt: null },\n undefined,\n resolveScope(ctx),\n )\n if (!unlocked) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, unlocked.tenantId)\n ensureOrganizationScope(ctx, unlocked.organizationId)\n const asnId = typeof unlocked.asn === 'string' ? unlocked.asn : unlocked.asn.id\n const scope = { tenantId: unlocked.tenantId, organizationId: unlocked.organizationId }\n\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: asnId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n assertAsnMutable(asn)\n\n const locked = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!locked) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, locked.tenantId)\n ensureOrganizationScope(ctx, locked.organizationId)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_RECEIVING_LINE_RESOURCE,\n resourceId: locked.id,\n current: locked.updatedAt,\n request: ctx.request ?? null,\n })\n if (hasAsnDeleteBlockingLineActivity([locked])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n locked.deletedAt = new Date()\n await trx.flush()\n return locked\n })\n\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'deleted' }] })\n return { lineId: line.id }\n },\n undo: async ({ logEntry, ctx }) => {\n const payload = extractUndoPayload<{ before?: ReceivingLineSnapshot | 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 ASN then line (same order as execute/create undo) through mutability\n // + undelete so concurrent ASN receive/complete cannot race undelete.\n const line = await withLockedAsnReceivingLine(\n em,\n ctx,\n before.id,\n scope,\n { requireActiveLine: false },\n async ({ asn, line, trx }) => {\n assertAsnMutable(asn)\n // Refuse undeleting onto a line that somehow gained receipt/QC activity.\n if (hasAsnDeleteBlockingLineActivity([line])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n if (hasAsnDeleteBlockingLineActivity([before])) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n line.deletedAt = null\n await trx.flush()\n return line\n },\n )\n if (!line) return\n await emitAsnSideEffects(ctx, { lines: [{ entity: line, action: 'updated' }] })\n },\n buildLog: async ({ input, result, ctx, snapshots }) => {\n const base = await buildCrudLog(\n ctx,\n input as { id?: string },\n result?.lineId ?? null,\n 'wms.audit.receivingLine.delete',\n 'Delete receiving line',\n WMS_RECEIVING_LINE_RESOURCE,\n )\n const before = snapshots?.before as ReceivingLineSnapshot | undefined\n return { ...base, snapshotBefore: before, payload: { undo: { before } } }\n },\n}\n\ntype ReceiptPutawayLink = { task: PutawayTask; created: boolean }\n\nasync function ensureSerialReceiptPutaways(\n trx: EntityManager,\n scope: Scope,\n input: {\n attemptKey: string\n serialNumbers: string[]\n recreateWhenMissing: boolean\n warehouseId: string\n sourceLocationId: string\n catalogVariantId: string\n lotId: string | null\n asnId: string\n lineId: string\n metadata?: Record<string, unknown> | null\n },\n): Promise<ReceiptPutawayLink[]> {\n const links: ReceiptPutawayLink[] = []\n for (const serialNumber of input.serialNumbers) {\n const putawayKey = buildAsnReceivePutawayKey({\n attemptKey: input.attemptKey,\n serialNumber,\n })\n const existing = await findExistingPutawayForReceipt(trx, scope, putawayKey)\n if (existing) {\n links.push({ task: existing, created: false })\n continue\n }\n let lotId = input.lotId\n if (input.recreateWhenMissing) {\n const cancelled = lotId == null ? await findCancelledPutawayForReceipt(trx, scope, putawayKey) : null\n if (lotId == null) lotId = cancelled?.lotId ?? null\n const availability = await resolveUncommittedStagingPutawayQuantity(\n trx,\n scope,\n {\n warehouseId: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId,\n serialNumber,\n },\n { lock: true },\n )\n const canCreate =\n availability != null &&\n shouldRecreatePutawayOnAlreadyAtTarget({\n requestedQuantity: 1,\n remainingAvailable: availability.remaining,\n })\n if (!canCreate) {\n const covering = availability\n ? selectCoveringOpenPutawayTask(\n availability.openTasks.map((task) => ({\n task,\n quantity: toNumber(task.quantity),\n })),\n 1,\n )\n : null\n if (covering) links.push({ task: covering.task, created: false })\n continue\n }\n }\n links.push(\n await findOrCreatePutawayForReceipt(trx, scope, putawayKey, {\n warehouseId: input.warehouseId,\n sourceLocationId: input.sourceLocationId,\n catalogVariantId: input.catalogVariantId,\n lotId,\n quantity: 1,\n serialNumber,\n asnId: input.asnId,\n lineId: input.lineId,\n metadata: input.metadata ?? null,\n }),\n )\n }\n return links\n}\n\nasync function emitCreatedReceiptPutaways(\n ctx: CommandRuntimeContext,\n scope: Scope,\n putaways: ReceiptPutawayLink[],\n warehouseId: string,\n): Promise<void> {\n for (const entry of putaways) {\n if (!entry.created) continue\n await emitAsnReceivePutawayCreatedSideEffects(ctx, scope, entry.task, warehouseId)\n }\n}\n\ntype ReceiveAsnLineResult = {\n movementIds: string[]\n putawayTaskIds: string[]\n lineId: string\n asnId: string\n receivedQty: number\n asnUpdatedAt: string\n}\n\nconst receiveAsnLineCommand: CommandHandler<AsnReceiveLineInput, ReceiveAsnLineResult> = {\n id: 'wms.asns.receive-line',\n // Stock-affecting on QC pass \u2014 align with Phase 1 inventory undo policy.\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = asnReceiveLineSchema.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 serialNumbers = resolveSerialNumbers(input)\n assertUniqueSerialNumbers(serialNumbers)\n\n // QC-fail: audit-only path (no stock). Still serialize on ASN/line row locks.\n if (!shouldWriteStockOnQcPass(input.qcStatus)) {\n const locked = await rootEm.transactional(async (trx) => {\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: input.asnId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n assertAsnMutable(asn)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: asn.id,\n current: asn.updatedAt,\n request: ctx.request ?? null,\n })\n\n const line = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id: input.lineId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!line) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, line.tenantId)\n ensureOrganizationScope(ctx, line.organizationId)\n\n const lineAsnId = typeof line.asn === 'string' ? line.asn : line.asn.id\n if (lineAsnId !== asn.id) {\n throw new CrudHttpError(422, { error: 'line_asn_mismatch' })\n }\n assertAsnQcTransition(line.qcStatus, input.qcStatus)\n\n const priorReceivedQty = toNumber(line.receivedQty)\n const attempt = resolveAsnReceiveAttempt({\n lineId: line.id,\n priorReceivedQty,\n receivedQty: input.receivedQty,\n targetReceivedQty: input.targetReceivedQty,\n idempotencyKey: input.idempotencyKey,\n })\n const warehouseId = typeof asn.warehouse === 'string' ? asn.warehouse : asn.warehouse.id\n const previousStatus = asn.status\n const receivingStarted = asn.status === 'draft' || asn.status === 'in_transit'\n let lineUpdated = false\n if (attempt.applyQty > 0.000001 && priorReceivedQty === toNumber(line.receivedQty)) {\n if (serialNumbers.length > 0 && priorReceivedQty > 0.000001) {\n assertIncomingSerialsAreNew(serialNumbers, line.serialNumbers)\n }\n line.receivedQty = toNumericString(attempt.targetReceivedQty)\n line.qcStatus = 'failed'\n line.rejectionReason =\n normalizeOptionalString(input.rejectionReason) ?? line.rejectionReason ?? null\n if (input.lotNumber !== undefined) {\n line.lotNumber = normalizeOptionalString(input.lotNumber) ?? line.lotNumber ?? null\n }\n recordReceivedSerials(line, serialNumbers, priorReceivedQty)\n if (asn.status === 'draft') asn.status = 'in_transit'\n // Bump ASN version only with the successful line write (not before).\n asn.updatedAt = new Date()\n line.updatedAt = new Date()\n await trx.flush()\n lineUpdated = true\n }\n return {\n asn,\n line,\n warehouseId,\n previousStatus,\n receivingStarted,\n lineUpdated,\n }\n })\n\n if (locked.lineUpdated) {\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: locked.asn, action: 'updated' }],\n lines: [{ entity: locked.line, action: 'updated' }],\n })\n }\n if (locked.lineUpdated && locked.receivingStarted && locked.previousStatus === 'draft') {\n void emitWmsEvent('wms.asn.receiving_started', {\n id: locked.asn.id,\n warehouseId: locked.warehouseId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\n }\n // Identical absolute-target retry is a no-op (lineUpdated=false); do not re-emit.\n if (locked.lineUpdated) {\n void emitWmsEvent('wms.inventory.receipt_qc_failed', {\n id: locked.line.id,\n asnId: locked.asn.id,\n lineId: locked.line.id,\n catalogVariantId: locked.line.catalogVariantId,\n receivedQty: toNumericString(input.receivedQty),\n rejectionReason: locked.line.rejectionReason,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\n }\n return {\n movementIds: [],\n putawayTaskIds: [],\n lineId: locked.line.id,\n asnId: locked.asn.id,\n receivedQty: toNumber(locked.line.receivedQty),\n asnUpdatedAt: locked.asn.updatedAt.toISOString(),\n }\n }\n\n // QC-pass: one transactional boundary holds ASN/line pessimistic locks through\n // inventory receive + line qty + putaway create. Nested commandBus receives\n // cannot share that TX; inlined applyInventoryReceiveInTransaction does.\n // Concurrent overlapping receives therefore cannot both observe prior=0 and\n // both post stock \u2014 the second waits on the row lock and then sees advanced\n // receivedQty (applyQty=0) or a higher absolute target.\n if (!input.targetStagingLocationId) {\n throw new CrudHttpError(422, { error: 'staging_location_required' })\n }\n\n type QcPassOutcome = {\n movementResults: InventoryReceiveMutationResult[]\n putaways: ReceiptPutawayLink[]\n lineUpdated: boolean\n asn: Asn\n line: ReceivingLine\n warehouseId: string\n previousStatus: AsnStatus\n receivingStarted: boolean\n applyQty: number\n alreadyAtTarget: boolean\n currentReceivedQty: number\n }\n\n const outcome = await rootEm.transactional(async (trx): Promise<QcPassOutcome> => {\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: input.asnId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n assertAsnMutable(asn)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: asn.id,\n current: asn.updatedAt,\n request: ctx.request ?? null,\n })\n\n const line = await findOneWithDecryption(\n trx,\n ReceivingLine,\n { id: input.lineId, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!line) throw new CrudHttpError(404, { error: 'Receiving line not found.' })\n ensureTenantScope(ctx, line.tenantId)\n ensureOrganizationScope(ctx, line.organizationId)\n\n const lineAsnId = typeof line.asn === 'string' ? line.asn : line.asn.id\n if (lineAsnId !== asn.id) {\n throw new CrudHttpError(422, { error: 'line_asn_mismatch' })\n }\n assertAsnQcTransition(line.qcStatus, input.qcStatus)\n\n const warehouseId = typeof asn.warehouse === 'string' ? asn.warehouse : asn.warehouse.id\n await requireStagingLocation(trx, ctx, input.targetStagingLocationId!, warehouseId, scope)\n\n const priorReceivedQty = toNumber(line.receivedQty)\n const attempt = resolveAsnReceiveAttempt({\n lineId: line.id,\n priorReceivedQty,\n receivedQty: input.receivedQty,\n targetReceivedQty: input.targetReceivedQty,\n idempotencyKey: input.idempotencyKey,\n })\n const previousStatus = asn.status\n const receivingStarted = asn.status === 'draft' || asn.status === 'in_transit'\n const aggregatePutawayKey = buildAsnReceivePutawayKey({ attemptKey: attempt.attemptKey })\n const alreadyAtTarget = attempt.applyQty <= 0.000001\n const trackedSerials =\n serialNumbers.length > 0 ? serialNumbers : normalizeStoredSerials(line.serialNumbers)\n const putawayShared = {\n attemptKey: attempt.attemptKey,\n warehouseId,\n sourceLocationId: input.targetStagingLocationId!,\n catalogVariantId: line.catalogVariantId,\n asnId: asn.id,\n lineId: line.id,\n metadata: input.metadata ?? null,\n }\n\n if (alreadyAtTarget) {\n // Cancel clears putaway_key; identical absolute-target retry must recreate\n // so staging stock is not left without a queue task \u2014 but only when\n // uncommitted staging qty remains. Lock the source balance before reading\n // commitments and hold it through insert (same lock as manual create).\n if (trackedSerials.length > 0) {\n const putaways = await ensureSerialReceiptPutaways(trx, scope, {\n ...putawayShared,\n serialNumbers: trackedSerials,\n recreateWhenMissing: true,\n lotId: input.lotId ?? null,\n })\n return {\n movementResults: [],\n putaways,\n lineUpdated: false,\n asn,\n line,\n warehouseId,\n previousStatus,\n receivingStarted,\n applyQty: 0,\n alreadyAtTarget: true,\n currentReceivedQty: toNumber(line.receivedQty),\n }\n }\n const existingPutaway = await findExistingPutawayForReceipt(trx, scope, aggregatePutawayKey)\n const putaways: ReceiptPutawayLink[] = []\n if (existingPutaway) {\n putaways.push({ task: existingPutaway, created: false })\n } else if (shouldEnsurePutawayOnAlreadyAtTarget(existingPutaway)) {\n const cancelled = await findCancelledPutawayForReceipt(trx, scope, aggregatePutawayKey)\n const lotId = input.lotId ?? cancelled?.lotId ?? null\n const quantity = resolvePutawayQuantityForAlreadyAtTargetRetry({\n cancelledTaskQuantity: cancelled ? toNumber(cancelled.quantity) : null,\n absoluteTargetQty: attempt.targetReceivedQty,\n })\n if (quantity > 0.000001) {\n const availability = await resolveUncommittedStagingPutawayQuantity(\n trx,\n scope,\n {\n warehouseId,\n sourceLocationId: input.targetStagingLocationId!,\n catalogVariantId: line.catalogVariantId,\n lotId,\n },\n { lock: true },\n )\n if (\n availability &&\n shouldRecreatePutawayOnAlreadyAtTarget({\n requestedQuantity: quantity,\n remainingAvailable: availability.remaining,\n })\n ) {\n putaways.push(\n await findOrCreatePutawayForReceipt(trx, scope, aggregatePutawayKey, {\n warehouseId,\n sourceLocationId: input.targetStagingLocationId!,\n catalogVariantId: line.catalogVariantId,\n lotId,\n quantity,\n asnId: asn.id,\n lineId: line.id,\n metadata: input.metadata ?? null,\n }),\n )\n } else if (availability) {\n const covering = selectCoveringOpenPutawayTask(\n availability.openTasks.map((task) => ({\n task,\n quantity: toNumber(task.quantity),\n })),\n quantity,\n )\n if (covering) putaways.push({ task: covering.task, created: false })\n }\n }\n }\n return {\n movementResults: [],\n putaways,\n lineUpdated: false,\n asn,\n line,\n warehouseId,\n previousStatus,\n receivingStarted,\n applyQty: 0,\n alreadyAtTarget: true,\n currentReceivedQty: toNumber(line.receivedQty),\n }\n }\n\n if (serialNumbers.length > 0 && priorReceivedQty > 0.000001) {\n assertIncomingSerialsAreNew(serialNumbers, line.serialNumbers)\n }\n if (serialNumbers.length > 0 && serialNumbers.length !== attempt.applyQty) {\n throw new CrudHttpError(422, { error: 'tracking_required' })\n }\n\n const movementResults: InventoryReceiveMutationResult[] = []\n const receiveOnce = async (quantity: number, serialNumber?: string) => {\n const movementPutawayKey = buildAsnReceivePutawayKey({\n attemptKey: attempt.attemptKey,\n serialNumber,\n })\n const receiveInput: InventoryReceiveInput = {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n warehouseId,\n locationId: input.targetStagingLocationId!,\n catalogVariantId: line.catalogVariantId,\n lotId: input.lotId,\n lotNumber: input.lotNumber ?? line.lotNumber ?? undefined,\n serialNumber,\n quantity,\n referenceType: 'po',\n referenceId: buildAsnReceiveReferenceId({\n attemptKey: attempt.attemptKey,\n serialNumber,\n }),\n performedBy: input.performedBy,\n receivedAt: input.receivedAt,\n reasonCode: 'asn_receive',\n metadata: {\n ...(input.metadata ?? {}),\n asnId: asn.id,\n asnReferenceNumber: asn.referenceNumber ?? null,\n receivingLineId: line.id,\n putawayKey: movementPutawayKey,\n source: 'asn_receive',\n },\n }\n movementResults.push(await applyInventoryReceiveInTransaction(trx, ctx, receiveInput))\n }\n\n if (serialNumbers.length > 0) {\n for (const serialNumber of serialNumbers) {\n await receiveOnce(1, serialNumber)\n }\n } else {\n await receiveOnce(attempt.applyQty)\n }\n\n const lotId =\n input.lotId ?? movementResults.find((result) => result.lotId)?.lotId ?? null\n\n const putaways =\n serialNumbers.length > 0\n ? await ensureSerialReceiptPutaways(trx, scope, {\n ...putawayShared,\n serialNumbers,\n recreateWhenMissing: false,\n lotId,\n })\n : [\n await findOrCreatePutawayForReceipt(trx, scope, aggregatePutawayKey, {\n warehouseId,\n sourceLocationId: input.targetStagingLocationId!,\n catalogVariantId: line.catalogVariantId,\n lotId,\n quantity: attempt.applyQty,\n asnId: asn.id,\n lineId: line.id,\n metadata: input.metadata ?? null,\n }),\n ]\n\n const currentReceived = toNumber(line.receivedQty)\n let lineUpdated = false\n if (currentReceived + 0.000001 < attempt.targetReceivedQty) {\n line.receivedQty = toNumericString(attempt.targetReceivedQty)\n line.qcStatus = 'passed'\n line.targetStagingLocationId = input.targetStagingLocationId\n line.rejectionReason = null\n if (input.lotNumber !== undefined) {\n line.lotNumber = normalizeOptionalString(input.lotNumber) ?? line.lotNumber ?? null\n }\n recordReceivedSerials(line, serialNumbers, priorReceivedQty)\n if (asn.status === 'draft') asn.status = 'in_transit'\n // Bump ASN version only after stock + line write succeed in this TX.\n asn.updatedAt = new Date()\n line.updatedAt = new Date()\n await trx.flush()\n lineUpdated = true\n }\n\n return {\n movementResults,\n putaways,\n lineUpdated,\n asn,\n line,\n warehouseId,\n previousStatus,\n receivingStarted,\n applyQty: attempt.applyQty,\n alreadyAtTarget: false,\n currentReceivedQty: toNumber(line.receivedQty),\n }\n })\n\n if (outcome.alreadyAtTarget) {\n await emitCreatedReceiptPutaways(ctx, scope, outcome.putaways, outcome.warehouseId)\n return {\n movementIds: [],\n putawayTaskIds: outcome.putaways.map((entry) => entry.task.id),\n lineId: outcome.line.id,\n asnId: outcome.asn.id,\n receivedQty: outcome.currentReceivedQty,\n asnUpdatedAt: outcome.asn.updatedAt.toISOString(),\n }\n }\n\n for (const movementResult of outcome.movementResults) {\n await emitInventoryReceiveSideEffects(ctx, movementResult)\n }\n\n await emitCreatedReceiptPutaways(ctx, scope, outcome.putaways, outcome.warehouseId)\n\n if (outcome.lineUpdated) {\n await emitAsnSideEffects(ctx, {\n asns: [{ entity: outcome.asn, action: 'updated' }],\n lines: [{ entity: outcome.line, action: 'updated' }],\n })\n\n if (outcome.receivingStarted && outcome.previousStatus === 'draft') {\n void emitWmsEvent('wms.asn.receiving_started', {\n id: outcome.asn.id,\n warehouseId: outcome.warehouseId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\n }\n void emitWmsEvent('wms.asn.line_received', {\n id: outcome.line.id,\n asnId: outcome.asn.id,\n lineId: outcome.line.id,\n movementIds: outcome.movementResults.map((result) => result.movementId),\n catalogVariantId: outcome.line.catalogVariantId,\n receivedQty: toNumericString(outcome.applyQty),\n locationId: input.targetStagingLocationId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n }).catch(() => undefined)\n }\n\n if (outcome.putaways.length === 0) {\n throw new CrudHttpError(500, { error: '[internal] putaway missing after QC-pass receive' })\n }\n\n return {\n movementIds: outcome.movementResults.map((result) => result.movementId),\n putawayTaskIds: outcome.putaways.map((entry) => entry.task.id),\n lineId: outcome.line.id,\n asnId: outcome.asn.id,\n receivedQty: toNumber(outcome.line.receivedQty),\n asnUpdatedAt: outcome.asn.updatedAt.toISOString(),\n }\n },\n buildLog: async ({ input, result, ctx }) => {\n const { translate } = await resolveTranslations()\n return {\n actionLabel: translate('wms.audit.asn.receiveLine', 'Receive ASN line'),\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: result?.asnId ?? input?.asnId ?? null,\n parentResourceKind: WMS_RECEIVING_LINE_RESOURCE,\n parentResourceId: result?.lineId ?? input?.lineId ?? null,\n tenantId: input?.tenantId ?? ctx.auth?.tenantId ?? null,\n organizationId: input?.organizationId ?? ctx.selectedOrganizationId ?? ctx.auth?.orgId ?? null,\n context: { cacheAliases: [WMS_INVENTORY_BALANCE_RESOURCE, WMS_RECEIVING_LINE_RESOURCE] },\n }\n },\n}\n\nconst closeAsnCommand: CommandHandler<AsnCloseInput, { asnId: string; status: AsnStatus }> = {\n id: 'wms.asns.close',\n isUndoable: false,\n async execute(rawInput, ctx) {\n const input = asnCloseSchema.parse(rawInput ?? {})\n ensureTenantScope(ctx, input.tenantId)\n ensureOrganizationScope(ctx, input.organizationId)\n const em = resolveEm(ctx)\n const scope = resolveScope(ctx, input)\n\n const locked = await em.transactional(async (trx) => {\n const asn = await findOneWithDecryption(\n trx,\n Asn,\n { id: input.id, deletedAt: null },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n scope,\n )\n if (!asn) throw new CrudHttpError(404, { error: 'ASN not found.' })\n ensureTenantScope(ctx, asn.tenantId)\n ensureOrganizationScope(ctx, asn.organizationId)\n await enforceCommandOptimisticLockWithGuards(ctx.container, {\n resourceKind: WMS_ASN_RESOURCE,\n resourceId: asn.id,\n current: asn.updatedAt,\n request: ctx.request ?? null,\n })\n if (asn.status === 'closed') {\n return { asn, transitioned: false as const, emitReceived: false as const }\n }\n if (asn.status === 'received') {\n asn.status = 'closed'\n await trx.flush()\n return { asn, transitioned: true as const, emitReceived: false as const }\n }\n\n const lines = await findWithDecryption(\n trx,\n ReceivingLine,\n { asn: asn.id, deletedAt: null },\n undefined,\n { tenantId: asn.tenantId, organizationId: asn.organizationId },\n )\n if (!isAsnCloseable(lines, !!input.closeWhenShort)) {\n throw new CrudHttpError(409, { error: 'invalid_receipt_state' })\n }\n asn.status = 'received'\n await trx.flush()\n return { asn, transitioned: true as const, emitReceived: true as const }\n })\n\n if (locked.transitioned) {\n await emitAsnSideEffects(ctx, { asns: [{ entity: locked.asn, action: 'updated' }] })\n }\n if (locked.emitReceived) {\n void emitWmsEvent('wms.asn.received', {\n id: locked.asn.id,\n status: locked.asn.status,\n closeWhenShort: !!input.closeWhenShort,\n tenantId: locked.asn.tenantId,\n organizationId: locked.asn.organizationId,\n }).catch(() => undefined)\n }\n return { asnId: locked.asn.id, status: locked.asn.status }\n },\n buildLog: async ({ input, result, ctx }) =>\n buildCrudLog(ctx, input, result?.asnId ?? null, 'wms.audit.asn.close', 'Complete ASN', WMS_ASN_RESOURCE),\n}\n\nregisterCommand(createAsnCommand)\nregisterCommand(updateAsnCommand)\nregisterCommand(deleteAsnCommand)\nregisterCommand(createReceivingLineCommand)\nregisterCommand(updateReceivingLineCommand)\nregisterCommand(deleteReceivingLineCommand)\nregisterCommand(receiveAsnLineCommand)\nregisterCommand(closeAsnCommand)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["asn", "line", "putaways", "lotId"]
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/wms/commands/index.ts"],
|
|
4
|
-
"sourcesContent": ["import './configuration'\nimport './inventory-actions'\nimport './sales-order-assignment'\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO;AACP,OAAO;AACP,OAAO;",
|
|
4
|
+
"sourcesContent": ["import './configuration'\nimport './inventory-actions'\nimport './sales-order-assignment'\nimport './asn'\nimport './putaway'\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;AACP,OAAO;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|