@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.
- package/dist-lib/components/TemplatePage.d.ts +1 -1
- package/dist-lib/components/TemplatePage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +1 -1
- package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts +1 -1
- package/dist-lib/components/voorraad/ArtikelCompositionCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ArtikelWizard.d.ts +1 -1
- package/dist-lib/components/voorraad/ArtikelWizard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ArtikelWizard.js +21 -8
- package/dist-lib/components/voorraad/ConnectionBadge.d.ts +1 -1
- package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -1
- package/dist-lib/components/voorraad/EditArtikelPage.d.ts +1 -1
- package/dist-lib/components/voorraad/EditArtikelPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/EditArtikelPage.js +3 -2
- package/dist-lib/components/voorraad/ExcelExportButton.d.ts +1 -1
- package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
- package/dist-lib/components/voorraad/FloridayInfoCard.d.ts +1 -1
- package/dist-lib/components/voorraad/FloridayInfoCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +1 -1
- package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -1
- package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts +1 -1
- package/dist-lib/components/voorraad/NieuwArtikelPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/OrderHistoryCard.d.ts +1 -1
- package/dist-lib/components/voorraad/OrderHistoryCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/PriceStatusBadge.d.ts +1 -1
- package/dist-lib/components/voorraad/PriceStatusBadge.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts +5 -0
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -0
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.js +65 -0
- package/dist-lib/components/voorraad/ProductLinkCard.d.ts +1 -1
- package/dist-lib/components/voorraad/ProductLinkCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StepSamenstelling.d.ts +1 -1
- package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockBulkButtons.d.ts +1 -1
- package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockBulkButtons.js +65 -2
- package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +1 -1
- package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ValidationOverviewTable.js +8 -2
- package/dist-lib/components/voorraad/ValidationPage.d.ts +1 -1
- package/dist-lib/components/voorraad/ValidationPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadDashboard.js +4 -1
- package/dist-lib/components/voorraad/VoorraadPage.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadPagination.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadPagination.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadStockCard.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadStockCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadTable.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadTable.js +10 -2
- package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +2 -0
- package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -0
- package/dist-lib/components/voorraad/VoorraadVeldenCard.js +97 -0
- package/dist-lib/hooks/useFloriday.d.ts +6 -6
- package/dist-lib/hooks/useFloriday.d.ts.map +1 -1
- package/dist-lib/hooks/useFloridayVbnRequired.d.ts +2 -2
- package/dist-lib/hooks/useFloridayVbnRequired.d.ts.map +1 -1
- package/dist-lib/hooks/useLocalTradeItems.d.ts +4 -4
- package/dist-lib/hooks/useLocalTradeItems.d.ts.map +1 -1
- package/dist-lib/hooks/useLocalTradeItems.js +59 -35
- package/dist-lib/hooks/useTradeItemSupplyLine.d.ts +1 -1
- package/dist-lib/hooks/useTradeItemSupplyLine.d.ts.map +1 -1
- package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts +1 -1
- package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts.map +1 -1
- package/dist-lib/hooks/useVoorraadCustomFields.d.ts +9 -0
- package/dist-lib/hooks/useVoorraadCustomFields.d.ts.map +1 -0
- package/dist-lib/hooks/useVoorraadCustomFields.js +26 -0
- package/dist-lib/index.d.ts +2 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +4 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +2358 -177
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +2358 -177
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +2358 -177
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +2428 -174
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +49 -0
- package/dist-lib/lib/floricode-required-features.functions.d.ts +2373 -198
- package/dist-lib/lib/floricode-required-features.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-customer-offer.functions.d.ts +2375 -192
- package/dist-lib/lib/floriday-customer-offer.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-gateway.functions.d.ts +49617 -38712
- package/dist-lib/lib/floriday-gateway.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-vbn-required.functions.d.ts +13843 -9481
- package/dist-lib/lib/floriday-vbn-required.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-warehouse.functions.d.ts +25719 -19176
- package/dist-lib/lib/floriday-warehouse.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +13826 -9464
- package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
- package/dist-lib/lib/voorraad-custom-fields.d.ts +22 -0
- package/dist-lib/lib/voorraad-custom-fields.d.ts.map +1 -0
- package/dist-lib/lib/voorraad-custom-fields.js +71 -0
- package/package.json +1 -1
- package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +0 -2
- package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +0 -1
- package/dist-lib/components/settings/VoorraadSettingsCard.js +0 -39
- package/dist-lib/components/voorraad/ConnectionPicker.d.ts +0 -8
- package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +0 -1
- package/dist-lib/components/voorraad/ConnectionPicker.js +0 -8
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function TemplatePage(): import("react
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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":"
|
|
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,
|
|
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
|
|
278
|
-
const
|
|
279
|
-
const
|
|
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(
|
|
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:
|
|
413
|
-
? Number(
|
|
423
|
+
vatRate: customFields.vat_rate !== null && customFields.vat_rate !== undefined
|
|
424
|
+
? Number(customFields.vat_rate)
|
|
414
425
|
: (payload.vatRate ?? null),
|
|
415
|
-
vatCode:
|
|
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
|
|
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
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/EditArtikelPage.tsx"],"names":[],"mappings":"
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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 +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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
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
|
|
132
|
-
ws
|
|
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
|
|
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
|
|
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 ??
|
|
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 ??
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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 ??
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"}
|