@flowselections/floriday-verkoop-module 1.0.12 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.d.ts +4 -0
  2. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.d.ts.map +1 -0
  3. package/dist-lib/components/verkoop/AutoFulfillmentStatusCard.js +95 -0
  4. package/dist-lib/components/verkoop/CartAssignmentWizard.d.ts +6 -0
  5. package/dist-lib/components/verkoop/CartAssignmentWizard.d.ts.map +1 -0
  6. package/dist-lib/components/verkoop/CartAssignmentWizard.js +194 -0
  7. package/dist-lib/components/verkoop/CreateOrderPage.d.ts.map +1 -1
  8. package/dist-lib/components/verkoop/CreateOrderPage.js +14 -4
  9. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.d.ts +4 -0
  10. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.d.ts.map +1 -0
  11. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.js +44 -0
  12. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts +5 -0
  13. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -0
  14. package/dist-lib/components/verkoop/OrderKarindelingCard.js +160 -0
  15. package/dist-lib/components/verkoop/SalesOrderDetailView.d.ts.map +1 -1
  16. package/dist-lib/components/verkoop/SalesOrderDetailView.js +6 -3
  17. package/dist-lib/components/verkoop/VerkoopOrdersPage.d.ts.map +1 -1
  18. package/dist-lib/components/verkoop/VerkoopOrdersPage.js +39 -3
  19. package/dist-lib/integrations/supabase/auth-middleware.d.ts +605 -4
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/client.d.ts +605 -4
  22. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  23. package/dist-lib/integrations/supabase/client.server.d.ts +605 -4
  24. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/client.server.js +4 -4
  26. package/dist-lib/integrations/supabase/types.d.ts +613 -4
  27. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  28. package/dist-lib/lib/cart-lock.functions.d.ts +11356 -0
  29. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -0
  30. package/dist-lib/lib/cart-lock.functions.js +47 -0
  31. package/dist-lib/lib/cart-planner.d.ts +38 -0
  32. package/dist-lib/lib/cart-planner.d.ts.map +1 -0
  33. package/dist-lib/lib/cart-planner.js +217 -0
  34. package/dist-lib/lib/cart-replan.functions.d.ts +22729 -0
  35. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -0
  36. package/dist-lib/lib/cart-replan.functions.js +203 -0
  37. package/dist-lib/lib/create-order.functions.d.ts +26999 -76
  38. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  39. package/dist-lib/lib/create-order.functions.js +158 -3
  40. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +34033 -0
  41. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -0
  42. package/dist-lib/lib/floriday-auto-fulfillment.functions.js +65 -0
  43. package/dist-lib/lib/floriday-auto-fulfillment.server.d.ts +21 -0
  44. package/dist-lib/lib/floriday-auto-fulfillment.server.d.ts.map +1 -0
  45. package/dist-lib/lib/floriday-auto-fulfillment.server.js +352 -0
  46. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +11351 -0
  47. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -0
  48. package/dist-lib/lib/floriday-logistic-labels.functions.js +171 -0
  49. package/dist-lib/lib/floriday-public.functions.d.ts +4237 -44
  50. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/floriday-public.functions.js +45 -47
  52. package/dist-lib/lib/floriday-writes.functions.d.ts +3025 -20
  53. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/salesorders-mapping.d.ts +2 -0
  55. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  56. package/dist-lib/lib/salesorders-mapping.js +46 -20
  57. package/dist-lib/lib/salesorders.functions.d.ts +1831 -28
  58. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  59. package/dist-lib/lib/salesorders.functions.js +8 -0
  60. package/dist-lib/lib/tradeitems.functions.d.ts +605 -4
  61. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/useSalesOrdersQuery.d.ts +1 -0
  63. package/dist-lib/lib/useSalesOrdersQuery.d.ts.map +1 -1
  64. package/dist-lib/lib/useSalesOrdersQuery.js +121 -39
  65. package/package.json +1 -1
@@ -1,5 +1,8 @@
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 { CheckCircle2, ImageIcon } from "lucide-react";
3
+ import { OrderKarindelingCard } from "./OrderKarindelingCard";
4
+ import { OrderAfleverbrievenCard } from "./OrderAfleverbrievenCard";
5
+ import { AutoFulfillmentStatusCard } from "./AutoFulfillmentStatusCard";
3
6
  const eurFlex = new Intl.NumberFormat("nl-NL", {
4
7
  style: "currency",
5
8
  currency: "EUR",
@@ -123,7 +126,7 @@ export function SalesOrderDetailView({ order, sellerFallback, }) {
123
126
  if (vbnCode)
124
127
  beladingParts.push(String(vbnCode));
125
128
  if (layersPerLoadCarrier && packagesPerLayer && piecesPerPackage) {
126
- beladingParts.push(`${layersPerLoadCarrier}×${packagesPerLayer}×${piecesPerPackage}`);
129
+ beladingParts.push(`${piecesPerPackage}×${packagesPerLayer}×${layersPerLoadCarrier}`);
127
130
  }
128
131
  if (lcShort)
129
132
  beladingParts.push(lcShort);
@@ -209,5 +212,5 @@ export function SalesOrderDetailView({ order, sellerFallback, }) {
209
212
  const bestellingLabel = order.status.isCancelled
210
213
  ? "Geannuleerd"
211
214
  : STATUS_LABELS[statusKey] ?? (order.status.isShipped ? "Verzonden" : order.status.isConfirmed ? "Order bevestigd" : "Open");
212
- return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center gap-3 rounded-md border border-border bg-muted/30 p-3", children: [_jsx("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden rounded-md bg-muted", children: order.imageUrl ? (_jsx("img", { src: order.imageUrl, alt: "", className: "h-full w-full object-cover" })) : (_jsx(ImageIcon, { className: "h-6 w-6 text-muted-foreground" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "truncate text-base font-semibold text-foreground", children: [order.productName, o.tradeItemVersion ? (_jsxs("span", { className: "ml-2 text-xs font-normal text-muted-foreground", children: ["\u00B7 v", o.tradeItemVersion] })) : null] }), _jsx("div", { className: "truncate text-xs text-muted-foreground", children: pickStr(o.customerOrderId) ?? order.sku ?? order.orderNumber })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_360px]", children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx(SectionTitle, { children: "Verkooporder" }), _jsx(Row, { label: "Handelsvorm", children: tradingType }), _jsx(Row, { label: "Bestelmoment", children: fmtDateTime(order.orderedAt) }), _jsx(Row, { label: "Aantal", children: _jsxs("div", { className: "flex flex-wrap gap-4", children: [_jsxs("div", { children: [order.fustCount, " fusten"] }), _jsxs("div", { children: [order.karCount, " karren"] })] }) }), _jsx(Row, { label: "Belading", children: belading }), _jsx(Row, { label: "Klant referentie", children: klantReferentie }), _jsx(Row, { label: "Floriday-referentie", children: floridayRef }), _jsx(Row, { label: "Verkoopkanaal", children: verkoopkanaal }), _jsx(Row, { label: "Financi\u00EBle afhandeling", children: financial }), _jsx(Row, { label: "Verkoper", children: sellerName ? (_jsxs("span", { className: "inline-flex items-center gap-2", children: [_jsx("span", { className: "inline-flex h-6 w-6 items-center justify-center rounded-full bg-muted text-[10px] font-semibold text-muted-foreground", children: initials(sellerName) }), sellerName] })) : ("—") })] }), _jsxs("div", { children: [_jsx(SectionTitle, { children: "Levering" }), _jsx(Row, { label: "Afleverdatum", children: fmtDateTime(order.deliveryAt) }), _jsx(Row, { label: "Incoterm", children: incoterm }), _jsx(Row, { label: "Levering", children: _jsxs("div", { className: "inline-flex max-w-xs items-start gap-3 rounded-md border border-border bg-card p-3", children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-md bg-primary/10 text-primary", children: _jsxs("svg", { viewBox: "0 0 24 24", className: "h-5 w-5", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M3 11l9-8 9 8" }), _jsx("path", { d: "M5 10v10h14V10" }), _jsx("path", { d: "M10 20v-6h4v6" })] }) }), _jsxs("div", { className: "text-sm", children: [_jsx("div", { children: addr.line || "—" }), _jsx("div", { children: [addr.postal, addr.city].filter(Boolean).join(" ") || "—" }), _jsx("div", { children: countryLabel ?? "" }), addr.gln && (_jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: addr.gln }))] })] }) })] }), _jsxs("div", { children: [_jsx(SectionTitle, { children: "Klant" }), _jsx(Row, { label: "Naam", children: _jsx("span", { className: "font-medium", children: customerName }) }), _jsx(Row, { label: "GLN", children: customerGln }), _jsx(Row, { label: "Administratienummer", children: customerAdmin }), _jsx(Row, { label: "Telefoonnummer", children: customerPhone })] })] }), _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "rounded-md border border-border p-4", children: [_jsx("div", { className: "mb-3 text-sm font-semibold", children: "Prijs per stuk" }), _jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Product" }), _jsxs("span", { children: [oldProductPrice !== null && (_jsx("span", { className: "mr-2 text-destructive line-through", children: eurFlex.format(oldProductPrice) })), eurFlex.format(productUnit)] })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Transportkosten" }), _jsx("span", { children: eurFlex.format(transportPerPiece) })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Inkoopprijs" }), _jsx("span", { children: eurFlex.format(purchaseUnit) })] }), _jsxs("div", { className: "mt-2 flex justify-between border-t border-border pt-2 font-semibold", children: [_jsx("span", { children: "Totaal" }), _jsxs("span", { children: [_jsxs("span", { className: "mr-2 text-xs font-normal text-muted-foreground", children: ["(", packages, " \u00D7 ", piecesPerPackage, " \u00D7 ", eurFlex.format(productUnit), ")"] }), eurFlex.format(totalAmount)] })] })] })] }), _jsxs("div", { className: "rounded-md border border-border p-4", children: [_jsx("div", { className: "mb-3 text-sm font-semibold", children: "Status" }), _jsxs("div", { className: "space-y-3 text-sm", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-muted-foreground", children: "Bestelling" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-600" }), bestellingLabel] })] }), hasCorrection && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-muted-foreground", children: "Correctie" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-600" }), "Correctie is verwerkt"] })] }))] })] })] })] })] }));
215
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-center gap-3 rounded-md border border-border bg-muted/30 p-3", children: [_jsx("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden rounded-md bg-muted", children: order.imageUrl ? (_jsx("img", { src: order.imageUrl, alt: "", className: "h-full w-full object-cover" })) : (_jsx(ImageIcon, { className: "h-6 w-6 text-muted-foreground" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "truncate text-base font-semibold text-foreground", children: [order.productName, o.tradeItemVersion ? (_jsxs("span", { className: "ml-2 text-xs font-normal text-muted-foreground", children: ["\u00B7 v", o.tradeItemVersion] })) : null] }), _jsx("div", { className: "truncate text-xs text-muted-foreground", children: order.orderNumber || order.sku || "—" })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_360px]", children: [_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx(SectionTitle, { children: "Verkooporder" }), _jsx(Row, { label: "Ordernummer", children: order.orderNumber || "—" }), _jsx(Row, { label: "Handelsvorm", children: tradingType }), _jsx(Row, { label: "Bestelmoment", children: fmtDateTime(order.orderedAt) }), _jsx(Row, { label: "Aantal", children: _jsxs("div", { className: "flex flex-wrap gap-4", children: [_jsxs("div", { children: [order.fustCount, " fusten"] }), _jsxs("div", { children: [order.karCount, " karren"] })] }) }), _jsx(Row, { label: "Belading", children: belading }), _jsx(Row, { label: "Klant referentie", children: klantReferentie }), _jsx(Row, { label: "Floriday-referentie", children: floridayRef }), _jsx(Row, { label: "Verkoopkanaal", children: verkoopkanaal }), _jsx(Row, { label: "Financi\u00EBle afhandeling", children: financial }), _jsx(Row, { label: "Verkoper", children: sellerName ? (_jsxs("span", { className: "inline-flex items-center gap-2", children: [_jsx("span", { className: "inline-flex h-6 w-6 items-center justify-center rounded-full bg-muted text-[10px] font-semibold text-muted-foreground", children: initials(sellerName) }), sellerName] })) : ("—") })] }), _jsxs("div", { children: [_jsx(SectionTitle, { children: "Levering" }), _jsx(Row, { label: "Afleverdatum", children: fmtDateTime(order.deliveryAt) }), _jsx(Row, { label: "Incoterm", children: incoterm }), _jsx(Row, { label: "Levering", children: _jsxs("div", { className: "inline-flex max-w-xs items-start gap-3 rounded-md border border-border bg-card p-3", children: [_jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-md bg-primary/10 text-primary", children: _jsxs("svg", { viewBox: "0 0 24 24", className: "h-5 w-5", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M3 11l9-8 9 8" }), _jsx("path", { d: "M5 10v10h14V10" }), _jsx("path", { d: "M10 20v-6h4v6" })] }) }), _jsxs("div", { className: "text-sm", children: [_jsx("div", { children: addr.line || "—" }), _jsx("div", { children: [addr.postal, addr.city].filter(Boolean).join(" ") || "—" }), _jsx("div", { children: countryLabel ?? "" }), addr.gln && (_jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: addr.gln }))] })] }) })] }), _jsxs("div", { children: [_jsx(SectionTitle, { children: "Klant" }), _jsx(Row, { label: "Naam", children: _jsx("span", { className: "font-medium", children: customerName }) }), _jsx(Row, { label: "GLN", children: customerGln }), _jsx(Row, { label: "Administratienummer", children: customerAdmin }), _jsx(Row, { label: "Telefoonnummer", children: customerPhone })] })] }), _jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "rounded-md border border-border p-4", children: [_jsx("div", { className: "mb-3 text-sm font-semibold", children: "Prijs per stuk" }), _jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Product" }), _jsxs("span", { children: [oldProductPrice !== null && (_jsx("span", { className: "mr-2 text-destructive line-through", children: eurFlex.format(oldProductPrice) })), eurFlex.format(productUnit)] })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Transportkosten" }), _jsx("span", { children: eurFlex.format(transportPerPiece) })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-muted-foreground", children: "Inkoopprijs" }), _jsx("span", { children: eurFlex.format(purchaseUnit) })] }), _jsxs("div", { className: "mt-2 flex justify-between border-t border-border pt-2 font-semibold", children: [_jsx("span", { children: "Totaal" }), _jsxs("span", { children: [_jsxs("span", { className: "mr-2 text-xs font-normal text-muted-foreground", children: ["(", packages, " \u00D7 ", piecesPerPackage, " \u00D7 ", eurFlex.format(productUnit), ")"] }), eurFlex.format(totalAmount)] })] })] })] }), _jsxs("div", { className: "rounded-md border border-border p-4", children: [_jsx("div", { className: "mb-3 text-sm font-semibold", children: "Status" }), _jsxs("div", { className: "space-y-3 text-sm", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-muted-foreground", children: "Bestelling" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-600" }), bestellingLabel] })] }), hasCorrection && (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-muted-foreground", children: "Correctie" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-600" }), "Correctie is verwerkt"] })] }))] })] })] })] }), _jsx(OrderKarindelingCard, { order: order }), o?.salesOrderId ? (_jsxs(_Fragment, { children: [_jsx(AutoFulfillmentStatusCard, { salesOrderId: String(o.salesOrderId) }), _jsx(OrderAfleverbrievenCard, { salesOrderId: String(o.salesOrderId) })] })) : null] }));
213
216
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VerkoopOrdersPage.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/VerkoopOrdersPage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,iBAAiB,4CA6RhC"}
1
+ {"version":3,"file":"VerkoopOrdersPage.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/VerkoopOrdersPage.tsx"],"names":[],"mappings":"AAgEA,wBAAgB,iBAAiB,4CA2UhC"}
@@ -4,6 +4,8 @@ import { Button, Select, SelectContent, SelectItem, SelectTrigger, SelectValue,
4
4
  import { Download, Plus, AlertTriangle, RefreshCw, ChevronLeft, ChevronRight, Filter, } from "lucide-react";
5
5
  import { useServerFn } from "@tanstack/react-start";
6
6
  import { useNavigate } from "@tanstack/react-router";
7
+ import { useQueryClient } from "@tanstack/react-query";
8
+ import { supabase } from "../../integrations/supabase/client";
7
9
  import { runSalesOrdersSync } from "../../lib/salesorders.functions";
8
10
  import { runTradeItemsSync } from "../../lib/tradeitems.functions";
9
11
  import { applyFilters, computeTotals, ordersToCsv, } from "../../lib/salesorders-mapping";
@@ -12,7 +14,6 @@ import { AnalyticsCards } from "./AnalyticsCards";
12
14
  import { SalesOrdersFilters } from "./SalesOrdersFilters";
13
15
  import { SalesOrdersFilterPanel, countActiveFilters, } from "./SalesOrdersFilterPanel";
14
16
  import { SalesOrdersTable } from "./SalesOrdersTable";
15
- import { FlorydaySyncHealthBanner } from "../../components/floriday/FlorydaySyncHealthBanner";
16
17
  const STATUS_TABS = [
17
18
  { id: "all", label: "Alle" },
18
19
  { id: "open", label: "Open" },
@@ -53,10 +54,45 @@ export function VerkoopOrdersPage() {
53
54
  const [page, setPage] = useState(1);
54
55
  const [pageSize, setPageSize] = useState(20);
55
56
  const navigate = useNavigate();
57
+ const queryClient = useQueryClient();
56
58
  const triggerSync = useServerFn(runSalesOrdersSync);
57
59
  const triggerTradeItemsSync = useServerFn(runTradeItemsSync);
58
60
  const { data, isLoading, error, refetch, isFetching } = useSalesOrdersQuery();
59
61
  const orders = data?.orders ?? [];
62
+ const activeEnvironment = data?.environment ?? "staging";
63
+ // Automatisch omschakelen wanneer de Authenticatie-module de omgeving wijzigt.
64
+ useEffect(() => {
65
+ const channel = supabase
66
+ .channel("floriday-settings-env")
67
+ .on("postgres_changes", { event: "*", schema: "public", table: "floriday_settings" }, () => {
68
+ queryClient.invalidateQueries({ queryKey: ["floriday", "salesorders-cache"] });
69
+ })
70
+ .subscribe();
71
+ return () => {
72
+ supabase.removeChannel(channel);
73
+ };
74
+ }, [queryClient]);
75
+ // Realtime — lijst live bijwerken zodra cache-regels binnenkomen/wijzigen.
76
+ useEffect(() => {
77
+ let timer = null;
78
+ const invalidate = () => {
79
+ if (timer)
80
+ clearTimeout(timer);
81
+ timer = setTimeout(() => {
82
+ queryClient.invalidateQueries({ queryKey: ["floriday", "salesorders-cache"] });
83
+ }, 500);
84
+ };
85
+ const channel = supabase
86
+ .channel("floriday-salesorders-cache")
87
+ .on("postgres_changes", { event: "*", schema: "public", table: "floriday_salesorders_cache" }, invalidate)
88
+ .on("postgres_changes", { event: "*", schema: "public", table: "floriday_fulfillment_orders_cache" }, invalidate)
89
+ .subscribe();
90
+ return () => {
91
+ if (timer)
92
+ clearTimeout(timer);
93
+ supabase.removeChannel(channel);
94
+ };
95
+ }, [queryClient]);
60
96
  const statusFiltered = useMemo(() => orders.filter((o) => matchesStatus(o, tab)), [orders, tab]);
61
97
  const filtered = useMemo(() => applyFilters(statusFiltered, filters), [statusFiltered, filters]);
62
98
  const totals = useMemo(() => computeTotals(filtered), [filtered]);
@@ -118,7 +154,7 @@ export function VerkoopOrdersPage() {
118
154
  ]);
119
155
  const syncedOrders = orders.results.reduce((s, x) => s + x.synced, 0);
120
156
  const syncedItems = items.results.reduce((s, x) => s + x.synced, 0);
121
- toast.success(`Sync klaar — ${syncedOrders} order(s), ${syncedItems} artikel(en) bijgewerkt`);
157
+ toast.success(`Sync klaar (${activeEnvironment === "live" ? "productie" : "staging"}) — ${syncedOrders} order(s), ${syncedItems} artikel(en) bijgewerkt`);
122
158
  await refetch();
123
159
  }
124
160
  catch (e) {
@@ -128,7 +164,7 @@ export function VerkoopOrdersPage() {
128
164
  setSyncing(false);
129
165
  }
130
166
  };
131
- return (_jsxs("main", { className: "space-y-5 p-6", children: [_jsx(FlorydaySyncHealthBanner, { environment: "staging", resources: ["sales-orders", "trade-items", "customer-organizations"] }), _jsx("div", { className: "flex items-center justify-between border-b border-border", children: _jsx("div", { className: "flex items-center gap-6 overflow-x-auto", children: STATUS_TABS.map((t) => {
167
+ return (_jsxs("main", { className: "space-y-5 p-6", children: [_jsx("div", { className: "flex items-center justify-between border-b border-border", children: _jsx("div", { className: "flex items-center gap-6 overflow-x-auto", children: STATUS_TABS.map((t) => {
132
168
  const active = tab === t.id;
133
169
  const count = statusCounts[t.id];
134
170
  return (_jsxs("button", { type: "button", onClick: () => setTab(t.id), className: "relative -mb-px flex items-center gap-2 whitespace-nowrap border-b-2 px-1 pb-3 pt-1 text-sm transition-colors " +