@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,17 @@
|
|
|
1
|
+
import { Migration } from "@mikro-orm/migrations";
|
|
2
|
+
class Migration20260822130000_wms extends Migration {
|
|
3
|
+
up() {
|
|
4
|
+
this.addSql(`alter table "wms_asns" add column "source_key" text null;`);
|
|
5
|
+
this.addSql(
|
|
6
|
+
`create unique index "wms_asns_org_source_key_unique_idx" on "wms_asns" ("organization_id", "source_key") where source_key is not null and deleted_at is null;`
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
down() {
|
|
10
|
+
this.addSql(`drop index if exists "wms_asns_org_source_key_unique_idx";`);
|
|
11
|
+
this.addSql(`alter table "wms_asns" drop column if exists "source_key";`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
Migration20260822130000_wms
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=Migration20260822130000.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/migrations/Migration20260822130000.ts"],
|
|
4
|
+
"sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20260822130000_wms extends Migration {\n override up(): void | Promise<void> {\n this.addSql(`alter table \"wms_asns\" add column \"source_key\" text null;`)\n this.addSql(\n `create unique index \"wms_asns_org_source_key_unique_idx\" on \"wms_asns\" (\"organization_id\", \"source_key\") where source_key is not null and deleted_at is null;`,\n )\n }\n\n override down(): void | Promise<void> {\n this.addSql(`drop index if exists \"wms_asns_org_source_key_unique_idx\";`)\n this.addSql(`alter table \"wms_asns\" drop column if exists \"source_key\";`)\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,oCAAoC,UAAU;AAAA,EAChD,KAA2B;AAClC,SAAK,OAAO,2DAA2D;AACvE,SAAK;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,4DAA4D;AACxE,SAAK,OAAO,4DAA4D;AAAA,EAC1E;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Migration } from "@mikro-orm/migrations";
|
|
2
|
+
class Migration20261029120000_wms extends Migration {
|
|
3
|
+
up() {
|
|
4
|
+
this.addSql(`alter table "wms_putaway_tasks" add column "serial_number" text null;`);
|
|
5
|
+
}
|
|
6
|
+
down() {
|
|
7
|
+
this.addSql(`alter table "wms_putaway_tasks" drop column if exists "serial_number";`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
Migration20261029120000_wms
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=Migration20261029120000.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/migrations/Migration20261029120000.ts"],
|
|
4
|
+
"sourcesContent": ["import { Migration } from '@mikro-orm/migrations'\n\nexport class Migration20261029120000_wms extends Migration {\n override up(): void | Promise<void> {\n this.addSql(`alter table \"wms_putaway_tasks\" add column \"serial_number\" text null;`)\n }\n\n override down(): void | Promise<void> {\n this.addSql(`alter table \"wms_putaway_tasks\" drop column if exists \"serial_number\";`)\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,oCAAoC,UAAU;AAAA,EAChD,KAA2B;AAClC,SAAK,OAAO,uEAAuE;AAAA,EACrF;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,wEAAwE;AAAA,EACtF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -63,6 +63,27 @@ function buildLotPresenter(t, record) {
|
|
|
63
63
|
const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt);
|
|
64
64
|
return { title, subtitle, icon: "package-search" };
|
|
65
65
|
}
|
|
66
|
+
function buildAsnPresenter(t, record) {
|
|
67
|
+
const label = t("wms.search.badge.asn", "ASN");
|
|
68
|
+
const title = pickString(record.reference_number, record.referenceNumber, record.id) ?? label;
|
|
69
|
+
const subtitle = formatSubtitle(
|
|
70
|
+
record.status,
|
|
71
|
+
record.warehouse_id ?? record.warehouseId,
|
|
72
|
+
record.expected_at ?? record.expectedAt
|
|
73
|
+
);
|
|
74
|
+
return { title, subtitle, icon: "truck", badge: label };
|
|
75
|
+
}
|
|
76
|
+
function buildPutawayPresenter(t, record) {
|
|
77
|
+
const label = t("wms.search.badge.putaway", "Putaway task");
|
|
78
|
+
const title = pickString(record.catalog_variant_id, record.catalogVariantId, record.id) ?? label;
|
|
79
|
+
const subtitle = formatSubtitle(
|
|
80
|
+
record.status,
|
|
81
|
+
record.warehouse_id ?? record.warehouseId,
|
|
82
|
+
record.source_location_id ?? record.sourceLocationId,
|
|
83
|
+
record.target_location_id ?? record.targetLocationId
|
|
84
|
+
);
|
|
85
|
+
return { title, subtitle, icon: "package", badge: label };
|
|
86
|
+
}
|
|
66
87
|
const searchConfig = {
|
|
67
88
|
entities: [
|
|
68
89
|
{
|
|
@@ -187,6 +208,70 @@ const searchConfig = {
|
|
|
187
208
|
fieldPolicy: {
|
|
188
209
|
searchable: ["lot_number", "batch_number", "sku", "catalog_variant_id", "status", "expires_at"]
|
|
189
210
|
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
entityId: E.wms.asn,
|
|
214
|
+
aclFeatures: ["wms.view"],
|
|
215
|
+
enabled: true,
|
|
216
|
+
priority: 7,
|
|
217
|
+
buildSource: async (ctx) => {
|
|
218
|
+
const { t } = await resolveTranslations();
|
|
219
|
+
const record = ctx.record;
|
|
220
|
+
const lines = [];
|
|
221
|
+
appendLine(lines, "Reference", record.reference_number ?? record.referenceNumber);
|
|
222
|
+
appendLine(lines, "Status", record.status);
|
|
223
|
+
appendLine(lines, "Warehouse", record.warehouse_id ?? record.warehouseId);
|
|
224
|
+
appendLine(lines, "Vendor", record.vendor_id ?? record.vendorId);
|
|
225
|
+
appendLine(lines, "Expected at", record.expected_at ?? record.expectedAt);
|
|
226
|
+
appendLine(lines, "Notes", record.notes);
|
|
227
|
+
return buildIndexSource(ctx, buildAsnPresenter(t, record), lines);
|
|
228
|
+
},
|
|
229
|
+
formatResult: async (ctx) => {
|
|
230
|
+
const { t } = await resolveTranslations();
|
|
231
|
+
return buildAsnPresenter(t, ctx.record);
|
|
232
|
+
},
|
|
233
|
+
resolveUrl: async (ctx) => {
|
|
234
|
+
const id = pickString(ctx.record.id);
|
|
235
|
+
if (id) return `${WMS_ROOT_URL}/asns/${id}`;
|
|
236
|
+
return WMS_ROOT_URL;
|
|
237
|
+
},
|
|
238
|
+
fieldPolicy: {
|
|
239
|
+
searchable: ["reference_number", "status", "warehouse_id", "vendor_id", "notes"]
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
entityId: E.wms.putaway_task,
|
|
244
|
+
aclFeatures: ["wms.view"],
|
|
245
|
+
enabled: true,
|
|
246
|
+
priority: 6,
|
|
247
|
+
buildSource: async (ctx) => {
|
|
248
|
+
const { t } = await resolveTranslations();
|
|
249
|
+
const record = ctx.record;
|
|
250
|
+
const lines = [];
|
|
251
|
+
appendLine(lines, "Status", record.status);
|
|
252
|
+
appendLine(lines, "Warehouse", record.warehouse_id ?? record.warehouseId);
|
|
253
|
+
appendLine(lines, "Source", record.source_location_id ?? record.sourceLocationId);
|
|
254
|
+
appendLine(lines, "Target", record.target_location_id ?? record.targetLocationId);
|
|
255
|
+
appendLine(lines, "Variant", record.catalog_variant_id ?? record.catalogVariantId);
|
|
256
|
+
appendLine(lines, "Assigned to", record.assigned_to ?? record.assignedTo);
|
|
257
|
+
appendLine(lines, "Quantity", record.quantity);
|
|
258
|
+
return buildIndexSource(ctx, buildPutawayPresenter(t, record), lines);
|
|
259
|
+
},
|
|
260
|
+
formatResult: async (ctx) => {
|
|
261
|
+
const { t } = await resolveTranslations();
|
|
262
|
+
return buildPutawayPresenter(t, ctx.record);
|
|
263
|
+
},
|
|
264
|
+
resolveUrl: async () => `${WMS_ROOT_URL}/putaway`,
|
|
265
|
+
fieldPolicy: {
|
|
266
|
+
searchable: [
|
|
267
|
+
"status",
|
|
268
|
+
"warehouse_id",
|
|
269
|
+
"source_location_id",
|
|
270
|
+
"target_location_id",
|
|
271
|
+
"catalog_variant_id",
|
|
272
|
+
"assigned_to"
|
|
273
|
+
]
|
|
274
|
+
}
|
|
190
275
|
}
|
|
191
276
|
]
|
|
192
277
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/modules/wms/search.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n SearchBuildContext,\n SearchIndexSource,\n SearchModuleConfig,\n SearchResultPresenter,\n} from '@open-mercato/shared/modules/search'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { E } from '#generated/entities.ids.generated'\n\nconst WMS_ROOT_URL = '/backend/wms'\nconst WMS_INVENTORY_URL = '/backend/wms/inventory'\nconst WMS_CONFIG_URL = '/backend/config/wms'\n\nfunction pickString(...candidates: Array<unknown>): string | null {\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction appendLine(lines: string[], label: string, value: unknown) {\n if (value === null || value === undefined) return\n const text = Array.isArray(value)\n ? value.map((item) => (item == null ? '' : String(item))).filter(Boolean).join(', ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n if (!text.trim()) return\n lines.push(`${label}: ${text}`)\n}\n\nfunction formatSubtitle(...parts: Array<unknown>): string | undefined {\n const values = parts\n .map((part) => (part == null ? '' : String(part)).trim())\n .filter(Boolean)\n if (!values.length) return undefined\n return values.join(' \u00B7 ')\n}\n\nfunction buildIndexSource(\n ctx: SearchBuildContext,\n presenter: SearchResultPresenter,\n lines: string[],\n): SearchIndexSource | null {\n for (const [key, value] of Object.entries(ctx.customFields)) {\n appendLine(lines, key.replace(/^cf:/, ''), value)\n }\n if (!lines.length) return null\n return {\n text: lines,\n presenter,\n checksumSource: { record: ctx.record, customFields: ctx.customFields },\n }\n}\n\nfunction buildWarehousePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.warehouse', 'Warehouse')\n const title = pickString(record.name, record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.code, record.city, record.country)\n return { title, subtitle, icon: 'warehouse' }\n}\n\nfunction buildLocationPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.location', 'Location')\n const title = pickString(record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.type, record.warehouse_id ?? record.warehouseId)\n return { title, subtitle, icon: 'map-pinned' }\n}\n\nfunction buildInventoryProfilePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.inventoryProfile', 'Inventory profile')\n const productId = pickString(record.catalog_product_id, record.catalogProductId)\n const variantId = pickString(record.catalog_variant_id, record.catalogVariantId)\n const title = variantId || productId || pickString(record.id) || label\n const subtitle = formatSubtitle(\n record.default_strategy ?? record.defaultStrategy,\n record.default_uom ?? record.defaultUom,\n variantId ? t('wms.search.profile.variantScoped', 'Variant-scoped') : t('wms.search.profile.productScoped', 'Product-scoped'),\n )\n return { title, subtitle, icon: 'boxes' }\n}\n\nfunction buildLotPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.lot', 'Inventory lot')\n const title = pickString(record.lot_number, record.lotNumber, record.batch_number, record.batchNumber, record.id) ?? label\n const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt)\n return { title, subtitle, icon: 'package-search' }\n}\n\nexport const searchConfig: SearchModuleConfig = {\n entities: [\n {\n entityId: E.wms.warehouse,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Name', record.name)\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'City', record.city)\n appendLine(lines, 'Country', record.country)\n appendLine(lines, 'Timezone', record.timezone)\n return buildIndexSource(ctx, buildWarehousePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildWarehousePresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['name', 'code', 'city', 'country', 'timezone'],\n },\n },\n {\n entityId: E.wms.warehouse_location,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'Type', record.type)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Parent', record.parent_id ?? record.parentId)\n appendLine(lines, 'Capacity units', record.capacity_units ?? record.capacityUnits)\n appendLine(lines, 'Capacity weight', record.capacity_weight ?? record.capacityWeight)\n return buildIndexSource(ctx, buildLocationPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLocationPresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['code', 'type', 'warehouse_id', 'parent_id', 'capacity_units', 'capacity_weight'],\n },\n },\n {\n entityId: E.wms.product_inventory_profile,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Product', record.catalog_product_id ?? record.catalogProductId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Default UOM', record.default_uom ?? record.defaultUom)\n appendLine(lines, 'Strategy', record.default_strategy ?? record.defaultStrategy)\n appendLine(lines, 'Reorder point', record.reorder_point ?? record.reorderPoint)\n appendLine(lines, 'Safety stock', record.safety_stock ?? record.safetyStock)\n appendLine(lines, 'Track lot', record.track_lot ?? record.trackLot)\n appendLine(lines, 'Track serial', record.track_serial ?? record.trackSerial)\n appendLine(lines, 'Track expiration', record.track_expiration ?? record.trackExpiration)\n return buildIndexSource(ctx, buildInventoryProfilePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildInventoryProfilePresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const variantId = pickString(ctx.record.catalog_variant_id, ctx.record.catalogVariantId)\n if (variantId) return `${WMS_ROOT_URL}/sku/${variantId}`\n return WMS_CONFIG_URL\n },\n resolveLinks: async () => [{ href: WMS_INVENTORY_URL, label: 'Inventory console', kind: 'secondary' }],\n fieldPolicy: {\n searchable: [\n 'catalog_product_id',\n 'catalog_variant_id',\n 'default_uom',\n 'default_strategy',\n 'reorder_point',\n 'safety_stock',\n ],\n },\n },\n {\n entityId: E.wms.inventory_lot,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Lot number', record.lot_number ?? record.lotNumber)\n appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)\n appendLine(lines, 'SKU', record.sku)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Expires at', record.expires_at ?? record.expiresAt)\n return buildIndexSource(ctx, buildLotPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLotPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/lot/${id}`\n return WMS_ROOT_URL\n },\n resolveLinks: async () => [{ href: WMS_CONFIG_URL, label: 'WMS configuration', kind: 'secondary' }],\n fieldPolicy: {\n searchable: ['lot_number', 'batch_number', 'sku', 'catalog_variant_id', 'status', 'expires_at'],\n },\n },\n ],\n}\n\nexport default searchConfig\nexport const config = searchConfig\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type {\n SearchBuildContext,\n SearchIndexSource,\n SearchModuleConfig,\n SearchResultPresenter,\n} from '@open-mercato/shared/modules/search'\nimport type { TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { E } from '#generated/entities.ids.generated'\n\nconst WMS_ROOT_URL = '/backend/wms'\nconst WMS_INVENTORY_URL = '/backend/wms/inventory'\nconst WMS_CONFIG_URL = '/backend/config/wms'\n\nfunction pickString(...candidates: Array<unknown>): string | null {\n for (const candidate of candidates) {\n if (typeof candidate !== 'string') continue\n const trimmed = candidate.trim()\n if (trimmed.length > 0) return trimmed\n }\n return null\n}\n\nfunction appendLine(lines: string[], label: string, value: unknown) {\n if (value === null || value === undefined) return\n const text = Array.isArray(value)\n ? value.map((item) => (item == null ? '' : String(item))).filter(Boolean).join(', ')\n : typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n if (!text.trim()) return\n lines.push(`${label}: ${text}`)\n}\n\nfunction formatSubtitle(...parts: Array<unknown>): string | undefined {\n const values = parts\n .map((part) => (part == null ? '' : String(part)).trim())\n .filter(Boolean)\n if (!values.length) return undefined\n return values.join(' \u00B7 ')\n}\n\nfunction buildIndexSource(\n ctx: SearchBuildContext,\n presenter: SearchResultPresenter,\n lines: string[],\n): SearchIndexSource | null {\n for (const [key, value] of Object.entries(ctx.customFields)) {\n appendLine(lines, key.replace(/^cf:/, ''), value)\n }\n if (!lines.length) return null\n return {\n text: lines,\n presenter,\n checksumSource: { record: ctx.record, customFields: ctx.customFields },\n }\n}\n\nfunction buildWarehousePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.warehouse', 'Warehouse')\n const title = pickString(record.name, record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.code, record.city, record.country)\n return { title, subtitle, icon: 'warehouse' }\n}\n\nfunction buildLocationPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.location', 'Location')\n const title = pickString(record.code, record.id) ?? label\n const subtitle = formatSubtitle(record.type, record.warehouse_id ?? record.warehouseId)\n return { title, subtitle, icon: 'map-pinned' }\n}\n\nfunction buildInventoryProfilePresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.inventoryProfile', 'Inventory profile')\n const productId = pickString(record.catalog_product_id, record.catalogProductId)\n const variantId = pickString(record.catalog_variant_id, record.catalogVariantId)\n const title = variantId || productId || pickString(record.id) || label\n const subtitle = formatSubtitle(\n record.default_strategy ?? record.defaultStrategy,\n record.default_uom ?? record.defaultUom,\n variantId ? t('wms.search.profile.variantScoped', 'Variant-scoped') : t('wms.search.profile.productScoped', 'Product-scoped'),\n )\n return { title, subtitle, icon: 'boxes' }\n}\n\nfunction buildLotPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.lot', 'Inventory lot')\n const title = pickString(record.lot_number, record.lotNumber, record.batch_number, record.batchNumber, record.id) ?? label\n const subtitle = formatSubtitle(record.catalog_variant_id ?? record.catalogVariantId, record.status, record.expires_at ?? record.expiresAt)\n return { title, subtitle, icon: 'package-search' }\n}\n\nfunction buildAsnPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.asn', 'ASN')\n const title =\n pickString(record.reference_number, record.referenceNumber, record.id) ?? label\n const subtitle = formatSubtitle(\n record.status,\n record.warehouse_id ?? record.warehouseId,\n record.expected_at ?? record.expectedAt,\n )\n return { title, subtitle, icon: 'truck', badge: label }\n}\n\nfunction buildPutawayPresenter(\n t: TranslateFn,\n record: Record<string, unknown>,\n): SearchResultPresenter {\n const label = t('wms.search.badge.putaway', 'Putaway task')\n const title =\n pickString(record.catalog_variant_id, record.catalogVariantId, record.id) ?? label\n const subtitle = formatSubtitle(\n record.status,\n record.warehouse_id ?? record.warehouseId,\n record.source_location_id ?? record.sourceLocationId,\n record.target_location_id ?? record.targetLocationId,\n )\n return { title, subtitle, icon: 'package', badge: label }\n}\n\nexport const searchConfig: SearchModuleConfig = {\n entities: [\n {\n entityId: E.wms.warehouse,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Name', record.name)\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'City', record.city)\n appendLine(lines, 'Country', record.country)\n appendLine(lines, 'Timezone', record.timezone)\n return buildIndexSource(ctx, buildWarehousePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildWarehousePresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['name', 'code', 'city', 'country', 'timezone'],\n },\n },\n {\n entityId: E.wms.warehouse_location,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Code', record.code)\n appendLine(lines, 'Type', record.type)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Parent', record.parent_id ?? record.parentId)\n appendLine(lines, 'Capacity units', record.capacity_units ?? record.capacityUnits)\n appendLine(lines, 'Capacity weight', record.capacity_weight ?? record.capacityWeight)\n return buildIndexSource(ctx, buildLocationPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLocationPresenter(t, ctx.record)\n },\n resolveUrl: async () => WMS_CONFIG_URL,\n fieldPolicy: {\n searchable: ['code', 'type', 'warehouse_id', 'parent_id', 'capacity_units', 'capacity_weight'],\n },\n },\n {\n entityId: E.wms.product_inventory_profile,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 8,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Product', record.catalog_product_id ?? record.catalogProductId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Default UOM', record.default_uom ?? record.defaultUom)\n appendLine(lines, 'Strategy', record.default_strategy ?? record.defaultStrategy)\n appendLine(lines, 'Reorder point', record.reorder_point ?? record.reorderPoint)\n appendLine(lines, 'Safety stock', record.safety_stock ?? record.safetyStock)\n appendLine(lines, 'Track lot', record.track_lot ?? record.trackLot)\n appendLine(lines, 'Track serial', record.track_serial ?? record.trackSerial)\n appendLine(lines, 'Track expiration', record.track_expiration ?? record.trackExpiration)\n return buildIndexSource(ctx, buildInventoryProfilePresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildInventoryProfilePresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const variantId = pickString(ctx.record.catalog_variant_id, ctx.record.catalogVariantId)\n if (variantId) return `${WMS_ROOT_URL}/sku/${variantId}`\n return WMS_CONFIG_URL\n },\n resolveLinks: async () => [{ href: WMS_INVENTORY_URL, label: 'Inventory console', kind: 'secondary' }],\n fieldPolicy: {\n searchable: [\n 'catalog_product_id',\n 'catalog_variant_id',\n 'default_uom',\n 'default_strategy',\n 'reorder_point',\n 'safety_stock',\n ],\n },\n },\n {\n entityId: E.wms.inventory_lot,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Lot number', record.lot_number ?? record.lotNumber)\n appendLine(lines, 'Batch number', record.batch_number ?? record.batchNumber)\n appendLine(lines, 'SKU', record.sku)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Expires at', record.expires_at ?? record.expiresAt)\n return buildIndexSource(ctx, buildLotPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildLotPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/lot/${id}`\n return WMS_ROOT_URL\n },\n resolveLinks: async () => [{ href: WMS_CONFIG_URL, label: 'WMS configuration', kind: 'secondary' }],\n fieldPolicy: {\n searchable: ['lot_number', 'batch_number', 'sku', 'catalog_variant_id', 'status', 'expires_at'],\n },\n },\n {\n entityId: E.wms.asn,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 7,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Reference', record.reference_number ?? record.referenceNumber)\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Vendor', record.vendor_id ?? record.vendorId)\n appendLine(lines, 'Expected at', record.expected_at ?? record.expectedAt)\n appendLine(lines, 'Notes', record.notes)\n return buildIndexSource(ctx, buildAsnPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildAsnPresenter(t, ctx.record)\n },\n resolveUrl: async (ctx) => {\n const id = pickString(ctx.record.id)\n if (id) return `${WMS_ROOT_URL}/asns/${id}`\n return WMS_ROOT_URL\n },\n fieldPolicy: {\n searchable: ['reference_number', 'status', 'warehouse_id', 'vendor_id', 'notes'],\n },\n },\n {\n entityId: E.wms.putaway_task,\n aclFeatures: ['wms.view'],\n enabled: true,\n priority: 6,\n buildSource: async (ctx) => {\n const { t } = await resolveTranslations()\n const record = ctx.record\n const lines: string[] = []\n appendLine(lines, 'Status', record.status)\n appendLine(lines, 'Warehouse', record.warehouse_id ?? record.warehouseId)\n appendLine(lines, 'Source', record.source_location_id ?? record.sourceLocationId)\n appendLine(lines, 'Target', record.target_location_id ?? record.targetLocationId)\n appendLine(lines, 'Variant', record.catalog_variant_id ?? record.catalogVariantId)\n appendLine(lines, 'Assigned to', record.assigned_to ?? record.assignedTo)\n appendLine(lines, 'Quantity', record.quantity)\n return buildIndexSource(ctx, buildPutawayPresenter(t, record), lines)\n },\n formatResult: async (ctx) => {\n const { t } = await resolveTranslations()\n return buildPutawayPresenter(t, ctx.record)\n },\n resolveUrl: async () => `${WMS_ROOT_URL}/putaway`,\n fieldPolicy: {\n searchable: [\n 'status',\n 'warehouse_id',\n 'source_location_id',\n 'target_location_id',\n 'catalog_variant_id',\n 'assigned_to',\n ],\n },\n },\n ],\n}\n\nexport default searchConfig\nexport const config = searchConfig\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,2BAA2B;AACpC,SAAS,SAAS;AAElB,MAAM,eAAe;AACrB,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AAEvB,SAAS,cAAc,YAA2C;AAChE,aAAW,aAAa,YAAY;AAClC,QAAI,OAAO,cAAc,SAAU;AACnC,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,QAAQ,SAAS,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAiB,OAAe,OAAgB;AAClE,MAAI,UAAU,QAAQ,UAAU,OAAW;AAC3C,QAAM,OAAO,MAAM,QAAQ,KAAK,IAC5B,MAAM,IAAI,CAAC,SAAU,QAAQ,OAAO,KAAK,OAAO,IAAI,CAAE,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,IACjF,OAAO,UAAU,WACf,KAAK,UAAU,KAAK,IACpB,OAAO,KAAK;AAClB,MAAI,CAAC,KAAK,KAAK,EAAG;AAClB,QAAM,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE;AAChC;AAEA,SAAS,kBAAkB,OAA2C;AACpE,QAAM,SAAS,MACZ,IAAI,CAAC,UAAU,QAAQ,OAAO,KAAK,OAAO,IAAI,GAAG,KAAK,CAAC,EACvD,OAAO,OAAO;AACjB,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,SAAO,OAAO,KAAK,QAAK;AAC1B;AAEA,SAAS,iBACP,KACA,WACA,OAC0B;AAC1B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,YAAY,GAAG;AAC3D,eAAW,OAAO,IAAI,QAAQ,QAAQ,EAAE,GAAG,KAAK;AAAA,EAClD;AACA,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,gBAAgB,EAAE,QAAQ,IAAI,QAAQ,cAAc,IAAI,aAAa;AAAA,EACvE;AACF;AAEA,SAAS,wBACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,8BAA8B,WAAW;AACzD,QAAM,QAAQ,WAAW,OAAO,MAAM,OAAO,MAAM,OAAO,EAAE,KAAK;AACjE,QAAM,WAAW,eAAe,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;AACxE,SAAO,EAAE,OAAO,UAAU,MAAM,YAAY;AAC9C;AAEA,SAAS,uBACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,6BAA6B,UAAU;AACvD,QAAM,QAAQ,WAAW,OAAO,MAAM,OAAO,EAAE,KAAK;AACpD,QAAM,WAAW,eAAe,OAAO,MAAM,OAAO,gBAAgB,OAAO,WAAW;AACtF,SAAO,EAAE,OAAO,UAAU,MAAM,aAAa;AAC/C;AAEA,SAAS,+BACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,qCAAqC,mBAAmB;AACxE,QAAM,YAAY,WAAW,OAAO,oBAAoB,OAAO,gBAAgB;AAC/E,QAAM,YAAY,WAAW,OAAO,oBAAoB,OAAO,gBAAgB;AAC/E,QAAM,QAAQ,aAAa,aAAa,WAAW,OAAO,EAAE,KAAK;AACjE,QAAM,WAAW;AAAA,IACf,OAAO,oBAAoB,OAAO;AAAA,IAClC,OAAO,eAAe,OAAO;AAAA,IAC7B,YAAY,EAAE,oCAAoC,gBAAgB,IAAI,EAAE,oCAAoC,gBAAgB;AAAA,EAC9H;AACA,SAAO,EAAE,OAAO,UAAU,MAAM,QAAQ;AAC1C;AAEA,SAAS,kBACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,wBAAwB,eAAe;AACvD,QAAM,QAAQ,WAAW,OAAO,YAAY,OAAO,WAAW,OAAO,cAAc,OAAO,aAAa,OAAO,EAAE,KAAK;AACrH,QAAM,WAAW,eAAe,OAAO,sBAAsB,OAAO,kBAAkB,OAAO,QAAQ,OAAO,cAAc,OAAO,SAAS;AAC1I,SAAO,EAAE,OAAO,UAAU,MAAM,iBAAiB;AACnD;AAEA,SAAS,kBACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,wBAAwB,KAAK;AAC7C,QAAM,QACJ,WAAW,OAAO,kBAAkB,OAAO,iBAAiB,OAAO,EAAE,KAAK;AAC5E,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP,OAAO,gBAAgB,OAAO;AAAA,IAC9B,OAAO,eAAe,OAAO;AAAA,EAC/B;AACA,SAAO,EAAE,OAAO,UAAU,MAAM,SAAS,OAAO,MAAM;AACxD;AAEA,SAAS,sBACP,GACA,QACuB;AACvB,QAAM,QAAQ,EAAE,4BAA4B,cAAc;AAC1D,QAAM,QACJ,WAAW,OAAO,oBAAoB,OAAO,kBAAkB,OAAO,EAAE,KAAK;AAC/E,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,IACP,OAAO,gBAAgB,OAAO;AAAA,IAC9B,OAAO,sBAAsB,OAAO;AAAA,IACpC,OAAO,sBAAsB,OAAO;AAAA,EACtC;AACA,SAAO,EAAE,OAAO,UAAU,MAAM,WAAW,OAAO,MAAM;AAC1D;AAEO,MAAM,eAAmC;AAAA,EAC9C,UAAU;AAAA,IACR;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,QAAQ,OAAO,IAAI;AACrC,mBAAW,OAAO,QAAQ,OAAO,IAAI;AACrC,mBAAW,OAAO,QAAQ,OAAO,IAAI;AACrC,mBAAW,OAAO,WAAW,OAAO,OAAO;AAC3C,mBAAW,OAAO,YAAY,OAAO,QAAQ;AAC7C,eAAO,iBAAiB,KAAK,wBAAwB,GAAG,MAAM,GAAG,KAAK;AAAA,MACxE;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,wBAAwB,GAAG,IAAI,MAAM;AAAA,MAC9C;AAAA,MACA,YAAY,YAAY;AAAA,MACxB,aAAa;AAAA,QACX,YAAY,CAAC,QAAQ,QAAQ,QAAQ,WAAW,UAAU;AAAA,MAC5D;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,QAAQ,OAAO,IAAI;AACrC,mBAAW,OAAO,QAAQ,OAAO,IAAI;AACrC,mBAAW,OAAO,aAAa,OAAO,gBAAgB,OAAO,WAAW;AACxE,mBAAW,OAAO,UAAU,OAAO,aAAa,OAAO,QAAQ;AAC/D,mBAAW,OAAO,kBAAkB,OAAO,kBAAkB,OAAO,aAAa;AACjF,mBAAW,OAAO,mBAAmB,OAAO,mBAAmB,OAAO,cAAc;AACpF,eAAO,iBAAiB,KAAK,uBAAuB,GAAG,MAAM,GAAG,KAAK;AAAA,MACvE;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,uBAAuB,GAAG,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA,YAAY,YAAY;AAAA,MACxB,aAAa;AAAA,QACX,YAAY,CAAC,QAAQ,QAAQ,gBAAgB,aAAa,kBAAkB,iBAAiB;AAAA,MAC/F;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,WAAW,OAAO,sBAAsB,OAAO,gBAAgB;AACjF,mBAAW,OAAO,WAAW,OAAO,sBAAsB,OAAO,gBAAgB;AACjF,mBAAW,OAAO,eAAe,OAAO,eAAe,OAAO,UAAU;AACxE,mBAAW,OAAO,YAAY,OAAO,oBAAoB,OAAO,eAAe;AAC/E,mBAAW,OAAO,iBAAiB,OAAO,iBAAiB,OAAO,YAAY;AAC9E,mBAAW,OAAO,gBAAgB,OAAO,gBAAgB,OAAO,WAAW;AAC3E,mBAAW,OAAO,aAAa,OAAO,aAAa,OAAO,QAAQ;AAClE,mBAAW,OAAO,gBAAgB,OAAO,gBAAgB,OAAO,WAAW;AAC3E,mBAAW,OAAO,oBAAoB,OAAO,oBAAoB,OAAO,eAAe;AACvF,eAAO,iBAAiB,KAAK,+BAA+B,GAAG,MAAM,GAAG,KAAK;AAAA,MAC/E;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,+BAA+B,GAAG,IAAI,MAAM;AAAA,MACrD;AAAA,MACA,YAAY,OAAO,QAAQ;AACzB,cAAM,YAAY,WAAW,IAAI,OAAO,oBAAoB,IAAI,OAAO,gBAAgB;AACvF,YAAI,UAAW,QAAO,GAAG,YAAY,QAAQ,SAAS;AACtD,eAAO;AAAA,MACT;AAAA,MACA,cAAc,YAAY,CAAC,EAAE,MAAM,mBAAmB,OAAO,qBAAqB,MAAM,YAAY,CAAC;AAAA,MACrG,aAAa;AAAA,QACX,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,cAAc,OAAO,cAAc,OAAO,SAAS;AACrE,mBAAW,OAAO,gBAAgB,OAAO,gBAAgB,OAAO,WAAW;AAC3E,mBAAW,OAAO,OAAO,OAAO,GAAG;AACnC,mBAAW,OAAO,WAAW,OAAO,sBAAsB,OAAO,gBAAgB;AACjF,mBAAW,OAAO,UAAU,OAAO,MAAM;AACzC,mBAAW,OAAO,cAAc,OAAO,cAAc,OAAO,SAAS;AACrE,eAAO,iBAAiB,KAAK,kBAAkB,GAAG,MAAM,GAAG,KAAK;AAAA,MAClE;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,kBAAkB,GAAG,IAAI,MAAM;AAAA,MACxC;AAAA,MACA,YAAY,OAAO,QAAQ;AACzB,cAAM,KAAK,WAAW,IAAI,OAAO,EAAE;AACnC,YAAI,GAAI,QAAO,GAAG,YAAY,QAAQ,EAAE;AACxC,eAAO;AAAA,MACT;AAAA,MACA,cAAc,YAAY,CAAC,EAAE,MAAM,gBAAgB,OAAO,qBAAqB,MAAM,YAAY,CAAC;AAAA,MAClG,aAAa;AAAA,QACX,YAAY,CAAC,cAAc,gBAAgB,OAAO,sBAAsB,UAAU,YAAY;AAAA,MAChG;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,aAAa,OAAO,oBAAoB,OAAO,eAAe;AAChF,mBAAW,OAAO,UAAU,OAAO,MAAM;AACzC,mBAAW,OAAO,aAAa,OAAO,gBAAgB,OAAO,WAAW;AACxE,mBAAW,OAAO,UAAU,OAAO,aAAa,OAAO,QAAQ;AAC/D,mBAAW,OAAO,eAAe,OAAO,eAAe,OAAO,UAAU;AACxE,mBAAW,OAAO,SAAS,OAAO,KAAK;AACvC,eAAO,iBAAiB,KAAK,kBAAkB,GAAG,MAAM,GAAG,KAAK;AAAA,MAClE;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,kBAAkB,GAAG,IAAI,MAAM;AAAA,MACxC;AAAA,MACA,YAAY,OAAO,QAAQ;AACzB,cAAM,KAAK,WAAW,IAAI,OAAO,EAAE;AACnC,YAAI,GAAI,QAAO,GAAG,YAAY,SAAS,EAAE;AACzC,eAAO;AAAA,MACT;AAAA,MACA,aAAa;AAAA,QACX,YAAY,CAAC,oBAAoB,UAAU,gBAAgB,aAAa,OAAO;AAAA,MACjF;AAAA,IACF;AAAA,IACA;AAAA,MACE,UAAU,EAAE,IAAI;AAAA,MAChB,aAAa,CAAC,UAAU;AAAA,MACxB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa,OAAO,QAAQ;AAC1B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,cAAM,SAAS,IAAI;AACnB,cAAM,QAAkB,CAAC;AACzB,mBAAW,OAAO,UAAU,OAAO,MAAM;AACzC,mBAAW,OAAO,aAAa,OAAO,gBAAgB,OAAO,WAAW;AACxE,mBAAW,OAAO,UAAU,OAAO,sBAAsB,OAAO,gBAAgB;AAChF,mBAAW,OAAO,UAAU,OAAO,sBAAsB,OAAO,gBAAgB;AAChF,mBAAW,OAAO,WAAW,OAAO,sBAAsB,OAAO,gBAAgB;AACjF,mBAAW,OAAO,eAAe,OAAO,eAAe,OAAO,UAAU;AACxE,mBAAW,OAAO,YAAY,OAAO,QAAQ;AAC7C,eAAO,iBAAiB,KAAK,sBAAsB,GAAG,MAAM,GAAG,KAAK;AAAA,MACtE;AAAA,MACA,cAAc,OAAO,QAAQ;AAC3B,cAAM,EAAE,EAAE,IAAI,MAAM,oBAAoB;AACxC,eAAO,sBAAsB,GAAG,IAAI,MAAM;AAAA,MAC5C;AAAA,MACA,YAAY,YAAY,GAAG,YAAY;AAAA,MACvC,aAAa;AAAA,QACX,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,iBAAQ;AACR,MAAM,SAAS;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { reevaluateReservationsAfterStockIncrease } from "../lib/salesOrderInventoryAutomation.js";
|
|
2
|
+
const metadata = {
|
|
3
|
+
event: "wms.asn.line_received",
|
|
4
|
+
persistent: true,
|
|
5
|
+
id: "wms:asn-line-received-reevaluate-reservations"
|
|
6
|
+
};
|
|
7
|
+
async function handle(payload, ctx) {
|
|
8
|
+
await reevaluateReservationsAfterStockIncrease(payload, ctx);
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
handle as default,
|
|
12
|
+
metadata
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=asn-line-received-reevaluate-reservations.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/subscribers/asn-line-received-reevaluate-reservations.ts"],
|
|
4
|
+
"sourcesContent": ["import { reevaluateReservationsAfterStockIncrease } from '../lib/salesOrderInventoryAutomation'\n\nexport const metadata = {\n event: 'wms.asn.line_received',\n persistent: true,\n id: 'wms:asn-line-received-reevaluate-reservations',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\ntype AsnLineReceivedPayload = {\n catalogVariantId?: string | null\n tenantId?: string | null\n organizationId?: string | null\n}\n\nexport default async function handle(payload: AsnLineReceivedPayload, ctx: SubscriberContext) {\n await reevaluateReservationsAfterStockIncrease(payload, ctx)\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gDAAgD;AAElD,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAYA,eAAO,OAA8B,SAAiC,KAAwB;AAC5F,QAAM,yCAAyC,SAAS,GAAG;AAC7D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createInventoryEnricherCacheHandler } from "../lib/inventoryEnricherCacheSubscriber.js";
|
|
2
|
+
const metadata = {
|
|
3
|
+
event: "wms.asn.*",
|
|
4
|
+
persistent: false,
|
|
5
|
+
id: "wms:invalidate-enricher-cache-asn"
|
|
6
|
+
};
|
|
7
|
+
var invalidate_enricher_cache_asn_default = createInventoryEnricherCacheHandler("inventory");
|
|
8
|
+
export {
|
|
9
|
+
invalidate_enricher_cache_asn_default as default,
|
|
10
|
+
metadata
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=invalidate-enricher-cache-asn.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/subscribers/invalidate-enricher-cache-asn.ts"],
|
|
4
|
+
"sourcesContent": ["import { createInventoryEnricherCacheHandler } from '../lib/inventoryEnricherCacheSubscriber'\n\n// Sales-order enricher `inboundSummary` aggregates open ASN rows (`draft` /\n// `in_transit`). ASN lifecycle writes change that projection without always\n// touching balances, so they need their own invalidation family.\nexport const metadata = {\n event: 'wms.asn.*',\n persistent: false,\n id: 'wms:invalidate-enricher-cache-asn',\n}\n\nexport default createInventoryEnricherCacheHandler('inventory')\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,2CAA2C;AAK7C,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAEA,IAAO,wCAAQ,oCAAoC,WAAW;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
2
|
+
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
3
|
+
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
4
|
+
import { getTelemetryRuntime } from "@open-mercato/shared/lib/telemetry/runtime";
|
|
5
|
+
import { Asn } from "../data/entities.js";
|
|
6
|
+
import { resolveWmsIntegrationToggleEnabled } from "../lib/wmsIntegrationToggles.js";
|
|
7
|
+
const logger = createLogger("wms");
|
|
8
|
+
const metadata = {
|
|
9
|
+
event: "procurement.goods_receipt.created",
|
|
10
|
+
persistent: true,
|
|
11
|
+
id: "wms:procurement-goods-receipt-created"
|
|
12
|
+
};
|
|
13
|
+
function buildProcurementGoodsReceiptSourceKey(goodsReceiptId) {
|
|
14
|
+
return `procurement.goods_receipt:${goodsReceiptId}`;
|
|
15
|
+
}
|
|
16
|
+
function tryResolve(ctx, name) {
|
|
17
|
+
try {
|
|
18
|
+
return ctx.resolve(name);
|
|
19
|
+
} catch {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function asUuid(value) {
|
|
24
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
25
|
+
}
|
|
26
|
+
function toPositiveQuantity(value) {
|
|
27
|
+
const numeric = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
|
|
28
|
+
if (!Number.isFinite(numeric) || numeric <= 0) return null;
|
|
29
|
+
return numeric;
|
|
30
|
+
}
|
|
31
|
+
function isUniqueConstraintError(error) {
|
|
32
|
+
if (!error || typeof error !== "object") return false;
|
|
33
|
+
const code = error.code;
|
|
34
|
+
if (code === "23505") return true;
|
|
35
|
+
const name = error.name;
|
|
36
|
+
if (name === "UniqueConstraintViolationException") return true;
|
|
37
|
+
const cause = error.cause;
|
|
38
|
+
if (cause && cause !== error) return isUniqueConstraintError(cause);
|
|
39
|
+
const driverError = error.driverError;
|
|
40
|
+
if (driverError && driverError !== error) return isUniqueConstraintError(driverError);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
async function findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey) {
|
|
44
|
+
const bySourceKey = await findOneWithDecryption(
|
|
45
|
+
em,
|
|
46
|
+
Asn,
|
|
47
|
+
{
|
|
48
|
+
organizationId: scope.organizationId,
|
|
49
|
+
tenantId: scope.tenantId,
|
|
50
|
+
sourceKey,
|
|
51
|
+
deletedAt: null
|
|
52
|
+
},
|
|
53
|
+
void 0,
|
|
54
|
+
scope
|
|
55
|
+
);
|
|
56
|
+
if (bySourceKey) return bySourceKey;
|
|
57
|
+
return findOneWithDecryption(
|
|
58
|
+
em,
|
|
59
|
+
Asn,
|
|
60
|
+
{
|
|
61
|
+
organizationId: scope.organizationId,
|
|
62
|
+
tenantId: scope.tenantId,
|
|
63
|
+
referenceNumber: goodsReceiptId,
|
|
64
|
+
deletedAt: null
|
|
65
|
+
},
|
|
66
|
+
void 0,
|
|
67
|
+
scope
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
async function handle(payload, ctx) {
|
|
71
|
+
const tenantId = asUuid(payload.tenantId);
|
|
72
|
+
const organizationId = asUuid(payload.organizationId);
|
|
73
|
+
if (!tenantId || !organizationId) return;
|
|
74
|
+
const featureTogglesService = tryResolve(ctx, "featureTogglesService");
|
|
75
|
+
const emRoot = tryResolve(ctx, "em");
|
|
76
|
+
const commandBus = tryResolve(ctx, "commandBus");
|
|
77
|
+
if (!featureTogglesService || !emRoot || !commandBus) return;
|
|
78
|
+
const enabled = await resolveWmsIntegrationToggleEnabled(
|
|
79
|
+
featureTogglesService,
|
|
80
|
+
emRoot,
|
|
81
|
+
"wms_integration_procurement_goods_receipt",
|
|
82
|
+
tenantId
|
|
83
|
+
);
|
|
84
|
+
if (!enabled) return;
|
|
85
|
+
const warehouseId = asUuid(payload.warehouseId);
|
|
86
|
+
if (!warehouseId) {
|
|
87
|
+
logger.debug("procurement goods receipt skipped: missing warehouseId", {
|
|
88
|
+
goodsReceiptId: payload.id ?? payload.goodsReceiptId ?? null
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const goodsReceiptId = asUuid(payload.goodsReceiptId) ?? asUuid(payload.id);
|
|
93
|
+
if (!goodsReceiptId) {
|
|
94
|
+
logger.debug("procurement goods receipt skipped: missing goodsReceiptId");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const sourceKey = buildProcurementGoodsReceiptSourceKey(goodsReceiptId);
|
|
98
|
+
const referenceNumber = (typeof payload.referenceNumber === "string" && payload.referenceNumber.trim().length > 0 ? payload.referenceNumber.trim() : null) ?? goodsReceiptId;
|
|
99
|
+
const em = emRoot.fork();
|
|
100
|
+
const scope = { organizationId, tenantId };
|
|
101
|
+
const existing = await findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey);
|
|
102
|
+
if (existing) return;
|
|
103
|
+
const expectedAt = payload.expectedAt instanceof Date ? payload.expectedAt : typeof payload.expectedAt === "string" && payload.expectedAt.trim().length > 0 ? new Date(payload.expectedAt) : /* @__PURE__ */ new Date();
|
|
104
|
+
const lines = (payload.lines ?? []).map((line) => {
|
|
105
|
+
const catalogVariantId = asUuid(line.catalogVariantId);
|
|
106
|
+
const expectedQty = toPositiveQuantity(line.expectedQty);
|
|
107
|
+
if (!catalogVariantId || expectedQty == null) return null;
|
|
108
|
+
return {
|
|
109
|
+
catalogVariantId,
|
|
110
|
+
expectedQty,
|
|
111
|
+
lotNumber: typeof line.lotNumber === "string" && line.lotNumber.trim().length > 0 ? line.lotNumber.trim() : null
|
|
112
|
+
};
|
|
113
|
+
}).filter((line) => line !== null);
|
|
114
|
+
const commandCtx = {
|
|
115
|
+
container: { resolve: ctx.resolve },
|
|
116
|
+
auth: null,
|
|
117
|
+
organizationScope: null,
|
|
118
|
+
selectedOrganizationId: organizationId,
|
|
119
|
+
organizationIds: [organizationId]
|
|
120
|
+
};
|
|
121
|
+
const { translate } = await resolveTranslations();
|
|
122
|
+
const notes = translate(
|
|
123
|
+
"wms.subscribers.procurementGoodsReceipt.asnNotes",
|
|
124
|
+
"Created from procurement goods receipt {goodsReceiptId}",
|
|
125
|
+
{ goodsReceiptId }
|
|
126
|
+
);
|
|
127
|
+
try {
|
|
128
|
+
await commandBus.execute("wms.asns.create", {
|
|
129
|
+
input: {
|
|
130
|
+
organizationId,
|
|
131
|
+
tenantId,
|
|
132
|
+
warehouseId,
|
|
133
|
+
vendorId: asUuid(payload.vendorId),
|
|
134
|
+
status: "draft",
|
|
135
|
+
expectedAt,
|
|
136
|
+
referenceNumber,
|
|
137
|
+
sourceKey,
|
|
138
|
+
notes,
|
|
139
|
+
lines,
|
|
140
|
+
metadata: {
|
|
141
|
+
source: "procurement.goods_receipt.created",
|
|
142
|
+
goodsReceiptId
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
ctx: commandCtx
|
|
146
|
+
});
|
|
147
|
+
} catch (err) {
|
|
148
|
+
if (isUniqueConstraintError(err)) return;
|
|
149
|
+
logger.error("procurement goods receipt ASN create failed", { err, goodsReceiptId });
|
|
150
|
+
getTelemetryRuntime()?.reportError(err, {
|
|
151
|
+
module: "wms",
|
|
152
|
+
code: "wms.procurement_goods_receipt_asn_create_failed",
|
|
153
|
+
attributes: { goodsReceiptId }
|
|
154
|
+
});
|
|
155
|
+
throw err;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
buildProcurementGoodsReceiptSourceKey,
|
|
160
|
+
handle as default,
|
|
161
|
+
metadata
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=procurement-goods-receipt-created.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/subscribers/procurement-goods-receipt-created.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { CommandBus, CommandRuntimeContext } from '@open-mercato/shared/lib/commands'\nimport type { FeatureTogglesService } from '@open-mercato/core/modules/feature_toggles/lib/feature-flag-check'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { getTelemetryRuntime } from '@open-mercato/shared/lib/telemetry/runtime'\nimport { Asn } from '../data/entities'\nimport { resolveWmsIntegrationToggleEnabled } from '../lib/wmsIntegrationToggles'\n\nconst logger = createLogger('wms')\n\nexport const metadata = {\n event: 'procurement.goods_receipt.created',\n persistent: true,\n id: 'wms:procurement-goods-receipt-created',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\n/**\n * Assumed procurement.goods_receipt.created payload (procurement module is\n * optional / thin today). Fields beyond id + scope are best-effort:\n *\n * - id / goodsReceiptId: required for idempotent create via Asn.sourceKey\n * - warehouseId (required to create): destination warehouse UUID\n * - vendorId?: customers UUID\n * - expectedAt?: ISO date (defaults to now)\n * - referenceNumber?: external PO/GRN display reference (falls back to goods receipt id;\n * not used as the uniqueness key \u2014 free-form refs may legitimately collide)\n * - tenantId / organizationId: required scope\n * - lines?: [{ catalogVariantId, expectedQty, lotNumber? }]\n *\n * When the toggle is off, required fields are missing, or peers are absent,\n * this subscriber no-ops.\n */\ntype GoodsReceiptCreatedPayload = {\n id?: string | null\n goodsReceiptId?: string | null\n warehouseId?: string | null\n vendorId?: string | null\n expectedAt?: string | Date | null\n referenceNumber?: string | null\n tenantId?: string | null\n organizationId?: string | null\n lines?: Array<{\n catalogVariantId?: string | null\n expectedQty?: string | number | null\n lotNumber?: string | null\n }> | null\n}\n\nexport function buildProcurementGoodsReceiptSourceKey(goodsReceiptId: string): string {\n return `procurement.goods_receipt:${goodsReceiptId}`\n}\n\nfunction tryResolve<T>(ctx: SubscriberContext, name: string): T | undefined {\n try {\n return ctx.resolve<T>(name)\n } catch {\n return undefined\n }\n}\n\nfunction asUuid(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction toPositiveQuantity(value: unknown): number | null {\n const numeric = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN\n if (!Number.isFinite(numeric) || numeric <= 0) return null\n return numeric\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 if (name === 'UniqueConstraintViolationException') return true\n const cause = (error as { cause?: unknown }).cause\n if (cause && cause !== error) return isUniqueConstraintError(cause)\n const driverError = (error as { driverError?: unknown }).driverError\n if (driverError && driverError !== error) return isUniqueConstraintError(driverError)\n return false\n}\n\nasync function findExistingAsnForGoodsReceipt(\n em: EntityManager,\n scope: { organizationId: string; tenantId: string },\n goodsReceiptId: string,\n sourceKey: string,\n): Promise<Asn | null> {\n const bySourceKey = await findOneWithDecryption(\n em,\n Asn,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n sourceKey,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n if (bySourceKey) return bySourceKey\n\n // Legacy Story-4 ASNs keyed only by referenceNumber = goodsReceiptId (no source_key).\n return findOneWithDecryption(\n em,\n Asn,\n {\n organizationId: scope.organizationId,\n tenantId: scope.tenantId,\n referenceNumber: goodsReceiptId,\n deletedAt: null,\n },\n undefined,\n scope,\n )\n}\n\nexport default async function handle(payload: GoodsReceiptCreatedPayload, ctx: SubscriberContext) {\n const tenantId = asUuid(payload.tenantId)\n const organizationId = asUuid(payload.organizationId)\n if (!tenantId || !organizationId) return\n\n const featureTogglesService = tryResolve<FeatureTogglesService>(ctx, 'featureTogglesService')\n const emRoot = tryResolve<EntityManager>(ctx, 'em')\n const commandBus = tryResolve<CommandBus>(ctx, 'commandBus')\n if (!featureTogglesService || !emRoot || !commandBus) return\n\n const enabled = await resolveWmsIntegrationToggleEnabled(\n featureTogglesService,\n emRoot,\n 'wms_integration_procurement_goods_receipt',\n tenantId,\n )\n if (!enabled) return\n\n const warehouseId = asUuid(payload.warehouseId)\n if (!warehouseId) {\n logger.debug('procurement goods receipt skipped: missing warehouseId', {\n goodsReceiptId: payload.id ?? payload.goodsReceiptId ?? null,\n })\n return\n }\n\n const goodsReceiptId = asUuid(payload.goodsReceiptId) ?? asUuid(payload.id)\n if (!goodsReceiptId) {\n logger.debug('procurement goods receipt skipped: missing goodsReceiptId')\n return\n }\n\n const sourceKey = buildProcurementGoodsReceiptSourceKey(goodsReceiptId)\n const referenceNumber =\n (typeof payload.referenceNumber === 'string' && payload.referenceNumber.trim().length > 0\n ? payload.referenceNumber.trim()\n : null) ?? goodsReceiptId\n\n const em = emRoot.fork()\n const scope = { organizationId, tenantId }\n // Match by sourceKey (any status) so retries never create a second ASN.\n const existing = await findExistingAsnForGoodsReceipt(em, scope, goodsReceiptId, sourceKey)\n if (existing) return\n\n const expectedAt =\n payload.expectedAt instanceof Date\n ? payload.expectedAt\n : typeof payload.expectedAt === 'string' && payload.expectedAt.trim().length > 0\n ? new Date(payload.expectedAt)\n : new Date()\n\n const lines = (payload.lines ?? [])\n .map((line) => {\n const catalogVariantId = asUuid(line.catalogVariantId)\n const expectedQty = toPositiveQuantity(line.expectedQty)\n if (!catalogVariantId || expectedQty == null) return null\n return {\n catalogVariantId,\n expectedQty,\n lotNumber:\n typeof line.lotNumber === 'string' && line.lotNumber.trim().length > 0\n ? line.lotNumber.trim()\n : null,\n }\n })\n .filter((line): line is NonNullable<typeof line> => line !== null)\n\n const commandCtx: CommandRuntimeContext = {\n container: { resolve: ctx.resolve } as CommandRuntimeContext['container'],\n auth: null,\n organizationScope: null,\n selectedOrganizationId: organizationId,\n organizationIds: [organizationId],\n }\n\n const { translate } = await resolveTranslations()\n const notes = translate(\n 'wms.subscribers.procurementGoodsReceipt.asnNotes',\n 'Created from procurement goods receipt {goodsReceiptId}',\n { goodsReceiptId },\n )\n\n try {\n await commandBus.execute('wms.asns.create', {\n input: {\n organizationId,\n tenantId,\n warehouseId,\n vendorId: asUuid(payload.vendorId),\n status: 'draft',\n expectedAt,\n referenceNumber,\n sourceKey,\n notes,\n lines,\n metadata: {\n source: 'procurement.goods_receipt.created',\n goodsReceiptId,\n },\n },\n ctx: commandCtx,\n })\n } catch (err) {\n // Concurrent duplicate events: unique (organization_id, source_key) wins; loser is idempotent.\n if (isUniqueConstraintError(err)) return\n logger.error('procurement goods receipt ASN create failed', { err, goodsReceiptId })\n getTelemetryRuntime()?.reportError(err, {\n module: 'wms',\n code: 'wms.procurement_goods_receipt_asn_create_failed',\n attributes: { goodsReceiptId },\n })\n throw err\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { reevaluateReservationsAfterStockIncrease } from "../lib/salesOrderInventoryAutomation.js";
|
|
2
|
+
const metadata = {
|
|
3
|
+
event: "wms.putaway.completed",
|
|
4
|
+
persistent: true,
|
|
5
|
+
id: "wms:putaway-completed-reevaluate-reservations"
|
|
6
|
+
};
|
|
7
|
+
async function handle(payload, ctx) {
|
|
8
|
+
await reevaluateReservationsAfterStockIncrease(payload, ctx);
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
handle as default,
|
|
12
|
+
metadata
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=putaway-completed-reevaluate-reservations.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/subscribers/putaway-completed-reevaluate-reservations.ts"],
|
|
4
|
+
"sourcesContent": ["import { reevaluateReservationsAfterStockIncrease } from '../lib/salesOrderInventoryAutomation'\n\nexport const metadata = {\n event: 'wms.putaway.completed',\n persistent: true,\n id: 'wms:putaway-completed-reevaluate-reservations',\n}\n\ntype SubscriberContext = {\n resolve: <T = unknown>(name: string) => T\n}\n\ntype PutawayCompletedPayload = {\n catalogVariantId?: string | null\n tenantId?: string | null\n organizationId?: string | null\n}\n\nexport default async function handle(payload: PutawayCompletedPayload, ctx: SubscriberContext) {\n await reevaluateReservationsAfterStockIncrease(payload, ctx)\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gDAAgD;AAElD,MAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,IAAI;AACN;AAYA,eAAO,OAA8B,SAAkC,KAAwB;AAC7F,QAAM,yCAAyC,SAAS,GAAG;AAC7D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -74,6 +74,37 @@ function SalesOrderStockContextWidget(props) {
|
|
|
74
74
|
() => Array.isArray(wms?.stockSummary) ? wms.stockSummary : [],
|
|
75
75
|
[wms?.stockSummary]
|
|
76
76
|
);
|
|
77
|
+
const activeReservations = React.useMemo(() => {
|
|
78
|
+
const enriched = Array.isArray(wms?.reservationSummary?.reservations) ? wms.reservationSummary?.reservations ?? [] : [];
|
|
79
|
+
const fromEnriched = enriched.map((item) => {
|
|
80
|
+
const id = typeof item?.id === "string" ? item.id : null;
|
|
81
|
+
if (!id) return null;
|
|
82
|
+
const reservationLabel = typeof item.reservationLabel === "string" && item.reservationLabel.trim().length > 0 ? item.reservationLabel.trim() : id;
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
reservationLabel,
|
|
86
|
+
warehouse_name: item.warehouseName ?? null,
|
|
87
|
+
variant_name: item.variantName ?? null,
|
|
88
|
+
variant_sku: item.variantSku ?? null,
|
|
89
|
+
quantity: item.quantity ?? null
|
|
90
|
+
};
|
|
91
|
+
}).filter((item) => item !== null);
|
|
92
|
+
if (fromEnriched.length > 0) return fromEnriched;
|
|
93
|
+
const ids = Array.isArray(wms?.reservationSummary?.reservationIds) ? wms.reservationSummary?.reservationIds ?? [] : [];
|
|
94
|
+
return ids.filter((id) => typeof id === "string" && id.length > 0).map((id) => ({
|
|
95
|
+
id,
|
|
96
|
+
reservationLabel: id,
|
|
97
|
+
warehouse_name: null,
|
|
98
|
+
variant_name: null,
|
|
99
|
+
variant_sku: null,
|
|
100
|
+
quantity: null
|
|
101
|
+
}));
|
|
102
|
+
}, [wms?.reservationSummary?.reservationIds, wms?.reservationSummary?.reservations]);
|
|
103
|
+
const releaseReservation = React.useMemo(() => {
|
|
104
|
+
if (!releaseReservationId) return null;
|
|
105
|
+
const match = activeReservations.find((item) => item.id === releaseReservationId);
|
|
106
|
+
return match ?? { id: releaseReservationId };
|
|
107
|
+
}, [activeReservations, releaseReservationId]);
|
|
77
108
|
React.useEffect(() => {
|
|
78
109
|
const variantIds = stockSummary.map((item) => item.catalogVariantId).filter((id) => !!id);
|
|
79
110
|
if (variantIds.length === 0) return;
|
|
@@ -201,8 +232,6 @@ function SalesOrderStockContextWidget(props) {
|
|
|
201
232
|
}, [orderId, organizationId, router, t, tenantId]);
|
|
202
233
|
if (!wms) return null;
|
|
203
234
|
const reservationStatus = wms.reservationSummary?.status ?? "unreserved";
|
|
204
|
-
const reservationIds = Array.isArray(wms.reservationSummary?.reservationIds) ? wms.reservationSummary?.reservationIds ?? [] : [];
|
|
205
|
-
const releaseReservation = releaseReservationId ? { id: releaseReservationId } : null;
|
|
206
235
|
return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border bg-card px-4 py-3 space-y-4", children: [
|
|
207
236
|
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
208
237
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
@@ -269,7 +298,7 @@ function SalesOrderStockContextWidget(props) {
|
|
|
269
298
|
"wms.widgets.sales.stockContext.reservationCount",
|
|
270
299
|
"Reservation records"
|
|
271
300
|
) }),
|
|
272
|
-
/* @__PURE__ */ jsx("dd", { className: "font-medium", children:
|
|
301
|
+
/* @__PURE__ */ jsx("dd", { className: "font-medium", children: activeReservations.length })
|
|
273
302
|
] })
|
|
274
303
|
] }),
|
|
275
304
|
stockSummary.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
@@ -313,17 +342,17 @@ function SalesOrderStockContextWidget(props) {
|
|
|
313
342
|
"wms.widgets.sales.stockContext.empty",
|
|
314
343
|
"No WMS stock summary is available for this order yet."
|
|
315
344
|
) }),
|
|
316
|
-
access.canRelease &&
|
|
345
|
+
access.canRelease && activeReservations.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
317
346
|
/* @__PURE__ */ jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: t(
|
|
318
347
|
"wms.widgets.sales.stockContext.reservationsTitle",
|
|
319
348
|
"Active reservations"
|
|
320
349
|
) }),
|
|
321
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-1", children:
|
|
350
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: activeReservations.map((reservation) => /* @__PURE__ */ jsxs(
|
|
322
351
|
"div",
|
|
323
352
|
{
|
|
324
353
|
className: "flex items-center justify-between gap-2 rounded-md border border-border/70 bg-background px-3 py-1.5",
|
|
325
354
|
children: [
|
|
326
|
-
/* @__PURE__ */ jsx("span", { className: "
|
|
355
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-foreground truncate", title: reservation.reservationLabel, children: reservation.reservationLabel }),
|
|
327
356
|
/* @__PURE__ */ jsxs(
|
|
328
357
|
Button,
|
|
329
358
|
{
|
|
@@ -331,7 +360,7 @@ function SalesOrderStockContextWidget(props) {
|
|
|
331
360
|
variant: "ghost",
|
|
332
361
|
size: "sm",
|
|
333
362
|
className: "h-6 shrink-0 px-2 text-xs text-status-error-fg hover:text-status-error-fg",
|
|
334
|
-
onClick: () => setReleaseReservationId(
|
|
363
|
+
onClick: () => setReleaseReservationId(reservation.id),
|
|
335
364
|
children: [
|
|
336
365
|
/* @__PURE__ */ jsx(ShieldOff, { className: "size-3 mr-1" }),
|
|
337
366
|
t("wms.widgets.sales.stockContext.releaseBtn", "Release")
|
|
@@ -340,7 +369,7 @@ function SalesOrderStockContextWidget(props) {
|
|
|
340
369
|
)
|
|
341
370
|
]
|
|
342
371
|
},
|
|
343
|
-
|
|
372
|
+
reservation.id
|
|
344
373
|
)) })
|
|
345
374
|
] }) : null,
|
|
346
375
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-2", children: [
|