@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
|
@@ -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;
|
package/dist-lib/lib/pickMode.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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) : [
|
|
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) : [
|
|
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":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAOnC,CAAC;
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../src/lib/planning.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/planning.js
CHANGED
|
@@ -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: "
|
|
15
|
+
signup_time: "",
|
|
12
16
|
pickup_days: 1,
|
|
13
|
-
pickup_time: "
|
|
17
|
+
pickup_time: "",
|
|
14
18
|
delivery_days: 0,
|
|
15
|
-
delivery_time: "
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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)) &&
|
|
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;
|