@flowselections/floriday-afhandeling-module 1.0.8 → 1.0.10

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 (94) hide show
  1. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts +9 -0
  2. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -0
  3. package/dist-lib/components/afhandeling/DagDetailDialog.js +145 -0
  4. package/dist-lib/components/afhandeling/LeveringenPage.d.ts.map +1 -1
  5. package/dist-lib/components/afhandeling/LeveringenPage.js +17 -69
  6. package/dist-lib/components/afhandeling/PickAgendaView.d.ts +6 -0
  7. package/dist-lib/components/afhandeling/PickAgendaView.d.ts.map +1 -0
  8. package/dist-lib/components/afhandeling/PickAgendaView.js +40 -0
  9. package/dist-lib/components/afhandeling/PickingPage.d.ts +2 -0
  10. package/dist-lib/components/afhandeling/PickingPage.d.ts.map +1 -0
  11. package/dist-lib/components/afhandeling/PickingPage.js +5 -0
  12. package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts +9 -0
  13. package/dist-lib/components/afhandeling/PlanningAgendaPage.d.ts.map +1 -0
  14. package/dist-lib/components/afhandeling/PlanningAgendaPage.js +7 -0
  15. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts +12 -0
  16. package/dist-lib/components/afhandeling/ServiceAreaSelect.d.ts.map +1 -0
  17. package/dist-lib/components/afhandeling/ServiceAreaSelect.js +79 -0
  18. package/dist-lib/components/afhandeling/VervoerderForm.d.ts.map +1 -1
  19. package/dist-lib/components/afhandeling/VervoerderForm.js +73 -12
  20. package/dist-lib/components/afhandeling/VervoerdersPage.d.ts.map +1 -1
  21. package/dist-lib/components/afhandeling/VervoerdersPage.js +23 -5
  22. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts +13 -0
  23. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -0
  24. package/dist-lib/components/afhandeling/WeekAgendaView.js +142 -0
  25. package/dist-lib/components/pickstation/LanguagePicker.d.ts +5 -0
  26. package/dist-lib/components/pickstation/LanguagePicker.d.ts.map +1 -0
  27. package/dist-lib/components/pickstation/LanguagePicker.js +5 -0
  28. package/dist-lib/components/pickstation/PakbonTemplate.d.ts +20 -0
  29. package/dist-lib/components/pickstation/PakbonTemplate.d.ts.map +1 -0
  30. package/dist-lib/components/pickstation/PakbonTemplate.js +76 -0
  31. package/dist-lib/components/pickstation/printDocuments.d.ts +3 -0
  32. package/dist-lib/components/pickstation/printDocuments.d.ts.map +1 -0
  33. package/dist-lib/components/pickstation/printDocuments.js +53 -0
  34. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts +2 -0
  35. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -0
  36. package/dist-lib/components/settings/AfhandelingSettingsCard.js +72 -0
  37. package/dist-lib/components/settings/VervoerdersSettingsCard.d.ts +2 -0
  38. package/dist-lib/components/settings/VervoerdersSettingsCard.d.ts.map +1 -0
  39. package/dist-lib/components/settings/VervoerdersSettingsCard.js +30 -0
  40. package/dist-lib/hooks/useOrderPlanning.d.ts +17 -0
  41. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -0
  42. package/dist-lib/hooks/useOrderPlanning.js +131 -0
  43. package/dist-lib/index.d.ts +5 -0
  44. package/dist-lib/index.d.ts.map +1 -1
  45. package/dist-lib/index.js +16 -6
  46. package/dist-lib/integrations/supabase/auth-middleware.d.ts +2793 -137
  47. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  48. package/dist-lib/integrations/supabase/client.d.ts +2793 -137
  49. package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
  50. package/dist-lib/integrations/supabase/client.server.d.ts +2793 -137
  51. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  52. package/dist-lib/integrations/supabase/types.d.ts +2870 -131
  53. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  54. package/dist-lib/integrations/supabase/types.js +2 -0
  55. package/dist-lib/lib/afhandelingSettings.functions.d.ts +18597 -0
  56. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -0
  57. package/dist-lib/lib/afhandelingSettings.functions.js +98 -0
  58. package/dist-lib/lib/carrierSignupMail.server.d.ts +56 -0
  59. package/dist-lib/lib/carrierSignupMail.server.d.ts.map +1 -0
  60. package/dist-lib/lib/carrierSignupMail.server.js +229 -0
  61. package/dist-lib/lib/carriers.functions.d.ts +34091 -14161
  62. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  63. package/dist-lib/lib/carriers.functions.js +69 -6
  64. package/dist-lib/lib/cartAssignments.functions.d.ts +46479 -0
  65. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -0
  66. package/dist-lib/lib/cartAssignments.functions.js +130 -0
  67. package/dist-lib/lib/cartMoveImpact.d.ts +8 -0
  68. package/dist-lib/lib/cartMoveImpact.d.ts.map +1 -0
  69. package/dist-lib/lib/cartMoveImpact.js +26 -0
  70. package/dist-lib/lib/floriday.functions.d.ts +2798 -137
  71. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  72. package/dist-lib/lib/floriday.functions.js +178 -93
  73. package/dist-lib/lib/geo/euServiceAreas.d.ts +30 -0
  74. package/dist-lib/lib/geo/euServiceAreas.d.ts.map +1 -0
  75. package/dist-lib/lib/geo/euServiceAreas.js +277 -0
  76. package/dist-lib/lib/invalidatePlanning.d.ts +11 -0
  77. package/dist-lib/lib/invalidatePlanning.d.ts.map +1 -0
  78. package/dist-lib/lib/invalidatePlanning.js +25 -0
  79. package/dist-lib/lib/pickDate.d.ts +21 -0
  80. package/dist-lib/lib/pickDate.d.ts.map +1 -0
  81. package/dist-lib/lib/pickDate.js +71 -0
  82. package/dist-lib/lib/pickstationI18n.d.ts +35 -0
  83. package/dist-lib/lib/pickstationI18n.d.ts.map +1 -0
  84. package/dist-lib/lib/pickstationI18n.js +171 -0
  85. package/dist-lib/lib/pickstationOrders.server.d.ts +9 -0
  86. package/dist-lib/lib/pickstationOrders.server.d.ts.map +1 -0
  87. package/dist-lib/lib/pickstationOrders.server.js +372 -0
  88. package/dist-lib/lib/pickstationTypes.d.ts +26 -0
  89. package/dist-lib/lib/pickstationTypes.d.ts.map +1 -0
  90. package/dist-lib/lib/pickstationTypes.js +1 -0
  91. package/dist-lib/lib/planning.d.ts +82 -0
  92. package/dist-lib/lib/planning.d.ts.map +1 -0
  93. package/dist-lib/lib/planning.js +243 -0
  94. package/package.json +12 -6
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
+ import { useServerFn } from "@tanstack/react-start";
5
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, Input, Label, Switch, toast, } from "@flowselections/core";
6
+ import { CalendarClock, Mail, Scale } from "lucide-react";
7
+ import { getAfhandelingSettings, updateAfhandelingSettings, } from "../../lib/afhandelingSettings.functions";
8
+ export function AfhandelingSettingsCard() {
9
+ const qc = useQueryClient();
10
+ const fetchSettings = useServerFn(getAfhandelingSettings);
11
+ const saveSettings = useServerFn(updateAfhandelingSettings);
12
+ const { data } = useQuery({
13
+ queryKey: ["afhandeling", "settings"],
14
+ queryFn: async () => {
15
+ try {
16
+ return await fetchSettings();
17
+ }
18
+ catch {
19
+ return {
20
+ pickDaysBeforeTransport: 1,
21
+ transportRegisterDaysBefore: 1,
22
+ pickDistributionEnabled: false,
23
+ maxWorkdaysEarlierPick: 2,
24
+ signupMailEnabled: false,
25
+ signupMailLeadMinutes: 60,
26
+ signupMailPurpose: "afhandeling_carrier_signup",
27
+ };
28
+ }
29
+ },
30
+ });
31
+ const [pickDays, setPickDays] = useState(1);
32
+ const [registerDays, setRegisterDays] = useState(1);
33
+ const [distributionEnabled, setDistributionEnabled] = useState(false);
34
+ const [maxEarlier, setMaxEarlier] = useState(2);
35
+ const [mailEnabled, setMailEnabled] = useState(false);
36
+ const [mailLead, setMailLead] = useState(60);
37
+ const [mailPurpose, setMailPurpose] = useState("afhandeling_carrier_signup");
38
+ useEffect(() => {
39
+ if (data) {
40
+ setPickDays(data.pickDaysBeforeTransport);
41
+ setRegisterDays(data.transportRegisterDaysBefore);
42
+ setDistributionEnabled(Boolean(data.pickDistributionEnabled));
43
+ setMaxEarlier(data.maxWorkdaysEarlierPick ?? 2);
44
+ setMailEnabled(Boolean(data.signupMailEnabled));
45
+ setMailLead(data.signupMailLeadMinutes ?? 60);
46
+ setMailPurpose(data.signupMailPurpose ?? "afhandeling_carrier_signup");
47
+ }
48
+ }, [data]);
49
+ const mutation = useMutation({
50
+ mutationFn: async () => saveSettings({
51
+ data: {
52
+ pickDaysBeforeTransport: pickDays,
53
+ transportRegisterDaysBefore: registerDays,
54
+ pickDistributionEnabled: distributionEnabled,
55
+ maxWorkdaysEarlierPick: maxEarlier,
56
+ signupMailEnabled: mailEnabled,
57
+ signupMailLeadMinutes: mailLead,
58
+ signupMailPurpose: mailPurpose,
59
+ },
60
+ }),
61
+ onSuccess: async () => {
62
+ const { invalidatePlanning } = await import("../../lib/invalidatePlanning");
63
+ await invalidatePlanning(qc);
64
+ toast.success("Instellingen opgeslagen — planning herberekend");
65
+ },
66
+ onError: (e) => {
67
+ toast.error(e instanceof Error ? e.message : "Opslaan mislukt");
68
+ },
69
+ });
70
+ const clamp = (n) => Math.max(0, Math.min(30, Math.floor(n) || 0));
71
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarClock, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Afhandeling \u2014 Planning" })] }), _jsx(CardDescription, { children: "Centrale werkdag-instellingen voor de automatische order\u00ADplanning. Alle berekeningen tellen alleen werkdagen (ma\u2013vr)." })] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "pickDays", children: "Aantal pickdagen (werkdagen v\u00F3\u00F3r ophaaldag)" }), _jsx(Input, { id: "pickDays", type: "number", min: 0, max: 30, value: pickDays, onChange: (e) => setPickDays(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Wordt vanaf de berekende ophaaldag teruggeteld om de uiterste pickdatum te bepalen." })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Scale, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "pickDistribution", className: "font-semibold", children: "Pickverdeling" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verdeelt de pickbelasting automatisch over werkdagen. Orders mogen eerder ingepland worden, maar nooit later dan de berekende uiterste pickdatum \u2014 leverbetrouwbaarheid blijft gegarandeerd." })] }), _jsx(Switch, { id: "pickDistribution", checked: distributionEnabled, onCheckedChange: setDistributionEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "maxEarlier", children: "Maximaal aantal werkdagen eerder picken" }), _jsx(Input, { id: "maxEarlier", type: "number", min: 0, max: 30, value: maxEarlier, disabled: !distributionEnabled, onChange: (e) => setMaxEarlier(clamp(Number(e.target.value))) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "0 = geen vervroeging. Bijv. 2 = orders mogen maximaal 2 werkdagen voor hun uiterste pickdatum ingepland worden." })] })] }), _jsxs("div", { className: "rounded-md border p-4 space-y-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-4 w-4 text-primary" }), _jsx(Label, { htmlFor: "mailEnabled", className: "font-semibold", children: "Aanmeldmail vervoerders" })] }), _jsx("p", { className: "text-xs text-muted-foreground max-w-prose", children: "Verstuurt automatisch een mail met de te verwachten karren naar de vervoerder v\u00F3\u00F3r de aanmelddeadline van het ophaalmoment. E\u00E9n mail per ophaaldag/-moment per vervoerder." })] }), _jsx(Switch, { id: "mailEnabled", checked: mailEnabled, onCheckedChange: setMailEnabled })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailLead", children: "Minuten v\u00F3\u00F3r aanmelddeadline versturen" }), _jsx(Input, { id: "mailLead", type: "number", min: 0, max: 1440, value: mailLead, disabled: !mailEnabled, onChange: (e) => setMailLead(Math.max(0, Math.min(1440, Math.floor(Number(e.target.value)) || 0))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "mailPurpose", children: "E-mail-doeleinde (purpose)" }), _jsx(Input, { id: "mailPurpose", value: mailPurpose, disabled: !mailEnabled, onChange: (e) => setMailPurpose(e.target.value) }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Koppel dit doeleinde in de module ", _jsx("strong", { children: "E-mailkoppeling" }), " aan een actief send-adres. Standaard: ", _jsx("code", { children: "afhandeling_carrier_signup" }), "."] })] })] }), _jsxs("div", { className: "rounded-md bg-muted/50 p-3 text-xs text-muted-foreground", children: [_jsx("strong", { children: "Ophaaltijd" }), " en ", _jsx("strong", { children: "Aanmeldtijd" }), " stel je per vervoerder in (werkdagen v\u00F3\u00F3r bezorgdag). De vervoerder die als ", _jsx("strong", { children: "standaard" }), " is gemarkeerd, wordt gebruikt voor orders zonder eigen vervoerder."] }), _jsx(Button, { onClick: () => mutation.mutate(), disabled: mutation.isPending, children: mutation.isPending ? "Opslaan…" : "Opslaan" })] })] }));
72
+ }
@@ -0,0 +1,2 @@
1
+ export declare function VervoerdersSettingsCard(): import("react").JSX.Element;
2
+ //# sourceMappingURL=VervoerdersSettingsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VervoerdersSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/components/settings/VervoerdersSettingsCard.tsx"],"names":[],"mappings":"AAcA,wBAAgB,uBAAuB,gCAwDtC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle, Button, } from "@flowselections/core";
3
+ import { Building2, Truck, ArrowRight } from "lucide-react";
4
+ import { Link } from "@tanstack/react-router";
5
+ import { useServerFn } from "@tanstack/react-start";
6
+ import { useQuery } from "@tanstack/react-query";
7
+ import { listCarriers } from "../../lib/carriers.functions";
8
+ export function VervoerdersSettingsCard() {
9
+ const fetchList = useServerFn(listCarriers);
10
+ const { data, isLoading } = useQuery({
11
+ queryKey: ["carriers"],
12
+ queryFn: async () => {
13
+ try {
14
+ return await fetchList();
15
+ }
16
+ catch (e) {
17
+ if (e instanceof Response) {
18
+ const text = await e.text().catch(() => e.statusText);
19
+ throw new Error(`${e.status}: ${text}`);
20
+ }
21
+ throw e;
22
+ }
23
+ },
24
+ });
25
+ const carriers = data?.carriers ?? [];
26
+ const defaultCarrier = carriers.find((c) => c.is_default);
27
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Truck, { className: "h-5 w-5 text-primary" }), _jsx(CardTitle, { children: "Vervoerders" })] }), _jsx(CardDescription, { children: "Beheer vervoerders en hun verzendtarieven per land. De standaard vervoerder wordt gebruikt voor orders zonder eigen vervoerder." })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-4 rounded-md bg-muted/50 p-4", children: [_jsx("div", { className: "flex h-10 w-10 items-center justify-center rounded-full bg-primary/10", children: _jsx(Building2, { className: "h-5 w-5 text-primary" }) }), _jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium", children: isLoading ? "Laden..." : `${carriers.length} vervoerder${carriers.length === 1 ? "" : "s"}` }), _jsx("div", { className: "text-xs text-muted-foreground", children: defaultCarrier
28
+ ? `Standaard: ${defaultCarrier.name}`
29
+ : "Geen standaard vervoerder ingesteld" })] })] }), _jsx(Button, { asChild: true, children: _jsxs(Link, { to: "/afhandeling/vervoerders", children: ["Beheer vervoerders", _jsx(ArrowRight, { className: "ml-2 h-4 w-4" })] }) })] })] }));
30
+ }
@@ -0,0 +1,17 @@
1
+ import type { FloridayOrder } from "../lib/floriday.functions";
2
+ import { type CartOverride } from "../lib/cartAssignments.functions";
3
+ import { type OrderPlanning } from "../lib/planning";
4
+ export interface PlannedOrder {
5
+ order: FloridayOrder;
6
+ planning: OrderPlanning | null;
7
+ }
8
+ export interface UseOrderPlanningResult {
9
+ planned: PlannedOrder[];
10
+ overrides: CartOverride[];
11
+ isLoading: boolean;
12
+ error?: string;
13
+ warning?: string;
14
+ refetch: () => void;
15
+ }
16
+ export declare function useOrderPlanning(): UseOrderPlanningResult;
17
+ //# sourceMappingURL=useOrderPlanning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrderPlanning.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderPlanning.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,IAAI,sBAAsB,CAuHzD"}
@@ -0,0 +1,131 @@
1
+ import { useMemo } from "react";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { useServerFn } from "@tanstack/react-start";
4
+ import { getFloridayOrders } from "../lib/floriday.functions";
5
+ import { getAfhandelingSettings } from "../lib/afhandelingSettings.functions";
6
+ import { listCarriers } from "../lib/carriers.functions";
7
+ import { listCartOverrides } from "../lib/cartAssignments.functions";
8
+ import { calculateOrderPlanning, distributePickDates, DEFAULT_PICKUP_MOMENT, } from "../lib/planning";
9
+ export function useOrderPlanning() {
10
+ const fetchOrders = useServerFn(getFloridayOrders);
11
+ const fetchSettings = useServerFn(getAfhandelingSettings);
12
+ const fetchCarriers = useServerFn(listCarriers);
13
+ const fetchOverrides = useServerFn(listCartOverrides);
14
+ const ordersQuery = useQuery({
15
+ queryKey: ["floriday", "orders"],
16
+ queryFn: async () => {
17
+ try {
18
+ const result = await fetchOrders();
19
+ if (result.error) {
20
+ console.warn("[useOrderPlanning] orders loaded with warning", {
21
+ message: result.error,
22
+ orderCount: result.orders.length,
23
+ });
24
+ }
25
+ return result;
26
+ }
27
+ catch (e) {
28
+ let message = "Onbekende fout";
29
+ if (e instanceof Response) {
30
+ const text = await e.clone().text().catch(() => "");
31
+ message = `Floriday-aanvraag mislukt (${e.status}): ${text.slice(0, 200) || e.statusText}`;
32
+ }
33
+ else if (e instanceof Error) {
34
+ message = e.message;
35
+ }
36
+ else {
37
+ message = String(e);
38
+ }
39
+ console.error("[useOrderPlanning] orders load failed", {
40
+ message,
41
+ action: "fetch planning orders",
42
+ });
43
+ return { orders: [], error: message };
44
+ }
45
+ },
46
+ retry: false,
47
+ });
48
+ const settingsQuery = useQuery({
49
+ queryKey: ["afhandeling", "settings"],
50
+ queryFn: async () => {
51
+ try {
52
+ return await fetchSettings();
53
+ }
54
+ catch {
55
+ return { pickDaysBeforeTransport: 1, transportRegisterDaysBefore: 1, pickDistributionEnabled: false, maxWorkdaysEarlierPick: 2 };
56
+ }
57
+ },
58
+ });
59
+ const carriersQuery = useQuery({
60
+ queryKey: ["carriers"],
61
+ queryFn: async () => {
62
+ try {
63
+ return await fetchCarriers();
64
+ }
65
+ catch {
66
+ return { carriers: [] };
67
+ }
68
+ },
69
+ retry: false,
70
+ });
71
+ const overridesQuery = useQuery({
72
+ queryKey: ["cart-overrides"],
73
+ queryFn: async () => {
74
+ try {
75
+ return await fetchOverrides();
76
+ }
77
+ catch {
78
+ return { overrides: [] };
79
+ }
80
+ },
81
+ retry: false,
82
+ });
83
+ const planned = useMemo(() => {
84
+ const orders = ordersQuery.data?.orders ?? [];
85
+ const settings = settingsQuery.data ?? {
86
+ pickDaysBeforeTransport: 1,
87
+ transportRegisterDaysBefore: 1,
88
+ pickDistributionEnabled: false,
89
+ maxWorkdaysEarlierPick: 2,
90
+ };
91
+ const carriers = carriersQuery.data?.carriers ?? [];
92
+ const overrides = overridesQuery.data?.overrides ?? [];
93
+ const defaultCarrier = carriers.find((c) => c.is_default);
94
+ const moments = defaultCarrier && defaultCarrier.pickup_moments.length > 0
95
+ ? defaultCarrier.pickup_moments
96
+ : [DEFAULT_PICKUP_MOMENT];
97
+ const overrideMap = new Map();
98
+ for (const o of overrides) {
99
+ overrideMap.set(`${o.order_source}#${o.order_id}#${o.cart_index}`, {
100
+ date: new Date(o.pick_date),
101
+ movedFromDate: o.moved_from_date ? new Date(o.moved_from_date) : null,
102
+ });
103
+ }
104
+ const initial = orders.map((order) => ({
105
+ order,
106
+ planning: calculateOrderPlanning(order.deliveryDate, {
107
+ pickupMoments: moments,
108
+ pickDurationWorkdays: settings.pickDaysBeforeTransport,
109
+ orderCreatedAt: order.createdAt,
110
+ }),
111
+ }));
112
+ const distributed = distributePickDates(initial, {
113
+ enabled: Boolean(settings.pickDistributionEnabled),
114
+ maxWorkdaysEarlier: settings.maxWorkdaysEarlierPick ?? 0,
115
+ getCartCount: (it) => it.order.cartCount ?? 1,
116
+ getCartOverride: (it, idx) => {
117
+ const src = it.order.source;
118
+ return overrideMap.get(`${src}#${it.order.id}#${idx}`) ?? null;
119
+ },
120
+ });
121
+ return distributed;
122
+ }, [ordersQuery.data, settingsQuery.data, carriersQuery.data, overridesQuery.data]);
123
+ return {
124
+ planned,
125
+ overrides: overridesQuery.data?.overrides ?? [],
126
+ isLoading: ordersQuery.isLoading || settingsQuery.isLoading || carriersQuery.isLoading || overridesQuery.isLoading,
127
+ error: ordersQuery.data?.orders?.length ? undefined : ordersQuery.data?.error,
128
+ warning: ordersQuery.data?.orders?.length ? ordersQuery.data?.error : undefined,
129
+ refetch: () => { void ordersQuery.refetch(); void overridesQuery.refetch(); },
130
+ };
131
+ }
@@ -3,5 +3,10 @@ export * from "./_core-safelist";
3
3
  export { LeveringenPage } from "./components/afhandeling/LeveringenPage";
4
4
  export { VervoerdersPage } from "./components/afhandeling/VervoerdersPage";
5
5
  export { NieuweLeveringPage } from "./components/afhandeling/NieuweLeveringPage";
6
+ export { PickAgendaView } from "./components/afhandeling/PickAgendaView";
7
+ export { PickingPage } from "./components/afhandeling/PickingPage";
8
+ export { PlanningAgendaPage } from "./components/afhandeling/PlanningAgendaPage";
9
+ export { AfhandelingSettingsCard } from "./components/settings/AfhandelingSettingsCard";
10
+ export { VervoerdersSettingsCard } from "./components/settings/VervoerdersSettingsCard";
6
11
  export declare const floridayAfhandelingModule: FlowModule;
7
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAEjF,eAAO,MAAM,yBAAyB,EAAE,UAcvC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAKxF,eAAO,MAAM,yBAAyB,EAAE,UAiBvC,CAAC"}
package/dist-lib/index.js CHANGED
@@ -1,20 +1,30 @@
1
- import { PackageCheck, Truck, Building2 } from "lucide-react";
1
+ import { PackageCheck, CalendarCheck, CalendarRange } from "lucide-react";
2
2
  export * from "./_core-safelist";
3
3
  export { LeveringenPage } from "./components/afhandeling/LeveringenPage";
4
4
  export { VervoerdersPage } from "./components/afhandeling/VervoerdersPage";
5
5
  export { NieuweLeveringPage } from "./components/afhandeling/NieuweLeveringPage";
6
+ export { PickAgendaView } from "./components/afhandeling/PickAgendaView";
7
+ export { PickingPage } from "./components/afhandeling/PickingPage";
8
+ export { PlanningAgendaPage } from "./components/afhandeling/PlanningAgendaPage";
9
+ export { AfhandelingSettingsCard } from "./components/settings/AfhandelingSettingsCard";
10
+ export { VervoerdersSettingsCard } from "./components/settings/VervoerdersSettingsCard";
11
+ import { AfhandelingSettingsCard } from "./components/settings/AfhandelingSettingsCard";
12
+ import { VervoerdersSettingsCard } from "./components/settings/VervoerdersSettingsCard";
6
13
  export const floridayAfhandelingModule = {
7
14
  id: "afhandeling",
8
15
  name: "Afhandeling",
9
- version: "1.0.0",
16
+ version: "1.2.0",
10
17
  nav: {
11
18
  label: "Afhandeling",
12
- href: "/afhandeling/leveringen",
19
+ href: "/afhandeling/picking",
13
20
  icon: PackageCheck,
14
21
  children: [
15
- { label: "Leveringen", href: "/afhandeling/leveringen", icon: Truck },
16
- { label: "Vervoerders", href: "/afhandeling/vervoerders", icon: Building2 },
22
+ { label: "Pick Agenda", href: "/afhandeling/picking", icon: CalendarCheck },
23
+ { label: "Planning en leveringen", href: "/afhandeling/leveringen", icon: CalendarRange },
17
24
  ],
18
25
  },
19
- settingsCards: [],
26
+ settingsCards: [
27
+ { component: VervoerdersSettingsCard, order: 80 },
28
+ { component: AfhandelingSettingsCard, order: 100 },
29
+ ],
20
30
  };