@flowselections/logistiek-engine 1.0.200 → 1.0.203

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BeladingIndelingCard.d.ts","sourceRoot":"","sources":["../../src/components/BeladingIndelingCard.tsx"],"names":[],"mappings":"AAqCA,wBAAgB,oBAAoB,gCAqJnC"}
1
+ {"version":3,"file":"BeladingIndelingCard.d.ts","sourceRoot":"","sources":["../../src/components/BeladingIndelingCard.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,oBAAoB,gCA0JnC"}
@@ -13,6 +13,7 @@ import { previewLoadCarrierPlan, replanOrderLoadCarriers } from "../lib/loadCarr
13
13
  import { ladingdragerNaam } from "../lib/loadCarrierTypes.js";
14
14
  import { useFloricodeLadingdragers } from "../hooks/useFloricodeLadingdragers.js";
15
15
  import { layerUtilizationPct } from "../lib/layerUtilization.js";
16
+ import { karBlokkade, ladingdragerPlatenTekst } from "../lib/extraPlaten.js";
16
17
  const db = () => supabase;
17
18
  export function BeladingIndelingCard() {
18
19
  const floricodeNamen = useFloricodeLadingdragers();
@@ -78,8 +79,5 @@ export function BeladingIndelingCard() {
78
79
  }
79
80
  };
80
81
  const safeCarts = Array.isArray(carts) ? carts : [];
81
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Boxes, { className: "h-5 w-5 text-primary" }), "Beladingindeling"] }), _jsx(CardDescription, { children: "De Engine deelt de orderregels van de hele buffer in over ladingdragers. Bekijk eerst het resultaat en leg het daarna vast." }), _jsxs("div", { className: "flex flex-wrap items-end gap-2 pt-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "indeling-order", children: "Ordernummer" }), _jsx(Input, { id: "indeling-order", value: orderNummer, onChange: (e) => setOrderNummer(e.target.value), placeholder: "SO-12345", className: "w-56" })] }), _jsxs(Button, { onClick: () => void bereken(), disabled: bezig || !orderNummer.trim(), children: [_jsx(Search, { className: "mr-2 h-4 w-4" }), "Berekenen"] }), _jsx(Button, { variant: "outline", onClick: () => void vastleggen(), disabled: bezig || !orderId, children: "Vastleggen" })] })] }), _jsxs(CardContent, { className: "space-y-4", children: [warnings.length > 0 && (_jsx("ul", { className: "space-y-1 rounded-lg border border-dashed p-3 text-sm text-muted-foreground", children: warnings.map((w, i) => (_jsx("li", { children: w }, i))) })), safeCarts.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen indeling berekend." })) : (safeCarts.map((cart) => (_jsxs("div", { className: "space-y-2 rounded-lg border p-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("span", { className: "font-medium", children: ["Ladingdrager ", cart.cart_number] }), _jsx(Badge, { variant: "secondary", children: ladingdragerNaam(cart.carrier_type, floricodeNamen) }), _jsxs(Badge, { variant: cart.is_complete ? "default" : "outline", children: [cart.occupancy_pct, "% vol"] }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [cart.total_layers_used, " van ", cart.max_layers, " lagen", (() => {
82
- const p = layerUtilizationPct(cart.total_layers_used, cart.max_layers);
83
- return p === null ? "" : ` · ${p}% van de kar`;
84
- })(), cart.weight_kg ? ` · ${cart.weight_kg} kg` : ""] })] }), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Partij" }), _jsx(TableHead, { className: "text-right", children: "Fusten" }), _jsx(TableHead, { className: "text-right", children: "Planten" }), _jsx(TableHead, { className: "text-right", children: "Aandeel" })] }) }), _jsx(TableBody, { children: (Array.isArray(cart.items) ? cart.items : []).map((item, idx) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: item.product_name }), _jsx(TableCell, { className: "text-right", children: item.crates }), _jsx(TableCell, { className: "text-right", children: item.plants }), _jsxs(TableCell, { className: "text-right", children: [Math.round(item.layer_share_pct * 10) / 10, "%"] })] }, `${item.order_item_id}-${idx}`))) })] })] }, cart.cart_number))))] })] }));
82
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Boxes, { className: "h-5 w-5 text-primary" }), "Beladingindeling"] }), _jsx(CardDescription, { children: "De Engine deelt de orderregels van de hele buffer in over ladingdragers. Bekijk eerst het resultaat en leg het daarna vast." }), _jsxs("div", { className: "flex flex-wrap items-end gap-2 pt-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx(Label, { htmlFor: "indeling-order", children: "Ordernummer" }), _jsx(Input, { id: "indeling-order", value: orderNummer, onChange: (e) => setOrderNummer(e.target.value), placeholder: "SO-12345", className: "w-56" })] }), _jsxs(Button, { onClick: () => void bereken(), disabled: bezig || !orderNummer.trim(), children: [_jsx(Search, { className: "mr-2 h-4 w-4" }), "Berekenen"] }), _jsx(Button, { variant: "outline", onClick: () => void vastleggen(), disabled: bezig || !orderId, children: "Vastleggen" })] })] }), _jsxs(CardContent, { className: "space-y-4", children: [warnings.length > 0 && (_jsx("ul", { className: "space-y-1 rounded-lg border border-dashed p-3 text-sm text-muted-foreground", children: warnings.map((w, i) => (_jsx("li", { children: w }, i))) })), safeCarts.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nog geen indeling berekend." })) : (safeCarts.map((cart) => (_jsxs("div", { className: "space-y-2 rounded-lg border p-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("span", { className: "font-medium", children: ["Ladingdrager ", cart.cart_number] }), _jsx(Badge, { variant: "secondary", children: ladingdragerNaam(cart.carrier_type, floricodeNamen) }), _jsxs(Badge, { variant: cart.is_complete ? "default" : "outline", children: [cart.occupancy_pct, "% vol"] }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [ladingdragerPlatenTekst(ladingdragerNaam(cart.carrier_type, floricodeNamen), cart.total_layers_used, cart.occupancy_pct ?? layerUtilizationPct(cart.total_layers_used, cart.max_layers)), cart.weight_kg ? ` · ${cart.weight_kg} kg` : ""] })] }), karBlokkade(cart.cart_number, cart.total_layers_used, cart.max_layers).blokkade && (_jsx("p", { className: "rounded-md border border-destructive/40 bg-destructive/10 p-2 text-sm text-destructive", children: karBlokkade(cart.cart_number, cart.total_layers_used, cart.max_layers).blokkade.tekst })), _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Partij" }), _jsx(TableHead, { className: "text-right", children: "Fusten" }), _jsx(TableHead, { className: "text-right", children: "Planten" }), _jsx(TableHead, { className: "text-right", children: "Aandeel" })] }) }), _jsx(TableBody, { children: (Array.isArray(cart.items) ? cart.items : []).map((item, idx) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "font-medium", children: item.product_name }), _jsx(TableCell, { className: "text-right", children: item.crates }), _jsx(TableCell, { className: "text-right", children: item.plants }), _jsxs(TableCell, { className: "text-right", children: [Math.round(item.layer_share_pct * 10) / 10, "%"] })] }, `${item.order_item_id}-${idx}`))) })] })] }, cart.cart_number))))] })] }));
85
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DataGereedheidCard.d.ts","sourceRoot":"","sources":["../../src/components/DataGereedheidCard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE3E,KAAK,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACxG,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAMzN,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAuB9H;AAED,KAAK,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,KAAK,KAAK,GAAG;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClI,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAS7C,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ7C,CAAC;AAGF,wBAAgB,kBAAkB,gCAuKjC"}
1
+ {"version":3,"file":"DataGereedheidCard.d.ts","sourceRoot":"","sources":["../../src/components/DataGereedheidCard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU3E,KAAK,IAAI,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACxG,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAMzN,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,GAAG;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAuB9H;AAED,KAAK,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,KAAK,KAAK,GAAG;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClI,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAS7C,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQ7C,CAAC;AAGF,wBAAgB,kBAAkB,gCAoLjC"}
@@ -13,6 +13,13 @@ import { RefreshCw } from "lucide-react";
13
13
  import { supabase } from "../integrations/supabase/moduleClient.js";
14
14
  import { maxFustenPerLaag } from "../lib/dimensionPlanner.js";
15
15
  import { fysiekeBelading } from "../lib/beladingRegels.js";
16
+ import { ladingdragerNaam } from "../lib/loadCarrierTypes.js";
17
+ import { useFloricodeLadingdragers } from "../hooks/useFloricodeLadingdragers.js";
18
+ const METHODE_LABEL = {
19
+ belading: "Indeling op belading (fusten per laag × lagen)",
20
+ afmetingen: "Indeling op afmetingen",
21
+ dimensies: "Indeling op afmetingen",
22
+ };
16
23
  const num = (v) => {
17
24
  const n = Number(v);
18
25
  return v != null && Number.isFinite(n) && n > 0 ? n : null;
@@ -71,6 +78,7 @@ export function DataGereedheidCard() {
71
78
  const [bezig, setBezig] = useState(null);
72
79
  const [fusten, setFusten] = useState(new Map());
73
80
  const [dragers, setDragers] = useState(new Map());
81
+ const floricodeNamen = useFloricodeLadingdragers();
74
82
  const laden = useCallback(async () => {
75
83
  setLoading(true);
76
84
  setFout(null);
@@ -113,9 +121,21 @@ export function DataGereedheidCard() {
113
121
  else
114
122
  await laden();
115
123
  };
116
- const metGaten = rijen.filter((r) => Array.isArray(r.ontbrekend) && r.ontbrekend.length > 0);
117
124
  const fysiek = (r) => fysiekVoorRegel(r, typeof r.velden?.fust_type_id?.waarde === "string" ? fusten.get(r.velden.fust_type_id.waarde) ?? null : null, r.ladingdrager ? dragers.get(r.ladingdrager) ?? null : null);
118
- return (_jsxs(Card, { id: "gegevens-voor-karindeling", children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: "Gegevens voor karindeling" }), _jsx(CardDescription, { children: "Producten in open orders waarvan een waarde ontbreekt. Een voorstel (berekend of van vergelijkbare producten) wordt pas gebruikt als je het hier invult en opslaat." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "h-4 w-4" }), "Verversen"] })] }), _jsxs(CardContent, { className: "space-y-3", children: [fout && _jsx("p", { className: "text-sm text-destructive", children: fout }), loading ? (_jsx(Skeleton, { className: "h-16 w-full" })) : metGaten.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Alle producten in open orders hebben de benodigde gegevens." })) : (metGaten.map((r) => (_jsxs("div", { className: "rounded-md border p-3 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [_jsx("span", { className: "font-medium", children: r.product }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [r.in_open_order ? "In open order" : "Niet in open order", " \u00B7 methode ", r.methode, r.ladingdrager ? ` · ${r.ladingdrager}` : ""] })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: r.uitleg }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Fust ", String(r.velden?.fust_type_id?.naam ?? "onbekend"), " (", bronTekst(r.velden?.fust_type_id?.bron), ") \u00B7 maten", " ", ["fust_length_mm", "fust_width_mm", "fust_height_mm"]
125
+ // 1.0.201: onmogelijk bovenaan, dan ontbrekende gegevens, dan alleen een waarschuwing (gewicht).
126
+ const rang = (r) => {
127
+ if (fysiek(r).status === "onmogelijk")
128
+ return 0;
129
+ const mist = (Array.isArray(r.ontbrekend) ? r.ontbrekend : []).filter((v) => v !== "weight");
130
+ if (mist.length > 0)
131
+ return 1;
132
+ return 2;
133
+ };
134
+ const metGaten = rijen
135
+ .filter((r) => (Array.isArray(r.ontbrekend) && r.ontbrekend.length > 0) || fysiek(r).status === "onmogelijk")
136
+ .sort((a, b) => rang(a) - rang(b) || a.product.localeCompare(b.product));
137
+ const dragerNaam = (code) => code ? ladingdragerNaam(code, floricodeNamen, dragers.get(code)?.name ?? undefined) : "";
138
+ return (_jsxs(Card, { id: "gegevens-voor-karindeling", children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsx(CardTitle, { children: "Gegevens voor karindeling" }), _jsx(CardDescription, { children: "Producten in open orders waarvan een waarde ontbreekt. Een voorstel (berekend of van vergelijkbare producten) wordt pas gebruikt als je het hier invult en opslaat." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "h-4 w-4" }), "Verversen"] })] }), _jsxs(CardContent, { className: "space-y-3", children: [fout && _jsx("p", { className: "text-sm text-destructive", children: fout }), loading ? (_jsx(Skeleton, { className: "h-16 w-full" })) : metGaten.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Alle producten in open orders hebben de benodigde gegevens." })) : (metGaten.map((r) => (_jsxs("div", { className: "rounded-md border p-3 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-baseline justify-between gap-2", children: [_jsx("span", { className: "font-medium", children: r.product }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [rang(r) === 0 ? "Onmogelijk · " : rang(r) === 2 ? "Compleet, 1 waarschuwing · " : "", r.in_open_order ? "In open order" : "Niet in open order", " \u00B7 ", METHODE_LABEL[r.methode] ?? "Indeling", r.ladingdrager ? ` · ${dragerNaam(r.ladingdrager)}` : ""] })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: r.uitleg }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Fust ", String(r.velden?.fust_type_id?.naam ?? "onbekend"), " (", bronTekst(r.velden?.fust_type_id?.bron), ") \u00B7 maten", " ", ["fust_length_mm", "fust_width_mm", "fust_height_mm"]
119
139
  .map((k) => `${r.velden?.[k]?.waarde ?? "?"} mm (${bronTekst(r.velden?.[k]?.bron)})`)
120
140
  .join(" × "), " ", "\u00B7 planthoogte inclusief pot ", r.velden?.plant_height_cm?.waarde != null ? `${r.velden.plant_height_cm.waarde} cm` : "onbekend", " (", bronTekst(r.velden?.plant_height_cm?.bron), ")"] }), r.ontbrekend.map((veld) => {
121
141
  const k = `${r.product_id}:${veld}`;
@@ -31,7 +31,7 @@ export function HerindelingMeldingCard() {
31
31
  const orders = Array.isArray(data?.orders) ? data.orders : [];
32
32
  const aantal = Number(data?.wouldChange ?? 0);
33
33
  const probleem = data?.ok === false ? data.error : data?.lastError;
34
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: ["Herindelen", _jsx(Badge, { variant: "outline", children: data?.mode === "apply" ? "Uitvoeren" : "Alleen melden" })] }), _jsx(CardDescription, { children: "Alleen open orders (niet geprint, gescand of verstuurd) met een leverdag vanaf vandaag. Bestaande indelingen veranderen hier niet." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "h-4 w-4" }), "Verversen"] })] }), _jsx(CardContent, { className: "space-y-3", children: loading ? (_jsx(Skeleton, { className: "h-16 w-full" })) : fout ? (_jsx("p", { className: "text-sm text-destructive", children: fout })) : (_jsxs(_Fragment, { children: [probleem ? _jsx("p", { className: "text-sm text-destructive", children: probleem }) : null, _jsxs("p", { className: "text-sm font-medium", children: [aantal, " order", aantal === 1 ? "" : "s", " zou", aantal === 1 ? "" : "den", " anders ingedeeld worden (alleen leverdagen vanaf vandaag)"] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [Number(data?.checked ?? 0), " open order(s) bekeken", data?.lastRunAt
35
- ? ` · laatste ronde ${new Date(data.lastRunAt).toLocaleString("nl-NL")} (${Number(data.lastDurationMs ?? 0)} ms)`
34
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: ["Herindelen", _jsx(Badge, { variant: "outline", children: data?.mode === "apply" ? "Uitvoeren" : "Alleen melden" })] }), _jsx(CardDescription, { children: "Alleen open orders (niet geprint, gescand of verstuurd) met een leverdag vanaf vandaag. Bestaande indelingen veranderen hier niet." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: [_jsx(RefreshCw, { className: "h-4 w-4" }), "Verversen"] })] }), _jsx(CardContent, { className: "space-y-3", children: loading ? (_jsx(Skeleton, { className: "h-16 w-full" })) : fout ? (_jsx("p", { className: "text-sm text-destructive", children: fout })) : (_jsxs(_Fragment, { children: [probleem ? _jsx("p", { className: "text-sm text-destructive", children: probleem }) : null, _jsxs("p", { className: "text-sm font-medium", children: [aantal, " order", aantal === 1 ? "" : "s", " zou", aantal === 1 ? "" : "den", " anders ingedeeld worden (alleen leverdagen vanaf vandaag)"] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [Number(data?.checked ?? 0), " open order(s) bekeken \u00B7 deze lijst is nu berekend", data?.lastRunAt
35
+ ? ` · laatste echte herindeling ${new Date(data.lastRunAt).toLocaleString("nl-NL")} (${Number(data.lastDurationMs ?? 0)} ms; draait alleen na een wijziging in de combineerregels)`
36
36
  : ""] }), orders.length > 0 ? (_jsx("div", { className: "overflow-x-auto rounded-md border", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-left", children: _jsxs("tr", { children: [_jsx("th", { className: "p-2", children: "Order" }), _jsx("th", { className: "p-2", children: "Leverdag" }), _jsx("th", { className: "p-2", children: "Uitkomst" }), _jsx("th", { className: "p-2", children: "Huidige indeling" }), _jsx("th", { className: "p-2", children: "Nieuwe indeling" }), _jsx("th", { className: "p-2", children: "Reden" })] }) }), _jsx("tbody", { children: orders.map((o) => (_jsxs("tr", { className: "border-t align-top", children: [_jsx("td", { className: "p-2 font-medium", children: o.orderNumber ?? "—" }), _jsx("td", { className: "p-2", children: o.deliveryDate ?? "—" }), _jsx("td", { className: "p-2", children: o.wijzigt === false ? "Blijft zoals het is" : "Zou wijzigen" }), _jsx("td", { className: "p-2", children: o.huidig }), _jsx("td", { className: "p-2", children: o.nieuw }), _jsx("td", { className: "p-2 break-all text-xs text-muted-foreground", children: o.reden })] }, o.orderId))) })] }) })) : null] })) })] }));
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartlijstCard.d.ts","sourceRoot":"","sources":["../../src/components/StartlijstCard.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,cAAc,gCAqG7B"}
1
+ {"version":3,"file":"StartlijstCard.d.ts","sourceRoot":"","sources":["../../src/components/StartlijstCard.tsx"],"names":[],"mappings":"AA6BA,wBAAgB,cAAc,gCA2G7B"}
@@ -47,7 +47,10 @@ export function StartlijstCard() {
47
47
  await laden();
48
48
  };
49
49
  const Stap = ({ klaar, titel, tekst, naar }) => (_jsxs("div", { className: "flex items-start gap-3", children: [klaar ? _jsx(CheckCircle2, { className: "mt-0.5 h-5 w-5 text-primary" }) : _jsx(Circle, { className: "mt-0.5 h-5 w-5 text-muted-foreground" }), _jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "font-medium", children: titel }), _jsxs("p", { className: "text-muted-foreground", children: [tekst, naar && (_jsxs(_Fragment, { children: [" ", _jsx(Link, { to: naar, className: "underline", children: "Openen" })] }))] })] })] }));
50
- return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Startlijst" }), _jsx(CardDescription, { children: "Wat er nodig is om karren te kunnen indelen, in deze volgorde." })] }), _jsxs(CardContent, { className: "space-y-3", children: [fout && _jsx("p", { className: "text-sm text-destructive", children: fout }), _jsx(Stap, { klaar: s?.ladingdragers?.klaar, titel: "1. Ladingdragers", tekst: `${s?.ladingdragers?.aantal ?? 0} actief, ${s?.ladingdragers?.onvolledig ?? 0} zonder volledige maten.`, naar: "/logistiek-engine/ladingdragers" }), _jsx(Stap, { klaar: s?.werkwijze?.klaar, titel: "2. Werkwijze", tekst: s?.werkwijze?.klaar ? "Ingesteld." : "Nog niet ingesteld in de Rule Engine.", naar: "/logistiek-engine/rule-engine" }), _jsx(Stap, { klaar: s?.gereedheid?.klaar, titel: "3. Gereedheid per product", tekst: `${s?.gereedheid?.onvolledig ?? 0} van ${s?.gereedheid?.producten ?? 0} producten in open orders missen gegevens.` }), _jsxs("div", { className: "flex flex-wrap gap-2 border-t pt-3", children: [_jsx(Button, { variant: "outline", size: "sm", disabled: bezig, onClick: () => void overnemen(false), children: "Alles overnemen uit Floricode/Floriday" }), voor && !voor.uitgevoerd && voor.aantal > 0 && (_jsxs(Button, { size: "sm", disabled: bezig, onClick: () => void overnemen(true), children: ["Bevestigen: ", voor.aantal, " veld(en) invullen"] }))] }), voor && (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsxs("p", { children: [voor.uitgevoerd ? "Ingevuld" : "Voorvertoning", ": ", voor.aantal, " leeg veld(en)", Object.keys(voor.per_bron).length > 0 &&
50
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Startlijst" }), _jsx(CardDescription, { children: "Wat er nodig is om karren te kunnen indelen, in deze volgorde." })] }), _jsxs(CardContent, { className: "space-y-3", children: [fout && _jsx("p", { className: "text-sm text-destructive", children: fout }), _jsx(Stap, { klaar: s?.ladingdragers?.klaar, titel: "1. Ladingdragers", tekst: `${s?.ladingdragers?.aantal ?? 0} actief, ${s?.ladingdragers?.onvolledig ?? 0} zonder volledige maten.`, naar: "/logistiek-engine/ladingdragers" }), _jsx(Stap, { klaar: s?.werkwijze?.klaar, titel: "2. Werkwijze", tekst: s?.werkwijze?.klaar ? "Ingesteld." : "Nog niet ingesteld in de Rule Engine.", naar: "/logistiek-engine/rule-engine" }), _jsx(Stap, { klaar: s?.gereedheid?.klaar, titel: "3. Gereedheid per product", tekst: `${s?.gereedheid?.onvolledig ?? 0} van ${s?.gereedheid?.producten ?? 0} producten in open orders missen gegevens.` +
51
+ ((s?.gereedheid?.waarschuwing ?? 0) > 0
52
+ ? ` ${s?.gereedheid?.waarschuwing} compleet, 1 waarschuwing (alleen gewicht ontbreekt).`
53
+ : ""), naar: "/logistiek-engine/beheer" }), _jsxs("div", { className: "flex flex-wrap gap-2 border-t pt-3", children: [_jsx(Button, { variant: "outline", size: "sm", disabled: bezig, onClick: () => void overnemen(false), children: "Alles overnemen uit Floricode/Floriday" }), voor && !voor.uitgevoerd && voor.aantal > 0 && (_jsxs(Button, { size: "sm", disabled: bezig, onClick: () => void overnemen(true), children: ["Bevestigen: ", voor.aantal, " veld(en) invullen"] }))] }), voor && (_jsxs("div", { className: "space-y-1 text-sm", children: [_jsxs("p", { children: [voor.uitgevoerd ? "Ingevuld" : "Voorvertoning", ": ", voor.aantal, " leeg veld(en)", Object.keys(voor.per_bron).length > 0 &&
51
54
  ` (${Object.entries(voor.per_bron)
52
55
  .map(([b, n]) => `${n} uit ${b}`)
53
56
  .join(", ")})`, ". Bestaande waarden blijven staan."] }), voor.velden.slice(0, 30).map((v, i) => (_jsxs("p", { className: "text-xs text-muted-foreground", children: [v.naam, ": ", VELD[v.veld] ?? v.veld, " = ", String(v.waarde), " (", v.bron, ")"] }, i)))] }))] })] }));
@@ -84,4 +84,5 @@ export * from './lib/shellAdres.js';
84
84
  export * from './hooks/useShellAdres.js';
85
85
  export { BeladingVerstuurderCard } from "./components/BeladingVerstuurderCard.js";
86
86
  export { DocumentkeuzeCard } from "./components/DocumentkeuzeCard.js";
87
+ export * from './lib/extraPlaten.js';
87
88
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist-lib/index.js CHANGED
@@ -98,3 +98,4 @@ export * from './lib/shellAdres.js';
98
98
  export * from './hooks/useShellAdres.js';
99
99
  export { BeladingVerstuurderCard } from "./components/BeladingVerstuurderCard.js";
100
100
  export { DocumentkeuzeCard } from "./components/DocumentkeuzeCard.js";
101
+ export * from './lib/extraPlaten.js';