@flowselections/logistiek-engine 1.0.33 → 1.0.53
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/README.md +24 -24
- package/dist-lib/components/FloridayPoortCard.d.ts.map +1 -1
- package/dist-lib/components/FloridayPoortCard.js +2 -1
- package/dist-lib/components/FlowCanvas.d.ts +28 -0
- package/dist-lib/components/FlowCanvas.d.ts.map +1 -0
- package/dist-lib/components/FlowCanvas.js +429 -0
- package/dist-lib/components/FlowOrders.d.ts +8 -0
- package/dist-lib/components/FlowOrders.d.ts.map +1 -0
- package/dist-lib/components/FlowOrders.js +125 -0
- package/dist-lib/components/FlowPage.d.ts +2 -0
- package/dist-lib/components/FlowPage.d.ts.map +1 -0
- package/dist-lib/components/FlowPage.js +141 -0
- package/dist-lib/components/InklapbaarVenster.d.ts +9 -0
- package/dist-lib/components/InklapbaarVenster.d.ts.map +1 -0
- package/dist-lib/components/InklapbaarVenster.js +10 -0
- package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
- package/dist-lib/components/LogistiekEnginePage.js +9 -3
- package/dist-lib/components/LogistiekEngineQueuePage.d.ts +2 -0
- package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -0
- package/dist-lib/components/LogistiekEngineQueuePage.js +11 -0
- package/dist-lib/components/NodeTracePanel.d.ts +11 -0
- package/dist-lib/components/NodeTracePanel.d.ts.map +1 -0
- package/dist-lib/components/NodeTracePanel.js +40 -0
- package/dist-lib/components/OrderJourneyBar.d.ts +9 -0
- package/dist-lib/components/OrderJourneyBar.d.ts.map +1 -0
- package/dist-lib/components/OrderJourneyBar.js +26 -0
- package/dist-lib/components/OrderLogboek.d.ts +10 -0
- package/dist-lib/components/OrderLogboek.d.ts.map +1 -0
- package/dist-lib/components/OrderLogboek.js +92 -0
- package/dist-lib/components/OrderStopBanner.d.ts +5 -0
- package/dist-lib/components/OrderStopBanner.d.ts.map +1 -0
- package/dist-lib/components/OrderStopBanner.js +22 -0
- package/dist-lib/components/OrderTraceDetails.d.ts +22 -0
- package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -0
- package/dist-lib/components/OrderTraceDetails.js +87 -0
- package/dist-lib/components/RegiePage.d.ts.map +1 -1
- package/dist-lib/components/RegiePage.js +11 -69
- package/dist-lib/components/WerktijdenCard.d.ts +2 -0
- package/dist-lib/components/WerktijdenCard.d.ts.map +1 -0
- package/dist-lib/components/WerktijdenCard.js +37 -0
- package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
- package/dist-lib/components/WerkwijzeHerindelingCard.js +100 -6
- package/dist-lib/hooks/useFloridayGate.d.ts +10 -0
- package/dist-lib/hooks/useFloridayGate.d.ts.map +1 -1
- package/dist-lib/hooks/useFloridayGate.js +4 -0
- package/dist-lib/hooks/useLogisticsTrace.d.ts +78 -0
- package/dist-lib/hooks/useLogisticsTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useLogisticsTrace.js +152 -0
- package/dist-lib/hooks/useOrderNodeTrace.d.ts +11 -0
- package/dist-lib/hooks/useOrderNodeTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderNodeTrace.js +26 -0
- package/dist-lib/hooks/useOrderTrace.d.ts +74 -0
- package/dist-lib/hooks/useOrderTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderTrace.js +134 -0
- package/dist-lib/hooks/useOrderVersies.d.ts +47 -0
- package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderVersies.js +180 -0
- package/dist-lib/hooks/useRuleEngine.d.ts +1 -0
- package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -1
- package/dist-lib/hooks/useRuleEngine.js +1 -0
- package/dist-lib/hooks/useShippingNoteStatus.d.ts +29 -0
- package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -0
- package/dist-lib/hooks/useShippingNoteStatus.js +107 -0
- package/dist-lib/hooks/useWerktijden.d.ts +33 -0
- package/dist-lib/hooks/useWerktijden.d.ts.map +1 -0
- package/dist-lib/hooks/useWerktijden.js +88 -0
- package/dist-lib/hooks/useWerkwijzeStatus.d.ts +12 -1
- package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
- package/dist-lib/hooks/useWerkwijzeStatus.js +60 -4
- package/dist-lib/index.d.ts +13 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +13 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1600 -54
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1600 -54
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +1600 -54
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +1618 -50
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/cartPlanRequests.server.d.ts +1 -1
- package/dist-lib/lib/cartPlanRequests.server.d.ts.map +1 -1
- package/dist-lib/lib/cartPlanRequests.server.js +49 -8
- package/dist-lib/lib/floridayDocuments.functions.d.ts +4644 -6
- package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayDocuments.functions.js +1 -1
- package/dist-lib/lib/floridayDocuments.server.d.ts +14 -0
- package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayDocuments.server.js +58 -0
- package/dist-lib/lib/floridayGuard.server.d.ts +2 -2
- package/dist-lib/lib/floridayGuard.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayGuard.server.js +34 -5
- package/dist-lib/lib/floridayPush.functions.d.ts +1600 -54
- package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayPush.functions.js +1 -1
- package/dist-lib/lib/flowGraph.d.ts +43 -0
- package/dist-lib/lib/flowGraph.d.ts.map +1 -0
- package/dist-lib/lib/flowGraph.js +153 -0
- package/dist-lib/lib/flowNodes.d.ts +23 -0
- package/dist-lib/lib/flowNodes.d.ts.map +1 -0
- package/dist-lib/lib/flowNodes.js +58 -0
- package/dist-lib/lib/flowRoute.d.ts +107 -0
- package/dist-lib/lib/flowRoute.d.ts.map +1 -0
- package/dist-lib/lib/flowRoute.js +280 -0
- package/dist-lib/lib/flowTree.d.ts +64 -0
- package/dist-lib/lib/flowTree.d.ts.map +1 -0
- package/dist-lib/lib/flowTree.js +519 -0
- package/dist-lib/lib/handlers/index.d.ts +1 -0
- package/dist-lib/lib/handlers/index.d.ts.map +1 -1
- package/dist-lib/lib/handlers/index.js +1 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts +3 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +100 -0
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.js +97 -2
- package/dist-lib/lib/loadCarrierPlanner.d.ts +2 -0
- package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanner.js +18 -0
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +7740 -10
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.functions.js +1 -1
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts +9 -0
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.server.js +44 -17
- package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
- package/dist-lib/lib/logisticsPlanner.js +14 -2
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +3096 -4
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.functions.js +1 -1
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts +1600 -54
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalculate.functions.js +1 -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 +3482 -2610
- package/dist-lib/lib/nodeTrace.d.ts +61 -0
- package/dist-lib/lib/nodeTrace.d.ts.map +1 -0
- package/dist-lib/lib/nodeTrace.js +191 -0
- package/dist-lib/lib/pickQueueCleanup.server.d.ts +14 -0
- package/dist-lib/lib/pickQueueCleanup.server.d.ts.map +1 -0
- package/dist-lib/lib/pickQueueCleanup.server.js +80 -0
- package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/planQueue.server.js +140 -0
- package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineImpact.js +11 -4
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +57 -6
- package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineWizard.js +3 -1
- package/dist-lib/lib/shippingNoteQueue.server.d.ts +18 -0
- package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/shippingNoteQueue.server.js +304 -0
- package/dist-lib/lib/trace.server.d.ts +75 -0
- package/dist-lib/lib/trace.server.d.ts.map +1 -0
- package/dist-lib/lib/trace.server.js +75 -0
- package/dist-lib/lib/vakUitleg.d.ts +19 -0
- package/dist-lib/lib/vakUitleg.d.ts.map +1 -0
- package/dist-lib/lib/vakUitleg.js +132 -0
- package/package.json +26 -2
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
- package/dist-lib/integrations/supabase/client.d.ts +0 -20293
- package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
- package/dist-lib/integrations/supabase/client.js +0 -13
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { TraceEventRow } from "../hooks/useLogisticsTrace";
|
|
2
|
+
export type NodeStatus = "geslaagd" | "wachtend" | "waarschuwing" | "overgeslagen" | "mislukt";
|
|
3
|
+
export interface NodeTraceGroep {
|
|
4
|
+
nodeId: string;
|
|
5
|
+
events: TraceEventRow[];
|
|
6
|
+
aantal: number;
|
|
7
|
+
eerste: string | null;
|
|
8
|
+
laatste: string | null;
|
|
9
|
+
duurMs: number | null;
|
|
10
|
+
status: NodeStatus;
|
|
11
|
+
pogingen: number;
|
|
12
|
+
reden: string | null;
|
|
13
|
+
errorClass: string | null;
|
|
14
|
+
volgendeStap: string | null;
|
|
15
|
+
}
|
|
16
|
+
/** Terugval voor oude gebeurtenissen zonder vastgelegd vakje. */
|
|
17
|
+
export declare function gokNode(e: TraceEventRow): string | null;
|
|
18
|
+
/** Groepeert de gebeurtenissen van één order per vakje van de flowkaart. */
|
|
19
|
+
export declare function groepeerPerNode(events: TraceEventRow[] | null | undefined): Map<string, NodeTraceGroep>;
|
|
20
|
+
/** De vakjes op volgorde van de eerste gebeurtenis: de reis van de order. */
|
|
21
|
+
export declare function reisVolgorde(groepen: Map<string, NodeTraceGroep>): NodeTraceGroep[];
|
|
22
|
+
export interface VakSamenvatting {
|
|
23
|
+
beslissing: string | null;
|
|
24
|
+
reden: string | null;
|
|
25
|
+
regel: string | null;
|
|
26
|
+
berekening: {
|
|
27
|
+
setting?: string;
|
|
28
|
+
formula?: string;
|
|
29
|
+
result?: string;
|
|
30
|
+
conclusion?: string;
|
|
31
|
+
values?: Record<string, unknown>;
|
|
32
|
+
} | null;
|
|
33
|
+
volgendeStap: string | null;
|
|
34
|
+
fout: string | null;
|
|
35
|
+
errorClass: string | null;
|
|
36
|
+
pogingen: number;
|
|
37
|
+
volgendePoging: string | null;
|
|
38
|
+
aantalBeslissingen: number;
|
|
39
|
+
aantalAutomatisch: number;
|
|
40
|
+
}
|
|
41
|
+
/** Is dit een automatische database-regel (trigger) in plaats van een engine-beslissing? */
|
|
42
|
+
export declare function isAutomatisch(e: TraceEventRow): boolean;
|
|
43
|
+
/** Korte samenvatting van wat de Engine in dit vakje besliste. */
|
|
44
|
+
export declare function samenvatVak(groep: NodeTraceGroep): VakSamenvatting;
|
|
45
|
+
export interface Gebundeld {
|
|
46
|
+
key: string;
|
|
47
|
+
/** Eén losse engine-gebeurtenis, of null bij een bundel. */
|
|
48
|
+
event: TraceEventRow | null;
|
|
49
|
+
/** Bij een bundel: alle gelijksoortige automatische regels. */
|
|
50
|
+
events: TraceEventRow[];
|
|
51
|
+
aantal: number;
|
|
52
|
+
laatste: string | null;
|
|
53
|
+
label: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Engine-gebeurtenissen blijven los; automatische database-regels worden
|
|
57
|
+
* per soort (stap + tabel + actie) samengevoegd tot één regel met telling.
|
|
58
|
+
* Nieuwste eerst.
|
|
59
|
+
*/
|
|
60
|
+
export declare function bundelGebeurtenissen(events: TraceEventRow[] | null | undefined): Gebundeld[];
|
|
61
|
+
//# sourceMappingURL=nodeTrace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeTrace.d.ts","sourceRoot":"","sources":["../../src/lib/nodeTrace.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGhE,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,SAAS,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAUD,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAwBvD;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAgDvG;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,cAAc,EAAE,CAMnF;AAMD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,IAAI,CAAC;IACT,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAEvD;AAQD,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA8BlE;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,4DAA4D;IAC5D,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,+DAA+D;IAC/D,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,EAAE,CAuC5F"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/nodeTrace.ts — gebeurtenissen van een order per vakje van de flowkaart
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// De Engine legt bij nieuwe gebeurtenissen het vakje (node_id) vast. Oudere
|
|
5
|
+
// gebeurtenissen missen dat; die plaatsen we met een terugval op stap/fase.
|
|
6
|
+
// Alleen lezen: hier wordt niets bepaald, alleen gegroepeerd.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
import { FLOW_NODE } from "./flowNodes";
|
|
9
|
+
const ERNST = {
|
|
10
|
+
geslaagd: 0,
|
|
11
|
+
overgeslagen: 0,
|
|
12
|
+
waarschuwing: 1,
|
|
13
|
+
wachtend: 2,
|
|
14
|
+
mislukt: 3,
|
|
15
|
+
};
|
|
16
|
+
/** Terugval voor oude gebeurtenissen zonder vastgelegd vakje. */
|
|
17
|
+
export function gokNode(e) {
|
|
18
|
+
if (e.nodeId)
|
|
19
|
+
return e.nodeId;
|
|
20
|
+
// Automatische registraties: eerst op tabel en actie, dan pas op tekst.
|
|
21
|
+
const tabel = (e.dbTable ?? "").toLowerCase();
|
|
22
|
+
if (tabel) {
|
|
23
|
+
if (tabel === "logistics_plan_queue") {
|
|
24
|
+
return (e.dbAction ?? "").toUpperCase() === "INSERT" ? FLOW_NODE.ontvangst : FLOW_NODE.indeling;
|
|
25
|
+
}
|
|
26
|
+
if (/control|scan/.test(tabel))
|
|
27
|
+
return FLOW_NODE.controle;
|
|
28
|
+
if (/print|slip|shipping_note|document/.test(tabel))
|
|
29
|
+
return FLOW_NODE.stations;
|
|
30
|
+
if (/pick|cart/.test(tabel))
|
|
31
|
+
return FLOW_NODE.picken;
|
|
32
|
+
if (/order/.test(tabel))
|
|
33
|
+
return FLOW_NODE.ontvangst;
|
|
34
|
+
}
|
|
35
|
+
const t = `${e.phase ?? ""} ${e.step ?? ""}`.toLowerCase();
|
|
36
|
+
if (/binnengekomen|ontvangst|nieuwe order|combineren|buffer/.test(t))
|
|
37
|
+
return FLOW_NODE.ontvangst;
|
|
38
|
+
if (/indeling|plan|kar|belading/.test(t))
|
|
39
|
+
return FLOW_NODE.indeling;
|
|
40
|
+
if (/pick(?!station)/.test(t))
|
|
41
|
+
return FLOW_NODE.picken;
|
|
42
|
+
if (/vrijgave|aanmeld|drukte|vertraging|wacht/.test(t))
|
|
43
|
+
return FLOW_NODE.vrijgave;
|
|
44
|
+
if (/pakbon|print|verzendbrief|document|station|floriday/.test(t))
|
|
45
|
+
return FLOW_NODE.stations;
|
|
46
|
+
if (/controle|scan|afmeld/.test(t))
|
|
47
|
+
return FLOW_NODE.controle;
|
|
48
|
+
if (/afgehandeld|gereed|klaar/.test(t))
|
|
49
|
+
return FLOW_NODE.eind;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/** Groepeert de gebeurtenissen van één order per vakje van de flowkaart. */
|
|
53
|
+
export function groepeerPerNode(events) {
|
|
54
|
+
const veilig = Array.isArray(events) ? events : [];
|
|
55
|
+
const map = new Map();
|
|
56
|
+
for (const e of veilig) {
|
|
57
|
+
const id = gokNode(e);
|
|
58
|
+
if (!id)
|
|
59
|
+
continue;
|
|
60
|
+
const bestaand = map.get(id);
|
|
61
|
+
if (bestaand) {
|
|
62
|
+
bestaand.events.push(e);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
map.set(id, {
|
|
66
|
+
nodeId: id,
|
|
67
|
+
events: [e],
|
|
68
|
+
aantal: 0,
|
|
69
|
+
eerste: null,
|
|
70
|
+
laatste: null,
|
|
71
|
+
duurMs: null,
|
|
72
|
+
status: "geslaagd",
|
|
73
|
+
pogingen: 0,
|
|
74
|
+
reden: null,
|
|
75
|
+
errorClass: null,
|
|
76
|
+
volgendeStap: null,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
for (const groep of map.values()) {
|
|
81
|
+
groep.events.sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0));
|
|
82
|
+
const laatsteEvent = groep.events[groep.events.length - 1];
|
|
83
|
+
groep.aantal = groep.events.length;
|
|
84
|
+
groep.eerste = groep.events[0]?.createdAt ?? null;
|
|
85
|
+
groep.laatste = laatsteEvent?.createdAt ?? null;
|
|
86
|
+
const totaal = groep.events.reduce((som, e) => som + (e.durationMs ?? 0), 0);
|
|
87
|
+
groep.duurMs = totaal > 0 ? totaal : null;
|
|
88
|
+
groep.pogingen = groep.events.reduce((m, e) => Math.max(m, e.attempts ?? 0), 0);
|
|
89
|
+
groep.volgendeStap = laatsteEvent?.nextStep ?? null;
|
|
90
|
+
let ergste = groep.events[0];
|
|
91
|
+
for (const e of groep.events) {
|
|
92
|
+
if ((ERNST[e.status] ?? 0) >= (ERNST[ergste?.status ?? "geslaagd"] ?? 0))
|
|
93
|
+
ergste = e;
|
|
94
|
+
}
|
|
95
|
+
groep.status = ergste?.status ?? "geslaagd";
|
|
96
|
+
groep.reden = ergste?.reason ?? ergste?.error ?? ergste?.decision ?? laatsteEvent?.reason ?? null;
|
|
97
|
+
groep.errorClass = ergste?.errorClass ?? null;
|
|
98
|
+
}
|
|
99
|
+
return map;
|
|
100
|
+
}
|
|
101
|
+
/** De vakjes op volgorde van de eerste gebeurtenis: de reis van de order. */
|
|
102
|
+
export function reisVolgorde(groepen) {
|
|
103
|
+
return [...groepen.values()].sort((a, b) => {
|
|
104
|
+
const ta = a.eerste ?? "";
|
|
105
|
+
const tb = b.eerste ?? "";
|
|
106
|
+
return ta < tb ? -1 : ta > tb ? 1 : 0;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Is dit een automatische database-regel (trigger) in plaats van een engine-beslissing? */
|
|
110
|
+
export function isAutomatisch(e) {
|
|
111
|
+
return (e.phase ?? "").toLowerCase() === "database";
|
|
112
|
+
}
|
|
113
|
+
function calcVan(e) {
|
|
114
|
+
const c = e.calc;
|
|
115
|
+
if (!c || typeof c !== "object")
|
|
116
|
+
return null;
|
|
117
|
+
return c;
|
|
118
|
+
}
|
|
119
|
+
/** Korte samenvatting van wat de Engine in dit vakje besliste. */
|
|
120
|
+
export function samenvatVak(groep) {
|
|
121
|
+
const events = Array.isArray(groep.events) ? groep.events : [];
|
|
122
|
+
const engine = events.filter((e) => !isAutomatisch(e));
|
|
123
|
+
const relevant = engine.length > 0 ? engine : events;
|
|
124
|
+
const laatsteMet = (kies) => {
|
|
125
|
+
for (let i = relevant.length - 1; i >= 0; i--) {
|
|
126
|
+
const ev = relevant[i];
|
|
127
|
+
if (!ev)
|
|
128
|
+
continue;
|
|
129
|
+
const v = kies(ev);
|
|
130
|
+
if (v !== null && v !== undefined && v !== "")
|
|
131
|
+
return v;
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
};
|
|
135
|
+
const foutEvent = [...relevant].reverse().find((e) => e.status === "mislukt") ?? null;
|
|
136
|
+
return {
|
|
137
|
+
beslissing: laatsteMet((e) => e.decision),
|
|
138
|
+
reden: laatsteMet((e) => e.reason) ?? groep.reden,
|
|
139
|
+
regel: laatsteMet((e) => e.rule),
|
|
140
|
+
berekening: laatsteMet((e) => calcVan(e)),
|
|
141
|
+
volgendeStap: laatsteMet((e) => e.nextStep) ?? groep.volgendeStap,
|
|
142
|
+
fout: foutEvent?.error ?? null,
|
|
143
|
+
errorClass: foutEvent?.errorClass ?? groep.errorClass,
|
|
144
|
+
pogingen: groep.pogingen,
|
|
145
|
+
volgendePoging: laatsteMet((e) => e.nextAttemptAt),
|
|
146
|
+
aantalBeslissingen: engine.length,
|
|
147
|
+
aantalAutomatisch: events.length - engine.length,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Engine-gebeurtenissen blijven los; automatische database-regels worden
|
|
152
|
+
* per soort (stap + tabel + actie) samengevoegd tot één regel met telling.
|
|
153
|
+
* Nieuwste eerst.
|
|
154
|
+
*/
|
|
155
|
+
export function bundelGebeurtenissen(events) {
|
|
156
|
+
const veilig = Array.isArray(events) ? [...events] : [];
|
|
157
|
+
veilig.sort((a, b) => (a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0));
|
|
158
|
+
const uit = [];
|
|
159
|
+
const index = new Map();
|
|
160
|
+
for (const e of veilig) {
|
|
161
|
+
if (!isAutomatisch(e)) {
|
|
162
|
+
uit.push({
|
|
163
|
+
key: e.id,
|
|
164
|
+
event: e,
|
|
165
|
+
events: [e],
|
|
166
|
+
aantal: 1,
|
|
167
|
+
laatste: e.createdAt,
|
|
168
|
+
label: e.step,
|
|
169
|
+
});
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const key = `auto:${e.step}|${e.dbTable ?? ""}|${e.dbAction ?? ""}`;
|
|
173
|
+
const bestaand = index.get(key);
|
|
174
|
+
if (bestaand) {
|
|
175
|
+
bestaand.events.push(e);
|
|
176
|
+
bestaand.aantal += 1;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const bundel = {
|
|
180
|
+
key,
|
|
181
|
+
event: null,
|
|
182
|
+
events: [e],
|
|
183
|
+
aantal: 1,
|
|
184
|
+
laatste: e.createdAt,
|
|
185
|
+
label: e.step,
|
|
186
|
+
};
|
|
187
|
+
index.set(key, bundel);
|
|
188
|
+
uit.push(bundel);
|
|
189
|
+
}
|
|
190
|
+
return uit;
|
|
191
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
export interface PickQueueCleanupResult {
|
|
3
|
+
mode: string | null;
|
|
4
|
+
cartRows: number;
|
|
5
|
+
retiredOrderRows: number;
|
|
6
|
+
errors: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Verbergt oude orderregels uit het actieve pickscherm zodra dezelfde
|
|
10
|
+
* pickeenheid concrete karregels heeft. De regel blijft als printhistorie
|
|
11
|
+
* bestaan; karrencontrole gebruikt de canonieke kargegevens en blijft intact.
|
|
12
|
+
*/
|
|
13
|
+
export declare function retireSupersededOrderRows(sb: SupabaseClient): Promise<PickQueueCleanupResult>;
|
|
14
|
+
//# sourceMappingURL=pickQueueCleanup.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickQueueCleanup.server.d.ts","sourceRoot":"","sources":["../../src/lib/pickQueueCleanup.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,cAAc,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAiFjC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const REPLACED_REASON = "Vervangen door actuele karregels.";
|
|
2
|
+
/**
|
|
3
|
+
* Verbergt oude orderregels uit het actieve pickscherm zodra dezelfde
|
|
4
|
+
* pickeenheid concrete karregels heeft. De regel blijft als printhistorie
|
|
5
|
+
* bestaan; karrencontrole gebruikt de canonieke kargegevens en blijft intact.
|
|
6
|
+
*/
|
|
7
|
+
export async function retireSupersededOrderRows(sb) {
|
|
8
|
+
const result = {
|
|
9
|
+
mode: null,
|
|
10
|
+
cartRows: 0,
|
|
11
|
+
retiredOrderRows: 0,
|
|
12
|
+
errors: [],
|
|
13
|
+
};
|
|
14
|
+
const { data: modeData, error: modeError } = await sb.rpc("logistics_pick_mode");
|
|
15
|
+
if (modeError) {
|
|
16
|
+
result.errors.push(modeError.message);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
const modeValue = Array.isArray(modeData) ? modeData[0] : modeData;
|
|
20
|
+
const modeObject = modeValue && typeof modeValue === "object"
|
|
21
|
+
? modeValue
|
|
22
|
+
: null;
|
|
23
|
+
result.mode = String(modeObject?.["pickMode"] ?? modeObject?.["mode"] ?? "");
|
|
24
|
+
if (result.mode !== "cart")
|
|
25
|
+
return result;
|
|
26
|
+
const { data: cartRows, error: cartRowsError } = await sb
|
|
27
|
+
.from("pick_queue")
|
|
28
|
+
.select("order_number")
|
|
29
|
+
.is("cancelled_at", null)
|
|
30
|
+
.not("payload->>cartRowFor", "is", null);
|
|
31
|
+
if (cartRowsError) {
|
|
32
|
+
result.errors.push(cartRowsError.message);
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
const safeCartRows = Array.isArray(cartRows) ? cartRows : [];
|
|
36
|
+
const orderNumbers = [...new Set(safeCartRows
|
|
37
|
+
.map((row) => row.order_number)
|
|
38
|
+
.filter((value) => typeof value === "string" && value.length > 0))];
|
|
39
|
+
result.cartRows = safeCartRows.length;
|
|
40
|
+
if (orderNumbers.length === 0)
|
|
41
|
+
return result;
|
|
42
|
+
const replacedAt = new Date().toISOString();
|
|
43
|
+
const { data: oldRows, error: oldRowsError } = await sb
|
|
44
|
+
.from("pick_queue")
|
|
45
|
+
.select("id, payload")
|
|
46
|
+
.in("order_number", orderNumbers)
|
|
47
|
+
.is("cancelled_at", null)
|
|
48
|
+
.is("payload->>cartRowFor", null);
|
|
49
|
+
if (oldRowsError) {
|
|
50
|
+
result.errors.push(oldRowsError.message);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
const safeOldRows = Array.isArray(oldRows) ? oldRows : [];
|
|
54
|
+
for (const row of safeOldRows) {
|
|
55
|
+
const payload = row.payload && typeof row.payload === "object" && !Array.isArray(row.payload)
|
|
56
|
+
? row.payload
|
|
57
|
+
: {};
|
|
58
|
+
const { error } = await sb
|
|
59
|
+
.from("pick_queue")
|
|
60
|
+
.update({
|
|
61
|
+
cancelled_at: replacedAt,
|
|
62
|
+
payload: {
|
|
63
|
+
...payload,
|
|
64
|
+
cartPlanReady: true,
|
|
65
|
+
cartPlanReason: null,
|
|
66
|
+
supersededByCartRows: true,
|
|
67
|
+
supersededReason: REPLACED_REASON,
|
|
68
|
+
supersededAt: replacedAt,
|
|
69
|
+
},
|
|
70
|
+
updated_at: replacedAt,
|
|
71
|
+
})
|
|
72
|
+
.eq("id", row.id)
|
|
73
|
+
.is("cancelled_at", null);
|
|
74
|
+
if (error)
|
|
75
|
+
result.errors.push(error.message);
|
|
76
|
+
else
|
|
77
|
+
result.retiredOrderRows += 1;
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
@@ -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;
|
|
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;AAO5D,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,CAuP1B;AA0CD,4EAA4E;AAE5E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
// ============================================================================
|
|
10
10
|
import { replanBufferInternal, replanOrderInternal } from "./loadCarrierPlanning.server.js";
|
|
11
11
|
import { attachIndelingToTasks } from "./loadCarrierTaskSync.server.js";
|
|
12
|
+
import { trace, newTraceId, classifyError } from "./trace.server.js";
|
|
13
|
+
import { FLOW_NODE } from "./flowNodes.js";
|
|
12
14
|
const EMPTY = {
|
|
13
15
|
claimed: 0,
|
|
14
16
|
planned: 0,
|
|
@@ -37,10 +39,54 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
37
39
|
// Voorkomt dat dezelfde buffer binnen één ronde meerdere keren wordt gepland.
|
|
38
40
|
const plannedBuffers = new Set();
|
|
39
41
|
const touchedDates = new Set();
|
|
42
|
+
// Herkenbare ordernummers voor het logboek; nooit verzinnen bij ontbreken.
|
|
43
|
+
const orderNumbers = new Map();
|
|
44
|
+
{
|
|
45
|
+
const ids = Array.from(new Set(rows.map((r) => r.order_id).filter(Boolean)));
|
|
46
|
+
if (ids.length > 0) {
|
|
47
|
+
const { data: orderRows } = await sb
|
|
48
|
+
.from("orders")
|
|
49
|
+
.select("id, order_number, order_source")
|
|
50
|
+
.in("id", ids);
|
|
51
|
+
for (const o of Array.isArray(orderRows) ? orderRows : []) {
|
|
52
|
+
orderNumbers.set(String(o?.id), {
|
|
53
|
+
number: o?.order_number ? String(o.order_number) : null,
|
|
54
|
+
source: o?.order_source === "floriday" ? "floriday" : o?.order_source ? "eigen" : null,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
40
59
|
for (const row of rows) {
|
|
60
|
+
// Het trace-id is de wachtrijrij zelf: zo horen alle stappen van deze
|
|
61
|
+
// herberekening aantoonbaar bij één "versie" in het orderlogboek.
|
|
62
|
+
const traceId = row.id || newTraceId();
|
|
63
|
+
const gevonden = orderNumbers.get(row.order_id);
|
|
64
|
+
const basis = {
|
|
65
|
+
traceId,
|
|
66
|
+
orderRef: gevonden?.number ?? row.order_id,
|
|
67
|
+
orderSource: gevonden?.source ?? null,
|
|
68
|
+
phase: "karindeling",
|
|
69
|
+
actor: "logistiek-engine:planwachtrij",
|
|
70
|
+
attempts: Number(row.attempts ?? 0),
|
|
71
|
+
nodeId: FLOW_NODE.indeling,
|
|
72
|
+
};
|
|
41
73
|
if (Date.now() > deadlineAt) {
|
|
42
74
|
// Teruggeven aan de wachtrij; de volgende ronde pakt hem weer op.
|
|
43
75
|
await sb.rpc("logistics_plan_finish", { p_id: row.id, p_error: "deadline" });
|
|
76
|
+
await trace(sb, {
|
|
77
|
+
...basis,
|
|
78
|
+
step: "Indelen uitgesteld",
|
|
79
|
+
status: "wachtend",
|
|
80
|
+
decision: "Order blijft wachten",
|
|
81
|
+
reason: "De ronde was te lang bezig; deze order gaat mee met de volgende ronde.",
|
|
82
|
+
errorClass: "regel",
|
|
83
|
+
nextStep: "Volgende planronde (elke minuut)",
|
|
84
|
+
calc: {
|
|
85
|
+
setting: "Maximale duur van één planronde",
|
|
86
|
+
values: { rondeEindigdeOm: new Date(deadlineAt).toISOString(), beoordeeldOm: new Date().toISOString() },
|
|
87
|
+
conclusion: "De order is niet overgeslagen, maar doorgeschoven naar de eerstvolgende ronde.",
|
|
88
|
+
},
|
|
89
|
+
});
|
|
44
90
|
continue;
|
|
45
91
|
}
|
|
46
92
|
try {
|
|
@@ -54,23 +100,74 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
54
100
|
}
|
|
55
101
|
const bufferId = group.find((g) => g.buffer_id)?.buffer_id ?? null;
|
|
56
102
|
let blocked = false;
|
|
103
|
+
await trace(sb, {
|
|
104
|
+
...basis,
|
|
105
|
+
nodeId: FLOW_NODE.ontvangst,
|
|
106
|
+
step: "Order opgepakt voor indeling",
|
|
107
|
+
status: "geslaagd",
|
|
108
|
+
decision: bufferId ? "Order hoort bij een buffer" : "Order wordt los ingedeeld",
|
|
109
|
+
reason: bufferId
|
|
110
|
+
? "De order zit in een buffer; alle orders van die buffer worden samen ingedeeld."
|
|
111
|
+
: "Er is geen open buffer voor deze order, dus hij wordt zelfstandig ingedeeld.",
|
|
112
|
+
reads: { geraakteOrders: group.length, bufferId, planDatums: [...touchedDates] },
|
|
113
|
+
nextStep: "Karrenindeling berekenen",
|
|
114
|
+
});
|
|
115
|
+
const startMs = Date.now();
|
|
57
116
|
if (bufferId) {
|
|
58
117
|
if (!plannedBuffers.has(bufferId)) {
|
|
59
118
|
plannedBuffers.add(bufferId);
|
|
60
119
|
const plan = await replanBufferInternal(sb, bufferId);
|
|
61
120
|
if (plan.skipped === "locked") {
|
|
62
121
|
result.skippedLocked++;
|
|
122
|
+
await trace(sb, {
|
|
123
|
+
...basis,
|
|
124
|
+
step: "Indeling overgeslagen",
|
|
125
|
+
status: "overgeslagen",
|
|
126
|
+
decision: "Indeling blijft zoals hij is",
|
|
127
|
+
reason: "De karren van deze buffer zijn al geprint, gescand of gecontroleerd.",
|
|
128
|
+
errorClass: "regel",
|
|
129
|
+
durationMs: Date.now() - startMs,
|
|
130
|
+
calc: {
|
|
131
|
+
setting: "Wanneer mag een karrenindeling niet meer veranderen",
|
|
132
|
+
conclusion: "Bevroren karren worden nooit opnieuw ingedeeld, ook niet bij een herberekening.",
|
|
133
|
+
},
|
|
134
|
+
nextStep: "Pickstations en documenten",
|
|
135
|
+
});
|
|
63
136
|
}
|
|
64
137
|
else if (plan.skipped === "blocked") {
|
|
65
138
|
blocked = true;
|
|
66
139
|
result.blocked++;
|
|
67
140
|
if (result.errors.length < 5 && plan.blockedReason)
|
|
68
141
|
result.errors.push(plan.blockedReason);
|
|
142
|
+
await trace(sb, {
|
|
143
|
+
...basis,
|
|
144
|
+
step: "Indeling geblokkeerd",
|
|
145
|
+
status: "mislukt",
|
|
146
|
+
decision: "Order gaat niet verder",
|
|
147
|
+
errorClass: classifyError(null, plan.blockedReason ?? null),
|
|
148
|
+
durationMs: Date.now() - startMs,
|
|
149
|
+
nextStep: "Gegevens aanvullen en opnieuw indelen",
|
|
150
|
+
...(plan.blockedReason ? { reason: plan.blockedReason, error: plan.blockedReason } : {}),
|
|
151
|
+
});
|
|
69
152
|
}
|
|
70
153
|
else {
|
|
71
154
|
result.planned++;
|
|
72
155
|
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
73
156
|
await attachIndelingToTasks(sb, plan);
|
|
157
|
+
await trace(sb, {
|
|
158
|
+
...basis,
|
|
159
|
+
step: "Buffer ingedeeld op karren",
|
|
160
|
+
status: "geslaagd",
|
|
161
|
+
decision: "Karrenindeling gemaakt",
|
|
162
|
+
durationMs: Date.now() - startMs,
|
|
163
|
+
output: { bufferId, karrenAangemaakt: Number(plan.cartsCreated ?? 0) },
|
|
164
|
+
calc: {
|
|
165
|
+
setting: "Indelingsmethode van de actieve werkwijze",
|
|
166
|
+
values: { buffer: bufferId, karren: Number(plan.cartsCreated ?? 0) },
|
|
167
|
+
result: `${Number(plan.cartsCreated ?? 0)} kar(ren) voor deze buffer`,
|
|
168
|
+
},
|
|
169
|
+
nextStep: "Vrijgave en aanmeldmoment",
|
|
170
|
+
});
|
|
74
171
|
}
|
|
75
172
|
}
|
|
76
173
|
}
|
|
@@ -78,17 +175,51 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
78
175
|
const plan = await replanOrderInternal(sb, row.order_id);
|
|
79
176
|
if (plan?.skipped === "locked") {
|
|
80
177
|
result.skippedLocked++;
|
|
178
|
+
await trace(sb, {
|
|
179
|
+
...basis,
|
|
180
|
+
step: "Indeling overgeslagen",
|
|
181
|
+
status: "overgeslagen",
|
|
182
|
+
decision: "Indeling blijft zoals hij is",
|
|
183
|
+
reason: "De karren van deze order zijn al geprint, gescand of gecontroleerd.",
|
|
184
|
+
errorClass: "regel",
|
|
185
|
+
durationMs: Date.now() - startMs,
|
|
186
|
+
nextStep: "Pickstations en documenten",
|
|
187
|
+
});
|
|
81
188
|
}
|
|
82
189
|
else if (plan?.skipped === "blocked") {
|
|
83
190
|
blocked = true;
|
|
84
191
|
result.blocked++;
|
|
85
192
|
if (result.errors.length < 5 && plan.blockedReason)
|
|
86
193
|
result.errors.push(plan.blockedReason);
|
|
194
|
+
await trace(sb, {
|
|
195
|
+
...basis,
|
|
196
|
+
step: "Indeling geblokkeerd",
|
|
197
|
+
status: "mislukt",
|
|
198
|
+
decision: "Order gaat niet verder",
|
|
199
|
+
errorClass: classifyError(null, plan.blockedReason ?? null),
|
|
200
|
+
durationMs: Date.now() - startMs,
|
|
201
|
+
nextStep: "Gegevens aanvullen en opnieuw indelen",
|
|
202
|
+
...(plan.blockedReason ? { reason: plan.blockedReason, error: plan.blockedReason } : {}),
|
|
203
|
+
});
|
|
87
204
|
}
|
|
88
205
|
else if (plan) {
|
|
89
206
|
result.planned++;
|
|
90
207
|
result.cartsCreated += Number(plan.cartsCreated ?? 0);
|
|
91
208
|
await attachIndelingToTasks(sb, plan);
|
|
209
|
+
await trace(sb, {
|
|
210
|
+
...basis,
|
|
211
|
+
step: "Order ingedeeld op karren",
|
|
212
|
+
status: "geslaagd",
|
|
213
|
+
decision: "Karrenindeling gemaakt",
|
|
214
|
+
durationMs: Date.now() - startMs,
|
|
215
|
+
output: { karrenAangemaakt: Number(plan.cartsCreated ?? 0) },
|
|
216
|
+
calc: {
|
|
217
|
+
setting: "Indelingsmethode van de actieve werkwijze",
|
|
218
|
+
values: { karren: Number(plan.cartsCreated ?? 0) },
|
|
219
|
+
result: `${Number(plan.cartsCreated ?? 0)} kar(ren) voor deze order`,
|
|
220
|
+
},
|
|
221
|
+
nextStep: "Vrijgave en aanmeldmoment",
|
|
222
|
+
});
|
|
92
223
|
}
|
|
93
224
|
}
|
|
94
225
|
// De blokkade zet de wachtrijregel zelf al op 'geblokkeerd'; die mag niet
|
|
@@ -110,6 +241,15 @@ export async function runPlanQueue(sb, options = {}) {
|
|
|
110
241
|
if (result.errors.length < 5)
|
|
111
242
|
result.errors.push(message);
|
|
112
243
|
await sb.rpc("logistics_plan_finish", { p_id: row.id, p_error: message });
|
|
244
|
+
await trace(sb, {
|
|
245
|
+
...basis,
|
|
246
|
+
step: "Indelen mislukt",
|
|
247
|
+
status: "mislukt",
|
|
248
|
+
decision: "Order gaat niet verder",
|
|
249
|
+
errorClass: classifyError(null, message),
|
|
250
|
+
error: message,
|
|
251
|
+
nextStep: "Automatisch opnieuw geprobeerd in de volgende planronde",
|
|
252
|
+
});
|
|
113
253
|
}
|
|
114
254
|
}
|
|
115
255
|
if (result.planned > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruleEngineImpact.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineImpact.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"ruleEngineImpact.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineImpact.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,GAAG,cAAc,CAwL1E;AAMD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,WAAW,EAAE,CA2CrE;AAID,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAiBD,wBAAgB,YAAY,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,QAAQ,EAAE,CAqBrF"}
|
|
@@ -81,9 +81,16 @@ export function analyseImpact(settings) {
|
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
83
|
const control = f(settings, "controle", "control_mode");
|
|
84
|
-
score(control === "scanner");
|
|
85
|
-
if (control === "scanner")
|
|
84
|
+
score(control === "scanner" || control === "scan_only");
|
|
85
|
+
if (control === "scanner" || control === "scan_only")
|
|
86
86
|
scanMoments += 1;
|
|
87
|
+
if (control === "scan_only") {
|
|
88
|
+
signals.push({
|
|
89
|
+
level: "info",
|
|
90
|
+
title: "Scannen voor afmelden",
|
|
91
|
+
detail: "Eén scan van de pakbon meldt de hele kar af; er wordt geen verzendbrief geprint.",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
87
94
|
if (control === "skip") {
|
|
88
95
|
signals.push({
|
|
89
96
|
level: "risk",
|
|
@@ -111,8 +118,8 @@ export function analyseImpact(settings) {
|
|
|
111
118
|
if (reschedule === "manual_approval") {
|
|
112
119
|
signals.push({
|
|
113
120
|
level: "warning",
|
|
114
|
-
title: "Herplannen
|
|
115
|
-
detail: "
|
|
121
|
+
title: "Herplannen gebeurt handmatig",
|
|
122
|
+
detail: "De Engine verzet vertraagde orders niet; dat doe je zelf in de Afhandeling-module.",
|
|
116
123
|
});
|
|
117
124
|
}
|
|
118
125
|
if (f(settings, "order_picken", "internal_alert_enabled") === false) {
|
|
@@ -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":"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,EAwhChC,CAAC;AAKF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAgBhE;AAED,wBAAgB,eAAe,IAAI,kBAAkB,CAMpD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAalE;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,CAAC,EAAE,kBAAkB,WAcjC;AAYD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,UAE3D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,UAEhD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,UAEnD"}
|