@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.
Files changed (166) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/components/FloridayPoortCard.d.ts.map +1 -1
  3. package/dist-lib/components/FloridayPoortCard.js +2 -1
  4. package/dist-lib/components/FlowCanvas.d.ts +28 -0
  5. package/dist-lib/components/FlowCanvas.d.ts.map +1 -0
  6. package/dist-lib/components/FlowCanvas.js +429 -0
  7. package/dist-lib/components/FlowOrders.d.ts +8 -0
  8. package/dist-lib/components/FlowOrders.d.ts.map +1 -0
  9. package/dist-lib/components/FlowOrders.js +125 -0
  10. package/dist-lib/components/FlowPage.d.ts +2 -0
  11. package/dist-lib/components/FlowPage.d.ts.map +1 -0
  12. package/dist-lib/components/FlowPage.js +141 -0
  13. package/dist-lib/components/InklapbaarVenster.d.ts +9 -0
  14. package/dist-lib/components/InklapbaarVenster.d.ts.map +1 -0
  15. package/dist-lib/components/InklapbaarVenster.js +10 -0
  16. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  17. package/dist-lib/components/LogistiekEnginePage.js +9 -3
  18. package/dist-lib/components/LogistiekEngineQueuePage.d.ts +2 -0
  19. package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -0
  20. package/dist-lib/components/LogistiekEngineQueuePage.js +11 -0
  21. package/dist-lib/components/NodeTracePanel.d.ts +11 -0
  22. package/dist-lib/components/NodeTracePanel.d.ts.map +1 -0
  23. package/dist-lib/components/NodeTracePanel.js +40 -0
  24. package/dist-lib/components/OrderJourneyBar.d.ts +9 -0
  25. package/dist-lib/components/OrderJourneyBar.d.ts.map +1 -0
  26. package/dist-lib/components/OrderJourneyBar.js +26 -0
  27. package/dist-lib/components/OrderLogboek.d.ts +10 -0
  28. package/dist-lib/components/OrderLogboek.d.ts.map +1 -0
  29. package/dist-lib/components/OrderLogboek.js +92 -0
  30. package/dist-lib/components/OrderStopBanner.d.ts +5 -0
  31. package/dist-lib/components/OrderStopBanner.d.ts.map +1 -0
  32. package/dist-lib/components/OrderStopBanner.js +22 -0
  33. package/dist-lib/components/OrderTraceDetails.d.ts +22 -0
  34. package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -0
  35. package/dist-lib/components/OrderTraceDetails.js +87 -0
  36. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  37. package/dist-lib/components/RegiePage.js +11 -69
  38. package/dist-lib/components/WerktijdenCard.d.ts +2 -0
  39. package/dist-lib/components/WerktijdenCard.d.ts.map +1 -0
  40. package/dist-lib/components/WerktijdenCard.js +37 -0
  41. package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
  42. package/dist-lib/components/WerkwijzeHerindelingCard.js +100 -6
  43. package/dist-lib/hooks/useFloridayGate.d.ts +10 -0
  44. package/dist-lib/hooks/useFloridayGate.d.ts.map +1 -1
  45. package/dist-lib/hooks/useFloridayGate.js +4 -0
  46. package/dist-lib/hooks/useLogisticsTrace.d.ts +78 -0
  47. package/dist-lib/hooks/useLogisticsTrace.d.ts.map +1 -0
  48. package/dist-lib/hooks/useLogisticsTrace.js +152 -0
  49. package/dist-lib/hooks/useOrderNodeTrace.d.ts +11 -0
  50. package/dist-lib/hooks/useOrderNodeTrace.d.ts.map +1 -0
  51. package/dist-lib/hooks/useOrderNodeTrace.js +26 -0
  52. package/dist-lib/hooks/useOrderTrace.d.ts +74 -0
  53. package/dist-lib/hooks/useOrderTrace.d.ts.map +1 -0
  54. package/dist-lib/hooks/useOrderTrace.js +134 -0
  55. package/dist-lib/hooks/useOrderVersies.d.ts +47 -0
  56. package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -0
  57. package/dist-lib/hooks/useOrderVersies.js +180 -0
  58. package/dist-lib/hooks/useRuleEngine.d.ts +1 -0
  59. package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -1
  60. package/dist-lib/hooks/useRuleEngine.js +1 -0
  61. package/dist-lib/hooks/useShippingNoteStatus.d.ts +29 -0
  62. package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -0
  63. package/dist-lib/hooks/useShippingNoteStatus.js +107 -0
  64. package/dist-lib/hooks/useWerktijden.d.ts +33 -0
  65. package/dist-lib/hooks/useWerktijden.d.ts.map +1 -0
  66. package/dist-lib/hooks/useWerktijden.js +88 -0
  67. package/dist-lib/hooks/useWerkwijzeStatus.d.ts +12 -1
  68. package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
  69. package/dist-lib/hooks/useWerkwijzeStatus.js +60 -4
  70. package/dist-lib/index.d.ts +13 -0
  71. package/dist-lib/index.d.ts.map +1 -1
  72. package/dist-lib/index.js +13 -0
  73. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1600 -54
  74. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  75. package/dist-lib/integrations/supabase/client.server.d.ts +1600 -54
  76. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  77. package/dist-lib/integrations/supabase/client.server.js +1 -1
  78. package/dist-lib/integrations/supabase/moduleClient.d.ts +1600 -54
  79. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  80. package/dist-lib/integrations/supabase/types.d.ts +1618 -50
  81. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  82. package/dist-lib/lib/cartPlanRequests.server.d.ts +1 -1
  83. package/dist-lib/lib/cartPlanRequests.server.d.ts.map +1 -1
  84. package/dist-lib/lib/cartPlanRequests.server.js +49 -8
  85. package/dist-lib/lib/floridayDocuments.functions.d.ts +4644 -6
  86. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  87. package/dist-lib/lib/floridayDocuments.functions.js +1 -1
  88. package/dist-lib/lib/floridayDocuments.server.d.ts +14 -0
  89. package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -1
  90. package/dist-lib/lib/floridayDocuments.server.js +58 -0
  91. package/dist-lib/lib/floridayGuard.server.d.ts +2 -2
  92. package/dist-lib/lib/floridayGuard.server.d.ts.map +1 -1
  93. package/dist-lib/lib/floridayGuard.server.js +34 -5
  94. package/dist-lib/lib/floridayPush.functions.d.ts +1600 -54
  95. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  96. package/dist-lib/lib/floridayPush.functions.js +1 -1
  97. package/dist-lib/lib/flowGraph.d.ts +43 -0
  98. package/dist-lib/lib/flowGraph.d.ts.map +1 -0
  99. package/dist-lib/lib/flowGraph.js +153 -0
  100. package/dist-lib/lib/flowNodes.d.ts +23 -0
  101. package/dist-lib/lib/flowNodes.d.ts.map +1 -0
  102. package/dist-lib/lib/flowNodes.js +58 -0
  103. package/dist-lib/lib/flowRoute.d.ts +107 -0
  104. package/dist-lib/lib/flowRoute.d.ts.map +1 -0
  105. package/dist-lib/lib/flowRoute.js +280 -0
  106. package/dist-lib/lib/flowTree.d.ts +64 -0
  107. package/dist-lib/lib/flowTree.d.ts.map +1 -0
  108. package/dist-lib/lib/flowTree.js +519 -0
  109. package/dist-lib/lib/handlers/index.d.ts +1 -0
  110. package/dist-lib/lib/handlers/index.d.ts.map +1 -1
  111. package/dist-lib/lib/handlers/index.js +1 -0
  112. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts +3 -0
  113. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -0
  114. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +100 -0
  115. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  116. package/dist-lib/lib/handlers/logistics-tick.server.js +97 -2
  117. package/dist-lib/lib/loadCarrierPlanner.d.ts +2 -0
  118. package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
  119. package/dist-lib/lib/loadCarrierPlanner.js +18 -0
  120. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +7740 -10
  121. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  122. package/dist-lib/lib/loadCarrierPlanning.functions.js +1 -1
  123. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +9 -0
  124. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  125. package/dist-lib/lib/loadCarrierPlanning.server.js +44 -17
  126. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
  127. package/dist-lib/lib/logisticsPlanner.js +14 -2
  128. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +3096 -4
  129. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  130. package/dist-lib/lib/logisticsRecalcJob.functions.js +1 -1
  131. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +1600 -54
  132. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  133. package/dist-lib/lib/logisticsRecalculate.functions.js +1 -1
  134. package/dist-lib/lib/modulePrompts.d.ts +1 -0
  135. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  136. package/dist-lib/lib/modulePrompts.js +3482 -2610
  137. package/dist-lib/lib/nodeTrace.d.ts +61 -0
  138. package/dist-lib/lib/nodeTrace.d.ts.map +1 -0
  139. package/dist-lib/lib/nodeTrace.js +191 -0
  140. package/dist-lib/lib/pickQueueCleanup.server.d.ts +14 -0
  141. package/dist-lib/lib/pickQueueCleanup.server.d.ts.map +1 -0
  142. package/dist-lib/lib/pickQueueCleanup.server.js +80 -0
  143. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  144. package/dist-lib/lib/planQueue.server.js +140 -0
  145. package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -1
  146. package/dist-lib/lib/ruleEngineImpact.js +11 -4
  147. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  148. package/dist-lib/lib/ruleEngineSchema.js +57 -6
  149. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
  150. package/dist-lib/lib/ruleEngineWizard.js +3 -1
  151. package/dist-lib/lib/shippingNoteQueue.server.d.ts +18 -0
  152. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -0
  153. package/dist-lib/lib/shippingNoteQueue.server.js +304 -0
  154. package/dist-lib/lib/trace.server.d.ts +75 -0
  155. package/dist-lib/lib/trace.server.d.ts.map +1 -0
  156. package/dist-lib/lib/trace.server.js +75 -0
  157. package/dist-lib/lib/vakUitleg.d.ts +19 -0
  158. package/dist-lib/lib/vakUitleg.d.ts.map +1 -0
  159. package/dist-lib/lib/vakUitleg.js +132 -0
  160. package/package.json +26 -2
  161. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
  162. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
  163. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
  164. package/dist-lib/integrations/supabase/client.d.ts +0 -20293
  165. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  166. 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;AAI5D,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,CAsG1B;AA0CD,4EAA4E;AAE5E,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE"}
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,CAgL1E;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"}
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 wacht op goedkeuring",
115
- detail: "Vertraagde orders blijven staan tot een gebruiker de nieuwe leverdatum goedkeurt.",
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":"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"}
1
+ {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}