@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
@@ -1,34 +1,34 @@
1
- export interface DeliveryNoteItem {
2
- id: string;
3
- salesOrderId?: string | null;
4
- deliveryOrderId?: string | null;
5
- fulfillmentOrderId?: string | null;
6
- }
7
- /** Haalt de signed URL van een enkele afleverbrief op. */
8
- export declare function fetchDeliveryNoteUrl(salesOrderId: string): Promise<string>;
9
- /** Print een PDF vanaf een (signed) URL via de printwachtrij. */
10
- export declare function printPdfFromUrl(url: string, opties: {
11
- documentnaam: string;
12
- isHerprint?: boolean;
13
- }): Promise<void>;
14
- /** Haal en print één afleverbrief. */
15
- export declare function printDeliveryNote(salesOrderId: string, opties?: {
16
- documentnaam?: string;
17
- isHerprint?: boolean;
18
- }): Promise<void>;
19
- export interface BulkPrintResult {
20
- total: number;
21
- success: number;
22
- failed: Array<{
23
- id: string;
24
- error: string;
25
- }>;
26
- }
27
- /**
28
- * Print meerdere afleverbrieven als samengevoegde PDF's van maximaal 25 stuks.
29
- * Te grote opdrachten worden automatisch verder opgeknipt.
30
- */
31
- export declare function printDeliveryNotesMerged(items: DeliveryNoteItem[], opties?: {
32
- isHerprint?: boolean;
33
- }): Promise<BulkPrintResult>;
1
+ export interface DeliveryNoteItem {
2
+ id: string;
3
+ salesOrderId?: string | null;
4
+ deliveryOrderId?: string | null;
5
+ fulfillmentOrderId?: string | null;
6
+ }
7
+ /** Haalt de signed URL van een enkele afleverbrief op. */
8
+ export declare function fetchDeliveryNoteUrl(salesOrderId: string): Promise<string>;
9
+ /** Print een PDF vanaf een (signed) URL via de printwachtrij. */
10
+ export declare function printPdfFromUrl(url: string, opties: {
11
+ documentnaam: string;
12
+ isHerprint?: boolean;
13
+ }): Promise<void>;
14
+ /** Haal en print één afleverbrief. */
15
+ export declare function printDeliveryNote(salesOrderId: string, opties?: {
16
+ documentnaam?: string;
17
+ isHerprint?: boolean;
18
+ }): Promise<void>;
19
+ export interface BulkPrintResult {
20
+ total: number;
21
+ success: number;
22
+ failed: Array<{
23
+ id: string;
24
+ error: string;
25
+ }>;
26
+ }
27
+ /**
28
+ * Print meerdere afleverbrieven als samengevoegde PDF's van maximaal 25 stuks.
29
+ * Te grote opdrachten worden automatisch verder opgeknipt.
30
+ */
31
+ export declare function printDeliveryNotesMerged(items: DeliveryNoteItem[], opties?: {
32
+ isHerprint?: boolean;
33
+ }): Promise<BulkPrintResult>;
34
34
  //# sourceMappingURL=deliveryNotePrint.d.ts.map
@@ -2,9 +2,9 @@
2
2
  // via de gateway-endpoints van de Authenticatie-module.
3
3
  // De Authenticatie-module accepteert een Supabase Bearer-token en stuurt
4
4
  // CORS-headers, dus we bellen direct cross-origin — geen eigen proxy nodig.
5
- import { printPdfBase64 } from "../components/pickstation/printDocuments";
6
- import { supabase } from "../integrations/supabase/moduleClient";
7
- import { resolveGatewayBaseClient } from "./gatewayBase";
5
+ import { printPdfBase64 } from "../components/pickstation/printDocuments.js";
6
+ import { supabase } from "../integrations/supabase/moduleClient.js";
7
+ import { resolveGatewayBaseClient } from "./gatewayBase.js";
8
8
  let floridayEnvironmentPromise = null;
9
9
  async function getFloridayEnvironment() {
10
10
  floridayEnvironmentPromise ?? (floridayEnvironmentPromise = Promise.resolve(supabase.from("floriday_settings").select("active_environment").eq("id", 1).maybeSingle()).then(({ data, error }) => {
@@ -11,7 +11,7 @@ export interface EngineLayoutKeuze {
11
11
  * niets ingesteld, dan komt er null terug (fail closed).
12
12
  */
13
13
  export declare const getShippingNoteLayout: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
14
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
14
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
15
15
  userId: string;
16
16
  claims: import("@supabase/auth-js").JwtPayload;
17
17
  }, undefined, undefined, undefined>], undefined, Promise<EngineLayoutKeuze>>;
@@ -1,5 +1,5 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
2
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
3
3
  function leesLayoutVeld(settings, veld) {
4
4
  const s = (settings ?? {});
5
5
  const pick = (s["pickstations"] ?? {});
@@ -55,7 +55,7 @@ export interface GetFloridayOrdersResult {
55
55
  * om extra gegevens (stickers) op te zoeken bij orders die al bestaan.
56
56
  */
57
57
  export declare const getFloridayOrders: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
58
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
58
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
59
59
  userId: string;
60
60
  claims: import("@supabase/auth-js").JwtPayload;
61
61
  }, undefined, undefined, undefined>], (input: GetFloridayOrdersInput | undefined) => GetFloridayOrdersInput, Promise<GetFloridayOrdersResult>>;
@@ -72,7 +72,7 @@ export interface KnownOrderRef {
72
72
  * gereserveerde orders verdwijnen hieruit.
73
73
  */
74
74
  export declare const listKnownOrders: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
75
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
75
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
76
76
  userId: string;
77
77
  claims: import("@supabase/auth-js").JwtPayload;
78
78
  }, undefined, undefined, undefined>], undefined, Promise<{
@@ -1,6 +1,6 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
3
- import { isVisibleOrderStatus } from "./orderStatus";
2
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
3
+ import { isVisibleOrderStatus } from "./orderStatus.js";
4
4
  function dayKey(d) {
5
5
  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
6
6
  }
@@ -1,8 +1,8 @@
1
1
  // Client-side wrapper voor de Floriday auto-verwerking-endpoints van de
2
2
  // Authenticatie-module. Roept de gateway direct cross-origin aan met het
3
3
  // Supabase Bearer-token van de ingelogde gebruiker.
4
- import { supabase } from "../integrations/supabase/moduleClient";
5
- import { resolveGatewayBaseClient } from "./gatewayBase";
4
+ import { supabase } from "../integrations/supabase/moduleClient.js";
5
+ import { resolveGatewayBaseClient } from "./gatewayBase.js";
6
6
  async function getAccessToken() {
7
7
  const { data } = await supabase.auth.getSession();
8
8
  const token = data.session?.access_token;
@@ -2,9 +2,9 @@
2
2
  // - fulfillment-order/status { salesOrderIds } → fulfillmentRequestId + deliveryOrderId per order
3
3
  // - fulfillment-order/send { deliveryOrderId, ... } → belading (enige route voor belading)
4
4
  // Adres en geheim komen uit de omgeving; ontbreken ze, dan volgt een fout (fail closed).
5
- import { resolveGatewayBaseServer } from "./gatewayBase.server";
6
- import { getFloridayGatewaySecret } from "./centralSecrets.server";
7
- import { signBody } from "./authGateway.server";
5
+ import { resolveGatewayBaseServer } from "./gatewayBase.server.js";
6
+ import { getFloridayGatewaySecret } from "./centralSecrets.server.js";
7
+ import { signBody } from "./authGateway.server.js";
8
8
  async function signedPost(path, payload) {
9
9
  const secret = await getFloridayGatewaySecret(); // throws als het ontbreekt
10
10
  const base = await resolveGatewayBaseServer(); // throws als het ontbreekt
@@ -77,7 +77,7 @@ export declare const LOAD_CARRIER_REF_MAX = 14;
77
77
  export declare const ACCEPTED: Set<string>;
78
78
  /** Stelt de belading samen en toont de controles. Verstuurt niets. */
79
79
  export declare const prepareFloridayLoading: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
80
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
80
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
81
81
  userId: string;
82
82
  claims: import("@supabase/auth-js").JwtPayload;
83
83
  }, undefined, undefined, undefined>], (d: {
@@ -92,7 +92,7 @@ export declare const prepareFloridayLoading: import("@tanstack/start-client-core
92
92
  * floriday_loading_attempts. Herhalen gebruikt altijd dezelfde fulfillmentOrderId.
93
93
  */
94
94
  export declare const sendFloridayLoading: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
95
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
95
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
96
96
  userId: string;
97
97
  claims: import("@supabase/auth-js").JwtPayload;
98
98
  }, undefined, undefined, undefined>], (d: {
@@ -4,7 +4,7 @@
4
4
  // `floriday_loading_identifiers`; de Floriday-koppeling geeft ze ongewijzigd door.
5
5
  // Sets: Floriday knipt een set op in losse verkooporders → één regel per onderdeel.
6
6
  import { createServerFn } from "@tanstack/react-start";
7
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
7
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
8
8
  const arr = (v) => (Array.isArray(v) ? v : []);
9
9
  const num = (v) => v == null || v === "" || !Number.isFinite(Number(v)) ? null : Number(v);
10
10
  /** Floriday 2026v1 AddLoadCarrierConfiguration.loadCarrierReference: maximaal 14 tekens. */
@@ -163,7 +163,7 @@ async function buildLoading(supabase, orderRef) {
163
163
  let status = new Map();
164
164
  let statusFailed = false;
165
165
  try {
166
- const { fetchFulfillmentStatus } = await import("./floridayFulfillmentSend.server");
166
+ const { fetchFulfillmentStatus } = await import("./floridayFulfillmentSend.server.js");
167
167
  status = await fetchFulfillmentStatus(soIds, baseFo ? [baseFo] : []);
168
168
  }
169
169
  catch (e) {
@@ -392,7 +392,7 @@ export async function prepareLoadingServer(supabase, orderRef) {
392
392
  * gebruiken allebei deze functie met dezelfde vaste kenmerken.
393
393
  */
394
394
  export async function runLoadingSend(supabase, p, actor) {
395
- const { sendFulfillmentOrder, floridayFoutTekst } = await import("./floridayFulfillmentSend.server");
395
+ const { sendFulfillmentOrder, floridayFoutTekst } = await import("./floridayFulfillmentSend.server.js");
396
396
  const log = async (s, row) => {
397
397
  const rs = row.request_summary ?? {};
398
398
  const { error } = await supabase.from("floriday_loading_attempts").insert({
@@ -1,7 +1,7 @@
1
1
  // Server-only resolver voor de gateway-base-URL.
2
2
  // Volgorde: PUBLIC_BASE_URL (shell levert dit) → central /api/shell-host.
3
3
  // Nooit stille fallback: throw als niets werkt.
4
- import { getShellHost } from "./centralSecrets.server";
4
+ import { getShellHost } from "./centralSecrets.server.js";
5
5
  function strip(url) {
6
6
  const trimmed = url.trim().replace(/\/$/, "");
7
7
  if (!/^https?:\/\//i.test(trimmed)) {
@@ -1,4 +1,4 @@
1
- import { resetAllCartOverrides } from "./cartAssignments.functions";
1
+ import { resetAllCartOverrides } from "./cartAssignments.functions.js";
2
2
  /**
3
3
  * Invalideer alle queries die invloed hebben op de logistieke planning:
4
4
  * orders, instellingen, vervoerders. Hierdoor herberekent useOrderPlanning
@@ -4,7 +4,7 @@
4
4
  * Deze module beslist zelf niets meer over buffering, belading, picken of
5
5
  * transport. Alle besluiten komen van de Rule Engine (stap 3 "Order picken").
6
6
  */
7
- import { supabase } from "../../integrations/supabase/moduleClient";
7
+ import { supabase } from "../../integrations/supabase/moduleClient.js";
8
8
  export const OWNER_MODULE = "afhandeling";
9
9
  export const SOURCE_MODULE = "afhandeling";
10
10
  /** Vraag het indelingsbesluit op. Nooit zelf indelen zonder dit besluit. */
@@ -2,8 +2,8 @@
2
2
  * Order verzetten — uitsluitend via de twee RPC's van de Logistics Engine.
3
3
  * Deze module rekent zelf niets uit en doet nooit een eigen UPDATE.
4
4
  */
5
- import { supabase } from "../../integrations/supabase/moduleClient";
6
- import { amsterdamDay, formatAmsterdam } from "../timezone";
5
+ import { supabase } from "../../integrations/supabase/moduleClient.js";
6
+ import { amsterdamDay, formatAmsterdam } from "../timezone.js";
7
7
  export async function previewReschedule(input) {
8
8
  const { data, error } = await supabase.rpc("logistics_reschedule_preview", {
9
9
  p_order_ref: input.orderRef,
@@ -1,5 +1,5 @@
1
1
  import { supabase } from "../../integrations/supabase/moduleClient.js";
2
- import { SOURCE_MODULE } from "./engine";
2
+ import { SOURCE_MODULE } from "./engine.js";
3
3
  export function toDateKey(d) {
4
4
  const m = String(d.getMonth() + 1).padStart(2, "0");
5
5
  const day = String(d.getDate()).padStart(2, "0");
@@ -12,7 +12,7 @@ export interface MarkOrderShippedResult {
12
12
  * schrijft alleen dezelfde waarde weg en raakt verder niets aan.
13
13
  */
14
14
  export declare const markOrderShipped: import("@tanstack/start-client-core").RequiredFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
15
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
15
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
16
16
  userId: string;
17
17
  claims: import("@supabase/auth-js").JwtPayload;
18
18
  }, undefined, undefined, undefined>], (input: MarkOrderShippedInput) => {
@@ -1,5 +1,5 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
2
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
3
3
  /** Status die de Verkoop Module gebruikt voor een afgehandelde order. */
4
4
  const SHIPPED_STATUS = "Verzonden";
5
5
  /**
@@ -20,7 +20,7 @@ export interface ListOrderPickDatesInput {
20
20
  to?: string;
21
21
  }
22
22
  export declare const listOrderPickDates: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
23
- supabase: import("../integrations/supabase/auth-middleware").AuthedSupabaseClient;
23
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
24
24
  userId: string;
25
25
  claims: import("@supabase/auth-js").JwtPayload;
26
26
  }, undefined, undefined, undefined>], (input: ListOrderPickDatesInput | undefined) => ListOrderPickDatesInput, Promise<{
@@ -1,6 +1,6 @@
1
1
  import { createServerFn } from "@tanstack/react-start";
2
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
3
- import { normalizeOrderNumber } from "./orderRefs";
2
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
3
+ import { normalizeOrderNumber } from "./orderRefs.js";
4
4
  function dayInAmsterdam(iso) {
5
5
  if (!iso)
6
6
  return null;
@@ -1,4 +1,4 @@
1
- import { supabase } from "../integrations/supabase/moduleClient";
1
+ import { supabase } from "../integrations/supabase/moduleClient.js";
2
2
  /** Nog nooit met succes opgehaald: werkwijze onbekend. */
3
3
  const UNKNOWN = { pickMode: null, showCartControl: false, status: "unknown" };
4
4
  const PICK_MODE_TIMEOUT_MS = 8000;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Laadt de pickwerkdagen uit de Werktijden (afh_pick_workdays →
3
+ * logistics_is_pick_workday, inclusief gesloten afwijkende dagen) en zet ze
4
+ * als enige werkdagkalender voor de planning. Ontbreekt de bron, dan blijft de
5
+ * kalender leeg en wordt er niet gepland (fail closed).
6
+ */
7
+ type RpcClient = {
8
+ rpc: (fn: string, args: Record<string, unknown>) => PromiseLike<{
9
+ data: unknown;
10
+ error: {
11
+ message: string;
12
+ } | null;
13
+ }>;
14
+ };
15
+ export declare function pickWorkdayRange(now?: Date): {
16
+ from: string;
17
+ to: string;
18
+ };
19
+ export declare function loadPickWorkdays(client: RpcClient): Promise<{
20
+ available: boolean;
21
+ count: number;
22
+ }>;
23
+ export {};
24
+ //# sourceMappingURL=pickWorkdays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickWorkdays.d.ts","sourceRoot":"","sources":["../../src/lib/pickWorkdays.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,KAAK,SAAS,GAAG;IACf,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,WAAW,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACvH,CAAC;AASF,wBAAgB,gBAAgB,CAAC,GAAG,OAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAM/E;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAexG"}
@@ -0,0 +1,30 @@
1
+ import { setPickWorkdayCalendar } from "./planning.js";
2
+ function iso(d) {
3
+ const y = d.getFullYear();
4
+ const m = String(d.getMonth() + 1).padStart(2, "0");
5
+ const day = String(d.getDate()).padStart(2, "0");
6
+ return `${y}-${m}-${day}`;
7
+ }
8
+ export function pickWorkdayRange(now = new Date()) {
9
+ const from = new Date(now);
10
+ from.setDate(from.getDate() - 120);
11
+ const to = new Date(now);
12
+ to.setDate(to.getDate() + 270);
13
+ return { from: iso(from), to: iso(to) };
14
+ }
15
+ export async function loadPickWorkdays(client) {
16
+ const { from, to } = pickWorkdayRange();
17
+ const { data, error } = await client.rpc("afh_pick_workdays", { p_from: from, p_to: to });
18
+ if (error) {
19
+ setPickWorkdayCalendar(null);
20
+ throw new Error(error.message);
21
+ }
22
+ const res = (data ?? {});
23
+ if (!res.available) {
24
+ setPickWorkdayCalendar(null);
25
+ return { available: false, count: 0 };
26
+ }
27
+ const workdays = Array.isArray(res.workdays) ? res.workdays : [];
28
+ setPickWorkdayCalendar({ workdays, from, to });
29
+ return { available: true, count: workdays.length };
30
+ }
@@ -1,6 +1,6 @@
1
1
  import { createClient } from "@supabase/supabase-js";
2
- import type { PickstationOrder } from "./pickstationTypes";
3
- export type { PickstationLine, PickstationOrder } from "./pickstationTypes";
2
+ import type { PickstationOrder } from "./pickstationTypes.js";
3
+ export type { PickstationLine, PickstationOrder } from "./pickstationTypes.js";
4
4
  export declare function loadTodaysPickstationOrders(client?: ReturnType<typeof createClient>): Promise<PickstationOrder[]>;
5
5
  export declare function fetchFloridayAuctionLetterPdf(_orderId: string): Promise<{
6
6
  base64: string;
@@ -1 +1 @@
1
- {"version":3,"file":"pickstationOrders.server.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationOrders.server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAgBrD,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA8P5E,wBAAsB,2BAA2B,CAC/C,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyW7B;AAED,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,CAER;AAED,kFAAkF;AAClF,wBAAsB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,CAGR;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,UAAU,GAAG,QAAQ,EAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,EACjE,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
1
+ {"version":3,"file":"pickstationOrders.server.d.ts","sourceRoot":"","sources":["../../src/lib/pickstationOrders.server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAgBrD,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA8P5E,wBAAsB,2BAA2B,CAC/C,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8W7B;AAED,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,CAER;AAED,kFAAkF;AAClF,wBAAsB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC,CAGR;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,UAAU,GAAG,QAAQ,EAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,EACjE,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -2,8 +2,9 @@
2
2
  // Uses the publishable-key Supabase client + SECURITY DEFINER RPCs so the
3
3
  // public Pickstation works without a service-role key.
4
4
  import { createClient } from "@supabase/supabase-js";
5
- import { calculateOrderPlanning, distributePickDates, DEFAULT_PICKUP_MOMENT, } from "./planning";
6
- import { normalizePickupMoments, normalizePlanningCarriers, sanitizeWeekdays, selectCarrierForTarget, } from "./carrierPlanning";
5
+ import { calculateOrderPlanning, distributePickDates, } from "./planning.js";
6
+ import { normalizePickupMoments, normalizePlanningCarriers, sanitizeWeekdays, selectCarrierForTarget, } from "./carrierPlanning.js";
7
+ import { loadPickWorkdays } from "./pickWorkdays.js";
7
8
  const LOG_SCOPE = "[pickstation]";
8
9
  function debug(action, details) {
9
10
  console.info(`${LOG_SCOPE} ${action}`, {
@@ -164,6 +165,11 @@ export async function loadTodaysPickstationOrders(client) {
164
165
  const [settingsRes, ordersRes] = await Promise.all([
165
166
  supabase.rpc("pickstation_get_planning_context"),
166
167
  supabase.rpc("pickstation_get_orders_raw"),
168
+ // Werkdagen uitsluitend uit de Werktijden; mislukt dit, dan wordt er niet gepland.
169
+ loadPickWorkdays(supabase).catch((e) => {
170
+ warn("pick workdays load failed", { message: e instanceof Error ? e.message : String(e) });
171
+ return null;
172
+ }),
167
173
  ]);
168
174
  if (settingsRes.error) {
169
175
  errorLog("settings rpc failed", new Error(settingsRes.error.message), {
@@ -236,7 +242,7 @@ export async function loadTodaysPickstationOrders(client) {
236
242
  province: pickProvince(data),
237
243
  city: pickCity(data),
238
244
  });
239
- const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [DEFAULT_PICKUP_MOMENT];
245
+ const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [];
240
246
  const planning = calculateOrderPlanning(deliveryDate, {
241
247
  pickupMoments,
242
248
  pickDurationWorkdays: pickDays,
@@ -286,7 +292,7 @@ export async function loadTodaysPickstationOrders(client) {
286
292
  province: target.province,
287
293
  city: target.city,
288
294
  });
289
- const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [DEFAULT_PICKUP_MOMENT];
295
+ const pickupMoments = carrier ? normalizePickupMoments(carrier.pickup_moments) : [];
290
296
  const planning = calculateOrderPlanning(row.delivery_date, {
291
297
  pickupMoments,
292
298
  pickDurationWorkdays: pickDays,
@@ -472,7 +478,7 @@ export async function fetchFloridayAuctionLetterPdf(_orderId) {
472
478
  }
473
479
  /** Haalt een Floriday-afleverbrief PDF op via de Authenticatie-module gateway. */
474
480
  export async function fetchFloridayDeliveryNotePdf(salesOrderId) {
475
- const { fetchDeliveryNotePdf } = await import("./authGateway.server");
481
+ const { fetchDeliveryNotePdf } = await import("./authGateway.server.js");
476
482
  return fetchDeliveryNotePdf(salesOrderId);
477
483
  }
478
484
  export async function setCartStatus(orderSource, orderId, cartIndex, status, client) {
@@ -20,7 +20,21 @@ export interface PickupMoment {
20
20
  /** Bezorgtijd ("HH:MM"). */
21
21
  delivery_time: string;
22
22
  }
23
+ /**
24
+ * Leeg sjabloon voor een nieuw ophaalmoment: werkdagen ingevuld, tijden leeg.
25
+ * Er wordt nooit stil een tijd aangenomen; een moment zonder tijden telt niet mee.
26
+ */
23
27
  export declare const DEFAULT_PICKUP_MOMENT: PickupMoment;
28
+ export declare function isValidTime(t: string | null | undefined): boolean;
29
+ /** Een ophaalmoment telt pas mee als aanmeld-, ophaal- en bezorgtijd zijn gekozen. */
30
+ export declare function isCompleteMoment(m: PickupMoment): boolean;
31
+ /** Zet de pickwerkdagen (JJJJ-MM-DD) voor een periode; null wist de kalender. */
32
+ export declare function setPickWorkdayCalendar(cal: {
33
+ workdays: string[];
34
+ from: string;
35
+ to: string;
36
+ } | null): void;
37
+ export declare function isPickWorkdayCalendarReady(): boolean;
24
38
  export interface PlanningRules {
25
39
  /** Beschikbare ophaalmomenten — minimaal één. */
26
40
  pickupMoments: PickupMoment[];
@@ -87,6 +101,11 @@ export declare function normalizeWeekdays(days: number[] | undefined | null): nu
87
101
  * of naar de toekomst opschuiven.
88
102
  */
89
103
  export declare function snapToAllowedDay(date: Date, allowedWeekdays: number[] | undefined, direction: "backward" | "forward", holidays?: Date[]): Date;
104
+ /**
105
+ * Werkdag volgens de Werktijden (inclusief gesloten afwijkende dagen).
106
+ * Geen kalender of datum buiten de geladen periode → geen werkdag (fail closed).
107
+ * `holidays` blijft alleen voor oude aanroepers; niemand geeft hem nog mee.
108
+ */
90
109
  export declare function isWorkday(d: Date, holidays?: Date[]): boolean;
91
110
  export declare function subtractWorkdays(date: Date, n: number, holidays?: Date[]): Date;
92
111
  export declare function addWorkdays(date: Date, n: number, holidays?: Date[]): Date;
@@ -1 +1 @@
1
- {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"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"}
@@ -6,14 +6,44 @@
6
6
  * ophalen, bezorgen) hoeveel werkdagen vóór de bezorgdag de stap plaatsvindt
7
7
  * en op welk tijdstip.
8
8
  */
9
+ /**
10
+ * Leeg sjabloon voor een nieuw ophaalmoment: werkdagen ingevuld, tijden leeg.
11
+ * Er wordt nooit stil een tijd aangenomen; een moment zonder tijden telt niet mee.
12
+ */
9
13
  export const DEFAULT_PICKUP_MOMENT = {
10
14
  signup_days: 2,
11
- signup_time: "16:00",
15
+ signup_time: "",
12
16
  pickup_days: 1,
13
- pickup_time: "17:30",
17
+ pickup_time: "",
14
18
  delivery_days: 0,
15
- delivery_time: "08:00",
19
+ delivery_time: "",
16
20
  };
21
+ const TIME_RE = /^\d{1,2}:\d{2}$/;
22
+ export function isValidTime(t) {
23
+ return typeof t === "string" && TIME_RE.test(t.trim());
24
+ }
25
+ /** Een ophaalmoment telt pas mee als aanmeld-, ophaal- en bezorgtijd zijn gekozen. */
26
+ export function isCompleteMoment(m) {
27
+ return isValidTime(m.signup_time) && isValidTime(m.pickup_time) && isValidTime(m.delivery_time);
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Werkdagen: één bron, de Werktijden (logistics_is_pick_workday via
31
+ // afh_pick_workdays). Zonder geladen kalender wordt er niet gepland.
32
+ // ---------------------------------------------------------------------------
33
+ let pickWorkdayCalendar = null;
34
+ function dateKey(d) {
35
+ const y = d.getFullYear();
36
+ const m = String(d.getMonth() + 1).padStart(2, "0");
37
+ const day = String(d.getDate()).padStart(2, "0");
38
+ return `${y}-${m}-${day}`;
39
+ }
40
+ /** Zet de pickwerkdagen (JJJJ-MM-DD) voor een periode; null wist de kalender. */
41
+ export function setPickWorkdayCalendar(cal) {
42
+ pickWorkdayCalendar = cal ? { days: new Set(cal.workdays), from: cal.from, to: cal.to } : null;
43
+ }
44
+ export function isPickWorkdayCalendarReady() {
45
+ return pickWorkdayCalendar !== null;
46
+ }
17
47
  /** ISO-dagnummer 1=ma … 7=zo van een Date. */
18
48
  export function isoWeekday(d) {
19
49
  const g = d.getDay();
@@ -51,9 +81,18 @@ function sameDay(a, b) {
51
81
  a.getMonth() === b.getMonth() &&
52
82
  a.getDate() === b.getDate());
53
83
  }
84
+ /**
85
+ * Werkdag volgens de Werktijden (inclusief gesloten afwijkende dagen).
86
+ * Geen kalender of datum buiten de geladen periode → geen werkdag (fail closed).
87
+ * `holidays` blijft alleen voor oude aanroepers; niemand geeft hem nog mee.
88
+ */
54
89
  export function isWorkday(d, holidays) {
55
- const day = d.getDay();
56
- if (day === 0 || day === 6)
90
+ if (!pickWorkdayCalendar)
91
+ return false;
92
+ const key = dateKey(d);
93
+ if (key < pickWorkdayCalendar.from || key > pickWorkdayCalendar.to)
94
+ return false;
95
+ if (!pickWorkdayCalendar.days.has(key))
57
96
  return false;
58
97
  if (holidays && holidays.some((h) => sameDay(h, d)))
59
98
  return false;
@@ -67,7 +106,8 @@ function normalize(d) {
67
106
  export function subtractWorkdays(date, n, holidays) {
68
107
  const out = normalize(date);
69
108
  let remaining = Math.max(0, Math.floor(n));
70
- while (remaining > 0) {
109
+ let guard = 0;
110
+ while (remaining > 0 && guard++ < 60) {
71
111
  out.setDate(out.getDate() - 1);
72
112
  if (isWorkday(out, holidays))
73
113
  remaining--;
@@ -77,7 +117,8 @@ export function subtractWorkdays(date, n, holidays) {
77
117
  export function addWorkdays(date, n, holidays) {
78
118
  const out = normalize(date);
79
119
  let remaining = Math.max(0, Math.floor(n));
80
- while (remaining > 0) {
120
+ let guard = 0;
121
+ while (remaining > 0 && guard++ < 60) {
81
122
  out.setDate(out.getDate() + 1);
82
123
  if (isWorkday(out, holidays))
83
124
  remaining--;
@@ -137,7 +178,7 @@ export function getSignupDeadline(deliveryDate, moment, holidays) {
137
178
  */
138
179
  export function selectPickupMoment(deliveryDate, orderCreatedAt, moments, holidays) {
139
180
  if (moments.length === 0)
140
- return DEFAULT_PICKUP_MOMENT;
181
+ return DEFAULT_PICKUP_MOMENT; // aanroepers controleren vooraf
141
182
  if (moments.length === 1)
142
183
  return moments[0];
143
184
  const now = orderCreatedAt ?? new Date();
@@ -160,7 +201,7 @@ export function calculateEarliestDeliveryDate(rules) {
160
201
  ? rules.orderCreatedAt
161
202
  : new Date(rules.orderCreatedAt);
162
203
  const base = Number.isNaN(orderCreated.getTime()) ? new Date() : orderCreated;
163
- const moments = rules.pickupMoments.length > 0 ? rules.pickupMoments : [DEFAULT_PICKUP_MOMENT];
204
+ const moments = rules.pickupMoments.filter(isCompleteMoment);
164
205
  const leadDays = moments.reduce((max, moment) => Math.max(max, moment.signup_days, moment.pickup_days, moment.delivery_days), 0);
165
206
  const workdaysToAdd = Math.max(0, Math.floor(rules.pickDurationWorkdays)) + leadDays;
166
207
  const raw = addWorkdays(base, workdaysToAdd, rules.holidays);
@@ -185,8 +226,14 @@ export function calculateOrderPlanning(deliveryDate, rules) {
185
226
  const d = typeof deliveryDate === "string" ? new Date(deliveryDate) : deliveryDate;
186
227
  if (Number.isNaN(d.getTime()))
187
228
  return null;
229
+ // Zonder werkdagen uit de Werktijden of zonder volledig ingevuld ophaalmoment
230
+ // wordt er niet gepland: nooit stil terugvallen op ma–vr of een standaardtijd.
231
+ if (!isPickWorkdayCalendarReady())
232
+ return null;
188
233
  const requested = normalize(d);
189
- const moments = rules.pickupMoments.length > 0 ? rules.pickupMoments : [DEFAULT_PICKUP_MOMENT];
234
+ const moments = rules.pickupMoments.filter(isCompleteMoment);
235
+ if (moments.length === 0)
236
+ return null;
190
237
  const orderCreated = rules.orderCreatedAt == null
191
238
  ? null
192
239
  : rules.orderCreatedAt instanceof Date
@@ -299,7 +346,7 @@ export function distributePickDates(items, options) {
299
346
  const carts = getCarts(item);
300
347
  // Kandidaten in chronologische volgorde — alleen toegestane pickdagen.
301
348
  const allowedSet = new Set(normalizeWeekdays(options.pickWeekdays));
302
- const isAllowed = (d) => allowedSet.has(isoWeekday(d)) && !(options.holidays?.some((h) => sameDay(h, d)));
349
+ const isAllowed = (d) => allowedSet.has(isoWeekday(d)) && isWorkday(d, options.holidays);
303
350
  const candidates = [];
304
351
  if (distribute) {
305
352
  let cursor = deadline;
@@ -1,4 +1,4 @@
1
- import { supabase } from "../integrations/supabase/moduleClient";
1
+ import { supabase } from "../integrations/supabase/moduleClient.js";
2
2
  const entries = new Map();
3
3
  function ensureEntry(table) {
4
4
  const existing = entries.get(table);