@flowselections/floriday-voorraad 1.0.76 → 1.0.78
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 +2 -0
- package/dist-lib/components/TemplatePage.d.ts.map +1 -0
- package/dist-lib/components/TemplatePage.js +4 -0
- package/dist-lib/components/settings/VoorraadSettingsCard.d.ts +2 -0
- package/dist-lib/components/settings/VoorraadSettingsCard.d.ts.map +1 -0
- package/dist-lib/components/settings/VoorraadSettingsCard.js +39 -0
- package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts +2 -2
- package/dist-lib/components/voorraad/AdditionalPackagingDialog.d.ts.map +1 -1
- package/dist-lib/components/voorraad/AdditionalPackagingDialog.js +2 -2
- 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/ArtikelCompositionCard.js +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 +49 -49
- package/dist-lib/components/voorraad/CollapsibleText.d.ts +1 -1
- package/dist-lib/components/voorraad/CollapsibleText.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ConnectionBadge.d.ts +6 -0
- package/dist-lib/components/voorraad/ConnectionBadge.d.ts.map +1 -0
- package/dist-lib/components/voorraad/ConnectionBadge.js +12 -0
- package/dist-lib/components/voorraad/ConnectionPicker.d.ts +8 -0
- package/dist-lib/components/voorraad/ConnectionPicker.d.ts.map +1 -0
- package/dist-lib/components/voorraad/ConnectionPicker.js +8 -0
- 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 +4 -4
- package/dist-lib/components/voorraad/ExcelExportButton.d.ts +2 -2
- package/dist-lib/components/voorraad/ExcelExportButton.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ExcelExportButton.js +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/FloridayInfoCard.js +3 -3
- package/dist-lib/components/voorraad/FloridaySentCard.d.ts +1 -1
- package/dist-lib/components/voorraad/FloridaySentCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/FloridaySentCard.js +4 -4
- package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts +4 -0
- package/dist-lib/components/voorraad/FloridayStatusBadge.d.ts.map +1 -0
- package/dist-lib/components/voorraad/FloridayStatusBadge.js +8 -0
- package/dist-lib/components/voorraad/FustenPage.d.ts +1 -1
- package/dist-lib/components/voorraad/FustenPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/FustenPage.js +4 -4
- package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts +2 -2
- package/dist-lib/components/voorraad/InventorySettingsDrawer.d.ts.map +1 -1
- package/dist-lib/components/voorraad/InventorySettingsDrawer.js +3 -3
- package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts +3 -3
- package/dist-lib/components/voorraad/InventoryStatusBadge.d.ts.map +1 -1
- package/dist-lib/components/voorraad/InventoryStatusBadge.js +2 -2
- package/dist-lib/components/voorraad/ModuleHealthCard.d.ts +2 -0
- package/dist-lib/components/voorraad/ModuleHealthCard.d.ts.map +1 -0
- package/dist-lib/components/voorraad/ModuleHealthCard.js +40 -0
- 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/NieuwArtikelPage.js +3 -3
- 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/OrderHistoryCard.js +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 +1 -1
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductCustomFieldsCard.js +2 -2
- 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/ProductLinkCard.js +6 -6
- package/dist-lib/components/voorraad/ProductSalePriceField.d.ts +2 -2
- package/dist-lib/components/voorraad/ProductSalePriceField.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductSalePriceField.js +2 -2
- package/dist-lib/components/voorraad/ProductStructureCard.d.ts +2 -2
- package/dist-lib/components/voorraad/ProductStructureCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ProductStructureCard.js +3 -3
- package/dist-lib/components/voorraad/PublicatiesPage.d.ts +1 -1
- package/dist-lib/components/voorraad/PublicatiesPage.d.ts.map +1 -1
- package/dist-lib/components/voorraad/PublicatiesPage.js +2 -2
- package/dist-lib/components/voorraad/PublishProgressCard.d.ts +2 -2
- package/dist-lib/components/voorraad/PublishProgressCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/PublishReadinessCard.d.ts +2 -2
- package/dist-lib/components/voorraad/PublishReadinessCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StepSamenstelling.d.ts +2 -2
- package/dist-lib/components/voorraad/StepSamenstelling.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StepSamenstelling.js +98 -1
- package/dist-lib/components/voorraad/StockBulkButtons.d.ts +2 -2
- package/dist-lib/components/voorraad/StockBulkButtons.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockBulkButtons.js +6 -6
- package/dist-lib/components/voorraad/StockHistoryChart.d.ts +1 -1
- package/dist-lib/components/voorraad/StockHistoryChart.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockHistoryChart.js +1 -1
- package/dist-lib/components/voorraad/StockIntegrityAlert.d.ts +1 -1
- package/dist-lib/components/voorraad/StockIntegrityAlert.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockIntegrityAlert.js +1 -1
- package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts +1 -1
- package/dist-lib/components/voorraad/StockMutationHistoryCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockMutationHistoryCard.js +2 -2
- package/dist-lib/components/voorraad/StockPushMonitor.d.ts +1 -1
- package/dist-lib/components/voorraad/StockPushMonitor.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockPushMonitor.js +8 -8
- package/dist-lib/components/voorraad/StockSyncStatus.d.ts +1 -1
- package/dist-lib/components/voorraad/StockSyncStatus.d.ts.map +1 -1
- package/dist-lib/components/voorraad/StockSyncStatus.js +2 -2
- package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts +1 -1
- package/dist-lib/components/voorraad/SupplyReadScopeAlert.d.ts.map +1 -1
- package/dist-lib/components/voorraad/SupplyReadScopeAlert.js +1 -1
- package/dist-lib/components/voorraad/TrayStickerCard.d.ts +1 -1
- package/dist-lib/components/voorraad/TrayStickerCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts +2 -2
- package/dist-lib/components/voorraad/ValidationOverviewTable.d.ts.map +1 -1
- package/dist-lib/components/voorraad/ValidationOverviewTable.js +5 -5
- 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/ValidationPage.js +3 -3
- package/dist-lib/components/voorraad/VoorraadDashboard.d.ts +10 -0
- package/dist-lib/components/voorraad/VoorraadDashboard.d.ts.map +1 -0
- package/dist-lib/components/voorraad/VoorraadDashboard.js +53 -0
- 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/VoorraadPage.js +35 -16
- 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/VoorraadStockCard.js +3 -3
- package/dist-lib/components/voorraad/VoorraadTable.d.ts +3 -3
- package/dist-lib/components/voorraad/VoorraadTable.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadTable.js +122 -39
- package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts +1 -1
- package/dist-lib/components/voorraad/VoorraadVeldenCard.d.ts.map +1 -1
- package/dist-lib/components/voorraad/VoorraadVeldenCard.js +2 -2
- package/dist-lib/hooks/useFloriday.d.ts +1 -1
- package/dist-lib/hooks/useFloriday.js +4 -4
- package/dist-lib/hooks/useFloridayConnection.d.ts +1 -1
- package/dist-lib/hooks/useFloridayConnection.js +1 -1
- package/dist-lib/hooks/useFloridayContinuousStock.js +1 -1
- package/dist-lib/hooks/useFloridayPriceGroups.js +1 -1
- package/dist-lib/hooks/useFloridayVbnRequired.js +1 -1
- package/dist-lib/hooks/useFlorydayCustomers.js +1 -1
- package/dist-lib/hooks/useFusten.d.ts +1 -1
- package/dist-lib/hooks/useFusten.js +2 -2
- package/dist-lib/hooks/useInventorySettings.d.ts +1 -1
- package/dist-lib/hooks/useInventorySettings.js +1 -1
- package/dist-lib/hooks/useLocalTradeItems.d.ts +2 -2
- package/dist-lib/hooks/useLocalTradeItems.js +3 -3
- package/dist-lib/hooks/usePublishJob.d.ts +1 -1
- package/dist-lib/hooks/usePublishJob.js +2 -2
- package/dist-lib/hooks/useStockPushJobs.js +1 -1
- package/dist-lib/hooks/useStockSyncHealth.js +1 -1
- package/dist-lib/hooks/useTradeItemSpec.d.ts +2 -2
- package/dist-lib/hooks/useTradeItemStock.js +3 -3
- package/dist-lib/hooks/useVbnRegulatoryFeatures.d.ts +1 -1
- package/dist-lib/hooks/useVbnRegulatoryFeatures.js +1 -1
- package/dist-lib/hooks/useVoorraadCustomFields.d.ts +1 -1
- package/dist-lib/hooks/useVoorraadCustomFields.js +1 -1
- package/dist-lib/hooks/useVoorraadData.d.ts +1 -1
- package/dist-lib/hooks/useVoorraadData.js +6 -6
- package/dist-lib/hooks-entry.d.ts +5 -5
- package/dist-lib/hooks-entry.js +5 -5
- package/dist-lib/index.d.ts +11 -11
- package/dist-lib/index.js +12 -12
- package/dist-lib/integrations/supabase/auth-attacher.js +1 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.js +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +450 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/__tests__/floricode-required-features.test.js +1 -1
- package/dist-lib/lib/__tests__/floriday-base-supply.test.js +1 -1
- package/dist-lib/lib/base-supply-reader.server.js +2 -2
- package/dist-lib/lib/ensure-article-codes.d.ts +1 -1
- package/dist-lib/lib/ensure-article-codes.js +1 -1
- package/dist-lib/lib/floricode-client.js +1 -1
- package/dist-lib/lib/floriday-2026v1.server.js +2 -2
- package/dist-lib/lib/floriday-client.d.ts +2 -2
- package/dist-lib/lib/floriday-client.js +2 -2
- package/dist-lib/lib/floriday-customer-offer.functions.d.ts +1 -1
- package/dist-lib/lib/floriday-customer-offer.functions.js +4 -4
- package/dist-lib/lib/floriday-env.functions.d.ts +4 -4
- package/dist-lib/lib/floriday-env.functions.js +4 -4
- package/dist-lib/lib/floriday-env.server.d.ts +2 -2
- package/dist-lib/lib/floriday-env.server.js +2 -2
- package/dist-lib/lib/floriday-field-sources.d.ts +18 -0
- package/dist-lib/lib/floriday-field-sources.d.ts.map +1 -0
- package/dist-lib/lib/floriday-field-sources.js +45 -0
- package/dist-lib/lib/floriday-gateway.functions.d.ts +10 -10
- package/dist-lib/lib/floriday-gateway.functions.js +14 -14
- package/dist-lib/lib/floriday-gateway.server.d.ts +1 -1
- package/dist-lib/lib/floriday-gateway.server.js +9 -9
- package/dist-lib/lib/floriday-import-validator.d.ts +1 -1
- package/dist-lib/lib/floriday-readiness.server.d.ts +1 -1
- package/dist-lib/lib/floriday-readiness.server.js +2 -2
- package/dist-lib/lib/floriday-relink.js +1 -1
- package/dist-lib/lib/floriday-schema-to-zod.d.ts +9 -0
- package/dist-lib/lib/floriday-schema-to-zod.d.ts.map +1 -0
- package/dist-lib/lib/floriday-schema-to-zod.js +53 -0
- package/dist-lib/lib/floriday-stock-supply.server.d.ts +1 -1
- package/dist-lib/lib/floriday-stock-supply.server.js +2 -2
- package/dist-lib/lib/floriday-supply-line.js +2 -2
- package/dist-lib/lib/floriday-vbn-required.functions.d.ts +2 -2
- package/dist-lib/lib/floriday-vbn-required.functions.js +2 -2
- package/dist-lib/lib/floriday-warehouse.functions.d.ts +6 -6
- package/dist-lib/lib/floriday-warehouse.functions.js +7 -7
- package/dist-lib/lib/floriday-write-gate.server.js +1 -1
- package/dist-lib/lib/floriday-writes.functions.d.ts +2 -2
- package/dist-lib/lib/floriday-writes.functions.js +6 -6
- package/dist-lib/lib/fusten.d.ts +1 -1
- package/dist-lib/lib/fusten.js +2 -2
- package/dist-lib/lib/inventory-settings.functions.js +1 -1
- package/dist-lib/lib/logistics-buffer-events.server.js +2 -2
- package/dist-lib/lib/logistics-events.js +2 -2
- package/dist-lib/lib/logistics-tasks.server.js +5 -5
- package/dist-lib/lib/merge-products.d.ts +8 -0
- package/dist-lib/lib/merge-products.d.ts.map +1 -0
- package/dist-lib/lib/merge-products.js +17 -0
- package/dist-lib/lib/module-health.functions.d.ts +53497 -0
- package/dist-lib/lib/module-health.functions.d.ts.map +1 -0
- package/dist-lib/lib/module-health.functions.js +261 -0
- package/dist-lib/lib/module-runtime-config.functions.d.ts +1 -1
- package/dist-lib/lib/module-runtime-config.functions.js +2 -2
- package/dist-lib/lib/module-runtime.server.js +1 -1
- package/dist-lib/lib/product-packing.js +1 -1
- package/dist-lib/lib/product-types.js +1 -1
- package/dist-lib/lib/publish-pipeline.d.ts +1 -1
- package/dist-lib/lib/publish-pipeline.js +2 -2
- package/dist-lib/lib/publish-readiness.d.ts +2 -2
- package/dist-lib/lib/trade-item-prices.d.ts +1 -1
- package/dist-lib/lib/trade-item-prices.js +2 -2
- package/dist-lib/lib/validationSchemas.d.ts +15 -0
- package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
- package/dist-lib/lib/validationSchemas.js +25 -0
- package/dist-lib/lib/voorraad-custom-fields.js +1 -1
- package/dist-lib/server-hooks/floriday-base-supply.js +1 -1
- package/dist-lib/server-hooks/floriday-continuous-stock-pull.js +1 -1
- package/dist-lib/server-hooks/floriday-continuous-stock.js +1 -1
- package/dist-lib/server-hooks/floriday-stock-reconcile.js +1 -1
- package/dist-lib/server-hooks/logistics-tasks-run.js +1 -1
- package/package.json +2 -2
|
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Boxes, Minus, Plus, RefreshCw, Search } from "lucide-react";
|
|
4
4
|
import { Button, Card, Input, Badge, toast } from "@flowselections/core";
|
|
5
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
6
|
-
import { useFloridayConnection } from "../../hooks/useFloridayConnection";
|
|
7
|
-
import { useFusten } from "../../hooks/useFusten";
|
|
8
|
-
import { fetchFustMutations, formatFustDimensions, } from "../../lib/fusten";
|
|
5
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
6
|
+
import { useFloridayConnection } from "../../hooks/useFloridayConnection.js";
|
|
7
|
+
import { useFusten } from "../../hooks/useFusten.js";
|
|
8
|
+
import { fetchFustMutations, formatFustDimensions, } from "../../lib/fusten.js";
|
|
9
9
|
/** Afmetingen tonen en handmatig aanvullen wanneer de catalogus ze niet kent. */
|
|
10
10
|
function DimensionCell({ fust, onSave, }) {
|
|
11
11
|
const [editing, setEditing] = useState(false);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InventorySetting } from "../../hooks/useInventorySettings";
|
|
1
|
+
import type { InventorySetting } from "../../hooks/useInventorySettings.js";
|
|
2
2
|
export declare function InventorySettingsDrawer({ open, onOpenChange, connectionId, productIds, current, onSaved, }: {
|
|
3
3
|
open: boolean;
|
|
4
4
|
onOpenChange: (v: boolean) => void;
|
|
@@ -6,5 +6,5 @@ export declare function InventorySettingsDrawer({ open, onOpenChange, connection
|
|
|
6
6
|
productIds: string[];
|
|
7
7
|
current?: InventorySetting | undefined;
|
|
8
8
|
onSaved?: () => void;
|
|
9
|
-
}): import("react").JSX.Element;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
//# sourceMappingURL=InventorySettingsDrawer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InventorySettingsDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventorySettingsDrawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAkBzE,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB
|
|
1
|
+
{"version":3,"file":"InventorySettingsDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventorySettingsDrawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAkBzE,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,2CAkMA"}
|
|
@@ -7,9 +7,9 @@ import { useEffect, useState } from "react";
|
|
|
7
7
|
import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@flowselections/core";
|
|
8
8
|
import { useServerFn } from "@tanstack/react-start";
|
|
9
9
|
import { toast } from "sonner";
|
|
10
|
-
import { saveInventorySettings, republishInventory, } from "../../lib/inventory-settings.functions";
|
|
11
|
-
import { MissingPriceNotice } from "./ProductSalePriceField";
|
|
12
|
-
import { MODE_LABELS, ACTION_REASON_LABELS, publishedLabel, } from "../../lib/stock-modes";
|
|
10
|
+
import { saveInventorySettings, republishInventory, } from "../../lib/inventory-settings.functions.js";
|
|
11
|
+
import { MissingPriceNotice } from "./ProductSalePriceField.js";
|
|
12
|
+
import { MODE_LABELS, ACTION_REASON_LABELS, publishedLabel, } from "../../lib/stock-modes.js";
|
|
13
13
|
const MODE_HELP = {
|
|
14
14
|
FOLLOW_ERP: "Publiceert beschikbaar min gereserveerd min buffer, afgerond op hele verpakkingen.",
|
|
15
15
|
MAXIMUM: "Volgt het ERP (min buffer), maar publiceert nooit meer dan het maximum.",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { InventorySetting } from "../../hooks/useInventorySettings";
|
|
2
|
-
import { MODE_LABELS } from "../../lib/stock-modes";
|
|
1
|
+
import type { InventorySetting } from "../../hooks/useInventorySettings.js";
|
|
2
|
+
import { MODE_LABELS } from "../../lib/stock-modes.js";
|
|
3
3
|
export { MODE_LABELS };
|
|
4
4
|
export declare function InventoryStatusBadge({ setting }: {
|
|
5
5
|
setting: InventorySetting | undefined;
|
|
6
|
-
}): import("react").JSX.Element;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
7
|
//# sourceMappingURL=InventoryStatusBadge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InventoryStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventoryStatusBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAwC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,CAAC;AAiCvB,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;CAAE
|
|
1
|
+
{"version":3,"file":"InventoryStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/InventoryStatusBadge.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAwC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,CAAC;AAiCvB,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;CAAE,2CAuC1F"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Badge } from "@flowselections/core";
|
|
3
|
-
import { MODE_LABELS, ACTION_REASON_LABELS } from "../../lib/stock-modes";
|
|
3
|
+
import { MODE_LABELS, ACTION_REASON_LABELS } from "../../lib/stock-modes.js";
|
|
4
4
|
export { MODE_LABELS };
|
|
5
5
|
const MODE_CLASSES = {
|
|
6
6
|
FOLLOW_ERP: "bg-primary/10 text-primary border-primary/30",
|
|
@@ -43,5 +43,5 @@ export function InventoryStatusBadge({ setting }) {
|
|
|
43
43
|
? `${dot.title}: ${ACTION_REASON_LABELS[setting.action_reason] ?? setting.action_reason}`
|
|
44
44
|
: setting.last_sync_error
|
|
45
45
|
? `${dot.title}: ${setting.last_sync_error}`
|
|
46
|
-
: dot.title, "aria-label": dot.title }), _jsx("span", { className: "tabular-nums text-xs text-muted-foreground", children: setting.desired_quantity ?? 0 }), setting.last_sync_error?.startsWith("Geen voorkeursmagazijn") && (_jsx("span", { className: "rounded bg-destructive/15 px-1.5 py-0.5 text-xs text-destructive", title: setting.last_sync_error, children: "Geen magazijn \u2014 kies er een
|
|
46
|
+
: dot.title, "aria-label": dot.title }), _jsx("span", { className: "tabular-nums text-xs text-muted-foreground", children: setting.desired_quantity ?? 0 }), setting.last_sync_error?.startsWith("Geen voorkeursmagazijn") && (_jsx("span", { className: "rounded bg-destructive/15 px-1.5 py-0.5 text-xs text-destructive", title: setting.last_sync_error, children: "Geen magazijn \u2014 kies er een in Instellingen \u203A Floriday" }))] }));
|
|
47
47
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleHealthCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ModuleHealthCard.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,gBAAgB,4CA8D/B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Statuskaart in de instellingen: laat in gewone taal zien of de module in
|
|
4
|
+
* déze omgeving volledig werkt, en biedt één knop om vastgelopen
|
|
5
|
+
* voorraadwijzigingen weer op gang te helpen.
|
|
6
|
+
*/
|
|
7
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
import { useServerFn } from "@tanstack/react-start";
|
|
9
|
+
import { AlertTriangle, CheckCircle2, RotateCw, XCircle } from "lucide-react";
|
|
10
|
+
import { toast } from "sonner";
|
|
11
|
+
import { getModuleHealth, recoverStockQueue, } from "../../lib/module-health.functions.js";
|
|
12
|
+
function StatusIcon({ status }) {
|
|
13
|
+
if (status === "ok")
|
|
14
|
+
return _jsx(CheckCircle2, { className: "mt-0.5 h-4 w-4 shrink-0 text-emerald-600" });
|
|
15
|
+
if (status === "warn")
|
|
16
|
+
return _jsx(AlertTriangle, { className: "mt-0.5 h-4 w-4 shrink-0 text-amber-600" });
|
|
17
|
+
return _jsx(XCircle, { className: "mt-0.5 h-4 w-4 shrink-0 text-destructive" });
|
|
18
|
+
}
|
|
19
|
+
export function ModuleHealthCard() {
|
|
20
|
+
const fetchHealth = useServerFn(getModuleHealth);
|
|
21
|
+
const recover = useServerFn(recoverStockQueue);
|
|
22
|
+
const queryClient = useQueryClient();
|
|
23
|
+
const { data, isLoading } = useQuery({
|
|
24
|
+
queryKey: ["module-health"],
|
|
25
|
+
queryFn: () => fetchHealth({}),
|
|
26
|
+
refetchInterval: 60000,
|
|
27
|
+
});
|
|
28
|
+
const mutation = useMutation({
|
|
29
|
+
mutationFn: () => recover({}),
|
|
30
|
+
onSuccess: (res) => {
|
|
31
|
+
toast.success(res?.restored
|
|
32
|
+
? `${res.restored} voorraadwijziging${res.restored === 1 ? "" : "en"} opnieuw ingepland.`
|
|
33
|
+
: "Er stond niets vast.");
|
|
34
|
+
void queryClient.invalidateQueries({ queryKey: ["module-health"] });
|
|
35
|
+
void queryClient.invalidateQueries({ queryKey: ["stock-sync-health"] });
|
|
36
|
+
},
|
|
37
|
+
onError: (e) => toast.error(e?.message ?? "Herstellen is niet gelukt."),
|
|
38
|
+
});
|
|
39
|
+
return (_jsxs("section", { className: "rounded-lg border border-border bg-card p-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-base font-semibold text-foreground", children: "Status van de voorraadmodule" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Controleert de koppeling, de achtergrondtaken en de synchronisatie naar Floriday." })] }), _jsxs("button", { type: "button", className: "inline-flex shrink-0 items-center rounded-md border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:opacity-50", disabled: mutation.isPending, onClick: () => mutation.mutate(), children: [_jsx(RotateCw, { className: `mr-1.5 h-3.5 w-3.5 ${mutation.isPending ? "animate-spin" : ""}` }), "Vastgelopen taken hervatten"] })] }), _jsxs("ul", { className: "mt-4 space-y-2.5", children: [isLoading && _jsx("li", { className: "text-sm text-muted-foreground", children: "Bezig met controleren\u2026" }), data?.checks.map((check) => (_jsxs("li", { className: "flex items-start gap-2 text-sm", children: [_jsx(StatusIcon, { status: check.status }), _jsxs("div", { className: "min-w-0", children: [_jsxs("span", { className: "font-medium text-foreground", children: [check.label, ": "] }), _jsx("span", { className: "text-muted-foreground break-words", children: check.detail }), check.hint && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground/80 break-words", children: check.hint }))] })] }, check.id)))] })] }));
|
|
40
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function NieuwArtikelPage(): import("react").JSX.Element;
|
|
1
|
+
export declare function NieuwArtikelPage(): import("react/jsx-runtime").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":"AAgBA,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"NieuwArtikelPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/NieuwArtikelPage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,4CAkM/B"}
|
|
@@ -9,9 +9,9 @@ import { useRef, useState } from "react";
|
|
|
9
9
|
import { Link, useNavigate } from "@tanstack/react-router";
|
|
10
10
|
import { Button, Card, Input, Label, toast } from "@flowselections/core";
|
|
11
11
|
import { ArrowLeft, Check, Loader2, Send } from "lucide-react";
|
|
12
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
13
|
-
import { validateDraftForPublish } from "../../lib/floriday-import-validator";
|
|
14
|
-
import { ArtikelWizard } from "./ArtikelWizard";
|
|
12
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
13
|
+
import { validateDraftForPublish } from "../../lib/floriday-import-validator.js";
|
|
14
|
+
import { ArtikelWizard } from "./ArtikelWizard.js";
|
|
15
15
|
const STEPS = ["Naam en code", "Voorraad", "Prijs"];
|
|
16
16
|
export function NieuwArtikelPage() {
|
|
17
17
|
const navigate = useNavigate();
|
|
@@ -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.Element;
|
|
6
|
+
export declare function OrderHistoryCard({ tradeItemKey, productName, productId }: Props): import("react/jsx-runtime").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,2CAoK/E"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { Card, CardContent, Badge } from "@flowselections/core";
|
|
4
4
|
import { Loader2, ClipboardList, ExternalLink } from "lucide-react";
|
|
5
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
5
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
6
6
|
const STATUS_TONE = {
|
|
7
7
|
"nog te picken": "bg-amber-100 text-amber-800 border-amber-200",
|
|
8
8
|
"klaar voor verzending": "bg-blue-100 text-blue-800 border-blue-200",
|
|
@@ -4,6 +4,6 @@ type Props = {
|
|
|
4
4
|
productId?: string | null;
|
|
5
5
|
offerForSale: boolean;
|
|
6
6
|
};
|
|
7
|
-
export declare function PriceStatusBadge({ tradeItemId, productId, offerForSale }: Props): import("react").JSX.Element | null;
|
|
7
|
+
export declare function PriceStatusBadge({ tradeItemId, productId, offerForSale }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=PriceStatusBadge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAuFA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"PriceStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PriceStatusBadge.tsx"],"names":[],"mappings":"AAuFA,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAeF,wBAAgB,gBAAgB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,kDAmG/E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
|
|
2
2
|
export declare function ProductCustomFieldsCard({ productId }: {
|
|
3
3
|
productId: string;
|
|
4
|
-
}): import("react").JSX.Element | null;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
5
5
|
//# sourceMappingURL=ProductCustomFieldsCard.d.ts.map
|
|
@@ -1 +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,
|
|
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,kDA6H3E"}
|
|
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Checkbox, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, toast, } from "@flowselections/core";
|
|
4
4
|
import { Loader2, Save } from "lucide-react";
|
|
5
|
-
import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
|
|
6
|
-
import { fetchProductCustomValues, saveProductCustomValues, } from "../../lib/voorraad-custom-fields";
|
|
5
|
+
import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields.js";
|
|
6
|
+
import { fetchProductCustomValues, saveProductCustomValues, } from "../../lib/voorraad-custom-fields.js";
|
|
7
7
|
/** Eigen voorraadvelden met `show_in_detail`, tonen en bewerken op de productpagina. */
|
|
8
8
|
export function ProductCustomFieldsCard({ productId }) {
|
|
9
9
|
const { fields, loading } = useVoorraadCustomFields();
|
|
@@ -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.Element;
|
|
11
|
+
export declare function ProductLinkCard({ tradeItemKey, productName }: Props): import("react/jsx-runtime").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,2CA4OnE"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Button, Card, CardContent, Input, toast, } from "@flowselections/core";
|
|
4
4
|
import { Link2, Loader2, RefreshCw, Trash2, Wand2 } from "lucide-react";
|
|
5
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
5
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
6
6
|
/**
|
|
7
7
|
* Koppelt ERP-`products` rijen aan één Floriday-voorraadrij (`trade_item_key`).
|
|
8
8
|
* Zonder koppeling doen bestel-triggers niets voor mailbox/manual-orders.
|
|
@@ -137,10 +137,10 @@ export function ProductLinkCard({ tradeItemKey, productName }) {
|
|
|
137
137
|
throw error;
|
|
138
138
|
const rows = data ?? [];
|
|
139
139
|
const n = rows[0]?.processed_items ?? 0;
|
|
140
|
-
toast.success(`
|
|
140
|
+
toast.success(`Openstaande orders gereserveerd: ${n} orderregel(s)`);
|
|
141
141
|
}
|
|
142
142
|
catch (e) {
|
|
143
|
-
toast.error(
|
|
143
|
+
toast.error("Openstaande orders reserveren is niet gelukt. Probeer het opnieuw.");
|
|
144
144
|
}
|
|
145
145
|
finally {
|
|
146
146
|
setBusy(false);
|
|
@@ -151,9 +151,9 @@ export function ProductLinkCard({ tradeItemKey, productName }) {
|
|
|
151
151
|
return "Sla het artikel eerst op om producten te kunnen koppelen.";
|
|
152
152
|
}
|
|
153
153
|
if (linked.length === 0) {
|
|
154
|
-
return "Nog geen
|
|
154
|
+
return "Nog geen eigen product gekoppeld. Zonder koppeling worden mailbox-orders niet automatisch van de voorraad afgeschreven.";
|
|
155
155
|
}
|
|
156
|
-
return "Bestellingen op deze
|
|
156
|
+
return "Bestellingen op deze eigen producten reserveren automatisch op deze voorraadrij.";
|
|
157
157
|
}, [tradeItemKey, linked.length]);
|
|
158
|
-
return (_jsxs(Card, { children: [_jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 px-6 py-4", children: [_jsx("span", { className: "flex h-7 w-7 items-center justify-center rounded-full border border-primary/40 bg-primary/10 text-primary", children: _jsx(Link2, { className: "h-4 w-4" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: "Gekoppelde
|
|
158
|
+
return (_jsxs(Card, { children: [_jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 px-6 py-4", children: [_jsx("span", { className: "flex h-7 w-7 items-center justify-center rounded-full border border-primary/40 bg-primary/10 text-primary", children: _jsx(Link2, { className: "h-4 w-4" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: "Gekoppelde eigen producten" }), _jsx("div", { className: "text-xs text-muted-foreground", children: helpText })] }), _jsxs("div", { className: "flex gap-2", children: [productName && (_jsxs(Button, { variant: "outline", size: "sm", onClick: autoLinkByName, disabled: !tradeItemKey || busy, title: "Zoek eigen producten met exact deze naam en koppel ze", children: [_jsx(Wand2, { className: "h-4 w-4 mr-1" }), "Auto op naam"] })), _jsxs(Button, { variant: "outline", size: "sm", onClick: backfillReservations, disabled: busy, title: "Openstaande orders reserveren", children: [_jsx(RefreshCw, { className: "h-4 w-4 mr-1" }), "Openstaande orders reserveren"] })] })] }), _jsx(CardContent, { className: "pt-0 space-y-3", children: loading ? (_jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Laden\u2026"] })) : (_jsxs(_Fragment, { children: [linked.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border", children: linked.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate font-medium", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => unlinkProduct(p.id), disabled: busy, children: _jsx(Trash2, { className: "h-4 w-4" }) })] }, p.id))) })), _jsxs("div", { className: "space-y-2", children: [_jsx(Input, { placeholder: "Zoek eigen product op naam of artikelcode\u2026", value: query, onChange: (e) => setQuery(e.target.value), disabled: !tradeItemKey || busy }), candidates.length > 0 && (_jsx("ul", { className: "divide-y rounded-md border max-h-56 overflow-auto", children: candidates.map((p) => (_jsxs("li", { className: "flex items-center justify-between gap-2 px-3 py-2 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate", children: p.product ?? "(zonder naam)" }), p.barcode && (_jsxs("div", { className: "text-xs text-muted-foreground", children: ["Barcode: ", p.barcode] }))] }), _jsx(Button, { size: "sm", onClick: () => linkProduct(p.id), disabled: busy, children: "Koppel" })] }, p.id))) }))] })] })) })] }));
|
|
159
159
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export declare function ProductSalePriceField({ productId, onSaved, }: {
|
|
2
2
|
productId: string;
|
|
3
3
|
onSaved?: (price: number) => void;
|
|
4
|
-
}): import("react").JSX.Element | null;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
5
5
|
/** Melding met directe link naar het prijsveld; toont niets als de prijs in orde is. */
|
|
6
6
|
export declare function MissingPriceNotice({ productId }: {
|
|
7
7
|
productId: string;
|
|
8
|
-
}): import("react").JSX.Element | null;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
9
9
|
//# sourceMappingURL=ProductSalePriceField.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductSalePriceField.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductSalePriceField.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,
|
|
1
|
+
{"version":3,"file":"ProductSalePriceField.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductSalePriceField.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,OAAO,GACR,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,kDAkGA;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,kDAqCtE"}
|
|
@@ -10,8 +10,8 @@ import { useEffect, useState } from "react";
|
|
|
10
10
|
import { Link } from "@tanstack/react-router";
|
|
11
11
|
import { Button, Input, Label, toast } from "@flowselections/core";
|
|
12
12
|
import { AlertTriangle, Loader2 } from "lucide-react";
|
|
13
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
14
|
-
import { priceProblem } from "../../lib/floriday-base-supply";
|
|
13
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
14
|
+
import { priceProblem } from "../../lib/floriday-base-supply.js";
|
|
15
15
|
function isPieceUnit(unit) {
|
|
16
16
|
const u = String(unit ?? "").trim().toLowerCase();
|
|
17
17
|
return u === "" || u === "stuks" || u === "stuk";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export declare function ProductStructureCard({ productId }: {
|
|
2
2
|
productId: string | null;
|
|
3
|
-
}): import("react").JSX.Element | null;
|
|
3
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
4
4
|
/** Eén regel met de echte reden waarom de voorraad (nog) niet in Floriday staat. */
|
|
5
5
|
export declare function FloridayStockReasonLine({ productId }: {
|
|
6
6
|
productId: string | null;
|
|
7
|
-
}): import("react").JSX.Element | null;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
8
8
|
//# sourceMappingURL=ProductStructureCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductStructureCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductStructureCard.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"ProductStructureCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/ProductStructureCard.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,kDAoQ/E;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,kDAkClF"}
|
|
@@ -8,9 +8,9 @@ import { useEffect, useState } from "react";
|
|
|
8
8
|
import { Link } from "@tanstack/react-router";
|
|
9
9
|
import { Badge, Card, CardContent, CardDescription, CardHeader, CardTitle } from "@flowselections/core";
|
|
10
10
|
import { Info, Loader2 } from "lucide-react";
|
|
11
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
12
|
-
import { PRODUCT_TYPE_CLASSES, PRODUCT_TYPE_HELP, PRODUCT_TYPE_LABELS, floridayPendingReason, toStructureType, } from "../../lib/product-types";
|
|
13
|
-
import { ACTION_REASON_LABELS, publishedLabel } from "../../lib/stock-modes";
|
|
11
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
12
|
+
import { PRODUCT_TYPE_CLASSES, PRODUCT_TYPE_HELP, PRODUCT_TYPE_LABELS, floridayPendingReason, toStructureType, } from "../../lib/product-types.js";
|
|
13
|
+
import { ACTION_REASON_LABELS, publishedLabel } from "../../lib/stock-modes.js";
|
|
14
14
|
export function ProductStructureCard({ productId }) {
|
|
15
15
|
const [loading, setLoading] = useState(true);
|
|
16
16
|
const [totals, setTotals] = useState(null);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function PublicatiesPage(): import("react").JSX.Element;
|
|
1
|
+
export declare function PublicatiesPage(): import("react/jsx-runtime").JSX.Element;
|
|
2
2
|
//# sourceMappingURL=PublicatiesPage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicatiesPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublicatiesPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"PublicatiesPage.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublicatiesPage.tsx"],"names":[],"mappings":"AA+BA,wBAAgB,eAAe,4CAwJ9B"}
|
|
@@ -3,8 +3,8 @@ import { Link } from "@tanstack/react-router";
|
|
|
3
3
|
import { Card, Button } from "@flowselections/core";
|
|
4
4
|
import { ArrowLeft, Check, AlertTriangle, Loader2, RefreshCw } from "lucide-react";
|
|
5
5
|
import { useEffect, useState } from "react";
|
|
6
|
-
import { usePublishJobs } from "../../hooks/usePublishJob";
|
|
7
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
6
|
+
import { usePublishJobs } from "../../hooks/usePublishJob.js";
|
|
7
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
8
8
|
const STATUS_LABEL = {
|
|
9
9
|
running: "Bezig",
|
|
10
10
|
succeeded: "Gepubliceerd",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PublishJobRow, PublishStepRow } from "../../lib/publish-pipeline";
|
|
1
|
+
import type { PublishJobRow, PublishStepRow } from "../../lib/publish-pipeline.js";
|
|
2
2
|
/**
|
|
3
3
|
* Toont de voortgang van een publicatie in deelstappen.
|
|
4
4
|
*/
|
|
@@ -8,5 +8,5 @@ export declare function PublishProgressCard({ job, steps, onRetry, retrying, onF
|
|
|
8
8
|
onRetry?: () => void;
|
|
9
9
|
retrying?: boolean;
|
|
10
10
|
onFixStep?: (stepKey: string) => void;
|
|
11
|
-
}): import("react").JSX.Element | null;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
12
12
|
//# sourceMappingURL=PublishProgressCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublishProgressCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishProgressCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAoBhF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,
|
|
1
|
+
{"version":3,"file":"PublishProgressCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishProgressCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAoBhF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,GACV,EAAE;IACD,GAAG,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,kDAyDA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ReadinessReport } from "../../lib/publish-readiness";
|
|
1
|
+
import type { ReadinessReport } from "../../lib/publish-readiness.js";
|
|
2
2
|
/**
|
|
3
3
|
* Korte checklist die laat zien of het product klaar is om te publiceren.
|
|
4
4
|
*/
|
|
@@ -6,5 +6,5 @@ export declare function PublishReadinessCard({ report, loading, onGoToStep, }: {
|
|
|
6
6
|
report: ReadinessReport;
|
|
7
7
|
loading?: boolean;
|
|
8
8
|
onGoToStep?: (stepKey: string) => void;
|
|
9
|
-
}): import("react").JSX.Element;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
//# sourceMappingURL=PublishReadinessCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublishReadinessCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishReadinessCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC
|
|
1
|
+
{"version":3,"file":"PublishReadinessCard.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/PublishReadinessCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE;IACD,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,2CAuEA"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { PackingConfigurationInput } from "../../lib/floriday-payload";
|
|
1
|
+
import type { PackingConfigurationInput } from "../../lib/floriday-payload.js";
|
|
2
2
|
interface Props {
|
|
3
3
|
productId: string | null;
|
|
4
4
|
floridayId: string | null;
|
|
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.Element;
|
|
8
|
+
export declare function StepSamenstelling({ productId, floridayId, packings, packagingTypeLabel, }: Props): import("react/jsx-runtime").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;
|
|
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;AA6FD,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,GACnB,EAAE,KAAK,2CA+aP"}
|
|
@@ -2,7 +2,89 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
3
|
import { Button, Input, Popover, PopoverContent, PopoverTrigger, toast, } from "@flowselections/core";
|
|
4
4
|
import { Loader2, Package, Plus, Search, Trash2 } from "lucide-react";
|
|
5
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
5
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
6
|
+
/** Vanaf dit aantal per stuk vragen we of de verhouding klopt. */
|
|
7
|
+
const RATIO_WARN_THRESHOLD = 10;
|
|
8
|
+
const MAX_DEPTH = 6;
|
|
9
|
+
function fmt(n) {
|
|
10
|
+
return n.toLocaleString("nl-NL", { maximumFractionDigits: 2 });
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Telt per eindonderdeel hoeveel er in 1 stuk van het artikel zit, door alle
|
|
14
|
+
* lagen van de samenstelling heen (op id). Een groep telt mee als haar eerste lid.
|
|
15
|
+
*/
|
|
16
|
+
async function unlikelyRatios(parentId, baseRows) {
|
|
17
|
+
const totals = new Map();
|
|
18
|
+
const bomCache = new Map();
|
|
19
|
+
const groupCache = new Map();
|
|
20
|
+
const childrenOf = async (pid) => {
|
|
21
|
+
if (bomCache.has(pid))
|
|
22
|
+
return bomCache.get(pid);
|
|
23
|
+
const { data } = await supabase
|
|
24
|
+
.from("product_bom_items")
|
|
25
|
+
.select("component_product_id,quantity")
|
|
26
|
+
.eq("parent_product_id", pid)
|
|
27
|
+
.is("packing_configuration_id", null);
|
|
28
|
+
const list = (data ?? [])
|
|
29
|
+
.filter((r) => r.component_product_id)
|
|
30
|
+
.map((r) => ({ id: r.component_product_id, qty: Number(r.quantity ?? 1) }));
|
|
31
|
+
bomCache.set(pid, list);
|
|
32
|
+
return list;
|
|
33
|
+
};
|
|
34
|
+
const groupMemberOf = async (pid) => {
|
|
35
|
+
if (groupCache.has(pid))
|
|
36
|
+
return groupCache.get(pid);
|
|
37
|
+
const { data: g } = await supabase
|
|
38
|
+
.from("product_groups")
|
|
39
|
+
.select("id")
|
|
40
|
+
.eq("head_product_id", pid)
|
|
41
|
+
.eq("is_active", true)
|
|
42
|
+
.order("updated_at", { ascending: false })
|
|
43
|
+
.limit(1)
|
|
44
|
+
.maybeSingle();
|
|
45
|
+
let member = null;
|
|
46
|
+
if (g?.id) {
|
|
47
|
+
const { data: m } = await supabase
|
|
48
|
+
.from("product_group_items")
|
|
49
|
+
.select("trade_item_id")
|
|
50
|
+
.eq("product_group_id", g.id)
|
|
51
|
+
.order("sort_order", { ascending: true })
|
|
52
|
+
.limit(1)
|
|
53
|
+
.maybeSingle();
|
|
54
|
+
member = m?.trade_item_id ?? null;
|
|
55
|
+
}
|
|
56
|
+
groupCache.set(pid, member);
|
|
57
|
+
return member;
|
|
58
|
+
};
|
|
59
|
+
const walk = async (pid, mult, depth) => {
|
|
60
|
+
if (depth > MAX_DEPTH)
|
|
61
|
+
return;
|
|
62
|
+
const kids = await childrenOf(pid);
|
|
63
|
+
if (kids.length > 0) {
|
|
64
|
+
for (const k of kids)
|
|
65
|
+
await walk(k.id, mult * k.qty, depth + 1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const member = await groupMemberOf(pid);
|
|
69
|
+
if (member && member !== pid) {
|
|
70
|
+
await walk(member, mult, depth + 1);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
totals.set(pid, (totals.get(pid) ?? 0) + mult);
|
|
74
|
+
};
|
|
75
|
+
for (const r of baseRows) {
|
|
76
|
+
if (r.component_product_id)
|
|
77
|
+
await walk(r.component_product_id, Number(r.quantity) || 0, 1);
|
|
78
|
+
}
|
|
79
|
+
const over = Array.from(totals.entries()).filter(([, q]) => q >= RATIO_WARN_THRESHOLD);
|
|
80
|
+
if (over.length === 0)
|
|
81
|
+
return [];
|
|
82
|
+
const ids = [...over.map(([id]) => id), ...(parentId ? [parentId] : [])];
|
|
83
|
+
const { data: prods } = await supabase.from("products").select("id,product").in("id", ids);
|
|
84
|
+
const nameOf = new Map((prods ?? []).map((p) => [p.id, String(p.product ?? "")]));
|
|
85
|
+
const parent = (parentId && nameOf.get(parentId)) || "stuk van dit artikel";
|
|
86
|
+
return over.map(([id, qty]) => ({ parent, name: nameOf.get(id) || "onderdeel", qty }));
|
|
87
|
+
}
|
|
6
88
|
function newRowId() {
|
|
7
89
|
return `new:${typeof crypto !== "undefined" && "randomUUID" in crypto
|
|
8
90
|
? crypto.randomUUID()
|
|
@@ -166,6 +248,21 @@ export function StepSamenstelling({ productId, floridayId, packings, packagingTy
|
|
|
166
248
|
if (dirty.length === 0)
|
|
167
249
|
return;
|
|
168
250
|
setSaving(true);
|
|
251
|
+
// Verhoudingscontrole: alle lagen meetellen, nooit blokkeren.
|
|
252
|
+
try {
|
|
253
|
+
const warnings = await unlikelyRatios(productId, rows.filter((r) => r.packing_configuration_id === null));
|
|
254
|
+
if (warnings.length > 0) {
|
|
255
|
+
const ok = window.confirm(warnings.map((w) => `Let op: 1 ${w.parent} bevat ${fmt(w.qty)} ${w.name}. Klopt dat?`).join("\n") +
|
|
256
|
+
"\n\nKies OK om toch op te slaan, of Annuleren om aan te passen.");
|
|
257
|
+
if (!ok) {
|
|
258
|
+
setSaving(false);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Controle mislukt: opslaan gaat gewoon door.
|
|
265
|
+
}
|
|
169
266
|
try {
|
|
170
267
|
const inserts = dirty
|
|
171
268
|
.filter((r) => r._new)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { TradeItem } from "../../lib/floriday-client";
|
|
1
|
+
import type { TradeItem } from "../../lib/floriday-client.js";
|
|
2
2
|
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.Element;
|
|
6
|
+
}): import("react/jsx-runtime").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":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAwG3D,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
|
|
1
|
+
{"version":3,"file":"StockBulkButtons.d.ts","sourceRoot":"","sources":["../../../src/components/voorraad/StockBulkButtons.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAwG3D,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,2CAmoBA"}
|
|
@@ -3,11 +3,11 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
|
3
3
|
import * as XLSX from "xlsx";
|
|
4
4
|
import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
|
|
5
5
|
import { Download, FileDown, Upload, Loader2, Undo2, Play } from "lucide-react";
|
|
6
|
-
import { supabase } from "../../integrations/supabase/client";
|
|
7
|
-
import { emptyWizardData } from "../../lib/floriday-payload";
|
|
8
|
-
import { validateDraftForPublish } from "../../lib/floriday-import-validator";
|
|
9
|
-
import { ensureArticleCodes } from "../../lib/ensure-article-codes";
|
|
10
|
-
import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields";
|
|
6
|
+
import { supabase } from "../../integrations/supabase/client.js";
|
|
7
|
+
import { emptyWizardData } from "../../lib/floriday-payload.js";
|
|
8
|
+
import { validateDraftForPublish } from "../../lib/floriday-import-validator.js";
|
|
9
|
+
import { ensureArticleCodes } from "../../lib/ensure-article-codes.js";
|
|
10
|
+
import { useVoorraadCustomFields } from "../../hooks/useVoorraadCustomFields.js";
|
|
11
11
|
/**
|
|
12
12
|
* Voorraadimport in porties (Voorraad-module).
|
|
13
13
|
* De browser leest het bestand en controleert de rijen; de database verwerkt
|
|
@@ -193,7 +193,7 @@ export function StockBulkButtons({ items, activeConnectionId, onImported, }) {
|
|
|
193
193
|
/** Stap 1: bestand lezen en per rij controleren (nog niets opgeslagen). */
|
|
194
194
|
const handleFile = async (file) => {
|
|
195
195
|
if (!activeConnectionId) {
|
|
196
|
-
toast.error("Geen actieve Floriday-
|
|
196
|
+
toast.error("Geen actieve Floriday-koppeling. Kijk bij Instellingen › Floriday.");
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
setBusy("lezen");
|