@flowselections/floriday-voorraad 1.0.15 → 1.0.16

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.
Files changed (45) hide show
  1. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  2. package/dist-lib/components/voorraad/ArtikelWizard.js +48 -7
  3. package/dist-lib/components/voorraad/ExcelExportButton.d.ts +2 -1
  4. package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
  5. package/dist-lib/components/voorraad/ExcelExportButton.js +24 -5
  6. package/dist-lib/components/voorraad/ProductLinkCard.d.ts +13 -0
  7. package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -0
  8. package/dist-lib/components/voorraad/ProductLinkCard.js +159 -0
  9. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
  10. package/dist-lib/components/voorraad/StockBulkButtons.js +88 -7
  11. package/dist-lib/hooks/useTradeItemSpec.d.ts.map +1 -1
  12. package/dist-lib/hooks/useTradeItemSpec.js +4 -1
  13. package/dist-lib/hooks/useVoorraadData.d.ts +5 -4
  14. package/dist-lib/hooks/useVoorraadData.d.ts.map +1 -1
  15. package/dist-lib/hooks/useVoorraadData.js +40 -6
  16. package/dist-lib/index.d.ts +1 -0
  17. package/dist-lib/index.d.ts.map +1 -1
  18. package/dist-lib/index.js +1 -0
  19. package/dist-lib/integrations/supabase/auth-middleware.d.ts +743 -0
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/client.d.ts +743 -0
  22. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  23. package/dist-lib/integrations/supabase/client.server.d.ts +743 -0
  24. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/types.d.ts +763 -0
  26. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  27. package/dist-lib/lib/ensure-article-codes.d.ts +8 -0
  28. package/dist-lib/lib/ensure-article-codes.d.ts.map +1 -0
  29. package/dist-lib/lib/ensure-article-codes.js +78 -0
  30. package/dist-lib/lib/floricode-required-features.functions.d.ts +743 -0
  31. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/floriday-client.d.ts +6 -0
  33. package/dist-lib/lib/floriday-client.d.ts.map +1 -1
  34. package/dist-lib/lib/floriday-gateway.functions.d.ts +2972 -0
  35. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/floriday-payload.d.ts +19 -5
  37. package/dist-lib/lib/floriday-payload.d.ts.map +1 -1
  38. package/dist-lib/lib/floriday-payload.js +106 -33
  39. package/dist-lib/lib/floriday-warehouse.functions.d.ts +32228 -0
  40. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -0
  41. package/dist-lib/lib/floriday-warehouse.functions.js +98 -0
  42. package/dist-lib/lib/floriday-writes.functions.d.ts +1616 -130
  43. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/floriday-writes.functions.js +34 -6
  45. package/package.json +1 -1
@@ -73,6 +73,7 @@ export interface WizardData {
73
73
  features: Record<string, string>;
74
74
  customerOrganizationIds: string[];
75
75
  images: PhotoInput[];
76
+ warehouseId: string;
76
77
  packingConfigurations: PackingConfigurationInput[];
77
78
  additionalPackaging: AdditionalPackagingInput[];
78
79
  yearRound: boolean;
@@ -110,6 +111,9 @@ export declare const stepSchemas: {
110
111
  url: z.ZodString;
111
112
  }, z.core.$strip>>;
112
113
  }, z.core.$strip>;
114
+ warehouse: z.ZodObject<{
115
+ warehouseId: z.ZodString;
116
+ }, z.core.$strip>;
113
117
  beladingen: z.ZodObject<{
114
118
  packingConfigurations: z.ZodArray<z.ZodObject<{
115
119
  source: z.ZodDefault<z.ZodEnum<{
@@ -131,7 +135,7 @@ export declare const stepSchemas: {
131
135
  weeks: z.ZodArray<z.ZodNumber>;
132
136
  }, z.core.$strip>;
133
137
  };
134
- export type StepKey = "vbn" | "artikel" | "paspoort" | "eigenschappen" | "klanten" | "fotos" | "beladingen" | "verpakking" | "samenstelling" | "beschikbaarheid";
138
+ export type StepKey = "vbn" | "artikel" | "paspoort" | "eigenschappen" | "klanten" | "fotos" | "warehouse" | "beladingen" | "verpakking" | "samenstelling" | "beschikbaarheid";
135
139
  export declare function validateStep(key: StepKey, data: WizardData): {
136
140
  ok: true;
137
141
  } | {
@@ -145,15 +149,16 @@ export interface AddPackingConfigPayload {
145
149
  primary: boolean;
146
150
  piecesPerPackage: number;
147
151
  package: {
148
- vbnPackageCode: number;
152
+ vbnPackageCode?: number;
153
+ customPackageId?: string;
149
154
  };
150
155
  packagesPerLayer: number;
151
156
  layersPerLoadCarrier: number;
152
157
  loadCarrier: LoadCarrierPayload;
153
158
  isHiddenForDirectSales: boolean;
154
- packagingSupplierId?: string;
155
- packagingSupplierMaterialId?: string;
156
- customerOrganizationIds?: string[];
159
+ floricodeVrsPackagingId?: string;
160
+ allowedCustomerOrganizationIds?: string[];
161
+ photoUrl?: string;
157
162
  }
158
163
  export declare function buildPackingConfigPayload(p: PackingConfigurationInput, primary?: boolean): AddPackingConfigPayload;
159
164
  export interface AddTradeItemPayload {
@@ -179,12 +184,21 @@ export interface AddTradeItemPayload {
179
184
  type: PhotoTypeEnum;
180
185
  sortIndex: number;
181
186
  }[];
187
+ warehouseId: string;
182
188
  packingConfigurations: AddPackingConfigPayload[];
183
189
  botanicalNames?: string[];
184
190
  countryOfOriginIsoCodes?: string[];
185
191
  isHiddenInCatalog: boolean;
186
192
  }
193
+ /** TradeItemUpdate = TradeItemBase minus tradeItemId + supplierArticleCode. */
194
+ export type UpdateTradeItemPayload = Omit<AddTradeItemPayload, "tradeItemId" | "supplierArticleCode">;
187
195
  export declare function buildAddTradeItemPayload(d: WizardData): AddTradeItemPayload;
196
+ /**
197
+ * Bouwt de TradeItemUpdate-payload (PUT /trade-items/{id}) door
198
+ * `tradeItemId` en `supplierArticleCode` uit de create-payload te strippen.
199
+ * Alle andere validatie-regels blijven identiek.
200
+ */
201
+ export declare function buildUpdateTradeItemPayload(d: WizardData): UpdateTradeItemPayload;
188
202
  export declare const emptyWizardData: WizardData;
189
203
  export declare function floridayCacheToWizardData(raw: any): WizardData;
190
204
  //# sourceMappingURL=floriday-payload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floriday-payload.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-payload.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AACvE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,MAAM,EAAE,aAAa,CAAC;IACtB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,iFAAiF;AACjF,eAAO,MAAM,mBAAmB,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAgB7D,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,UAAU;IAEzB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAE3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAElB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAElC,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,qBAAqB,EAAE,yBAAyB,EAAE,CAAC;IAEnD,mBAAmB,EAAE,wBAAwB,EAAE,CAAC;IAEhD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD;AAID,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgGvB,CAAC;AAEF,MAAM,MAAM,OAAO,GACf,KAAK,GACL,SAAS,GACT,UAAU,GACV,eAAe,GACf,SAAS,GACT,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,eAAe,GACf,iBAAiB,CAAC;AAEtB,wBAAgB,YAAY,CAC1B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,UAAU,GACf;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAmDhD;AAMD,MAAM,MAAM,eAAe,GACvB,MAAM,GAAG,iBAAiB,GAAG,gBAAgB,GAC7C,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC;AAC9C,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnE,MAAM,MAAM,aAAa,GACrB,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GACjD,iBAAiB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GACzD,WAAW,GAAG,OAAO,CAAC;AAyB1B,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC;AAED,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,yBAAyB,EAC5B,OAAO,UAAQ,GACd,uBAAuB,CA0BzB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,eAAe,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpF,qBAAqB,EAAE,uBAAuB,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAoBD,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,UAAU,GAAG,mBAAmB,CAmD3E;AAED,eAAO,MAAM,eAAe,EAAE,UAsB7B,CAAC;AAiDF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CA+E9D"}
1
+ {"version":3,"file":"floriday-payload.d.ts","sourceRoot":"","sources":["../../src/lib/floriday-payload.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,11 @@ export const stepSchemas = {
73
73
  .array(z.object({ url: z.string().url() }))
74
74
  .min(1, "Minstens één foto verplicht voor Floriday"),
75
75
  }),
76
+ warehouse: z.object({
77
+ warehouseId: z
78
+ .string()
79
+ .uuid("Kies een warehouse (Floriday-warehouseId, uuid)"),
80
+ }),
76
81
  beladingen: z.object({
77
82
  packingConfigurations: z
78
83
  .array(z
@@ -146,6 +151,12 @@ export function validateStep(key, data) {
146
151
  ? { ok: true }
147
152
  : { ok: false, errors: r.error.issues.map((i) => i.message) };
148
153
  }
154
+ case "warehouse": {
155
+ const r = stepSchemas.warehouse.safeParse(data);
156
+ return r.success
157
+ ? { ok: true }
158
+ : { ok: false, errors: r.error.issues.map((i) => i.message) };
159
+ }
149
160
  case "beladingen": {
150
161
  const r = stepSchemas.beladingen.safeParse(data);
151
162
  return r.success
@@ -184,29 +195,45 @@ function toIntOrUndefined(v) {
184
195
  const n = typeof v === "number" ? v : parseInt(String(v).trim(), 10);
185
196
  return Number.isFinite(n) ? n : undefined;
186
197
  }
198
+ function isUuid(v) {
199
+ return typeof v === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v);
200
+ }
201
+ /** Normaliseer whitespace conform Floriday-eis: trim + collapse dubbele whitespace. */
202
+ function normaliseWs(v) {
203
+ return v.trim().replace(/\s+/g, " ");
204
+ }
187
205
  export function buildPackingConfigPayload(p, primary = false) {
188
206
  const vbnPackageCode = toIntOrUndefined(p.packagingType);
189
- if (!vbnPackageCode) {
190
- throw new Error(`Fusttype (VBN package code) ontbreekt of is geen getal voor configuratie "${p.id}"`);
207
+ // customPackageId kan via packagingMaterialId meekomen (wizard sla eerder
208
+ // supplier-material op in dat veld). Alleen accepteren als het een geldig UUID is.
209
+ const customPackageId = isUuid(p.packagingMaterialId) ? p.packagingMaterialId : undefined;
210
+ if (!vbnPackageCode && !customPackageId) {
211
+ throw new Error(`Fusttype ontbreekt voor beladingsconfiguratie "${p.id}" — kies een VBN-fust of een custom package.`);
191
212
  }
213
+ const pkg = {};
214
+ if (vbnPackageCode)
215
+ pkg.vbnPackageCode = vbnPackageCode;
216
+ if (customPackageId)
217
+ pkg.customPackageId = customPackageId;
192
218
  const payload = {
193
219
  primary: primary || Boolean(p.isPrimary),
194
220
  piecesPerPackage: Math.max(1, Math.min(9999, Number(p.unitsPerPackage) || 1)),
195
- package: { vbnPackageCode },
221
+ package: pkg,
196
222
  packagesPerLayer: Math.max(1, Math.min(9999, Number(p.packagesPerLayer) || 1)),
197
223
  layersPerLoadCarrier: Math.max(1, Math.min(9999, Number(p.layersPerLoadCarrier) || 1)),
198
224
  loadCarrier: normaliseLoadCarrier(p.loadCarrier),
199
225
  isHiddenForDirectSales: false,
200
226
  };
201
- if (p.source === "SUPPLIER" && p.packagingSupplierId) {
202
- payload.packagingSupplierId = p.packagingSupplierId;
203
- if (p.packagingMaterialId) {
204
- payload.packagingSupplierMaterialId = p.packagingMaterialId;
205
- }
227
+ // Alleen geldige VRS-packaging UUIDs meesturen; supplierId-string uit de
228
+ // hardcoded lijst is GEEN uuid en hoort niet in de Floriday-payload.
229
+ if (p.source === "SUPPLIER" && isUuid(p.packagingSupplierId)) {
230
+ payload.floricodeVrsPackagingId = p.packagingSupplierId;
206
231
  }
207
232
  if (p.isCustomerSpecific && p.customerOrganizationIds.length > 0) {
208
- payload.customerOrganizationIds = p.customerOrganizationIds;
233
+ payload.allowedCustomerOrganizationIds = p.customerOrganizationIds;
209
234
  }
235
+ if (p.photoUrl)
236
+ payload.photoUrl = p.photoUrl;
210
237
  return payload;
211
238
  }
212
239
  function weeksToSeasonalPeriods(weeks) {
@@ -240,40 +267,76 @@ export function buildAddTradeItemPayload(d) {
240
267
  if (!vbnProductCode) {
241
268
  throw new Error("vbnProductCode moet een geheel getal zijn");
242
269
  }
243
- const characteristics = Object.entries(d.features)
244
- .filter(([code, value]) => code && value && String(value).trim().length > 0)
245
- .map(([vbnCode, vbnValueCode]) => ({
246
- vbnCode: String(vbnCode).trim().slice(0, 3),
247
- vbnValueCode: String(vbnValueCode).trim().slice(0, 3),
248
- }));
270
+ // Characteristics: spec vereist vbnCode en vbnValueCode lengte 1..3.
271
+ // Stille truncate maskeert data-corruptie strict valideren.
272
+ const characteristics = [];
273
+ for (const [code, value] of Object.entries(d.features)) {
274
+ const c = String(code ?? "").trim();
275
+ const v = String(value ?? "").trim();
276
+ if (!c || !v)
277
+ continue;
278
+ if (c.length > 3) {
279
+ throw new Error(`Karakteristiek "${c}": vbnCode mag max 3 tekens zijn`);
280
+ }
281
+ if (v.length > 3) {
282
+ throw new Error(`Karakteristiek "${c}": waarde "${v}" mag max 3 tekens zijn`);
283
+ }
284
+ characteristics.push({ vbnCode: c, vbnValueCode: v });
285
+ }
249
286
  const botanicalNames = (d.botanicalName || "")
250
287
  .split(/[;,\n]/).map((s) => s.trim()).filter(Boolean);
251
- const countryOfOriginIsoCodes = (d.countryOfOrigin || "")
288
+ const rawCountries = (d.countryOfOrigin || "")
252
289
  .split(/[,;\s]+/).map((s) => s.trim().toUpperCase()).filter(Boolean);
290
+ const invalidCountries = rawCountries.filter((c) => !/^[A-Z]{2}$/.test(c));
291
+ if (invalidCountries.length > 0) {
292
+ throw new Error(`Ongeldige landcode(s): ${invalidCountries.join(", ")} — gebruik ISO 3166-1 alpha-2 (2 letters).`);
293
+ }
294
+ const countryOfOriginIsoCodes = rawCountries;
253
295
  const photos = d.images.map((img, i) => ({
254
296
  primary: i === 0,
255
297
  url: img.url,
256
- type: "WEBSHOPFRIENDLY",
298
+ type: img.type ?? "WEBSHOPFRIENDLY",
257
299
  sortIndex: i,
258
300
  }));
259
301
  const packingConfigurations = d.packingConfigurations.map((p, i) => buildPackingConfigPayload(p, i === 0));
260
302
  const isCustomerSpecific = d.articleType === "CUSTOMER_SPECIFIC";
303
+ const supplierArticleCode = normaliseWs(d.articleCode).slice(0, 13);
304
+ const tradeItemNameNl = normaliseWs(d.name).slice(0, 120);
305
+ if (!supplierArticleCode)
306
+ throw new Error("supplierArticleCode is verplicht");
307
+ if (!tradeItemNameNl)
308
+ throw new Error("tradeItemName.nl is verplicht");
309
+ const warehouseId = (d.warehouseId ?? "").trim();
310
+ if (!isUuid(warehouseId)) {
311
+ throw new Error("warehouseId is verplicht — kies een warehouse.");
312
+ }
261
313
  return {
262
314
  tradeItemId: crypto.randomUUID(),
263
- supplierArticleCode: d.articleCode.trim().slice(0, 13),
315
+ supplierArticleCode,
264
316
  articleGtin: d.gtin && d.gtin.trim().length === 13 ? d.gtin.trim() : undefined,
265
317
  vbnProductCode,
266
- tradeItemName: { nl: d.name.trim().slice(0, 120) },
318
+ tradeItemName: { nl: tradeItemNameNl },
267
319
  characteristics,
268
320
  customerOrganizationIds: isCustomerSpecific ? d.customerOrganizationIds : [],
269
321
  seasonalPeriods: d.yearRound ? [] : weeksToSeasonalPeriods(d.weeks),
270
322
  photos,
323
+ warehouseId,
271
324
  packingConfigurations,
272
325
  botanicalNames: botanicalNames.length ? botanicalNames : undefined,
273
326
  countryOfOriginIsoCodes: countryOfOriginIsoCodes.length ? countryOfOriginIsoCodes : undefined,
274
327
  isHiddenInCatalog: isCustomerSpecific ? true : !d.visibleInExplorer,
275
328
  };
276
329
  }
330
+ /**
331
+ * Bouwt de TradeItemUpdate-payload (PUT /trade-items/{id}) door
332
+ * `tradeItemId` en `supplierArticleCode` uit de create-payload te strippen.
333
+ * Alle andere validatie-regels blijven identiek.
334
+ */
335
+ export function buildUpdateTradeItemPayload(d) {
336
+ const full = buildAddTradeItemPayload(d);
337
+ const { tradeItemId: _id, supplierArticleCode: _code, ...rest } = full;
338
+ return rest;
339
+ }
277
340
  export const emptyWizardData = {
278
341
  productGroup: null,
279
342
  vbnCode: "",
@@ -292,6 +355,7 @@ export const emptyWizardData = {
292
355
  features: {},
293
356
  customerOrganizationIds: [],
294
357
  images: [],
358
+ warehouseId: "",
295
359
  packingConfigurations: [],
296
360
  additionalPackaging: [],
297
361
  yearRound: true,
@@ -369,20 +433,28 @@ export function floridayCacheToWizardData(raw) {
369
433
  const packings = Array.isArray(raw.packingConfigurations)
370
434
  ? raw.packingConfigurations
371
435
  : [];
372
- const packingConfigurations = packings.map((p, i) => ({
373
- id: `existing-${i}`,
374
- source: p?.packagingSupplierId ? "SUPPLIER" : "VBN",
375
- packagingType: String(p?.package?.vbnPackageCode ?? ""),
376
- loadCarrier: String(p?.loadCarrier ?? "NONE"),
377
- packagingSupplierId: p?.packagingSupplierId ?? undefined,
378
- packagingMaterialId: p?.packagingSupplierMaterialId ?? undefined,
379
- unitsPerPackage: Number(p?.piecesPerPackage ?? 1),
380
- packagesPerLayer: Number(p?.packagesPerLayer ?? 1),
381
- layersPerLoadCarrier: Number(p?.layersPerLoadCarrier ?? 1),
382
- isCustomerSpecific: Array.isArray(p?.customerOrganizationIds) && p.customerOrganizationIds.length > 0,
383
- customerOrganizationIds: Array.isArray(p?.customerOrganizationIds) ? p.customerOrganizationIds : [],
384
- isPrimary: Boolean(p?.primary) || i === 0,
385
- }));
436
+ const packingConfigurations = packings.map((p, i) => {
437
+ const vrsId = p?.floricodeVrsPackagingId ?? p?.packagingSupplierId ?? undefined;
438
+ const allowed = Array.isArray(p?.allowedCustomerOrganizationIds)
439
+ ? p.allowedCustomerOrganizationIds
440
+ : Array.isArray(p?.customerOrganizationIds)
441
+ ? p.customerOrganizationIds
442
+ : [];
443
+ return {
444
+ id: `existing-${i}`,
445
+ source: vrsId ? "SUPPLIER" : "VBN",
446
+ packagingType: String(p?.package?.vbnPackageCode ?? ""),
447
+ loadCarrier: String(p?.loadCarrier ?? "NONE"),
448
+ packagingSupplierId: vrsId ?? undefined,
449
+ packagingMaterialId: p?.package?.customPackageId ?? p?.packagingSupplierMaterialId ?? undefined,
450
+ unitsPerPackage: Number(p?.piecesPerPackage ?? 1),
451
+ packagesPerLayer: Number(p?.packagesPerLayer ?? 1),
452
+ layersPerLoadCarrier: Number(p?.layersPerLoadCarrier ?? 1),
453
+ isCustomerSpecific: allowed.length > 0,
454
+ customerOrganizationIds: allowed,
455
+ isPrimary: Boolean(p?.primary) || i === 0,
456
+ };
457
+ });
386
458
  const customerOrgIds = Array.isArray(raw.customerOrganizationIds)
387
459
  ? raw.customerOrganizationIds
388
460
  : [];
@@ -414,6 +486,7 @@ export function floridayCacheToWizardData(raw) {
414
486
  features,
415
487
  customerOrganizationIds: customerOrgIds,
416
488
  images,
489
+ warehouseId: String(raw.warehouseId ?? raw.warehouse?.warehouseId ?? ""),
417
490
  packingConfigurations,
418
491
  additionalPackaging: [],
419
492
  yearRound: weeks.length === 0,