@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.
- package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
- package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
- package/dist-lib/components/AutomatischVersturenCard.js +22 -0
- package/dist-lib/components/BeheerPage.d.ts.map +1 -1
- package/dist-lib/components/BeheerPage.js +3 -1
- package/dist-lib/components/ConsistentieCard.d.ts.map +1 -1
- package/dist-lib/components/ConsistentieCard.js +1 -1
- package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
- package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
- package/dist-lib/components/OudeOrderregelsCard.js +28 -0
- package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
- package/dist-lib/integrations/supabase/types.d.ts +489 -2
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/autoSend.d.ts +22 -0
- package/dist-lib/lib/autoSend.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.functions.d.ts +11 -0
- package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.functions.js +20 -0
- package/dist-lib/lib/autoSend.js +72 -0
- package/dist-lib/lib/autoSend.server.d.ts +13 -0
- package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.server.js +75 -0
- package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
- package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
- package/dist-lib/lib/centralSecrets.server.js +82 -0
- package/dist-lib/lib/floridayCartCarriers.js +1 -1
- package/dist-lib/lib/floridayPush.server.js +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.js +10 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +183 -0
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +14 -0
- package/dist-lib/lib/shippingNoteQueue.server.js +1 -1
- package/dist-lib/lib/stickerRules.js +1 -1
- package/package.json +4 -4
|
@@ -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":"
|
|
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:
|
|
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,
|
|
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: "
|
|
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 @@
|
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|