@flowselections/logistiek-engine 1.0.53 → 1.0.89

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 (168) hide show
  1. package/README.md +24 -24
  2. package/dist-lib/components/AfrondWachtrijCard.d.ts +2 -0
  3. package/dist-lib/components/AfrondWachtrijCard.d.ts.map +1 -0
  4. package/dist-lib/components/AfrondWachtrijCard.js +27 -0
  5. package/dist-lib/components/BeladingsafwijkingenCard.d.ts +2 -0
  6. package/dist-lib/components/BeladingsafwijkingenCard.d.ts.map +1 -0
  7. package/dist-lib/components/BeladingsafwijkingenCard.js +44 -0
  8. package/dist-lib/components/FlowCanvas.d.ts +6 -0
  9. package/dist-lib/components/FlowCanvas.d.ts.map +1 -1
  10. package/dist-lib/components/FlowCanvas.js +79 -18
  11. package/dist-lib/components/FlowOrders.d.ts.map +1 -1
  12. package/dist-lib/components/FlowOrders.js +59 -13
  13. package/dist-lib/components/FlowPage.d.ts.map +1 -1
  14. package/dist-lib/components/FlowPage.js +175 -6
  15. package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
  16. package/dist-lib/components/GeblokkeerdeOrdersCard.js +21 -2
  17. package/dist-lib/components/KardekkingCard.d.ts +2 -0
  18. package/dist-lib/components/KardekkingCard.d.ts.map +1 -0
  19. package/dist-lib/components/KardekkingCard.js +29 -0
  20. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  21. package/dist-lib/components/LogistiekEnginePage.js +7 -1
  22. package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -1
  23. package/dist-lib/components/LogistiekEngineQueuePage.js +4 -2
  24. package/dist-lib/components/NodeTracePanel.d.ts +4 -1
  25. package/dist-lib/components/NodeTracePanel.d.ts.map +1 -1
  26. package/dist-lib/components/NodeTracePanel.js +8 -2
  27. package/dist-lib/components/OrderStopBanner.d.ts +9 -2
  28. package/dist-lib/components/OrderStopBanner.d.ts.map +1 -1
  29. package/dist-lib/components/OrderStopBanner.js +27 -13
  30. package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -1
  31. package/dist-lib/components/OrderTraceDetails.js +2 -1
  32. package/dist-lib/components/PlanWachtrijPage.d.ts +2 -0
  33. package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -0
  34. package/dist-lib/components/PlanWachtrijPage.js +99 -0
  35. package/dist-lib/components/PlannerDiffCard.d.ts +2 -0
  36. package/dist-lib/components/PlannerDiffCard.d.ts.map +1 -0
  37. package/dist-lib/components/PlannerDiffCard.js +25 -0
  38. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  39. package/dist-lib/components/RegiePage.js +21 -13
  40. package/dist-lib/components/TaakGezondheidCard.d.ts +2 -0
  41. package/dist-lib/components/TaakGezondheidCard.d.ts.map +1 -0
  42. package/dist-lib/components/TaakGezondheidCard.js +31 -0
  43. package/dist-lib/hooks/useAfrondWachtrij.d.ts +28 -0
  44. package/dist-lib/hooks/useAfrondWachtrij.d.ts.map +1 -0
  45. package/dist-lib/hooks/useAfrondWachtrij.js +88 -0
  46. package/dist-lib/hooks/useBeladingsafwijkingen.d.ts +39 -0
  47. package/dist-lib/hooks/useBeladingsafwijkingen.d.ts.map +1 -0
  48. package/dist-lib/hooks/useBeladingsafwijkingen.js +119 -0
  49. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +7 -0
  50. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
  51. package/dist-lib/hooks/useGeblokkeerdeOrders.js +28 -2
  52. package/dist-lib/hooks/useLogisticsTrace.js +1 -1
  53. package/dist-lib/hooks/useOrderTrace.js +1 -1
  54. package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -1
  55. package/dist-lib/hooks/useOrderVersies.js +17 -3
  56. package/dist-lib/hooks/usePlanWachtrij.d.ts +33 -0
  57. package/dist-lib/hooks/usePlanWachtrij.d.ts.map +1 -0
  58. package/dist-lib/hooks/usePlanWachtrij.js +104 -0
  59. package/dist-lib/hooks/useRecalcJob.js +1 -1
  60. package/dist-lib/hooks/useShippingNoteDiagnose.d.ts +20 -0
  61. package/dist-lib/hooks/useShippingNoteDiagnose.d.ts.map +1 -0
  62. package/dist-lib/hooks/useShippingNoteDiagnose.js +52 -0
  63. package/dist-lib/hooks/useTaakGezondheid.d.ts +16 -0
  64. package/dist-lib/hooks/useTaakGezondheid.d.ts.map +1 -0
  65. package/dist-lib/hooks/useTaakGezondheid.js +43 -0
  66. package/dist-lib/hooks/useWerktijden.js +1 -1
  67. package/dist-lib/hooks/useWerkwijzeStatus.js +1 -1
  68. package/dist-lib/index.d.ts +10 -0
  69. package/dist-lib/index.d.ts.map +1 -1
  70. package/dist-lib/index.js +10 -0
  71. package/dist-lib/integrations/supabase/auth-middleware.d.ts +3147 -159
  72. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  73. package/dist-lib/integrations/supabase/client.server.d.ts +3147 -159
  74. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  75. package/dist-lib/integrations/supabase/client.server.js +1 -1
  76. package/dist-lib/integrations/supabase/moduleClient.d.ts +3147 -159
  77. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  78. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts +1 -1
  79. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  80. package/dist-lib/integrations/supabase/previewAuthStorage.js +8 -1
  81. package/dist-lib/integrations/supabase/types.d.ts +3183 -161
  82. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  83. package/dist-lib/lib/attachAuthToken.js +1 -1
  84. package/dist-lib/lib/bufferDecision.test.d.ts +2 -0
  85. package/dist-lib/lib/bufferDecision.test.d.ts.map +1 -0
  86. package/dist-lib/lib/bufferDecision.test.js +104 -0
  87. package/dist-lib/lib/cartCoverage.functions.d.ts +30820 -0
  88. package/dist-lib/lib/cartCoverage.functions.d.ts.map +1 -0
  89. package/dist-lib/lib/cartCoverage.functions.js +20 -0
  90. package/dist-lib/lib/floridayDocuments.functions.d.ts +8979 -15
  91. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  92. package/dist-lib/lib/floridayDocuments.functions.js +5 -5
  93. package/dist-lib/lib/floridayPush.functions.d.ts +3147 -159
  94. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  95. package/dist-lib/lib/floridayPush.functions.js +3 -3
  96. package/dist-lib/lib/flowJourney.d.ts +40 -0
  97. package/dist-lib/lib/flowJourney.d.ts.map +1 -0
  98. package/dist-lib/lib/flowJourney.js +156 -0
  99. package/dist-lib/lib/flowNodes.d.ts +3 -0
  100. package/dist-lib/lib/flowNodes.d.ts.map +1 -1
  101. package/dist-lib/lib/flowNodes.js +6 -0
  102. package/dist-lib/lib/flowRoute.d.ts +11 -1
  103. package/dist-lib/lib/flowRoute.d.ts.map +1 -1
  104. package/dist-lib/lib/flowRoute.js +343 -40
  105. package/dist-lib/lib/flowTree.d.ts +86 -1
  106. package/dist-lib/lib/flowTree.d.ts.map +1 -1
  107. package/dist-lib/lib/flowTree.js +391 -2
  108. package/dist-lib/lib/foutTekst.d.ts +4 -0
  109. package/dist-lib/lib/foutTekst.d.ts.map +1 -0
  110. package/dist-lib/lib/foutTekst.js +43 -0
  111. package/dist-lib/lib/handlers/logistics-tick.server.d.ts +2 -0
  112. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  113. package/dist-lib/lib/handlers/logistics-tick.server.js +56 -0
  114. package/dist-lib/lib/handlers/logistics-tick.test.d.ts +2 -0
  115. package/dist-lib/lib/handlers/logistics-tick.test.d.ts.map +1 -0
  116. package/dist-lib/lib/handlers/logistics-tick.test.js +63 -0
  117. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +14965 -25
  118. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  119. package/dist-lib/lib/loadCarrierPlanning.functions.js +7 -7
  120. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +24 -12
  121. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  122. package/dist-lib/lib/loadCarrierPlanning.server.js +490 -211
  123. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +5986 -10
  124. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  125. package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -4
  126. package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
  127. package/dist-lib/lib/logisticsRecalcJob.server.js +17 -2
  128. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +3147 -159
  129. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  130. package/dist-lib/lib/logisticsRecalculate.functions.js +2 -2
  131. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  132. package/dist-lib/lib/modulePrompts.js +3436 -3325
  133. package/dist-lib/lib/nodeTrace.d.ts +4 -0
  134. package/dist-lib/lib/nodeTrace.d.ts.map +1 -1
  135. package/dist-lib/lib/nodeTrace.js +6 -15
  136. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  137. package/dist-lib/lib/planQueue.server.js +24 -3
  138. package/dist-lib/lib/plannerDiff.d.ts +37 -0
  139. package/dist-lib/lib/plannerDiff.d.ts.map +1 -0
  140. package/dist-lib/lib/plannerDiff.functions.d.ts +30821 -0
  141. package/dist-lib/lib/plannerDiff.functions.d.ts.map +1 -0
  142. package/dist-lib/lib/plannerDiff.functions.js +21 -0
  143. package/dist-lib/lib/plannerDiff.js +74 -0
  144. package/dist-lib/lib/plannerDiff.server.d.ts +5 -0
  145. package/dist-lib/lib/plannerDiff.server.d.ts.map +1 -0
  146. package/dist-lib/lib/plannerDiff.server.js +60 -0
  147. package/dist-lib/lib/plannerDiff.test.d.ts +2 -0
  148. package/dist-lib/lib/plannerDiff.test.d.ts.map +1 -0
  149. package/dist-lib/lib/plannerDiff.test.js +41 -0
  150. package/dist-lib/lib/resolveBuffer.test.d.ts +2 -0
  151. package/dist-lib/lib/resolveBuffer.test.d.ts.map +1 -0
  152. package/dist-lib/lib/resolveBuffer.test.js +38 -0
  153. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  154. package/dist-lib/lib/ruleEngineSchema.js +52 -0
  155. package/dist-lib/lib/stopReden.d.ts +43 -0
  156. package/dist-lib/lib/stopReden.d.ts.map +1 -0
  157. package/dist-lib/lib/stopReden.js +197 -0
  158. package/dist-lib/lib/taskCounts.d.ts +2 -0
  159. package/dist-lib/lib/taskCounts.d.ts.map +1 -0
  160. package/dist-lib/lib/taskCounts.js +15 -0
  161. package/dist-lib/lib/taskCounts.test.d.ts +2 -0
  162. package/dist-lib/lib/taskCounts.test.d.ts.map +1 -0
  163. package/dist-lib/lib/taskCounts.test.js +12 -0
  164. package/dist-lib/lib/trace.server.d.ts.map +1 -1
  165. package/dist-lib/lib/trace.server.js +3 -0
  166. package/dist-lib/lib/vakUitleg.d.ts.map +1 -1
  167. package/dist-lib/lib/vakUitleg.js +2 -1
  168. package/package.json +158 -155
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { resolveBufferForOrderInternal } from "./loadCarrierPlanning.server";
3
+ function fakeClient(initial, afterRpc) {
4
+ const calls = { rpc: 0, writes: 0 };
5
+ let current = initial;
6
+ const client = {
7
+ from(table) {
8
+ return {
9
+ select: () => ({
10
+ eq: () => ({
11
+ maybeSingle: async () => ({ data: table === "orders" ? { id: "o1", buffer_id: current } : null }),
12
+ }),
13
+ }),
14
+ update: () => { calls.writes++; return { eq: async () => ({}) }; },
15
+ insert: () => { calls.writes++; return { select: () => ({ single: async () => ({}) }) }; },
16
+ };
17
+ },
18
+ async rpc() { calls.rpc++; current = afterRpc; return { error: null }; },
19
+ };
20
+ return { client: client, calls };
21
+ }
22
+ describe("resolveBufferForOrderInternal (alleen lezen)", () => {
23
+ it("gebruikt de bestaande buffer zonder iets te schrijven", async () => {
24
+ const { client, calls } = fakeClient("b1", "b2");
25
+ expect(await resolveBufferForOrderInternal(client, "o1")).toBe("b1");
26
+ expect(calls).toEqual({ rpc: 0, writes: 0 });
27
+ });
28
+ it("laat de database beslissen als er nog geen buffer is", async () => {
29
+ const { client, calls } = fakeClient(null, "b9");
30
+ expect(await resolveBufferForOrderInternal(client, "o1")).toBe("b9");
31
+ expect(calls).toEqual({ rpc: 1, writes: 0 });
32
+ });
33
+ it("maakt nooit zelf een buffer als de database er geen geeft", async () => {
34
+ const { client, calls } = fakeClient(null, null);
35
+ expect(await resolveBufferForOrderInternal(client, "o1")).toBeNull();
36
+ expect(calls.writes).toBe(0);
37
+ });
38
+ });
@@ -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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"}
@@ -985,6 +985,58 @@ export const RULE_STEPS = [
985
985
  },
986
986
  ],
987
987
  },
988
+ {
989
+ id: "opruimen",
990
+ label: "Opruimen",
991
+ icon: "trash",
992
+ description: "Hoe lang bewaart de engine afgeronde en geannuleerde taken voordat ze worden opgeruimd?",
993
+ supportsConditions: false,
994
+ groups: [
995
+ {
996
+ id: "opruimen",
997
+ label: "Bewaartermijn",
998
+ description: "Afgeronde, overgeslagen en geannuleerde taken worden na deze termijn verwijderd. Lopende en geplande taken blijven altijd staan. Zonder ingevulde termijn wordt er niets opgeruimd.",
999
+ fields: [
1000
+ {
1001
+ key: "task_retention_days",
1002
+ default: 90,
1003
+ label: "Afgeronde taken bewaren (dagen)",
1004
+ type: "number",
1005
+ min: 1,
1006
+ max: 3650,
1007
+ description: "Laat dit leeg om niets op te ruimen. Karren, karnummers en totalen van afgehandelde of gecontroleerde karren blijven hoe dan ook behouden.",
1008
+ },
1009
+ {
1010
+ key: "trace_retention_days",
1011
+ default: 30,
1012
+ label: "Logboekregels bewaren (dagen)",
1013
+ type: "number",
1014
+ min: 1,
1015
+ max: 3650,
1016
+ description: "Na deze termijn worden logboekregels van orders opgeruimd. Laat leeg om niets op te ruimen.",
1017
+ },
1018
+ {
1019
+ key: "pick_history_retention_days",
1020
+ default: 180,
1021
+ label: "Pickhistorie bewaren (dagen)",
1022
+ type: "number",
1023
+ min: 1,
1024
+ max: 3650,
1025
+ description: "Na deze termijn wordt de historie van de pickstations opgeruimd. Laat leeg om niets op te ruimen.",
1026
+ },
1027
+ {
1028
+ key: "barcode_retention_days",
1029
+ default: 30,
1030
+ label: "Barcodes van verdwenen karren bewaren (dagen)",
1031
+ type: "number",
1032
+ min: 1,
1033
+ max: 3650,
1034
+ description: "Alleen barcodes van karren die niet meer bestaan en nooit zijn geprint, gescand of gecontroleerd. Laat leeg om niets op te ruimen.",
1035
+ },
1036
+ ],
1037
+ },
1038
+ ],
1039
+ },
988
1040
  ];
989
1041
  export function defaultStepSettings(step) {
990
1042
  const fields = {};
@@ -0,0 +1,43 @@
1
+ import type { TraceOrderStand } from "../hooks/useOrderTrace";
2
+ import type { ShippingNoteDiagnose } from "../hooks/useShippingNoteDiagnose";
3
+ import type { NodeTraceGroep } from "./nodeTrace";
4
+ export type StopSoort = "mislukt" | "wachtrij" | "handeling" | "nietvastgelegd" | "klaar";
5
+ export interface StopReden {
6
+ soort: StopSoort;
7
+ /** Korte kop, bijvoorbeeld "Hier is de order vastgelopen". */
8
+ titel: string;
9
+ /** Waarom de reis hier ophoudt. */
10
+ reden: string;
11
+ /** Bepalende gegevens, als korte regels. */
12
+ feiten: string[];
13
+ /** Wat er hierna moet gebeuren. */
14
+ volgendeStap: string | null;
15
+ /** De route is elders opgehouden door een gewijzigde instelling. */
16
+ verouderd: boolean;
17
+ }
18
+ /**
19
+ * Waarom de flow bij een samenkomstpunt blijft staan: de ingestelde voorwaarde
20
+ * is nog niet gehaald, of een verplichte tak is mislukt.
21
+ */
22
+ export declare function samenkomstStop(input: {
23
+ wachtOp: string[];
24
+ mislukt?: string[];
25
+ voorwaarde: string;
26
+ maxWachtMinuten: number;
27
+ }): StopReden;
28
+ /**
29
+ * Bepaalt in gewone taal waarom de blauwe route bij dit vakje ophoudt.
30
+ * Werkt ook als er voor dit vakje nog niets is vastgelegd.
31
+ */
32
+ export declare function stopReden(input: {
33
+ nodeId: string;
34
+ groep?: NodeTraceGroep | null;
35
+ stand?: TraceOrderStand | null;
36
+ verouderd?: boolean;
37
+ }): StopReden;
38
+ /**
39
+ * Waarom is de verzendbrief bij deze order nog niet opgehaald? Zet de
40
+ * alleen-lezen diagnose om naar dezelfde stoptekst als de rest van de kaart.
41
+ */
42
+ export declare function verzendbriefStop(d: ShippingNoteDiagnose | null | undefined): StopReden | null;
43
+ //# sourceMappingURL=stopReden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopReden.d.ts","sourceRoot":"","sources":["../../src/lib/stopReden.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC;CACpB;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,SAAS,CA+BZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,SAAS,CA+FZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAsC7F"}
@@ -0,0 +1,197 @@
1
+ // ============================================================================
2
+ // src/lib/stopReden.ts — waarom houdt de reis van deze order hier op?
3
+ // ============================================================================
4
+ // Eén bron van waarheid voor de tekst "Hier stopt de flow", die op het vakje in
5
+ // de kaart, in het zijpaneel en in de balk boven de kaart wordt getoond.
6
+ // Alleen lezen: hier wordt niets bepaald of gewijzigd.
7
+ // ============================================================================
8
+ import { FLOW_NODE, flowNodeLabel } from "./flowNodes";
9
+ import { foutSoort, foutTekst } from "./foutTekst";
10
+ import { vakUitleg } from "./vakUitleg";
11
+ const WACHTRIJ_TEKST = {
12
+ pending: "de berekening staat in de wachtrij en is nog niet opgepakt",
13
+ queued: "de berekening staat in de wachtrij en is nog niet opgepakt",
14
+ running: "de berekening is op dit moment bezig",
15
+ blocked: "de berekening is geblokkeerd",
16
+ failed: "de laatste berekening is mislukt",
17
+ };
18
+ function tijdTekst(waarde) {
19
+ if (!waarde)
20
+ return null;
21
+ const d = new Date(waarde);
22
+ if (Number.isNaN(d.getTime()))
23
+ return null;
24
+ return d.toLocaleString("nl-NL", { day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit" });
25
+ }
26
+ /**
27
+ * Waarom de flow bij een samenkomstpunt blijft staan: de ingestelde voorwaarde
28
+ * is nog niet gehaald, of een verplichte tak is mislukt.
29
+ */
30
+ export function samenkomstStop(input) {
31
+ const wachtOp = Array.isArray(input.wachtOp) ? input.wachtOp : [];
32
+ const mislukt = Array.isArray(input.mislukt) ? input.mislukt : [];
33
+ const feiten = [
34
+ `Voorwaarde: ${input.voorwaarde}`,
35
+ `Maximale wachttijd: ${input.maxWachtMinuten} minuten`,
36
+ ];
37
+ if (wachtOp.length > 0)
38
+ feiten.push(`Nog niet klaar: ${wachtOp.join(", ")}`);
39
+ if (mislukt.length > 0) {
40
+ return {
41
+ soort: "mislukt",
42
+ titel: "Hier wacht de flow op een tak die is mislukt",
43
+ reden: `De verplichte tak ${mislukt.join(", ")} is mislukt, dus dit samenkomstpunt laat de order niet door.`,
44
+ feiten,
45
+ volgendeStap: "Oorzaak in die tak oplossen, of de voorwaarde van dit samenkomstpunt aanpassen",
46
+ verouderd: false,
47
+ };
48
+ }
49
+ return {
50
+ soort: "handeling",
51
+ titel: "De flow wacht hier op andere takken",
52
+ reden: wachtOp.length > 0
53
+ ? `Dit samenkomstpunt laat de order pas door als ${input.voorwaarde} klaar is. Nog niet klaar: ${wachtOp.join(", ")}.`
54
+ : `Dit samenkomstpunt laat de order pas door als ${input.voorwaarde} klaar is.`,
55
+ feiten,
56
+ volgendeStap: `Wachten tot die tak klaar is; na ${input.maxWachtMinuten} minuten gaat de flow alsnog verder`,
57
+ verouderd: false,
58
+ };
59
+ }
60
+ /**
61
+ * Bepaalt in gewone taal waarom de blauwe route bij dit vakje ophoudt.
62
+ * Werkt ook als er voor dit vakje nog niets is vastgelegd.
63
+ */
64
+ export function stopReden(input) {
65
+ const { nodeId, groep = null, stand = null } = input;
66
+ const verouderd = input.verouderd === true;
67
+ const uitleg = groep ? vakUitleg(groep) : null;
68
+ const feiten = uitleg ? [...uitleg.feiten] : [];
69
+ const vervolg = groep?.volgendeStap ?? stand?.nextStep ?? null;
70
+ const vakNaam = flowNodeLabel(nodeId);
71
+ const queue = (stand?.queueStatus ?? "").toLowerCase();
72
+ const standHier = !stand?.stuckNode || stand.stuckNode === nodeId;
73
+ // 1. Mislukt: er is een echte fout vastgelegd.
74
+ const foutmelding = groep?.status === "mislukt"
75
+ ? foutTekst(groep.reden ?? null)
76
+ : standHier && stand?.stuckStatus === "mislukt"
77
+ ? foutTekst(stand.stuckReason ?? stand.stuckError ?? stand.queueError ?? null)
78
+ : null;
79
+ if (foutmelding || queue === "failed") {
80
+ const soortFout = groep?.errorClass ?? foutSoort(stand?.stuckReason ?? stand?.queueError ?? null) ?? null;
81
+ if (soortFout)
82
+ feiten.push(`Foutsoort: ${soortFout}`);
83
+ if (stand?.tries && stand.tries > 0)
84
+ feiten.push(`Automatische pogingen: ${stand.tries}`);
85
+ const volgende = tijdTekst(stand?.nextAttemptAt);
86
+ if (volgende)
87
+ feiten.push(`Volgende poging: ${volgende}`);
88
+ const sinds = tijdTekst(stand?.blockedSince);
89
+ if (sinds)
90
+ feiten.push(`Geblokkeerd sinds: ${sinds}`);
91
+ return {
92
+ soort: "mislukt",
93
+ titel: "Hier is de order vastgelopen",
94
+ reden: foutmelding ??
95
+ foutTekst(stand?.queueError ?? null) ??
96
+ `De berekening van ${vakNaam} is mislukt.`,
97
+ feiten,
98
+ volgendeStap: vervolg ?? "Oorzaak oplossen en de order opnieuw aanmelden in de wachtrij",
99
+ verouderd,
100
+ };
101
+ }
102
+ // 2. Helemaal klaar.
103
+ if (nodeId === FLOW_NODE.eind) {
104
+ return {
105
+ soort: "klaar",
106
+ titel: "Hier eindigt de reis: de order is afgehandeld",
107
+ reden: uitleg?.waarom ?? "Alle karren zijn gepickt en gecontroleerd.",
108
+ feiten,
109
+ volgendeStap: null,
110
+ verouderd,
111
+ };
112
+ }
113
+ // 3. De berekening loopt nog of staat in de wachtrij.
114
+ if (queue && WACHTRIJ_TEKST[queue]) {
115
+ if (stand?.attempts && stand.attempts > 0)
116
+ feiten.push(`Pogingen: ${stand.attempts}`);
117
+ const volgende = tijdTekst(stand?.nextAttemptAt);
118
+ if (volgende)
119
+ feiten.push(`Volgende poging: ${volgende}`);
120
+ return {
121
+ soort: "wachtrij",
122
+ titel: "De flow staat hier stil: de berekening is nog niet klaar",
123
+ reden: `De reis houdt op bij ${vakNaam} omdat ${WACHTRIJ_TEKST[queue]}.`,
124
+ feiten,
125
+ volgendeStap: vervolg,
126
+ verouderd,
127
+ };
128
+ }
129
+ // 4. Wacht op een handeling (picken, printen, scannen, controle).
130
+ if (groep?.status === "wachtend" || groep?.status === "waarschuwing") {
131
+ return {
132
+ soort: "handeling",
133
+ titel: "De flow wacht hier",
134
+ reden: uitleg?.waarom ??
135
+ `${vakNaam} is nog niet afgerond; de order wacht op de volgende handeling.`,
136
+ feiten,
137
+ volgendeStap: vervolg,
138
+ verouderd,
139
+ };
140
+ }
141
+ // 5. Deze stap is geslaagd, maar van de vervolgstap is nog niets vastgelegd.
142
+ return {
143
+ soort: "nietvastgelegd",
144
+ titel: "De flow stopt hier: verder is nog niets vastgelegd",
145
+ reden: vervolg
146
+ ? `${vakNaam} is afgerond, maar de volgende stap "${vervolg}" heeft voor deze order nog geen start, status of resultaat vastgelegd. Daarom kan de blauwe route nog niet aantonen dat de order daar is aangekomen.`
147
+ : `${vakNaam} is afgerond, maar er is voor deze order geen volgende stap of vervolgstatus vastgelegd. Daarom eindigt de aantoonbare blauwe route hier.`,
148
+ feiten,
149
+ volgendeStap: vervolg
150
+ ? `De stap "${vervolg}" moet starten en voor deze order een status of resultaat vastleggen.`
151
+ : "Controleer welke vervolgstap na dit vakje hoort te starten en waarom die nog geen status heeft vastgelegd.",
152
+ verouderd,
153
+ };
154
+ }
155
+ /**
156
+ * Waarom is de verzendbrief bij deze order nog niet opgehaald? Zet de
157
+ * alleen-lezen diagnose om naar dezelfde stoptekst als de rest van de kaart.
158
+ */
159
+ export function verzendbriefStop(d) {
160
+ if (!d || !d.gevonden)
161
+ return null;
162
+ const status = (d.status ?? "").toLowerCase();
163
+ if (status === "geprint" || status === "klaar")
164
+ return null;
165
+ const feiten = [];
166
+ if (d.status)
167
+ feiten.push(`Status: ${d.status}`);
168
+ feiten.push(d.isFloriday
169
+ ? `Aanvragen naar Floriday: ${d.aanvragenVerstuurd}`
170
+ : "Eigen verzendbrief (geen Floriday-order)");
171
+ if (d.pogingen > 0)
172
+ feiten.push(`Pogingen: ${d.pogingen}`);
173
+ const laatste = tijdTekst(d.laatsteAanvraag);
174
+ if (laatste)
175
+ feiten.push(`Laatste aanvraag: ${laatste}`);
176
+ if (d.afleveropdracht)
177
+ feiten.push(`Afleveropdracht: ${d.afleveropdracht}`);
178
+ if (d.wachtreden)
179
+ feiten.push(`Wachtreden: ${d.wachtreden}`);
180
+ // Een Floriday-order die wacht zonder ook maar één aanvraag is een fout in de
181
+ // omgeving, geen normale toestand. Ook een mislukte status is een fout.
182
+ const fout = status === "failed" ||
183
+ status === "mislukt" ||
184
+ status === "error" ||
185
+ (d.isFloriday && d.aanvragenVerstuurd === 0 && d.pogingen > 0);
186
+ return {
187
+ soort: fout ? "mislukt" : "handeling",
188
+ titel: fout ? "Hier loopt de verzendbrief vast" : "De verzendbrief is nog niet opgehaald",
189
+ reden: d.reden ??
190
+ (d.isFloriday
191
+ ? "Er is nog geen officiele Floriday-afleverbrief opgehaald voor deze order."
192
+ : "De verzendbrief voor deze order is nog niet aangemaakt."),
193
+ feiten,
194
+ volgendeStap: d.actie ?? null,
195
+ verouderd: false,
196
+ };
197
+ }
@@ -0,0 +1,2 @@
1
+ export declare function tellOpenTaken(rows: unknown): Record<string, number>;
2
+ //# sourceMappingURL=taskCounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskCounts.d.ts","sourceRoot":"","sources":["../../src/lib/taskCounts.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUnE"}
@@ -0,0 +1,15 @@
1
+ // Takenteller: zet de databasetelling (open/geplande taken per module) om naar een map.
2
+ // Fail-closed: onleesbare invoer levert een lege telling op, geen verzonnen aantallen.
3
+ export function tellOpenTaken(rows) {
4
+ const out = {};
5
+ if (!Array.isArray(rows))
6
+ return out;
7
+ for (const r of rows) {
8
+ const mod = typeof r?.owner_module === "string" ? r.owner_module : null;
9
+ const n = Number(r?.open_count);
10
+ if (!mod || !Number.isFinite(n) || n < 0)
11
+ continue;
12
+ out[mod] = (out[mod] ?? 0) + n;
13
+ }
14
+ return out;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=taskCounts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskCounts.test.d.ts","sourceRoot":"","sources":["../../src/lib/taskCounts.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { tellOpenTaken } from "./taskCounts";
3
+ describe("tellOpenTaken", () => {
4
+ it("telt per module", () => {
5
+ expect(tellOpenTaken([{ owner_module: "verkoop", open_count: "36" }, { owner_module: "afhandeling", open_count: 136 }]))
6
+ .toEqual({ verkoop: 36, afhandeling: 136 });
7
+ });
8
+ it("onleesbare invoer geeft lege telling", () => {
9
+ expect(tellOpenTaken(null)).toEqual({});
10
+ expect(tellOpenTaken([{ owner_module: "x", open_count: "abc" }, { open_count: 3 }])).toEqual({});
11
+ });
12
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"trace.server.d.ts","sourceRoot":"","sources":["../../src/lib/trace.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,SAAS,CAAC;AAEhG;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,sBAAsB,GACtB,cAAc,GACd,OAAO,GACP,QAAQ,CAAC;AAEb,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,eAAe,CAOjB;AAGD,wEAAwE;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAUD,oDAAoD;AACpD,wBAAsB,KAAK,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAED,sDAAsD;AACtD,wBAAsB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF;AAED,+DAA+D;AAC/D,wBAAsB,MAAM,CAAC,CAAC,EAC5B,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EACjC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
1
+ {"version":3,"file":"trace.server.d.ts","sourceRoot":"","sources":["../../src/lib/trace.server.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,9 @@
8
8
  /** Bepaalt de foutsoort uit een reden-code of foutmelding. */
9
9
  export function classifyError(reasonCode, message) {
10
10
  const t = `${reasonCode ?? ""} ${message ?? ""}`.toLowerCase();
11
+ // Een volle planronde of een tijdslimiet bij het opslaan is druk, geen stukloop.
12
+ if (/deadline|statement timeout|deadlock/.test(t))
13
+ return "regel";
11
14
  if (/afmeting|ontbreek|onbekend|geen regels|mist|niet gevuld|leeg/.test(t))
12
15
  return "ontbrekende_gegevens";
13
16
  if (/instelling|configurat|layout|mapping|niet ingesteld|werktijden/.test(t))
@@ -1 +1 @@
1
- {"version":3,"file":"vakUitleg.d.ts","sourceRoot":"","sources":["../../src/lib/vakUitleg.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;CACnB;AA6DD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAoD1D"}
1
+ {"version":3,"file":"vakUitleg.d.ts","sourceRoot":"","sources":["../../src/lib/vakUitleg.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;CACnB;AA6DD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAoD1D"}
@@ -5,6 +5,7 @@
5
5
  // Alleen lezen: hier wordt niets bepaald, alleen leesbaar gemaakt.
6
6
  // ============================================================================
7
7
  import { FLOW_NODE } from "./flowNodes";
8
+ import { foutTekst } from "./foutTekst";
8
9
  import { isAutomatisch } from "./nodeTrace";
9
10
  const LABELS = {
10
11
  aanmeldmoment: "Aanmeldmoment",
@@ -96,7 +97,7 @@ export function vakUitleg(groep) {
96
97
  };
97
98
  const besluit = laatsteMet((e) => e.decision);
98
99
  const fout = [...relevant].reverse().find((e) => e.status === "mislukt") ?? null;
99
- const reden = laatsteMet((e) => e.reason) ?? fout?.error ?? groep.reden ?? null;
100
+ const reden = foutTekst(laatsteMet((e) => e.reason) ?? fout?.error ?? groep.reden ?? null);
100
101
  const regel = laatsteMet((e) => e.rule);
101
102
  const calc = laatsteMet((e) => (e.calc && typeof e.calc === "object" ? e.calc : null));
102
103
  const feiten = [];