@flowselections/logistiek-engine 1.0.140 → 1.0.147
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/GearchiveerdeOrdersCard.d.ts +2 -0
- package/dist-lib/components/GearchiveerdeOrdersCard.d.ts.map +1 -0
- package/dist-lib/components/GearchiveerdeOrdersCard.js +32 -0
- package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
- package/dist-lib/components/GeblokkeerdeOrdersCard.js +1 -1
- package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -1
- package/dist-lib/components/PlanWachtrijPage.js +20 -13
- package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
- package/dist-lib/components/RuleEnginePage.js +24 -3
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +20 -0
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
- package/dist-lib/hooks/useGeblokkeerdeOrders.js +57 -0
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +1 -0
- package/dist-lib/integrations/supabase/types.d.ts +650 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/briefTransport.server.d.ts +17 -0
- package/dist-lib/lib/briefTransport.server.d.ts.map +1 -0
- package/dist-lib/lib/briefTransport.server.js +41 -0
- package/dist-lib/lib/controlScan.server.d.ts.map +1 -1
- package/dist-lib/lib/controlScan.server.js +8 -0
- package/dist-lib/lib/handlers/logistics-tick.server.js +21 -0
- package/dist-lib/lib/layoutPrint.server.d.ts +2 -0
- package/dist-lib/lib/layoutPrint.server.d.ts.map +1 -1
- package/dist-lib/lib/layoutPrint.server.js +1 -1
- package/dist-lib/lib/logisticsTasks.d.ts +1 -0
- package/dist-lib/lib/logisticsTasks.d.ts.map +1 -1
- package/dist-lib/lib/logisticsTasks.js +2 -1
- package/dist-lib/lib/modulePrompts.d.ts +1 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +304 -1
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/planQueue.server.js +13 -0
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +18 -0
- package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/shippingNoteQueue.server.js +3 -0
- package/dist-lib/lib/stickerQueue.server.d.ts +15 -0
- package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/stickerQueue.server.js +349 -0
- package/dist-lib/lib/stickerRules.d.ts +38 -0
- package/dist-lib/lib/stickerRules.d.ts.map +1 -0
- package/dist-lib/lib/stickerRules.js +111 -0
- package/package.json +2 -2
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
export interface BriefTransport {
|
|
3
|
+
velden: Record<string, unknown>;
|
|
4
|
+
onbekend: string[];
|
|
5
|
+
}
|
|
6
|
+
/** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
|
|
7
|
+
export declare function bouwBriefTransport(data: unknown): BriefTransport;
|
|
8
|
+
export declare function onbekendTekst(onbekend: string[]): string | null;
|
|
9
|
+
/** Haalt het blok op; een fout blokkeert het printen niet. */
|
|
10
|
+
export declare function briefTransport(sb: SupabaseClient, orderId: string | null, cartId: string | null, log: {
|
|
11
|
+
traceId?: string | null;
|
|
12
|
+
orderRef?: string | null;
|
|
13
|
+
cartRef?: string | null;
|
|
14
|
+
phase: string;
|
|
15
|
+
actor: string;
|
|
16
|
+
}): Promise<Record<string, unknown>>;
|
|
17
|
+
//# sourceMappingURL=briefTransport.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefTransport.server.d.ts","sourceRoot":"","sources":["../../src/lib/briefTransport.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAiBhE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAO/D;AAED,8DAA8D;AAC9D,wBAAsB,cAAc,CAClC,EAAE,EAAE,cAAc,EAClB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChH,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOlC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { trace } from "./trace.server.js";
|
|
2
|
+
/** Puur: databaseantwoord -> payloadvelden. Onbekend = weglaten, nooit raden. */
|
|
3
|
+
export function bouwBriefTransport(data) {
|
|
4
|
+
const r = (data && typeof data === "object" ? data : {});
|
|
5
|
+
const velden = {};
|
|
6
|
+
const v = r["vervoerder"];
|
|
7
|
+
const naam = typeof v?.["naam"] === "string" ? v["naam"].trim() : "";
|
|
8
|
+
if (naam) {
|
|
9
|
+
const code = typeof v?.["code"] === "string" ? v["code"].trim() : "";
|
|
10
|
+
velden["vervoerder"] = code ? { naam, code } : { naam };
|
|
11
|
+
}
|
|
12
|
+
const om = r["ophaalmoment"];
|
|
13
|
+
if (typeof om === "string" && !Number.isNaN(Date.parse(om)))
|
|
14
|
+
velden["ophaalmoment"] = om;
|
|
15
|
+
const adres = r["ophaaladres"];
|
|
16
|
+
if (typeof adres === "string" && adres.trim())
|
|
17
|
+
velden["ophaaladres"] = adres.trim();
|
|
18
|
+
const onbekend = Array.isArray(r["onbekend"]) ? r["onbekend"].map(String) : [];
|
|
19
|
+
if (!naam && !onbekend.includes("vervoerder"))
|
|
20
|
+
onbekend.push("vervoerder");
|
|
21
|
+
if (!velden["ophaalmoment"] && !onbekend.some((x) => x.startsWith("ophaalmoment")))
|
|
22
|
+
onbekend.push("ophaalmoment");
|
|
23
|
+
return { velden, onbekend };
|
|
24
|
+
}
|
|
25
|
+
export function onbekendTekst(onbekend) {
|
|
26
|
+
const delen = onbekend
|
|
27
|
+
.filter((x) => x !== "ophaaladres")
|
|
28
|
+
.map((x) => x === "ophaalmoment_niet_eenduidig" ? "ophaalmoment niet eenduidig" : x === "order" ? "order niet gevonden" : `${x} onbekend`);
|
|
29
|
+
return delen.length ? `Op deze brief ontbreekt: ${delen.join(", ")}.` : null;
|
|
30
|
+
}
|
|
31
|
+
/** Haalt het blok op; een fout blokkeert het printen niet. */
|
|
32
|
+
export async function briefTransport(sb, orderId, cartId, log) {
|
|
33
|
+
if (!orderId)
|
|
34
|
+
return {};
|
|
35
|
+
const { data, error } = await sb.rpc("logistics_brief_transport", { p_order_id: orderId, p_cart_id: cartId });
|
|
36
|
+
const res = error ? { velden: {}, onbekend: ["vervoerder", "ophaalmoment"] } : bouwBriefTransport(data);
|
|
37
|
+
const tekst = error ? `Vervoerder/ophaalmoment niet te lezen: ${error.message}` : onbekendTekst(res.onbekend);
|
|
38
|
+
if (tekst)
|
|
39
|
+
await trace(sb, { ...log, step: "Vervoerder/ophaalmoment voor de brief", status: "waarschuwing", reason: tekst });
|
|
40
|
+
return res.velden;
|
|
41
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"controlScan.server.d.ts","sourceRoot":"","sources":["../../src/lib/controlScan.server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAiBD,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,mDAAmD;AACnD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAgBzC,mDAAmD;AACnD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1F,GAAG,GAAE,MAAmB,GACvB,UAAU,GAAG,MAAM,GAAG,IAAI,CAK5B;AA6BD,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,cAAc,CAAC,CAuQzB"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
// klantwaarden in deze code; de printer komt uit de werkwijze in de database.
|
|
16
16
|
// ============================================================================
|
|
17
17
|
import { printViaLayoutGecontroleerd, floridayLayout, floridayPdfOpslag } from "./layoutPrint.server.js";
|
|
18
|
+
import { briefTransport } from "./briefTransport.server.js";
|
|
18
19
|
import { isFloridayCancelled, FLORIDAY_CANCELLED_REASON } from "./floridayCancellation.server.js";
|
|
19
20
|
import { trace } from "./trace.server.js";
|
|
20
21
|
/** Maximaal aantal wachtrondes op Floriday voordat de controle als mislukt stopt. */
|
|
@@ -245,6 +246,12 @@ export async function runControlScanQueue(sb, options = {}) {
|
|
|
245
246
|
pdfUrl: url,
|
|
246
247
|
});
|
|
247
248
|
// Via de Layout maker; idempotent per controle.
|
|
249
|
+
const transport = await briefTransport(sb, row.order_id ?? null, row.cart_id ?? null, {
|
|
250
|
+
orderRef: row.order_number ?? row.order_id ?? null,
|
|
251
|
+
cartRef: row.cart_id ?? null,
|
|
252
|
+
phase: "controle",
|
|
253
|
+
actor: "logistiek-engine:controlescan",
|
|
254
|
+
});
|
|
248
255
|
const printed = await printViaLayoutGecontroleerd(sb, {
|
|
249
256
|
documenttype: "afleverbrief",
|
|
250
257
|
layoutId: layout.layoutId,
|
|
@@ -266,6 +273,7 @@ export async function runControlScanQueue(sb, options = {}) {
|
|
|
266
273
|
fulfillment_order_id: fulfillmentOrderId,
|
|
267
274
|
control_scan_id: row.id,
|
|
268
275
|
...(pdfOpslag ? { pdf_opslag: pdfOpslag } : {}),
|
|
276
|
+
...transport,
|
|
269
277
|
},
|
|
270
278
|
});
|
|
271
279
|
if (!printed.ok) {
|
|
@@ -265,6 +265,15 @@ async function runTickRound(supabase, tickJob, ident) {
|
|
|
265
265
|
shippingNotes = { error: String(e?.message ?? e) };
|
|
266
266
|
shippingNotesOk = false;
|
|
267
267
|
}
|
|
268
|
+
// Stickerronde: klant- en tray-stickers (Engine is eigenaar).
|
|
269
|
+
let stickers = null;
|
|
270
|
+
try {
|
|
271
|
+
const { runStickerQueue } = await import("../stickerQueue.server.js");
|
|
272
|
+
stickers = await runStickerQueue(supabase, { limit: 10 });
|
|
273
|
+
}
|
|
274
|
+
catch (e) {
|
|
275
|
+
stickers = { error: String(e?.message ?? e) };
|
|
276
|
+
}
|
|
268
277
|
// Seintjes van de pickschermen: karplan ontbreekt. Direct oppakken.
|
|
269
278
|
let cartPlanRequests = null;
|
|
270
279
|
try {
|
|
@@ -285,6 +294,16 @@ async function runTickRound(supabase, tickJob, ident) {
|
|
|
285
294
|
catch (e) {
|
|
286
295
|
queueCleanup = { error: String(e?.message ?? e) };
|
|
287
296
|
}
|
|
297
|
+
// Blokkades van verzonden orders sluiten, niet-geleverde verlopen orders
|
|
298
|
+
// archiveren en meldingen sluiten waarvan de oorzaak weg is.
|
|
299
|
+
let housekeeping = null;
|
|
300
|
+
try {
|
|
301
|
+
const { data, error } = await supabase.rpc("logistics_plan_housekeeping");
|
|
302
|
+
housekeeping = error ? { error: error.message } : data;
|
|
303
|
+
}
|
|
304
|
+
catch (e) {
|
|
305
|
+
housekeeping = { error: String(e?.message ?? e) };
|
|
306
|
+
}
|
|
288
307
|
// Pakbonnen zonder kar, of van een kar die na een herindeling niet meer
|
|
289
308
|
// bestaat, kunnen nooit een barcode krijgen. Die worden hier afgesloten met
|
|
290
309
|
// een leesbare reden in plaats van eeuwig te blijven wachten.
|
|
@@ -339,7 +358,9 @@ async function runTickRound(supabase, tickJob, ident) {
|
|
|
339
358
|
shippingNotes,
|
|
340
359
|
barcodes,
|
|
341
360
|
cartPlanRequests,
|
|
361
|
+
stickers,
|
|
342
362
|
queueCleanup,
|
|
363
|
+
housekeeping,
|
|
343
364
|
orphanPrintJobs,
|
|
344
365
|
}, { status: shippingNotesOk ? 200 : 500, headers: CORS_HEADERS });
|
|
345
366
|
}
|
|
@@ -8,6 +8,8 @@ export interface LayoutPrintInput {
|
|
|
8
8
|
printPlekId?: string | null;
|
|
9
9
|
herkomst?: string | null;
|
|
10
10
|
isHerprint?: boolean;
|
|
11
|
+
/** Aantal kopieën (standaard 1). */
|
|
12
|
+
kopieen?: number;
|
|
11
13
|
/** Alleen snake_case-velden: print_plek_id, order_id, ordernummer, queue_item_id, cart_id, fulfillment_order_id. */
|
|
12
14
|
payload: Record<string, unknown>;
|
|
13
15
|
idempotentieSleutel: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layoutPrint.server.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPrint.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -96,7 +96,7 @@ export async function printViaLayout(sb, input) {
|
|
|
96
96
|
_layout_id: input.layoutId ?? null,
|
|
97
97
|
_print_plek_id: input.printPlekId ?? null,
|
|
98
98
|
_werkplek: null,
|
|
99
|
-
_kopieen: 1,
|
|
99
|
+
_kopieen: Math.max(1, Math.floor(input.kopieen ?? 1)),
|
|
100
100
|
_herkomst: input.herkomst ?? null,
|
|
101
101
|
_is_herprint: input.isHerprint ?? false,
|
|
102
102
|
_payload: input.payload,
|
|
@@ -7,6 +7,7 @@ export declare const LOGISTICS_MODULES: {
|
|
|
7
7
|
readonly klanten: "Floriday - Klanten Module";
|
|
8
8
|
readonly mailbox: "Mail box voor bestellingen ERP Kwekers";
|
|
9
9
|
readonly personeelsplanning: "Personeelsplanning module";
|
|
10
|
+
readonly logistiek: "Logistiek Engine";
|
|
10
11
|
};
|
|
11
12
|
export type LogisticsModuleKey = keyof typeof LOGISTICS_MODULES;
|
|
12
13
|
export declare const TASK_TYPES: readonly ["buffer.close", "stock.reserve", "load.compose", "pick.execute", "scan.verify", "control.execute", "print.packing_slip", "print.sticker", "print.shipping_note", "print.control_note", "print.production_note", "transport.dispatch"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"logisticsTasks.d.ts","sourceRoot":"","sources":["../../src/lib/logisticsTasks.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB;;;;;;;;;;CAUpB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAEhE,eAAO,MAAM,UAAU,iPAab,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAapE,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAaxD,CAAC;AAEF,eAAO,MAAM,aAAa,wGAShB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CASjE,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAMnD,CAAC;AAGF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAErE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEvE"}
|
|
@@ -13,6 +13,7 @@ export const LOGISTICS_MODULES = {
|
|
|
13
13
|
klanten: "Floriday - Klanten Module",
|
|
14
14
|
mailbox: "Mail box voor bestellingen ERP Kwekers",
|
|
15
15
|
personeelsplanning: "Personeelsplanning module",
|
|
16
|
+
logistiek: "Logistiek Engine",
|
|
16
17
|
};
|
|
17
18
|
export const TASK_TYPES = [
|
|
18
19
|
"buffer.close",
|
|
@@ -36,7 +37,7 @@ export const TASK_OWNER = {
|
|
|
36
37
|
"scan.verify": "scanners",
|
|
37
38
|
"control.execute": "afhandeling",
|
|
38
39
|
"print.packing_slip": "pickschermen",
|
|
39
|
-
"print.sticker": "
|
|
40
|
+
"print.sticker": "logistiek",
|
|
40
41
|
"print.shipping_note": "afhandeling",
|
|
41
42
|
"print.control_note": "afhandeling",
|
|
42
43
|
"print.production_note": "pickschermen",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export declare const PROMPT_MODULE_LABELS: {
|
|
7
7
|
readonly layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)";
|
|
8
8
|
readonly floridaykoppeling: "Floriday koppeling (authenticatie en gateway)";
|
|
9
|
+
readonly dashboards: "Dashboards (dashboard-erp-kwekers)";
|
|
9
10
|
readonly verkoop: "Floriday - Verkoop Module";
|
|
10
11
|
readonly voorraad: "Floriday - Voorraad Module";
|
|
11
12
|
readonly afhandeling: "Floriday - Afhandeling Module";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB
|
|
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"}
|
|
@@ -13,9 +13,10 @@ import { LOGISTICS_MODULES } from "./logisticsTasks";
|
|
|
13
13
|
* documentlayouts waarmee de Engine print.
|
|
14
14
|
*/
|
|
15
15
|
export const PROMPT_MODULE_LABELS = {
|
|
16
|
-
...LOGISTICS_MODULES,
|
|
16
|
+
...(({ logistiek: _l, ...rest }) => rest)(LOGISTICS_MODULES),
|
|
17
17
|
layoutmaker: "Layout maker (pakbonnen, verzendbrieven, extra)",
|
|
18
18
|
floridaykoppeling: "Floriday koppeling (authenticatie en gateway)",
|
|
19
|
+
dashboards: "Dashboards (dashboard-erp-kwekers)",
|
|
19
20
|
};
|
|
20
21
|
function sharedBlock(moduleKey) {
|
|
21
22
|
const key = moduleKey === "<modulesleutel>" ? "<modulesleutel>" : moduleKey;
|
|
@@ -978,6 +979,45 @@ CONTROLELIJST
|
|
|
978
979
|
[ ] Geen indeling in rood met de reden.
|
|
979
980
|
`,
|
|
980
981
|
},
|
|
982
|
+
{
|
|
983
|
+
number: 22,
|
|
984
|
+
title: "Geen eigen ladingdragercontrole meer; blokkade-alarm alleen bij definitieve blokkade",
|
|
985
|
+
date: "2026-10-15",
|
|
986
|
+
summary: "De Engine beslist alleen over belading; mail pas bij een definitieve blokkade, sluiten na geslaagde indeling, koper als klant.",
|
|
987
|
+
body: `WAAROM
|
|
988
|
+
Zeven orders (FO-2601401, 406, 411, 414, 416, 420, 423) kregen een mail
|
|
989
|
+
"kan niet worden ingedeeld, ladingdrager uitgeschakeld", terwijl de Engine ze
|
|
990
|
+
binnen een minuut wel indeelde. De tekst "Deze belading gebruikt een
|
|
991
|
+
ladingdrager die is uitgeschakeld" komt uit de opslagcontrole van deze module,
|
|
992
|
+
niet uit de Engine. In de mail stond de afleverlocatie als klant.
|
|
993
|
+
|
|
994
|
+
WAT JE DOET
|
|
995
|
+
(1) Zoek eerst uit welke ladingdrager jouw controle als uitgeschakeld zag
|
|
996
|
+
(id, naam) en waarom dat afwijkt van de werkwijze van de Engine. Meld dat
|
|
997
|
+
terug vóór je verder bouwt.
|
|
998
|
+
(2) Verwijder je eigen controle op ladingdragers. Alleen de Engine beslist of
|
|
999
|
+
een belading kan. Stuur je eigen controletekst niet meer als reden mee bij
|
|
1000
|
+
het aanmelden.
|
|
1001
|
+
(3) Blokkade-mail alleen als de Engine zegt dat de order definitief
|
|
1002
|
+
geblokkeerd is:
|
|
1003
|
+
supabase.rpc("logistics_order_definitively_blocked", { p_order_id })
|
|
1004
|
+
-> { orderId, definitief, status, pogingen, redenCode, reden }
|
|
1005
|
+
Mail alleen bij definitief = true. Gebruik "reden" als tekst.
|
|
1006
|
+
(4) Sluit het alarm automatisch zodra de order is ingedeeld
|
|
1007
|
+
(definitief = false en status "done"), op order-id.
|
|
1008
|
+
(5) Bij "Klant" staat de koper, via het klant-id van de order. De
|
|
1009
|
+
afleverlocatie komt op een eigen regel "Afleverlocatie".
|
|
1010
|
+
|
|
1011
|
+
REGELS
|
|
1012
|
+
- Match op id, nooit op naam. Niets hardcoded.
|
|
1013
|
+
|
|
1014
|
+
CONTROLELIJST
|
|
1015
|
+
[ ] Terugmelding: welke ladingdrager en waarom de afwijking.
|
|
1016
|
+
[ ] Geen eigen ladingdragercontrole meer.
|
|
1017
|
+
[ ] Nieuwe Floriday-order die wel wordt ingedeeld: geen mail.
|
|
1018
|
+
[ ] Mail noemt de koper als klant.
|
|
1019
|
+
[ ] Meld terug met je pakketversie.`,
|
|
1020
|
+
},
|
|
981
1021
|
],
|
|
982
1022
|
},
|
|
983
1023
|
afhandeling: {
|
|
@@ -1945,6 +1985,28 @@ CONTROLELIJST
|
|
|
1945
1985
|
[ ] Na bulkcontrole staat in logistics_control_scan bron = 'bulk' voor elke kar.
|
|
1946
1986
|
[ ] Een kar die al met de scanner is afgemeld, krijgt geen tweede scan.`,
|
|
1947
1987
|
},
|
|
1988
|
+
{
|
|
1989
|
+
number: 22,
|
|
1990
|
+
title: "Stickermeldingen in Dagdetails en stickeraanvragen",
|
|
1991
|
+
date: "2026-10-14",
|
|
1992
|
+
summary: "Vooraf-melding sticker/etiket tonen in Dagdetails; stickeraanvragen van kopers tonen en accepteren/weigeren vóór expiresOn.",
|
|
1993
|
+
body: `WAT JE BOUWT
|
|
1994
|
+
(a) Afhandeling › Dagdetails: toon per order logistics_order_sticker_meldingen
|
|
1995
|
+
(order_id), letterlijk, zolang opgelost_op leeg is.
|
|
1996
|
+
(b) Stickeraanvragen (/customer-sticker-upload-requests, via de
|
|
1997
|
+
Floriday-koppeling): toon open aanvragen met pdf-preview en expiresOn, en
|
|
1998
|
+
laat accepteren of weigeren vóór het verlopen. Afhandeling is eigenaar van
|
|
1999
|
+
dit scherm; de Floriday-koppeling levert sync/preview/accept/decline.
|
|
2000
|
+
Verlopen aanvragen grijs, niet meer te beantwoorden.
|
|
2001
|
+
|
|
2002
|
+
REGELS
|
|
2003
|
+
- Match op id. Niets hardcoded. Geen eigen stickerprint.
|
|
2004
|
+
|
|
2005
|
+
CONTROLELIJST
|
|
2006
|
+
[ ] Melding staat bij de order in Dagdetails.
|
|
2007
|
+
[ ] Aanvraag accepteren/weigeren werkt vóór expiresOn.
|
|
2008
|
+
[ ] Meld terug met je pakketversie.`,
|
|
2009
|
+
},
|
|
1948
2010
|
],
|
|
1949
2011
|
},
|
|
1950
2012
|
pickschermen: {
|
|
@@ -3645,6 +3707,79 @@ CONTROLELIJST
|
|
|
3645
3707
|
[ ] Order op een gedeelde kar geeft geen "cartplan.missing"-melding.
|
|
3646
3708
|
[ ] Twee keer aanroepen, ook na een afgehandelde melding: geen 409.
|
|
3647
3709
|
[ ] Verdwenen rij: wachtrij ververst, duidelijke tekst, geen 500 in beeld.
|
|
3710
|
+
[ ] Meld terug met je pakketversie.`,
|
|
3711
|
+
},
|
|
3712
|
+
{
|
|
3713
|
+
number: 43,
|
|
3714
|
+
title: "Stickers: alleen de stand tonen",
|
|
3715
|
+
date: "2026-10-14",
|
|
3716
|
+
summary: "Pickschermen voert geen print.sticker meer uit; toont stand en vooraf-melding van de Engine.",
|
|
3717
|
+
body: `WAAROM
|
|
3718
|
+
De Logistiek Engine is eigenaar van print.sticker en print.traysticker. Twee
|
|
3719
|
+
printers van dezelfde sticker geven dubbele etiketten.
|
|
3720
|
+
|
|
3721
|
+
WAT JE BOUWT
|
|
3722
|
+
(a) Voer geen stickertaken uit en roep geen customer-sticker-pdf op.
|
|
3723
|
+
(b) Toon per kar logistics_cart_sticker_state(cart_id): per sticker de status
|
|
3724
|
+
(wacht_op_moment, klaar, in_printwachtrij, geblokkeerd, afgemeld,
|
|
3725
|
+
niet_printen) en reden.
|
|
3726
|
+
(c) Toon per order logistics_order_sticker_meldingen(order_id) bovenaan het
|
|
3727
|
+
pickstation, letterlijk, bijv. "Voor deze order is een sticker 100×62 mm
|
|
3728
|
+
nodig; op Pickstation 1 zit 28×89 mm."
|
|
3729
|
+
|
|
3730
|
+
REGELS
|
|
3731
|
+
- Alleen lezen, op id. Niets hardcoded.
|
|
3732
|
+
|
|
3733
|
+
CONTROLELIJST
|
|
3734
|
+
[ ] Geen eigen stickerprint meer.
|
|
3735
|
+
[ ] Stand per kar en melding per order zichtbaar.
|
|
3736
|
+
[ ] Meld terug met je pakketversie.`,
|
|
3737
|
+
},
|
|
3738
|
+
{
|
|
3739
|
+
number: 44,
|
|
3740
|
+
title: "Stickerstand op het openbare pickstation",
|
|
3741
|
+
date: "2026-10-15",
|
|
3742
|
+
summary: "Anon-leesfuncties met slugcontrole; omhulsel toegang/stand/meldingen; nooit '0 stickers' bij geen toegang.",
|
|
3743
|
+
body: `AANVULLING; bouwt voort op koppelprompt 43. Vereist Logistiek Engine 1.0.146.
|
|
3744
|
+
|
|
3745
|
+
VOLGORDE
|
|
3746
|
+
Eerst Pickschermen bijwerken voor het omhulsel, daarna pas Engine 1.0.146
|
|
3747
|
+
installeren.
|
|
3748
|
+
|
|
3749
|
+
EERST CONTROLEREN
|
|
3750
|
+
Controleer eerst wat 1.0.37 doet met het omhulsel. Het pickstation mag nooit
|
|
3751
|
+
'0 stickers' of 'klaar' tonen als het omhulsel niet herkend wordt; dan altijd
|
|
3752
|
+
'Stickerstand onbekend'.
|
|
3753
|
+
|
|
3754
|
+
WAT DE ENGINE LEVERT (anon en authenticated)
|
|
3755
|
+
pickstation_cart_sticker_state(p_slug text, p_cart_id uuid) -> jsonb
|
|
3756
|
+
pickstation_order_sticker_meldingen(p_slug text, p_order_id uuid) -> jsonb
|
|
3757
|
+
|
|
3758
|
+
Toegang alleen als p_slug een actief pick_station is en de kar
|
|
3759
|
+
(payload.cartId) of order (payload.orderId) in een niet-geannuleerde
|
|
3760
|
+
pick_queue-rij van dat station staat. Match op id en slug, nooit op naam.
|
|
3761
|
+
|
|
3762
|
+
UITKOMSTEN
|
|
3763
|
+
- Kar met toegang: { "toegang": true, "stand": { cartId, totaal, inPrintwachtrij, wachtend, geblokkeerd, regels[] } }
|
|
3764
|
+
- Order met toegang: { "toegang": true, "meldingen": [ { soort, stickerId, melding, plek, benodigd, geladen, sinds } ] }
|
|
3765
|
+
- Geen toegang: { "toegang": false, "reden": "onbekend_of_inactief_station" | "niet_in_wachtrij_station" }
|
|
3766
|
+
|
|
3767
|
+
REGELS VOOR HET SCHERM
|
|
3768
|
+
- toegang = false, toegang ontbreekt, onbekende vorm of fout bij de aanroep
|
|
3769
|
+
-> "Stickerstand onbekend". Nooit "0 stickers" of "klaar".
|
|
3770
|
+
- toegang = true en stand.totaal = 0 -> "Geen stickers nodig voor deze kar".
|
|
3771
|
+
Niet leeg, niet "klaar" en niet "onbekend".
|
|
3772
|
+
- toegang = true en stand.totaal > 0 -> aantallen tonen; "klaar" alleen als
|
|
3773
|
+
wachtend = 0 en geblokkeerd = 0.
|
|
3774
|
+
- Lege meldingen-array bij toegang = true: geen formaatmeldingen.
|
|
3775
|
+
- Roep logistics_cart_sticker_state en logistics_order_sticker_meldingen niet
|
|
3776
|
+
meer aan vanuit het openbare pickstation.
|
|
3777
|
+
- Wijzig geen rechten of RLS.
|
|
3778
|
+
|
|
3779
|
+
CONTROLELIJST
|
|
3780
|
+
[ ] Omhulsel herkend; onbekende vorm geeft "Stickerstand onbekend".
|
|
3781
|
+
[ ] Kar van ander station of onbekende slug: "Stickerstand onbekend".
|
|
3782
|
+
[ ] totaal = 0: "Geen stickers nodig voor deze kar".
|
|
3648
3783
|
[ ] Meld terug met je pakketversie.`,
|
|
3649
3784
|
},
|
|
3650
3785
|
],
|
|
@@ -4618,6 +4753,94 @@ CONTROLELIJST
|
|
|
4618
4753
|
[ ] Printerkeuze gelijk aan printPdf voor dezelfde printplek/werkplek.
|
|
4619
4754
|
[ ] Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's.`,
|
|
4620
4755
|
},
|
|
4756
|
+
{
|
|
4757
|
+
number: 6,
|
|
4758
|
+
title: "Stickers en tray-stickers 1-op-1 printen",
|
|
4759
|
+
date: "2026-10-14",
|
|
4760
|
+
summary: "Documentsoorten sticker en traysticker als kant-en-klare Floriday-pdf printen; geladen etiket blijft leidend.",
|
|
4761
|
+
body: `WAAROM
|
|
4762
|
+
De Logistiek Engine zet Floriday-klantstickers (documentsoort "sticker") en
|
|
4763
|
+
tray-stickers (documentsoort "traysticker") via layout_print_document in de
|
|
4764
|
+
Printwachtrij, met layout_id (Floriday-layout op id), cart_id, print_plek_id,
|
|
4765
|
+
_kopieen en payload.pdf_opslag = { bucket, pad } naast pdf_url.
|
|
4766
|
+
|
|
4767
|
+
WAT JE BOUWT
|
|
4768
|
+
(a) Voeg "traysticker" toe aan de documentsoorten (doc_layout_type) en maak een
|
|
4769
|
+
actieve Floriday-layout voor tray-stickers mogelijk. Zonder layout wacht de
|
|
4770
|
+
Engine met de melding "Geen actieve Floriday-layout voor traysticker".
|
|
4771
|
+
(b) Druk beide soorten 1-op-1 af als kant-en-klare pdf, met het opgegeven aantal
|
|
4772
|
+
kopieën, op de labelprinter van de printplek.
|
|
4773
|
+
(c) De Engine gebruikt jullie bestaande geladen_etiketten(_werkplek_id,
|
|
4774
|
+
_print_plek_id) uit 1.56.0, op id, voor de formaatcontrole. Geen
|
|
4775
|
+
PrintNode-driverformaten. Laat die functie aanroepbaar voor service_role en
|
|
4776
|
+
geef per labelprinter printer_id, naam en breedte_mm/hoogte_mm van het
|
|
4777
|
+
geladen etiket terug.
|
|
4778
|
+
(d) Idempotency-sleutel: sticker:<sticker_id>:<cart_id>:<layout_id> en
|
|
4779
|
+
traysticker:<delivery_order_id>:<cart_id>:<layout_id>; dubbel = bestaand
|
|
4780
|
+
opdracht-id teruggeven.
|
|
4781
|
+
|
|
4782
|
+
REGELS
|
|
4783
|
+
- Match op id. Niets hardcoded.
|
|
4784
|
+
|
|
4785
|
+
CONTROLELIJST
|
|
4786
|
+
[ ] traysticker bestaat als documentsoort.
|
|
4787
|
+
[ ] Sticker-pdf komt 1-op-1 en met juiste kopieën uit de labelprinter.
|
|
4788
|
+
[ ] geladen_etiketten geeft breedte_mm/hoogte_mm per printer.
|
|
4789
|
+
[ ] Meld terug met je pakketversie.`,
|
|
4790
|
+
},
|
|
4791
|
+
{
|
|
4792
|
+
number: 7,
|
|
4793
|
+
title: "Vervoerder en ophaalmoment op de eigen afleverbrief",
|
|
4794
|
+
date: "2026-10-14",
|
|
4795
|
+
summary: "Lees vervoerder, ophaalmoment en ophaaladres uit de payload van verzend- en afleverbrieven; ontbrekend veld = regel niet tonen.",
|
|
4796
|
+
body: `WAT DE ENGINE MEESTUURT
|
|
4797
|
+
Bij elke verzendbrief en afleverbrief na controlescan, uit eigen gegevens op id:
|
|
4798
|
+
- payload.vervoerder.naam (alleen als bekend)
|
|
4799
|
+
- payload.vervoerder.code (optioneel)
|
|
4800
|
+
- payload.ophaalmoment (ISO-tijd in UTC, bijv. 2026-10-15T07:30:00Z)
|
|
4801
|
+
- payload.ophaaladres (optioneel; wordt nu nog niet gevuld, er is geen eigen bron)
|
|
4802
|
+
|
|
4803
|
+
WAT JE BOUWT
|
|
4804
|
+
(a) Toon deze velden op de eigen afleverbrief. Ophaalmoment in Amsterdamse tijd.
|
|
4805
|
+
(b) Ontbreekt een veld, laat die regel weg. Vul nooit een standaardvervoerder of
|
|
4806
|
+
-tijd in.
|
|
4807
|
+
(c) De testprint-uitzondering (payload.is_testprint = true) in
|
|
4808
|
+
logistics_require_cart_on_packing_slip staat nu in de Engine-migratie.
|
|
4809
|
+
Verander die functie niet meer zelf; vraag wijzigingen aan bij de Engine.
|
|
4810
|
+
|
|
4811
|
+
CONTROLELIJST
|
|
4812
|
+
[ ] Vervoerder en ophaalmoment zichtbaar op de afleverbrief als ze zijn meegestuurd.
|
|
4813
|
+
[ ] Ontbrekend veld = geen lege regel.
|
|
4814
|
+
[ ] Meld terug met je pakketversie.`,
|
|
4815
|
+
},
|
|
4816
|
+
{
|
|
4817
|
+
number: 8,
|
|
4818
|
+
title: "Testpakbon zonder kar en zonder barcode",
|
|
4819
|
+
date: "2026-10-15",
|
|
4820
|
+
summary: "Een pakbon met payload.is_testprint = true komt ook door de barcodecontrole; hij krijgt geen kar en geen barcode.",
|
|
4821
|
+
body: `WAT DE ENGINE DOET (vanaf 1.0.143)
|
|
4822
|
+
De uitzondering voor testafdrukken staat nu ook in
|
|
4823
|
+
public.logistics_require_pakbon_barcode() (Engine-migratie). Alleen de
|
|
4824
|
+
letterlijke waarde true van payload.is_testprint telt; elke andere waarde
|
|
4825
|
+
("ja", "1", false, ontbrekend) valt onder de gewone regel en wordt geweigerd
|
|
4826
|
+
als er geen kar is.
|
|
4827
|
+
|
|
4828
|
+
Een testpakbon krijgt geen barcode en geen cart_id: de payload blijft precies
|
|
4829
|
+
zoals jij hem aanlevert.
|
|
4830
|
+
|
|
4831
|
+
WAT JE BOUWT
|
|
4832
|
+
(a) Stuur bij een testpakbon is_testprint als JSON-boolean true mee.
|
|
4833
|
+
(b) Laat het barcode-element op een testpakbon leeg (of toon "TESTAFDRUK");
|
|
4834
|
+
verzin geen barcode.
|
|
4835
|
+
(c) Pas logistics_require_pakbon_barcode en logistics_require_cart_on_packing_slip
|
|
4836
|
+
niet zelf aan; vraag wijzigingen aan bij de Engine.
|
|
4837
|
+
|
|
4838
|
+
CONTROLELIJST
|
|
4839
|
+
[ ] Testpakbon zonder kar wordt aangenomen in de Printwachtrij.
|
|
4840
|
+
[ ] Testpakbon toont geen barcode.
|
|
4841
|
+
[ ] Gewone pakbon zonder kar wordt nog steeds geweigerd.
|
|
4842
|
+
[ ] Meld terug met je pakketversie.`,
|
|
4843
|
+
},
|
|
4621
4844
|
],
|
|
4622
4845
|
},
|
|
4623
4846
|
floridaykoppeling: {
|
|
@@ -4808,6 +5031,86 @@ CONTROLELIJST
|
|
|
4808
5031
|
[ ] De cacherij wijst naar het nieuwste pad.
|
|
4809
5032
|
[ ] Er is geen automatische opruiming van deze map.`,
|
|
4810
5033
|
},
|
|
5034
|
+
{
|
|
5035
|
+
number: 5,
|
|
5036
|
+
title: "Klantstickers: afmelden, tray-stickers op id, versies bewaren",
|
|
5037
|
+
date: "2026-10-14",
|
|
5038
|
+
summary: "Afmeldfunctie voor klantstickers, tray-stickers op fulfillment order, stickerpdf's niet stil overschrijven, cronlink uit de omgeving.",
|
|
5039
|
+
body: `WAAROM
|
|
5040
|
+
De Logistiek Engine is nu eigenaar van het printen van Floriday-stickers
|
|
5041
|
+
(klantstickers en tray-stickers). Hij haalt pdf's alleen via deze koppeling op
|
|
5042
|
+
en roept Floriday nooit rechtstreeks aan.
|
|
5043
|
+
|
|
5044
|
+
WAT JE BOUWT
|
|
5045
|
+
(a) Gateway-export runCustomerStickersHandled(supabase, { stickerIds: string[] })
|
|
5046
|
+
-> { ok: boolean, error?: string }. Roept PATCH /customer-stickers/handled
|
|
5047
|
+
aan (scope sticker:write) met de stickerIds op id. De Engine roept dit pas
|
|
5048
|
+
aan na de goedgekeurde controlescan van alle karren met die sticker.
|
|
5049
|
+
Bevestig in je terugmelding de exacte body volgens de Suppliers API 2026v1.
|
|
5050
|
+
(b) Sync van customer-stickers: bewaar het volledige object (o.a.
|
|
5051
|
+
stickerFileInformation.numberOfCopies/numberOfPages/shouldBePrinted/
|
|
5052
|
+
deliverSeparately/stickerProvidedBy, stickerSize, compositions[],
|
|
5053
|
+
isHandled, isDeleted, salesOrderId, salesOrderCorrectionRequestId) in
|
|
5054
|
+
floriday_customer_stickers_cache.data. Het veld quantity bestaat niet in
|
|
5055
|
+
Floriday; vul het niet met een verzonnen waarde.
|
|
5056
|
+
(c) Tray-stickers: runPdf kind "tray-stickers" moet ook werken met
|
|
5057
|
+
fulfillmentOrderId (GET /fulfillment-orders/{fulfillmentOrderId}/stickers).
|
|
5058
|
+
De Engine stuurt nu deliveryOrderId; accepteer beide, op id. Geef in het
|
|
5059
|
+
antwoord storagePath mee.
|
|
5060
|
+
(d) Sticker- en tray-pdf's: geen upsert op hetzelfde pad. Nieuwe versie = eigen
|
|
5061
|
+
pad, cache op id naar de nieuwste, oude bewaren; geen opruiming binnen 90
|
|
5062
|
+
dagen na leverdatum.
|
|
5063
|
+
(e) De sticker-cron bevat een vaste projectlink. Lees die uit de omgeving
|
|
5064
|
+
(instelling of secret) en fail closed als hij ontbreekt.
|
|
5065
|
+
|
|
5066
|
+
REGELS
|
|
5067
|
+
- Match op id. Geen URL's, sleutels, project-refs of vaste id's in code of
|
|
5068
|
+
migraties.
|
|
5069
|
+
|
|
5070
|
+
CONTROLELIJST
|
|
5071
|
+
[ ] runCustomerStickersHandled bestaat en meldt een sticker af op id.
|
|
5072
|
+
[ ] Cache bevat stickerFileInformation en stickerSize uit Floriday.
|
|
5073
|
+
[ ] Tray-stickers op fulfillmentOrderId geven een pdf met storagePath.
|
|
5074
|
+
[ ] Geen vaste projectlink meer in de cron.
|
|
5075
|
+
[ ] Meld terug met je pakketversie.`,
|
|
5076
|
+
},
|
|
5077
|
+
],
|
|
5078
|
+
},
|
|
5079
|
+
dashboards: {
|
|
5080
|
+
order: 11,
|
|
5081
|
+
summary: "Meldingencentrum: toont meldingen uit de modules en volgt hun status.",
|
|
5082
|
+
revisions: [
|
|
5083
|
+
{
|
|
5084
|
+
number: 1,
|
|
5085
|
+
title: "Meldingencentrum: bron uitzoeken, automatisch sluiten, geen verzonden orders",
|
|
5086
|
+
date: "2026-10-15",
|
|
5087
|
+
summary: "Zoek de bron van de 2057 open meldingen uit, sluit meldingen als de bronmodule ze sluit en verberg verzonden/geannuleerde orders.",
|
|
5088
|
+
body: `WAAROM
|
|
5089
|
+
Het Meldingencentrum toont 2057 open meldingen. In de Logistiek Engine staan na
|
|
5090
|
+
opruiming nog maar ongeveer 31 open voorraadmeldingen (alleen orders die nog
|
|
5091
|
+
gepickt moeten worden). De rest komt dus uit een andere bron of blijft in het
|
|
5092
|
+
Meldingencentrum open terwijl de bron al gesloten is.
|
|
5093
|
+
|
|
5094
|
+
WAT JE DOET
|
|
5095
|
+
(1) Zoek uit uit welke bron(nen) de 2057 komen: tabel/functie per bron, met
|
|
5096
|
+
een telling per bron en per status. Meld dat terug vóór je iets sluit.
|
|
5097
|
+
(2) Sluit een melding automatisch zodra de bronmodule hem sluit, op het id
|
|
5098
|
+
van de bronrij. Voor de Engine: logistics_stock_alerts.status <> 'open'
|
|
5099
|
+
(reden staat in resolution_reason), logistics_plan_queue.status in
|
|
5100
|
+
('done','opgelost','gearchiveerd') voor blokkades.
|
|
5101
|
+
(3) Toon geen meldingen van orders die verzonden, klaar voor facturatie of
|
|
5102
|
+
geannuleerd zijn (op order-id), en geen meldingen van verwijderde orders.
|
|
5103
|
+
|
|
5104
|
+
REGELS
|
|
5105
|
+
- Match op id, nooit op naam. Niets verwijderen: sluiten is een status.
|
|
5106
|
+
- Geen omgevingswaarden in code of migraties.
|
|
5107
|
+
|
|
5108
|
+
CONTROLELIJST
|
|
5109
|
+
[ ] Terugmelding met de telling per bron.
|
|
5110
|
+
[ ] Melding sluit vanzelf als de bron sluit.
|
|
5111
|
+
[ ] Teller daalt; geen meldingen van verzonden of geannuleerde orders.
|
|
5112
|
+
[ ] Meld terug met je pakketversie.`,
|
|
5113
|
+
},
|
|
4811
5114
|
],
|
|
4812
5115
|
},
|
|
4813
5116
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.147";
|
|
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.147";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/planQueue.server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wFAAwF;AACxF,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"planQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/planQueue.server.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,wFAAwF;AACxF,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwR1B;AAmDD,4EAA4E;AAE5E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
|
|
@@ -102,6 +102,7 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
102
102
|
}
|
|
103
103
|
const bufferId = group.find((g) => g.buffer_id)?.buffer_id ?? null;
|
|
104
104
|
let blocked = false;
|
|
105
|
+
let blockedReasonFor = null;
|
|
105
106
|
await trace(sb, {
|
|
106
107
|
...basis,
|
|
107
108
|
nodeId: FLOW_NODE.ontvangst,
|
|
@@ -138,6 +139,7 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
138
139
|
}
|
|
139
140
|
else if (plan.skipped === "blocked") {
|
|
140
141
|
blocked = true;
|
|
142
|
+
blockedReasonFor = plan.blockedReason ?? null;
|
|
141
143
|
result.blocked++;
|
|
142
144
|
if (result.errors.length < 5 && plan.blockedReason)
|
|
143
145
|
result.errors.push(plan.blockedReason);
|
|
@@ -190,6 +192,7 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
190
192
|
}
|
|
191
193
|
else if (plan?.skipped === "blocked") {
|
|
192
194
|
blocked = true;
|
|
195
|
+
blockedReasonFor = plan.blockedReason ?? null;
|
|
193
196
|
result.blocked++;
|
|
194
197
|
if (result.errors.length < 5 && plan.blockedReason)
|
|
195
198
|
result.errors.push(plan.blockedReason);
|
|
@@ -228,6 +231,16 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
228
231
|
// alsnog als afgerond worden weggeschreven. Een wachtende vergelijking
|
|
229
232
|
// krijgt geen "na"-stand en wordt daarom als overgeslagen afgesloten.
|
|
230
233
|
if (blocked) {
|
|
234
|
+
// De blokkade raakt soms alleen de buffer-leden zonder kar, niet de
|
|
235
|
+
// order die deze ronde oppakte (FO-2601389). Sluit die claim dan hier
|
|
236
|
+
// af, anders blijft hij op 'running' staan en herhaalt het vangnet hem.
|
|
237
|
+
await sb
|
|
238
|
+
.rpc("logistics_plan_close_claim", {
|
|
239
|
+
p_id: row.id,
|
|
240
|
+
p_reason: blockedReasonFor ?? "Indeling geblokkeerd",
|
|
241
|
+
p_reason_code: null,
|
|
242
|
+
})
|
|
243
|
+
.then(() => undefined, () => undefined);
|
|
231
244
|
const skipWarnings = await skipPlannerDiffRuns(sb, [row.order_id, ...group.map((g) => g.order_id)].filter(Boolean), "Indeling geblokkeerd; geen nieuwe karindeling om mee te vergelijken.").catch((e) => [String(e)]);
|
|
232
245
|
for (const w of skipWarnings)
|
|
233
246
|
if (result.errors.length < 10)
|
|
@@ -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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"}
|