@flowselections/floriday-afhandeling-module 1.0.56 → 1.0.58

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":"DagDetailDialog.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/DagDetailDialog.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAmGjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,sCAG1D"}
1
+ {"version":3,"file":"DagDetailDialog.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/DagDetailDialog.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA2JjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,sCAG1D"}
@@ -3,14 +3,14 @@ import { createContext, useContext, useState } from "react";
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useServerFn } from "@tanstack/react-start";
5
5
  import { Badge, Checkbox, Button, Dialog, DialogTitle, DialogDescription, Input, Tabs, TabsContent, TabsList, TabsTrigger, toast, } from "@flowselections/core";
6
- import { CalendarClock, CheckCircle2, ChevronDown, ChevronRight, Printer, Users } from "lucide-react";
6
+ import { AlertTriangle, CalendarClock, CheckCircle2, ChevronDown, ChevronRight, Printer, Users } from "lucide-react";
7
+ import { useStickerMeldingen, useOrderArchived } from "../../hooks/useOrderMeldingen";
7
8
  import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../ui/responsive-dialog.js";
8
9
  import { usePickAgenda } from "../../hooks/usePickAgenda";
9
10
  import { useOrderBuffers, useBufferMembers } from "../../hooks/useOrderBuffers";
10
11
  import { isSameDay } from "../../lib/pickDate";
11
12
  import { getOrderLines, getDayCartContents, getOrderCartIds, getPakbonCartInfo, } from "../../lib/cartAssignments.functions";
12
13
  import { printLayoutDocument, printPdfDocument, printFoutMelding } from "../../lib/printing";
13
- import { AutoProcessStatus } from "./AutoProcessStatus";
14
14
  import { NuVersturenButton } from "./NuVersturenButton";
15
15
  import { CapacityWarning } from "./CapacityWarning";
16
16
  import { useCapacityCheck } from "../../hooks/useCapacityCheck";
@@ -35,14 +35,47 @@ function voortgang(status) {
35
35
  return { label: "Nog te picken", done: false, variant: "outline" };
36
36
  }
37
37
  const ShipStateCtx = createContext(new Map());
38
- /** Voortgang met voorrang voor de echte verzendstatus: eerst Floriday, dan de scan. */
39
- function useVoortgang(ref, status) {
38
+ /** Eén status per order: annulering/archief > Floriday-poging of afmelding > Engine. */
39
+ function useVoortgang(ref, status, opts = { floriday: null }) {
40
40
  const st = useContext(ShipStateCtx).get(refKey(ref));
41
- if (st?.floridaySent)
42
- return { label: "Verzonden naar Floriday", done: true, variant: "default" };
43
- if (st?.approvedAll)
44
- return { label: "Klaar voor verzending", done: false, variant: "secondary" };
45
- return voortgang(status);
41
+ if (opts.cancelled)
42
+ return { label: "Geannuleerd", done: true, variant: "outline", bron: "Verkoop" };
43
+ if (opts.archived === true)
44
+ return { label: "Gearchiveerd", done: true, variant: "outline", bron: "Engine" };
45
+ const archiefNote = opts.archived === null ? " · archiefstatus onbekend" : "";
46
+ if (opts.floriday !== false && st?.floridaySent)
47
+ return { label: "Verzonden naar Floriday", done: true, variant: "default", bron: "Floriday" + archiefNote };
48
+ if (st?.approvedAll) {
49
+ if (opts.floriday === false)
50
+ return { label: "Afgemeld", done: true, variant: "default", bron: "Engine-scan" + archiefNote };
51
+ if (opts.floriday === true)
52
+ return { label: "Klaar voor verzending", done: false, variant: "secondary", bron: "Engine-scan" + archiefNote };
53
+ return { label: "Alle karren gescand", done: false, variant: "secondary", bron: "Engine-scan" + archiefNote };
54
+ }
55
+ const v = voortgang(status);
56
+ if (v.done && opts.floriday === false)
57
+ return { ...v, label: "Afgemeld", bron: "Engine" + archiefNote };
58
+ if (v.done && opts.floriday === true && v.label === "Afgehandeld")
59
+ return { ...v, label: "Afgemeld (nog niet naar Floriday)", done: false, variant: "secondary", bron: "Engine" + archiefNote };
60
+ return { ...v, bron: "Engine" + archiefNote };
61
+ }
62
+ function isCancelled(status) {
63
+ const s = (status ?? "").trim().toLowerCase();
64
+ return s === "geannuleerd" || s === "cancelled" || s === "canceled";
65
+ }
66
+ function StatusBadge({ vg }) {
67
+ return (_jsxs("span", { className: "inline-flex flex-col items-start", children: [_jsx(Badge, { variant: vg.variant, children: vg.label }), _jsxs("span", { className: "text-[10px] text-muted-foreground", children: ["bron: ", vg.bron] })] }));
68
+ }
69
+ function StickerMeldingen({ orderId }) {
70
+ const q = useStickerMeldingen(orderId);
71
+ if (q.isLoading)
72
+ return null;
73
+ if (q.data === null) {
74
+ return _jsx("div", { className: "text-xs text-destructive", children: "Stickercontrole onbekend" });
75
+ }
76
+ if (!q.data?.length)
77
+ return null;
78
+ return (_jsx("ul", { className: "space-y-1", children: q.data.map((m, i) => (_jsxs("li", { className: "flex items-start gap-1 text-xs text-destructive", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-3 w-3 shrink-0" }), _jsx("span", { children: m.melding })] }, (m.stickerId ?? "") + i))) }));
46
79
  }
47
80
  const NL_DATE = new Intl.DateTimeFormat("nl-NL", { dateStyle: "full" });
48
81
  function refKey(value) {
@@ -556,7 +589,7 @@ function AfhandelenButton({ orderRef, done }) {
556
589
  }
557
590
  function EngineOrderRow({ order }) {
558
591
  const vg = useVoortgang(order.ref, order.status);
559
- return (_jsx("div", { className: "rounded-lg border bg-card px-4 py-3", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 text-sm md:grid-cols-4", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: order.ref }), _jsx("div", { className: "text-xs text-muted-foreground", children: "Alleen bekend bij de Engine" })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Karren vandaag" }), _jsx("div", { children: order.carts })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Planten" }), _jsx("div", { children: order.plants })] }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx(Badge, { variant: vg.variant, children: vg.label }), _jsx(AfhandelenButton, { orderRef: order.ref, done: vg.done })] })] }) }));
592
+ return (_jsx("div", { className: "rounded-lg border bg-card px-4 py-3", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 text-sm md:grid-cols-4", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: order.ref }), _jsx("div", { className: "text-xs text-muted-foreground", children: "Alleen bekend bij de Engine" })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Karren vandaag" }), _jsx("div", { children: order.carts })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Planten" }), _jsx("div", { children: order.plants })] }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx(StatusBadge, { vg: vg }), _jsx(AfhandelenButton, { orderRef: order.ref, done: vg.done })] })] }) }));
560
593
  }
561
594
  function OrderRow({ planned: p, cartsToday, engineStatus, }) {
562
595
  const [open, setOpen] = useState(false);
@@ -567,8 +600,13 @@ function OrderRow({ planned: p, cartsToday, engineStatus, }) {
567
600
  const fetchCarts = useServerFn(getOrderCartIds);
568
601
  const fetchDeliveryNote = useServerFn(getDeliveryNotePdf);
569
602
  const fetchShippingNoteLayout = useServerFn(getShippingNoteLayout);
603
+ const archivedQ = useOrderArchived(p.order.id);
570
604
  const fetchPakbonInfo = useServerFn(getPakbonCartInfo);
571
- const vg = useVoortgang(p.order.orderNumber, engineStatus ?? p.order.status);
605
+ const vg = useVoortgang(p.order.orderNumber, engineStatus ?? p.order.status, {
606
+ floriday: !!p.order.salesOrderId,
607
+ cancelled: isCancelled(p.order.status),
608
+ archived: archivedQ.isLoading ? false : (archivedQ.data ?? null),
609
+ });
572
610
  const linesQuery = useQuery({
573
611
  queryKey: ["order-lines", source, p.order.id],
574
612
  queryFn: () => fetchLines({ data: { orderId: p.order.id, orderSource: source } }),
@@ -594,15 +632,7 @@ function OrderRow({ planned: p, cartsToday, engineStatus, }) {
594
632
  };
595
633
  return (_jsxs("div", { className: "rounded-lg border bg-card", children: [_jsxs("div", { className: "flex flex-col gap-3 p-3", children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "-m-1 flex items-start gap-3 rounded-md p-1 text-left hover:bg-muted/50", children: [open ? (_jsx(ChevronDown, { className: "mt-1 h-4 w-4 shrink-0" })) : (_jsx(ChevronRight, { className: "mt-1 h-4 w-4 shrink-0" })), _jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-6 gap-y-1 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: p.order.orderNumber }), _jsx("div", { className: "truncate text-xs text-muted-foreground", children: p.order.customerName })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Type ", _jsx("span", { className: "text-foreground", children: p.order.deliveryType })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Leverdatum", " ", _jsx("span", { className: "text-foreground", children: p.order.deliveryDate
596
634
  ? new Date(p.order.deliveryDate).toLocaleDateString("nl-NL")
597
- : "—" })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [cartsToday, " karren vandaag"] }), _jsx(Badge, { variant: vg.variant, children: vg.label }), _jsx(Badge, { variant: "outline", children: p.order.status }), (() => {
598
- const src = p.order.source === "floriday" ? "floriday" : "manual";
599
- const soId = p.order.salesOrderId ?? (src === "floriday" ? p.order.id : null);
600
- return soId ? (_jsx(AutoProcessStatus, { salesOrderId: soId, compact: true, allowManualTrigger: false })) : null;
601
- })()] })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 border-t pt-3", children: [(() => {
602
- const src = p.order.source === "floriday" ? "floriday" : "manual";
603
- const soId = p.order.salesOrderId ?? (src === "floriday" ? p.order.id : null);
604
- return soId ? (_jsx(AutoProcessStatus, { salesOrderId: soId, orderRef: p.order.orderNumber })) : null;
605
- })(), p.order.orderNumber && p.order.salesOrderId ? _jsx(NuVersturenButton, { orderRef: p.order.orderNumber }) : null, _jsx(AfhandelenButton, { orderRef: p.order.orderNumber, done: vg.done }), _jsxs(Button, { size: "sm", variant: "outline", onClick: handlePrintAll, disabled: printing, title: "Alle documenten van deze bestelling afdrukken (pakbonnen per kar en de verzendbrief)", children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), printing ? "In de Printwachtrij…" : "Alle documenten afdrukken"] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: (e) => {
635
+ : "—" })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [cartsToday, " karren vandaag"] }), _jsx(StatusBadge, { vg: vg })] }), _jsx(StickerMeldingen, { orderId: p.order.id })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 border-t pt-3", children: [p.order.orderNumber && p.order.salesOrderId ? _jsx(NuVersturenButton, { orderRef: p.order.orderNumber }) : null, _jsx(AfhandelenButton, { orderRef: p.order.orderNumber, done: vg.done }), _jsxs(Button, { size: "sm", variant: "outline", onClick: handlePrintAll, disabled: printing, title: "Alle documenten van deze bestelling afdrukken (pakbonnen per kar en de verzendbrief)", children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), printing ? "In de Printwachtrij…" : "Alle documenten afdrukken"] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: (e) => {
606
636
  e.stopPropagation();
607
637
  setVerzetOpen(true);
608
638
  }, title: "Ophaaldag of ophaaltijd van deze order wijzigen", children: [_jsx(CalendarClock, { className: "mr-1 h-3.5 w-3.5" }), "Verzetten"] })] })] }), _jsx(VerzetOrderDialog, { open: verzetOpen, orderRef: p.order.orderNumber, carrierTarget: {
@@ -1 +1 @@
1
- {"version":3,"file":"NuVersturenButton.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/NuVersturenButton.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAsB,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAkH3G"}
1
+ {"version":3,"file":"NuVersturenButton.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/NuVersturenButton.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,KAAsB,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAkI3G"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
3
  import { useServerFn } from "@tanstack/react-start";
4
+ import { useQueryClient } from "@tanstack/react-query";
4
5
  import { Button, toast, AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@flowselections/core";
5
6
  import { Send, Loader2, CheckCircle2, XCircle } from "lucide-react";
6
7
  import { prepareFloridayLoading, sendFloridayLoading, } from "../../lib/floridayLoading.functions";
@@ -17,6 +18,8 @@ export function NuVersturenButton({ orderRef, label = "Nu versturen" }) {
17
18
  const [loading, setLoading] = useState(false);
18
19
  const [sending, setSending] = useState(false);
19
20
  const [preview, setPreview] = useState(null);
21
+ const [sent, setSent] = useState(false);
22
+ const queryClient = useQueryClient();
20
23
  const load = async () => setPreview(await prepare({ data: { orderRef } }));
21
24
  const meldFout = (e, standaard) => {
22
25
  const t = e instanceof Error ? e.message : standaard;
@@ -42,11 +45,21 @@ export function NuVersturenButton({ orderRef, label = "Nu versturen" }) {
42
45
  setSending(true);
43
46
  try {
44
47
  const r = await send({ data: { orderRef } });
45
- for (const x of r.results) {
48
+ const results = Array.isArray(r?.results) ? r.results : [];
49
+ let allOk = results.length > 0;
50
+ for (const x of results) {
46
51
  if (x.code === "created" || x.code === "already_fulfilled")
47
52
  toast.success(x.message);
48
- else
53
+ else {
54
+ allOk = false;
49
55
  meldFout(new Error(x.message), "Versturen mislukt");
56
+ }
57
+ }
58
+ if (allOk) {
59
+ setSent(true);
60
+ setPreview(null);
61
+ void queryClient.invalidateQueries();
62
+ return;
50
63
  }
51
64
  await load();
52
65
  }
@@ -57,11 +70,11 @@ export function NuVersturenButton({ orderRef, label = "Nu versturen" }) {
57
70
  setSending(false);
58
71
  }
59
72
  };
60
- return (_jsxs(_Fragment, { children: [_jsxs(Button, { size: "sm", variant: "outline", onClick: open, disabled: loading, children: [loading ? _jsx(Loader2, { className: "h-3 w-3 mr-1 animate-spin" }) : _jsx(Send, { className: "h-3 w-3 mr-1" }), label] }), _jsx(AlertDialog, { open: !!preview, onOpenChange: (o) => !o && !sending && setPreview(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Belading naar Floriday versturen?" }), _jsx(AlertDialogDescription, { children: "Een geaccepteerde opdracht start de verzendbrief, vooraankondiging, fust-administratie en afrekening, en is op productie niet terug te draaien." })] }), preview && (_jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Orders:" }), " ", preview.orderRefs.join(", ")] }), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Leveringen:" }), " ", preview.shipments.length] }), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Karren:" }), " ", preview.cartCount, preview.carriers.some((c) => c.shared) ? " (waarvan gedeeld)" : ""] }), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Regels:" }), " ", preview.lineCount] }), _jsx("ul", { className: "space-y-1", children: preview.orders.map((o) => (_jsxs("li", { className: "flex items-center gap-2", children: [o.controlled
73
+ return (_jsxs(_Fragment, { children: [_jsxs(Button, { size: "sm", variant: "outline", onClick: open, disabled: loading, children: [loading ? _jsx(Loader2, { className: "h-3 w-3 mr-1 animate-spin" }) : _jsx(Send, { className: "h-3 w-3 mr-1" }), label] }), _jsx(AlertDialog, { open: !!preview, onOpenChange: (o) => !o && !sending && setPreview(null), children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Belading naar Floriday versturen?" }), _jsx(AlertDialogDescription, { children: "Een geaccepteerde opdracht start de verzendbrief, vooraankondiging, fust-administratie en afrekening, en is op productie niet terug te draaien." })] }), preview && (_jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Orders:" }), " ", preview.orderRefs.join(", ")] }), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Leveringen:" }), " ", preview.shipments.length] }), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Karren:" }), " ", preview.cartCount, preview.carriers.some((c) => c.shared) ? " (waarvan gedeeld)" : ""] }), Array.isArray(preview.carriers) && preview.carriers.length > 0 && (_jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Karkenmerk naar Floriday:" }), " ", _jsx("span", { className: "font-mono", children: preview.carriers.map((c) => c.loadCarrierReference || "—").join(", ") })] })), _jsxs("div", { children: [_jsx("span", { className: "text-muted-foreground", children: "Regels:" }), " ", preview.lineCount] }), _jsx("ul", { className: "space-y-1", children: preview.orders.map((o) => (_jsxs("li", { className: "flex items-center gap-2", children: [o.controlled
61
74
  ? _jsx(CheckCircle2, { className: "h-3.5 w-3.5 text-primary" })
62
75
  : _jsx(XCircle, { className: "h-3.5 w-3.5 text-destructive" }), _jsxs("span", { children: [o.orderRef, ": ", o.cartsControlled, " van ", o.cartsTotal, " karren goedgekeurd op de Scan-controle", o.controlled ? " — klaar voor verzending" : "", o.pickStatus ? ` · pickstatus: ${PICK_LABEL[o.pickStatus] ?? o.pickStatus}` : "", o.autoStatus ? ` · auto-verwerking: ${o.autoStatus}` : ""] })] }, o.orderRef))) }), preview.shipments.filter((sh) => sh.floridayStatus || preview.lastAttempts.some((a) => a.fulfillmentOrderId === sh.fulfillmentOrderId && (a.code === "created" || a.code === "already_fulfilled"))).map((sh) => (_jsxs("div", { className: "rounded border border-border p-2", children: ["Verzonden naar Floriday", sh.floridayStatus ? ` (Floriday: ${sh.floridayStatus})` : "", " \u00B7", " ", sh.deliveryNoteReady === true ? "verzendbrief klaar" : "verzendbrief volgt via de Engine"] }, sh.fulfillmentOrderId))), preview.lastAttempts.length > 0 && (_jsxs("div", { className: "rounded border border-border p-2", children: [_jsx("div", { className: "text-muted-foreground mb-1", children: "Laatste pogingen" }), preview.lastAttempts.slice(0, 4).map((a) => (_jsxs("div", { children: [new Date(a.createdAt).toLocaleString("nl-NL"), " \u00B7 versturen \u00B7 ", a.code === "created" || a.code === "already_fulfilled" ? "geaccepteerd" : (a.message ?? a.code)?.replace(/\s*\[[^\]]+\]$/, "")] }, a.createdAt + a.step)))] })), preview.blockers.length > 0 && (_jsx("ul", { className: "list-disc pl-5 text-destructive", children: preview.blockers.map((b) => {
63
76
  // Begrijpelijke zin, technische code klein eronder.
64
77
  const m = /^(.*?)\s*\[([^\]]+)\]$/s.exec(b);
65
78
  return (_jsxs("li", { children: [m ? m[1] : b, m ? _jsx("div", { className: "text-xs text-muted-foreground", children: m[2] }) : null] }, b));
66
- }) }))] })), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: sending, children: "Annuleren" }), _jsxs(Button, { onClick: doSend, disabled: !preview?.canSend || sending, children: [sending ? _jsx(Loader2, { className: "h-3 w-3 mr-1 animate-spin" }) : null, "Versturen"] })] })] }) })] }));
79
+ }) }))] })), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: sending, children: "Annuleren" }), _jsxs(Button, { onClick: doSend, disabled: !preview?.canSend || sending || sent, children: [sending ? _jsx(Loader2, { className: "h-3 w-3 mr-1 animate-spin" }) : null, sent ? "Verzonden naar Floriday" : "Versturen"] })] })] }) })] }));
67
80
  }
@@ -0,0 +1,12 @@
1
+ export interface StickerMelding {
2
+ melding: string;
3
+ soort: string | null;
4
+ stickerId: string | null;
5
+ plek: string | null;
6
+ sinds: string | null;
7
+ }
8
+ /** Actuele stickermeldingen van de Engine; null = leesfout (stickercontrole onbekend). */
9
+ export declare function useStickerMeldingen(orderId: string | null | undefined): import("@tanstack/react-query").UseQueryResult<StickerMelding[] | null, Error>;
10
+ /** Archiefstatus uit de Engine; null = onbekend (leesfout). */
11
+ export declare function useOrderArchived(orderId: string | null | undefined): import("@tanstack/react-query").UseQueryResult<boolean | null, Error>;
12
+ //# sourceMappingURL=useOrderMeldingen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrderMeldingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderMeldingen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAID,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,kFAmBrE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,yEAUlE"}
@@ -0,0 +1,38 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { supabase } from "../integrations/supabase/moduleClient";
3
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
+ /** Actuele stickermeldingen van de Engine; null = leesfout (stickercontrole onbekend). */
5
+ export function useStickerMeldingen(orderId) {
6
+ return useQuery({
7
+ queryKey: ["engine", "sticker-meldingen", orderId],
8
+ enabled: !!orderId && UUID.test(orderId),
9
+ refetchInterval: 60000,
10
+ queryFn: async () => {
11
+ const { data, error } = await supabase.rpc("logistics_order_sticker_meldingen", { p_order_id: orderId });
12
+ if (error || !Array.isArray(data))
13
+ return null;
14
+ return data
15
+ .filter((m) => typeof m?.melding === "string" && m.melding)
16
+ .map((m) => ({
17
+ melding: String(m.melding),
18
+ soort: m.soort ? String(m.soort) : null,
19
+ stickerId: m.stickerId ? String(m.stickerId) : null,
20
+ plek: m.plek ? String(m.plek) : null,
21
+ sinds: m.sinds ? String(m.sinds) : null,
22
+ }));
23
+ },
24
+ });
25
+ }
26
+ /** Archiefstatus uit de Engine; null = onbekend (leesfout). */
27
+ export function useOrderArchived(orderId) {
28
+ return useQuery({
29
+ queryKey: ["engine", "order-archived", orderId],
30
+ enabled: !!orderId && UUID.test(orderId),
31
+ queryFn: async () => {
32
+ const { data, error } = await supabase.rpc("logistics_order_is_archived", { p_order_id: orderId });
33
+ if (error || !data || typeof data !== "object")
34
+ return null;
35
+ return data.gearchiveerd === true;
36
+ },
37
+ });
38
+ }