@flowselections/logistiek-engine 1.0.3 → 1.0.5

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 (61) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/components/FloridayPushCard.d.ts +2 -0
  3. package/dist-lib/components/FloridayPushCard.d.ts.map +1 -0
  4. package/dist-lib/components/FloridayPushCard.js +32 -0
  5. package/dist-lib/components/PrintjobsCard.d.ts +2 -0
  6. package/dist-lib/components/PrintjobsCard.d.ts.map +1 -0
  7. package/dist-lib/components/PrintjobsCard.js +35 -0
  8. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  9. package/dist-lib/components/RegiePage.js +3 -1
  10. package/dist-lib/hooks/useFloridayPushes.d.ts +20 -0
  11. package/dist-lib/hooks/useFloridayPushes.d.ts.map +1 -0
  12. package/dist-lib/hooks/useFloridayPushes.js +55 -0
  13. package/dist-lib/hooks/usePrintjobs.d.ts +19 -0
  14. package/dist-lib/hooks/usePrintjobs.d.ts.map +1 -0
  15. package/dist-lib/hooks/usePrintjobs.js +60 -0
  16. package/dist-lib/index.d.ts +3 -0
  17. package/dist-lib/index.d.ts.map +1 -1
  18. package/dist-lib/index.js +3 -0
  19. package/dist-lib/integrations/supabase/auth-middleware.d.ts +387 -1
  20. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  21. package/dist-lib/integrations/supabase/client.d.ts +387 -1
  22. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  23. package/dist-lib/integrations/supabase/client.server.d.ts +387 -1
  24. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/types.d.ts +388 -2
  26. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  27. package/dist-lib/integrations/supabase/types.js +12 -1
  28. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts +4 -3
  29. package/dist-lib/lib/bulkLoadCarrierPlanning.server.d.ts.map +1 -1
  30. package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +13 -15
  31. package/dist-lib/lib/floridayDocuments.functions.d.ts +1161 -3
  32. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/floridayPush.functions.d.ts +20689 -0
  34. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -0
  35. package/dist-lib/lib/floridayPush.functions.js +20 -0
  36. package/dist-lib/lib/floridayPush.server.d.ts +45 -0
  37. package/dist-lib/lib/floridayPush.server.d.ts.map +1 -0
  38. package/dist-lib/lib/floridayPush.server.js +219 -0
  39. package/dist-lib/lib/handlers/logistics-tick.server.d.ts +2 -1
  40. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  41. package/dist-lib/lib/handlers/logistics-tick.server.js +14 -2
  42. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +1935 -5
  43. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  44. package/dist-lib/lib/loadCarrierPlanning.functions.js +13 -8
  45. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +7 -6
  46. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  47. package/dist-lib/lib/loadCarrierPlanning.server.js +31 -33
  48. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts +2 -1
  49. package/dist-lib/lib/loadCarrierTaskSync.server.d.ts.map +1 -1
  50. package/dist-lib/lib/loadCarrierTaskSync.server.js +13 -6
  51. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +774 -2
  52. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  53. package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -2
  54. package/dist-lib/lib/logisticsRecalcJob.server.d.ts +6 -5
  55. package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
  56. package/dist-lib/lib/logisticsRecalcJob.server.js +17 -19
  57. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +387 -1
  58. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  59. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  60. package/dist-lib/lib/modulePrompts.js +949 -911
  61. package/package.json +2 -2
package/README.md CHANGED
@@ -1,24 +1,24 @@
1
- # logistiek Engine
2
-
3
- blank project start
4
-
5
- This project was built with [Lovable](https://lovable.dev).
6
-
7
- ## Build with Lovable
8
-
9
- Continue developing this project in the [Lovable editor](https://lovable.dev/projects/316ec9c5-0f01-408a-b7ec-3d4dccf9b65d).
10
-
11
- - **Ship faster**: describe what you want to build and Lovable handles the code.
12
- - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
- - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
-
15
- ## Development
16
-
17
- Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
-
19
- ```sh
20
- git clone <this-repository-url>
21
- cd <repository-name>
22
- npm i
23
- npm run dev
24
- ```
1
+ # logistiek Engine
2
+
3
+ blank project start
4
+
5
+ This project was built with [Lovable](https://lovable.dev).
6
+
7
+ ## Build with Lovable
8
+
9
+ Continue developing this project in the [Lovable editor](https://lovable.dev/projects/316ec9c5-0f01-408a-b7ec-3d4dccf9b65d).
10
+
11
+ - **Ship faster**: describe what you want to build and Lovable handles the code.
12
+ - **Stay in sync**: every change made in Lovable is committed straight to this repository.
13
+ - **Full ownership**: this code is yours. Push to `main` on GitHub and your changes sync back into Lovable, ready for your next prompt.
14
+
15
+ ## Development
16
+
17
+ Prefer working locally? You need Node.js and npm — [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
18
+
19
+ ```sh
20
+ git clone <this-repository-url>
21
+ cd <repository-name>
22
+ npm i
23
+ npm run dev
24
+ ```
@@ -0,0 +1,2 @@
1
+ export declare function FloridayPushCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=FloridayPushCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloridayPushCard.d.ts","sourceRoot":"","sources":["../../src/components/FloridayPushCard.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,gBAAgB,gCA+D/B"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/FloridayPushCard.tsx — status van doorgeven aan Floriday
4
+ // ============================================================================
5
+ import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Skeleton, } from "@flowselections/core";
6
+ import { CheckCircle2, RefreshCw, Send } from "lucide-react";
7
+ import { PUSH_STATUS_LABELS, useFloridayPushes } from "../hooks/useFloridayPushes";
8
+ function tijd(value) {
9
+ if (!value)
10
+ return "-";
11
+ try {
12
+ return new Date(value).toLocaleString("nl-NL", { dateStyle: "short", timeStyle: "short" });
13
+ }
14
+ catch {
15
+ return value;
16
+ }
17
+ }
18
+ function variantVoor(status) {
19
+ if (status === "failed")
20
+ return "destructive";
21
+ if (status === "sent")
22
+ return "secondary";
23
+ return "outline";
24
+ }
25
+ export function FloridayPushCard() {
26
+ const { pushes, loading, reload, opnieuw } = useFloridayPushes();
27
+ const safe = Array.isArray(pushes) ? pushes : [];
28
+ const openstaand = safe.filter((p) => p.status !== "sent");
29
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Send, { className: "h-4 w-4" }), "Doorgeven aan Floriday"] }), _jsx(CardDescription, { children: "De indeling wordt automatisch op de achtergrond doorgegeven. Wijzig je iets handmatig, dan gaat de nieuwe indeling vanzelf mee." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void reload(), children: [_jsx(RefreshCw, { className: "mr-1 h-4 w-4" }), "Vernieuwen"] })] }), _jsx(CardContent, { className: "space-y-3", children: loading ? (_jsx(Skeleton, { className: "h-24 w-full" })) : safe.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Er is nog niets doorgegeven." })) : openstaand.length === 0 ? (_jsxs("p", { className: "flex items-center gap-2 text-sm", children: [_jsx(CheckCircle2, { className: "h-4 w-4 text-emerald-500" }), "Alles is doorgegeven aan Floriday."] })) : (_jsx("ul", { className: "divide-border divide-y", children: openstaand.map((p) => (_jsxs("li", { className: "flex items-start justify-between gap-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-medium", children: p.order_ref }), _jsx(Badge, { variant: variantVoor(p.status), children: PUSH_STATUS_LABELS[p.status] ?? p.status })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: p.status === "failed"
30
+ ? `Mislukt na ${p.attempts} pogingen · ${tijd(p.last_error_at)}`
31
+ : `Volgende poging ${tijd(p.next_attempt_at)}` }), p.last_error ? (_jsx("p", { className: "text-muted-foreground mt-1 truncate text-xs", children: p.last_error })) : null] }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => void opnieuw(p.order_ref), children: "Opnieuw proberen" })] }, p.id))) })) })] }));
32
+ }
@@ -0,0 +1,2 @@
1
+ export declare function PrintjobsCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=PrintjobsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrintjobsCard.d.ts","sourceRoot":"","sources":["../../src/components/PrintjobsCard.tsx"],"names":[],"mappings":"AAiCA,wBAAgB,aAAa,gCA8D5B"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // ============================================================================
3
+ // src/components/PrintjobsCard.tsx — overzicht van printopdrachten die vanuit
4
+ // de pickschermen zijn aangemaakt, met de vastgelopen opdrachten bovenaan.
5
+ // ============================================================================
6
+ import { Badge, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Skeleton, } from "@flowselections/core";
7
+ import { Printer, RefreshCw } from "lucide-react";
8
+ import { PRINTJOB_STATUS_LABEL, usePrintjobs } from "../hooks/usePrintjobs";
9
+ function tijd(value) {
10
+ try {
11
+ return new Date(value).toLocaleString("nl-NL", { dateStyle: "short", timeStyle: "short" });
12
+ }
13
+ catch {
14
+ return value;
15
+ }
16
+ }
17
+ function statusVariant(status) {
18
+ if (status === "mislukt")
19
+ return "destructive";
20
+ if (status === "voltooid")
21
+ return "secondary";
22
+ if (status === "bezig")
23
+ return "default";
24
+ return "outline";
25
+ }
26
+ export function PrintjobsCard() {
27
+ const { jobs, loading, reload } = usePrintjobs();
28
+ const safe = Array.isArray(jobs) ? jobs : [];
29
+ const vastgelopen = safe.filter((j) => j.status === "mislukt");
30
+ const wachtend = safe.filter((j) => j.status === "wachtend" || j.status === "bezig");
31
+ const zichtbaar = [...vastgelopen, ...wachtend].slice(0, 10);
32
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Printer, { className: "h-4 w-4 text-muted-foreground" }), "Printopdrachten"] }), _jsx(CardDescription, { children: vastgelopen.length > 0
33
+ ? `${vastgelopen.length} vastgelopen, ${wachtend.length} nog in de wachtrij.`
34
+ : `${wachtend.length} opdracht(en) in de wachtrij.` })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void reload(), children: [_jsx(RefreshCw, { className: "mr-1 h-4 w-4" }), "Vernieuwen"] })] }), _jsx(CardContent, { className: "space-y-3", children: loading ? (_jsx(Skeleton, { className: "h-24 w-full" })) : zichtbaar.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Geen openstaande of vastgelopen printopdrachten." })) : (zichtbaar.map((j) => (_jsx("div", { className: "rounded-lg border border-border p-3", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-2", children: [_jsxs("div", { children: [_jsxs("p", { className: "text-sm font-semibold", children: [j.documentnaam ?? "Pickdocument", j.documenttype ? ` · ${j.documenttype}` : ""] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [j.printerNaam ? `Printer: ${j.printerNaam}` : "Nog geen printer gekoppeld", j.layoutNaam ? ` · Ontwerp: ${j.layoutNaam}` : " · Nog geen ontwerp gekoppeld", " · ", tijd(j.createdAt)] }), j.foutmelding ? (_jsx("p", { className: "mt-1 text-xs text-destructive", children: j.foutmelding })) : null] }), _jsx(Badge, { variant: statusVariant(j.status), children: PRINTJOB_STATUS_LABEL[j.status] ?? j.status })] }) }, j.id)))) })] }));
35
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"RegiePage.d.ts","sourceRoot":"","sources":["../../src/components/RegiePage.tsx"],"names":[],"mappings":"AAoEA,wBAAgB,SAAS,gCA4WxB"}
1
+ {"version":3,"file":"RegiePage.d.ts","sourceRoot":"","sources":["../../src/components/RegiePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,SAAS,gCA+WxB"}
@@ -15,6 +15,8 @@ import { BeladingIndelingCard } from "./BeladingIndelingCard";
15
15
  import { VoorraadMeldingenCard } from "./VoorraadMeldingenCard";
16
16
  import { VertragingMeldingenCard } from "./VertragingMeldingenCard";
17
17
  import { CapaciteitMeldingenCard } from "./CapaciteitMeldingenCard";
18
+ import { FloridayPushCard } from "./FloridayPushCard";
19
+ import { PrintjobsCard } from "./PrintjobsCard";
18
20
  import { LOGISTICS_MODULES, TASK_LABEL, TASK_STATUS_LABEL, } from "../lib/logisticsTasks";
19
21
  function tijd(value) {
20
22
  if (!value)
@@ -78,5 +80,5 @@ export function RegiePage() {
78
80
  })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Planrondes" }), _jsx(CardDescription, { children: "Elke keer dat de Engine (her)plande, met welke regelversie." })] }), _jsx(CardContent, { children: safeRuns.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen planrondes." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Moment" }), _jsx(TableHead, { children: "Order" }), _jsx(TableHead, { children: "Aanleiding" }), _jsx(TableHead, { children: "Bron" }), _jsx(TableHead, { children: "Regelversie" }), _jsx(TableHead, { children: "Taken" }), _jsx(TableHead, { children: "Signalen" })] }) }), _jsx(TableBody, { children: safeRuns.map((r) => {
79
81
  const warnings = Array.isArray(r.warnings) ? r.warnings : [];
80
82
  return (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-sm", children: tijd(r.created_at) }), _jsx(TableCell, { className: "font-medium", children: r.order_ref }), _jsx(TableCell, { className: "text-sm", children: r.trigger }), _jsx(TableCell, { className: "text-sm", children: r.source_module ?? "—" }), _jsxs(TableCell, { className: "text-sm", children: [r.rule_version ?? "—", r.settings_hash ? (_jsx("span", { className: "text-muted-foreground ml-1 font-mono text-xs", children: r.settings_hash.slice(0, 6) })) : null] }), _jsxs(TableCell, { className: "text-sm", children: [r.tasks_created, " nieuw / ", r.tasks_revised, " herzien"] }), _jsx(TableCell, { className: "text-sm", children: warnings.length === 0 ? (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) : (_jsx("div", { className: "flex flex-wrap gap-1", children: warnings.map((w, i) => (_jsx(Badge, { variant: "outline", children: WAARSCHUWING_LABEL[String(w.code)] ?? String(w.code) }, i))) })) })] }, r.id));
81
- }) })] })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Binnengekomen orders" }), _jsx(CardDescription, { children: "Elke binnengekomen order wordt automatisch omgezet naar de bijbehorende werkzaamheden." })] }), _jsx(CardContent, { children: safeMeldingen.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen meldingen ontvangen." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Moment" }), _jsx(TableHead, { children: "Onderdeel" }), _jsx(TableHead, { children: "Soort" }), _jsx(TableHead, { children: "Order" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "w-24" })] }) }), _jsx(TableBody, { children: safeMeldingen.map((m) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-sm", children: tijd(m.created_at) }), _jsx(TableCell, { className: "text-sm", children: LOGISTICS_MODULES[m.source_module] ?? m.source_module }), _jsx(TableCell, { className: "text-sm", children: m.event_type }), _jsx(TableCell, { className: "font-medium", children: m.order_ref }), _jsxs(TableCell, { children: [_jsx(Badge, { variant: m.status === "failed" ? "destructive" : m.status === "processed" ? "default" : "outline", children: m.status === "processed" ? "Verwerkt" : m.status === "failed" ? "Mislukt" : "Wachtend" }), m.error && _jsx("p", { className: "text-destructive mt-1 text-xs", children: m.error })] }), _jsx(TableCell, { className: "text-right", children: m.status !== "processed" && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void herverwerkMelding(m.id), children: [_jsx(RotateCcw, { className: "mr-1 h-4 w-4" }), "Opnieuw"] })) })] }, m.id))) })] })) })] }), _jsx(VoorraadMeldingenCard, {}), _jsx(VertragingMeldingenCard, {}), _jsx(CapaciteitMeldingenCard, {}), _jsx(BeladingIndelingCard, {})] }));
83
+ }) })] })) })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Binnengekomen orders" }), _jsx(CardDescription, { children: "Elke binnengekomen order wordt automatisch omgezet naar de bijbehorende werkzaamheden." })] }), _jsx(CardContent, { children: safeMeldingen.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Nog geen meldingen ontvangen." })) : (_jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: "Moment" }), _jsx(TableHead, { children: "Onderdeel" }), _jsx(TableHead, { children: "Soort" }), _jsx(TableHead, { children: "Order" }), _jsx(TableHead, { children: "Status" }), _jsx(TableHead, { className: "w-24" })] }) }), _jsx(TableBody, { children: safeMeldingen.map((m) => (_jsxs(TableRow, { children: [_jsx(TableCell, { className: "text-sm", children: tijd(m.created_at) }), _jsx(TableCell, { className: "text-sm", children: LOGISTICS_MODULES[m.source_module] ?? m.source_module }), _jsx(TableCell, { className: "text-sm", children: m.event_type }), _jsx(TableCell, { className: "font-medium", children: m.order_ref }), _jsxs(TableCell, { children: [_jsx(Badge, { variant: m.status === "failed" ? "destructive" : m.status === "processed" ? "default" : "outline", children: m.status === "processed" ? "Verwerkt" : m.status === "failed" ? "Mislukt" : "Wachtend" }), m.error && _jsx("p", { className: "text-destructive mt-1 text-xs", children: m.error })] }), _jsx(TableCell, { className: "text-right", children: m.status !== "processed" && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void herverwerkMelding(m.id), children: [_jsx(RotateCcw, { className: "mr-1 h-4 w-4" }), "Opnieuw"] })) })] }, m.id))) })] })) })] }), _jsx(FloridayPushCard, {}), _jsx(PrintjobsCard, {}), _jsx(VoorraadMeldingenCard, {}), _jsx(VertragingMeldingenCard, {}), _jsx(CapaciteitMeldingenCard, {}), _jsx(BeladingIndelingCard, {})] }));
82
84
  }
@@ -0,0 +1,20 @@
1
+ export interface FloridayPush {
2
+ id: string;
3
+ order_ref: string;
4
+ status: string;
5
+ attempts: number;
6
+ revision: number;
7
+ last_error: string | null;
8
+ last_error_at: string | null;
9
+ next_attempt_at: string | null;
10
+ sent_at: string | null;
11
+ updated_at: string;
12
+ }
13
+ export declare const PUSH_STATUS_LABELS: Record<string, string>;
14
+ export declare function useFloridayPushes(): {
15
+ pushes: FloridayPush[];
16
+ loading: boolean;
17
+ reload: () => Promise<void>;
18
+ opnieuw: (orderRef: string) => Promise<void>;
19
+ };
20
+ //# sourceMappingURL=useFloridayPushes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloridayPushes.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloridayPushes.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKrD,CAAC;AAEF,wBAAgB,iBAAiB;;;;wBAsCZ,MAAM;EAa1B"}
@@ -0,0 +1,55 @@
1
+ // ============================================================================
2
+ // src/hooks/useFloridayPushes.ts — status van de Floriday-pushwachtrij
3
+ // ============================================================================
4
+ import { useCallback, useEffect, useState } from "react";
5
+ import { supabase, toast } from "@flowselections/core";
6
+ import { useServerFn } from "@tanstack/react-start";
7
+ import { retryFloridayPush } from "../lib/floridayPush.functions";
8
+ const db = () => supabase;
9
+ export const PUSH_STATUS_LABELS = {
10
+ pending: "In de wachtrij",
11
+ sending: "Bezig met versturen",
12
+ sent: "Verstuurd",
13
+ failed: "Mislukt",
14
+ };
15
+ export function useFloridayPushes() {
16
+ const [pushes, setPushes] = useState([]);
17
+ const [loading, setLoading] = useState(true);
18
+ const retry = useServerFn(retryFloridayPush);
19
+ const load = useCallback(async () => {
20
+ setLoading(true);
21
+ const { data, error } = await db()
22
+ .from("logistics_floriday_pushes")
23
+ .select("id, order_ref, status, attempts, revision, last_error, last_error_at, next_attempt_at, sent_at, updated_at")
24
+ .order("updated_at", { ascending: false })
25
+ .limit(50);
26
+ if (error) {
27
+ setPushes([]);
28
+ }
29
+ else {
30
+ setPushes(Array.isArray(data) ? data : []);
31
+ }
32
+ setLoading(false);
33
+ }, []);
34
+ useEffect(() => {
35
+ void load();
36
+ const channel = supabase
37
+ .channel("logistics-floriday-pushes")
38
+ .on("postgres_changes", { event: "*", schema: "public", table: "logistics_floriday_pushes" }, () => void load())
39
+ .subscribe();
40
+ return () => {
41
+ void supabase.removeChannel(channel);
42
+ };
43
+ }, [load]);
44
+ const opnieuw = useCallback(async (orderRef) => {
45
+ try {
46
+ await retry({ data: { orderRef } });
47
+ toast.success(`Order ${orderRef} staat opnieuw in de wachtrij`);
48
+ await load();
49
+ }
50
+ catch (e) {
51
+ toast.error(String(e?.message ?? e));
52
+ }
53
+ }, [retry, load]);
54
+ return { pushes, loading, reload: load, opnieuw };
55
+ }
@@ -0,0 +1,19 @@
1
+ export interface Printjob {
2
+ id: string;
3
+ documentnaam: string | null;
4
+ documenttype: string | null;
5
+ status: string;
6
+ foutmelding: string | null;
7
+ pogingen: number;
8
+ printerNaam: string | null;
9
+ layoutNaam: string | null;
10
+ externJobId: string | null;
11
+ createdAt: string;
12
+ }
13
+ export declare const PRINTJOB_STATUS_LABEL: Record<string, string>;
14
+ export declare function usePrintjobs(limit?: number): {
15
+ jobs: Printjob[];
16
+ loading: boolean;
17
+ reload: () => Promise<void>;
18
+ };
19
+ //# sourceMappingURL=usePrintjobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePrintjobs.d.ts","sourceRoot":"","sources":["../../src/hooks/usePrintjobs.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMxD,CAAC;AAIF,wBAAgB,YAAY,CAAC,KAAK,SAAK;;;;EAoDtC"}
@@ -0,0 +1,60 @@
1
+ // ============================================================================
2
+ // src/hooks/usePrintjobs.ts — status van printopdrachten die vanuit de
3
+ // pickschermen zijn aangemaakt. Alleen lezen; het printen zelf gebeurt in de
4
+ // Layout maker via de PrintNode API.
5
+ // ============================================================================
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { supabase } from "@flowselections/core";
8
+ export const PRINTJOB_STATUS_LABEL = {
9
+ wachtend: "In de wachtrij",
10
+ bezig: "Bezig",
11
+ voltooid: "Geprint",
12
+ mislukt: "Mislukt",
13
+ geannuleerd: "Geannuleerd",
14
+ };
15
+ const db = () => supabase;
16
+ export function usePrintjobs(limit = 25) {
17
+ const [jobs, setJobs] = useState([]);
18
+ const [loading, setLoading] = useState(true);
19
+ const reload = useCallback(async () => {
20
+ setLoading(true);
21
+ try {
22
+ const { data } = await db()
23
+ .from("print_jobs")
24
+ .select("id, documentnaam, documenttype, status, foutmelding, pogingen, extern_job_id, created_at, printers(naam), document_layouts(naam)")
25
+ .order("created_at", { ascending: false })
26
+ .limit(limit);
27
+ const rows = Array.isArray(data) ? data : [];
28
+ setJobs(rows.map((r) => ({
29
+ id: String(r.id),
30
+ documentnaam: r.documentnaam ?? null,
31
+ documenttype: r.documenttype ?? null,
32
+ status: String(r.status ?? ""),
33
+ foutmelding: r.foutmelding ?? null,
34
+ pogingen: Number(r.pogingen ?? 0),
35
+ printerNaam: r.printers?.naam ?? null,
36
+ layoutNaam: r.document_layouts?.naam ?? null,
37
+ externJobId: r.extern_job_id ?? null,
38
+ createdAt: String(r.created_at ?? ""),
39
+ })));
40
+ }
41
+ finally {
42
+ setLoading(false);
43
+ }
44
+ }, [limit]);
45
+ useEffect(() => {
46
+ void reload();
47
+ }, [reload]);
48
+ useEffect(() => {
49
+ const channel = supabase
50
+ .channel("logistiek-engine-printjobs")
51
+ .on("postgres_changes", { event: "*", schema: "public", table: "print_jobs" }, () => {
52
+ void reload();
53
+ })
54
+ .subscribe();
55
+ return () => {
56
+ supabase.removeChannel(channel);
57
+ };
58
+ }, [reload]);
59
+ return { jobs, loading, reload };
60
+ }
@@ -7,6 +7,9 @@ export * from './components/ModulePromptsPage';
7
7
  export * from './components/LadingdragersPage';
8
8
  export * from './components/BeladingIndelingCard';
9
9
  export * from './components/VoorraadMeldingenCard';
10
+ export { FloridayPushCard } from './components/FloridayPushCard';
11
+ export { PrintjobsCard } from './components/PrintjobsCard';
12
+ export * from './hooks/usePrintjobs';
10
13
  export * from './components/VertragingMeldingenCard';
11
14
  export * from './components/CapaciteitMeldingenCard';
12
15
  export * from './hooks/useCapaciteitMeldingen';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AAMpD,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,cAAc,sBAAsB,CAAC;AAErC,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAGrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AAMpD,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
package/dist-lib/index.js CHANGED
@@ -10,6 +10,9 @@ export * from './components/ModulePromptsPage';
10
10
  export * from './components/LadingdragersPage';
11
11
  export * from './components/BeladingIndelingCard';
12
12
  export * from './components/VoorraadMeldingenCard';
13
+ export { FloridayPushCard } from './components/FloridayPushCard';
14
+ export { PrintjobsCard } from './components/PrintjobsCard';
15
+ export * from './hooks/usePrintjobs';
13
16
  export * from './components/VertragingMeldingenCard';
14
17
  export * from './components/CapaciteitMeldingenCard';
15
18
  export * from './hooks/useCapaciteitMeldingen';