@flowselections/floriday-afhandeling-module 1.0.64 → 1.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/afhandeling/AutoProcessStatus.js +3 -3
- package/dist-lib/components/afhandeling/AutoSendStatus.js +1 -1
- package/dist-lib/components/afhandeling/CapacityWarning.d.ts +1 -1
- package/dist-lib/components/afhandeling/CapacityWarning.js +1 -1
- package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +2 -2
- package/dist-lib/components/afhandeling/ControleLijstPrint.js +2 -2
- package/dist-lib/components/afhandeling/ControlePage.js +6 -6
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +5 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/DagDetailDialog.js +83 -31
- package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/LeveringenPage.js +28 -6
- package/dist-lib/components/afhandeling/NieuweVervoerderPage.js +1 -1
- package/dist-lib/components/afhandeling/NuVersturenButton.js +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.d.ts +1 -1
- package/dist-lib/components/afhandeling/PickAgendaView.js +5 -5
- package/dist-lib/components/afhandeling/PickingPage.js +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts +1 -1
- package/dist-lib/components/afhandeling/PlanningAgendaPage.js +2 -2
- package/dist-lib/components/afhandeling/ServiceAreaSelect.js +1 -1
- package/dist-lib/components/afhandeling/SignupMailMoments.js +12 -7
- package/dist-lib/components/afhandeling/VervoerderBewerkenPage.js +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
- package/dist-lib/components/afhandeling/VervoerderForm.js +20 -13
- package/dist-lib/components/afhandeling/VervoerdersPage.js +8 -8
- package/dist-lib/components/afhandeling/VerzetOrderDialog.js +7 -7
- package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +2 -2
- package/dist-lib/components/afhandeling/WeekAgendaView.js +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +9 -9
- package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +1 -1
- package/dist-lib/components/pickstation/PakbonTemplate.d.ts +2 -2
- package/dist-lib/components/pickstation/PakbonTemplate.js +1 -1
- package/dist-lib/components/pickstation/printDocuments.d.ts +1 -1
- package/dist-lib/components/pickstation/printDocuments.js +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
- package/dist-lib/components/settings/AfhandelingSettingsCard.js +5 -5
- package/dist-lib/components/settings/VervoerdersSettingsCard.js +2 -2
- package/dist-lib/hooks/useCapacityCheck.d.ts +1 -1
- package/dist-lib/hooks/useCapacityCheck.js +1 -1
- package/dist-lib/hooks/useCartIndex.js +2 -2
- package/dist-lib/hooks/useConsistencyCheck.js +1 -1
- package/dist-lib/hooks/useEngineBufferEvents.js +1 -1
- package/dist-lib/hooks/useEngineTasks.d.ts +1 -1
- package/dist-lib/hooks/useEngineTasks.js +2 -2
- package/dist-lib/hooks/useKnownOrders.js +4 -4
- package/dist-lib/hooks/useOrderBuffers.d.ts +2 -2
- package/dist-lib/hooks/useOrderBuffers.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderBuffers.js +1 -1
- package/dist-lib/hooks/useOrderMeldingen.d.ts +1 -1
- package/dist-lib/hooks/useOrderMeldingen.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderMeldingen.js +1 -1
- package/dist-lib/hooks/useOrderPickDates.js +3 -3
- package/dist-lib/hooks/useOrderPlanning.d.ts +3 -3
- package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
- package/dist-lib/hooks/useOrderPlanning.js +30 -15
- package/dist-lib/hooks/usePickAgenda.js +4 -4
- package/dist-lib/hooks/usePickMode.d.ts +3 -3
- package/dist-lib/hooks/usePickMode.js +1 -1
- package/dist-lib/index.d.ts +16 -16
- package/dist-lib/index.js +16 -16
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +502 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/afhandelingSettings.functions.d.ts +2 -2
- package/dist-lib/lib/afhandelingSettings.functions.js +1 -1
- package/dist-lib/lib/agendaRange.js +1 -1
- package/dist-lib/lib/authGateway.server.js +2 -2
- package/dist-lib/lib/carrierMatch.server.js +1 -1
- package/dist-lib/lib/carrierPlanning.d.ts +5 -1
- package/dist-lib/lib/carrierPlanning.d.ts.map +1 -1
- package/dist-lib/lib/carrierPlanning.js +16 -10
- package/dist-lib/lib/carrierSignup.functions.d.ts +12 -4
- package/dist-lib/lib/carrierSignup.functions.d.ts.map +1 -1
- package/dist-lib/lib/carrierSignup.functions.js +4 -2
- package/dist-lib/lib/carriers.functions.d.ts +7 -7
- package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
- package/dist-lib/lib/carriers.functions.js +15 -8
- package/dist-lib/lib/cartAssignments.functions.d.ts +8 -8
- package/dist-lib/lib/cartAssignments.functions.js +1 -1
- package/dist-lib/lib/cartControl.functions.d.ts +11 -11
- package/dist-lib/lib/cartControl.functions.js +2 -2
- package/dist-lib/lib/cartMoveImpact.d.ts +1 -1
- package/dist-lib/lib/cartMoveImpact.js +1 -1
- package/dist-lib/lib/cartRescheduling.js +1 -1
- package/dist-lib/lib/deliveryNote.functions.d.ts +1 -1
- package/dist-lib/lib/deliveryNote.functions.js +2 -2
- package/dist-lib/lib/deliveryNotePrint.d.ts +33 -33
- package/dist-lib/lib/deliveryNotePrint.js +3 -3
- package/dist-lib/lib/engineLayouts.functions.d.ts +1 -1
- package/dist-lib/lib/engineLayouts.functions.js +1 -1
- package/dist-lib/lib/floriday.functions.d.ts +2 -2
- package/dist-lib/lib/floriday.functions.js +2 -2
- package/dist-lib/lib/floridayAutoProcess.js +2 -2
- package/dist-lib/lib/floridayFulfillmentSend.server.js +3 -3
- package/dist-lib/lib/floridayLoading.functions.d.ts +2 -2
- package/dist-lib/lib/floridayLoading.functions.js +3 -3
- package/dist-lib/lib/gatewayBase.server.js +1 -1
- package/dist-lib/lib/invalidatePlanning.js +1 -1
- package/dist-lib/lib/logisticsEngine/engine.js +1 -1
- package/dist-lib/lib/logisticsEngine/reschedule.js +2 -2
- package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
- package/dist-lib/lib/orderFulfilment.functions.d.ts +1 -1
- package/dist-lib/lib/orderFulfilment.functions.js +1 -1
- package/dist-lib/lib/pickDates.functions.d.ts +1 -1
- package/dist-lib/lib/pickDates.functions.js +2 -2
- package/dist-lib/lib/pickMode.js +1 -1
- package/dist-lib/lib/pickWorkdays.d.ts +24 -0
- package/dist-lib/lib/pickWorkdays.d.ts.map +1 -0
- package/dist-lib/lib/pickWorkdays.js +30 -0
- package/dist-lib/lib/pickstationOrders.server.d.ts +2 -2
- package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -1
- package/dist-lib/lib/pickstationOrders.server.js +11 -5
- package/dist-lib/lib/planning.d.ts +19 -0
- package/dist-lib/lib/planning.d.ts.map +1 -1
- package/dist-lib/lib/planning.js +58 -11
- package/dist-lib/lib/realtimeBus.js +1 -1
- package/dist-lib/lib/serverRoutes/autoSend.handler.js +3 -3
- package/dist-lib/lib/serverRoutes/index.d.ts +5 -5
- package/dist-lib/lib/serverRoutes/index.js +5 -5
- package/dist-lib/lib/serverRoutes/pickstationOrders.handler.js +1 -1
- package/dist-lib/lib/serverRoutes/pickstationPrint.handler.js +1 -1
- package/dist-lib/lib/serverRoutes/pickstationStatus.handler.js +1 -1
- package/dist-lib/lib/signupMailText.d.ts.map +1 -1
- package/dist-lib/lib/signupMailText.js +4 -0
- package/dist-lib/moduleDefinition.js +3 -3
- package/package.json +2 -2
|
@@ -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 "
|
|
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;
|
|
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 "
|
|
9
|
-
import { usePickAgenda } from "../../hooks/usePickAgenda";
|
|
10
|
-
import { useOrderBuffers, useBufferMembers } from "../../hooks/useOrderBuffers";
|
|
11
|
-
import { isSameDay } from "../../lib/pickDate";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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,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,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
|
-
|
|
36
|
-
|
|
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}
|
|
40
|
-
return `${moment} — Aanmeldmail volgt om ${fmtTime(g.send_at, tz)} naar ${g.carrier_name} · ${g.cart_count}
|
|
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 +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;
|
|
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"}
|