@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.
Files changed (129) hide show
  1. package/dist-lib/components/afhandeling/AutoProcessStatus.js +3 -3
  2. package/dist-lib/components/afhandeling/AutoSendStatus.js +1 -1
  3. package/dist-lib/components/afhandeling/CapacityWarning.d.ts +1 -1
  4. package/dist-lib/components/afhandeling/CapacityWarning.js +1 -1
  5. package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +2 -2
  6. package/dist-lib/components/afhandeling/ControleLijstPrint.js +2 -2
  7. package/dist-lib/components/afhandeling/ControlePage.js +6 -6
  8. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +5 -1
  9. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  10. package/dist-lib/components/afhandeling/DagDetailDialog.js +83 -31
  11. package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
  12. package/dist-lib/components/afhandeling/LeveringenPage.js +28 -6
  13. package/dist-lib/components/afhandeling/NieuweVervoerderPage.js +1 -1
  14. package/dist-lib/components/afhandeling/NuVersturenButton.js +1 -1
  15. package/dist-lib/components/afhandeling/PickAgendaView.d.ts +1 -1
  16. package/dist-lib/components/afhandeling/PickAgendaView.js +5 -5
  17. package/dist-lib/components/afhandeling/PickingPage.js +1 -1
  18. package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts +1 -1
  19. package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
  20. package/dist-lib/components/afhandeling/ServiceAreaSelect.js +1 -1
  21. package/dist-lib/components/afhandeling/SignupMailMoments.js +12 -7
  22. package/dist-lib/components/afhandeling/VervoerderBewerkenPage.js +1 -1
  23. package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
  24. package/dist-lib/components/afhandeling/VervoerderForm.js +20 -13
  25. package/dist-lib/components/afhandeling/VervoerdersPage.js +8 -8
  26. package/dist-lib/components/afhandeling/VerzetOrderDialog.js +7 -7
  27. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -2
  28. package/dist-lib/components/afhandeling/WeekAgendaView.js +9 -9
  29. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
  30. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +1 -1
  31. package/dist-lib/components/pickstation/PakbonTemplate.d.ts +2 -2
  32. package/dist-lib/components/pickstation/PakbonTemplate.js +1 -1
  33. package/dist-lib/components/pickstation/printDocuments.d.ts +1 -1
  34. package/dist-lib/components/pickstation/printDocuments.js +1 -1
  35. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
  36. package/dist-lib/components/settings/AfhandelingSettingsCard.js +5 -5
  37. package/dist-lib/components/settings/VervoerdersSettingsCard.js +2 -2
  38. package/dist-lib/hooks/useCapacityCheck.d.ts +1 -1
  39. package/dist-lib/hooks/useCapacityCheck.js +1 -1
  40. package/dist-lib/hooks/useCartIndex.js +2 -2
  41. package/dist-lib/hooks/useConsistencyCheck.js +1 -1
  42. package/dist-lib/hooks/useEngineBufferEvents.js +1 -1
  43. package/dist-lib/hooks/useEngineTasks.d.ts +1 -1
  44. package/dist-lib/hooks/useEngineTasks.js +2 -2
  45. package/dist-lib/hooks/useKnownOrders.js +4 -4
  46. package/dist-lib/hooks/useOrderBuffers.d.ts +2 -2
  47. package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
  48. package/dist-lib/hooks/useOrderBuffers.js +1 -1
  49. package/dist-lib/hooks/useOrderMeldingen.d.ts +1 -1
  50. package/dist-lib/hooks/useOrderMeldingen.d.ts.map +1 -1
  51. package/dist-lib/hooks/useOrderMeldingen.js +1 -1
  52. package/dist-lib/hooks/useOrderPickDates.js +3 -3
  53. package/dist-lib/hooks/useOrderPlanning.d.ts +3 -3
  54. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  55. package/dist-lib/hooks/useOrderPlanning.js +30 -15
  56. package/dist-lib/hooks/usePickAgenda.js +4 -4
  57. package/dist-lib/hooks/usePickMode.d.ts +3 -3
  58. package/dist-lib/hooks/usePickMode.js +1 -1
  59. package/dist-lib/index.d.ts +16 -16
  60. package/dist-lib/index.js +16 -16
  61. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
  62. package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
  63. package/dist-lib/integrations/supabase/client.server.js +1 -1
  64. package/dist-lib/integrations/supabase/moduleClient.d.ts +1 -1
  65. package/dist-lib/integrations/supabase/types.d.ts +502 -0
  66. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  67. package/dist-lib/lib/afhandelingSettings.functions.d.ts +2 -2
  68. package/dist-lib/lib/afhandelingSettings.functions.js +1 -1
  69. package/dist-lib/lib/agendaRange.js +1 -1
  70. package/dist-lib/lib/authGateway.server.js +2 -2
  71. package/dist-lib/lib/carrierMatch.server.js +1 -1
  72. package/dist-lib/lib/carrierPlanning.d.ts +5 -1
  73. package/dist-lib/lib/carrierPlanning.d.ts.map +1 -1
  74. package/dist-lib/lib/carrierPlanning.js +16 -10
  75. package/dist-lib/lib/carrierSignup.functions.d.ts +12 -4
  76. package/dist-lib/lib/carrierSignup.functions.d.ts.map +1 -1
  77. package/dist-lib/lib/carrierSignup.functions.js +4 -2
  78. package/dist-lib/lib/carriers.functions.d.ts +7 -7
  79. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  80. package/dist-lib/lib/carriers.functions.js +15 -8
  81. package/dist-lib/lib/cartAssignments.functions.d.ts +8 -8
  82. package/dist-lib/lib/cartAssignments.functions.js +1 -1
  83. package/dist-lib/lib/cartControl.functions.d.ts +11 -11
  84. package/dist-lib/lib/cartControl.functions.js +2 -2
  85. package/dist-lib/lib/cartMoveImpact.d.ts +1 -1
  86. package/dist-lib/lib/cartMoveImpact.js +1 -1
  87. package/dist-lib/lib/cartRescheduling.js +1 -1
  88. package/dist-lib/lib/deliveryNote.functions.d.ts +1 -1
  89. package/dist-lib/lib/deliveryNote.functions.js +2 -2
  90. package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
  91. package/dist-lib/lib/deliveryNotePrint.js +3 -3
  92. package/dist-lib/lib/engineLayouts.functions.d.ts +1 -1
  93. package/dist-lib/lib/engineLayouts.functions.js +1 -1
  94. package/dist-lib/lib/floriday.functions.d.ts +2 -2
  95. package/dist-lib/lib/floriday.functions.js +2 -2
  96. package/dist-lib/lib/floridayAutoProcess.js +2 -2
  97. package/dist-lib/lib/floridayFulfillmentSend.server.js +3 -3
  98. package/dist-lib/lib/floridayLoading.functions.d.ts +2 -2
  99. package/dist-lib/lib/floridayLoading.functions.js +3 -3
  100. package/dist-lib/lib/gatewayBase.server.js +1 -1
  101. package/dist-lib/lib/invalidatePlanning.js +1 -1
  102. package/dist-lib/lib/logisticsEngine/engine.js +1 -1
  103. package/dist-lib/lib/logisticsEngine/reschedule.js +2 -2
  104. package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
  105. package/dist-lib/lib/orderFulfilment.functions.d.ts +1 -1
  106. package/dist-lib/lib/orderFulfilment.functions.js +1 -1
  107. package/dist-lib/lib/pickDates.functions.d.ts +1 -1
  108. package/dist-lib/lib/pickDates.functions.js +2 -2
  109. package/dist-lib/lib/pickMode.js +1 -1
  110. package/dist-lib/lib/pickWorkdays.d.ts +24 -0
  111. package/dist-lib/lib/pickWorkdays.d.ts.map +1 -0
  112. package/dist-lib/lib/pickWorkdays.js +30 -0
  113. package/dist-lib/lib/pickstationOrders.server.d.ts +2 -2
  114. package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
  115. package/dist-lib/lib/pickstationOrders.server.js +11 -5
  116. package/dist-lib/lib/planning.d.ts +19 -0
  117. package/dist-lib/lib/planning.d.ts.map +1 -1
  118. package/dist-lib/lib/planning.js +58 -11
  119. package/dist-lib/lib/realtimeBus.js +1 -1
  120. package/dist-lib/lib/serverRoutes/autoSend.handler.js +3 -3
  121. package/dist-lib/lib/serverRoutes/index.d.ts +5 -5
  122. package/dist-lib/lib/serverRoutes/index.js +5 -5
  123. package/dist-lib/lib/serverRoutes/pickstationOrders.handler.js +1 -1
  124. package/dist-lib/lib/serverRoutes/pickstationPrint.handler.js +1 -1
  125. package/dist-lib/lib/serverRoutes/pickstationStatus.handler.js +1 -1
  126. package/dist-lib/lib/signupMailText.d.ts.map +1 -1
  127. package/dist-lib/lib/signupMailText.js +4 -0
  128. package/dist-lib/moduleDefinition.js +3 -3
  129. 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 "../ui/responsive-dialog.js";
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 "../ui/responsive-dialog.js";
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,4 +1,4 @@
1
- import { type AfhandelingDocumenttype } from "../../lib/printing";
1
+ import { type AfhandelingDocumenttype } from "../../lib/printing.js";
2
2
  export interface PrintDocumentOpties {
3
3
  documenttype: AfhandelingDocumenttype;
4
4
  documentnaam: string;
@@ -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,gCAyJtC"}
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))) })] }), _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" }), "."] })] })] }), _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" })] })] }));
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,4 +1,4 @@
1
- import { type EngineTask } from "../lib/logisticsEngine/engine";
1
+ import { type EngineTask } from "../lib/logisticsEngine/engine.js";
2
2
  export declare const ENGINE_TASKS_KEY: string[];
3
3
  export declare function useEngineTasks(options?: {
4
4
  taskTypes?: string[];
@@ -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
- }[], Error>;
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;YAYtF"}
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, Error>;
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,kFAmBrE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,yEAUlE"}
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,EAGL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAYtG;;;;;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,CAmTxF"}
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, DEFAULT_PICKUP_MOMENT, } from "../lib/planning";
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 { emitQueueStatus, markInFlight, markResult, resetEmitQueue, selectEmitBatch, } from "../lib/logisticsEngine/emitQueue";
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
- : [DEFAULT_PICKUP_MOMENT];
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
- }, [orderList, carriersQuery.data, composeByRef, pickByRef, composeExists, cartsForOrder]);
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: ordersQuery.data?.orders?.length ? ordersQuery.data?.error : undefined,
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
  };