@flowselections/floriday-verkoop-module 1.0.53 → 1.0.55

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 (66) hide show
  1. package/dist-lib/components/verkoop/OrderKarindelingCard.d.ts.map +1 -1
  2. package/dist-lib/components/verkoop/OrderKarindelingCard.js +68 -183
  3. package/dist-lib/integrations/supabase/auth-middleware.d.ts +42 -0
  4. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  5. package/dist-lib/integrations/supabase/client.d.ts +42 -0
  6. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  7. package/dist-lib/integrations/supabase/client.server.d.ts +42 -0
  8. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  9. package/dist-lib/integrations/supabase/types.d.ts +42 -0
  10. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  11. package/dist-lib/lib/cart-lock.functions.d.ts +42 -0
  12. package/dist-lib/lib/cart-lock.functions.d.ts.map +1 -1
  13. package/dist-lib/lib/cart-planning-settings.functions.d.ts +462 -0
  14. package/dist-lib/lib/cart-planning-settings.functions.d.ts.map +1 -1
  15. package/dist-lib/lib/cart-replan.functions.d.ts +141 -23
  16. package/dist-lib/lib/cart-replan.functions.d.ts.map +1 -1
  17. package/dist-lib/lib/cart-replan.functions.js +111 -15
  18. package/dist-lib/lib/create-order.functions.d.ts +714 -0
  19. package/dist-lib/lib/create-order.functions.d.ts.map +1 -1
  20. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts +126 -0
  21. package/dist-lib/lib/floriday-auto-fulfillment.functions.d.ts.map +1 -1
  22. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts +42 -0
  23. package/dist-lib/lib/floriday-logistic-labels.functions.d.ts.map +1 -1
  24. package/dist-lib/lib/floriday-mirror.functions.d.ts +42 -0
  25. package/dist-lib/lib/floriday-mirror.functions.d.ts.map +1 -1
  26. package/dist-lib/lib/floriday-public.functions.d.ts +294 -0
  27. package/dist-lib/lib/floriday-public.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/floriday-writes.functions.d.ts +210 -0
  29. package/dist-lib/lib/floriday-writes.functions.d.ts.map +1 -1
  30. package/dist-lib/lib/invoice-timing.functions.d.ts +168 -0
  31. package/dist-lib/lib/invoice-timing.functions.d.ts.map +1 -1
  32. package/dist-lib/lib/invoice-timing.functions.js +12 -6
  33. package/dist-lib/lib/load-carriers.functions.d.ts +42 -0
  34. package/dist-lib/lib/load-carriers.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/logistics-engine.functions.d.ts +210 -0
  36. package/dist-lib/lib/logistics-engine.functions.d.ts.map +1 -1
  37. package/dist-lib/lib/logistics-engine.functions.js +10 -5
  38. package/dist-lib/lib/logistics-stock.functions.d.ts +84 -0
  39. package/dist-lib/lib/logistics-stock.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/order-addresses.functions.d.ts +42 -0
  41. package/dist-lib/lib/order-addresses.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/order-addresses.functions.js +15 -9
  43. package/dist-lib/lib/order-buffers.functions.d.ts +126 -0
  44. package/dist-lib/lib/order-buffers.functions.d.ts.map +1 -1
  45. package/dist-lib/lib/order-buffers.functions.js +10 -10
  46. package/dist-lib/lib/order-carrier.functions.d.ts +84 -0
  47. package/dist-lib/lib/order-carrier.functions.d.ts.map +1 -1
  48. package/dist-lib/lib/order-carrier.functions.js +20 -11
  49. package/dist-lib/lib/order-pickup.functions.d.ts +84 -0
  50. package/dist-lib/lib/order-pickup.functions.d.ts.map +1 -1
  51. package/dist-lib/lib/order-pickup.functions.js +20 -11
  52. package/dist-lib/lib/order-row.server.d.ts +24 -0
  53. package/dist-lib/lib/order-row.server.d.ts.map +1 -0
  54. package/dist-lib/lib/order-row.server.js +58 -0
  55. package/dist-lib/lib/order-shipments.functions.d.ts +168 -0
  56. package/dist-lib/lib/order-shipments.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/order-shipments.functions.js +11 -6
  58. package/dist-lib/lib/salesorders-list.functions.d.ts +42 -0
  59. package/dist-lib/lib/salesorders-list.functions.d.ts.map +1 -1
  60. package/dist-lib/lib/salesorders.functions.d.ts +210 -0
  61. package/dist-lib/lib/salesorders.functions.d.ts.map +1 -1
  62. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts +84 -0
  63. package/dist-lib/lib/stock-consumption-alerts.functions.d.ts.map +1 -1
  64. package/dist-lib/lib/tradeitems.functions.d.ts +42 -0
  65. package/dist-lib/lib/tradeitems.functions.d.ts.map +1 -1
  66. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OrderKarindelingCard.d.ts","sourceRoot":"","sources":["../../../src/components/verkoop/OrderKarindelingCard.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA6G/D,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,2CA4OvE"}
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,208 +1,93 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // Toont karindeling per order. De belading (planten×fusten×lagen) komt
3
- // ALTIJD uit de producten in Voorraad (tabel `products`) — nooit uit de
4
- // Floriday-packingConfiguration — zodat verkoop en voorraad synchroon zijn.
5
- // Alleen wanneer de order geen `product_id`-koppeling heeft, valt de kaart
6
- // terug op de Floriday packingConfiguration.
7
- import { useEffect, useMemo, useState } from "react";
2
+ // Toont de karindeling van de buffer waarin deze order valt.
3
+ //
4
+ // BELANGRIJK: deze kaart LEEST de karren uit `order_carts`/`order_cart_items`
5
+ // via de server-fn `listOrderCarts`. Hij berekent niets zelf — de planner
6
+ // draait server-side (cart-replan v3 / logistics_plan_buffer_sql). Een eigen
7
+ // herberekening in de browser gaf eerder een andere indeling dan de database
8
+ // (één artikel per kar, verkeerde kar-telling) en is daarom verwijderd.
9
+ import { useEffect, useMemo } from "react";
10
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
11
+ import { useServerFn } from "@tanstack/react-start";
8
12
  import { Badge, Card, CardContent, CardHeader, CardTitle, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@flowselections/core";
9
13
  import { CheckCircle2, Lock } from "lucide-react";
10
14
  import { supabase } from "../../integrations/supabase/client";
11
15
  import { formatBeladingNotation } from "../../lib/load-carrier-labels";
12
- import { planCarts } from "../../lib/cart-planner";
13
- import { expandOrderItemsForPlanner } from "../../lib/expand-group-order-items";
14
- function deriveCartsFromFloriday(order) {
15
- const o = order.raw.order ?? {};
16
- const pack = o?.packingConfiguration ?? {};
17
- const ppc = Math.max(1, Number(pack.piecesPerPackage ?? order.quantity.count ?? 1));
18
- const cpl = Math.max(1, Number(pack.packagesPerLayer ?? 1));
19
- const lpc = Math.max(1, Number(pack.layersPerLoadCarrier ?? 1));
20
- const totalPieces = Math.max(0, Number(o.numberOfPieces ?? order.totalPieces ?? 0));
21
- if (totalPieces <= 0)
22
- return [];
23
- const totalCrates = Math.ceil(totalPieces / ppc);
24
- const cratesPerCart = cpl * lpc;
25
- const fullCarts = Math.floor(totalCrates / cratesPerCart);
26
- const remainderCrates = totalCrates - fullCarts * cratesPerCart;
27
- const carts = [];
28
- let n = 1;
29
- for (let i = 0; i < fullCarts; i++) {
30
- carts.push({
31
- cart_number: n++,
32
- is_complete: true,
33
- occupancy_pct: 100,
34
- total_layers_used: lpc,
35
- items: [{
36
- product_name: order.productName,
37
- crates: cratesPerCart,
38
- plants: cratesPerCart * ppc,
39
- plants_per_crate: ppc,
40
- crates_per_layer: cpl,
41
- layers_per_cart: lpc,
42
- layer_share_pct: 100,
43
- }],
44
- });
45
- }
46
- if (remainderCrates > 0) {
47
- const layersUsed = Math.ceil(remainderCrates / cpl);
48
- const occ = Math.round(((layersUsed / lpc) * 100) * 100) / 100;
49
- carts.push({
50
- cart_number: n,
51
- is_complete: false,
52
- occupancy_pct: occ,
53
- total_layers_used: layersUsed,
54
- items: [{
55
- product_name: order.productName,
56
- crates: remainderCrates,
57
- plants: remainderCrates * ppc,
58
- plants_per_crate: ppc,
59
- crates_per_layer: cpl,
60
- layers_per_cart: lpc,
61
- layer_share_pct: occ,
62
- }],
63
- });
64
- }
65
- return carts;
66
- }
16
+ import { listOrderCarts } from "../../lib/cart-replan.functions";
17
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
67
18
  function belading(i) {
68
19
  // Eén notatie in de hele module: lagen × fusten/laag × planten/fust
69
20
  // (Floriday-UI-volgorde, bewust anders dan de API-veldvolgorde).
70
- return (formatBeladingNotation(i.layers_per_cart, i.crates_per_layer, i.plants_per_crate) ??
71
- `${i.layers_per_cart}×${i.crates_per_layer}×${i.plants_per_crate}`);
21
+ const l = i.layers_per_cart ?? 0;
22
+ const c = i.crates_per_layer ?? 0;
23
+ const p = i.plants_per_crate ?? 0;
24
+ if (!l || !c || !p)
25
+ return "—";
26
+ return formatBeladingNotation(l, c, p) ?? `${l}×${c}×${p}`;
72
27
  }
73
28
  export function OrderKarindelingCard({ order }) {
74
29
  // Lokale/mailbox-orders hebben een prefix (`local:`, `mailbox-proposal:`) in
75
- // hun DTO-id. De DB-tabellen (`orders`, `order_items`) gebruiken de kale UUID,
76
- // dus die prefix moet eraf voor de query — anders faalt de UUID-cast en valt
77
- // de kaart terug op de Floriday-modus met slechts één artikel.
30
+ // hun DTO-id; de DB gebruikt de kale UUID.
78
31
  const rawId = order?.id ?? order.raw?.order?.id ?? null;
79
- const orderId = typeof rawId === "string" ? rawId.replace(/^(local:|mailbox-proposal:)/, "") : rawId;
80
- const [lockedAt, setLockedAt] = useState(null);
81
- const [dbItems, setDbItems] = useState(null);
82
- const [plannerInputs, setPlannerInputs] = useState(null);
83
- const [bufferOrders, setBufferOrders] = useState([]);
84
- const [, setBufferId] = useState(null);
32
+ const stripped = typeof rawId === "string" ? rawId.replace(/^(local:|mailbox-proposal:)/, "") : null;
33
+ const orderId = stripped && UUID_RE.test(stripped) ? stripped : null;
34
+ const fetchCarts = useServerFn(listOrderCarts);
35
+ const queryClient = useQueryClient();
36
+ const queryKey = ["order-carts", orderId];
37
+ const { data, isLoading, error } = useQuery({
38
+ queryKey,
39
+ enabled: !!orderId,
40
+ staleTime: 15000,
41
+ retry: false,
42
+ queryFn: async () => fetchCarts({ data: { orderId: orderId } }),
43
+ });
44
+ // Realtime op de karren zelf — niet meer op products/order_items, want die
45
+ // voedden de verwijderde client-planner.
85
46
  useEffect(() => {
86
47
  if (!orderId)
87
48
  return;
88
- let active = true;
89
- const load = async () => {
90
- // 1) Bepaal de buffer van deze order.
91
- const { data: orderRow } = await supabase
92
- .from("orders")
93
- .select("plan_locked_at, buffer_id")
94
- .eq("id", orderId)
95
- .maybeSingle();
96
- if (!active)
97
- return;
98
- const bid = orderRow?.buffer_id ?? null;
99
- setLockedAt(orderRow?.plan_locked_at ?? null);
100
- setBufferId(bid);
101
- // 2) Verzamel alle orders in deze buffer (of alleen deze order als er
102
- // geen buffer bekend is).
103
- let orderIds = [orderId];
104
- let siblingOrders = [];
105
- if (bid) {
106
- const { data: sibs } = await supabase
107
- .from("orders")
108
- .select("id, order_number")
109
- .eq("buffer_id", bid)
110
- .is("deleted_at", null);
111
- siblingOrders = (sibs ?? []).map((s) => ({
112
- id: s.id,
113
- order_number: s.order_number,
114
- }));
115
- if (siblingOrders.length > 0)
116
- orderIds = siblingOrders.map((s) => s.id);
117
- }
118
- if (!active)
119
- return;
120
- setBufferOrders(siblingOrders);
121
- // 3) Items van alle orders in de buffer.
122
- const { data: itemRows } = await supabase
123
- .from("order_items")
124
- .select("id, order_id, product_id, product_name, quantity, products(plants_per_crate, crates_per_layer, layers_per_cart)")
125
- .in("order_id", orderIds);
126
- if (!active)
127
- return;
128
- const items = itemRows ?? [];
129
- setDbItems(items);
130
- const raws = items.map((it) => ({
131
- id: it.id,
132
- product_id: it.product_id,
133
- product_name: it.product_name,
134
- quantity: Number(it.quantity ?? 0),
135
- plants_per_crate: Math.max(1, Number(it.products?.plants_per_crate ?? 1)),
136
- crates_per_layer: Math.max(1, Number(it.products?.crates_per_layer ?? 1)),
137
- layers_per_cart: Math.max(1, Number(it.products?.layers_per_cart ?? 1)),
138
- }));
139
- const expanded = await expandOrderItemsForPlanner(supabase, raws);
140
- if (!active)
141
- return;
142
- setPlannerInputs(expanded);
143
- };
144
- void load();
49
+ const invalidate = () => void queryClient.invalidateQueries({ queryKey: ["order-carts", orderId] });
145
50
  const channel = supabase
146
- .channel(`order-karindeling-${orderId}`)
147
- .on("postgres_changes", { event: "UPDATE", schema: "public", table: "orders" }, () => void load())
148
- .on("postgres_changes", { event: "*", schema: "public", table: "order_items" }, () => void load())
149
- .on("postgres_changes", { event: "UPDATE", schema: "public", table: "products" }, () => void load())
51
+ .channel(`order-carts-${orderId}`)
52
+ .on("postgres_changes", { event: "*", schema: "public", table: "order_carts" }, invalidate)
53
+ .on("postgres_changes", { event: "*", schema: "public", table: "order_cart_items" }, invalidate)
54
+ .on("postgres_changes", { event: "UPDATE", schema: "public", table: "orders" }, invalidate)
150
55
  .subscribe();
151
56
  return () => {
152
- active = false;
153
57
  void supabase.removeChannel(channel);
154
58
  };
155
- }, [orderId]);
156
- // Map: order_item_id -> order_id, en order_id -> order_number.
157
- const itemToOrder = useMemo(() => {
158
- const m = new Map();
159
- for (const it of dbItems ?? [])
160
- m.set(it.id, it.order_id);
161
- return m;
162
- }, [dbItems]);
163
- const orderNumberById = useMemo(() => {
59
+ }, [orderId, queryClient]);
60
+ const carts = (data?.carts ?? []);
61
+ const orders = data?.orders ?? [];
62
+ const lockedAt = data?.planLockedAt ?? null;
63
+ const blocked = data?.blocked ?? null;
64
+ // De DB-order-id (verschilt van de DTO-id bij Floriday-orders).
65
+ const dbOrderId = data?.orderId ?? null;
66
+ const orderNumberByItem = useMemo(() => {
67
+ const numberByOrder = new Map();
68
+ for (const o of orders)
69
+ numberByOrder.set(o.id, o.order_number);
164
70
  const m = new Map();
165
- for (const o of bufferOrders)
166
- m.set(o.id, o.order_number);
71
+ for (const it of data?.itemOrders ?? []) {
72
+ m.set(it.id, { orderId: it.order_id, orderNumber: numberByOrder.get(it.order_id) ?? null });
73
+ }
167
74
  return m;
168
- }, [bufferOrders]);
169
- const plannerCarts = useMemo(() => {
170
- if (!plannerInputs || plannerInputs.length === 0)
75
+ }, [data, orders]);
76
+ // Bron-badge uit de data: order_carts.source + algorithm_version.
77
+ const sourceLabel = useMemo(() => {
78
+ const srcs = [...new Set(carts.map((c) => c.source ?? "onbekend"))];
79
+ const vers = [...new Set(carts.map((c) => c.algorithm_version).filter((v) => v != null))];
80
+ if (srcs.length === 0)
171
81
  return null;
172
- return planCarts(plannerInputs).carts;
173
- }, [plannerInputs]);
174
- const floridayCarts = useMemo(() => deriveCartsFromFloriday(order), [order]);
175
- const usingVoorraad = plannerCarts !== null;
176
- const carts = usingVoorraad
177
- ? plannerCarts.map((c) => {
178
- const orderIds = new Set();
179
- const items = c.items.map((i) => {
180
- const oid = itemToOrder.get(i.order_item_id) ?? null;
181
- if (oid)
182
- orderIds.add(oid);
183
- return {
184
- product_name: i.product_name,
185
- crates: i.crates,
186
- plants: i.plants,
187
- plants_per_crate: i.plants_per_crate,
188
- crates_per_layer: i.crates_per_layer,
189
- layers_per_cart: i.layers_per_cart,
190
- layer_share_pct: i.layer_share_pct,
191
- order_id: oid,
192
- order_number: oid ? orderNumberById.get(oid) ?? null : null,
193
- };
194
- });
195
- return {
196
- cart_number: c.cart_number,
197
- is_complete: c.is_complete,
198
- occupancy_pct: c.occupancy_pct,
199
- total_layers_used: c.total_layers_used,
200
- items,
201
- order_ids: [...orderIds],
202
- };
203
- })
204
- : floridayCarts;
205
- const source = usingVoorraad ? "voorraad" : "floriday";
82
+ return `${srcs.join(", ")}${vers.length > 0 ? ` · v${vers.join("/")}` : ""}`;
83
+ }, [carts]);
206
84
  const lockedDate = lockedAt ? new Date(lockedAt).toLocaleString("nl-NL") : null;
207
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Karindeling" }), _jsxs("div", { className: "flex items-center gap-2", children: [lockedAt && (_jsxs(Badge, { variant: "outline", className: "gap-1", children: [_jsx(Lock, { className: "h-3 w-3" }), "Vergrendeld \u2014 pakbon geprint ", lockedDate] })), bufferOrders.length > 1 && (_jsxs(Badge, { variant: "outline", title: bufferOrders.map((o) => o.order_number).join(", "), children: ["Buffer \u00B7 ", bufferOrders.length, " orders"] })), _jsxs(Badge, { variant: "secondary", children: [carts.length, " kar(ren) \u00B7 bron: ", source === "voorraad" ? "Voorraad" : "Floriday"] })] })] }), _jsx(CardContent, { children: carts.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen karindeling beschikbaar voor deze order." })) : (_jsx("div", { className: "space-y-4", children: carts.map((c) => (_jsxs("div", { className: "rounded-md border border-border", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-3 py-2 text-sm", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "font-mono font-medium", children: ["Kar ", c.cart_number] }), _jsxs(Badge, { variant: c.is_complete ? "default" : "secondary", className: "gap-1", children: [c.is_complete && _jsx(CheckCircle2, { className: "h-3 w-3" }), c.is_complete ? "Volledig" : "Deels"] })] }), _jsxs("div", { className: "text-muted-foreground", children: [c.total_layers_used, " lagen \u00B7 benutting ", c.occupancy_pct, "%"] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Artikel" }), _jsx(TableHead, { className: "text-right", children: "Planten" }), _jsx(TableHead, { className: "text-right", children: "Fusten" }), _jsx(TableHead, { children: "Belading" }), _jsx(TableHead, { className: "text-right", children: "Laag-aandeel" })] }) }), _jsx(TableBody, { children: c.items.map((i, idx) => (_jsxs(TableRow, { children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { children: i.product_name }), i.order_number && bufferOrders.length > 1 && (_jsx(Badge, { variant: i.order_id === orderId ? "default" : "outline", className: "text-[10px]", children: i.order_number }))] }) }), _jsx(TableCell, { className: "text-right", children: i.plants }), _jsx(TableCell, { className: "text-right", children: i.crates }), _jsx(TableCell, { className: "font-mono text-xs", children: belading(i) }), _jsxs(TableCell, { className: "text-right", children: [Math.round(i.layer_share_pct * 10) / 10, "%"] })] }, idx))) })] })] }, c.cart_number))) })) })] }));
85
+ const multiOrder = orders.length > 1;
86
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(CardTitle, { className: "text-base", children: "Karindeling" }), _jsxs("div", { className: "flex items-center gap-2", children: [lockedAt && (_jsxs(Badge, { variant: "outline", className: "gap-1", children: [_jsx(Lock, { className: "h-3 w-3" }), "Vergrendeld \u2014 pakbon geprint ", lockedDate] })), multiOrder && (_jsxs(Badge, { variant: "outline", title: orders.map((o) => o.order_number ?? o.id).join(", "), children: ["Buffer \u00B7 ", orders.length, " orders"] })), !error && (_jsxs(Badge, { variant: "secondary", children: [carts.length, " kar(ren)", sourceLabel ? ` · bron: ${sourceLabel}` : ""] }))] })] }), _jsx(CardContent, { children: isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Karindeling laden\u2026" })) : error ? (_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm font-medium text-destructive", children: "Kon de karindeling niet laden." }), _jsx("p", { className: "text-sm text-muted-foreground", children: error.message })] })) : carts.length === 0 ? (_jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen karindeling beschikbaar voor deze order." }), blocked && (blocked.explanation || blocked.reason) && (_jsxs("p", { className: "text-sm text-destructive", children: [blocked.explanation ?? blocked.reason, blocked.at ? ` (${new Date(blocked.at).toLocaleString("nl-NL")})` : ""] }))] })) : (_jsx("div", { className: "space-y-4", children: carts.map((c) => (_jsxs("div", { className: "rounded-md border border-border", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-border bg-muted/30 px-3 py-2 text-sm", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "font-mono font-medium", children: ["Kar ", c.cart_number] }), _jsxs(Badge, { variant: c.is_complete ? "default" : "secondary", className: "gap-1", children: [c.is_complete && _jsx(CheckCircle2, { className: "h-3 w-3" }), c.is_complete ? "Volledig" : "Deels"] }), c.order_id === null && multiOrder && (_jsx(Badge, { variant: "outline", children: "Gedeelde kar" })), c.carrier_type && (_jsxs(Badge, { variant: "outline", className: "font-mono text-[10px]", children: [c.carrier_type, c.max_layers ? ` · ${c.max_layers} lagen` : ""] }))] }), _jsxs("div", { className: "text-muted-foreground", children: [Number(c.total_layers_used ?? 0), " lagen \u00B7 benutting", " ", Math.round(Number(c.occupancy_pct ?? 0) * 10) / 10, "%"] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Artikel" }), _jsx(TableHead, { className: "text-right", children: "Planten" }), _jsx(TableHead, { className: "text-right", children: "Fusten" }), _jsx(TableHead, { children: "Belading" }), _jsx(TableHead, { className: "text-right", children: "Laag-aandeel" })] }) }), _jsx(TableBody, { children: (c.order_cart_items ?? []).map((i) => {
87
+ const own = i.order_item_id
88
+ ? orderNumberByItem.get(i.order_item_id)
89
+ : undefined;
90
+ 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
+ }) })] })] }, c.id))) })) })] }));
208
93
  }
@@ -10736,6 +10736,24 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
10736
10736
  };
10737
10737
  Relationships: [];
10738
10738
  };
10739
+ maps_job_lease: {
10740
+ Row: {
10741
+ job: string;
10742
+ locked_until: string;
10743
+ updated_at: string;
10744
+ };
10745
+ Insert: {
10746
+ job: string;
10747
+ locked_until?: string;
10748
+ updated_at?: string;
10749
+ };
10750
+ Update: {
10751
+ job?: string;
10752
+ locked_until?: string;
10753
+ updated_at?: string;
10754
+ };
10755
+ Relationships: [];
10756
+ };
10739
10757
  maps_request_queue: {
10740
10758
  Row: {
10741
10759
  attempts: number;
@@ -13597,6 +13615,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
13597
13615
  foutmelding: string | null;
13598
13616
  gebruiker_id: string | null;
13599
13617
  gebruiker_naam: string;
13618
+ gebruikte_bron: string | null;
13619
+ gebruikte_layout_id: string | null;
13600
13620
  gestart_op: string | null;
13601
13621
  herkomst: string | null;
13602
13622
  id: string;
@@ -13627,6 +13647,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
13627
13647
  foutmelding?: string | null;
13628
13648
  gebruiker_id?: string | null;
13629
13649
  gebruiker_naam?: string;
13650
+ gebruikte_bron?: string | null;
13651
+ gebruikte_layout_id?: string | null;
13630
13652
  gestart_op?: string | null;
13631
13653
  herkomst?: string | null;
13632
13654
  id?: string;
@@ -13657,6 +13679,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
13657
13679
  foutmelding?: string | null;
13658
13680
  gebruiker_id?: string | null;
13659
13681
  gebruiker_naam?: string;
13682
+ gebruikte_bron?: string | null;
13683
+ gebruikte_layout_id?: string | null;
13660
13684
  gestart_op?: string | null;
13661
13685
  herkomst?: string | null;
13662
13686
  id?: string;
@@ -20326,6 +20350,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
20326
20350
  foutmelding: string | null;
20327
20351
  gebruiker_id: string | null;
20328
20352
  gebruiker_naam: string;
20353
+ gebruikte_bron: string | null;
20354
+ gebruikte_layout_id: string | null;
20329
20355
  gestart_op: string | null;
20330
20356
  herkomst: string | null;
20331
20357
  id: string;
@@ -20447,6 +20473,8 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
20447
20473
  foutmelding: string | null;
20448
20474
  gebruiker_id: string | null;
20449
20475
  gebruiker_naam: string;
20476
+ gebruikte_bron: string | null;
20477
+ gebruikte_layout_id: string | null;
20450
20478
  gestart_op: string | null;
20451
20479
  herkomst: string | null;
20452
20480
  id: string;
@@ -21503,6 +21531,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
21503
21531
  };
21504
21532
  Returns: string;
21505
21533
  };
21534
+ logistics_document_type_map: {
21535
+ Args: {
21536
+ _document_code: string;
21537
+ };
21538
+ Returns: Database["public"]["Enums"]["doc_layout_type"][];
21539
+ };
21506
21540
  logistics_emit_event: {
21507
21541
  Args: {
21508
21542
  p_event_type: string;
@@ -21966,6 +22000,14 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
21966
22000
  };
21967
22001
  Returns: string;
21968
22002
  };
22003
+ maps_cron_token: {
22004
+ Args: never;
22005
+ Returns: string;
22006
+ };
22007
+ maps_kick_queue: {
22008
+ Args: never;
22009
+ Returns: undefined;
22010
+ };
21969
22011
  mark_offer_clicked: {
21970
22012
  Args: {
21971
22013
  p_code: string;