@flowselections/logistiek-engine 1.0.147 → 1.0.151

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 (33) hide show
  1. package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
  2. package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
  3. package/dist-lib/components/AutomatischVersturenCard.js +22 -0
  4. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  5. package/dist-lib/components/BeheerPage.js +3 -1
  6. package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
  7. package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
  8. package/dist-lib/components/OudeOrderregelsCard.js +28 -0
  9. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  10. package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
  11. package/dist-lib/integrations/supabase/types.d.ts +264 -2
  12. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  13. package/dist-lib/integrations/supabase/types.js +1 -0
  14. package/dist-lib/lib/autoSend.d.ts +21 -0
  15. package/dist-lib/lib/autoSend.d.ts.map +1 -0
  16. package/dist-lib/lib/autoSend.functions.d.ts +10 -0
  17. package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
  18. package/dist-lib/lib/autoSend.functions.js +18 -0
  19. package/dist-lib/lib/autoSend.js +69 -0
  20. package/dist-lib/lib/autoSend.server.d.ts +13 -0
  21. package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
  22. package/dist-lib/lib/autoSend.server.js +75 -0
  23. package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
  24. package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
  25. package/dist-lib/lib/centralSecrets.server.js +82 -0
  26. package/dist-lib/lib/handlers/logistics-tick.server.js +10 -0
  27. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  28. package/dist-lib/lib/modulePrompts.js +116 -0
  29. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  30. package/dist-lib/lib/moduleVersion.js +1 -1
  31. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  32. package/dist-lib/lib/ruleEngineSchema.js +7 -0
  33. package/package.json +4 -4
@@ -39,6 +39,7 @@ export const Constants = {
39
39
  "veilingbon",
40
40
  "afleverbrief",
41
41
  "veilingbrief",
42
+ "traysticker",
42
43
  ],
43
44
  doc_orientation: ["portrait", "landscape"],
44
45
  exact_env: ["staging", "live"],
@@ -0,0 +1,21 @@
1
+ export declare const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
2
+ export declare const AUTO_SEND_WACHTTIJDEN_MIN: readonly [1, 5, 15, 60];
3
+ export declare const AUTO_SEND_MAX_POGINGEN = 5;
4
+ export declare const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
5
+ export declare function normaliseerShellAdres(v: unknown): string | null;
6
+ export declare function autoSendBody(orderId: string): string;
7
+ export declare function ondertekenAutoSend(secret: string, timestamp: number, rawBody: string): Promise<string>;
8
+ /** Wachttijd in minuten na poging n (1-based): 1, 5, 15, 60, daarna 60. */
9
+ export declare function wachttijdNaPoging(n: number): number;
10
+ export type AutoSendUitkomst = {
11
+ soort: "verstuurd" | "definitief" | "opnieuw";
12
+ reden: string | null;
13
+ };
14
+ /**
15
+ * Antwoord van Afhandeling beoordelen:
16
+ * 2xx (sent / already_sent) = verstuurd; 400 en 422 = definitief mislukt;
17
+ * al het andere (401, 409, 502, ...) = opnieuw volgens schema.
18
+ * Reden: veld "error" (met de code ervoor), anders de code, anders de status.
19
+ */
20
+ export declare function beoordeelAntwoord(status: number, tekst: string | null | undefined): AutoSendUitkomst;
21
+ //# sourceMappingURL=autoSend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,4CAA4C,CAAC;AACxE,eAAO,MAAM,yBAAyB,yBAA0B,CAAC;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,qBAAqB,+DAA+D,CAAC;AAElG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AASD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5G;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAoBpG"}
@@ -0,0 +1,10 @@
1
+ export declare const getAutoSendConfig: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, undefined, undefined, undefined, undefined>, import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
2
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
3
+ userId: string;
4
+ claims: import("@supabase/auth-js").User;
5
+ }, undefined, undefined, undefined>], undefined, Promise<{
6
+ sleutelOpTeHalen: boolean;
7
+ sleutelReden: string | null;
8
+ adresAanwezig: boolean;
9
+ }>>;
10
+ //# sourceMappingURL=autoSend.functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.functions.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.functions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;sBAEmB,OAAO;kBAAgB,MAAM,GAAG,IAAI;mBAAiB,OAAO;GAWzG,CAAC"}
@@ -0,0 +1,18 @@
1
+ // src/lib/autoSend.functions.ts — Beheer: is de sleutel op te halen en is er een Shell-adres? (alleen ja/nee)
2
+ import { createServerFn } from "@tanstack/react-start";
3
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
4
+ import { readableServerErrors } from "./readableServerErrors.js";
5
+ export const getAutoSendConfig = createServerFn({ method: "GET" })
6
+ .middleware([readableServerErrors, requireSupabaseAuth])
7
+ .handler(async () => {
8
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
9
+ const { leesShellAdres } = await import("./autoSend.server.js");
10
+ const { haalAutoSendSleutel } = await import("./centralSecrets.server.js");
11
+ const s = await haalAutoSendSleutel();
12
+ const adres = await leesShellAdres(supabaseAdmin);
13
+ return {
14
+ sleutelOpTeHalen: s.sleutel !== null,
15
+ sleutelReden: s.sleutel === null ? s.reden : null,
16
+ adresAanwezig: adres !== null,
17
+ };
18
+ });
@@ -0,0 +1,69 @@
1
+ // ============================================================================
2
+ // src/lib/autoSend.ts — automatisch versturen van de belading (Engine 1.0.149)
3
+ // ============================================================================
4
+ // Pure hulpfuncties (geen netwerk, geen database), zodat ze los te testen zijn.
5
+ // - Sleutel: zie centralSecrets.server.ts (AUTH_GATEWAY_HMAC_SECRET, anders
6
+ // floriday_gateway_secret via de centrale dienst).
7
+ // - Ondertekening: HMAC-SHA256 hex over `${timestamp}.${rawBody}`, timestamp
8
+ // in epoch-milliseconden.
9
+ // ============================================================================
10
+ export const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
11
+ export const AUTO_SEND_WACHTTIJDEN_MIN = [1, 5, 15, 60];
12
+ export const AUTO_SEND_MAX_POGINGEN = 5;
13
+ export const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
14
+ export function normaliseerShellAdres(v) {
15
+ if (typeof v !== "string")
16
+ return null;
17
+ const s = v.trim().replace(/\/+$/, "");
18
+ return /^https:\/\/[^\s/]+/i.test(s) ? s : null;
19
+ }
20
+ export function autoSendBody(orderId) {
21
+ return JSON.stringify({ orderId });
22
+ }
23
+ async function hmacHex(secret, message) {
24
+ const enc = new TextEncoder();
25
+ const key = await crypto.subtle.importKey("raw", enc.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
26
+ const sig = await crypto.subtle.sign("HMAC", key, enc.encode(message));
27
+ return Array.from(new Uint8Array(sig)).map((b) => b.toString(16).padStart(2, "0")).join("");
28
+ }
29
+ export async function ondertekenAutoSend(secret, timestamp, rawBody) {
30
+ return hmacHex(secret, `${timestamp}.${rawBody}`);
31
+ }
32
+ /** Wachttijd in minuten na poging n (1-based): 1, 5, 15, 60, daarna 60. */
33
+ export function wachttijdNaPoging(n) {
34
+ const i = Math.min(Math.max(n, 1), AUTO_SEND_WACHTTIJDEN_MIN.length) - 1;
35
+ return AUTO_SEND_WACHTTIJDEN_MIN[i];
36
+ }
37
+ /**
38
+ * Antwoord van Afhandeling beoordelen:
39
+ * 2xx (sent / already_sent) = verstuurd; 400 en 422 = definitief mislukt;
40
+ * al het andere (401, 409, 502, ...) = opnieuw volgens schema.
41
+ * Reden: veld "error" (met de code ervoor), anders de code, anders de status.
42
+ */
43
+ export function beoordeelAntwoord(status, tekst) {
44
+ let code = null;
45
+ let fout = null;
46
+ try {
47
+ const j = JSON.parse(tekst ?? "");
48
+ if (j && typeof j === "object") {
49
+ const c = j["code"] ?? j["status"] ?? j["result"];
50
+ if (typeof c === "string")
51
+ code = c;
52
+ const e = j["error"];
53
+ if (typeof e === "string")
54
+ fout = e;
55
+ else if (Array.isArray(e))
56
+ fout = e.filter((x) => typeof x === "string").join("; ") || null;
57
+ }
58
+ }
59
+ catch {
60
+ /* geen JSON */
61
+ }
62
+ if (status >= 200 && status < 300)
63
+ return { soort: "verstuurd", reden: null };
64
+ const delen = [code, fout].filter((x) => !!x && x.trim() !== "");
65
+ const reden = (delen.length ? delen.join(": ") : `Afhandeling antwoordde ${status}`).slice(0, 300);
66
+ if (status === 400 || status === 422)
67
+ return { soort: "definitief", reden };
68
+ return { soort: "opnieuw", reden };
69
+ }
@@ -0,0 +1,13 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ /** shell_base_url; alleen als die ontbreekt: PUBLIC_BASE_URL of de centrale dienst. */
3
+ export declare function leesShellAdres(sb: SupabaseClient): Promise<string | null>;
4
+ export declare function runAutoSendQueue(sb: SupabaseClient, opts?: {
5
+ limit?: number;
6
+ }): Promise<{
7
+ claimed: number;
8
+ sent: number;
9
+ failed: number;
10
+ definitief: number;
11
+ configMissing: number;
12
+ }>;
13
+ //# sourceMappingURL=autoSend.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoSend.server.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;GA0DvF"}
@@ -0,0 +1,75 @@
1
+ import { AUTO_SEND_ADRES_REDEN, AUTO_SEND_PATH, autoSendBody, beoordeelAntwoord, normaliseerShellAdres, ondertekenAutoSend, } from "./autoSend.js";
2
+ import { haalAutoSendSleutel, terugvalShellAdres } from "./centralSecrets.server.js";
3
+ /** shell_base_url; alleen als die ontbreekt: PUBLIC_BASE_URL of de centrale dienst. */
4
+ export async function leesShellAdres(sb) {
5
+ try {
6
+ const { data, error } = await sb.from("module_runtime_config").select("value").eq("key", "shell_base_url").maybeSingle();
7
+ const eigen = error ? null : normaliseerShellAdres(data?.value);
8
+ if (eigen)
9
+ return eigen;
10
+ }
11
+ catch {
12
+ /* val terug */
13
+ }
14
+ return normaliseerShellAdres(await terugvalShellAdres());
15
+ }
16
+ export async function runAutoSendQueue(sb, opts = {}) {
17
+ const run = { claimed: 0, sent: 0, failed: 0, definitief: 0, configMissing: 0 };
18
+ const { data, error } = await sb.rpc("logistics_auto_send_claim", { p_limit: opts.limit ?? 10 });
19
+ if (error)
20
+ throw new Error(error.message);
21
+ const rows = Array.isArray(data) ? data : [];
22
+ run.claimed = rows.length;
23
+ if (rows.length === 0)
24
+ return run;
25
+ const sleutel = await haalAutoSendSleutel();
26
+ const adres = await leesShellAdres(sb);
27
+ const configReden = sleutel.sleutel === null
28
+ ? `Automatisch versturen niet mogelijk: ${sleutel.reden}`
29
+ : !adres ? AUTO_SEND_ADRES_REDEN : null;
30
+ for (const row of rows) {
31
+ const finish = (ok, reason, http, cfg = false, definitief = false) => sb.rpc("logistics_auto_send_finish", {
32
+ p_id: row.id, p_ok: ok, p_reason: reason, p_http: http, p_config_missing: cfg, p_definitief: definitief,
33
+ });
34
+ if (configReden || !sleutel.sleutel || !adres) {
35
+ run.configMissing++;
36
+ await finish(false, configReden ?? AUTO_SEND_ADRES_REDEN, null, true);
37
+ continue;
38
+ }
39
+ try {
40
+ const body = autoSendBody(row.order_id);
41
+ const ts = Date.now();
42
+ const sig = await ondertekenAutoSend(sleutel.sleutel, ts, body);
43
+ const res = await fetch(`${adres}${AUTO_SEND_PATH}`, {
44
+ method: "POST",
45
+ headers: {
46
+ "content-type": "application/json",
47
+ "x-timestamp": String(ts),
48
+ "x-signature": sig,
49
+ "idempotency-key": `auto-send:${row.order_id}`,
50
+ },
51
+ body,
52
+ signal: AbortSignal.timeout(15000),
53
+ });
54
+ const uitkomst = beoordeelAntwoord(res.status, await res.text().catch(() => ""));
55
+ if (uitkomst.soort === "verstuurd") {
56
+ run.sent++;
57
+ await finish(true, null, res.status);
58
+ }
59
+ else if (uitkomst.soort === "definitief") {
60
+ run.definitief++;
61
+ await finish(false, uitkomst.reden, res.status, false, true);
62
+ }
63
+ else {
64
+ run.failed++;
65
+ await finish(false, uitkomst.reden, res.status);
66
+ }
67
+ }
68
+ catch (e) {
69
+ run.failed++;
70
+ const naam = e?.name === "TimeoutError" ? "time-out" : "geen verbinding";
71
+ await finish(false, `Afhandeling niet bereikbaar (${naam})`, null);
72
+ }
73
+ }
74
+ return run;
75
+ }
@@ -0,0 +1,13 @@
1
+ export type SleutelUitkomst = {
2
+ sleutel: string;
3
+ bron: "lokaal" | "centraal";
4
+ } | {
5
+ sleutel: null;
6
+ reden: string;
7
+ };
8
+ export declare function _resetSleutelCache(): void;
9
+ export declare function centraalAdres(env: Record<string, string | undefined>): string | null;
10
+ export declare function haalAutoSendSleutel(env?: Record<string, string | undefined>, doFetch?: typeof fetch, nu?: () => number): Promise<SleutelUitkomst>;
11
+ /** Terugval voor het Shell-adres als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders de centrale dienst. */
12
+ export declare function terugvalShellAdres(env?: Record<string, string | undefined>, doFetch?: typeof fetch): Promise<string | null>;
13
+ //# sourceMappingURL=centralSecrets.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"centralSecrets.server.d.ts","sourceRoot":"","sources":["../../src/lib/centralSecrets.server.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAKlH,wBAAgB,kBAAkB,SAEjC;AAMD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,EAC3F,OAAO,GAAE,OAAO,KAAa,EAC7B,EAAE,GAAE,MAAM,MAAiB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAiC1B;AAED,8GAA8G;AAC9G,wBAAsB,kBAAkB,CACtC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAqD,EAC3F,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
@@ -0,0 +1,82 @@
1
+ // ============================================================================
2
+ // src/lib/centralSecrets.server.ts — HMAC-sleutel voor automatisch versturen
3
+ // ============================================================================
4
+ // Zelfde werkwijze als Afhandeling (getFloridayGatewaySecret):
5
+ // 1. AUTH_GATEWAY_HMAC_SECRET uit de omgeving, als die gezet is.
6
+ // 2. Anders POST {CENTRAL_AUTH_URL}/api/secret/floriday_gateway_secret met
7
+ // Authorization: Bearer {CENTRAL_AUTH_SECRET}; sleutel = veld "value".
8
+ // CENTRAL_AUTH_SECRET is alleen toegang, nooit de sleutel zelf.
9
+ // Maximaal 60 s in het geheugen. Nooit opslaan, nooit loggen, nooit naar de
10
+ // browser. Mislukt het: null met een reden zonder geheime waarde (fail closed).
11
+ // ============================================================================
12
+ const CACHE_MS = 60000;
13
+ let cache = null;
14
+ export function _resetSleutelCache() {
15
+ cache = null;
16
+ }
17
+ function leeg(v) {
18
+ return typeof v !== "string" || v.trim() === "";
19
+ }
20
+ export function centraalAdres(env) {
21
+ const v = env["CENTRAL_AUTH_URL"];
22
+ return leeg(v) ? null : v.trim().replace(/\/+$/, "");
23
+ }
24
+ export async function haalAutoSendSleutel(env = process.env, doFetch = fetch, nu = Date.now) {
25
+ const lokaal = env["AUTH_GATEWAY_HMAC_SECRET"];
26
+ if (!leeg(lokaal))
27
+ return { sleutel: lokaal, bron: "lokaal" };
28
+ if (cache && cache.tot > nu())
29
+ return { sleutel: cache.sleutel, bron: "centraal" };
30
+ const adres = centraalAdres(env);
31
+ if (!adres)
32
+ return { sleutel: null, reden: "sleutel niet op te halen: CENTRAL_AUTH_URL ontbreekt" };
33
+ const toegang = env["CENTRAL_AUTH_SECRET"];
34
+ if (leeg(toegang))
35
+ return { sleutel: null, reden: "sleutel niet op te halen: CENTRAL_AUTH_SECRET ontbreekt" };
36
+ try {
37
+ const res = await doFetch(`${adres}/api/secret/floriday_gateway_secret`, {
38
+ method: "POST",
39
+ headers: { authorization: `Bearer ${toegang}` },
40
+ signal: AbortSignal.timeout(10000),
41
+ });
42
+ if (!res.ok)
43
+ return { sleutel: null, reden: `sleutel niet op te halen: centrale dienst antwoordde ${res.status}` };
44
+ let value = null;
45
+ try {
46
+ value = (await res.json())?.value;
47
+ }
48
+ catch {
49
+ return { sleutel: null, reden: "sleutel niet op te halen: antwoord van de centrale dienst is geen JSON" };
50
+ }
51
+ if (typeof value !== "string" || value.trim() === "") {
52
+ return { sleutel: null, reden: "sleutel niet op te halen: veld value ontbreekt" };
53
+ }
54
+ cache = { sleutel: value, tot: nu() + CACHE_MS };
55
+ return { sleutel: value, bron: "centraal" };
56
+ }
57
+ catch (e) {
58
+ const naam = e?.name === "TimeoutError" ? "time-out" : "geen verbinding";
59
+ return { sleutel: null, reden: `sleutel niet op te halen: centrale dienst niet bereikbaar (${naam})` };
60
+ }
61
+ }
62
+ /** Terugval voor het Shell-adres als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders de centrale dienst. */
63
+ export async function terugvalShellAdres(env = process.env, doFetch = fetch) {
64
+ if (!leeg(env["PUBLIC_BASE_URL"]))
65
+ return env["PUBLIC_BASE_URL"].trim();
66
+ const adres = centraalAdres(env);
67
+ if (!adres)
68
+ return null;
69
+ try {
70
+ const res = await doFetch(`${adres}/api/shell-host`, { method: "GET", signal: AbortSignal.timeout(10000) });
71
+ if (!res.ok)
72
+ return null;
73
+ const host = (await res.json())?.shell_host;
74
+ if (typeof host !== "string" || host.trim() === "")
75
+ return null;
76
+ const h = host.trim();
77
+ return /^https?:\/\//i.test(h) ? h : `https://${h}`;
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
@@ -274,6 +274,15 @@ async function runTickRound(supabase, tickJob, ident) {
274
274
  catch (e) {
275
275
  stickers = { error: String(e?.message ?? e) };
276
276
  }
277
+ // Automatisch versturen (1.0.149): alleen Floriday-orders, alleen als de werkwijze het aanzet.
278
+ let autoSend = null;
279
+ try {
280
+ const { runAutoSendQueue } = await import("../autoSend.server.js");
281
+ autoSend = await runAutoSendQueue(supabase, { limit: 10 });
282
+ }
283
+ catch (e) {
284
+ autoSend = { error: String(e?.message ?? e) };
285
+ }
277
286
  // Seintjes van de pickschermen: karplan ontbreekt. Direct oppakken.
278
287
  let cartPlanRequests = null;
279
288
  try {
@@ -359,6 +368,7 @@ async function runTickRound(supabase, tickJob, ident) {
359
368
  barcodes,
360
369
  cartPlanRequests,
361
370
  stickers,
371
+ autoSend,
362
372
  queueCleanup,
363
373
  housekeeping,
364
374
  orphanPrintJobs,
@@ -1 +1 @@
1
- {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAgpKD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
1
+ {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAuwKD,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
@@ -2005,6 +2005,97 @@ REGELS
2005
2005
  CONTROLELIJST
2006
2006
  [ ] Melding staat bij de order in Dagdetails.
2007
2007
  [ ] Aanvraag accepteren/weigeren werkt vóór expiresOn.
2008
+ [ ] Meld terug met je pakketversie.`,
2009
+ },
2010
+ {
2011
+ number: 23,
2012
+ title: "Automatisch versturen: aanroep door de Engine",
2013
+ date: "2026-10-15",
2014
+ summary: "Engine roept /api/public/hooks/afhandeling-auto-send aan met { orderId }, HMAC-SHA256 over timestamp.rawBody; status leesbaar via logistics_auto_send_status.",
2015
+ body: `Vereist Logistiek Engine 1.0.149. Match op id, niets hardcoded, fail closed.
2016
+
2017
+ WANNEER
2018
+ Alleen voor Floriday-orders (met een Floriday-id) en alleen als in de werkwijze
2019
+ "Automatisch versturen na de laatste goedgekeurde kar" (order_picken.
2020
+ auto_send_loading, standaard uit) aan staat. Zodra alle karren van de order
2021
+ (ook gedeelde en bufferkarren) een goedgekeurde controlescan hebben, zet de
2022
+ Engine één taak klaar per order (idempotentiesleutel auto-send:<orderId>).
2023
+
2024
+ AANROEP
2025
+ POST <shell_base_url>/api/public/hooks/afhandeling-auto-send
2026
+ Headers:
2027
+ content-type: application/json
2028
+ x-timestamp: <epoch-milliseconden>
2029
+ x-signature: <hex HMAC-SHA256 over "<timestamp>.<rawBody>">
2030
+ idempotency-key: auto-send:<orderId>
2031
+ Body (rawBody, exact zo ondertekend): {"orderId":"<uuid>"}
2032
+ Geheim: eerst CENTRAL_AUTH_SECRET, anders AUTH_GATEWAY_HMAC_SECRET (dezelfde
2033
+ zoekvolgorde als Afhandeling). Gebruiken jullie andere headernamen, meld die
2034
+ dan terug; dan past de Engine zich aan.
2035
+
2036
+ ANTWOORD
2037
+ 2xx = verstuurd (ook als de order al eerder verstuurd was: antwoord dan 2xx,
2038
+ niet opnieuw versturen). Elke andere status of geen antwoord = mislukt; de
2039
+ Engine probeert opnieuw na 1, 5, 15 en 60 minuten, maximaal 5 pogingen.
2040
+ Ontbreekt het geheim of het Shell-adres, dan verstuurt de Engine niets.
2041
+
2042
+ UITKOMST TONEN
2043
+ logistics_auto_send_status(p_order_id) (ingelogde gebruikers) geeft:
2044
+ { status: geen|wachtend|bezig|verstuurd|mislukt, verstuurdOm, reden, poging,
2045
+ maxPogingen, volgendePoging, tekst }
2046
+ tekst is bijvoorbeeld "Automatisch verstuurd om 14:32" of "Automatisch
2047
+ versturen mislukt: <reden> — poging 2 van 5". Toon tekst letterlijk.
2048
+
2049
+ CONTROLELIJST
2050
+ [ ] Route controleert de handtekening en de leeftijd van de timestamp.
2051
+ [ ] Tweede aanroep voor dezelfde order verstuurt niets opnieuw en geeft 2xx.
2052
+ [ ] Tekst uit logistics_auto_send_status staat bij de order.
2053
+ [ ] Meld terug met je pakketversie en de headernamen.`,
2054
+ },
2055
+ {
2056
+ number: 24,
2057
+ title: "Automatisch versturen: zelfde sleutel en antwoordafhandeling",
2058
+ date: "2026-10-15",
2059
+ summary: "Engine tekent met getFloridayGatewaySecret-volgorde; 400/422 definitief, rest opnieuw; reden uit error in logistics_auto_send_status.",
2060
+ body: `TER BEVESTIGING; bouwt voort op koppelprompt 23. Vereist Logistiek Engine 1.0.149.
2061
+ Afhandeling 1.0.60 hoeft niets te wijzigen als het onderstaande klopt.
2062
+
2063
+ SLEUTEL (gelijk aan getFloridayGatewaySecret)
2064
+ 1. AUTH_GATEWAY_HMAC_SECRET uit de omgeving van de Shell, als die gezet is.
2065
+ 2. Anders POST {CENTRAL_AUTH_URL}/api/secret/floriday_gateway_secret met
2066
+ Authorization: Bearer {CENTRAL_AUTH_SECRET}, zonder body; sleutel = veld value.
2067
+ CENTRAL_AUTH_SECRET is alleen toegang, nooit de sleutel.
2068
+ 3. Maximaal 60 seconden in het geheugen van de server; nooit opgeslagen, gelogd
2069
+ of naar de browser gestuurd. Lukt ophalen niet: niets versturen.
2070
+
2071
+ AANROEP (ongewijzigd)
2072
+ POST <shell_base_url>/api/public/hooks/afhandeling-auto-send
2073
+ (terugval alleen als shell_base_url ontbreekt: PUBLIC_BASE_URL, anders
2074
+ GET {CENTRAL_AUTH_URL}/api/shell-host → shell_host)
2075
+ Headers: content-type: application/json; x-timestamp: <epoch-ms als tekst>;
2076
+ x-signature: hex HMAC-SHA256 over "<timestamp>.<rawBody>";
2077
+ idempotency-key: auto-send:<orderId>
2078
+ Body exact zoals ondertekend: {"orderId":"<uuid>"}
2079
+
2080
+ ANTWOORDEN
2081
+ - 200 sent / 200 already_sent: verstuurd, niets opnieuw.
2082
+ - 400 invalid_body / invalid_idempotency_key en 422 not_floriday: definitief
2083
+ mislukt, geen nieuwe poging.
2084
+ - 401, 409 not_ready, 502 floriday_rejected, andere fouten of geen antwoord:
2085
+ opnieuw na 1, 5, 15 en 60 minuten, maximaal 5 pogingen.
2086
+ - Reden = "<code>: <error>" uit het antwoord (error mag tekst of lijst zijn);
2087
+ zonder JSON "Afhandeling antwoordde <status>".
2088
+
2089
+ TONEN
2090
+ logistics_auto_send_status(p_order_id).tekst, letterlijk, bijv. "Automatisch
2091
+ versturen mislukt: not_ready: controlescan ontbreekt — poging 2 van 5". Kan de
2092
+ Engine de sleutel niet ophalen, dan staat er bijv. "Automatisch versturen
2093
+ mislukt: Automatisch versturen niet mogelijk: sleutel niet op te halen:
2094
+ CENTRAL_AUTH_URL ontbreekt — poging 0 van 5".
2095
+
2096
+ CONTROLELIJST
2097
+ [ ] Antwoord bevat code (of status) en error zoals hierboven.
2098
+ [ ] Handtekening van de Engine wordt geaccepteerd met dezelfde sleutel.
2008
2099
  [ ] Meld terug met je pakketversie.`,
2009
2100
  },
2010
2101
  ],
@@ -3782,6 +3873,31 @@ CONTROLELIJST
3782
3873
  [ ] totaal = 0: "Geen stickers nodig voor deze kar".
3783
3874
  [ ] Meld terug met je pakketversie.`,
3784
3875
  },
3876
+ {
3877
+ number: 45,
3878
+ title: "Verzendbriefstatus: juiste tekst vanaf het begin (ter info)",
3879
+ date: "2026-10-15",
3880
+ summary: "logistics_shipping_note_status geeft 'Floriday tijdelijk niet bereikbaar' alleen nog bij een echte Floriday-fout na een poging.",
3881
+ body: `TER INFO; geen wijziging nodig. Vereist Logistiek Engine 1.0.149.
3882
+
3883
+ WAT VERANDERT
3884
+ logistics_shipping_note_status(p_slip_job_id, p_cart_id) houdt dezelfde vorm
3885
+ (status, message, attempts, nextAttemptAt, wachtOpVrijgave). Alleen de teksten
3886
+ kloppen nu vanaf het begin:
3887
+ - Nieuwe verzendbrief zonder goedgekeurde controlescan, of wachten op vrijgave
3888
+ of kenmerk: status "wacht_op_floriday", wachtOpVrijgave = true, message
3889
+ "Pakbon geprint — verzendbrief wacht op vrijgave (na de controlescan)."
3890
+ - "Floriday is tijdelijk niet bereikbaar. De verzendbrief wordt automatisch
3891
+ opnieuw geprobeerd." alleen bij een echte Floriday-fout na minstens één poging.
3892
+ - Maximaal aantal pogingen bereikt: status "mislukt" met een eigen tekst.
3893
+ - Anders neutraal: "Verzendbrief wordt klaargezet."
3894
+
3895
+ REGELS
3896
+ - Toon message letterlijk, zoals nu. Niets hardcoded.
3897
+
3898
+ CONTROLELIJST
3899
+ [ ] Bij een net geprinte pakbon verschijnt geen "tijdelijk niet bereikbaar" meer.`,
3900
+ },
3785
3901
  ],
3786
3902
  },
3787
3903
  scanners: {
@@ -1,2 +1,2 @@
1
- export declare const MODULE_VERSION = "1.0.147";
1
+ export declare const MODULE_VERSION = "1.0.151";
2
2
  //# sourceMappingURL=moduleVersion.d.ts.map
@@ -1,2 +1,2 @@
1
1
  // Automatisch gegenereerd door prebuild:lib; niet handmatig aanpassen.
2
- export const MODULE_VERSION = "1.0.147";
2
+ export const MODULE_VERSION = "1.0.151";
@@ -1 +1 @@
1
- {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
@@ -334,6 +334,13 @@ export const RULE_STEPS = [
334
334
  { value: "buffer", label: "Picken per orderbuffer" },
335
335
  ],
336
336
  },
337
+ {
338
+ key: "auto_send_loading",
339
+ label: "Automatisch versturen na de laatste goedgekeurde kar",
340
+ type: "toggle",
341
+ default: false,
342
+ description: "Alleen voor Floriday-orders. Staat dit aan, dan vraagt de Engine Afhandeling om de belading te versturen zodra alle karren van de order goedgekeurd zijn gescand. Eén keer per order; bij een fout tot 5 pogingen met oplopende wachttijd.",
343
+ },
337
344
  {
338
345
  key: "scanner",
339
346
  label: "Scannergebruik",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/logistiek-engine",
3
- "version": "1.0.147",
3
+ "version": "1.0.151",
4
4
  "flowselections": {
5
5
  "moduleId": "logistiek-engine",
6
6
  "pages": [
@@ -143,9 +143,9 @@
143
143
  "@rsbuild/core": "^1.0.0",
144
144
  "@tailwindcss/vite": "^4.2.1",
145
145
  "@tanstack/react-query": "^5.83.0",
146
- "@tanstack/react-router": "^1.168.0",
147
- "@tanstack/react-start": "^1.167.14",
148
- "@tanstack/router-plugin": "^1.167.10",
146
+ "@tanstack/react-router": "1.169.1",
147
+ "@tanstack/react-start": "1.167.63",
148
+ "@tanstack/router-plugin": "1.167.33",
149
149
  "@types/node": "^22.16.5",
150
150
  "@types/react": "^19.2.0",
151
151
  "@types/react-dom": "^19.2.0",