@flowselections/floriday-verkoop-module 1.0.55 → 1.0.57

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 (72) hide show
  1. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/OrderAfleverbrievenCard.js +5 -5
  3. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  4. package/dist-lib/components/verkoop/OrderKarindelingCard.js +2 -1
  5. package/dist-lib/components/verkoop/SalesOrdersTable.d.ts.map +1 -1
  6. package/dist-lib/components/verkoop/SalesOrdersTable.js +17 -4
  7. package/dist-lib/integrations/supabase/auth-middleware.d.ts +355 -18
  8. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/client.d.ts +355 -18
  10. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  11. package/dist-lib/integrations/supabase/client.server.d.ts +355 -18
  12. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  13. package/dist-lib/integrations/supabase/types.d.ts +357 -18
  14. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  15. package/dist-lib/lib/cart-lock.functions.d.ts +355 -18
  16. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-planning-settings.functions.d.ts +3948 -241
  18. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
  19. package/dist-lib/lib/cart-replan.functions.d.ts +1065 -54
  20. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  21. package/dist-lib/lib/cart-replan.functions.js +38 -31
  22. package/dist-lib/lib/create-order.functions.d.ts +6164 -435
  23. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +1065 -54
  25. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floriday-gateway.server.d.ts +14 -0
  27. package/dist-lib/lib/floriday-gateway.server.d.ts.map +1 -1
  28. package/dist-lib/lib/floriday-gateway.server.js +46 -0
  29. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +23972 -28
  30. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  31. package/dist-lib/lib/floriday-logistic-labels.functions.js +209 -90
  32. package/dist-lib/lib/floriday-mirror.functions.d.ts +355 -18
  33. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/floriday-public.functions.d.ts +2485 -126
  35. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  36. package/dist-lib/lib/floriday-sync.d.ts.map +1 -1
  37. package/dist-lib/lib/floriday-writes.functions.d.ts +1775 -90
  38. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  39. package/dist-lib/lib/invoice-timing.functions.d.ts +1420 -72
  40. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  41. package/dist-lib/lib/load-carriers.functions.d.ts +355 -18
  42. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  43. package/dist-lib/lib/logistics-engine.functions.d.ts +1775 -90
  44. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/logistics-stock.functions.d.ts +710 -36
  46. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/order-addresses.functions.d.ts +355 -18
  48. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/order-buffers.functions.d.ts +1065 -54
  50. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/order-carrier.functions.d.ts +710 -36
  52. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/order-pickup.functions.d.ts +710 -36
  54. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  55. package/dist-lib/lib/order-shipments.functions.d.ts +1420 -72
  56. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/product-name.d.ts +3 -0
  58. package/dist-lib/lib/product-name.d.ts.map +1 -0
  59. package/dist-lib/lib/product-name.js +43 -0
  60. package/dist-lib/lib/salesorders-list.functions.d.ts +355 -18
  61. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/salesorders-list.server.d.ts.map +1 -1
  63. package/dist-lib/lib/salesorders-list.server.js +43 -1
  64. package/dist-lib/lib/salesorders-mapping.d.ts +8 -0
  65. package/dist-lib/lib/salesorders-mapping.d.ts.map +1 -1
  66. package/dist-lib/lib/salesorders.functions.d.ts +1775 -90
  67. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  68. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +710 -36
  69. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  70. package/dist-lib/lib/tradeitems.functions.d.ts +355 -18
  71. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  72. package/package.json +131 -131
@@ -1 +1 @@
1
- {"version":3,"file":"OrderAfleverbrievenCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderAfleverbrievenCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CAmLA"}
1
+ {"version":3,"file":"OrderAfleverbrievenCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderAfleverbrievenCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,WAAW,EACX,QAAQ,GACT,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CA4LA"}
@@ -57,7 +57,7 @@ export function OrderAfleverbrievenCard({ salesOrderId, orderNumber, werkplek, }
57
57
  async function printLabel(l) {
58
58
  if (!l.signedUrl)
59
59
  return;
60
- const sleutel = `${l.fulfillmentOrderId}-${l.code}`;
60
+ const sleutel = `${l.fulfillmentOrderId ?? "eigen"}-${l.code ?? ""}`;
61
61
  setBezig(sleutel);
62
62
  try {
63
63
  // Printer alleen zelf bepalen wanneer de shell een expliciete werkplek kent.
@@ -78,7 +78,7 @@ export function OrderAfleverbrievenCard({ salesOrderId, orderNumber, werkplek, }
78
78
  herkomst: "floriday",
79
79
  ...(werkplek ? { werkplek } : {}),
80
80
  ...(printerId ? { printerId } : {}),
81
- payload: { order_id: salesOrderId, ordernummer: orderNumber ?? l.code },
81
+ payload: { order_id: salesOrderId, ordernummer: orderNumber ?? l.orderNumber ?? l.code },
82
82
  isHerprint: true,
83
83
  });
84
84
  setJobStatus((s) => ({ ...s, [sleutel]: "wachtend" }));
@@ -106,10 +106,10 @@ export function OrderAfleverbrievenCard({ salesOrderId, orderNumber, werkplek, }
106
106
  await printLabel(l);
107
107
  }
108
108
  }
109
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Afleverbrieven" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [labels.length, " brief(en)"] }), labels.some((l) => l.hasPdf && l.signedUrl) && (_jsxs(Button, { variant: "outline", size: "sm", onClick: printAlles, disabled: bezig !== null, children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), "Alles printen"] })), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => refetch(), disabled: isFetching, title: "Opnieuw ophalen bij Floriday", children: _jsx(RefreshCw, { className: `h-4 w-4 ${isFetching ? "animate-spin" : ""}` }) })] })] }), _jsxs(CardContent, { children: [isLoading && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Afleverbrieven ophalen\u2026" })), error && (_jsx("p", { className: "text-sm text-destructive", children: error.message })), !isLoading && !error && labels.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen afleverbrief beschikbaar (order nog niet vrijgegeven door Floriday)." })), labels.length > 0 && (_jsx("div", { className: "divide-y divide-border rounded-md border border-border", children: labels.map((l) => {
109
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Afleverbrieven" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [labels.length, " brief(en)"] }), labels.some((l) => l.hasPdf && l.signedUrl) && (_jsxs(Button, { variant: "outline", size: "sm", onClick: printAlles, disabled: bezig !== null, children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), "Alles printen"] })), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => refetch(), disabled: isFetching, title: "Opnieuw ophalen bij Floriday", children: _jsx(RefreshCw, { className: `h-4 w-4 ${isFetching ? "animate-spin" : ""}` }) })] })] }), _jsxs(CardContent, { children: [isLoading && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Afleverbrieven ophalen\u2026" })), error && (_jsx("p", { className: "text-sm text-destructive", children: error.message })), !isLoading && !error && labels.length === 0 && (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen afleverbrief beschikbaar (order nog niet vrijgegeven door Floriday)." })), labels.length > 0 && (_jsx("div", { className: "divide-y divide-border rounded-md border border-border", children: labels.map((l, i) => {
110
110
  const lcShort = l.loadCarrierType ? LC_SHORT[l.loadCarrierType] ?? l.loadCarrierType.slice(0, 2) : "";
111
- const sleutel = `${l.fulfillmentOrderId}-${l.code}`;
111
+ const sleutel = `${l.fulfillmentOrderId ?? "eigen"}-${l.code ?? i}`;
112
112
  const status = jobStatus[sleutel];
113
- return (_jsxs("div", { className: "flex items-center justify-between gap-4 px-3 py-2 text-sm", children: [_jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [_jsx(FileText, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "font-mono font-medium", children: [l.code, l.letter ? _jsxs("span", { className: "ml-1 text-primary", children: ["\u00B7", l.letter] }) : null] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Kar ", l.loadCarrierIndex, lcShort ? ` · ${lcShort}` : "", l.packages ? ` · ${l.packages} fusten` : "", status ? ` · print: ${status}` : ""] })] })] }), _jsx("div", { className: "flex items-center gap-2", children: l.hasPdf && l.signedUrl ? (_jsxs(_Fragment, { children: [_jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsxs("a", { href: l.signedUrl, target: "_blank", rel: "noreferrer", children: [_jsx(ExternalLink, { className: "mr-1 h-3.5 w-3.5" }), "Openen"] }) }), _jsxs(Button, { variant: "default", size: "sm", onClick: () => printLabel(l), disabled: bezig !== null, children: [bezig === sleutel ? (_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" })) : (_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" })), "Printen"] })] })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: "PDF nog niet vrijgegeven" })) })] }, `${l.fulfillmentOrderId}-${l.code}-${l.letter ?? ""}`));
113
+ return (_jsxs("div", { className: "flex items-center justify-between gap-4 px-3 py-2 text-sm", children: [_jsxs("div", { className: "flex items-center gap-3 min-w-0", children: [_jsx(FileText, { className: "h-4 w-4 shrink-0 text-muted-foreground" }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "font-mono font-medium", children: [l.code, l.letter ? _jsxs("span", { className: "ml-1 text-primary", children: ["\u00B7", l.letter] }) : null] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: [l.orderNumber ? `${l.orderNumber} · ` : "", "Kar ", l.loadCarrierIndex, lcShort ? ` · ${lcShort}` : "", l.packages ? ` · ${l.packages} fusten` : "", l.source === "engine" ? " · eigen engine" : "", status ? ` · print: ${status}` : ""] }), !l.hasPdf && l.errorMessage && (_jsxs("div", { className: "text-xs text-destructive", children: [l.errorMessage, l.httpStatus ? ` (code ${l.httpStatus})` : ""] }))] })] }), _jsx("div", { className: "flex items-center gap-2", children: l.hasPdf && l.signedUrl ? (_jsxs(_Fragment, { children: [_jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsxs("a", { href: l.signedUrl, target: "_blank", rel: "noreferrer", children: [_jsx(ExternalLink, { className: "mr-1 h-3.5 w-3.5" }), "Openen"] }) }), _jsxs(Button, { variant: "default", size: "sm", onClick: () => printLabel(l), disabled: bezig !== null, children: [bezig === sleutel ? (_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" })) : (_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" })), "Printen"] })] })) : (_jsx("span", { className: "text-xs text-muted-foreground", children: l.httpStatus === 423 ? "Nog in concept" : "PDF nog niet beschikbaar" })) })] }, `${sleutel}-${l.letter ?? ""}`));
114
114
  }) }))] })] }));
115
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OrderKarindelingCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderKarindelingCard.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4C/D,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,2CA8LvE"}
1
+ {"version":3,"file":"OrderKarindelingCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderKarindelingCard.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA6C/D,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,2CA8LvE"}
@@ -14,6 +14,7 @@ import { CheckCircle2, Lock } from "lucide-react";
14
14
  import { supabase } from "../../integrations/supabase/client";
15
15
  import { formatBeladingNotation } from "../../lib/load-carrier-labels";
16
16
  import { listOrderCarts } from "../../lib/cart-replan.functions";
17
+ import { resolveProductName } from "../../lib/product-name";
17
18
  const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
19
  function belading(i) {
19
20
  // Eén notatie in de hele module: lagen × fusten/laag × planten/fust
@@ -88,6 +89,6 @@ export function OrderKarindelingCard({ order }) {
88
89
  ? orderNumberByItem.get(i.order_item_id)
89
90
  : undefined;
90
91
  const crates = Number(i.crates ?? 0);
91
- return (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { children: i.product_name ?? "—" }), multiOrder && own?.orderNumber && (_jsx(Badge, { variant: own.orderId === dbOrderId ? "default" : "outline", className: "text-[10px]", children: own.orderNumber }))] }) }), _jsx(TableCell, { className: "text-right", children: crates * Number(i.plants_per_crate ?? 0) }), _jsx(TableCell, { className: "text-right", children: crates }), _jsx(TableCell, { className: "font-mono text-xs", children: belading(i) }), _jsxs(TableCell, { className: "text-right", children: [Math.round(Number(i.layer_share_pct ?? 0) * 10) / 10, "%"] })] }, i.id));
92
+ return (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { children: resolveProductName(i.product_name) ?? "—" }), multiOrder && own?.orderNumber && (_jsx(Badge, { variant: own.orderId === dbOrderId ? "default" : "outline", className: "text-[10px]", children: own.orderNumber }))] }) }), _jsx(TableCell, { className: "text-right", children: crates * Number(i.plants_per_crate ?? 0) }), _jsx(TableCell, { className: "text-right", children: crates }), _jsx(TableCell, { className: "font-mono text-xs", children: belading(i) }), _jsxs(TableCell, { className: "text-right", children: [Math.round(Number(i.layer_share_pct ?? 0) * 10) / 10, "%"] })] }, i.id));
92
93
  }) })] })] }, c.id))) })) })] }));
93
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SalesOrdersTable.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/SalesOrdersTable.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAmDnE,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAG1D;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC7C,2CAkPA"}
1
+ {"version":3,"file":"SalesOrdersTable.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/SalesOrdersTable.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AA2DnE,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAG1D;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC7C,2CAqRA"}
@@ -32,6 +32,15 @@ function formatDelivery(iso) {
32
32
  : d.toLocaleTimeString("nl-NL", { hour: "2-digit", minute: "2-digit" }),
33
33
  };
34
34
  }
35
+ /** Pickdag uit de Engine (datum zonder tijd). */
36
+ function formatPickDate(iso) {
37
+ if (!iso)
38
+ return "—";
39
+ const d = new Date(`${String(iso).slice(0, 10)}T00:00:00`);
40
+ if (Number.isNaN(d.getTime()))
41
+ return String(iso);
42
+ return d.toLocaleDateString("nl-NL", { day: "numeric", month: "short", year: "numeric" });
43
+ }
35
44
  function StatusTag({ order }) {
36
45
  const stage = order.stage ?? "incoming";
37
46
  const bufferSize = order.bufferSize ?? 1;
@@ -54,7 +63,7 @@ export function SalesOrdersTable({ orders, loading, onSelectOrder, onDeleteOrder
54
63
  const someChecked = !allChecked && rowIds.some((id) => selected.has(id));
55
64
  // Omzetkolom alleen tonen wanneer er daadwerkelijk bedragen bekend zijn.
56
65
  const showRevenue = orders.some((o) => (o.revenue ?? 0) > 0);
57
- const columnCount = showRevenue ? 10 : 9;
66
+ const columnCount = showRevenue ? 11 : 10;
58
67
  const applySelection = (ids) => {
59
68
  if (onSelectionChange)
60
69
  onSelectionChange(ids);
@@ -66,7 +75,7 @@ export function SalesOrdersTable({ orders, loading, onSelectOrder, onDeleteOrder
66
75
  next.has(id) ? next.delete(id) : next.add(id);
67
76
  applySelection(Array.from(next));
68
77
  };
69
- return (_jsx("div", { className: "rounded-lg border border-border bg-card", children: _jsx("div", { className: "max-h-[70vh] overflow-y-auto overflow-x-auto overscroll-contain [scrollbar-gutter:stable]", style: { WebkitOverflowScrolling: "touch" }, children: _jsxs(Table, { className: "min-w-[950px] [&_thead_th]:sticky [&_thead_th]:top-0 [&_thead_th]:z-10 [&_thead_th]:bg-card", children: [_jsx(TableHeader, { children: _jsxs(TableRow, { className: "hover:bg-transparent", children: [_jsx(TableHead, { className: "w-10", children: _jsx(Checkbox, { "aria-label": "Alle bestellingen selecteren", checked: allChecked ? true : someChecked ? "indeterminate" : false, onCheckedChange: (v) => applySelection(v === true ? rowIds : []) }) }), _jsx(TableHead, { children: "Levering" }), _jsx(TableHead, { children: "Klant" }), _jsx(TableHead, { children: "Product" }), _jsx(TableHead, { children: "Karren" }), _jsx(TableHead, { children: "Fusten" }), _jsx(TableHead, { children: "Vervoerder" }), _jsx(TableHead, { children: "Status" }), showRevenue && _jsx(TableHead, { children: "Omzet" }), _jsx(TableHead, { children: _jsxs("span", { className: "inline-flex items-center gap-1", children: ["Besteld ", _jsx(ArrowDown, { className: "h-3 w-3" })] }) }), _jsx(TableHead, { className: "w-10" })] }) }), _jsxs(TableBody, { children: [loading &&
78
+ return (_jsx("div", { className: "rounded-lg border border-border bg-card", children: _jsx("div", { className: "max-h-[70vh] overflow-y-auto overflow-x-auto overscroll-contain [scrollbar-gutter:stable]", style: { WebkitOverflowScrolling: "touch" }, children: _jsxs(Table, { className: "min-w-[950px] [&_thead_th]:sticky [&_thead_th]:top-0 [&_thead_th]:z-10 [&_thead_th]:bg-card", children: [_jsx(TableHeader, { children: _jsxs(TableRow, { className: "hover:bg-transparent", children: [_jsx(TableHead, { className: "w-10", children: _jsx(Checkbox, { "aria-label": "Alle bestellingen selecteren", checked: allChecked ? true : someChecked ? "indeterminate" : false, onCheckedChange: (v) => applySelection(v === true ? rowIds : []) }) }), _jsx(TableHead, { children: "Levering" }), _jsx(TableHead, { children: "Pickdag" }), _jsx(TableHead, { children: "Klant" }), _jsx(TableHead, { children: "Product" }), _jsx(TableHead, { children: "Karren" }), _jsx(TableHead, { children: "Fusten" }), _jsx(TableHead, { children: "Vervoerder" }), _jsx(TableHead, { children: "Status" }), showRevenue && _jsx(TableHead, { children: "Omzet" }), _jsx(TableHead, { children: _jsxs("span", { className: "inline-flex items-center gap-1", children: ["Besteld ", _jsx(ArrowDown, { className: "h-3 w-3" })] }) }), _jsx(TableHead, { className: "w-10" })] }) }), _jsxs(TableBody, { children: [loading &&
70
79
  Array.from({ length: 6 }).map((_, i) => (_jsx(TableRow, { children: Array.from({ length: columnCount + 1 }).map((__, j) => (_jsx(TableCell, { children: _jsx(Skeleton, { className: "h-6 w-full" }) }, j))) }, `s-${i}`))), !loading && orders.length === 0 && (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: columnCount + 1, className: "py-12 text-center text-muted-foreground", children: "Geen verkooporders gevonden." }) })), !loading &&
71
80
  orders.map((row) => {
72
81
  // Buffers zijn serverside al samengevouwen tot één rij.
@@ -80,9 +89,13 @@ export function SalesOrdersTable({ orders, loading, onSelectOrder, onDeleteOrder
80
89
  !!row.loadCarrierType &&
81
90
  !allowedCarrierCodes.includes(row.loadCarrierType);
82
91
  const incomplete = row.incomplete ?? [];
83
- return (_jsxs(TableRow, { className: `align-top cursor-pointer ${isBuffer ? "bg-muted/20 border-l-2 border-primary/40" : ""}`, onClick: () => onSelectOrder?.(row), children: [_jsx(TableCell, { onClick: (e) => e.stopPropagation(), children: _jsx(Checkbox, { checked: selected.has(rowId), onCheckedChange: () => toggle(rowId) }) }), _jsxs(TableCell, { children: [_jsx("div", { className: "font-medium text-foreground", children: delivery.date }), delivery.time && (_jsx("div", { className: "text-xs text-muted-foreground", children: delivery.time }))] }), _jsxs(TableCell, { children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: row.customer.name }), isBuffer && (_jsxs(Badge, { variant: "outline", className: "border-primary/30 text-primary", children: ["Buffer \u00B7 ", bufferSize] })), reserved > 0 && (_jsx(Badge, { variant: "outline", className: "border-amber-400/40 text-amber-600", children: reserved === bufferSize
92
+ return (_jsxs(TableRow, { className: `align-top cursor-pointer ${isBuffer ? "bg-muted/20 border-l-2 border-primary/40" : ""}`, onClick: () => onSelectOrder?.(row), children: [_jsx(TableCell, { onClick: (e) => e.stopPropagation(), children: _jsx(Checkbox, { checked: selected.has(rowId), onCheckedChange: () => toggle(rowId) }) }), _jsxs(TableCell, { children: [_jsx("div", { className: "font-medium text-foreground", children: delivery.date }), delivery.time && (_jsx("div", { className: "text-xs text-muted-foreground", children: delivery.time }))] }), _jsxs(TableCell, { children: [_jsx("div", { className: "font-medium text-foreground", children: formatPickDate(row.pickDate) }), _jsxs("div", { className: "mt-1 flex flex-wrap gap-1", children: [row.shifted && (_jsx(Badge, { variant: "outline", className: "border-amber-400/40 text-[11px] font-normal text-amber-600", title: "De Engine heeft deze order doorgeschoven: te laat aangemeld.", children: "te laat aangemeld" })), row.printedAt && (_jsx(Badge, { variant: "outline", className: "border-transparent bg-muted text-[11px] font-normal text-muted-foreground", title: "Deze order is al uitgeprint.", children: "uitgeprint" }))] })] }), _jsxs(TableCell, { children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "font-medium text-foreground", children: row.customer.name }), isBuffer && (_jsxs(Badge, { variant: "outline", className: "border-primary/30 text-primary", children: ["Buffer \u00B7 ", bufferSize] })), reserved > 0 && (_jsx(Badge, { variant: "outline", className: "border-amber-400/40 text-amber-600", children: reserved === bufferSize
84
93
  ? "Reservering"
85
- : `Reservering · ${reserved} van ${bufferSize}` })), carrierDisabled && (_jsx(Badge, { variant: "outline", className: "border-destructive/40 text-destructive", title: "Deze ladingdrager is uitgeschakeld in de Logistiek Engine.", children: "Ladingdrager uitgeschakeld" }))] }), _jsx("div", { className: "text-xs text-muted-foreground", children: [row.customer.postalCode, row.customer.city].filter(Boolean).join(" ") }), incomplete.length > 0 && (_jsxs("div", { className: "mt-1 inline-flex items-center gap-1 text-xs text-amber-600", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), incomplete.join(" · ")] }))] }), _jsxs(TableCell, { children: [_jsx("div", { className: "font-medium text-foreground", children: row.productName || "—" }), _jsx("div", { className: "text-xs text-muted-foreground", children: row.totalPieces > 0 ? `${row.totalPieces} stuks` : "" })] }), _jsx(TableCell, { children: _jsx("div", { className: "font-medium text-foreground", children: formatLoadUnits(row.karCount, row.cartTypeName) }) }), _jsx(TableCell, { children: _jsx("div", { className: "font-medium text-foreground", children: formatLoadUnits(row.fustCount, row.crateTypeName) }) }), _jsx(TableCell, { className: "text-sm text-foreground", children: row.carrierName || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { children: _jsx(StatusTag, { order: row }) }), showRevenue && (_jsxs(TableCell, { className: "font-medium text-foreground", children: ["\u20AC ", (row.revenue ?? 0).toFixed(2)] })), _jsxs(TableCell, { children: [_jsx("div", { className: "text-sm text-foreground", children: ordered.date }), _jsx("div", { className: "text-xs text-muted-foreground", children: isBuffer
94
+ : `Reservering · ${reserved} van ${bufferSize}` })), carrierDisabled && (_jsx(Badge, { variant: "outline", className: "border-destructive/40 text-destructive", title: "Deze ladingdrager is uitgeschakeld in de Logistiek Engine.", children: "Ladingdrager uitgeschakeld" }))] }), _jsx("div", { className: "text-xs text-muted-foreground", children: [row.customer.postalCode, row.customer.city].filter(Boolean).join(" ") }), incomplete.length > 0 && (_jsxs("div", { className: "mt-1 inline-flex items-center gap-1 text-xs text-amber-600", children: [_jsx(AlertTriangle, { className: "h-3 w-3" }), incomplete.join(" · ")] }))] }), _jsxs(TableCell, { children: [_jsx("div", { className: "font-medium text-foreground", children: row.productName || "—" }), _jsx("div", { className: "text-xs text-muted-foreground", children: !row.engineCounts
95
+ ? "—"
96
+ : row.totalPieces > 0
97
+ ? `${row.totalPieces} planten`
98
+ : "" })] }), _jsx(TableCell, { children: _jsx("div", { className: "font-medium text-foreground", children: row.engineCounts ? (formatLoadUnits(row.karCount, row.cartTypeName)) : (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) }) }), _jsx(TableCell, { children: _jsx("div", { className: "font-medium text-foreground", children: formatLoadUnits(row.fustCount, row.crateTypeName) }) }), _jsx(TableCell, { className: "text-sm text-foreground", children: row.carrierName || _jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }), _jsx(TableCell, { children: _jsx(StatusTag, { order: row }) }), showRevenue && (_jsxs(TableCell, { className: "font-medium text-foreground", children: ["\u20AC ", (row.revenue ?? 0).toFixed(2)] })), _jsxs(TableCell, { children: [_jsx("div", { className: "text-sm text-foreground", children: ordered.date }), _jsx("div", { className: "text-xs text-muted-foreground", children: isBuffer
86
99
  ? `${bufferSize} orders`
87
100
  : row.orderNumber || ordered.time })] }), _jsx(TableCell, { onClick: (e) => e.stopPropagation(), children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { className: "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground", children: _jsx(MoreVertical, { className: "h-4 w-4" }) }), _jsxs(DropdownMenuContent, { align: "end", children: [_jsx(DropdownMenuItem, { disabled: isBuffer || !row.isLocal, onClick: () => !isBuffer && row.isLocal && onEditOrder?.(row), title: isBuffer
88
101
  ? "Buffer-orders kunnen niet gebundeld bewerkt worden."