@open-mercato/core 0.6.8-develop.7095.1.465fbf8f80 → 0.6.8-develop.7099.1.7ba2771d06
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 +1 -1
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +59 -5
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +4 -0
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +29 -103
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/package.json +7 -7
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/commands/configuration.ts +73 -7
- package/src/modules/wms/commands/shared.ts +9 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +31 -139
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
2
|
+
import { locales } from "@open-mercato/shared/lib/i18n/config";
|
|
3
|
+
import { matchCountryCodes } from "@open-mercato/shared/lib/location/countries";
|
|
4
|
+
function buildWarehouseListSearchOr(term) {
|
|
5
|
+
const like = `%${escapeLikePattern(term)}%`;
|
|
6
|
+
const orFilters = [
|
|
7
|
+
{ name: { $ilike: like } },
|
|
8
|
+
{ code: { $ilike: like } },
|
|
9
|
+
{ city: { $ilike: like } },
|
|
10
|
+
{ country: { $ilike: like } }
|
|
11
|
+
];
|
|
12
|
+
const matchedCountryCodes = matchCountryCodes(term, { locales });
|
|
13
|
+
if (matchedCountryCodes.length > 0) {
|
|
14
|
+
orFilters.push({ country: { $in: matchedCountryCodes } });
|
|
15
|
+
}
|
|
16
|
+
return orFilters;
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
buildWarehouseListSearchOr
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=warehouseSearch.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/modules/wms/api/warehouseSearch.ts"],
|
|
4
|
+
"sourcesContent": ["import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'\nimport { locales } from '@open-mercato/shared/lib/i18n/config'\nimport { matchCountryCodes } from '@open-mercato/shared/lib/location/countries'\n\n/**\n * Warehouse list search matches name/code/city plus both stored country values:\n * ISO codes (`PL`) and legacy free-text (`Poland`). Localized labels shown in\n * the table (`Poland` / `Polska`) must resolve back to the stored ISO code.\n */\nexport function buildWarehouseListSearchOr(term: string): Array<Record<string, unknown>> {\n const like = `%${escapeLikePattern(term)}%`\n const orFilters: Array<Record<string, unknown>> = [\n { name: { $ilike: like } },\n { code: { $ilike: like } },\n { city: { $ilike: like } },\n { country: { $ilike: like } },\n ]\n const matchedCountryCodes = matchCountryCodes(term, { locales })\n if (matchedCountryCodes.length > 0) {\n orFilters.push({ country: { $in: matchedCountryCodes } })\n }\n return orFilters\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,yBAAyB;AAClC,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAO3B,SAAS,2BAA2B,MAA8C;AACvF,QAAM,OAAO,IAAI,kBAAkB,IAAI,CAAC;AACxC,QAAM,YAA4C;AAAA,IAChD,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE;AAAA,IACzB,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE;AAAA,IACzB,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE;AAAA,IACzB,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE;AAAA,EAC9B;AACA,QAAM,sBAAsB,kBAAkB,MAAM,EAAE,QAAQ,CAAC;AAC/D,MAAI,oBAAoB,SAAS,GAAG;AAClC,cAAU,KAAK,EAAE,SAAS,EAAE,KAAK,oBAAoB,EAAE,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,9 +2,9 @@ import { z } from "zod";
|
|
|
2
2
|
import { makeCrudRoute } from "@open-mercato/shared/lib/crud/factory";
|
|
3
3
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
4
4
|
import { parseScopedCommandInput, resolveCrudRecordId } from "@open-mercato/shared/lib/api/scoped";
|
|
5
|
-
import { escapeLikePattern } from "@open-mercato/shared/lib/db/escapeLikePattern";
|
|
6
5
|
import { parseBooleanToken } from "@open-mercato/shared/lib/boolean";
|
|
7
6
|
import { E } from "../../../../generated/entities.ids.generated.js";
|
|
7
|
+
import { buildWarehouseListSearchOr } from "../warehouseSearch.js";
|
|
8
8
|
import { Warehouse } from "../../data/entities.js";
|
|
9
9
|
import { warehouseCreateSchema, warehouseUpdateSchema } from "../../data/validators.js";
|
|
10
10
|
import { createPagedListResponseSchema, createWmsCrudOpenApi, defaultOkResponseSchema } from "../openapi.js";
|
|
@@ -71,6 +71,9 @@ const crud = makeCrudRoute({
|
|
|
71
71
|
F.created_at,
|
|
72
72
|
F.updated_at
|
|
73
73
|
],
|
|
74
|
+
decorateCustomFields: {
|
|
75
|
+
entityIds: E.wms.warehouse
|
|
76
|
+
},
|
|
74
77
|
sortFieldMap: {
|
|
75
78
|
name: F.name,
|
|
76
79
|
code: F.code,
|
|
@@ -88,13 +91,7 @@ const crud = makeCrudRoute({
|
|
|
88
91
|
if (isActive !== null) filters[F.is_active] = { $eq: isActive };
|
|
89
92
|
const term = query.search?.trim();
|
|
90
93
|
if (term) {
|
|
91
|
-
|
|
92
|
-
filters.$or = [
|
|
93
|
-
{ [F.name]: { $ilike: like } },
|
|
94
|
-
{ [F.code]: { $ilike: like } },
|
|
95
|
-
{ [F.city]: { $ilike: like } },
|
|
96
|
-
{ [F.country]: { $ilike: like } }
|
|
97
|
-
];
|
|
94
|
+
filters.$or = buildWarehouseListSearchOr(term);
|
|
98
95
|
}
|
|
99
96
|
return filters;
|
|
100
97
|
}
|
|
@@ -107,7 +104,10 @@ const crud = makeCrudRoute({
|
|
|
107
104
|
const { translate } = await resolveTranslations();
|
|
108
105
|
return parseScopedCommandInput(warehouseCreateSchema, raw ?? {}, ctx, translate);
|
|
109
106
|
},
|
|
110
|
-
response: ({ result }) => ({
|
|
107
|
+
response: ({ result }) => ({
|
|
108
|
+
id: result?.warehouseId ?? null,
|
|
109
|
+
updatedAt: result?.updatedAt ?? null
|
|
110
|
+
}),
|
|
111
111
|
status: 201
|
|
112
112
|
},
|
|
113
113
|
update: {
|
|
@@ -157,6 +157,10 @@ const openApi = createWmsCrudOpenApi({
|
|
|
157
157
|
listResponseSchema: createPagedListResponseSchema(warehouseListItemSchema),
|
|
158
158
|
create: {
|
|
159
159
|
schema: warehouseCreateSchema,
|
|
160
|
+
responseSchema: z.object({
|
|
161
|
+
id: z.string().uuid().nullable(),
|
|
162
|
+
updatedAt: z.string().nullable()
|
|
163
|
+
}),
|
|
160
164
|
description: "Creates a warehouse for inventory operations."
|
|
161
165
|
},
|
|
162
166
|
update: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/wms/api/warehouses/route.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { parseScopedCommandInput, resolveCrudRecordId } from '@open-mercato/shared/lib/api/scoped'\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,qBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,yBAAyB,2BAA2B;AAC7D,SAAS,yBAAyB;AAClC,SAAS,
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport { makeCrudRoute } from '@open-mercato/shared/lib/crud/factory'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { parseScopedCommandInput, resolveCrudRecordId } from '@open-mercato/shared/lib/api/scoped'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { E } from '#generated/entities.ids.generated'\nimport { buildWarehouseListSearchOr } from '../warehouseSearch'\nimport { Warehouse } from '../../data/entities'\nimport { warehouseCreateSchema, warehouseUpdateSchema } from '../../data/validators'\nimport { createPagedListResponseSchema, createWmsCrudOpenApi, defaultOkResponseSchema } from '../openapi'\n\nconst F = {\n id: 'id',\n organization_id: 'organization_id',\n tenant_id: 'tenant_id',\n name: 'name',\n code: 'code',\n is_active: 'is_active',\n is_primary: 'is_primary',\n address_line1: 'address_line1',\n city: 'city',\n postal_code: 'postal_code',\n country: 'country',\n timezone: 'timezone',\n created_at: 'created_at',\n updated_at: 'updated_at',\n} as const\n\nconst routeMetadata = {\n GET: { requireAuth: true, requireFeatures: ['wms.view'] },\n POST: { requireAuth: true, requireFeatures: ['wms.manage_warehouses'] },\n PUT: { requireAuth: true, requireFeatures: ['wms.manage_warehouses'] },\n DELETE: { requireAuth: true, requireFeatures: ['wms.manage_warehouses'] },\n}\n\nexport const metadata = routeMetadata\n\nconst rawBodySchema = z.object({}).passthrough()\n\nconst listSchema = z.object({\n page: z.coerce.number().min(1).default(1),\n pageSize: z.coerce.number().min(1).max(100).default(25),\n search: z.string().optional(),\n ids: z.string().optional(),\n isActive: z.string().optional(),\n sortField: z.string().optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n}).passthrough()\n\nconst crud = makeCrudRoute({\n metadata: routeMetadata,\n orm: {\n entity: Warehouse,\n idField: 'id',\n orgField: 'organizationId',\n tenantField: 'tenantId',\n softDeleteField: 'deletedAt',\n },\n indexer: { entityType: E.wms.warehouse },\n list: {\n schema: listSchema,\n disableListCache: true,\n entityId: E.wms.warehouse,\n fields: [\n F.id,\n F.organization_id,\n F.tenant_id,\n F.name,\n F.code,\n F.is_active,\n F.is_primary,\n F.address_line1,\n F.city,\n F.postal_code,\n F.country,\n F.timezone,\n F.created_at,\n F.updated_at,\n ],\n decorateCustomFields: {\n entityIds: E.wms.warehouse,\n },\n sortFieldMap: {\n name: F.name,\n code: F.code,\n createdAt: F.created_at,\n updatedAt: F.updated_at,\n },\n buildFilters: async (query) => {\n const filters: Record<string, unknown> = {}\n if (typeof query.ids === 'string' && query.ids.trim().length > 0) {\n filters[F.id] = {\n $in: query.ids.split(',').map((value) => value.trim()).filter((value) => value.length > 0),\n }\n }\n const isActive = parseBooleanToken(query.isActive)\n if (isActive !== null) filters[F.is_active] = { $eq: isActive }\n const term = query.search?.trim()\n if (term) {\n filters.$or = buildWarehouseListSearchOr(term)\n }\n return filters\n },\n },\n actions: {\n create: {\n commandId: 'wms.warehouses.create',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(warehouseCreateSchema, raw ?? {}, ctx, translate)\n },\n response: ({ result }) => ({\n id: result?.warehouseId ?? null,\n updatedAt: result?.updatedAt ?? null,\n }),\n status: 201,\n },\n update: {\n commandId: 'wms.warehouses.update',\n schema: rawBodySchema,\n mapInput: async ({ raw, ctx }) => {\n const { translate } = await resolveTranslations()\n return parseScopedCommandInput(warehouseUpdateSchema, raw ?? {}, ctx, translate)\n },\n response: () => ({ ok: true }),\n },\n delete: {\n commandId: 'wms.warehouses.delete',\n schema: rawBodySchema,\n mapInput: async ({ parsed, ctx }) => {\n const { translate } = await resolveTranslations()\n return { id: resolveCrudRecordId(parsed, ctx, translate) }\n },\n response: () => ({ ok: true }),\n },\n },\n})\n\nexport const GET = crud.GET\nexport const POST = crud.POST\nexport const PUT = crud.PUT\nexport const DELETE = crud.DELETE\n\nconst warehouseListItemSchema = z.object({\n id: z.string().uuid().nullable().optional(),\n organization_id: z.string().uuid().nullable().optional(),\n tenant_id: z.string().uuid().nullable().optional(),\n name: z.string().nullable().optional(),\n code: z.string().nullable().optional(),\n is_active: z.boolean().nullable().optional(),\n is_primary: z.boolean().nullable().optional(),\n address_line1: z.string().nullable().optional(),\n city: z.string().nullable().optional(),\n postal_code: z.string().nullable().optional(),\n country: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n updated_at: z.string().nullable().optional(),\n})\n\nexport const openApi = createWmsCrudOpenApi({\n resourceName: 'Warehouse',\n pluralName: 'Warehouses',\n querySchema: listSchema,\n listResponseSchema: createPagedListResponseSchema(warehouseListItemSchema),\n create: {\n schema: warehouseCreateSchema,\n responseSchema: z.object({\n id: z.string().uuid().nullable(),\n updatedAt: z.string().nullable(),\n }),\n description: 'Creates a warehouse for inventory operations.',\n },\n update: {\n schema: warehouseUpdateSchema,\n responseSchema: defaultOkResponseSchema,\n description: 'Updates a warehouse by id.',\n },\n del: {\n schema: z.object({ id: z.string().uuid() }),\n responseSchema: defaultOkResponseSchema,\n description: 'Soft-deletes a warehouse by id.',\n },\n})\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { registerCommand } from "@open-mercato/shared/lib/commands";
|
|
2
|
-
import { withAtomicFlush } from "@open-mercato/shared/lib/commands/flush";
|
|
3
2
|
import {
|
|
4
3
|
emitCrudSideEffects,
|
|
5
4
|
emitCrudUndoSideEffects,
|
|
6
5
|
parseWithCustomFields,
|
|
7
6
|
setCustomFieldsIfAny
|
|
8
7
|
} from "@open-mercato/shared/lib/commands/helpers";
|
|
9
|
-
import {
|
|
8
|
+
import { loadCustomFieldSnapshot, buildCustomFieldResetMap } from "@open-mercato/shared/lib/commands/customFieldSnapshots";
|
|
9
|
+
import { withAtomicFlush } from "@open-mercato/shared/lib/commands/flush";
|
|
10
10
|
import { CrudHttpError, isUniqueViolation } from "@open-mercato/shared/lib/crud/errors";
|
|
11
11
|
import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
|
|
12
12
|
import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
normalizeOptionalString,
|
|
38
38
|
requireId,
|
|
39
39
|
toNumericString,
|
|
40
|
+
warehouseCrudIndexer,
|
|
40
41
|
warehouseZoneCrudIndexer
|
|
41
42
|
} from "./shared.js";
|
|
42
43
|
import { emitWmsEvent } from "../events.js";
|
|
@@ -53,6 +54,17 @@ function toJsonValue(value) {
|
|
|
53
54
|
if (value === void 0) return void 0;
|
|
54
55
|
return value ?? null;
|
|
55
56
|
}
|
|
57
|
+
async function persistWarehouseCustomFields(ctx, warehouse, custom) {
|
|
58
|
+
if (!custom || Object.keys(custom).length === 0) return;
|
|
59
|
+
await setCustomFieldsIfAny({
|
|
60
|
+
dataEngine: ctx.container.resolve("dataEngine"),
|
|
61
|
+
entityId: E.wms.warehouse,
|
|
62
|
+
recordId: warehouse.id,
|
|
63
|
+
organizationId: warehouse.organizationId,
|
|
64
|
+
tenantId: warehouse.tenantId,
|
|
65
|
+
values: custom
|
|
66
|
+
});
|
|
67
|
+
}
|
|
56
68
|
async function buildCrudLog(ctx, input, resultId, actionKey, fallbackLabel, resourceKind) {
|
|
57
69
|
const { translate } = await resolveTranslations();
|
|
58
70
|
return {
|
|
@@ -131,7 +143,16 @@ function snapshotWarehouse(record) {
|
|
|
131
143
|
}
|
|
132
144
|
async function loadWarehouseSnapshot(em, ctx, id) {
|
|
133
145
|
const record = await findOneWithDecryption(em, Warehouse, { id }, void 0, resolveScope(ctx));
|
|
134
|
-
|
|
146
|
+
if (!record) return null;
|
|
147
|
+
const snapshot = snapshotWarehouse(record);
|
|
148
|
+
const custom = await loadCustomFieldSnapshot(em, {
|
|
149
|
+
entityId: E.wms.warehouse,
|
|
150
|
+
recordId: record.id,
|
|
151
|
+
tenantId: record.tenantId,
|
|
152
|
+
organizationId: record.organizationId
|
|
153
|
+
});
|
|
154
|
+
snapshot.custom = custom && Object.keys(custom).length ? custom : null;
|
|
155
|
+
return snapshot;
|
|
135
156
|
}
|
|
136
157
|
function snapshotWarehouseZone(record) {
|
|
137
158
|
const warehouseId = typeof record.warehouse === "string" ? record.warehouse : record.warehouse.id;
|
|
@@ -171,6 +192,24 @@ async function writeZoneCustomFields(ctx, zone, values) {
|
|
|
171
192
|
values
|
|
172
193
|
});
|
|
173
194
|
}
|
|
195
|
+
async function emitWarehouseCrudSideEffects(ctx, action, warehouse, origin = "write") {
|
|
196
|
+
const options = {
|
|
197
|
+
dataEngine: ctx.container.resolve("dataEngine"),
|
|
198
|
+
action,
|
|
199
|
+
entity: warehouse,
|
|
200
|
+
identifiers: {
|
|
201
|
+
id: warehouse.id,
|
|
202
|
+
organizationId: warehouse.organizationId,
|
|
203
|
+
tenantId: warehouse.tenantId
|
|
204
|
+
},
|
|
205
|
+
indexer: warehouseCrudIndexer
|
|
206
|
+
};
|
|
207
|
+
if (origin === "undo") {
|
|
208
|
+
await emitCrudUndoSideEffects(options);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
await emitCrudSideEffects(options);
|
|
212
|
+
}
|
|
174
213
|
async function emitZoneCrudSideEffects(ctx, action, zone, origin = "write") {
|
|
175
214
|
const options = {
|
|
176
215
|
dataEngine: ctx.container.resolve("dataEngine"),
|
|
@@ -408,7 +447,7 @@ async function resolveParentLocation(em, ctx, warehouseId, parentId) {
|
|
|
408
447
|
const createWarehouseCommand = {
|
|
409
448
|
id: "wms.warehouses.create",
|
|
410
449
|
async execute(rawInput, ctx) {
|
|
411
|
-
const parsed = warehouseCreateSchema
|
|
450
|
+
const { parsed, custom } = parseWithCustomFields(warehouseCreateSchema, rawInput ?? {});
|
|
412
451
|
ensureTenantScope(ctx, parsed.tenantId);
|
|
413
452
|
ensureOrganizationScope(ctx, parsed.organizationId);
|
|
414
453
|
const em = resolveEm(ctx);
|
|
@@ -466,6 +505,8 @@ const createWarehouseCommand = {
|
|
|
466
505
|
}
|
|
467
506
|
throw err;
|
|
468
507
|
}
|
|
508
|
+
await persistWarehouseCustomFields(ctx, warehouse, custom);
|
|
509
|
+
await emitWarehouseCrudSideEffects(ctx, "created", warehouse);
|
|
469
510
|
void emitWmsEvent("wms.warehouse.created", {
|
|
470
511
|
id: warehouse.id,
|
|
471
512
|
warehouseId: warehouse.id,
|
|
@@ -474,6 +515,7 @@ const createWarehouseCommand = {
|
|
|
474
515
|
}).catch(() => void 0);
|
|
475
516
|
return {
|
|
476
517
|
warehouseId: warehouse.id,
|
|
518
|
+
updatedAt: isoOrNull(warehouse.updatedAt),
|
|
477
519
|
...demotedPrimariesBefore.length > 0 ? { demotedPrimariesBefore } : {}
|
|
478
520
|
};
|
|
479
521
|
},
|
|
@@ -513,6 +555,8 @@ const createWarehouseCommand = {
|
|
|
513
555
|
ensureOrganizationScope(ctx, record.organizationId);
|
|
514
556
|
record.deletedAt = /* @__PURE__ */ new Date();
|
|
515
557
|
await em.flush();
|
|
558
|
+
await persistWarehouseCustomFields(ctx, after, buildCustomFieldResetMap(void 0, after.custom ?? void 0));
|
|
559
|
+
await emitWarehouseCrudSideEffects(ctx, "deleted", record, "undo");
|
|
516
560
|
if (payload.demotedPrimariesBefore?.length) {
|
|
517
561
|
await restoreDemotedPrimaryWarehouses(em, ctx, payload.demotedPrimariesBefore);
|
|
518
562
|
await em.flush();
|
|
@@ -528,7 +572,7 @@ const updateWarehouseCommand = {
|
|
|
528
572
|
return before ? { before } : {};
|
|
529
573
|
},
|
|
530
574
|
async execute(rawInput, ctx) {
|
|
531
|
-
const parsed = warehouseUpdateSchema
|
|
575
|
+
const { parsed, custom } = parseWithCustomFields(warehouseUpdateSchema, rawInput ?? {});
|
|
532
576
|
const em = resolveEm(ctx);
|
|
533
577
|
const warehouse = await loadWarehouse(em, ctx, parsed.id);
|
|
534
578
|
if (parsed.code !== void 0 && parsed.code !== warehouse.code) {
|
|
@@ -581,6 +625,8 @@ const updateWarehouseCommand = {
|
|
|
581
625
|
}
|
|
582
626
|
throw err;
|
|
583
627
|
}
|
|
628
|
+
await persistWarehouseCustomFields(ctx, warehouse, custom);
|
|
629
|
+
await emitWarehouseCrudSideEffects(ctx, "updated", warehouse);
|
|
584
630
|
void emitWmsEvent("wms.warehouse.updated", {
|
|
585
631
|
id: warehouse.id,
|
|
586
632
|
warehouseId: warehouse.id,
|
|
@@ -661,6 +707,12 @@ const updateWarehouseCommand = {
|
|
|
661
707
|
record.deletedAt = null;
|
|
662
708
|
}
|
|
663
709
|
await em.flush();
|
|
710
|
+
await persistWarehouseCustomFields(
|
|
711
|
+
ctx,
|
|
712
|
+
before,
|
|
713
|
+
buildCustomFieldResetMap(before.custom ?? void 0, payload.after?.custom ?? void 0)
|
|
714
|
+
);
|
|
715
|
+
await emitWarehouseCrudSideEffects(ctx, "updated", record, "undo");
|
|
664
716
|
if (payload.demotedPrimariesBefore?.length) {
|
|
665
717
|
await restoreDemotedPrimaryWarehouses(em, ctx, payload.demotedPrimariesBefore);
|
|
666
718
|
await em.flush();
|
|
@@ -681,6 +733,7 @@ const deleteWarehouseCommand = {
|
|
|
681
733
|
const warehouse = await loadWarehouse(em, ctx, warehouseId);
|
|
682
734
|
warehouse.deletedAt = /* @__PURE__ */ new Date();
|
|
683
735
|
await em.flush();
|
|
736
|
+
await emitWarehouseCrudSideEffects(ctx, "deleted", warehouse);
|
|
684
737
|
return { warehouseId: warehouse.id };
|
|
685
738
|
},
|
|
686
739
|
buildLog: async ({ input, result, ctx, snapshots }) => {
|
|
@@ -735,6 +788,7 @@ const deleteWarehouseCommand = {
|
|
|
735
788
|
record.metadata = before.metadata;
|
|
736
789
|
}
|
|
737
790
|
await em.flush();
|
|
791
|
+
await emitWarehouseCrudSideEffects(ctx, "created", record, "undo");
|
|
738
792
|
}
|
|
739
793
|
};
|
|
740
794
|
async function restoreZoneFromSnapshot(em, before) {
|