@flowselections/floriday-afhandeling-module 1.0.64 → 1.0.69
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/AutoProcessStatus.js +3 -3
- package/dist-lib/components/afhandeling/AutoSendStatus.js +1 -1
- package/dist-lib/components/afhandeling/CapacityWarning.d.ts +1 -1
- package/dist-lib/components/afhandeling/CapacityWarning.js +1 -1
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +2 -2
- package/dist-lib/components/afhandeling/ControleLijstPrint.js +2 -2
- package/dist-lib/components/afhandeling/ControlePage.js +6 -6
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +5 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +83 -31
- package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/LeveringenPage.js +28 -6
- package/dist-lib/components/afhandeling/NieuweVervoerderPage.js +1 -1
- package/dist-lib/components/afhandeling/NuVersturenButton.js +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.d.ts +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.js +5 -5
- package/dist-lib/components/afhandeling/PickingPage.js +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
- package/dist-lib/components/afhandeling/ServiceAreaSelect.js +1 -1
- package/dist-lib/components/afhandeling/SignupMailMoments.js +12 -7
- package/dist-lib/components/afhandeling/VervoerderBewerkenPage.js +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.js +20 -13
- package/dist-lib/components/afhandeling/VervoerdersPage.js +8 -8
- package/dist-lib/components/afhandeling/VerzetOrderDialog.js +7 -7
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -2
- package/dist-lib/components/afhandeling/WeekAgendaView.js +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +1 -1
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts +2 -2
- package/dist-lib/components/pickstation/PakbonTemplate.js +1 -1
- package/dist-lib/components/pickstation/printDocuments.d.ts +1 -1
- package/dist-lib/components/pickstation/printDocuments.js +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +5 -5
- package/dist-lib/components/settings/VervoerdersSettingsCard.js +2 -2
- package/dist-lib/hooks/useCapacityCheck.d.ts +1 -1
- package/dist-lib/hooks/useCapacityCheck.js +1 -1
- package/dist-lib/hooks/useCartIndex.js +2 -2
- package/dist-lib/hooks/useConsistencyCheck.js +1 -1
- package/dist-lib/hooks/useEngineBufferEvents.js +1 -1
- package/dist-lib/hooks/useEngineTasks.d.ts +1 -1
- package/dist-lib/hooks/useEngineTasks.js +2 -2
- package/dist-lib/hooks/useKnownOrders.js +4 -4
- package/dist-lib/hooks/useOrderBuffers.d.ts +2 -2
- package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderBuffers.js +1 -1
- package/dist-lib/hooks/useOrderMeldingen.d.ts +1 -1
- package/dist-lib/hooks/useOrderMeldingen.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderMeldingen.js +1 -1
- package/dist-lib/hooks/useOrderPickDates.js +3 -3
- package/dist-lib/hooks/useOrderPlanning.d.ts +3 -3
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +30 -15
- package/dist-lib/hooks/usePickAgenda.js +4 -4
- package/dist-lib/hooks/usePickMode.d.ts +3 -3
- package/dist-lib/hooks/usePickMode.js +1 -1
- package/dist-lib/index.d.ts +16 -16
- package/dist-lib/index.js +16 -16
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +502 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +2 -2
- package/dist-lib/lib/afhandelingSettings.functions.js +1 -1
- package/dist-lib/lib/agendaRange.js +1 -1
- package/dist-lib/lib/authGateway.server.js +2 -2
- package/dist-lib/lib/carrierMatch.server.js +1 -1
- package/dist-lib/lib/carrierPlanning.d.ts +5 -1
- package/dist-lib/lib/carrierPlanning.d.ts.map +1 -1
- package/dist-lib/lib/carrierPlanning.js +16 -10
- package/dist-lib/lib/carrierSignup.functions.d.ts +12 -4
- package/dist-lib/lib/carrierSignup.functions.d.ts.map +1 -1
- package/dist-lib/lib/carrierSignup.functions.js +4 -2
- package/dist-lib/lib/carriers.functions.d.ts +7 -7
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.js +15 -8
- package/dist-lib/lib/cartAssignments.functions.d.ts +8 -8
- package/dist-lib/lib/cartAssignments.functions.js +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +11 -11
- package/dist-lib/lib/cartControl.functions.js +2 -2
- package/dist-lib/lib/cartMoveImpact.d.ts +1 -1
- package/dist-lib/lib/cartMoveImpact.js +1 -1
- package/dist-lib/lib/cartRescheduling.js +1 -1
- package/dist-lib/lib/deliveryNote.functions.d.ts +1 -1
- package/dist-lib/lib/deliveryNote.functions.js +2 -2
- package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
- package/dist-lib/lib/deliveryNotePrint.js +3 -3
- package/dist-lib/lib/engineLayouts.functions.d.ts +1 -1
- package/dist-lib/lib/engineLayouts.functions.js +1 -1
- package/dist-lib/lib/floriday.functions.d.ts +2 -2
- package/dist-lib/lib/floriday.functions.js +2 -2
- package/dist-lib/lib/floridayAutoProcess.js +2 -2
- package/dist-lib/lib/floridayFulfillmentSend.server.js +3 -3
- package/dist-lib/lib/floridayLoading.functions.d.ts +2 -2
- package/dist-lib/lib/floridayLoading.functions.js +3 -3
- package/dist-lib/lib/gatewayBase.server.js +1 -1
- package/dist-lib/lib/invalidatePlanning.js +1 -1
- package/dist-lib/lib/logisticsEngine/engine.js +1 -1
- package/dist-lib/lib/logisticsEngine/reschedule.js +2 -2
- package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
- package/dist-lib/lib/orderFulfilment.functions.d.ts +1 -1
- package/dist-lib/lib/orderFulfilment.functions.js +1 -1
- package/dist-lib/lib/pickDates.functions.d.ts +1 -1
- package/dist-lib/lib/pickDates.functions.js +2 -2
- package/dist-lib/lib/pickMode.js +1 -1
- package/dist-lib/lib/pickWorkdays.d.ts +24 -0
- package/dist-lib/lib/pickWorkdays.d.ts.map +1 -0
- package/dist-lib/lib/pickWorkdays.js +30 -0
- package/dist-lib/lib/pickstationOrders.server.d.ts +2 -2
- package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
- package/dist-lib/lib/pickstationOrders.server.js +11 -5
- package/dist-lib/lib/planning.d.ts +19 -0
- package/dist-lib/lib/planning.d.ts.map +1 -1
- package/dist-lib/lib/planning.js +58 -11
- package/dist-lib/lib/realtimeBus.js +1 -1
- package/dist-lib/lib/serverRoutes/autoSend.handler.js +3 -3
- package/dist-lib/lib/serverRoutes/index.d.ts +5 -5
- package/dist-lib/lib/serverRoutes/index.js +5 -5
- package/dist-lib/lib/serverRoutes/pickstationOrders.handler.js +1 -1
- package/dist-lib/lib/serverRoutes/pickstationPrint.handler.js +1 -1
- package/dist-lib/lib/serverRoutes/pickstationStatus.handler.js +1 -1
- package/dist-lib/lib/signupMailText.d.ts.map +1 -1
- package/dist-lib/lib/signupMailText.js +4 -0
- package/dist-lib/moduleDefinition.js +3 -3
- package/package.json +2 -2
|
@@ -5,11 +5,11 @@ import { Truck, User, Mail, Phone, MapPin, Calendar, Clock, FileText, Globe, Plu
|
|
|
5
5
|
import { Link, useNavigate } from "@tanstack/react-router";
|
|
6
6
|
import { useServerFn } from "@tanstack/react-start";
|
|
7
7
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
8
|
-
import { getCarrier, upsertCarrier, } from "../../lib/carriers.functions";
|
|
9
|
-
import { DEFAULT_PICKUP_MOMENT } from "../../lib/planning";
|
|
10
|
-
import { COUNTRIES, countryName } from "../../lib/countries";
|
|
11
|
-
import { ServiceAreaSelect } from "./ServiceAreaSelect";
|
|
12
|
-
import { WeekdayPicker } from "./WeekdayPicker";
|
|
8
|
+
import { getCarrier, upsertCarrier, } from "../../lib/carriers.functions.js";
|
|
9
|
+
import { DEFAULT_PICKUP_MOMENT } from "../../lib/planning.js";
|
|
10
|
+
import { COUNTRIES, countryName } from "../../lib/countries.js";
|
|
11
|
+
import { ServiceAreaSelect } from "./ServiceAreaSelect.js";
|
|
12
|
+
import { WeekdayPicker } from "./WeekdayPicker.js";
|
|
13
13
|
const EMPTY = {
|
|
14
14
|
name: "",
|
|
15
15
|
contact_person: "",
|
|
@@ -18,7 +18,7 @@ const EMPTY = {
|
|
|
18
18
|
address: "",
|
|
19
19
|
notes: "",
|
|
20
20
|
is_default: false,
|
|
21
|
-
pickup_moments: [DEFAULT_PICKUP_MOMENT],
|
|
21
|
+
pickup_moments: [{ ...DEFAULT_PICKUP_MOMENT }],
|
|
22
22
|
service_countries: [],
|
|
23
23
|
service_provinces: [],
|
|
24
24
|
service_cities: [],
|
|
@@ -45,8 +45,8 @@ function CountryPicker({ value, onChange, excluded, }) {
|
|
|
45
45
|
setQuery("");
|
|
46
46
|
}, className: "flex items-center justify-between w-full px-3 py-2 text-sm text-left hover:bg-muted", children: [_jsx("span", { children: c.name }), _jsx("span", { className: "text-xs text-muted-foreground", children: c.code })] }, c.code)))) })] })] }));
|
|
47
47
|
}
|
|
48
|
-
function PickupMomentRow({ label, days, time, maxDays, onDaysChange, onTimeChange, }) {
|
|
49
|
-
return (_jsxs("div", { className: "grid grid-cols-[110px,1fr,1fr] items-center gap-3", children: [_jsx("div", { className: "text-sm font-medium", children: label }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Werkdagen v\u00F3\u00F3r levering" }), _jsx(IconInput, { icon: Calendar, type: "number", min: 0, max: maxDays, value: days, onChange: (e) => onDaysChange(Number(e.target.value) || 0) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Tijdstip" }), _jsx(IconInput, { icon: Clock, type: "time", value: time, onChange: (e) => onTimeChange(e.target.value) })] })] }));
|
|
48
|
+
function PickupMomentRow({ label, days, time, maxDays, onDaysChange, onTimeChange, showError, }) {
|
|
49
|
+
return (_jsxs("div", { className: "grid grid-cols-[110px,1fr,1fr] items-center gap-3", children: [_jsx("div", { className: "text-sm font-medium", children: label }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Werkdagen v\u00F3\u00F3r levering" }), _jsx(IconInput, { icon: Calendar, type: "number", min: 0, max: maxDays, value: days, onChange: (e) => onDaysChange(Number(e.target.value) || 0) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: "Tijdstip" }), _jsx(IconInput, { icon: Clock, type: "time", value: time, required: true, "aria-invalid": showError && !time ? true : undefined, onChange: (e) => onTimeChange(e.target.value) }), showError && !time ? _jsx("p", { className: "text-xs text-destructive", children: "Vul een tijd in." }) : null] })] }));
|
|
50
50
|
}
|
|
51
51
|
// Normaliseer een ophaalmoment: aanmelden moet altijd vóór (of op) ophalen
|
|
52
52
|
// liggen, ophalen vóór (of op) bezorgen. Werkdagen-waardes zijn afstanden tot
|
|
@@ -73,13 +73,13 @@ function normalizeMoment(next, prev) {
|
|
|
73
73
|
}
|
|
74
74
|
return m;
|
|
75
75
|
}
|
|
76
|
-
function PickupMomentEditor({ index, value, canDelete, onChange, onDelete, }) {
|
|
76
|
+
function PickupMomentEditor({ index, value, canDelete, onChange, onDelete, showErrors, }) {
|
|
77
77
|
const update = (patch) => {
|
|
78
78
|
const next = { ...value, ...patch };
|
|
79
79
|
onChange(normalizeMoment(next, value));
|
|
80
80
|
};
|
|
81
81
|
const pickupInvalid = value.pickup_days > value.signup_days;
|
|
82
|
-
return (_jsxs("div", { className: "rounded-md border bg-background p-4 space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "text-sm font-semibold", children: ["Ophaalmoment ", index + 1] }), canDelete ? (_jsxs("button", { type: "button", onClick: onDelete, className: "text-xs text-muted-foreground hover:text-destructive inline-flex items-center gap-1", "aria-label": "Ophaalmoment verwijderen", children: [_jsx(Trash2, { className: "w-3.5 h-3.5" }), "Verwijderen"] })) : null] }), _jsxs("div", { className: "space-y-3", children: [_jsx(PickupMomentRow, { label: "Aanmelden", days: value.signup_days, time: value.signup_time, onDaysChange: (n) => update({ signup_days: n }), onTimeChange: (v) => update({ signup_time: v }) }), _jsx(PickupMomentRow, { label: "Ophalen", days: value.pickup_days, time: value.pickup_time, maxDays: value.signup_days, onDaysChange: (n) => update({ pickup_days: Math.min(n, value.signup_days) }), onTimeChange: (v) => update({ pickup_time: v }) }), pickupInvalid ? (_jsx("p", { className: "text-xs text-destructive -mt-1 pl-[122px]", children: "Ophalen kan niet v\u00F3\u00F3r aanmelden plaatsvinden." })) : null, _jsx(PickupMomentRow, { label: "Bezorgen", days: value.delivery_days, time: value.delivery_time, maxDays: value.pickup_days, onDaysChange: (n) => update({ delivery_days: Math.min(n, value.pickup_days) }), onTimeChange: (v) => update({ delivery_time: v }) })] })] }));
|
|
82
|
+
return (_jsxs("div", { className: "rounded-md border bg-background p-4 space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "text-sm font-semibold", children: ["Ophaalmoment ", index + 1] }), canDelete ? (_jsxs("button", { type: "button", onClick: onDelete, className: "text-xs text-muted-foreground hover:text-destructive inline-flex items-center gap-1", "aria-label": "Ophaalmoment verwijderen", children: [_jsx(Trash2, { className: "w-3.5 h-3.5" }), "Verwijderen"] })) : null] }), _jsxs("div", { className: "space-y-3", children: [_jsx(PickupMomentRow, { label: "Aanmelden", days: value.signup_days, time: value.signup_time, onDaysChange: (n) => update({ signup_days: n }), onTimeChange: (v) => update({ signup_time: v }), showError: showErrors }), _jsx(PickupMomentRow, { label: "Ophalen", days: value.pickup_days, time: value.pickup_time, maxDays: value.signup_days, onDaysChange: (n) => update({ pickup_days: Math.min(n, value.signup_days) }), onTimeChange: (v) => update({ pickup_time: v }), showError: showErrors }), pickupInvalid ? (_jsx("p", { className: "text-xs text-destructive -mt-1 pl-[122px]", children: "Ophalen kan niet v\u00F3\u00F3r aanmelden plaatsvinden." })) : null, _jsx(PickupMomentRow, { label: "Bezorgen", days: value.delivery_days, time: value.delivery_time, maxDays: value.pickup_days, onDaysChange: (n) => update({ delivery_days: Math.min(n, value.pickup_days) }), onTimeChange: (v) => update({ delivery_time: v }), showError: showErrors })] })] }));
|
|
83
83
|
}
|
|
84
84
|
export function VervoerderForm({ carrierId }) {
|
|
85
85
|
const isEdit = !!carrierId;
|
|
@@ -89,6 +89,7 @@ export function VervoerderForm({ carrierId }) {
|
|
|
89
89
|
const saveCarrier = useServerFn(upsertCarrier);
|
|
90
90
|
const [form, setForm] = useState(EMPTY);
|
|
91
91
|
const [rates, setRates] = useState([]);
|
|
92
|
+
const [showTimeErrors, setShowTimeErrors] = useState(false);
|
|
92
93
|
const [pendingCountry, setPendingCountry] = useState("");
|
|
93
94
|
const [pendingPrice, setPendingPrice] = useState("");
|
|
94
95
|
const { data, isLoading } = useQuery({
|
|
@@ -110,7 +111,7 @@ export function VervoerderForm({ carrierId }) {
|
|
|
110
111
|
is_default: c.is_default ?? false,
|
|
111
112
|
pickup_moments: c.pickup_moments && c.pickup_moments.length > 0
|
|
112
113
|
? c.pickup_moments
|
|
113
|
-
: [DEFAULT_PICKUP_MOMENT],
|
|
114
|
+
: [{ ...DEFAULT_PICKUP_MOMENT }],
|
|
114
115
|
service_countries: c.service_countries ?? [],
|
|
115
116
|
service_provinces: c.service_provinces ?? [],
|
|
116
117
|
service_cities: c.service_cities ?? [],
|
|
@@ -140,7 +141,7 @@ export function VervoerderForm({ carrierId }) {
|
|
|
140
141
|
},
|
|
141
142
|
onSuccess: async () => {
|
|
142
143
|
toast.success(isEdit ? "Vervoerder bijgewerkt" : "Vervoerder aangemaakt");
|
|
143
|
-
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
144
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning.js");
|
|
144
145
|
await invalidatePlanning(queryClient);
|
|
145
146
|
if (carrierId)
|
|
146
147
|
queryClient.invalidateQueries({ queryKey: ["carrier", carrierId] });
|
|
@@ -173,6 +174,12 @@ export function VervoerderForm({ carrierId }) {
|
|
|
173
174
|
toast.error("Bedrijfsnaam is verplicht");
|
|
174
175
|
return;
|
|
175
176
|
}
|
|
177
|
+
// Tijden zijn verplicht: er wordt nooit stil een tijd ingevuld.
|
|
178
|
+
if (form.pickup_moments.some((m) => !m.signup_time || !m.pickup_time || !m.delivery_time)) {
|
|
179
|
+
setShowTimeErrors(true);
|
|
180
|
+
toast.error("Vul bij elk ophaalmoment alle tijden in.");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
176
183
|
mutation.mutate();
|
|
177
184
|
};
|
|
178
185
|
if (isEdit && isLoading) {
|
|
@@ -180,7 +187,7 @@ export function VervoerderForm({ carrierId }) {
|
|
|
180
187
|
}
|
|
181
188
|
return (_jsxs("main", { className: "p-6 space-y-6 max-w-4xl", children: [_jsx(Button, { asChild: true, variant: "ghost", size: "sm", children: _jsxs(Link, { to: "/afhandeling/vervoerders", children: [_jsx(ArrowLeft, { className: "mr-2 h-4 w-4" }), "Terug naar vervoerders"] }) }), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(FieldIcon, { icon: Truck }), _jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold", children: isEdit ? "Vervoerder bewerken" : "Vervoerder aanmaken" }), _jsx("p", { className: "text-sm text-muted-foreground", children: isEdit
|
|
182
189
|
? "Wijzig de gegevens van de vervoerder."
|
|
183
|
-
: "Voeg een nieuwe vervoerder toe en stel verzendtarieven in." })] })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: "Algemene gegevens" }) }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs(Label, { children: ["Bedrijfsnaam ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(IconInput, { icon: Truck, value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }), placeholder: "Bijv. DHL Freight", required: true })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Contactpersoon" }), _jsx(IconInput, { icon: User, value: form.contact_person ?? "", onChange: (e) => setForm({ ...form, contact_person: e.target.value }) })] }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "E-mail" }), _jsx(IconInput, { icon: Mail, type: "email", value: form.email ?? "", onChange: (e) => setForm({ ...form, email: e.target.value }) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Telefoonnummer" }), _jsx(IconInput, { icon: Phone, value: form.phone ?? "", onChange: (e) => setForm({ ...form, phone: e.target.value }) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Adres" }), _jsx(IconInput, { icon: MapPin, value: form.address ?? "", onChange: (e) => setForm({ ...form, address: e.target.value }), placeholder: "Straat, postcode, plaats" })] }), _jsxs("div", { className: "rounded-md border bg-muted/30 p-4 space-y-4", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium", children: "Ophaalmomenten (transportplanning)" }), _jsxs("p", { className: "text-xs text-muted-foreground mt-1", children: ["De bezorgdag is ", _jsx("strong", { children: "dag 0" }), ". Per ophaalmoment stel je in op hoeveel werkdagen v\u00F3\u00F3r bezorging \u00E9n op welk tijdstip elke stap plaatsvindt. Bij een nieuwe order kiest het systeem automatisch het eerstvolgende moment waarvan de aanmelddeadline nog niet is verstreken."] })] }), _jsx("div", { className: "space-y-3", children: form.pickup_moments.map((moment, idx) => (_jsx(PickupMomentEditor, { index: idx, value: moment, canDelete: form.pickup_moments.length > 1, onChange: (next) => {
|
|
190
|
+
: "Voeg een nieuwe vervoerder toe en stel verzendtarieven in." })] })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(CardTitle, { className: "text-base", children: "Algemene gegevens" }) }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs(Label, { children: ["Bedrijfsnaam ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx(IconInput, { icon: Truck, value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }), placeholder: "Bijv. DHL Freight", required: true })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Contactpersoon" }), _jsx(IconInput, { icon: User, value: form.contact_person ?? "", onChange: (e) => setForm({ ...form, contact_person: e.target.value }) })] }), _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "E-mail" }), _jsx(IconInput, { icon: Mail, type: "email", value: form.email ?? "", onChange: (e) => setForm({ ...form, email: e.target.value }) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Telefoonnummer" }), _jsx(IconInput, { icon: Phone, value: form.phone ?? "", onChange: (e) => setForm({ ...form, phone: e.target.value }) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { children: "Adres" }), _jsx(IconInput, { icon: MapPin, value: form.address ?? "", onChange: (e) => setForm({ ...form, address: e.target.value }), placeholder: "Straat, postcode, plaats" })] }), _jsxs("div", { className: "rounded-md border bg-muted/30 p-4 space-y-4", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium", children: "Ophaalmomenten (transportplanning)" }), _jsxs("p", { className: "text-xs text-muted-foreground mt-1", children: ["De bezorgdag is ", _jsx("strong", { children: "dag 0" }), ". Per ophaalmoment stel je in op hoeveel werkdagen v\u00F3\u00F3r bezorging \u00E9n op welk tijdstip elke stap plaatsvindt. Bij een nieuwe order kiest het systeem automatisch het eerstvolgende moment waarvan de aanmelddeadline nog niet is verstreken."] })] }), _jsx("div", { className: "space-y-3", children: form.pickup_moments.map((moment, idx) => (_jsx(PickupMomentEditor, { showErrors: showTimeErrors, index: idx, value: moment, canDelete: form.pickup_moments.length > 1, onChange: (next) => {
|
|
184
191
|
const copy = [...form.pickup_moments];
|
|
185
192
|
copy[idx] = next;
|
|
186
193
|
setForm({ ...form, pickup_moments: copy });
|
|
@@ -2,15 +2,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogDescription, AlertDialogTitle, toast, } from "@flowselections/core";
|
|
4
4
|
import { Plus, Pencil, Trash2, Truck, ArrowUp, ArrowDown } from "lucide-react";
|
|
5
|
-
import { ResponsiveAlertDialogBody, ResponsiveAlertDialogContent, ResponsiveAlertDialogFooter, ResponsiveAlertDialogHeader, } from "
|
|
5
|
+
import { ResponsiveAlertDialogBody, ResponsiveAlertDialogContent, ResponsiveAlertDialogFooter, ResponsiveAlertDialogHeader, } from "../../components/ui/responsive-dialog.js";
|
|
6
6
|
import { Link } from "@tanstack/react-router";
|
|
7
7
|
import { useServerFn } from "@tanstack/react-start";
|
|
8
8
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
9
|
-
import { toServerFnError } from "../../lib/serverFnError";
|
|
10
|
-
import { listCarriers, deleteCarrier, reorderCarriers } from "../../lib/carriers.functions";
|
|
11
|
-
import { carrierLeadDaysFromMoments } from "../../lib/carrierPlanning";
|
|
12
|
-
import { VervoerderForm } from "./VervoerderForm";
|
|
13
|
-
import { resolveCarrierId } from "./VervoerderBewerkenPage";
|
|
9
|
+
import { toServerFnError } from "../../lib/serverFnError.js";
|
|
10
|
+
import { listCarriers, deleteCarrier, reorderCarriers } from "../../lib/carriers.functions.js";
|
|
11
|
+
import { carrierLeadDaysFromMoments } from "../../lib/carrierPlanning.js";
|
|
12
|
+
import { VervoerderForm } from "./VervoerderForm.js";
|
|
13
|
+
import { resolveCarrierId } from "./VervoerderBewerkenPage.js";
|
|
14
14
|
/**
|
|
15
15
|
* Bewerken gebeurt via een searchparam (?id=<uuid>) i.p.v. een dynamisch
|
|
16
16
|
* URL-segment, zodat het ook werkt in hosts/shells die alleen statische
|
|
@@ -44,7 +44,7 @@ function VervoerdersLijst() {
|
|
|
44
44
|
mutationFn: (id) => removeCarrier({ data: { id } }),
|
|
45
45
|
onSuccess: async () => {
|
|
46
46
|
toast.success("Vervoerder verwijderd");
|
|
47
|
-
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
47
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning.js");
|
|
48
48
|
await invalidatePlanning(queryClient);
|
|
49
49
|
setDeletingId(null);
|
|
50
50
|
},
|
|
@@ -53,7 +53,7 @@ function VervoerdersLijst() {
|
|
|
53
53
|
const reorderMutation = useMutation({
|
|
54
54
|
mutationFn: (orderedIds) => reorder({ data: { orderedIds } }),
|
|
55
55
|
onSuccess: async () => {
|
|
56
|
-
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
56
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning.js");
|
|
57
57
|
await invalidatePlanning(queryClient);
|
|
58
58
|
},
|
|
59
59
|
onError: (err) => toast.error(err.message),
|
|
@@ -3,13 +3,13 @@ import { useEffect, useMemo, useState } from "react";
|
|
|
3
3
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useServerFn } from "@tanstack/react-start";
|
|
5
5
|
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Badge, Button, Dialog, DialogTitle, DialogDescription, Input, Label, Textarea, toast, } from "@flowselections/core";
|
|
6
|
-
import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "
|
|
7
|
-
import { applyReschedule, listRescheduleHistory, previewReschedule, getPickMoments, setPickDay, } from "../../lib/logisticsEngine/reschedule";
|
|
8
|
-
import { ENGINE_TASKS_KEY } from "../../hooks/useEngineTasks";
|
|
9
|
-
import { listCarriers } from "../../lib/carriers.functions";
|
|
10
|
-
import { normalizePickupMoments, selectCarrierForTarget } from "../../lib/carrierPlanning";
|
|
11
|
-
import { safeServerCall } from "../../lib/serverFnError";
|
|
12
|
-
import { amsterdamDay, formatAmsterdam } from "../../lib/timezone";
|
|
6
|
+
import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../../components/ui/responsive-dialog.js";
|
|
7
|
+
import { applyReschedule, listRescheduleHistory, previewReschedule, getPickMoments, setPickDay, } from "../../lib/logisticsEngine/reschedule.js";
|
|
8
|
+
import { ENGINE_TASKS_KEY } from "../../hooks/useEngineTasks.js";
|
|
9
|
+
import { listCarriers } from "../../lib/carriers.functions.js";
|
|
10
|
+
import { normalizePickupMoments, selectCarrierForTarget } from "../../lib/carrierPlanning.js";
|
|
11
|
+
import { safeServerCall } from "../../lib/serverFnError.js";
|
|
12
|
+
import { amsterdamDay, formatAmsterdam } from "../../lib/timezone.js";
|
|
13
13
|
function fmtDateTime(v) {
|
|
14
14
|
if (!v)
|
|
15
15
|
return "—";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FloridayOrder } from "../../lib/floriday.functions";
|
|
2
|
-
import type { PlannedOrder } from "../../hooks/useOrderPlanning";
|
|
1
|
+
import type { FloridayOrder } from "../../lib/floriday.functions.js";
|
|
2
|
+
import type { PlannedOrder } from "../../hooks/useOrderPlanning.js";
|
|
3
3
|
export type WeekAgendaMode = "delivery" | "pickup" | "transport-register" | "pick";
|
|
4
4
|
export interface WeekAgendaViewProps {
|
|
5
5
|
planned: PlannedOrder[];
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
|
-
import { supabase } from "../../integrations/supabase/moduleClient";
|
|
5
|
-
import { isExcludedOrderStatus, normalizeOrderStatus } from "../../lib/orderStatus";
|
|
4
|
+
import { supabase } from "../../integrations/supabase/moduleClient.js";
|
|
5
|
+
import { isExcludedOrderStatus, normalizeOrderStatus } from "../../lib/orderStatus.js";
|
|
6
6
|
import { Button, Badge } from "@flowselections/core";
|
|
7
7
|
import { ChevronLeft, ChevronRight, Package, Truck, Sprout, Clock, CheckCircle2, Scale } from "lucide-react";
|
|
8
|
-
import { isSameDay, startOfWeek, addDays } from "../../lib/pickDate";
|
|
9
|
-
import { useCapacityCheck } from "../../hooks/useCapacityCheck";
|
|
10
|
-
import { usePickAgenda } from "../../hooks/usePickAgenda";
|
|
11
|
-
import { useConsistencyCheck } from "../../hooks/useConsistencyCheck";
|
|
12
|
-
import { CapacityWarning } from "./CapacityWarning";
|
|
13
|
-
import { SignupMailMoments } from "./SignupMailMoments";
|
|
14
|
-
import { toDayKey } from "../../lib/logisticsEngine/capacity";
|
|
8
|
+
import { isSameDay, startOfWeek, addDays } from "../../lib/pickDate.js";
|
|
9
|
+
import { useCapacityCheck } from "../../hooks/useCapacityCheck.js";
|
|
10
|
+
import { usePickAgenda } from "../../hooks/usePickAgenda.js";
|
|
11
|
+
import { useConsistencyCheck } from "../../hooks/useConsistencyCheck.js";
|
|
12
|
+
import { CapacityWarning } from "./CapacityWarning.js";
|
|
13
|
+
import { SignupMailMoments } from "./SignupMailMoments.js";
|
|
14
|
+
import { toDayKey } from "../../lib/logisticsEngine/capacity.js";
|
|
15
15
|
const SHIPPED = new Set(["verzonden", "gereed voor facturatie", "gefactureerd", "geleverd", "afgeleverd", "afgerond", "afgehandeld", "afgemeld", "shipped", "delivered", "completed", "invoiced"]);
|
|
16
16
|
/** Eén indeling per order. Floriday herkend op Floriday-id; afmeldstand uit de order. */
|
|
17
17
|
function classify(o, scanned) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/** Leest de ingestelde werkplek client-side (SSR-veilig). */
|
|
2
|
-
export declare function useWerkplek(): string | null;
|
|
3
|
-
/**
|
|
4
|
-
* Eén melding bovenaan een printscherm zolang er geen werkplek is ingesteld.
|
|
5
|
-
* Printknoppen zijn dan uitgeschakeld, zodat er geen fout per printactie komt.
|
|
6
|
-
*/
|
|
7
|
-
export declare function WerkplekWaarschuwing({ werkplek }: {
|
|
8
|
-
werkplek: string | null;
|
|
9
|
-
}): import("react").JSX.Element | null;
|
|
1
|
+
/** Leest de ingestelde werkplek client-side (SSR-veilig). */
|
|
2
|
+
export declare function useWerkplek(): string | null;
|
|
3
|
+
/**
|
|
4
|
+
* Eén melding bovenaan een printscherm zolang er geen werkplek is ingesteld.
|
|
5
|
+
* Printknoppen zijn dan uitgeschakeld, zodat er geen fout per printactie komt.
|
|
6
|
+
*/
|
|
7
|
+
export declare function WerkplekWaarschuwing({ werkplek }: {
|
|
8
|
+
werkplek: string | null;
|
|
9
|
+
}): import("react").JSX.Element | null;
|
|
10
10
|
//# sourceMappingURL=WerkplekWaarschuwing.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
3
|
import { AlertTriangle } from "lucide-react";
|
|
4
|
-
import { getWerkplek } from "../../lib/printing";
|
|
4
|
+
import { getWerkplek } from "../../lib/printing.js";
|
|
5
5
|
/** Leest de ingestelde werkplek client-side (SSR-veilig). */
|
|
6
6
|
export function useWerkplek() {
|
|
7
7
|
const [werkplek, setWerkplekState] = useState(null);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { PickstationOrder } from "../../lib/pickstationTypes";
|
|
2
|
-
import { type PickstationLang } from "../../lib/pickstationI18n";
|
|
1
|
+
import type { PickstationOrder } from "../../lib/pickstationTypes.js";
|
|
2
|
+
import { type PickstationLang } from "../../lib/pickstationI18n.js";
|
|
3
3
|
/** Returns a fully self-contained printable HTML document for one packing slip per cart. */
|
|
4
4
|
export declare function renderPakbonHtml(order: {
|
|
5
5
|
id: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getPrintDict, PICKSTATION_LOCALE, } from "../../lib/pickstationI18n";
|
|
1
|
+
import { getPrintDict, PICKSTATION_LOCALE, } from "../../lib/pickstationI18n.js";
|
|
2
2
|
/** Returns a fully self-contained printable HTML document for one packing slip per cart. */
|
|
3
3
|
export function renderPakbonHtml(order, lang = "nl") {
|
|
4
4
|
const t = getPrintDict(lang);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Dunne wrappers rond de centrale printlaag. De verborgen iframes zijn
|
|
2
2
|
// verwijderd: alles gaat via de printwachtrij van de Layout maker.
|
|
3
|
-
import { printHtmlDocument, printPdfDocument, } from "../../lib/printing";
|
|
3
|
+
import { printHtmlDocument, printPdfDocument, } from "../../lib/printing.js";
|
|
4
4
|
export async function printHtml(html, opties) {
|
|
5
5
|
await printHtmlDocument({ ...opties, html });
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AfhandelingSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AfhandelingSettingsCard.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"AfhandelingSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/AfhandelingSettingsCard.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,uBAAuB,gCAiKtC"}
|
|
@@ -4,9 +4,9 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
4
4
|
import { useServerFn } from "@tanstack/react-start";
|
|
5
5
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, toast, } from "@flowselections/core";
|
|
6
6
|
import { CalendarClock, Mail } from "lucide-react";
|
|
7
|
-
import { getAfhandelingSettings, updateAfhandelingSettings, } from "../../lib/afhandelingSettings.functions";
|
|
8
|
-
import { getSignupCronStatus } from "../../lib/carrierSignup.functions";
|
|
9
|
-
import { fmtTime, signupReasonText } from "../../lib/signupMailText";
|
|
7
|
+
import { getAfhandelingSettings, updateAfhandelingSettings, } from "../../lib/afhandelingSettings.functions.js";
|
|
8
|
+
import { getSignupCronStatus } from "../../lib/carrierSignup.functions.js";
|
|
9
|
+
import { fmtTime, signupReasonText } from "../../lib/signupMailText.js";
|
|
10
10
|
export function AfhandelingSettingsCard() {
|
|
11
11
|
const qc = useQueryClient();
|
|
12
12
|
const fetchSettings = useServerFn(getAfhandelingSettings);
|
|
@@ -55,7 +55,7 @@ export function AfhandelingSettingsCard() {
|
|
|
55
55
|
},
|
|
56
56
|
}),
|
|
57
57
|
onSuccess: async () => {
|
|
58
|
-
const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
|
|
58
|
+
const { invalidatePlanning } = await import("../../lib/invalidatePlanning.js");
|
|
59
59
|
await invalidatePlanning(qc);
|
|
60
60
|
try {
|
|
61
61
|
const st = await fetchCronStatus({ data: { sync: true } });
|
|
@@ -79,7 +79,7 @@ export function AfhandelingSettingsCard() {
|
|
|
79
79
|
toast.error(e instanceof Error ? e.message : "Opslaan mislukt");
|
|
80
80
|
},
|
|
81
81
|
});
|
|
82
|
-
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 planning. 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))) })] }),
|
|
82
|
+
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 planning. 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))) })] }), _jsx("div", { className: "space-y-1 text-sm", children: _jsxs("div", { children: [_jsx("strong", { children: "Verzendadres:" }), " ", cron.data?.senderEmail ? cron.data.senderEmail : _jsx("span", { className: "text-muted-foreground", children: "nog geen verbonden adres" }), " ", _jsx("span", { className: "text-xs text-muted-foreground", children: "(instellen bij E-mailkoppeling)" })] }) }), _jsxs("details", { className: "text-xs text-muted-foreground", children: [_jsx("summary", { className: "cursor-pointer", children: "Details voor beheer" }), _jsxs("div", { className: "mt-2 space-y-2", children: [_jsx(Label, { htmlFor: "mailPurpose", children: "Doeleinde in E-mailkoppeling" }), _jsx(Input, { id: "mailPurpose", value: mailPurpose, disabled: !mailEnabled, onChange: (e) => setMailPurpose(e.target.value) }), _jsxs("p", { children: ["Standaard: ", _jsx("code", { children: "afhandeling_carrier_signup" }), "."] })] })] })] }), _jsx(SignupStatusBlock, { status: cron.data ?? null, loading: cron.isLoading, failed: cron.isError }), _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" })] })] }));
|
|
83
83
|
}
|
|
84
84
|
function SignupStatusBlock({ status, loading, failed, }) {
|
|
85
85
|
if (loading)
|
|
@@ -4,8 +4,8 @@ import { Building2, Truck, ArrowRight } from "lucide-react";
|
|
|
4
4
|
import { Link } from "@tanstack/react-router";
|
|
5
5
|
import { useServerFn } from "@tanstack/react-start";
|
|
6
6
|
import { useQuery } from "@tanstack/react-query";
|
|
7
|
-
import { toServerFnError } from "../../lib/serverFnError";
|
|
8
|
-
import { listCarriers } from "../../lib/carriers.functions";
|
|
7
|
+
import { toServerFnError } from "../../lib/serverFnError.js";
|
|
8
|
+
import { listCarriers } from "../../lib/carriers.functions.js";
|
|
9
9
|
export function VervoerdersSettingsCard() {
|
|
10
10
|
const fetchList = useServerFn(listCarriers);
|
|
11
11
|
const { data, isLoading } = useQuery({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CapacityDay } from "../lib/logisticsEngine/capacity";
|
|
1
|
+
import { type CapacityDay } from "../lib/logisticsEngine/capacity.js";
|
|
2
2
|
/**
|
|
3
3
|
* Capaciteitscontrole van de Logistics Engine voor een periode.
|
|
4
4
|
* Wordt opnieuw opgehaald bij elke periodewissel (from/to zitten in de queryKey).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { getCapacityDays } from "../lib/logisticsEngine/capacity";
|
|
2
|
+
import { getCapacityDays } from "../lib/logisticsEngine/capacity.js";
|
|
3
3
|
/**
|
|
4
4
|
* Capaciteitscontrole van de Logistics Engine voor een periode.
|
|
5
5
|
* Wordt opnieuw opgehaald bij elke periodewissel (from/to zitten in de queryKey).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useCallback, useMemo } from "react";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
|
-
import { supabase } from "../integrations/supabase/moduleClient";
|
|
4
|
-
import { useKnownOrders } from "./useKnownOrders";
|
|
3
|
+
import { supabase } from "../integrations/supabase/moduleClient.js";
|
|
4
|
+
import { useKnownOrders } from "./useKnownOrders.js";
|
|
5
5
|
/**
|
|
6
6
|
* Gedeelde karindex van de Engine. Dit is de enige bron voor karrentellingen:
|
|
7
7
|
* taak-payloads (cartCount) en eigen tellingen op order_carts zijn niet meer
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { supabase } from "../integrations/supabase/moduleClient";
|
|
2
|
+
import { supabase } from "../integrations/supabase/moduleClient.js";
|
|
3
3
|
/**
|
|
4
4
|
* Controle van de Engine, elke 2 minuten opnieuw opgevraagd. Deze module corrigeert niets
|
|
5
5
|
* zelf: bij een afwijking tonen we alleen een discrete melding.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEffect } from "react";
|
|
2
2
|
import { useQueryClient } from "@tanstack/react-query";
|
|
3
|
-
import { debounce, subscribeTable } from "../lib/realtimeBus";
|
|
3
|
+
import { debounce, subscribeTable } from "../lib/realtimeBus.js";
|
|
4
4
|
/** Seintjes van de Engine die de indeling van buffers en karren wijzigen. */
|
|
5
5
|
const BUFFER_EVENTS = new Set(["buffer.closed", "buffer.order_detached"]);
|
|
6
6
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useMemo } from "react";
|
|
2
2
|
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
|
-
import { listEngineTasks } from "../lib/logisticsEngine/engine";
|
|
4
|
-
import { debounce, subscribeTable } from "../lib/realtimeBus";
|
|
3
|
+
import { listEngineTasks } from "../lib/logisticsEngine/engine.js";
|
|
4
|
+
import { debounce, subscribeTable } from "../lib/realtimeBus.js";
|
|
5
5
|
export const ENGINE_TASKS_KEY = ["engine", "tasks"];
|
|
6
6
|
const OPEN_STATUSES = ["planned", "ready", "in_progress"];
|
|
7
7
|
export function useEngineTasks(options) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useCallback, useMemo } from "react";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { useServerFn } from "@tanstack/react-start";
|
|
4
|
-
import { listKnownOrders } from "../lib/floriday.functions";
|
|
5
|
-
import { normalizeOrderNumber } from "../lib/orderRefs";
|
|
6
|
-
import { isFulfilledOrderStatus } from "../lib/orderStatus";
|
|
7
|
-
import { callServerFn } from "../lib/serverFnError";
|
|
4
|
+
import { listKnownOrders } from "../lib/floriday.functions.js";
|
|
5
|
+
import { normalizeOrderNumber } from "../lib/orderRefs.js";
|
|
6
|
+
import { isFulfilledOrderStatus } from "../lib/orderStatus.js";
|
|
7
|
+
import { callServerFn } from "../lib/serverFnError.js";
|
|
8
8
|
function keyOf(value) {
|
|
9
9
|
if (!value)
|
|
10
10
|
return null;
|
|
@@ -15,9 +15,9 @@ export declare function useOrderBuffers(orderRefs: string[]): {
|
|
|
15
15
|
isLoading: boolean;
|
|
16
16
|
};
|
|
17
17
|
/** Alle orders van één buffer (koppeling op buffer-id), ook van andere dagen. */
|
|
18
|
-
export declare function useBufferMembers(bufferId: string | null): import("@tanstack/react-query").UseQueryResult<{
|
|
18
|
+
export declare function useBufferMembers(bufferId: string | null): import("@tanstack/react-query").UseQueryResult<NoInfer<{
|
|
19
19
|
id: string;
|
|
20
20
|
orderNumber: string;
|
|
21
21
|
status: string | null;
|
|
22
|
-
}[]
|
|
22
|
+
}[]>, Error>;
|
|
23
23
|
//# sourceMappingURL=useOrderBuffers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrderBuffers.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderBuffers.ts"],"names":[],"mappings":"AAIA,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE;;qBA2C9B,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,eAAe,GAAG,IAAI;;EAItE;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;QAMnB,MAAM;iBAAe,MAAM;YAAU,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"useOrderBuffers.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderBuffers.ts"],"names":[],"mappings":"AAIA,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE;;qBA2C9B,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,eAAe,GAAG,IAAI;;EAItE;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;QAMnB,MAAM;iBAAe,MAAM;YAAU,MAAM,GAAG,IAAI;aAYtF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
|
-
import { supabase } from "../integrations/supabase/moduleClient";
|
|
3
|
+
import { supabase } from "../integrations/supabase/moduleClient.js";
|
|
4
4
|
function normalize(ref) {
|
|
5
5
|
return (ref ?? "").trim().toUpperCase();
|
|
6
6
|
}
|
|
@@ -6,7 +6,7 @@ export interface StickerMelding {
|
|
|
6
6
|
sinds: string | null;
|
|
7
7
|
}
|
|
8
8
|
/** Actuele stickermeldingen van de Engine; null = leesfout (stickercontrole onbekend). */
|
|
9
|
-
export declare function useStickerMeldingen(orderId: string | null | undefined): import("@tanstack/react-query").UseQueryResult<StickerMelding[] | null
|
|
9
|
+
export declare function useStickerMeldingen(orderId: string | null | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<StickerMelding[] | null>, Error>;
|
|
10
10
|
/** Archiefstatus uit de Engine; null = onbekend (leesfout). */
|
|
11
11
|
export declare function useOrderArchived(orderId: string | null | undefined): import("@tanstack/react-query").UseQueryResult<boolean | null, Error>;
|
|
12
12
|
//# sourceMappingURL=useOrderMeldingen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOrderMeldingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderMeldingen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAID,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"useOrderMeldingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderMeldingen.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAID,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,2FAmBrE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,yEAUlE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useQuery } from "@tanstack/react-query";
|
|
2
|
-
import { supabase } from "../integrations/supabase/moduleClient";
|
|
2
|
+
import { supabase } from "../integrations/supabase/moduleClient.js";
|
|
3
3
|
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
4
4
|
/** Actuele stickermeldingen van de Engine; null = leesfout (stickercontrole onbekend). */
|
|
5
5
|
export function useStickerMeldingen(orderId) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useCallback, useMemo } from "react";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { useServerFn } from "@tanstack/react-start";
|
|
4
|
-
import { listOrderPickDates } from "../lib/pickDates.functions";
|
|
5
|
-
import { normalizeOrderNumber } from "../lib/orderRefs";
|
|
6
|
-
import { callServerFn } from "../lib/serverFnError";
|
|
4
|
+
import { listOrderPickDates } from "../lib/pickDates.functions.js";
|
|
5
|
+
import { normalizeOrderNumber } from "../lib/orderRefs.js";
|
|
6
|
+
import { callServerFn } from "../lib/serverFnError.js";
|
|
7
7
|
function keyOf(value) {
|
|
8
8
|
if (!value)
|
|
9
9
|
return null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FloridayOrder } from "../lib/floriday.functions";
|
|
2
|
-
import { type OrderPlanning } from "../lib/planning";
|
|
3
|
-
import { type EngineTask } from "../lib/logisticsEngine/engine";
|
|
1
|
+
import type { FloridayOrder } from "../lib/floriday.functions.js";
|
|
2
|
+
import { type OrderPlanning } from "../lib/planning.js";
|
|
3
|
+
import { type EngineTask } from "../lib/logisticsEngine/engine.js";
|
|
4
4
|
/**
|
|
5
5
|
* Waarom een order (nog) geen planning in deze week heeft. Bewust gesplitst:
|
|
6
6
|
* "geen indeling" vraagt om melden bij de Engine, "buiten deze week" om niets,
|
|
@@ -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;AAK/D,OAAO,
|
|
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,EAEL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AActG;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,iBAAiB,GACjB,gBAAgB,GAChB,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,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,CAkUxF"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { useEffect, useMemo, useState } from "react";
|
|
2
2
|
import { useQuery } from "@tanstack/react-query";
|
|
3
3
|
import { useServerFn } from "@tanstack/react-start";
|
|
4
|
-
import { getFloridayOrders } from "../lib/floriday.functions";
|
|
5
|
-
import { listCarriers } from "../lib/carriers.functions";
|
|
6
|
-
import { safeServerCall } from "../lib/serverFnError";
|
|
7
|
-
import { normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget } from "../lib/carrierPlanning";
|
|
8
|
-
import { calculateOrderPlanning,
|
|
9
|
-
import { useEngineTasks } from "./useEngineTasks";
|
|
10
|
-
import { useCartIndex } from "./useCartIndex";
|
|
11
|
-
import { emitEngineEvent, listComposeTaskRefs } from "../lib/logisticsEngine/engine";
|
|
12
|
-
import { orderRefsFor } from "../lib/orderRefs";
|
|
13
|
-
import { isOpenOrderStatus } from "../lib/orderStatus";
|
|
14
|
-
import {
|
|
4
|
+
import { getFloridayOrders } from "../lib/floriday.functions.js";
|
|
5
|
+
import { listCarriers } from "../lib/carriers.functions.js";
|
|
6
|
+
import { safeServerCall } from "../lib/serverFnError.js";
|
|
7
|
+
import { normalizePickupMoments, sanitizeWeekdays, selectCarrierForTarget } from "../lib/carrierPlanning.js";
|
|
8
|
+
import { calculateOrderPlanning, } from "../lib/planning.js";
|
|
9
|
+
import { useEngineTasks } from "./useEngineTasks.js";
|
|
10
|
+
import { useCartIndex } from "./useCartIndex.js";
|
|
11
|
+
import { emitEngineEvent, listComposeTaskRefs } from "../lib/logisticsEngine/engine.js";
|
|
12
|
+
import { orderRefsFor } from "../lib/orderRefs.js";
|
|
13
|
+
import { isOpenOrderStatus } from "../lib/orderStatus.js";
|
|
14
|
+
import { loadPickWorkdays } from "../lib/pickWorkdays.js";
|
|
15
|
+
import { supabase as moduleSupabase } from "../integrations/supabase/moduleClient.js";
|
|
16
|
+
import { emitQueueStatus, markInFlight, markResult, resetEmitQueue, selectEmitBatch, } from "../lib/logisticsEngine/emitQueue.js";
|
|
15
17
|
export function useOrderPlanning(range) {
|
|
16
18
|
const from = range?.from ?? null;
|
|
17
19
|
const to = range?.to ?? null;
|
|
@@ -57,6 +59,15 @@ export function useOrderPlanning(range) {
|
|
|
57
59
|
refetchIntervalInBackground: false,
|
|
58
60
|
refetchOnWindowFocus: true,
|
|
59
61
|
});
|
|
62
|
+
// Werkdagen komen uitsluitend uit de Werktijden; zonder die kalender plannen we niet.
|
|
63
|
+
const workdaysQuery = useQuery({
|
|
64
|
+
queryKey: ["afhandeling", "pick-workdays"],
|
|
65
|
+
queryFn: () => loadPickWorkdays(moduleSupabase),
|
|
66
|
+
retry: 1,
|
|
67
|
+
staleTime: 5 * 60000,
|
|
68
|
+
refetchInterval: 10 * 60000,
|
|
69
|
+
refetchIntervalInBackground: false,
|
|
70
|
+
});
|
|
60
71
|
const carriersQuery = useQuery({
|
|
61
72
|
queryKey: ["carriers"],
|
|
62
73
|
queryFn: () => safeServerCall(() => fetchCarriers(), { carriers: [] }, "listCarriers"),
|
|
@@ -122,7 +133,7 @@ export function useOrderPlanning(range) {
|
|
|
122
133
|
});
|
|
123
134
|
const moments = carrier
|
|
124
135
|
? normalizePickupMoments(carrier.pickup_moments)
|
|
125
|
-
: [
|
|
136
|
+
: [];
|
|
126
137
|
// Transport-/leverdata blijven uit de vervoerdersagenda komen; het
|
|
127
138
|
// pickmoment en de karindeling komen uitsluitend uit de Engine-taak.
|
|
128
139
|
const base = calculateOrderPlanning(order.deliveryDate, {
|
|
@@ -188,7 +199,8 @@ export function useOrderPlanning(range) {
|
|
|
188
199
|
};
|
|
189
200
|
return { order, planning, engineTask: task, awaitingEngine: false, state: "planned", hasComposeTask: true };
|
|
190
201
|
});
|
|
191
|
-
|
|
202
|
+
// workdaysQuery.data: herberekenen zodra de werkdagkalender (opnieuw) geladen is.
|
|
203
|
+
}, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists, cartsForOrder, workdaysQuery.data]);
|
|
192
204
|
// Alleen echt open orders mogen bij de Logistics Engine worden aangemeld;
|
|
193
205
|
// afgehandelde orders blijven wel zichtbaar maar krijgen geen melding meer.
|
|
194
206
|
const openPlanned = useMemo(() => planned.filter((p) => isOpenOrderStatus(p.order.status)), [planned]);
|
|
@@ -285,12 +297,15 @@ export function useOrderPlanning(range) {
|
|
|
285
297
|
tasksWithoutStart: openPlanned.filter((p) => p.state === "task_without_start"),
|
|
286
298
|
signalError,
|
|
287
299
|
lastEngineRun,
|
|
288
|
-
isLoading: ordersQuery.isLoading || carriersQuery.isLoading || tasksLoading,
|
|
300
|
+
isLoading: ordersQuery.isLoading || carriersQuery.isLoading || tasksLoading || workdaysQuery.isLoading,
|
|
289
301
|
error: ordersQuery.data?.orders?.length ? undefined : ordersQuery.data?.error,
|
|
290
|
-
warning:
|
|
302
|
+
warning: workdaysQuery.isError || (workdaysQuery.data && !workdaysQuery.data.available) || workdaysQuery.data?.count === 0
|
|
303
|
+
? "De werkdagen uit Werktijden zijn niet beschikbaar. Ophaal- en aanmelddagen worden pas getoond als de werkdagen zijn ingesteld."
|
|
304
|
+
: ordersQuery.data?.orders?.length ? ordersQuery.data?.error : undefined,
|
|
291
305
|
refetch: () => {
|
|
292
306
|
void ordersQuery.refetch();
|
|
293
307
|
void carriersQuery.refetch();
|
|
308
|
+
void workdaysQuery.refetch();
|
|
294
309
|
refetchTasks();
|
|
295
310
|
},
|
|
296
311
|
};
|