@flowselections/floriday-afhandeling-module 1.0.38 → 1.0.39
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/afhandeling/ControleLijstPrint.js +54 -54
- package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/ControlePage.js +1 -3
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +5 -38
- package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/LeveringenPage.js +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +1 -3
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/WeekAgendaView.js +6 -57
- package/dist-lib/components/pickstation/PakbonTemplate.js +70 -70
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +4 -55
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +6 -27
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +108 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +108 -1
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +108 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +111 -1
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +226 -4
- package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
- package/dist-lib/lib/carrierSignupMail.server.js +26 -26
- package/dist-lib/lib/carriers.functions.d.ts +540 -5
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartAssignments.functions.d.ts +540 -5
- package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +1110 -20
- package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
- package/dist-lib/lib/floriday.functions.d.ts +109 -2
- package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
- package/dist-lib/lib/printing.d.ts +2 -11
- package/dist-lib/lib/printing.d.ts.map +1 -1
- package/dist-lib/lib/printing.js +8 -64
- package/package.json +1 -1
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
|
-
import { getWerkplek, setWerkplek } from "../../lib/printing";
|
|
4
3
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
5
4
|
import { useServerFn } from "@tanstack/react-start";
|
|
6
5
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, toast, } from "@flowselections/core";
|
|
7
|
-
import { CalendarClock,
|
|
6
|
+
import { CalendarClock, Mail } from "lucide-react";
|
|
8
7
|
import { getAfhandelingSettings, updateAfhandelingSettings, } from "../../lib/afhandelingSettings.functions";
|
|
9
|
-
import { WeekdayPicker } from "../afhandeling/WeekdayPicker";
|
|
10
8
|
export function AfhandelingSettingsCard() {
|
|
11
9
|
const qc = useQueryClient();
|
|
12
10
|
const fetchSettings = useServerFn(getAfhandelingSettings);
|
|
@@ -18,85 +16,36 @@ export function AfhandelingSettingsCard() {
|
|
|
18
16
|
return await fetchSettings();
|
|
19
17
|
}
|
|
20
18
|
catch {
|
|
21
|
-
return
|
|
22
|
-
pickDaysBeforeTransport: 1,
|
|
23
|
-
transportRegisterDaysBefore: 1,
|
|
24
|
-
pickDistributionEnabled: false,
|
|
25
|
-
maxWorkdaysEarlierPick: 2,
|
|
26
|
-
signupMailEnabled: false,
|
|
27
|
-
signupMailLeadMinutes: 60,
|
|
28
|
-
signupMailPurpose: "afhandeling_carrier_signup",
|
|
29
|
-
pickWeekdays: [1, 2, 3, 4, 5],
|
|
30
|
-
extraPickDaysWithStickers: 0,
|
|
31
|
-
autoProcessPaused: false,
|
|
32
|
-
autoPrintDeliveryNote: false,
|
|
33
|
-
};
|
|
19
|
+
return null;
|
|
34
20
|
}
|
|
35
21
|
},
|
|
36
22
|
});
|
|
37
|
-
const [pickDays, setPickDays] = useState(1);
|
|
38
|
-
const [registerDays, setRegisterDays] = useState(1);
|
|
39
|
-
const [distributionEnabled, setDistributionEnabled] = useState(false);
|
|
40
|
-
const [maxEarlier, setMaxEarlier] = useState(2);
|
|
41
23
|
const [mailEnabled, setMailEnabled] = useState(false);
|
|
42
24
|
const [mailLead, setMailLead] = useState(60);
|
|
43
25
|
const [mailPurpose, setMailPurpose] = useState("afhandeling_carrier_signup");
|
|
44
|
-
const [pickWeekdays, setPickWeekdays] = useState([1, 2, 3, 4, 5]);
|
|
45
|
-
const [extraStickerDays, setExtraStickerDays] = useState(0);
|
|
46
|
-
const [autoProcessPaused, setAutoProcessPaused] = useState(false);
|
|
47
|
-
const [autoPrintDelivery, setAutoPrintDelivery] = useState(false);
|
|
48
|
-
const [werkplek, setWerkplekState] = useState("");
|
|
49
|
-
// Werkplek staat per apparaat in localStorage (SSR-veilig inlezen).
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
setWerkplekState(getWerkplek() ?? "");
|
|
52
|
-
}, []);
|
|
53
26
|
useEffect(() => {
|
|
54
27
|
if (data) {
|
|
55
|
-
setPickDays(data.pickDaysBeforeTransport);
|
|
56
|
-
setRegisterDays(data.transportRegisterDaysBefore);
|
|
57
|
-
setDistributionEnabled(Boolean(data.pickDistributionEnabled));
|
|
58
|
-
setMaxEarlier(data.maxWorkdaysEarlierPick ?? 2);
|
|
59
28
|
setMailEnabled(Boolean(data.signupMailEnabled));
|
|
60
29
|
setMailLead(data.signupMailLeadMinutes ?? 60);
|
|
61
30
|
setMailPurpose(data.signupMailPurpose ?? "afhandeling_carrier_signup");
|
|
62
|
-
setPickWeekdays(Array.isArray(data.pickWeekdays) && data.pickWeekdays.length > 0
|
|
63
|
-
? data.pickWeekdays
|
|
64
|
-
: [1, 2, 3, 4, 5]);
|
|
65
|
-
setExtraStickerDays(data.extraPickDaysWithStickers ?? 0);
|
|
66
|
-
setAutoProcessPaused(Boolean(data.autoProcessPaused));
|
|
67
|
-
setAutoPrintDelivery(Boolean(data.autoPrintDeliveryNote));
|
|
68
31
|
}
|
|
69
32
|
}, [data]);
|
|
70
33
|
const mutation = useMutation({
|
|
71
34
|
mutationFn: async () => saveSettings({
|
|
72
35
|
data: {
|
|
73
|
-
pickDaysBeforeTransport: pickDays,
|
|
74
|
-
transportRegisterDaysBefore: registerDays,
|
|
75
|
-
pickDistributionEnabled: distributionEnabled,
|
|
76
|
-
maxWorkdaysEarlierPick: maxEarlier,
|
|
77
36
|
signupMailEnabled: mailEnabled,
|
|
78
37
|
signupMailLeadMinutes: mailLead,
|
|
79
38
|
signupMailPurpose: mailPurpose,
|
|
80
|
-
pickWeekdays,
|
|
81
|
-
extraPickDaysWithStickers: extraStickerDays,
|
|
82
|
-
autoProcessPaused,
|
|
83
|
-
autoPrintDeliveryNote: autoPrintDelivery,
|
|
84
39
|
},
|
|
85
40
|
}),
|
|
86
41
|
onSuccess: async () => {
|
|
87
42
|
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
88
43
|
await invalidatePlanning(qc);
|
|
89
|
-
toast.success("Instellingen opgeslagen
|
|
44
|
+
toast.success("Instellingen opgeslagen");
|
|
90
45
|
},
|
|
91
46
|
onError: (e) => {
|
|
92
47
|
toast.error(e instanceof Error ? e.message : "Opslaan mislukt");
|
|
93
48
|
},
|
|
94
49
|
});
|
|
95
|
-
|
|
96
|
-
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarClock, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Afhandeling \u2014 Planning" })] }), _jsx(CardDescription, { children: "Centrale werkdag-instellingen voor de automatische order\u00ADplanning. Alle berekeningen tellen alleen werkdagen (ma\u2013vr)." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "space-y-2 rounded-lg border p-3", children: [_jsx(Label, { htmlFor: "werkplek", children: "Werkplek (voor printen)" }), _jsx(Input, { id: "werkplek", placeholder: "bijv. pickstation-1 of controle-pc", value: werkplek, onChange: (e) => {
|
|
97
|
-
setWerkplekState(e.target.value);
|
|
98
|
-
setWerkplek(e.target.value);
|
|
99
|
-
} }), _jsx("p", { className: "text-xs text-muted-foreground", children: werkplek.trim()
|
|
100
|
-
? "Printopdrachten gaan naar de printer die aan deze werkplek is gekoppeld."
|
|
101
|
-
: "Zolang dit leeg is kan er niet geprint worden. Deze instelling geldt alleen op dit apparaat." })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "pickDays", children: "Aantal pickdagen (werkdagen v\u00F3\u00F3r ophaaldag)" }), _jsx(Input, { id: "pickDays", type: "number", min: 0, max: 30, value: pickDays, onChange: (e) => setPickDays(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Wordt vanaf de berekende ophaaldag teruggeteld om de uiterste pickdatum te bepalen." })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Sticker, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "extraStickerDays", className: "font-semibold", children: "Extra pickdagen bij stickers" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Wanneer een order stickers bevat, mag het picken langer duren. Deze werkdagen worden bovenop het standaard aantal pickdagen opgeteld, zodat de uiterste pickdatum vroeger valt." }), _jsx(Input, { id: "extraStickerDays", type: "number", min: 0, max: 30, value: extraStickerDays, onChange: (e) => setExtraStickerDays(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Voorbeeld: standaard 1 pickdag + 2 extra = 3 werkdagen picktijd voor orders met stickers." })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarDays, { className: "h-4 w-4 text-primary" }), _jsx(Label, { className: "font-semibold", children: "Orderpickdagen" })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Selecteer de dagen waarop het systeem orders mag inplannen om te picken. Andere dagen worden automatisch overgeslagen." }), _jsx(WeekdayPicker, { value: pickWeekdays, onChange: setPickWeekdays, idPrefix: "pick-wd" }), pickWeekdays.length === 0 ? (_jsx("p", { className: "text-xs text-destructive", children: "Kies minimaal \u00E9\u00E9n pickdag; anders kan het systeem geen orders inplannen." })) : null] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Scale, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "pickDistribution", className: "font-semibold", children: "Pickverdeling" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verdeelt de pickbelasting automatisch over werkdagen. Orders mogen eerder ingepland worden, maar nooit later dan de berekende uiterste pickdatum \u2014 leverbetrouwbaarheid blijft gegarandeerd." })] }), _jsx(Switch, { id: "pickDistribution", checked: distributionEnabled, onCheckedChange: setDistributionEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "maxEarlier", children: "Maximaal aantal werkdagen eerder picken" }), _jsx(Input, { id: "maxEarlier", type: "number", min: 0, max: 30, value: maxEarlier, disabled: !distributionEnabled, onChange: (e) => setMaxEarlier(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "0 = geen vervroeging. Bijv. 2 = orders mogen maximaal 2 werkdagen voor hun uiterste pickdatum ingepland worden." })] })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "mailEnabled", className: "font-semibold", children: "Aanmeldmail vervoerders" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verstuurt automatisch een mail met de te verwachten karren naar de vervoerder v\u00F3\u00F3r de aanmelddeadline van het ophaalmoment. E\u00E9n mail per ophaaldag/-moment per vervoerder." })] }), _jsx(Switch, { id: "mailEnabled", checked: mailEnabled, onCheckedChange: setMailEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailLead", children: "Minuten v\u00F3\u00F3r aanmelddeadline versturen" }), _jsx(Input, { id: "mailLead", type: "number", min: 0, max: 1440, value: mailLead, disabled: !mailEnabled, onChange: (e) => setMailLead(Math.max(0, Math.min(1440, Math.floor(Number(e.target.value)) || 0))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailPurpose", children: "E-mail-doeleinde (purpose)" }), _jsx(Input, { id: "mailPurpose", value: mailPurpose, disabled: !mailEnabled, onChange: (e) => setMailPurpose(e.target.value) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Koppel dit doeleinde in de module ", _jsx("strong", { children: "E-mailkoppeling" }), " aan een actief send-adres. Standaard: ", _jsx("code", { children: "afhandeling_carrier_signup" }), "."] })] })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Pause, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "autoPause", className: "font-semibold", children: "Automatische Floriday-verwerking pauzeren" })] }), _jsxs("p", { className: "text-xs text-muted-foreground max-w-prose", children: ["Zet dit aan om ", _jsx("strong", { children: "tijdelijk" }), " te stoppen met automatisch Sales Orders acknowledgen, delivery orders aanmaken en fulfillment orders versturen. Bestaande orders in de wachtrij blijven staan."] })] }), _jsx(Switch, { id: "autoPause", checked: autoProcessPaused, onCheckedChange: setAutoProcessPaused })] }), _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Printer, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "autoPrint", className: "font-semibold", children: "Afleverbrief automatisch printen" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Wanneer een afleverbrief beschikbaar komt, wordt hij direct naar de standaardprinter gestuurd. Handig voor onbemande balies." })] }), _jsx(Switch, { id: "autoPrint", checked: autoPrintDelivery, onCheckedChange: setAutoPrintDelivery })] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Timing van de automatische verwerking wordt bepaald door", " ", _jsx("strong", { children: "Maximaal aantal werkdagen eerder picken" }), ",", " ", _jsx("strong", { children: "Orderpickdagen" }), " en", " ", _jsx("strong", { children: "Extra pickdagen bij stickers" }), " hierboven."] })] }), _jsxs("div", { className: "rounded-md bg-muted/50 p-3 text-xs text-muted-foreground", children: [_jsx("strong", { children: "Ophaaltijd" }), " en ", _jsx("strong", { children: "Aanmeldtijd" }), " stel je per vervoerder in (werkdagen v\u00F3\u00F3r bezorgdag). De vervoerder die als ", _jsx("strong", { children: "standaard" }), " is gemarkeerd, wordt gebruikt voor orders zonder eigen vervoerder."] }), _jsx(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: mutation.isPending ? "Opslaan…" : "Opslaan" })] })] }));
|
|
50
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarClock, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Afhandeling \u2014 Planning" })] }), _jsx(CardDescription, { children: "De pickplanning (pickdagen, picktijd en verdeling over de week) wordt volledig bepaald door de Logistics Engine. Hieronder staan alleen de instellingen van deze module zelf." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "mailEnabled", className: "font-semibold", children: "Aanmeldmail vervoerders" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verstuurt automatisch een mail met de te verwachten karren naar de vervoerder v\u00F3\u00F3r de aanmelddeadline van het ophaalmoment. E\u00E9n mail per ophaaldag/-moment per vervoerder." })] }), _jsx(Switch, { id: "mailEnabled", checked: mailEnabled, onCheckedChange: setMailEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailLead", children: "Minuten v\u00F3\u00F3r aanmelddeadline versturen" }), _jsx(Input, { id: "mailLead", type: "number", min: 0, max: 1440, value: mailLead, disabled: !mailEnabled, onChange: (e) => setMailLead(Math.max(0, Math.min(1440, Math.floor(Number(e.target.value)) || 0))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailPurpose", children: "E-mail-doeleinde (purpose)" }), _jsx(Input, { id: "mailPurpose", value: mailPurpose, disabled: !mailEnabled, onChange: (e) => setMailPurpose(e.target.value) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Koppel dit doeleinde in de module ", _jsx("strong", { children: "E-mailkoppeling" }), " aan een actief send-adres. Standaard: ", _jsx("code", { children: "afhandeling_carrier_signup" }), "."] })] })] }), _jsxs("div", { className: "rounded-md bg-muted/50 p-3 text-xs text-muted-foreground", children: [_jsx("strong", { children: "Ophaaltijd" }), " en ", _jsx("strong", { children: "Aanmeldtijd" }), " stel je per vervoerder in (werkdagen v\u00F3\u00F3r bezorgdag). De vervoerder die als ", _jsx("strong", { children: "standaard" }), " is gemarkeerd, wordt gebruikt voor orders zonder eigen vervoerder."] }), _jsx(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: mutation.isPending ? "Opslaan…" : "Opslaan" })] })] }));
|
|
102
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAWtG;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,gFAAgF;IAChF,cAAc,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,KAAK,EAAE,aAAa,CAAC;IACrB,uEAAuE;IACvE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,wEAAwE;IACxE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,WAAW,EAAE,YAAY,EAAE,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAGD,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,uBAAuB,GAAG,sBAAsB,CAiTxF"}
|
|
@@ -2,7 +2,6 @@ import { useEffect, useMemo, useState } from "react";
|
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { useServerFn } from "@tanstack/react-start";
|
|
4
4
|
import { getFloridayOrders } from "../lib/floriday.functions";
|
|
5
|
-
import { getAfhandelingSettings } from "../lib/afhandelingSettings.functions";
|
|
6
5
|
import { listCarriers } from "../lib/carriers.functions";
|
|
7
6
|
import { safeServerCall } from "../lib/serverFnError";
|
|
8
7
|
import { normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget } from "../lib/carrierPlanning";
|
|
@@ -15,7 +14,6 @@ export function useOrderPlanning(range) {
|
|
|
15
14
|
const from = range?.from ?? null;
|
|
16
15
|
const to = range?.to ?? null;
|
|
17
16
|
const fetchOrders = useServerFn(getFloridayOrders);
|
|
18
|
-
const fetchSettings = useServerFn(getAfhandelingSettings);
|
|
19
17
|
const fetchCarriers = useServerFn(listCarriers);
|
|
20
18
|
const ordersQuery = useQuery({
|
|
21
19
|
queryKey: ["floriday", "orders", from, to],
|
|
@@ -56,20 +54,6 @@ export function useOrderPlanning(range) {
|
|
|
56
54
|
refetchIntervalInBackground: false,
|
|
57
55
|
refetchOnWindowFocus: true,
|
|
58
56
|
});
|
|
59
|
-
const settingsQuery = useQuery({
|
|
60
|
-
queryKey: ["afhandeling", "settings"],
|
|
61
|
-
queryFn: async () => {
|
|
62
|
-
try {
|
|
63
|
-
return await fetchSettings();
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return { pickDaysBeforeTransport: 1, transportRegisterDaysBefore: 1, pickDistributionEnabled: false, maxWorkdaysEarlierPick: 2, signupMailEnabled: false, signupMailLeadMinutes: 60, signupMailPurpose: "afhandeling_carrier_signup", pickWeekdays: [1, 2, 3, 4, 5], extraPickDaysWithStickers: 0 };
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
refetchInterval: 60000,
|
|
70
|
-
refetchIntervalInBackground: false,
|
|
71
|
-
refetchOnWindowFocus: true,
|
|
72
|
-
});
|
|
73
57
|
const carriersQuery = useQuery({
|
|
74
58
|
queryKey: ["carriers"],
|
|
75
59
|
queryFn: () => safeServerCall(() => fetchCarriers(), { carriers: [] }, "listCarriers"),
|
|
@@ -120,14 +104,10 @@ export function useOrderPlanning(range) {
|
|
|
120
104
|
const composeExists = composeExistsQuery.data;
|
|
121
105
|
const planned = useMemo(() => {
|
|
122
106
|
const orders = orderList;
|
|
123
|
-
const settings = settingsQuery.data ?? {
|
|
124
|
-
pickDaysBeforeTransport: 1,
|
|
125
|
-
transportRegisterDaysBefore: 1,
|
|
126
|
-
pickWeekdays: [1, 2, 3, 4, 5],
|
|
127
|
-
extraPickDaysWithStickers: 0,
|
|
128
|
-
};
|
|
129
107
|
const carriers = carriersQuery.data?.carriers ?? [];
|
|
130
|
-
|
|
108
|
+
// Pickdagen en picktijd komen volledig uit de Logistics Engine; hier
|
|
109
|
+
// gebruiken we alleen neutrale waarden voor de transport-/leverdatum.
|
|
110
|
+
const pickWeekdays = [1, 2, 3, 4, 5];
|
|
131
111
|
return orders.map((order) => {
|
|
132
112
|
const carrier = selectCarrierForTarget(carriers, {
|
|
133
113
|
carrierId: order.carrierId,
|
|
@@ -142,7 +122,7 @@ export function useOrderPlanning(range) {
|
|
|
142
122
|
// pickmoment en de karindeling komen uitsluitend uit de Engine-taak.
|
|
143
123
|
const base = calculateOrderPlanning(order.deliveryDate, {
|
|
144
124
|
pickupMoments: moments,
|
|
145
|
-
pickDurationWorkdays:
|
|
125
|
+
pickDurationWorkdays: 1,
|
|
146
126
|
orderCreatedAt: order.createdAt,
|
|
147
127
|
pickWeekdays,
|
|
148
128
|
carrierPickupWeekdays: sanitizeWeekdays(carrier?.pickup_weekdays),
|
|
@@ -207,7 +187,7 @@ export function useOrderPlanning(range) {
|
|
|
207
187
|
};
|
|
208
188
|
return { order, planning, engineTask: task, awaitingEngine: false, state: "planned", hasComposeTask: true };
|
|
209
189
|
});
|
|
210
|
-
}, [orderList,
|
|
190
|
+
}, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists]);
|
|
211
191
|
// Orders zonder taak melden we bij de Engine; zelf indelen mag niet.
|
|
212
192
|
// De meldlus is begrensd: max MAX_PER_ROUND orders per ronde, pogingenteller
|
|
213
193
|
// met backoff per order, en na MAX_ATTEMPTS definitief opgeven met melding.
|
|
@@ -304,12 +284,11 @@ export function useOrderPlanning(range) {
|
|
|
304
284
|
tasksWithoutStart: planned.filter((p) => p.state === "task_without_start"),
|
|
305
285
|
signalError,
|
|
306
286
|
lastEngineRun,
|
|
307
|
-
isLoading: ordersQuery.isLoading ||
|
|
287
|
+
isLoading: ordersQuery.isLoading || carriersQuery.isLoading || tasksLoading,
|
|
308
288
|
error: ordersQuery.data?.orders?.length ? undefined : ordersQuery.data?.error,
|
|
309
289
|
warning: ordersQuery.data?.orders?.length ? ordersQuery.data?.error : undefined,
|
|
310
290
|
refetch: () => {
|
|
311
291
|
void ordersQuery.refetch();
|
|
312
|
-
void settingsQuery.refetch();
|
|
313
292
|
void carriersQuery.refetch();
|
|
314
293
|
refetchTasks();
|
|
315
294
|
},
|
|
@@ -15728,6 +15728,45 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
15728
15728
|
};
|
|
15729
15729
|
Relationships: [];
|
|
15730
15730
|
};
|
|
15731
|
+
stock_consumption_alerts: {
|
|
15732
|
+
Row: {
|
|
15733
|
+
alert_type: string;
|
|
15734
|
+
created_at: string;
|
|
15735
|
+
id: string;
|
|
15736
|
+
mutation_log_id: string | null;
|
|
15737
|
+
order_id: string | null;
|
|
15738
|
+
order_item_id: string | null;
|
|
15739
|
+
qty: number;
|
|
15740
|
+
reason: string | null;
|
|
15741
|
+
resolved_at: string | null;
|
|
15742
|
+
updated_at: string;
|
|
15743
|
+
};
|
|
15744
|
+
Insert: {
|
|
15745
|
+
alert_type: string;
|
|
15746
|
+
created_at?: string;
|
|
15747
|
+
id?: string;
|
|
15748
|
+
mutation_log_id?: string | null;
|
|
15749
|
+
order_id?: string | null;
|
|
15750
|
+
order_item_id?: string | null;
|
|
15751
|
+
qty?: number;
|
|
15752
|
+
reason?: string | null;
|
|
15753
|
+
resolved_at?: string | null;
|
|
15754
|
+
updated_at?: string;
|
|
15755
|
+
};
|
|
15756
|
+
Update: {
|
|
15757
|
+
alert_type?: string;
|
|
15758
|
+
created_at?: string;
|
|
15759
|
+
id?: string;
|
|
15760
|
+
mutation_log_id?: string | null;
|
|
15761
|
+
order_id?: string | null;
|
|
15762
|
+
order_item_id?: string | null;
|
|
15763
|
+
qty?: number;
|
|
15764
|
+
reason?: string | null;
|
|
15765
|
+
resolved_at?: string | null;
|
|
15766
|
+
updated_at?: string;
|
|
15767
|
+
};
|
|
15768
|
+
Relationships: [];
|
|
15769
|
+
};
|
|
15731
15770
|
stock_import_runs: {
|
|
15732
15771
|
Row: {
|
|
15733
15772
|
connection_id: string | null;
|
|
@@ -18581,6 +18620,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
18581
18620
|
werkbon_package_items: {
|
|
18582
18621
|
Row: {
|
|
18583
18622
|
article_number: string | null;
|
|
18623
|
+
artikel_id: string | null;
|
|
18584
18624
|
created_at: string;
|
|
18585
18625
|
gtin: string | null;
|
|
18586
18626
|
id: string;
|
|
@@ -18598,6 +18638,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
18598
18638
|
};
|
|
18599
18639
|
Insert: {
|
|
18600
18640
|
article_number?: string | null;
|
|
18641
|
+
artikel_id?: string | null;
|
|
18601
18642
|
created_at?: string;
|
|
18602
18643
|
gtin?: string | null;
|
|
18603
18644
|
id?: string;
|
|
@@ -18615,6 +18656,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
18615
18656
|
};
|
|
18616
18657
|
Update: {
|
|
18617
18658
|
article_number?: string | null;
|
|
18659
|
+
artikel_id?: string | null;
|
|
18618
18660
|
created_at?: string;
|
|
18619
18661
|
gtin?: string | null;
|
|
18620
18662
|
id?: string;
|
|
@@ -18631,6 +18673,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
18631
18673
|
updated_at?: string;
|
|
18632
18674
|
};
|
|
18633
18675
|
Relationships: [{
|
|
18676
|
+
foreignKeyName: "werkbon_package_items_artikel_id_fkey";
|
|
18677
|
+
columns: ["artikel_id"];
|
|
18678
|
+
isOneToOne: false;
|
|
18679
|
+
referencedRelation: "artikelen_cache";
|
|
18680
|
+
referencedColumns: ["id"];
|
|
18681
|
+
}, {
|
|
18634
18682
|
foreignKeyName: "werkbon_package_items_package_id_fkey";
|
|
18635
18683
|
columns: ["package_id"];
|
|
18636
18684
|
isOneToOne: false;
|
|
@@ -19853,6 +19901,20 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
19853
19901
|
referencedColumns: ["id"];
|
|
19854
19902
|
}];
|
|
19855
19903
|
};
|
|
19904
|
+
v_werkbon_totalen: {
|
|
19905
|
+
Row: {
|
|
19906
|
+
packages_cents: number | null;
|
|
19907
|
+
packages_minutes: number | null;
|
|
19908
|
+
werkbon_id: string | null;
|
|
19909
|
+
};
|
|
19910
|
+
Relationships: [{
|
|
19911
|
+
foreignKeyName: "werkbon_package_lines_werkbon_id_fkey";
|
|
19912
|
+
columns: ["werkbon_id"];
|
|
19913
|
+
isOneToOne: false;
|
|
19914
|
+
referencedRelation: "werkbonnen";
|
|
19915
|
+
referencedColumns: ["id"];
|
|
19916
|
+
}];
|
|
19917
|
+
};
|
|
19856
19918
|
};
|
|
19857
19919
|
Functions: {
|
|
19858
19920
|
_floriday_schedule_job: {
|
|
@@ -21400,6 +21462,14 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
21400
21462
|
};
|
|
21401
21463
|
Returns: import("./types").Json;
|
|
21402
21464
|
};
|
|
21465
|
+
logistics_plan_block: {
|
|
21466
|
+
Args: {
|
|
21467
|
+
p_details?: import("./types").Json;
|
|
21468
|
+
p_order_ids: string[];
|
|
21469
|
+
p_reason: string;
|
|
21470
|
+
};
|
|
21471
|
+
Returns: number;
|
|
21472
|
+
};
|
|
21403
21473
|
logistics_plan_buffer_sql: {
|
|
21404
21474
|
Args: {
|
|
21405
21475
|
p_buffer_id: string;
|
|
@@ -21768,6 +21838,12 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
21768
21838
|
verwijderd: number;
|
|
21769
21839
|
}[];
|
|
21770
21840
|
};
|
|
21841
|
+
order_departure_proof: {
|
|
21842
|
+
Args: {
|
|
21843
|
+
p_order_id: string;
|
|
21844
|
+
};
|
|
21845
|
+
Returns: import("./types").Json;
|
|
21846
|
+
};
|
|
21771
21847
|
order_number_prefix: {
|
|
21772
21848
|
Args: {
|
|
21773
21849
|
p_custom_fields?: import("./types").Json;
|
|
@@ -21775,6 +21851,25 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
21775
21851
|
};
|
|
21776
21852
|
Returns: string;
|
|
21777
21853
|
};
|
|
21854
|
+
pakket_suggesties_voor_tekst: {
|
|
21855
|
+
Args: {
|
|
21856
|
+
_tekst: string;
|
|
21857
|
+
};
|
|
21858
|
+
Returns: {
|
|
21859
|
+
hit_type: string;
|
|
21860
|
+
package_id: string;
|
|
21861
|
+
priority: number;
|
|
21862
|
+
}[];
|
|
21863
|
+
};
|
|
21864
|
+
pakket_voor_reistijd: {
|
|
21865
|
+
Args: {
|
|
21866
|
+
_minuten: number;
|
|
21867
|
+
};
|
|
21868
|
+
Returns: {
|
|
21869
|
+
package_id: string;
|
|
21870
|
+
priority: number;
|
|
21871
|
+
}[];
|
|
21872
|
+
};
|
|
21778
21873
|
pick_active_printers: {
|
|
21779
21874
|
Args: never;
|
|
21780
21875
|
Returns: {
|
|
@@ -22825,6 +22920,18 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
22825
22920
|
Args: never;
|
|
22826
22921
|
Returns: string;
|
|
22827
22922
|
};
|
|
22923
|
+
werkbon_totalen: {
|
|
22924
|
+
Args: {
|
|
22925
|
+
_werkbon_id: string;
|
|
22926
|
+
};
|
|
22927
|
+
Returns: {
|
|
22928
|
+
materials_cents: number;
|
|
22929
|
+
packages_cents: number;
|
|
22930
|
+
packages_minutes: number;
|
|
22931
|
+
total_cents: number;
|
|
22932
|
+
total_minutes: number;
|
|
22933
|
+
}[];
|
|
22934
|
+
};
|
|
22828
22935
|
wo_create_from_source: {
|
|
22829
22936
|
Args: {
|
|
22830
22937
|
_payload?: import("./types").Json;
|
|
@@ -22863,7 +22970,7 @@ export declare const requireSupabaseAuth: import("@tanstack/start-client-core").
|
|
|
22863
22970
|
};
|
|
22864
22971
|
CompositeTypes: { [_ in never]: never; };
|
|
22865
22972
|
}, {
|
|
22866
|
-
PostgrestVersion: "14.
|
|
22973
|
+
PostgrestVersion: "14.17";
|
|
22867
22974
|
}>;
|
|
22868
22975
|
userId: string;
|
|
22869
22976
|
claims: import("@supabase/auth-js").JwtPayload;
|