@flowselections/logistiek-engine 1.0.147 → 1.0.153

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 (39) hide show
  1. package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
  2. package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
  3. package/dist-lib/components/AutomatischVersturenCard.js +22 -0
  4. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  5. package/dist-lib/components/BeheerPage.js +3 -1
  6. package/dist-lib/components/ConsistentieCard.d.ts.map +1 -1
  7. package/dist-lib/components/ConsistentieCard.js +1 -1
  8. package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
  9. package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
  10. package/dist-lib/components/OudeOrderregelsCard.js +28 -0
  11. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  12. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  13. package/dist-lib/integrations/supabase/types.d.ts +489 -2
  14. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  15. package/dist-lib/integrations/supabase/types.js +1 -0
  16. package/dist-lib/lib/autoSend.d.ts +22 -0
  17. package/dist-lib/lib/autoSend.d.ts.map +1 -0
  18. package/dist-lib/lib/autoSend.functions.d.ts +11 -0
  19. package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
  20. package/dist-lib/lib/autoSend.functions.js +20 -0
  21. package/dist-lib/lib/autoSend.js +72 -0
  22. package/dist-lib/lib/autoSend.server.d.ts +13 -0
  23. package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
  24. package/dist-lib/lib/autoSend.server.js +75 -0
  25. package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
  26. package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
  27. package/dist-lib/lib/centralSecrets.server.js +82 -0
  28. package/dist-lib/lib/floridayCartCarriers.js +1 -1
  29. package/dist-lib/lib/floridayPush.server.js +1 -1
  30. package/dist-lib/lib/handlers/logistics-tick.server.js +10 -0
  31. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  32. package/dist-lib/lib/modulePrompts.js +183 -0
  33. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  34. package/dist-lib/lib/moduleVersion.js +1 -1
  35. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  36. package/dist-lib/lib/ruleEngineSchema.js +14 -0
  37. package/dist-lib/lib/shippingNoteQueue.server.js +1 -1
  38. package/dist-lib/lib/stickerRules.js +1 -1
  39. package/package.json +4 -4
@@ -0,0 +1,2 @@
1
+ export declare function AutomatischVersturenCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=AutomatischVersturenCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutomatischVersturenCard.d.ts","sourceRoot":"","sources":["../../src/components/AutomatischVersturenCard.tsx"],"names":[],"mappings":"AAMA,wBAAgB,wBAAwB,gCA+CvC"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // src/components/AutomatischVersturenCard.tsx — toont alleen óf de sleutel op te halen is en het Shell-adres aanwezig is.
3
+ import { useEffect, useState } from "react";
4
+ import { useServerFn } from "@tanstack/react-start";
5
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@flowselections/core";
6
+ import { getAutoSendConfig } from "../lib/autoSend.functions.js";
7
+ export function AutomatischVersturenCard() {
8
+ const lees = useServerFn(getAutoSendConfig);
9
+ const [stand, setStand] = useState(null);
10
+ const [fout, setFout] = useState(null);
11
+ useEffect(() => {
12
+ let actief = true;
13
+ lees()
14
+ .then((r) => actief && setStand(r && typeof r === "object" ? r : null))
15
+ .catch((e) => actief && setFout(String(e?.message ?? e)));
16
+ return () => {
17
+ actief = false;
18
+ };
19
+ }, [lees]);
20
+ const jaNee = (v) => (v ? "ja" : "nee");
21
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Automatisch versturen" }), _jsx(CardDescription, { children: "Alleen voor Floriday-orders, als \"Automatisch versturen\" in de werkwijze aan staat. Is de sleutel niet op te halen of ontbreekt het Shell-adres, dan wordt er niets verstuurd." })] }), _jsx(CardContent, { className: "space-y-1 text-sm", children: fout ? (_jsxs("p", { className: "text-destructive", children: ["Stand onbekend: ", fout] })) : !stand ? (_jsx("p", { className: "text-muted-foreground", children: "Bezig met controleren\u2026" })) : (_jsxs(_Fragment, { children: [_jsxs("p", { children: ["Sleutel op te halen: ", jaNee(stand.sleutelOpTeHalen), !stand.sleutelOpTeHalen && stand.sleutelReden ? ` (${stand.sleutelReden})` : ""] }), _jsxs("p", { children: ["Shell-adres aanwezig: ", jaNee(stand.adresAanwezig)] }), stand.routeOntbreekt ? (_jsx("p", { className: "text-destructive", children: "Het adres voor automatisch versturen bestaat niet in deze Shell. Werk Afhandeling bij en publiceer de Shell opnieuw." })) : null] })) })] }));
22
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"BeheerPage.d.ts","sourceRoot":"","sources":["../../src/components/BeheerPage.tsx"],"names":[],"mappings":"AAmJA,wBAAgB,UAAU,gCAQzB"}
1
+ {"version":3,"file":"BeheerPage.d.ts","sourceRoot":"","sources":["../../src/components/BeheerPage.tsx"],"names":[],"mappings":"AAqJA,wBAAgB,UAAU,gCAUzB"}
@@ -11,6 +11,8 @@ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent,
11
11
  import { RotateCcw } from "lucide-react";
12
12
  import { supabase } from "../integrations/supabase/moduleClient.js";
13
13
  import { RolPoort } from "./RolPoort";
14
+ import { OudeOrderregelsCard } from "./OudeOrderregelsCard";
15
+ import { AutomatischVersturenCard } from "./AutomatischVersturenCard";
14
16
  import { ENGINE_TOEGANG } from "../hooks/useEngineRollen";
15
17
  function HerindelenBeheer() {
16
18
  const [datum, setDatum] = useState("");
@@ -69,5 +71,5 @@ function HerindelenBeheer() {
69
71
  : `${voor?.geprintOfGepickt ?? 0} order(s) die al geprint of gepickt zijn, blijven ongemoeid.` })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Annuleren" }), _jsxs(AlertDialogAction, { onClick: () => void voerUit(), disabled: (voor?.aantal ?? 0) === 0, children: ["Ja, ", voor?.aantal ?? 0, " order(s) opnieuw indelen"] })] })] }) })] }));
70
72
  }
71
73
  export function BeheerPage() {
72
- return (_jsx(RolPoort, { rollen: ENGINE_TOEGANG.beheer, children: _jsx("div", { className: "space-y-6 p-6", children: _jsx(HerindelenBeheer, {}) }) }));
74
+ return (_jsx(RolPoort, { rollen: ENGINE_TOEGANG.beheer, children: _jsxs("div", { className: "space-y-6 p-6", children: [_jsx(HerindelenBeheer, {}), _jsx(OudeOrderregelsCard, {}), _jsx(AutomatischVersturenCard, {})] }) }));
73
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ConsistentieCard.d.ts","sourceRoot":"","sources":["../../src/components/ConsistentieCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,gBAAgB,gCAuF/B"}
1
+ {"version":3,"file":"ConsistentieCard.d.ts","sourceRoot":"","sources":["../../src/components/ConsistentieCard.tsx"],"names":[],"mappings":"AAuCA,wBAAgB,gBAAgB,gCAsF/B"}
@@ -34,5 +34,5 @@ export function ConsistentieCard() {
34
34
  { label: "Aangemeld in pickwachtrij", waarde: check.announced_carts },
35
35
  ]
36
36
  : [];
37
- 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: [_jsx(Scale, { className: "h-5 w-5 text-primary" }), "Zelfde cijfers in elke module"] }), _jsx(CardDescription, { children: "Karren van vandaag per venster. Alle vensters horen hetzelfde te tellen; de lever agenda telt alleen wat vandaag geleverd wordt." })] }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: _jsx(RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` }) })] }), _jsx(CardContent, { className: "space-y-4", children: loading && !check ? (_jsx(Skeleton, { className: "h-24 w-full" })) : !check ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Geen meting beschikbaar." })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: check.ok ? "default" : "destructive", children: check.ok ? "Alles gelijk" : "Afwijking gevonden" }), check.orphan_tasks > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.orphan_tasks, " weestaken"] })) : null, (check.duplicate_carts ?? 0) > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.duplicate_carts, " dubbele karren"] })) : null, (check.orphan_carts ?? 0) > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.orphan_carts, " karren uit een oude buffer"] })) : null, _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Peildag ", check.pick_date] })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4", children: vensters.map((v) => (_jsxs("div", { className: "rounded-lg border p-3", children: [_jsx("div", { className: "text-muted-foreground text-xs", children: v.label }), _jsx("div", { className: "text-2xl font-semibold tabular-nums", children: v.waarde })] }, v.label))) }), !check.ok ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "E\u00E9n of meer modules tellen anders. Controleer of die module de laatste koppelprompt heeft toegepast; de Engine corrigeert niets zelf." })) : null] })) })] }));
37
+ 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: [_jsx(Scale, { className: "h-5 w-5 text-primary" }), "Zelfde cijfers in elke module"] }), _jsx(CardDescription, { children: "Karren van vandaag per venster. Alle vensters horen hetzelfde te tellen; de lever agenda telt alleen wat vandaag geleverd wordt." })] }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => void laden(), disabled: loading, children: _jsx(RefreshCw, { className: `h-4 w-4 ${loading ? "animate-spin" : ""}` }) })] }), _jsx(CardContent, { className: "space-y-4", children: loading && !check ? (_jsx(Skeleton, { className: "h-24 w-full" })) : !check ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Geen meting beschikbaar." })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: check.ok ? "default" : "destructive", children: check.ok ? "Alles gelijk" : "Afwijking gevonden" }), check.orphan_tasks > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.orphan_tasks, " weestaken"] })) : null, (check.duplicate_carts ?? 0) > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.duplicate_carts, " dubbele karren"] })) : null, (check.orphan_carts ?? 0) > 0 ? (_jsxs(Badge, { variant: "destructive", children: [check.orphan_carts, " karren uit een oude buffer"] })) : null, _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Peildag ", check.pick_date] })] }), _jsx("div", { className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4", children: vensters.map((v) => (_jsxs("div", { className: "rounded-lg border p-3", children: [_jsx("div", { className: "text-muted-foreground text-xs", children: v.label }), _jsx("div", { className: "text-2xl font-semibold tabular-nums", children: v.waarde })] }, v.label))) }), !check.ok ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Aantallen verschillen tussen schermen. Meld dit bij Flow Selections." })) : null] })) })] }));
38
38
  }
@@ -0,0 +1,2 @@
1
+ export declare function OudeOrderregelsCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=OudeOrderregelsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OudeOrderregelsCard.d.ts","sourceRoot":"","sources":["../../src/components/OudeOrderregelsCard.tsx"],"names":[],"mappings":"AAeA,wBAAgB,mBAAmB,gCAiDlC"}
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // src/components/OudeOrderregelsCard.tsx — orders met een oude pakbon-orderregel
3
+ // (bron: logistics_pakbon_oude_orderregels, alleen lezen).
4
+ import { useEffect, useState } from "react";
5
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@flowselections/core";
6
+ import { supabase } from "../integrations/supabase/moduleClient.js";
7
+ export function OudeOrderregelsCard() {
8
+ const [rijen, setRijen] = useState([]);
9
+ const [fout, setFout] = useState(null);
10
+ useEffect(() => {
11
+ let actief = true;
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ supabase.rpc("logistics_pakbon_oude_orderregels").then(({ data, error }) => {
14
+ if (!actief)
15
+ return;
16
+ if (error)
17
+ setFout(error.message);
18
+ else
19
+ setRijen(Array.isArray(data) ? data : []);
20
+ });
21
+ return () => {
22
+ actief = false;
23
+ };
24
+ }, []);
25
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: "Oude pakbon-orderregels" }), _jsx(CardDescription, { children: "Orders die geen pakbon per kar krijgen omdat er al een oude orderregel bestaat. Er wordt niets aangepast zonder akkoord." })] }), _jsx(CardContent, { children: fout ? (_jsxs("p", { className: "text-sm text-destructive", children: ["Kon het overzicht niet laden: ", fout] })) : rijen.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "Geen orders met een oude orderregel." })) : (_jsx("ul", { className: "space-y-2 text-sm", children: rijen.map((r) => (_jsxs("li", { children: [_jsx("span", { className: "font-medium", children: r.orderNumber }), ": ", r.melding, r.oudeRegel ? ` (${r.oudeRegel})` : "", Array.isArray(r.bufferOrders) && r.bufferOrders.length > 1
26
+ ? ` — buffer: ${r.bufferOrders.join(", ")}`
27
+ : ""] }, `${r.orderId}-${r.oudeRegel ?? ""}`))) })) })] }));
28
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"previewAuthStorage.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/previewAuthStorage.ts"],"names":[],"mappings":"AAIA,wBAAgB,sBAAsB;mBA2Db,MAAM;mBAeZ,MAAM,SAAS,MAAM;sBASlB,MAAM;cAK3B"}
1
+ {"version":3,"file":"previewAuthStorage.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/previewAuthStorage.ts"],"names":[],"mappings":"AAIA,wBAAgB,sBAAsB;mBA6Db,MAAM;mBAwBZ,MAAM,SAAS,MAAM;sBASlB,MAAM;cAM3B"}
@@ -61,21 +61,38 @@ export function brokeredPreviewStorage() {
61
61
  // The editor may not be listening yet at the first getItem, so retry once.
62
62
  let firstGet = true;
63
63
  const RETRY_DELAY = 250;
64
+ // Blocked third-party storage throws here; seeding must not break broker reads.
65
+ const readLocal = (key) => { try {
66
+ return localStorage.getItem(key);
67
+ }
68
+ catch {
69
+ return undefined;
70
+ } };
64
71
  return {
65
72
  getItem: async (key) => {
66
- let res = await request('lovable-preview-auth:get', key);
73
+ // Sent with GET and REMOVE so an editor that never cached this session can check or revoke it.
74
+ const local = readLocal(key);
75
+ let res = await request('lovable-preview-auth:get', key, local ?? undefined);
67
76
  if (!res && firstGet) {
68
77
  await new Promise((r) => setTimeout(r, RETRY_DELAY));
69
- res = await request('lovable-preview-auth:get', key);
78
+ res = await request('lovable-preview-auth:get', key, local ?? undefined);
70
79
  }
71
80
  firstGet = false;
72
81
  // '' is the logout tombstone: clear the local copy too so it can't resurrect if
73
82
  // the broker later goes silent. A null reply means never-synced -> keep local.
74
83
  if (res && res.ok && typeof res.value === 'string') {
75
84
  if (res.value === '') {
76
- localStorage.removeItem(key);
85
+ if (local !== undefined && readLocal(key) === local)
86
+ localStorage.removeItem(key);
77
87
  return null;
78
88
  }
89
+ // Seed this origin so a new tab, whose editor holds no session, stays signed in.
90
+ if (local === null && readLocal(key) === null) {
91
+ try {
92
+ localStorage.setItem(key, res.value);
93
+ }
94
+ catch { /* storage full: still return the editor's session */ }
95
+ }
79
96
  return res.value;
80
97
  }
81
98
  return localStorage.getItem(key);
@@ -92,8 +109,9 @@ export function brokeredPreviewStorage() {
92
109
  });
93
110
  },
94
111
  removeItem: (key) => {
112
+ const local = readLocal(key);
95
113
  localStorage.removeItem(key);
96
- return request('lovable-preview-auth:remove', key).then(() => undefined);
114
+ return request('lovable-preview-auth:remove', key, local ?? undefined).then(() => undefined);
97
115
  },
98
116
  };
99
117
  }