@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
@@ -3,9 +3,9 @@ import { useEffect, useState } from "react";
3
3
  import { useQueryClient } from "@tanstack/react-query";
4
4
  import { Badge, Button, toast } from "@flowselections/core";
5
5
  import { CheckCircle2, Clock, Loader2, PlayCircle, RefreshCw, AlertTriangle } from "lucide-react";
6
- import { autoProcessSalesOrder, fetchAutoProcessStatuses, } from "../../lib/floridayAutoProcess";
7
- import { supabase } from "../../integrations/supabase/moduleClient";
8
- import { replanToNextDeliveryMoment } from "../../lib/logisticsEngine/reschedule";
6
+ import { autoProcessSalesOrder, fetchAutoProcessStatuses, } from "../../lib/floridayAutoProcess.js";
7
+ import { supabase } from "../../integrations/supabase/moduleClient.js";
8
+ import { replanToNextDeliveryMoment } from "../../lib/logisticsEngine/reschedule.js";
9
9
  const NL_DATE = new Intl.DateTimeFormat("nl-NL", { day: "2-digit", month: "short" });
10
10
  function formatWaiting(date) {
11
11
  const today = new Date();
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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
  /** Tijdzone van de vestiging uit de Werktijden-instelling (alleen lezen); null = onbekend. */
5
5
  export function useVestigingTijdzone() {
6
6
  return 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
  * Waarschuwing bij te weinig pickcapaciteit. Alle cijfers komen letterlijk
4
4
  * uit de Logistics Engine (logistics_capacity_day_check).
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { AlertTriangle } from "lucide-react";
3
- import { capacityWarningText } from "../../lib/logisticsEngine/capacity";
3
+ import { capacityWarningText } from "../../lib/logisticsEngine/capacity.js";
4
4
  /**
5
5
  * Waarschuwing bij te weinig pickcapaciteit. Alle cijfers komen letterlijk
6
6
  * uit de Logistics Engine (logistics_capacity_day_check).
@@ -1,5 +1,5 @@
1
- import type { ControlCart } from "../../lib/cartControl.functions";
2
- import { type PickstationLang } from "../../lib/pickstationI18n";
1
+ import type { ControlCart } from "../../lib/cartControl.functions.js";
2
+ import { type PickstationLang } from "../../lib/pickstationI18n.js";
3
3
  /**
4
4
  * Rendert de controlelijst als losstaande HTML-pagina (A4 portrait).
5
5
  * De HTML gaat naar de printwachtrij van de Layout maker; er wordt
@@ -1,5 +1,5 @@
1
- import { countryCode } from "../../lib/countries";
2
- import { getPrintDict, PICKSTATION_LOCALE, } from "../../lib/pickstationI18n";
1
+ import { countryCode } from "../../lib/countries.js";
2
+ import { getPrintDict, PICKSTATION_LOCALE, } from "../../lib/pickstationI18n.js";
3
3
  const DAY_ABBR_BY_LANG = {
4
4
  nl: ["ZO", "MA", "DI", "WO", "DO", "VR", "ZA"],
5
5
  en: ["SU", "MO", "TU", "WE", "TH", "FR", "SA"],
@@ -2,14 +2,14 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useEffect, useMemo, useRef, useState } from "react";
3
3
  import { Button, Card, Checkbox, Dialog, DialogDescription, DialogTitle, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Textarea, Badge, toast, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@flowselections/core";
4
4
  import { Printer, CheckCircle2, AlertTriangle, History, ChevronLeft, ChevronRight, ScanLine } from "lucide-react";
5
- import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../ui/responsive-dialog.js";
5
+ import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../../components/ui/responsive-dialog.js";
6
6
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
7
7
  import { useServerFn } from "@tanstack/react-start";
8
- import { getTodaysControlCarts, getControlRescheduleProposals, submitControlSession, listControlHistory, getControlSessionDetail, getControlDraft, listDeliveredToday, saveControlDraft, } from "../../lib/cartControl.functions";
9
- import { ScanControleView } from "./ScanControleView";
10
- import { renderControleLijstHtml } from "./ControleLijstPrint";
11
- import { printHtmlDocument, printFoutMelding } from "../../lib/printing";
12
- import { callServerFn } from "../../lib/serverFnError";
8
+ import { getTodaysControlCarts, getControlRescheduleProposals, submitControlSession, listControlHistory, getControlSessionDetail, getControlDraft, listDeliveredToday, saveControlDraft, } from "../../lib/cartControl.functions.js";
9
+ import { ScanControleView } from "./ScanControleView.js";
10
+ import { renderControleLijstHtml } from "./ControleLijstPrint.js";
11
+ import { printHtmlDocument, printFoutMelding } from "../../lib/printing.js";
12
+ import { callServerFn } from "../../lib/serverFnError.js";
13
13
  function dayDiffFromToday(iso) {
14
14
  const d = new Date(iso);
15
15
  if (Number.isNaN(d.getTime()))
@@ -1,9 +1,13 @@
1
- import type { PlannedOrder } from "../../hooks/useOrderPlanning";
1
+ import type { PlannedOrder } from "../../hooks/useOrderPlanning.js";
2
2
  export interface DagDetailDialogProps {
3
3
  open: boolean;
4
4
  date: Date | null;
5
5
  planned: PlannedOrder[];
6
6
  onOpenChange: (open: boolean) => void;
7
+ /** Waar de dag op telt: leverdag (Planning en leveringen) of pickdag (Pick Agenda). */
8
+ basis?: "lever" | "pick";
9
+ /** Order (id) die uitgelicht wordt, bv. vanuit een link. */
10
+ highlightOrderId?: string | null;
7
11
  }
8
12
  export declare function DagDetailDialog(props: DagDetailDialogProps): import("react").JSX.Element | null;
9
13
  //# sourceMappingURL=DagDetailDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DagDetailDialog.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/DagDetailDialog.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA6JjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,sCAG1D"}
1
+ {"version":3,"file":"DagDetailDialog.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/DagDetailDialog.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA+LjE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,uFAAuF;IACvF,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,sCAG1D"}
@@ -1,28 +1,59 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { createContext, useContext, useState } from "react";
2
+ import { createContext, useContext, useMemo, useState } from "react";
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useServerFn } from "@tanstack/react-start";
5
5
  import { Badge, Checkbox, Button, Dialog, DialogTitle, DialogDescription, Input, Tabs, TabsContent, TabsList, TabsTrigger, toast, } from "@flowselections/core";
6
6
  import { AlertTriangle, CalendarClock, CheckCircle2, ChevronDown, ChevronRight, Printer, Users } from "lucide-react";
7
- import { useStickerMeldingen, useOrderArchived } from "../../hooks/useOrderMeldingen";
8
- import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../ui/responsive-dialog.js";
9
- import { usePickAgenda } from "../../hooks/usePickAgenda";
10
- import { useOrderBuffers, useBufferMembers } from "../../hooks/useOrderBuffers";
11
- import { isSameDay } from "../../lib/pickDate";
12
- import { getOrderLines, getDayCartContents, getOrderCartIds, getPakbonCartInfo, } from "../../lib/cartAssignments.functions";
13
- import { printLayoutDocument, printPdfDocument, printFoutMelding } from "../../lib/printing";
14
- import { NuVersturenButton } from "./NuVersturenButton";
15
- import { AutoSendStatus } from "./AutoSendStatus";
16
- import { SignupMailMoments } from "./SignupMailMoments";
17
- import { CapacityWarning } from "./CapacityWarning";
18
- import { useCapacityCheck } from "../../hooks/useCapacityCheck";
19
- import { toDayKey } from "../../lib/logisticsEngine/capacity";
20
- import { VerzetOrderDialog } from "./VerzetOrderDialog";
21
- import { markOrderShipped } from "../../lib/orderFulfilment.functions";
22
- import { getDeliveryNotePdf } from "../../lib/deliveryNote.functions";
23
- import { getShippingNoteLayout } from "../../lib/engineLayouts.functions";
24
- import { setPickDay } from "../../lib/logisticsEngine/reschedule";
25
- import { clearDayStaffPlan, computeCapacity, getDayStaffPlan, getEngineStaffDefaults, setDayStaffPlan, toDateKey, } from "../../lib/logisticsEngine/staffPlanning";
7
+ import { useStickerMeldingen, useOrderArchived } from "../../hooks/useOrderMeldingen.js";
8
+ import { ResponsiveDialogBody, ResponsiveDialogContent, ResponsiveDialogFooter, ResponsiveDialogHeader, } from "../../components/ui/responsive-dialog.js";
9
+ import { usePickAgenda } from "../../hooks/usePickAgenda.js";
10
+ import { useOrderBuffers, useBufferMembers } from "../../hooks/useOrderBuffers.js";
11
+ import { isSameDay } from "../../lib/pickDate.js";
12
+ import { isExcludedOrderStatus } from "../../lib/orderStatus.js";
13
+ import { getOrderLines, getDayCartContents, getOrderCartIds, getPakbonCartInfo, } from "../../lib/cartAssignments.functions.js";
14
+ import { printLayoutDocument, printPdfDocument, printFoutMelding } from "../../lib/printing.js";
15
+ import { NuVersturenButton } from "./NuVersturenButton.js";
16
+ import { AutoSendStatus } from "./AutoSendStatus.js";
17
+ import { SignupMailMoments } from "./SignupMailMoments.js";
18
+ import { getSignupOverview } from "../../lib/carrierSignup.functions.js";
19
+ import { useServerFn as useSignupServerFn } from "@tanstack/react-start";
20
+ import { useQuery as useSignupQuery } from "@tanstack/react-query";
21
+ const SignupFlagCtx = createContext(new Map());
22
+ function shiftDay(key, days) {
23
+ const d = new Date(`${key}T12:00:00Z`);
24
+ d.setUTCDate(d.getUTCDate() + days);
25
+ return d.toISOString().slice(0, 10);
26
+ }
27
+ function useSignupFlags(dayKey) {
28
+ const fetchOverview = useSignupServerFn(getSignupOverview);
29
+ const from = dayKey ? shiftDay(dayKey, -7) : null;
30
+ const to = dayKey ? shiftDay(dayKey, 7) : null;
31
+ const q = useSignupQuery({
32
+ queryKey: ["afhandeling", "signup-overview", from, to],
33
+ enabled: !!from && !!to,
34
+ queryFn: () => fetchOverview({ data: { from: from, to: to } }),
35
+ refetchInterval: 60000,
36
+ });
37
+ return useMemo(() => {
38
+ const m = new Map();
39
+ for (const g of q.data?.groups ?? []) {
40
+ for (const id of g.late_order_ids ?? [])
41
+ m.set(id, "late");
42
+ for (const p of g.pending_orders ?? [])
43
+ m.set(p.orderId, "pending");
44
+ }
45
+ return m;
46
+ }, [q.data]);
47
+ }
48
+ import { CapacityWarning } from "./CapacityWarning.js";
49
+ import { useCapacityCheck } from "../../hooks/useCapacityCheck.js";
50
+ import { toDayKey } from "../../lib/logisticsEngine/capacity.js";
51
+ import { VerzetOrderDialog } from "./VerzetOrderDialog.js";
52
+ import { markOrderShipped } from "../../lib/orderFulfilment.functions.js";
53
+ import { getDeliveryNotePdf } from "../../lib/deliveryNote.functions.js";
54
+ import { getShippingNoteLayout } from "../../lib/engineLayouts.functions.js";
55
+ import { setPickDay } from "../../lib/logisticsEngine/reschedule.js";
56
+ import { clearDayStaffPlan, computeCapacity, getDayStaffPlan, getEngineStaffDefaults, setDayStaffPlan, toDateKey, } from "../../lib/logisticsEngine/staffPlanning.js";
26
57
  function voortgang(status) {
27
58
  const s = (status ?? "").trim().toLowerCase();
28
59
  if (["done", "completed", "afgerond", "afgehandeld", "shipped", "verzonden", "delivered", "geleverd", "afgeleverd", "checked", "gecontroleerd"].includes(s)) {
@@ -79,6 +110,7 @@ function StickerMeldingen({ orderId }) {
79
110
  return null;
80
111
  return (_jsx("ul", { className: "space-y-1", children: q.data.map((m, i) => (_jsxs("li", { className: "flex items-start gap-1 text-xs text-destructive", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-3 w-3 shrink-0" }), _jsx("span", { children: m.melding })] }, (m.stickerId ?? "") + i))) }));
81
112
  }
113
+ const HighlightCtx = createContext(null);
82
114
  const NL_DATE = new Intl.DateTimeFormat("nl-NL", { dateStyle: "full" });
83
115
  function refKey(value) {
84
116
  return (value ?? "").trim().toUpperCase();
@@ -88,7 +120,7 @@ export function DagDetailDialog(props) {
88
120
  return null;
89
121
  return _jsx(DagDetailContent, { ...props, date: props.date });
90
122
  }
91
- function DagDetailContent({ open, date, planned, onOpenChange, }) {
123
+ function DagDetailContent({ open, date, planned, onOpenChange, basis = "pick", highlightOrderId, }) {
92
124
  const dayKey = toDayKey(date);
93
125
  const agenda = usePickAgenda(dayKey, dayKey);
94
126
  const row = agenda.byDate.get(dayKey);
@@ -102,16 +134,28 @@ function DagDetailContent({ open, date, planned, onOpenChange, }) {
102
134
  plannedByRef.set(k, p);
103
135
  }
104
136
  }
105
- const ordersOnDay = (row?.orders ?? []).map((o) => ({
106
- ref: o.orderRef,
107
- carts: o.carts,
108
- plants: o.plants,
109
- status: o.status,
110
- planned: plannedByRef.get(refKey(o.orderRef)) ?? null,
111
- }));
137
+ // Leverdag: dezelfde orders als de dagkaart in Planning en leveringen.
138
+ const ordersOnDay = basis === "lever"
139
+ ? planned
140
+ .filter((p) => p.planning?.deliveryDate && isSameDay(p.planning.deliveryDate, date))
141
+ .filter((p) => !/annul|cancel/i.test(p.order.status ?? "") && !isExcludedOrderStatus(p.order.status))
142
+ .map((p) => ({
143
+ ref: p.order.orderNumber || p.order.id,
144
+ carts: (p.planning?.pickAssignments ?? []).reduce((s, a) => s + a.cartCount, 0),
145
+ plants: p.order.plantCount ?? 0,
146
+ status: p.order.status ?? "",
147
+ planned: p,
148
+ }))
149
+ : (row?.orders ?? []).map((o) => ({
150
+ ref: o.orderRef,
151
+ carts: o.carts,
152
+ plants: o.plants,
153
+ status: o.status,
154
+ planned: plannedByRef.get(refKey(o.orderRef)) ?? null,
155
+ }));
112
156
  // Aanvullen met lokaal ingeplande orders die de Engine-rij (nog) niet noemt.
113
157
  const seen = new Set(ordersOnDay.map((o) => refKey(o.ref)));
114
- for (const p of planned) {
158
+ for (const p of basis === "lever" ? [] : planned) {
115
159
  const assigns = p.planning?.pickAssignments ?? [];
116
160
  const today = assigns.find((a) => isSameDay(a.date, date));
117
161
  if (!today)
@@ -180,8 +224,9 @@ function DagDetailContent({ open, date, planned, onOpenChange, }) {
180
224
  }
181
225
  }
182
226
  // Tel karren op unieke kar-id (gedeelde bufferkar één keer); rijen zonder id tellen los.
227
+ const signupFlags = useSignupFlags(dayKey ?? null);
183
228
  const uniekeKarren = new Set(cartRows.map((c) => c.cartId ?? `zonder-id:${c.key}`)).size;
184
- return (_jsx(ShipStateCtx.Provider, { value: shipState, children: _jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(ResponsiveDialogContent, { size: "xl", children: [_jsxs(ResponsiveDialogHeader, { children: [_jsxs(DialogTitle, { children: ["Dagdetails \u2014 ", NL_DATE.format(date)] }), _jsxs(DialogDescription, { children: [ordersOnDay.length, " bestellingen \u00B7 ", uniekeKarren, " ", uniekeKarren === 1 ? "kar" : "karren", " \u00B7", " ", ordersOnDay.filter((o) => voortgang(o.status).done).length, " van ", ordersOnDay.length, " ", "bestellingen afgehandeld \u00B7 ", new Set(cartRows.filter((c) => voortgang(c.status).done).map((c) => c.cartId ?? `zonder-id:${c.key}`)).size, " van", " ", uniekeKarren, " karren afgehandeld"] })] }), _jsxs(ResponsiveDialogBody, { children: [_jsx(DayCapacityWarning, { date: date }), _jsx(BezettingCard, { date: date, cartsToday: uniekeKarren }), _jsx(SignupMailMoments, { from: dayKey, to: dayKey }), _jsxs(Tabs, { defaultValue: "bestellingen", children: [_jsxs(TabsList, { children: [_jsxs(TabsTrigger, { value: "bestellingen", children: ["Bestellingen (", ordersOnDay.length, ")"] }), _jsxs(TabsTrigger, { value: "karren", children: ["Karren (", uniekeKarren, ")"] })] }), _jsx(TabsContent, { value: "bestellingen", className: "mt-4", children: _jsx(BestellingenTab, { orders: ordersOnDay, isLoading: agenda.isLoading }) }), _jsx(TabsContent, { value: "karren", className: "mt-4", children: _jsx(KarrenTab, { carts: cartRows }) })] })] }), _jsx(ResponsiveDialogFooter, { children: _jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Sluiten" }) })] }) }) }));
229
+ return (_jsx(SignupFlagCtx.Provider, { value: signupFlags, children: _jsx(HighlightCtx.Provider, { value: highlightOrderId ?? null, children: _jsx(ShipStateCtx.Provider, { value: shipState, children: _jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(ResponsiveDialogContent, { size: "xl", children: [_jsxs(ResponsiveDialogHeader, { children: [_jsxs(DialogTitle, { children: ["Dagdetails \u2014 ", NL_DATE.format(date), " (", basis === "lever" ? "leverdag" : "pickdag", ")"] }), _jsxs(DialogDescription, { children: [basis === "lever" ? "Bestellingen die op deze dag worden geleverd. " : "Bestellingen die op deze dag worden gepickt. ", ordersOnDay.length, " ", ordersOnDay.length === 1 ? "bestelling" : "bestellingen", " \u00B7 ", uniekeKarren, " ", uniekeKarren === 1 ? "kar" : "karren", " \u00B7", " ", ordersOnDay.filter((o) => voortgang(o.status).done).length, " van ", ordersOnDay.length, " ", ordersOnDay.length === 1 ? "bestelling" : "bestellingen", " afgehandeld \u00B7 ", new Set(cartRows.filter((c) => voortgang(c.status).done).map((c) => c.cartId ?? `zonder-id:${c.key}`)).size, " van", " ", uniekeKarren, " ", uniekeKarren === 1 ? "kar" : "karren", " afgehandeld"] })] }), _jsxs(ResponsiveDialogBody, { children: [_jsx(DayCapacityWarning, { date: date }), _jsx(BezettingCard, { date: date, cartsToday: uniekeKarren }), _jsx(SignupMailMoments, { from: dayKey, to: dayKey }), _jsxs(Tabs, { defaultValue: "bestellingen", children: [_jsxs(TabsList, { children: [_jsxs(TabsTrigger, { value: "bestellingen", children: ["Bestellingen (", ordersOnDay.length, ")"] }), _jsxs(TabsTrigger, { value: "karren", children: ["Karren (", uniekeKarren, ")"] })] }), _jsx(TabsContent, { value: "bestellingen", className: "mt-4", children: _jsx(BestellingenTab, { orders: ordersOnDay, isLoading: agenda.isLoading }) }), _jsx(TabsContent, { value: "karren", className: "mt-4", children: _jsx(KarrenTab, { carts: cartRows }) })] })] }), _jsx(ResponsiveDialogFooter, { children: _jsx(Button, { variant: "outline", onClick: () => onOpenChange(false), children: "Sluiten" }) })] }) }) }) }) }));
185
230
  }
186
231
  function BezettingCard({ date, cartsToday }) {
187
232
  const queryClient = useQueryClient();
@@ -607,6 +652,12 @@ function EngineOrderRow({ order }) {
607
652
  const vg = useVoortgang(order.ref, order.status);
608
653
  return (_jsx("div", { className: "rounded-lg border bg-card px-4 py-3", children: _jsxs("div", { className: "grid grid-cols-2 gap-3 text-sm md:grid-cols-4", children: [_jsxs("div", { children: [_jsx("div", { className: "font-medium", children: order.ref }), _jsx("div", { className: "text-xs text-muted-foreground", children: "Alleen bekend in de planning" })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Karren vandaag" }), _jsx("div", { children: order.carts })] }), _jsxs("div", { children: [_jsx("div", { className: "text-xs text-muted-foreground", children: "Planten" }), _jsx("div", { children: order.plants })] }), _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsx(StatusBadge, { vg: vg }), _jsx(AfhandelenButton, { orderRef: order.ref, done: vg.done })] })] }) }));
609
654
  }
655
+ function SignupFlagLabel({ orderId }) {
656
+ const flag = useContext(SignupFlagCtx).get(orderId);
657
+ if (!flag)
658
+ return null;
659
+ return (_jsx("div", { className: "text-xs font-medium text-destructive", children: flag === "late" ? "Te laat aangemeld bij de vervoerder" : "Heeft nog geen karindeling en is nog niet aangemeld bij de vervoerder" }));
660
+ }
610
661
  function OrderRow({ planned: p, cartsToday, engineStatus, }) {
611
662
  const [open, setOpen] = useState(false);
612
663
  const [printing, setPrinting] = useState(false);
@@ -647,7 +698,8 @@ function OrderRow({ planned: p, cartsToday, engineStatus, }) {
647
698
  setPrinting(false);
648
699
  }
649
700
  };
650
- return (_jsxs("div", { className: "rounded-lg border bg-card", children: [_jsxs("div", { className: "flex flex-col gap-3 p-3", children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "-m-1 flex items-start gap-3 rounded-md p-1 text-left hover:bg-muted/50", children: [open ? (_jsx(ChevronDown, { className: "mt-1 h-4 w-4 shrink-0" })) : (_jsx(ChevronRight, { className: "mt-1 h-4 w-4 shrink-0" })), _jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-6 gap-y-1 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: p.order.orderNumber }), _jsx("div", { className: "truncate text-xs text-muted-foreground", children: p.order.customerName })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Type ", _jsx("span", { className: "text-foreground", children: p.order.deliveryType })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Leverdatum", " ", _jsx("span", { className: "text-foreground", children: p.order.deliveryDate
701
+ const highlighted = useContext(HighlightCtx) === p.order.id;
702
+ return (_jsxs("div", { className: `rounded-lg border bg-card ${highlighted ? "ring-2 ring-primary" : ""}`, ref: highlighted ? (el) => el?.scrollIntoView({ block: "center" }) : undefined, children: [_jsxs("div", { className: "flex flex-col gap-3 p-3", children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "-m-1 flex items-start gap-3 rounded-md p-1 text-left hover:bg-muted/50", children: [open ? (_jsx(ChevronDown, { className: "mt-1 h-4 w-4 shrink-0" })) : (_jsx(ChevronRight, { className: "mt-1 h-4 w-4 shrink-0" })), _jsxs("div", { className: "min-w-0 flex-1 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-6 gap-y-1 text-sm", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-medium", children: p.order.orderNumber }), _jsx(SignupFlagLabel, { orderId: p.order.id }), _jsx("div", { className: "truncate text-xs text-muted-foreground", children: p.order.customerName })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Type ", _jsx("span", { className: "text-foreground", children: p.order.deliveryType })] }), _jsxs("div", { className: "text-xs text-muted-foreground", children: ["Leverdatum", " ", _jsx("span", { className: "text-foreground", children: p.order.deliveryDate
651
703
  ? new Date(p.order.deliveryDate).toLocaleDateString("nl-NL")
652
704
  : "—" })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs(Badge, { variant: "secondary", children: [cartsToday, " ", cartsToday === 1 ? "kar" : "karren", " vandaag"] }), _jsx(StatusBadge, { vg: vg })] }), _jsx(StickerMeldingen, { orderId: p.order.id })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 border-t pt-3", children: [p.order.orderNumber && p.order.salesOrderId && !shipStateRow?.floridaySent ? _jsx(NuVersturenButton, { orderRef: p.order.orderNumber }) : null, p.order.salesOrderId ? _jsx(AutoSendStatus, { orderId: p.order.id, orderRef: p.order.orderNumber }) : null, _jsx(AfhandelenButton, { orderRef: p.order.orderNumber, done: vg.done }), _jsxs(Button, { size: "sm", variant: "outline", onClick: handlePrintAll, disabled: printing, title: "Alle documenten van deze bestelling afdrukken (pakbonnen per kar en de verzendbrief)", children: [_jsx(Printer, { className: "mr-1 h-3.5 w-3.5" }), printing ? "In de Printwachtrij…" : "Alle documenten afdrukken"] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: (e) => {
653
705
  e.stopPropagation();
@@ -1 +1 @@
1
- {"version":3,"file":"LeveringenPage.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/LeveringenPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,gCAqC7B"}
1
+ {"version":3,"file":"LeveringenPage.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/LeveringenPage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,cAAc,gCAmD7B"}
@@ -1,14 +1,36 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useMemo, useState } from "react";
2
+ import { useEffect, useMemo, useState } from "react";
3
3
  import { Button } from "@flowselections/core";
4
- import { WeekAgendaView } from "./WeekAgendaView";
5
- import { DagDetailDialog } from "./DagDetailDialog";
6
- import { useOrderPlanning } from "../../hooks/useOrderPlanning";
7
- import { agendaRange, currentWeekStart } from "../../lib/agendaRange";
4
+ import { WeekAgendaView } from "./WeekAgendaView.js";
5
+ import { DagDetailDialog } from "./DagDetailDialog.js";
6
+ import { useOrderPlanning } from "../../hooks/useOrderPlanning.js";
7
+ import { agendaRange, currentWeekStart } from "../../lib/agendaRange.js";
8
+ import { startOfWeek } from "../../lib/pickDate.js";
9
+ /** Leest ?dag=JJJJ-MM-DD&order=<order_id> (link vanuit bv. Dashboards). */
10
+ function readLinkParams() {
11
+ const sp = new URLSearchParams(window.location.search);
12
+ const dag = sp.get("dag");
13
+ const order = sp.get("order");
14
+ const m = dag && /^(\d{4})-(\d{2})-(\d{2})$/.exec(dag);
15
+ const day = m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : null;
16
+ const orderId = order && /^[0-9a-f-]{36}$/i.test(order) ? order : null;
17
+ return { day: day && !Number.isNaN(day.getTime()) ? day : null, orderId };
18
+ }
8
19
  export function LeveringenPage() {
9
20
  const [weekStart, setWeekStart] = useState(() => currentWeekStart());
10
21
  const range = useMemo(() => agendaRange(weekStart), [weekStart]);
11
22
  const { planned, nearestDeliveryDate, isLoading, error, warning, refetch } = useOrderPlanning(range);
12
23
  const [dayDetailDate, setDayDetailDate] = useState(null);
13
- return (_jsxs("main", { className: "p-6 space-y-6", children: [warning && !error && (_jsxs("div", { className: "rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-900", children: [warning, " De beschikbare orders blijven zichtbaar."] })), error ? (_jsxs("div", { className: "rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive", children: [error, _jsx(Button, { size: "sm", variant: "outline", className: "ml-3", onClick: () => refetch(), children: "Opnieuw proberen" })] })) : (_jsx(WeekAgendaView, { planned: planned, mode: "delivery", isLoading: isLoading, onWeekChange: setWeekStart, onDayClick: setDayDetailDate, jumpToDate: nearestDeliveryDate })), _jsx(DagDetailDialog, { open: !!dayDetailDate, date: dayDetailDate, planned: planned, onOpenChange: (o) => !o && setDayDetailDate(null) })] }));
24
+ const [highlightOrderId, setHighlightOrderId] = useState(null);
25
+ const [linkDay, setLinkDay] = useState(null);
26
+ useEffect(() => {
27
+ const { day, orderId } = readLinkParams();
28
+ if (day) {
29
+ setLinkDay(new URLSearchParams(window.location.search).get("dag"));
30
+ setWeekStart(startOfWeek(day));
31
+ setDayDetailDate(day);
32
+ setHighlightOrderId(orderId);
33
+ }
34
+ }, []);
35
+ return (_jsxs("main", { className: "p-6 space-y-6", children: [warning && !error && (_jsxs("div", { className: "rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-900", children: [warning, " De beschikbare orders blijven zichtbaar."] })), error ? (_jsxs("div", { className: "rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm text-destructive", children: [error, _jsx(Button, { size: "sm", variant: "outline", className: "ml-3", onClick: () => refetch(), children: "Opnieuw proberen" })] })) : (_jsx(WeekAgendaView, { planned: planned, mode: "delivery", isLoading: isLoading, onWeekChange: setWeekStart, onDayClick: (d) => { setHighlightOrderId(null); setDayDetailDate(d); }, jumpToDate: linkDay ?? nearestDeliveryDate })), _jsx(DagDetailDialog, { open: !!dayDetailDate, date: dayDetailDate, planned: planned, basis: "lever", highlightOrderId: highlightOrderId, onOpenChange: (o) => !o && setDayDetailDate(null) })] }));
14
36
  }
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { VervoerderForm } from "./VervoerderForm";
2
+ import { VervoerderForm } from "./VervoerderForm.js";
3
3
  /** Aanmaakpagina: altijd een leeg formulier, nooit een bestaand id. */
4
4
  export function NieuweVervoerderPage() {
5
5
  return _jsx(VervoerderForm, { carrierId: null });
@@ -4,7 +4,7 @@ import { useServerFn } from "@tanstack/react-start";
4
4
  import { useQueryClient } from "@tanstack/react-query";
5
5
  import { Button, toast, AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@flowselections/core";
6
6
  import { Send, Loader2, CheckCircle2, XCircle } from "lucide-react";
7
- import { prepareFloridayLoading, sendFloridayLoading, } from "../../lib/floridayLoading.functions";
7
+ import { prepareFloridayLoading, sendFloridayLoading, } from "../../lib/floridayLoading.functions.js";
8
8
  /** "Nu versturen": toont eerst een samenvatting met controles en vraagt bevestiging. */
9
9
  const PICK_LABEL = {
10
10
  geen_pickrij: "nog niet gepickt",
@@ -1,4 +1,4 @@
1
- import type { FloridayOrder } from "../../lib/floriday.functions";
1
+ import type { FloridayOrder } from "../../lib/floriday.functions.js";
2
2
  export interface PickAgendaViewProps {
3
3
  onOrderClick?: (order: FloridayOrder) => void;
4
4
  }
@@ -1,11 +1,11 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from "react";
3
3
  import { Button } from "@flowselections/core";
4
- import { WeekAgendaView } from "./WeekAgendaView";
5
- import { DagDetailDialog } from "./DagDetailDialog";
6
- import { useVestigingTijdzone } from "./AutoSendStatus";
7
- import { useOrderPlanning } from "../../hooks/useOrderPlanning";
8
- import { agendaRange, currentWeekStart } from "../../lib/agendaRange";
4
+ import { WeekAgendaView } from "./WeekAgendaView.js";
5
+ import { DagDetailDialog } from "./DagDetailDialog.js";
6
+ import { useVestigingTijdzone } from "./AutoSendStatus.js";
7
+ import { useOrderPlanning } from "../../hooks/useOrderPlanning.js";
8
+ import { agendaRange, currentWeekStart } from "../../lib/agendaRange.js";
9
9
  /** Toon hooguit dit aantal ordernummers per categorie; de rest telt als "meer". */
10
10
  const MAX_REFS = 8;
11
11
  function refsOf(items) {
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { PickAgendaView } from "./PickAgendaView";
2
+ import { PickAgendaView } from "./PickAgendaView.js";
3
3
  export function PickingPage() {
4
4
  return (_jsxs("main", { className: "flex h-full flex-col gap-6 overflow-hidden p-6", children: [_jsxs("div", { className: "shrink-0", children: [_jsx("h1", { className: "text-2xl font-semibold", children: "Pick Agenda" }), _jsx("p", { className: "text-sm text-muted-foreground", children: "Overzicht van alle orders die gepickt moeten worden." })] }), _jsx("div", { className: "min-h-0 flex-1", children: _jsx(PickAgendaView, {}) })] }));
5
5
  }
@@ -1,4 +1,4 @@
1
- import { type WeekAgendaMode } from "./WeekAgendaView";
1
+ import { type WeekAgendaMode } from "./WeekAgendaView.js";
2
2
  interface Props {
3
3
  title: string;
4
4
  description: string;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { WeekAgendaView } from "./WeekAgendaView";
3
- import { useOrderPlanning } from "../../hooks/useOrderPlanning";
2
+ import { WeekAgendaView } from "./WeekAgendaView.js";
3
+ import { useOrderPlanning } from "../../hooks/useOrderPlanning.js";
4
4
  export function PlanningAgendaPage({ title, description, mode }) {
5
5
  const { planned, isLoading, error, warning } = useOrderPlanning();
6
6
  return (_jsxs("main", { className: "p-6 space-y-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-semibold", children: title }), _jsx("p", { className: "text-sm text-muted-foreground", children: description })] }), error && (_jsx("div", { className: "rounded-md border border-destructive/30 bg-destructive/5 p-3 text-sm text-destructive", children: error })), warning && !error && (_jsxs("div", { className: "rounded-md border border-amber-300 bg-amber-50 p-3 text-sm text-amber-900", children: [warning, " De beschikbare orders blijven zichtbaar."] })), _jsx(WeekAgendaView, { planned: planned, mode: mode, isLoading: isLoading })] }));
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useState } from "react";
3
3
  import { Popover, PopoverContent, PopoverTrigger, Badge, cn } from "@flowselections/core";
4
4
  import { ChevronDown, Search, X, Check, Globe, MapPin, Building2 } from "lucide-react";
5
- import { GEO_ITEMS, getGeoItem } from "../../lib/geo/euServiceAreas";
5
+ import { GEO_ITEMS, getGeoItem } from "../../lib/geo/euServiceAreas.js";
6
6
  const LEVEL_META = {
7
7
  country: { label: "Land", icon: Globe, tone: "bg-blue-100 text-blue-700" },
8
8
  province: { label: "Provincie", icon: MapPin, tone: "bg-emerald-100 text-emerald-700" },
@@ -4,8 +4,8 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useServerFn } from "@tanstack/react-start";
5
5
  import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, toast, } from "@flowselections/core";
6
6
  import { Mail } from "lucide-react";
7
- import { getSignupOverview, previewSignupMail, sendSignupMailNow, } from "../../lib/carrierSignup.functions";
8
- import { fmtDayTime, fmtTime, signupReasonText } from "../../lib/signupMailText";
7
+ import { getSignupOverview, previewSignupMail, sendSignupMailNow, } from "../../lib/carrierSignup.functions.js";
8
+ import { fmtDayTime, fmtTime, signupReasonText } from "../../lib/signupMailText.js";
9
9
  export function SignupMailMoments({ from, to, compact }) {
10
10
  const fetchOverview = useServerFn(getSignupOverview);
11
11
  const q = useQuery({
@@ -29,15 +29,18 @@ export function SignupMailMoments({ from, to, compact }) {
29
29
  return null;
30
30
  return (_jsxs("div", { className: "space-y-2 rounded-md border p-3", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium", children: [_jsx(Mail, { className: "h-4 w-4 text-primary" }), " Aanmeldmail vervoerders"] }), !ov.enabled ? _jsx("p", { className: "text-xs text-muted-foreground", children: "De aanmeldmail staat uit." }) : null, reason && ov.enabled ? _jsx("p", { className: "text-xs text-destructive", children: reason }) : null, unassigned > 0 ? (_jsxs("p", { className: "text-xs text-destructive", children: [unassigned, " ", unassigned === 1 ? "order heeft" : "orders hebben", " geen vervoerder. Stel een standaardvervoerder in bij Vervoerders."] })) : null, _jsx("ul", { className: "space-y-1", children: ov.groups.map((g) => (_jsx(MomentRow, { g: g, tz: tz, compact: compact, enabled: ov.enabled, onPreview: () => setPreview(g) }, `${g.carrier_id}-${g.pickup_date}-${g.pickup_moment_key}`))) }), preview ? _jsx(PreviewDialog, { g: preview, onClose: () => setPreview(null) }) : null] }));
31
31
  }
32
+ const kar = (n) => `${n} ${n === 1 ? "kar" : "karren"}`;
32
33
  function statusLine(g, tz, enabled) {
33
34
  const moment = compactMoment(g, tz);
34
35
  if (g.last) {
35
- const base = `Aanmeldmail verstuurd om ${fmtTime(g.last.sent_at, tz)} naar ${g.carrier_name} · ${g.last.cart_count} karren`;
36
- return g.last.fingerprint_match ? `${moment} — ${base}` : `${moment} — ${base} · wijziging volgt: nu ${g.cart_count} karren`;
36
+ if (g.last.fingerprint_match) {
37
+ return `${moment} — Al verstuurd om ${fmtTime(g.last.sent_at, tz)} naar ${g.carrier_name} · ${kar(g.last.cart_count)} — er is niets veranderd`;
38
+ }
39
+ return `${moment} — Aanmeldmail verstuurd om ${fmtTime(g.last.sent_at, tz)} naar ${g.carrier_name} · ${kar(g.last.cart_count)} · wijziging volgt: nu ${kar(g.cart_count)}`;
37
40
  }
38
41
  if (!enabled)
39
- return `${moment} — ${g.carrier_name} · ${g.cart_count} karren`;
40
- return `${moment} — Aanmeldmail volgt om ${fmtTime(g.send_at, tz)} naar ${g.carrier_name} · ${g.cart_count} karren`;
42
+ return `${moment} — ${g.carrier_name} · ${kar(g.cart_count)}`;
43
+ return `${moment} — Aanmeldmail volgt om ${fmtTime(g.send_at, tz)} naar ${g.carrier_name} · ${kar(g.cart_count)}`;
41
44
  }
42
45
  function compactMoment(g, tz) {
43
46
  return `Ophalen ${fmtDayTime(g.pickup_at, tz)}`;
@@ -50,6 +53,8 @@ function MomentRow({ g, tz, compact, enabled, onPreview }) {
50
53
  onSuccess: (r) => {
51
54
  if (r.code === "sent")
52
55
  toast.success("Aanmeldmail verstuurd");
56
+ else if (r.code === "waiting_for_carts")
57
+ toast.info("Even wachten: een order heeft nog geen karindeling");
53
58
  else if (r.code === "already_sent")
54
59
  toast.info("Deze stand is al verstuurd");
55
60
  else
@@ -60,7 +65,7 @@ function MomentRow({ g, tz, compact, enabled, onPreview }) {
60
65
  onError: (e) => toast.error(e instanceof Error ? e.message : "Versturen lukte niet"),
61
66
  });
62
67
  const upToDate = g.last?.fingerprint_match === true;
63
- return (_jsxs("li", { className: "flex flex-wrap items-center justify-between gap-2 text-xs", children: [_jsx("span", { children: statusLine(g, tz, enabled) }), compact ? null : (_jsxs("span", { className: "flex gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: onPreview, children: "Voorbeeld bekijken" }), _jsx(Button, { size: "sm", disabled: !enabled || upToDate || m.isPending, onClick: () => m.mutate(), children: m.isPending ? "Versturen…" : "Nu versturen" })] }))] }));
68
+ return (_jsxs("li", { className: "flex flex-wrap items-center justify-between gap-2 text-xs", children: [_jsxs("span", { className: "space-y-0.5", children: [_jsx("span", { className: "block", children: statusLine(g, tz, enabled) }), (g.pending_orders ?? []).map((p) => (_jsxs("span", { className: "block text-destructive", children: [p.orderNumber ?? "Een order", " heeft nog geen karindeling en is nog niet aangemeld", g.wait_until && new Date(g.wait_until).getTime() > Date.now() ? ` — de mail wacht tot ${fmtTime(g.wait_until, tz)}` : ""] }, p.orderId))), (g.late_order_ids ?? []).length > 0 ? (_jsxs("span", { className: "block text-destructive", children: ["Te laat aangemeld: ", (g.late_order_ids ?? []).length, " ", (g.late_order_ids ?? []).length === 1 ? "order" : "orders", " \u2014 de vervoerder wordt gevraagd te bevestigen"] })) : null] }), compact ? null : (_jsxs("span", { className: "flex gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: onPreview, children: "Voorbeeld bekijken" }), _jsx(Button, { size: "sm", disabled: !enabled || upToDate || m.isPending, onClick: () => m.mutate(), children: m.isPending ? "Versturen…" : "Nu versturen" })] }))] }));
64
69
  }
65
70
  function PreviewDialog({ g, onClose }) {
66
71
  const fetchPreview = useServerFn(previewSignupMail);
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { VervoerderForm } from "./VervoerderForm";
2
+ import { VervoerderForm } from "./VervoerderForm.js";
3
3
  /**
4
4
  * Detailpagina van een vervoerder.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"VervoerderForm.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/VervoerderForm.tsx"],"names":[],"mappings":"AA+CA,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AA2PD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,+BAyalD"}
1
+ {"version":3,"file":"VervoerderForm.d.ts","sourceRoot":"","sources":["../../../src/components/afhandeling/VervoerderForm.tsx"],"names":[],"mappings":"AA+CA,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAqQD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,+BAiblD"}