@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.
- package/dist-lib/components/AutomatischVersturenCard.d.ts +2 -0
- package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -0
- package/dist-lib/components/AutomatischVersturenCard.js +22 -0
- package/dist-lib/components/BeheerPage.d.ts.map +1 -1
- package/dist-lib/components/BeheerPage.js +3 -1
- package/dist-lib/components/OudeOrderregelsCard.d.ts +2 -0
- package/dist-lib/components/OudeOrderregelsCard.d.ts.map +1 -0
- package/dist-lib/components/OudeOrderregelsCard.js +28 -0
- package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/previewAuthStorage.js +22 -4
- package/dist-lib/integrations/supabase/types.d.ts +264 -2
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +1 -0
- package/dist-lib/lib/autoSend.d.ts +21 -0
- package/dist-lib/lib/autoSend.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.functions.d.ts +10 -0
- package/dist-lib/lib/autoSend.functions.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.functions.js +18 -0
- package/dist-lib/lib/autoSend.js +69 -0
- package/dist-lib/lib/autoSend.server.d.ts +13 -0
- package/dist-lib/lib/autoSend.server.d.ts.map +1 -0
- package/dist-lib/lib/autoSend.server.js +75 -0
- package/dist-lib/lib/centralSecrets.server.d.ts +13 -0
- package/dist-lib/lib/centralSecrets.server.d.ts.map +1 -0
- package/dist-lib/lib/centralSecrets.server.js +82 -0
- package/dist-lib/lib/handlers/logistics-tick.server.js +10 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +116 -0
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +7 -0
- package/package.json +4 -4
|
@@ -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;
|
|
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.
|
|
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.
|
|
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":"AAQA,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,UAAU,GACV,MAAM,GACN,UAAU,GACV,OAAO,GACP,MAAM,GACN,QAAQ,GACR,aAAa,GACb,SAAS,GACT,SAAS,GACT,UAAU,CAAC;AAMf,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,wGAAwG;IACxG,SAAS,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;CAC/C;AAGD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAQzC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,WAAW,EAK5C,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAI9D,eAAO,MAAM,UAAU,EAAE,QAAQ,
|
|
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.
|
|
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": "
|
|
147
|
-
"@tanstack/react-start": "
|
|
148
|
-
"@tanstack/router-plugin": "
|
|
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",
|