@flowselections/floriday-voorraad 1.0.26 → 1.0.28

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 (104) hide show
  1. package/dist-lib/components/TemplatePage.d.ts +1 -1
  2. package/dist-lib/components/TemplatePage.d.ts.map +1 -1
  3. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +1 -1
  4. package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
  5. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts +1 -1
  6. package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
  7. package/dist-lib/components/voorraad/ArtikelWizard.d.ts +1 -1
  8. package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
  9. package/dist-lib/components/voorraad/ArtikelWizard.js +21 -8
  10. package/dist-lib/components/voorraad/ConnectionBadge.d.ts +1 -1
  11. package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -1
  12. package/dist-lib/components/voorraad/EditArtikelPage.d.ts +1 -1
  13. package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -1
  14. package/dist-lib/components/voorraad/EditArtikelPage.js +3 -2
  15. package/dist-lib/components/voorraad/ExcelExportButton.d.ts +1 -1
  16. package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
  17. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts +1 -1
  18. package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
  19. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +1 -1
  20. package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -1
  21. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +1 -1
  22. package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
  23. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +1 -1
  24. package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
  25. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts +1 -1
  26. package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
  27. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +5 -0
  28. package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -0
  29. package/dist-lib/components/voorraad/ProductCustomFieldsCard.js +65 -0
  30. package/dist-lib/components/voorraad/ProductLinkCard.d.ts +1 -1
  31. package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -1
  32. package/dist-lib/components/voorraad/StepSamenstelling.d.ts +1 -1
  33. package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
  34. package/dist-lib/components/voorraad/StockBulkButtons.d.ts +1 -1
  35. package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
  36. package/dist-lib/components/voorraad/StockBulkButtons.js +65 -2
  37. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +1 -1
  38. package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
  39. package/dist-lib/components/voorraad/ValidationOverviewTable.js +8 -2
  40. package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -1
  41. package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
  42. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +1 -1
  43. package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -1
  44. package/dist-lib/components/voorraad/VoorraadDashboard.js +4 -1
  45. package/dist-lib/components/voorraad/VoorraadPage.d.ts +1 -1
  46. package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
  47. package/dist-lib/components/voorraad/VoorraadPagination.d.ts +1 -1
  48. package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -1
  49. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +1 -1
  50. package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
  51. package/dist-lib/components/voorraad/VoorraadTable.d.ts +1 -1
  52. package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
  53. package/dist-lib/components/voorraad/VoorraadTable.js +10 -2
  54. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +2 -0
  55. package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -0
  56. package/dist-lib/components/voorraad/VoorraadVeldenCard.js +97 -0
  57. package/dist-lib/hooks/useFloriday.d.ts +6 -6
  58. package/dist-lib/hooks/useFloriday.d.ts.map +1 -1
  59. package/dist-lib/hooks/useFloridayVbnRequired.d.ts +2 -2
  60. package/dist-lib/hooks/useFloridayVbnRequired.d.ts.map +1 -1
  61. package/dist-lib/hooks/useLocalTradeItems.d.ts +4 -4
  62. package/dist-lib/hooks/useLocalTradeItems.d.ts.map +1 -1
  63. package/dist-lib/hooks/useLocalTradeItems.js +59 -35
  64. package/dist-lib/hooks/useTradeItemSupplyLine.d.ts +1 -1
  65. package/dist-lib/hooks/useTradeItemSupplyLine.d.ts.map +1 -1
  66. package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts +1 -1
  67. package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts.map +1 -1
  68. package/dist-lib/hooks/useVoorraadCustomFields.d.ts +9 -0
  69. package/dist-lib/hooks/useVoorraadCustomFields.d.ts.map +1 -0
  70. package/dist-lib/hooks/useVoorraadCustomFields.js +26 -0
  71. package/dist-lib/index.d.ts +2 -0
  72. package/dist-lib/index.d.ts.map +1 -1
  73. package/dist-lib/index.js +4 -1
  74. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2358 -177
  75. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  76. package/dist-lib/integrations/supabase/client.d.ts +2358 -177
  77. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  78. package/dist-lib/integrations/supabase/client.server.d.ts +2358 -177
  79. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  80. package/dist-lib/integrations/supabase/types.d.ts +2428 -174
  81. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  82. package/dist-lib/integrations/supabase/types.js +49 -0
  83. package/dist-lib/lib/floricode-required-features.functions.d.ts +2373 -198
  84. package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
  85. package/dist-lib/lib/floriday-customer-offer.functions.d.ts +2375 -192
  86. package/dist-lib/lib/floriday-customer-offer.functions.d.ts.map +1 -1
  87. package/dist-lib/lib/floriday-gateway.functions.d.ts +49617 -38712
  88. package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
  89. package/dist-lib/lib/floriday-vbn-required.functions.d.ts +13843 -9481
  90. package/dist-lib/lib/floriday-vbn-required.functions.d.ts.map +1 -1
  91. package/dist-lib/lib/floriday-warehouse.functions.d.ts +25719 -19176
  92. package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
  93. package/dist-lib/lib/floriday-writes.functions.d.ts +13826 -9464
  94. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  95. package/dist-lib/lib/voorraad-custom-fields.d.ts +22 -0
  96. package/dist-lib/lib/voorraad-custom-fields.d.ts.map +1 -0
  97. package/dist-lib/lib/voorraad-custom-fields.js +71 -0
  98. package/package.json +1 -1
  99. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +0 -2
  100. package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +0 -1
  101. package/dist-lib/components/settings/VoorraadSettingsCard.js +0 -39
  102. package/dist-lib/components/voorraad/ConnectionPicker.d.ts +0 -8
  103. package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +0 -1
  104. package/dist-lib/components/voorraad/ConnectionPicker.js +0 -8
@@ -1,2 +1,2 @@
1
- export declare function TemplatePage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function TemplatePage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=TemplatePage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TemplatePage.d.ts","sourceRoot":"","sources":["../../src/components/TemplatePage.tsx"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,4CAS3B"}
1
+ {"version":3,"file":"TemplatePage.d.ts","sourceRoot":"","sources":["../../src/components/TemplatePage.tsx"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,gCAS3B"}
@@ -4,6 +4,6 @@ interface Props {
4
4
  onOpenChange: (open: boolean) => void;
5
5
  onSave: (item: AdditionalPackagingInput) => void;
6
6
  }
7
- export declare function AdditionalPackagingDialog({ open, onOpenChange, onSave }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export declare function AdditionalPackagingDialog({ open, onOpenChange, onSave }: Props): import("react").JSX.Element;
8
8
  export {};
9
9
  //# sourceMappingURL=AdditionalPackagingDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdditionalPackagingDialog.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/AdditionalPackagingDialog.tsx"],"names":[],"mappings":"AAeA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AAMpC,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,yBAAyB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,2CA2I9E"}
1
+ {"version":3,"file":"AdditionalPackagingDialog.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/AdditionalPackagingDialog.tsx"],"names":[],"mappings":"AAeA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,4BAA4B,CAAC;AAMpC,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,yBAAyB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,+BA2I9E"}
@@ -2,6 +2,6 @@ interface Props {
2
2
  productId: string | null;
3
3
  floridayId: string | null;
4
4
  }
5
- export declare function ArtikelCompositionCard({ productId, floridayId }: Props): import("react/jsx-runtime").JSX.Element | null;
5
+ export declare function ArtikelCompositionCard({ productId, floridayId }: Props): import("react").JSX.Element | null;
6
6
  export {};
7
7
  //# sourceMappingURL=ArtikelCompositionCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ArtikelCompositionCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ArtikelCompositionCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAqFD,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,kDAgNtE"}
1
+ {"version":3,"file":"ArtikelCompositionCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ArtikelCompositionCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAqFD,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,sCAgNtE"}
@@ -2,5 +2,5 @@ export declare function ArtikelWizard({ draftId: initialDraftId, tradeItemId, pr
2
2
  draftId?: string;
3
3
  tradeItemId?: string;
4
4
  productId?: string;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=ArtikelWizard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ArtikelWizard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ArtikelWizard.tsx"],"names":[],"mappings":"AA0KA,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EAAE,cAAc,EACvB,WAAW,EACX,SAAS,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,2CAkmDrE"}
1
+ {"version":3,"file":"ArtikelWizard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ArtikelWizard.tsx"],"names":[],"mappings":"AAgLA,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EAAE,cAAc,EACvB,WAAW,EACX,SAAS,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,+BA0mDrE"}
@@ -78,6 +78,11 @@ function warehouseSubLabel(raw) {
78
78
  const city = addr.city ?? "";
79
79
  return [line, city].filter(Boolean).join(", ") || undefined;
80
80
  }
81
+ function asPlainRecord(value) {
82
+ return value && typeof value === "object" && !Array.isArray(value)
83
+ ? value
84
+ : {};
85
+ }
81
86
  async function lookupProductGroupForVbn(vbnCode) {
82
87
  const code = String(vbnCode ?? "").trim();
83
88
  if (!code)
@@ -257,7 +262,7 @@ export function ArtikelWizard({ draftId: initialDraftId, tradeItemId, productId,
257
262
  try {
258
263
  const { data: product, error } = await supabase
259
264
  .from("products")
260
- .select("id,product,barcode,article_number,quantity,sale_price,vat_rate,vat_code,image_url,plants_per_crate,crates_per_layer,layers_per_cart,floriday_active,floriday_trade_item_id,floriday_payload")
265
+ .select("id,product,barcode,article_number,quantity,image_url,plants_per_crate,crates_per_layer,layers_per_cart,trade_item_key,floriday_trade_item_id,custom_fields")
261
266
  .eq("id", productId)
262
267
  .maybeSingle();
263
268
  if (cancelled)
@@ -274,9 +279,15 @@ export function ArtikelWizard({ draftId: initialDraftId, tradeItemId, productId,
274
279
  const ppc = Number(product.plants_per_crate) || 0;
275
280
  const cpl = Number(product.crates_per_layer) || 0;
276
281
  const lpc = Number(product.layers_per_cart) || 0;
277
- const payload = (product.floriday_payload ?? {});
278
- const fid = (product.floriday_trade_item_id ?? null);
279
- const fActive = Boolean(product.floriday_active);
282
+ const customFields = asPlainRecord(product.custom_fields);
283
+ const payload = asPlainRecord(customFields.floriday_payload);
284
+ const productTradeItemKey = String(product.trade_item_key ?? "");
285
+ const fid = ((product.floriday_trade_item_id ??
286
+ customFields.floriday_id ??
287
+ (productTradeItemKey && !productTradeItemKey.startsWith("product:")
288
+ ? productTradeItemKey
289
+ : null)) || null);
290
+ const fActive = Boolean(fid);
280
291
  // Floriday-cache + warehouse-voorkeur parallel ophalen wanneer we een
281
292
  // gekoppeld trade-item hebben. Missing cache blokkeert de wizard niet;
282
293
  // dan valt hij terug op wat er lokaal is opgeslagen.
@@ -402,17 +413,19 @@ export function ArtikelWizard({ draftId: initialDraftId, tradeItemId, productId,
402
413
  : validGtin
403
414
  ? barcode
404
415
  : (payload.gtin ?? ""),
405
- salePricePerPiece: Number(product.sale_price ?? payload.salePricePerPiece) || 0,
416
+ salePricePerPiece: Number(customFields.sale_price ?? customFields.salePrice ?? payload.salePricePerPiece) || 0,
406
417
  // Voorkeur: werkelijke voorraad uit trade_item_stock.
407
418
  // Fallback: opgeslagen payload-waarde. `products.quantity` wordt
408
419
  // bewust NIET meer gelezen — die staat structureel op 0.
409
420
  saleStockPieces: physical > 0
410
421
  ? physical
411
422
  : Number(payload.saleStockPieces ?? 0) || 0,
412
- vatRate: product.vat_rate !== null && product.vat_rate !== undefined
413
- ? Number(product.vat_rate)
423
+ vatRate: customFields.vat_rate !== null && customFields.vat_rate !== undefined
424
+ ? Number(customFields.vat_rate)
414
425
  : (payload.vatRate ?? null),
415
- vatCode: product.vat_code ?? payload.vatCode ?? null,
426
+ vatCode: (customFields.vat_code ?? customFields.vatCode) ??
427
+ payload.vatCode ??
428
+ null,
416
429
  warehouseId: warehousePref ||
417
430
  cacheWarehouseId ||
418
431
  payloadWarehouseId ||
@@ -2,5 +2,5 @@ import type { FloridayActiveConnection } from "../../lib/floriday-client";
2
2
  export declare function ConnectionBadge({ connection, loading, }: {
3
3
  connection: FloridayActiveConnection | null;
4
4
  loading?: boolean;
5
- }): import("react/jsx-runtime").JSX.Element;
5
+ }): import("react").JSX.Element;
6
6
  //# sourceMappingURL=ConnectionBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConnectionBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ConnectionBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CAqBA"}
1
+ {"version":3,"file":"ConnectionBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ConnectionBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE1E,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,+BAqBA"}
@@ -1,4 +1,4 @@
1
1
  export declare function EditArtikelPage({ id }: {
2
2
  id: string;
3
- }): import("react/jsx-runtime").JSX.Element;
3
+ }): import("react").JSX.Element;
4
4
  //# sourceMappingURL=EditArtikelPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/EditArtikelPage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,2CA4ErD"}
1
+ {"version":3,"file":"EditArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/EditArtikelPage.tsx"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,+BAmFrD"}
@@ -1,8 +1,9 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Card } from "@flowselections/core";
4
4
  import { Loader2 } from "lucide-react";
5
5
  import { ArtikelWizard } from "./ArtikelWizard";
6
+ import { ProductCustomFieldsCard } from "./ProductCustomFieldsCard";
6
7
  import { supabase } from "../../integrations/supabase/client";
7
8
  export function EditArtikelPage({ id }) {
8
9
  const [resolved, setResolved] = useState(null);
@@ -62,7 +63,7 @@ export function EditArtikelPage({ id }) {
62
63
  return (_jsx("main", { className: "p-6", children: _jsxs(Card, { className: "p-6 text-sm space-y-1", children: [_jsx("div", { children: "Artikel niet gevonden." }), resolved.reason && (_jsx("div", { className: "text-muted-foreground", children: resolved.reason }))] }) }));
63
64
  }
64
65
  if (resolved.kind === "product") {
65
- return _jsx(ArtikelWizard, { productId: resolved.id });
66
+ return (_jsxs(_Fragment, { children: [_jsx(ArtikelWizard, { productId: resolved.id }), _jsx("div", { className: "p-6 pt-0", children: _jsx(ProductCustomFieldsCard, { productId: resolved.id }) })] }));
66
67
  }
67
68
  return _jsx(ArtikelWizard, { tradeItemId: resolved.id });
68
69
  }
@@ -3,5 +3,5 @@ export declare function ExcelExportButton({ items, filename, onExported, }: {
3
3
  items: TradeItem[];
4
4
  filename?: string;
5
5
  onExported?: () => void | Promise<void>;
6
- }): import("react/jsx-runtime").JSX.Element;
6
+ }): import("react").JSX.Element;
7
7
  //# sourceMappingURL=ExcelExportButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExcelExportButton.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ExcelExportButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAqB,EACrB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,2CAgDA"}
1
+ {"version":3,"file":"ExcelExportButton.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ExcelExportButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAqB,EACrB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,+BAgDA"}
@@ -7,6 +7,6 @@ interface Props {
7
7
  gtin?: string | null;
8
8
  };
9
9
  }
10
- export declare function FloridayInfoCard({ floridayTradeItemId, local }: Props): import("react/jsx-runtime").JSX.Element | null;
10
+ export declare function FloridayInfoCard({ floridayTradeItemId, local }: Props): import("react").JSX.Element | null;
11
11
  export {};
12
12
  //# sourceMappingURL=FloridayInfoCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloridayInfoCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/FloridayInfoCard.tsx"],"names":[],"mappings":"AAYA,UAAU,KAAK;IACb,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,8EAA8E;IAC9E,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH;AA6DD,wBAAgB,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,KAAK,kDAqRrE"}
1
+ {"version":3,"file":"FloridayInfoCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/FloridayInfoCard.tsx"],"names":[],"mappings":"AAYA,UAAU,KAAK;IACb,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,8EAA8E;IAC9E,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC;CACH;AA6DD,wBAAgB,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,KAAK,sCAqRrE"}
@@ -1,4 +1,4 @@
1
1
  export declare function FloridayStatusBadge({ active }: {
2
2
  active: boolean | undefined;
3
- }): import("react/jsx-runtime").JSX.Element;
3
+ }): import("react").JSX.Element;
4
4
  //# sourceMappingURL=FloridayStatusBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FloridayStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/FloridayStatusBadge.tsx"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,2CAa9E"}
1
+ {"version":3,"file":"FloridayStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/FloridayStatusBadge.tsx"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,+BAa9E"}
@@ -1,2 +1,2 @@
1
- export declare function NieuwArtikelPage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function NieuwArtikelPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=NieuwArtikelPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NieuwArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/NieuwArtikelPage.tsx"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,4CAE/B"}
1
+ {"version":3,"file":"NieuwArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/NieuwArtikelPage.tsx"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,gCAE/B"}
@@ -3,6 +3,6 @@ interface Props {
3
3
  productName: string | null;
4
4
  productId?: string | null;
5
5
  }
6
- export declare function OrderHistoryCard({ tradeItemKey, productName, productId }: Props): import("react/jsx-runtime").JSX.Element;
6
+ export declare function OrderHistoryCard({ tradeItemKey, productName, productId }: Props): import("react").JSX.Element;
7
7
  export {};
8
8
  //# sourceMappingURL=OrderHistoryCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrderHistoryCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/OrderHistoryCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,2CAoK/E"}
1
+ {"version":3,"file":"OrderHistoryCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/OrderHistoryCard.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,KAAK,+BAoK/E"}
@@ -2,6 +2,6 @@ type Props = {
2
2
  tradeItemId: string | null | undefined;
3
3
  offerForSale: boolean;
4
4
  };
5
- export declare function PriceStatusBadge({ tradeItemId, offerForSale }: Props): import("react/jsx-runtime").JSX.Element | null;
5
+ export declare function PriceStatusBadge({ tradeItemId, offerForSale }: Props): import("react").JSX.Element | null;
6
6
  export {};
7
7
  //# sourceMappingURL=PriceStatusBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAGA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,KAAK,kDAkEpE"}
1
+ {"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAGA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,KAAK,sCAkEpE"}
@@ -0,0 +1,5 @@
1
+ /** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
2
+ export declare function ProductCustomFieldsCard({ productId }: {
3
+ productId: string;
4
+ }): import("react").JSX.Element | null;
5
+ //# sourceMappingURL=ProductCustomFieldsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductCustomFieldsCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductCustomFieldsCard.tsx"],"names":[],"mappings":"AAyBA,wFAAwF;AACxF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,sCA6H3E"}
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Checkbox, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
4
+ import { Loader2, Save } from "lucide-react";
5
+ import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
6
+ import { fetchProductCustomValues, saveProductCustomValues, } from "../../lib/voorraad-custom-fields";
7
+ /** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
8
+ export function ProductCustomFieldsCard({ productId }) {
9
+ const { fields, loading } = useVoorraadCustomFields();
10
+ const [values, setValues] = useState({});
11
+ const [loadingValues, setLoadingValues] = useState(true);
12
+ const [saving, setSaving] = useState(false);
13
+ useEffect(() => {
14
+ let cancelled = false;
15
+ setLoadingValues(true);
16
+ fetchProductCustomValues(productId)
17
+ .then((v) => {
18
+ if (!cancelled)
19
+ setValues(v);
20
+ })
21
+ .catch(() => {
22
+ if (!cancelled)
23
+ setValues({});
24
+ })
25
+ .finally(() => {
26
+ if (!cancelled)
27
+ setLoadingValues(false);
28
+ });
29
+ return () => {
30
+ cancelled = true;
31
+ };
32
+ }, [productId]);
33
+ const detailFields = fields.filter((f) => f.show_in_detail);
34
+ if (loading || loadingValues) {
35
+ return null;
36
+ }
37
+ if (detailFields.length === 0)
38
+ return null;
39
+ const set = (key, value) => setValues((prev) => ({ ...prev, [key]: value }));
40
+ const save = async () => {
41
+ setSaving(true);
42
+ try {
43
+ await saveProductCustomValues(productId, Object.fromEntries(detailFields.map((f) => [f.field_key, values[f.field_key] ?? null])));
44
+ toast.success("Eigen velden opgeslagen");
45
+ }
46
+ catch (e) {
47
+ toast.error(`Opslaan mislukt: ${e.message}`);
48
+ }
49
+ finally {
50
+ setSaving(false);
51
+ }
52
+ };
53
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Eigen velden" }), _jsx(CardDescription, { children: "Extra voorraadvelden zoals ingesteld bij Instellingen \u2192 Voorraadvelden." })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: detailFields.map((f) => {
54
+ const v = values[f.field_key];
55
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: `cf-${f.field_key}`, children: f.field_label }), f.field_type === "boolean" ? (_jsx("div", { className: "pt-1", children: _jsx(Checkbox, { id: `cf-${f.field_key}`, checked: v === true, onCheckedChange: (c) => set(f.field_key, c === true) }) })) : f.field_type === "select" ? (_jsxs(Select, { value: typeof v === "string" ? v : "", onValueChange: (val) => set(f.field_key, val), children: [_jsx(SelectTrigger, { id: `cf-${f.field_key}`, children: _jsx(SelectValue, { placeholder: "Kies\u2026" }) }), _jsx(SelectContent, { children: f.options.map((o) => (_jsx(SelectItem, { value: o, children: o }, o))) })] })) : (_jsx(Input, { id: `cf-${f.field_key}`, type: f.field_type === "number"
56
+ ? "number"
57
+ : f.field_type === "date"
58
+ ? "date"
59
+ : "text", value: v === null || v === undefined ? "" : String(v), onChange: (e) => set(f.field_key, f.field_type === "number"
60
+ ? e.target.value === ""
61
+ ? null
62
+ : Number(e.target.value)
63
+ : e.target.value) }))] }, f.id));
64
+ }) }), _jsxs(Button, { onClick: save, disabled: saving, children: [saving ? (_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" })) : (_jsx(Save, { className: "mr-2 h-4 w-4" })), "Eigen velden opslaan"] })] })] }));
65
+ }
@@ -8,6 +8,6 @@ interface Props {
8
8
  * Koppelt ERP-`products` rijen aan één Floriday-voorraadrij (`trade_item_key`).
9
9
  * Zonder koppeling doen bestel-triggers niets voor mailbox/manual-orders.
10
10
  */
11
- export declare function ProductLinkCard({ tradeItemKey, productName }: Props): import("react/jsx-runtime").JSX.Element;
11
+ export declare function ProductLinkCard({ tradeItemKey, productName }: Props): import("react").JSX.Element;
12
12
  export {};
13
13
  //# sourceMappingURL=ProductLinkCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductLinkCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductLinkCard.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,qFAAqF;IACrF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,2CA4OnE"}
1
+ {"version":3,"file":"ProductLinkCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductLinkCard.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,qFAAqF;IACrF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,+BA4OnE"}
@@ -5,6 +5,6 @@ interface Props {
5
5
  packings: PackingConfigurationInput[];
6
6
  packagingTypeLabel: (code: string) => string;
7
7
  }
8
- export declare function StepSamenstelling({ productId, floridayId, packings, packagingTypeLabel, }: Props): import("react/jsx-runtime").JSX.Element;
8
+ export declare function StepSamenstelling({ productId, floridayId, packings, packagingTypeLabel, }: Props): import("react").JSX.Element;
9
9
  export {};
10
10
  //# sourceMappingURL=StepSamenstelling.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StepSamenstelling.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StepSamenstelling.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAsB5E,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAUD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,GACnB,EAAE,KAAK,2CA+ZP"}
1
+ {"version":3,"file":"StepSamenstelling.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StepSamenstelling.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAsB5E,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,yBAAyB,EAAE,CAAC;IACtC,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAUD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,GACnB,EAAE,KAAK,+BA+ZP"}
@@ -3,5 +3,5 @@ export declare function StockBulkButtons({ items, activeConnectionId, onImported
3
3
  items: TradeItem[];
4
4
  activeConnectionId: string | null;
5
5
  onImported: () => void | Promise<void>;
6
- }): import("react/jsx-runtime").JSX.Element;
6
+ }): import("react").JSX.Element;
7
7
  //# sourceMappingURL=StockBulkButtons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StockBulkButtons.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StockBulkButtons.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoF3D,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,2CAikBA"}
1
+ {"version":3,"file":"StockBulkButtons.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StockBulkButtons.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAsF3D,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,kBAAkB,EAClB,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,+BAmoBA"}
@@ -9,6 +9,8 @@ import { upsertLocalTradeItem, updateDraftMeta } from "../../hooks/useLocalTrade
9
9
  import { validateDraftForPublish } from "../../lib/floriday-import-validator";
10
10
  import { floriday } from "../../lib/floriday-client";
11
11
  import { ensureArticleCodes } from "../../lib/ensure-article-codes";
12
+ import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
13
+ import { saveProductCustomValues } from "../../lib/voorraad-custom-fields";
12
14
  const COLUMNS = [
13
15
  "Artikelcode",
14
16
  "Artikelnaam",
@@ -61,6 +63,34 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
61
63
  const [autoPublish, setAutoPublish] = useState(false);
62
64
  const [result, setResult] = useState(null);
63
65
  const [pastRuns, setPastRuns] = useState([]);
66
+ const { fields: customFields } = useVoorraadCustomFields();
67
+ const templateFields = customFields.filter((f) => f.show_in_template);
68
+ /**
69
+ * Leest de waarde van een eigen veld uit een Excel-rij. Kolomkoppen worden
70
+ * tolerant gematcht: op label óf key, hoofdletter- en spatie-ongevoelig.
71
+ */
72
+ const readCustomValues = useCallback((row) => {
73
+ const norm = (s) => s.toLowerCase().replace(/[\s_-]+/g, "");
74
+ const lookup = new Map();
75
+ for (const [k, v] of Object.entries(row))
76
+ lookup.set(norm(k), v);
77
+ const patch = {};
78
+ for (const f of customFields) {
79
+ const raw = lookup.get(norm(f.field_label)) ?? lookup.get(norm(f.field_key));
80
+ if (raw === undefined)
81
+ continue;
82
+ const str = String(raw ?? "").trim();
83
+ patch[f.field_key] =
84
+ str === ""
85
+ ? null
86
+ : f.field_type === "number"
87
+ ? Number(str.replace(",", "."))
88
+ : f.field_type === "boolean"
89
+ ? ["ja", "true", "1", "yes"].includes(str.toLowerCase())
90
+ : str;
91
+ }
92
+ return patch;
93
+ }, [customFields]);
64
94
  const loadPastRuns = useCallback(async () => {
65
95
  const { data, error } = await supabase
66
96
  .from("stock_import_runs")
@@ -115,6 +145,12 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
115
145
  const generatedCount = exportItems.filter((i, idx) => i.articleNumber !== items[idx].articleNumber).length;
116
146
  const rows = exportItems.map((i) => {
117
147
  const d = i.raw?.data;
148
+ const cf = (i.raw?.custom_fields ?? {});
149
+ const extra = {};
150
+ for (const f of templateFields) {
151
+ const v = cf[f.field_key];
152
+ extra[f.field_label] = v === null || v === undefined ? "" : v;
153
+ }
118
154
  return {
119
155
  Artikelcode: i.articleNumber,
120
156
  Artikelnaam: i.name,
@@ -126,10 +162,12 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
126
162
  "Minimum voorraad": i.minQuantity,
127
163
  "Gereserveerde voorraad": i.reservedQuantity,
128
164
  "Inkomende voorraad": i.incomingQuantity,
165
+ ...extra,
129
166
  };
130
167
  });
131
- const ws = XLSX.utils.json_to_sheet(rows, { header: [...COLUMNS] });
132
- ws["!cols"] = COLUMNS.map((c) => ({
168
+ const headers = [...COLUMNS, ...templateFields.map((f) => f.field_label)];
169
+ const ws = XLSX.utils.json_to_sheet(rows, { header: headers });
170
+ ws["!cols"] = headers.map((c) => ({
133
171
  wch: c === "Artikelnaam" ? 40 : c === "Artikelcode" ? 18 : 20,
134
172
  }));
135
173
  const wb = XLSX.utils.book_new();
@@ -257,6 +295,19 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
257
295
  oldReserved: existing.reservedQuantity,
258
296
  newReserved: applied.reserved_stock,
259
297
  });
298
+ // Eigen voorraadvelden uit de template terugschrijven
299
+ const targetProductId = existing.productId ?? existing.localId ?? null;
300
+ if (targetProductId && customFields.length > 0) {
301
+ const patch = readCustomValues(row);
302
+ if (Object.keys(patch).length > 0) {
303
+ try {
304
+ await saveProductCustomValues(targetProductId, patch);
305
+ }
306
+ catch {
307
+ /* eigen velden zijn niet blokkerend voor de voorraadimport */
308
+ }
309
+ }
310
+ }
260
311
  updated++;
261
312
  setProgress(Math.round(((idx + 1) / rows.length) * 100));
262
313
  continue;
@@ -334,6 +385,18 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
334
385
  },
335
386
  });
336
387
  created++;
388
+ // Eigen voorraadvelden ook op nieuw aangemaakte producten zetten
389
+ if (customFields.length > 0) {
390
+ const patch = readCustomValues(row);
391
+ if (Object.keys(patch).length > 0) {
392
+ try {
393
+ await saveProductCustomValues(draftId, patch);
394
+ }
395
+ catch {
396
+ /* niet blokkerend */
397
+ }
398
+ }
399
+ }
337
400
  // Stock koppelen aan het nieuwe product (draftId is nu de product-uuid)
338
401
  const anyStock = stockValues.physical_stock !== null ||
339
402
  stockValues.minimum_stock !== null ||
@@ -8,5 +8,5 @@ export declare function ValidationOverviewTable({ items, connectionId, onChanged
8
8
  items: TradeItem[];
9
9
  connectionId: string | null;
10
10
  onChanged: () => void | Promise<void>;
11
- }): import("react/jsx-runtime").JSX.Element;
11
+ }): import("react").JSX.Element;
12
12
  //# sourceMappingURL=ValidationOverviewTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationOverviewTable.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ValidationOverviewTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAM3D;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,2CA4GA"}
1
+ {"version":3,"file":"ValidationOverviewTable.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ValidationOverviewTable.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAM3D;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,+BAmHA"}
@@ -19,7 +19,10 @@ export function ValidationOverviewTable({ items, connectionId, onChanged, }) {
19
19
  const productId = item.productId ?? item.localId;
20
20
  if (!productId || !connectionId)
21
21
  return;
22
- const payload = item.raw?.floriday_payload ?? item.raw?.data ?? {};
22
+ const payload = item.raw?.custom_fields?.floriday_payload ??
23
+ item.raw?.floriday_payload ??
24
+ item.raw?.data ??
25
+ {};
23
26
  const v = validateDraftForPublish(payload);
24
27
  if (!v.ok) {
25
28
  toast.error("Nog niet compleet: " + v.missing.join(", "));
@@ -47,7 +50,10 @@ export function ValidationOverviewTable({ items, connectionId, onChanged, }) {
47
50
  return (_jsx("div", { className: "p-8 text-center text-sm text-muted-foreground", children: "Alle producten staan actief op Floriday." }));
48
51
  }
49
52
  return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-left", children: _jsxs("tr", { children: [_jsx("th", { className: "p-3", children: "Artikelcode" }), _jsx("th", { className: "p-3", children: "Artikelnaam" }), _jsx("th", { className: "p-3", children: "Floriday-status" }), _jsx("th", { className: "p-3", children: "Ontbrekende Floriday-velden" }), _jsx("th", { className: "p-3 text-right", children: "Acties" })] }) }), _jsx("tbody", { children: rows.map((it) => {
50
- const payload = it.raw?.floriday_payload ?? it.raw?.data ?? {};
53
+ const payload = it.raw?.custom_fields?.floriday_payload ??
54
+ it.raw?.floriday_payload ??
55
+ it.raw?.data ??
56
+ {};
51
57
  const v = validateDraftForPublish(payload);
52
58
  return (_jsxs("tr", { className: "border-t align-top", children: [_jsx("td", { className: "p-3 font-mono text-xs", children: it.articleNumber || "—" }), _jsx("td", { className: "p-3", children: it.name }), _jsx("td", { className: "p-3", children: _jsx(Badge, { className: "bg-slate-500/15 text-slate-700 border-slate-500/30", children: "Niet actief op Floriday" }) }), _jsx("td", { className: "p-3", children: v.missing.length === 0 ? (_jsx("span", { className: "text-xs text-emerald-700", children: "Klaar om te activeren" })) : (_jsx("div", { className: "flex flex-wrap gap-1", children: v.missing.map((m) => (_jsx(Badge, { variant: "outline", className: "text-[10px]", children: m }, m))) })) }), _jsx("td", { className: "p-3", children: _jsxs("div", { className: "flex justify-end gap-1", children: [_jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
53
59
  const target = it.productId ?? it.localId ?? it.id;
@@ -1,2 +1,2 @@
1
- export declare function ValidationPage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function ValidationPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=ValidationPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ValidationPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,4CAiC7B"}
1
+ {"version":3,"file":"ValidationPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ValidationPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,gCAiC7B"}
@@ -6,5 +6,5 @@ import type { TradeItem } from "../../lib/floriday-client";
6
6
  export declare function VoorraadDashboard({ items, connectionId, }: {
7
7
  items: TradeItem[];
8
8
  connectionId: string | null;
9
- }): import("react/jsx-runtime").JSX.Element;
9
+ }): import("react").JSX.Element;
10
10
  //# sourceMappingURL=VoorraadDashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadDashboard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA4B3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,GACb,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,2CAuDA"}
1
+ {"version":3,"file":"VoorraadDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadDashboard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AA4B3D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,YAAY,GACb,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,+BA0DA"}
@@ -23,7 +23,10 @@ export function VoorraadDashboard({ items, connectionId, }) {
23
23
  const missingFields = items.filter((i) => {
24
24
  if (i.floridayActive)
25
25
  return false;
26
- const payload = i.raw?.floriday_payload ?? i.raw?.data ?? {};
26
+ const payload = i.raw?.custom_fields?.floriday_payload ??
27
+ i.raw?.floriday_payload ??
28
+ i.raw?.data ??
29
+ {};
27
30
  return !validateDraftForPublish(payload).ok;
28
31
  }).length;
29
32
  // Nieuw sinds laatste import
@@ -1,2 +1,2 @@
1
- export declare function VoorraadPage(): import("react/jsx-runtime").JSX.Element;
1
+ export declare function VoorraadPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=VoorraadPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPage.tsx"],"names":[],"mappings":"AA4FA,wBAAgB,YAAY,4CAkO3B"}
1
+ {"version":3,"file":"VoorraadPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPage.tsx"],"names":[],"mappings":"AA4FA,wBAAgB,YAAY,gCAkO3B"}
@@ -6,5 +6,5 @@ export interface VoorraadPaginationProps {
6
6
  onPageChange: (page: number) => void;
7
7
  onPageSizeChange: (size: number) => void;
8
8
  }
9
- export declare function VoorraadPagination({ total, page, pageSize, pageSizeOptions, onPageChange, onPageSizeChange, }: VoorraadPaginationProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function VoorraadPagination({ total, page, pageSize, pageSizeOptions, onPageChange, onPageSizeChange, }: VoorraadPaginationProps): import("react").JSX.Element;
10
10
  //# sourceMappingURL=VoorraadPagination.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadPagination.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPagination.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,eAAmC,EACnC,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,2CAuDzB"}
1
+ {"version":3,"file":"VoorraadPagination.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadPagination.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,eAAmC,EACnC,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,+BAuDzB"}
@@ -4,6 +4,6 @@ interface Props {
4
4
  draftId?: string | null;
5
5
  productId?: string | null;
6
6
  }
7
- export declare function VoorraadStockCard({ connectionId, tradeItemId, draftId, productId }: Props): import("react/jsx-runtime").JSX.Element;
7
+ export declare function VoorraadStockCard({ connectionId, tradeItemId, draftId, productId }: Props): import("react").JSX.Element;
8
8
  export {};
9
9
  //# sourceMappingURL=VoorraadStockCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VoorraadStockCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadStockCard.tsx"],"names":[],"mappings":"AAcA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,2CAsHzF"}
1
+ {"version":3,"file":"VoorraadStockCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/VoorraadStockCard.tsx"],"names":[],"mappings":"AAcA,UAAU,KAAK;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,+BAsHzF"}