@flowselections/logistiek-engine 1.0.34 → 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 (244) hide show
  1. package/dist-lib/components/AfrondWachtrijCard.d.ts +2 -0
  2. package/dist-lib/components/AfrondWachtrijCard.d.ts.map +1 -0
  3. package/dist-lib/components/AfrondWachtrijCard.js +27 -0
  4. package/dist-lib/components/BeladingsafwijkingenCard.d.ts +2 -0
  5. package/dist-lib/components/BeladingsafwijkingenCard.d.ts.map +1 -0
  6. package/dist-lib/components/BeladingsafwijkingenCard.js +44 -0
  7. package/dist-lib/components/FlowCanvas.d.ts +34 -0
  8. package/dist-lib/components/FlowCanvas.d.ts.map +1 -0
  9. package/dist-lib/components/FlowCanvas.js +490 -0
  10. package/dist-lib/components/FlowOrders.d.ts +8 -0
  11. package/dist-lib/components/FlowOrders.d.ts.map +1 -0
  12. package/dist-lib/components/FlowOrders.js +171 -0
  13. package/dist-lib/components/FlowPage.d.ts +2 -0
  14. package/dist-lib/components/FlowPage.d.ts.map +1 -0
  15. package/dist-lib/components/FlowPage.js +310 -0
  16. package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
  17. package/dist-lib/components/GeblokkeerdeOrdersCard.js +21 -2
  18. package/dist-lib/components/InklapbaarVenster.d.ts +9 -0
  19. package/dist-lib/components/InklapbaarVenster.d.ts.map +1 -0
  20. package/dist-lib/components/InklapbaarVenster.js +10 -0
  21. package/dist-lib/components/KardekkingCard.d.ts +2 -0
  22. package/dist-lib/components/KardekkingCard.d.ts.map +1 -0
  23. package/dist-lib/components/KardekkingCard.js +29 -0
  24. package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
  25. package/dist-lib/components/LogistiekEnginePage.js +15 -3
  26. package/dist-lib/components/LogistiekEngineQueuePage.d.ts +2 -0
  27. package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -0
  28. package/dist-lib/components/LogistiekEngineQueuePage.js +13 -0
  29. package/dist-lib/components/NodeTracePanel.d.ts +14 -0
  30. package/dist-lib/components/NodeTracePanel.d.ts.map +1 -0
  31. package/dist-lib/components/NodeTracePanel.js +46 -0
  32. package/dist-lib/components/OrderJourneyBar.d.ts +9 -0
  33. package/dist-lib/components/OrderJourneyBar.d.ts.map +1 -0
  34. package/dist-lib/components/OrderJourneyBar.js +26 -0
  35. package/dist-lib/components/OrderLogboek.d.ts +10 -0
  36. package/dist-lib/components/OrderLogboek.d.ts.map +1 -0
  37. package/dist-lib/components/OrderLogboek.js +92 -0
  38. package/dist-lib/components/OrderStopBanner.d.ts +12 -0
  39. package/dist-lib/components/OrderStopBanner.d.ts.map +1 -0
  40. package/dist-lib/components/OrderStopBanner.js +36 -0
  41. package/dist-lib/components/OrderTraceDetails.d.ts +22 -0
  42. package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -0
  43. package/dist-lib/components/OrderTraceDetails.js +88 -0
  44. package/dist-lib/components/PlanWachtrijPage.d.ts +2 -0
  45. package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -0
  46. package/dist-lib/components/PlanWachtrijPage.js +99 -0
  47. package/dist-lib/components/PlannerDiffCard.d.ts +2 -0
  48. package/dist-lib/components/PlannerDiffCard.d.ts.map +1 -0
  49. package/dist-lib/components/PlannerDiffCard.js +25 -0
  50. package/dist-lib/components/RegiePage.d.ts.map +1 -1
  51. package/dist-lib/components/RegiePage.js +28 -78
  52. package/dist-lib/components/TaakGezondheidCard.d.ts +2 -0
  53. package/dist-lib/components/TaakGezondheidCard.d.ts.map +1 -0
  54. package/dist-lib/components/TaakGezondheidCard.js +31 -0
  55. package/dist-lib/components/WerktijdenCard.d.ts +2 -0
  56. package/dist-lib/components/WerktijdenCard.d.ts.map +1 -0
  57. package/dist-lib/components/WerktijdenCard.js +37 -0
  58. package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
  59. package/dist-lib/components/WerkwijzeHerindelingCard.js +100 -6
  60. package/dist-lib/hooks/useAfrondWachtrij.d.ts +28 -0
  61. package/dist-lib/hooks/useAfrondWachtrij.d.ts.map +1 -0
  62. package/dist-lib/hooks/useAfrondWachtrij.js +88 -0
  63. package/dist-lib/hooks/useBeladingsafwijkingen.d.ts +39 -0
  64. package/dist-lib/hooks/useBeladingsafwijkingen.d.ts.map +1 -0
  65. package/dist-lib/hooks/useBeladingsafwijkingen.js +119 -0
  66. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +7 -0
  67. package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
  68. package/dist-lib/hooks/useGeblokkeerdeOrders.js +28 -2
  69. package/dist-lib/hooks/useLogisticsTrace.d.ts +78 -0
  70. package/dist-lib/hooks/useLogisticsTrace.d.ts.map +1 -0
  71. package/dist-lib/hooks/useLogisticsTrace.js +152 -0
  72. package/dist-lib/hooks/useOrderNodeTrace.d.ts +11 -0
  73. package/dist-lib/hooks/useOrderNodeTrace.d.ts.map +1 -0
  74. package/dist-lib/hooks/useOrderNodeTrace.js +26 -0
  75. package/dist-lib/hooks/useOrderTrace.d.ts +74 -0
  76. package/dist-lib/hooks/useOrderTrace.d.ts.map +1 -0
  77. package/dist-lib/hooks/useOrderTrace.js +134 -0
  78. package/dist-lib/hooks/useOrderVersies.d.ts +47 -0
  79. package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -0
  80. package/dist-lib/hooks/useOrderVersies.js +194 -0
  81. package/dist-lib/hooks/usePlanWachtrij.d.ts +33 -0
  82. package/dist-lib/hooks/usePlanWachtrij.d.ts.map +1 -0
  83. package/dist-lib/hooks/usePlanWachtrij.js +104 -0
  84. package/dist-lib/hooks/useRecalcJob.js +1 -1
  85. package/dist-lib/hooks/useRuleEngine.d.ts +1 -0
  86. package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -1
  87. package/dist-lib/hooks/useRuleEngine.js +1 -0
  88. package/dist-lib/hooks/useShippingNoteDiagnose.d.ts +20 -0
  89. package/dist-lib/hooks/useShippingNoteDiagnose.d.ts.map +1 -0
  90. package/dist-lib/hooks/useShippingNoteDiagnose.js +52 -0
  91. package/dist-lib/hooks/useShippingNoteStatus.d.ts +29 -0
  92. package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -0
  93. package/dist-lib/hooks/useShippingNoteStatus.js +107 -0
  94. package/dist-lib/hooks/useTaakGezondheid.d.ts +16 -0
  95. package/dist-lib/hooks/useTaakGezondheid.d.ts.map +1 -0
  96. package/dist-lib/hooks/useTaakGezondheid.js +43 -0
  97. package/dist-lib/hooks/useWerktijden.d.ts +33 -0
  98. package/dist-lib/hooks/useWerktijden.d.ts.map +1 -0
  99. package/dist-lib/hooks/useWerktijden.js +88 -0
  100. package/dist-lib/hooks/useWerkwijzeStatus.d.ts +12 -1
  101. package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
  102. package/dist-lib/hooks/useWerkwijzeStatus.js +61 -5
  103. package/dist-lib/index.d.ts +23 -0
  104. package/dist-lib/index.d.ts.map +1 -1
  105. package/dist-lib/index.js +23 -0
  106. package/dist-lib/integrations/supabase/auth-middleware.d.ts +4993 -459
  107. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  108. package/dist-lib/integrations/supabase/client.server.d.ts +4993 -459
  109. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  110. package/dist-lib/integrations/supabase/client.server.js +1 -1
  111. package/dist-lib/integrations/supabase/moduleClient.d.ts +4993 -459
  112. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  113. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts +1 -1
  114. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  115. package/dist-lib/integrations/supabase/previewAuthStorage.js +8 -1
  116. package/dist-lib/integrations/supabase/types.d.ts +5022 -432
  117. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  118. package/dist-lib/lib/attachAuthToken.js +1 -1
  119. package/dist-lib/lib/bufferDecision.test.d.ts +2 -0
  120. package/dist-lib/lib/bufferDecision.test.d.ts.map +1 -0
  121. package/dist-lib/lib/bufferDecision.test.js +104 -0
  122. package/dist-lib/lib/cartCoverage.functions.d.ts +30820 -0
  123. package/dist-lib/lib/cartCoverage.functions.d.ts.map +1 -0
  124. package/dist-lib/lib/cartCoverage.functions.js +20 -0
  125. package/dist-lib/lib/cartPlanRequests.server.d.ts +1 -1
  126. package/dist-lib/lib/cartPlanRequests.server.d.ts.map +1 -1
  127. package/dist-lib/lib/cartPlanRequests.server.js +49 -8
  128. package/dist-lib/lib/floridayDocuments.functions.d.ts +13623 -21
  129. package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
  130. package/dist-lib/lib/floridayDocuments.functions.js +5 -5
  131. package/dist-lib/lib/floridayDocuments.server.d.ts +14 -0
  132. package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -1
  133. package/dist-lib/lib/floridayDocuments.server.js +58 -0
  134. package/dist-lib/lib/floridayGuard.server.d.ts +1 -1
  135. package/dist-lib/lib/floridayGuard.server.d.ts.map +1 -1
  136. package/dist-lib/lib/floridayGuard.server.js +6 -3
  137. package/dist-lib/lib/floridayPush.functions.d.ts +4993 -459
  138. package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
  139. package/dist-lib/lib/floridayPush.functions.js +3 -3
  140. package/dist-lib/lib/flowGraph.d.ts +43 -0
  141. package/dist-lib/lib/flowGraph.d.ts.map +1 -0
  142. package/dist-lib/lib/flowGraph.js +153 -0
  143. package/dist-lib/lib/flowJourney.d.ts +40 -0
  144. package/dist-lib/lib/flowJourney.d.ts.map +1 -0
  145. package/dist-lib/lib/flowJourney.js +156 -0
  146. package/dist-lib/lib/flowNodes.d.ts +26 -0
  147. package/dist-lib/lib/flowNodes.d.ts.map +1 -0
  148. package/dist-lib/lib/flowNodes.js +64 -0
  149. package/dist-lib/lib/flowRoute.d.ts +117 -0
  150. package/dist-lib/lib/flowRoute.d.ts.map +1 -0
  151. package/dist-lib/lib/flowRoute.js +583 -0
  152. package/dist-lib/lib/flowTree.d.ts +149 -0
  153. package/dist-lib/lib/flowTree.d.ts.map +1 -0
  154. package/dist-lib/lib/flowTree.js +908 -0
  155. package/dist-lib/lib/foutTekst.d.ts +4 -0
  156. package/dist-lib/lib/foutTekst.d.ts.map +1 -0
  157. package/dist-lib/lib/foutTekst.js +43 -0
  158. package/dist-lib/lib/handlers/index.d.ts +1 -0
  159. package/dist-lib/lib/handlers/index.d.ts.map +1 -1
  160. package/dist-lib/lib/handlers/index.js +1 -0
  161. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts +3 -0
  162. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -0
  163. package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +100 -0
  164. package/dist-lib/lib/handlers/logistics-tick.server.d.ts +2 -0
  165. package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
  166. package/dist-lib/lib/handlers/logistics-tick.server.js +153 -2
  167. package/dist-lib/lib/handlers/logistics-tick.test.d.ts +2 -0
  168. package/dist-lib/lib/handlers/logistics-tick.test.d.ts.map +1 -0
  169. package/dist-lib/lib/handlers/logistics-tick.test.js +63 -0
  170. package/dist-lib/lib/loadCarrierPlanner.d.ts +2 -0
  171. package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
  172. package/dist-lib/lib/loadCarrierPlanner.js +18 -0
  173. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +22705 -35
  174. package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
  175. package/dist-lib/lib/loadCarrierPlanning.functions.js +7 -7
  176. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +33 -12
  177. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  178. package/dist-lib/lib/loadCarrierPlanning.server.js +534 -228
  179. package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
  180. package/dist-lib/lib/logisticsPlanner.js +14 -2
  181. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +9082 -14
  182. package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
  183. package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -4
  184. package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
  185. package/dist-lib/lib/logisticsRecalcJob.server.js +17 -2
  186. package/dist-lib/lib/logisticsRecalculate.functions.d.ts +4993 -459
  187. package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
  188. package/dist-lib/lib/logisticsRecalculate.functions.js +2 -2
  189. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  190. package/dist-lib/lib/modulePrompts.js +893 -0
  191. package/dist-lib/lib/nodeTrace.d.ts +65 -0
  192. package/dist-lib/lib/nodeTrace.d.ts.map +1 -0
  193. package/dist-lib/lib/nodeTrace.js +182 -0
  194. package/dist-lib/lib/pickQueueCleanup.server.d.ts +14 -0
  195. package/dist-lib/lib/pickQueueCleanup.server.d.ts.map +1 -0
  196. package/dist-lib/lib/pickQueueCleanup.server.js +80 -0
  197. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  198. package/dist-lib/lib/planQueue.server.js +164 -3
  199. package/dist-lib/lib/plannerDiff.d.ts +37 -0
  200. package/dist-lib/lib/plannerDiff.d.ts.map +1 -0
  201. package/dist-lib/lib/plannerDiff.functions.d.ts +30821 -0
  202. package/dist-lib/lib/plannerDiff.functions.d.ts.map +1 -0
  203. package/dist-lib/lib/plannerDiff.functions.js +21 -0
  204. package/dist-lib/lib/plannerDiff.js +74 -0
  205. package/dist-lib/lib/plannerDiff.server.d.ts +5 -0
  206. package/dist-lib/lib/plannerDiff.server.d.ts.map +1 -0
  207. package/dist-lib/lib/plannerDiff.server.js +60 -0
  208. package/dist-lib/lib/plannerDiff.test.d.ts +2 -0
  209. package/dist-lib/lib/plannerDiff.test.d.ts.map +1 -0
  210. package/dist-lib/lib/plannerDiff.test.js +41 -0
  211. package/dist-lib/lib/resolveBuffer.test.d.ts +2 -0
  212. package/dist-lib/lib/resolveBuffer.test.d.ts.map +1 -0
  213. package/dist-lib/lib/resolveBuffer.test.js +38 -0
  214. package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -1
  215. package/dist-lib/lib/ruleEngineImpact.js +11 -4
  216. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  217. package/dist-lib/lib/ruleEngineSchema.js +102 -6
  218. package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
  219. package/dist-lib/lib/ruleEngineWizard.js +3 -1
  220. package/dist-lib/lib/shippingNoteQueue.server.d.ts +18 -0
  221. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -0
  222. package/dist-lib/lib/shippingNoteQueue.server.js +304 -0
  223. package/dist-lib/lib/stopReden.d.ts +43 -0
  224. package/dist-lib/lib/stopReden.d.ts.map +1 -0
  225. package/dist-lib/lib/stopReden.js +197 -0
  226. package/dist-lib/lib/taskCounts.d.ts +2 -0
  227. package/dist-lib/lib/taskCounts.d.ts.map +1 -0
  228. package/dist-lib/lib/taskCounts.js +15 -0
  229. package/dist-lib/lib/taskCounts.test.d.ts +2 -0
  230. package/dist-lib/lib/taskCounts.test.d.ts.map +1 -0
  231. package/dist-lib/lib/taskCounts.test.js +12 -0
  232. package/dist-lib/lib/trace.server.d.ts +75 -0
  233. package/dist-lib/lib/trace.server.d.ts.map +1 -0
  234. package/dist-lib/lib/trace.server.js +78 -0
  235. package/dist-lib/lib/vakUitleg.d.ts +19 -0
  236. package/dist-lib/lib/vakUitleg.d.ts.map +1 -0
  237. package/dist-lib/lib/vakUitleg.js +133 -0
  238. package/package.json +158 -131
  239. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
  240. package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
  241. package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
  242. package/dist-lib/integrations/supabase/client.d.ts +0 -20293
  243. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  244. package/dist-lib/integrations/supabase/client.js +0 -13
@@ -2,8 +2,8 @@
2
2
  // src/lib/floridayPush.functions.ts — server functions (thin wrappers)
3
3
  // ============================================================================
4
4
  import { createServerFn } from "@tanstack/react-start";
5
- import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware";
6
- import { readableServerErrors } from "../lib/readableServerErrors";
5
+ import { requireSupabaseAuth } from "../integrations/supabase/auth-middleware.js";
6
+ import { readableServerErrors } from "./readableServerErrors.js";
7
7
  /** Zet een order opnieuw in de wachtrij (handmatig opnieuw proberen). */
8
8
  export const retryFloridayPush = createServerFn({ method: "POST" })
9
9
  .middleware([readableServerErrors, requireSupabaseAuth])
@@ -14,7 +14,7 @@ export const retryFloridayPush = createServerFn({ method: "POST" })
14
14
  return data;
15
15
  })
16
16
  .handler(async ({ data }) => {
17
- const { supabaseAdmin } = await import("../integrations/supabase/client.server");
17
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
18
18
  const { queueFloridayPush } = await import("./floridayPush.server");
19
19
  await queueFloridayPush(supabaseAdmin, data.orderRef);
20
20
  return { ok: true };
@@ -0,0 +1,43 @@
1
+ import { type RuleEngineSettings, type RuleField, type RuleGroup } from "./ruleEngineSchema";
2
+ import { type WizardStep } from "./ruleEngineWizard";
3
+ export interface FlowBranch {
4
+ value: string;
5
+ label: string;
6
+ active: boolean;
7
+ }
8
+ export interface FlowDecision {
9
+ /** Sleutel van het veld dat deze beslissing bepaalt. */
10
+ key: string;
11
+ label: string;
12
+ /** Naam van het blok waarin de instelling staat. */
13
+ groupLabel: string;
14
+ /** De uitkomst die nu geldt. */
15
+ currentLabel: string;
16
+ branches: FlowBranch[];
17
+ /** Beslissing met meerdere zichtbare uitkomsten (ruit) of vaste waarde. */
18
+ isChoice: boolean;
19
+ /** True als de waarde een ja/nee-schakelaar is (waarde is boolean). */
20
+ isBoolean: boolean;
21
+ /** Uitleg in gewone taal, regel voor regel. */
22
+ help: string[];
23
+ }
24
+ export interface FlowNode {
25
+ id: string;
26
+ label: string;
27
+ description: string;
28
+ storeId: string;
29
+ decisions: FlowDecision[];
30
+ conditions: string[];
31
+ /** Aantal zichtbare instellingen achter deze stap. */
32
+ settingCount: number;
33
+ /** Uitleg in gewone taal, regel voor regel. */
34
+ help: string[];
35
+ }
36
+ /** Alle zichtbare velden van een wizardstap, met hun blok. */
37
+ export declare function visibleFieldsOf(step: WizardStep, settings: RuleEngineSettings): Array<{
38
+ field: RuleField;
39
+ group: RuleGroup;
40
+ }>;
41
+ /** Bouwt het flowschema uit de werkwijze die de engine gebruikt. */
42
+ export declare function buildFlow(settings: RuleEngineSettings): FlowNode[];
43
+ //# sourceMappingURL=flowGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowGraph.d.ts","sourceRoot":"","sources":["../../src/lib/flowGraph.ts"],"names":[],"mappings":"AASA,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,EAAE,OAAO,CAAC;IAClB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AA8GD,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,kBAAkB,GAC3B,KAAK,CAAC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC,CAW/C;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,kBAAkB,GAAG,QAAQ,EAAE,CA2ClE"}
@@ -0,0 +1,153 @@
1
+ // ============================================================================
2
+ // src/lib/flowGraph.ts — flowschema afgeleid van de echte werkwijze
3
+ // ============================================================================
4
+ // Bouwt de knopen en beslismomenten van de flowpagina UITSLUITEND op uit
5
+ // WIZARD_STEPS/RULE_STEPS en de opgeslagen instellingen van de werkwijze die
6
+ // de engine gebruikt. Er wordt hier geen aparte flow beschreven: verandert een
7
+ // instelling, dan verandert dit schema mee.
8
+ // ============================================================================
9
+ import { fieldVisible, optionLabel, conditionFieldLabel, conditionOperatorLabel, } from "./ruleEngineSchema";
10
+ import { WIZARD_STEPS } from "./ruleEngineWizard";
11
+ const DAY_SHORT = {
12
+ mon: "ma",
13
+ tue: "di",
14
+ wed: "wo",
15
+ thu: "do",
16
+ fri: "vr",
17
+ sat: "za",
18
+ sun: "zo",
19
+ };
20
+ function valueLabel(field, value) {
21
+ if (value === undefined || value === null || value === "")
22
+ return "niet ingesteld";
23
+ switch (field.type) {
24
+ case "toggle":
25
+ return value === true ? "aan" : "uit";
26
+ case "select":
27
+ case "radio":
28
+ return optionLabel(field, value);
29
+ case "days": {
30
+ const days = Array.isArray(value) ? value : [];
31
+ return days.length ? days.map((d) => DAY_SHORT[d] ?? d).join(", ") : "geen";
32
+ }
33
+ case "number":
34
+ return `${String(value)}${field.unit ? ` ${field.unit}` : ""}`;
35
+ case "priority": {
36
+ const entries = Array.isArray(value) ? value : [];
37
+ return `${entries.filter((e) => e?.enabled).length} actief`;
38
+ }
39
+ default:
40
+ return String(value);
41
+ }
42
+ }
43
+ function decisionFor(field, group, values) {
44
+ const value = values[field.key];
45
+ const current = valueLabel(field, value);
46
+ const basisUitleg = (branches) => {
47
+ const regels = [];
48
+ if (field.description)
49
+ regels.push(field.description);
50
+ regels.push(`Deze keuze hoort bij het blok "${group.label}".`);
51
+ regels.push(`Nu ingesteld op: ${current}.`);
52
+ if (branches.length) {
53
+ regels.push(`Mogelijke keuzes: ${branches.map((b) => b.label).join(" · ")}. Wijzig je hier iets, dan werkt de engine daarna meteen volgens die keuze.`);
54
+ }
55
+ return regels;
56
+ };
57
+ if (field.type === "toggle") {
58
+ const branches = [
59
+ { value: "true", label: "ja", active: value === true },
60
+ { value: "false", label: "nee", active: value !== true },
61
+ ];
62
+ return {
63
+ key: field.key,
64
+ label: field.label,
65
+ groupLabel: group.label,
66
+ currentLabel: current,
67
+ isChoice: true,
68
+ isBoolean: true,
69
+ branches,
70
+ help: basisUitleg(branches),
71
+ };
72
+ }
73
+ if (field.type === "select" || field.type === "radio") {
74
+ const options = Array.isArray(field.options) ? field.options : [];
75
+ if (options.length < 2)
76
+ return null;
77
+ const branches = options.map((o) => ({
78
+ value: o.value,
79
+ label: o.label,
80
+ active: o.value === value,
81
+ }));
82
+ return {
83
+ key: field.key,
84
+ label: field.label,
85
+ groupLabel: group.label,
86
+ currentLabel: current,
87
+ isChoice: true,
88
+ isBoolean: false,
89
+ branches,
90
+ help: basisUitleg(branches),
91
+ };
92
+ }
93
+ return null;
94
+ }
95
+ function describeConditions(conditions) {
96
+ const veilig = Array.isArray(conditions) ? conditions : [];
97
+ return veilig
98
+ .filter((c) => c && typeof c === "object")
99
+ .map((c) => {
100
+ const values = Array.isArray(c.values) ? c.values : [];
101
+ return `${conditionFieldLabel(c.field)} ${conditionOperatorLabel(c.operator)} ${values.length ? values.join(", ") : "—"}`;
102
+ });
103
+ }
104
+ /** Alle zichtbare velden van een wizardstap, met hun blok. */
105
+ export function visibleFieldsOf(step, settings) {
106
+ const values = settings?.[step.storeId]?.fields ?? {};
107
+ const groups = Array.isArray(step.groups) ? step.groups : [];
108
+ const result = [];
109
+ for (const group of groups) {
110
+ const fields = Array.isArray(group.fields) ? group.fields : [];
111
+ for (const field of fields) {
112
+ if (fieldVisible(field, values, settings))
113
+ result.push({ field, group });
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ /** Bouwt het flowschema uit de werkwijze die de engine gebruikt. */
119
+ export function buildFlow(settings) {
120
+ const veiligeSettings = settings && typeof settings === "object" ? settings : {};
121
+ return WIZARD_STEPS.map((step) => {
122
+ const values = veiligeSettings?.[step.storeId]?.fields ?? {};
123
+ const zichtbaar = visibleFieldsOf(step, veiligeSettings);
124
+ const decisions = zichtbaar
125
+ .map(({ field, group }) => decisionFor(field, group, values))
126
+ .filter((d) => d !== null);
127
+ const conditions = step.showConditions
128
+ ? describeConditions(veiligeSettings?.[step.storeId]?.conditions ?? [])
129
+ : [];
130
+ const help = [];
131
+ if (step.description)
132
+ help.push(step.description);
133
+ help.push(zichtbaar.length
134
+ ? `Achter deze stap staan ${zichtbaar.length} instellingen. Klik op het vakje om ze allemaal te openen en aan te passen.`
135
+ : "Bij deze stap staan op dit moment geen instelbare regels.");
136
+ if (decisions.length) {
137
+ help.push(`Beslismomenten hieronder: ${decisions.map((d) => `${d.label} (nu: ${d.currentLabel})`).join(" · ")}.`);
138
+ }
139
+ if (conditions.length) {
140
+ help.push(`Deze stap geldt alleen als: ${conditions.join(" en ")}.`);
141
+ }
142
+ return {
143
+ id: step.id,
144
+ label: step.label,
145
+ description: step.description,
146
+ storeId: step.storeId,
147
+ decisions,
148
+ conditions,
149
+ settingCount: zichtbaar.length,
150
+ help,
151
+ };
152
+ });
153
+ }
@@ -0,0 +1,40 @@
1
+ import type { FlowTree, TreeNode } from "./flowTree";
2
+ import type { TraceEvent } from "./trace.server";
3
+ /** Eén vakje op de route die voor deze order geldt. */
4
+ export interface JourneyVak {
5
+ nodeId: string;
6
+ kind: TreeNode["kind"];
7
+ label: string;
8
+ /** Keuze die hier geldt (alleen bij beslisvakjes). */
9
+ beslissing: string | null;
10
+ /** Waarom die keuze geldt. */
11
+ waarom: string;
12
+ /** De bepalende instelling. */
13
+ regel: string | null;
14
+ /** Dit is een hoofdstap van de engine. */
15
+ hoofdstap: boolean;
16
+ }
17
+ /**
18
+ * De route door de kaart die voor deze order van toepassing is, in volgorde.
19
+ * Volgt alleen actieve lijnen vanaf "Order komt binnen"; de herkomstvakjes van
20
+ * andere bronnen blijven buiten beschouwing.
21
+ */
22
+ export declare function journeyPad(tree: FlowTree, orderSource: string | null | undefined, wachtpunten?: Set<string> | null): JourneyVak[];
23
+ /**
24
+ * Tot welk punt van de route is de order gekomen? Dat is het laatste vakje in
25
+ * het pad waarvan de Engine zelf iets heeft vastgelegd.
26
+ */
27
+ export declare function bereiktTot(pad: JourneyVak[], vastgelegd: Set<string>): number;
28
+ /**
29
+ * De vakjes die voor deze order gelden en waar nog niets van is vastgelegd,
30
+ * tot en met het punt waar de order nu is. Vakjes die verderop liggen blijven
31
+ * leeg: die zijn immers nog niet gebeurd.
32
+ */
33
+ export declare function ontbrekendeJourneyEvents(input: {
34
+ tree: FlowTree;
35
+ orderRef: string;
36
+ orderSource: string | null | undefined;
37
+ vastgelegd: Set<string>;
38
+ wachtpunten?: Set<string> | null;
39
+ }): TraceEvent[];
40
+ //# sourceMappingURL=flowJourney.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowJourney.d.ts","sourceRoot":"","sources":["../../src/lib/flowJourney.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;CACpB;AAqDD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC/B,UAAU,EAAE,CA4Cd;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAM7E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAClC,GAAG,UAAU,EAAE,CAwBf"}
@@ -0,0 +1,156 @@
1
+ // ============================================================================
2
+ // src/lib/flowJourney.ts — de order langs élk vakje laten lopen dat geldt
3
+ // ============================================================================
4
+ // De Engine legt zelf alleen de grote stappen vast. De keuzevakjes ertussen
5
+ // (de ruitjes met ja/nee) worden hier afgeleid uit exact dezelfde boom als de
6
+ // kaart: welke vakjes gelden voor deze order, welke keuze geldt daar en
7
+ // waarom. Zo is de blauwe route aaneengesloten en zie je welk deel van de
8
+ // route al behandeld is.
9
+ //
10
+ // Puur observerend: hier wordt niets besloten, gepland, geprint of gewijzigd.
11
+ // ============================================================================
12
+ import { FLOW_NODE, bronNodeVoor } from "./flowNodes";
13
+ const HOOFDSTAPPEN = new Set([
14
+ FLOW_NODE.samenvoegen,
15
+ FLOW_NODE.ontvangst,
16
+ FLOW_NODE.indeling,
17
+ FLOW_NODE.vrijgave,
18
+ FLOW_NODE.stations,
19
+ FLOW_NODE.picken,
20
+ FLOW_NODE.controle,
21
+ FLOW_NODE.eind,
22
+ ]);
23
+ const BRON_NODES = new Set([
24
+ FLOW_NODE.bronFloriday,
25
+ FLOW_NODE.bronMail,
26
+ FLOW_NODE.bronActiemail,
27
+ FLOW_NODE.bronHandmatig,
28
+ ]);
29
+ /** Vakjes zonder eigen betekenis in het logboek (samenkomstpunten en labels). */
30
+ function teltMee(node) {
31
+ return node.kind !== "merge";
32
+ }
33
+ function beslissingVan(node) {
34
+ if (node.kind !== "decision")
35
+ return null;
36
+ const huidig = node.currentValue ?? "";
37
+ const optie = (node.options ?? []).find((o) => o.value === huidig);
38
+ return optie?.label ?? (huidig || null);
39
+ }
40
+ function waaromVan(node, beslissing) {
41
+ if (node.kind === "decision") {
42
+ return beslissing
43
+ ? `De instelling "${node.label}" staat op "${beslissing}", dus de order volgt die tak.`
44
+ : `Voor "${node.label}" is geen keuze ingesteld, dus de standaardtak geldt.`;
45
+ }
46
+ if (node.kind === "setting") {
47
+ const regels = Array.isArray(node.lines) ? node.lines : [];
48
+ return regels.length > 0
49
+ ? `Deze instellingen golden voor deze order: ${regels.join("; ")}.`
50
+ : `De instellingen van "${node.label}" golden voor deze order.`;
51
+ }
52
+ if (node.kind === "option") {
53
+ return `Dit is de uitkomst die voor deze order geldt.`;
54
+ }
55
+ if (node.kind === "source") {
56
+ return `De order is via deze weg binnengekomen.`;
57
+ }
58
+ return node.sublabel ?? `Deze stap geldt voor deze order.`;
59
+ }
60
+ /**
61
+ * De route door de kaart die voor deze order van toepassing is, in volgorde.
62
+ * Volgt alleen actieve lijnen vanaf "Order komt binnen"; de herkomstvakjes van
63
+ * andere bronnen blijven buiten beschouwing.
64
+ */
65
+ export function journeyPad(tree, orderSource, wachtpunten) {
66
+ const byId = new Map(tree.nodes.map((n) => [n.id, n]));
67
+ const bron = bronNodeVoor(orderSource);
68
+ const uit = new Map();
69
+ for (const e of tree.edges) {
70
+ if (e.kind !== "flow" || e.state !== "active")
71
+ continue;
72
+ // Alleen de eigen herkomst van deze order telt mee.
73
+ if (BRON_NODES.has(e.to) && bron && e.to !== bron)
74
+ continue;
75
+ if (BRON_NODES.has(e.from) && bron && e.from !== bron)
76
+ continue;
77
+ const lijst = uit.get(e.from) ?? [];
78
+ lijst.push({ to: e.to });
79
+ uit.set(e.from, lijst);
80
+ }
81
+ const pad = [];
82
+ const gezien = new Set([FLOW_NODE.start]);
83
+ const wachtrij = [FLOW_NODE.start];
84
+ while (wachtrij.length > 0) {
85
+ const id = wachtrij.shift();
86
+ const node = byId.get(id);
87
+ if (node && node.state === "active" && teltMee(node)) {
88
+ const beslissing = beslissingVan(node);
89
+ pad.push({
90
+ nodeId: node.id,
91
+ kind: node.kind,
92
+ label: node.label,
93
+ beslissing,
94
+ waarom: waaromVan(node, beslissing),
95
+ regel: node.storeId && node.fieldKey ? `${node.storeId}.${node.fieldKey}` : null,
96
+ hoofdstap: HOOFDSTAPPEN.has(node.id),
97
+ });
98
+ }
99
+ // Wacht dit samenkomstpunt op andere takken? Dan loopt de reis hier niet verder.
100
+ if (wachtpunten?.has(id))
101
+ continue;
102
+ for (const { to } of uit.get(id) ?? []) {
103
+ if (gezien.has(to))
104
+ continue;
105
+ const doel = byId.get(to);
106
+ if (!doel || doel.state !== "active")
107
+ continue;
108
+ gezien.add(to);
109
+ wachtrij.push(to);
110
+ }
111
+ }
112
+ return pad;
113
+ }
114
+ /**
115
+ * Tot welk punt van de route is de order gekomen? Dat is het laatste vakje in
116
+ * het pad waarvan de Engine zelf iets heeft vastgelegd.
117
+ */
118
+ export function bereiktTot(pad, vastgelegd) {
119
+ let laatste = -1;
120
+ pad.forEach((vak, i) => {
121
+ if (vastgelegd.has(vak.nodeId))
122
+ laatste = i;
123
+ });
124
+ return laatste;
125
+ }
126
+ /**
127
+ * De vakjes die voor deze order gelden en waar nog niets van is vastgelegd,
128
+ * tot en met het punt waar de order nu is. Vakjes die verderop liggen blijven
129
+ * leeg: die zijn immers nog niet gebeurd.
130
+ */
131
+ export function ontbrekendeJourneyEvents(input) {
132
+ const pad = journeyPad(input.tree, input.orderSource, input.wachtpunten ?? null);
133
+ const grens = bereiktTot(pad, input.vastgelegd);
134
+ if (grens < 0)
135
+ return [];
136
+ const events = [];
137
+ for (let i = 0; i <= grens; i++) {
138
+ const vak = pad[i];
139
+ if (!vak || input.vastgelegd.has(vak.nodeId))
140
+ continue;
141
+ const volgende = pad[i + 1]?.label ?? null;
142
+ events.push({
143
+ orderRef: input.orderRef,
144
+ phase: "flow",
145
+ step: vak.label,
146
+ status: "geslaagd",
147
+ actor: "afgeleid",
148
+ nodeId: vak.nodeId,
149
+ decision: vak.beslissing ?? "route gevolgd",
150
+ reason: vak.waarom,
151
+ rule: vak.regel ?? undefined,
152
+ nextStep: volgende ?? undefined,
153
+ });
154
+ }
155
+ return events;
156
+ }
@@ -0,0 +1,26 @@
1
+ export declare const FLOW_NODE: {
2
+ readonly start: "__start";
3
+ readonly bron: "__bron";
4
+ readonly bronFloriday: "__bron_floriday";
5
+ readonly bronMail: "__bron_mail";
6
+ readonly bronActiemail: "__bron_actiemail";
7
+ readonly bronHandmatig: "__bron_handmatig";
8
+ readonly samenvoegen: "stap:bestelregels_samenvoegen";
9
+ readonly ontvangst: "stap:orders_combineren";
10
+ readonly indeling: "stap:beladingindeling";
11
+ readonly picken: "stap:picken";
12
+ readonly vrijgave: "stap:drukte_vertraging";
13
+ readonly klaarOmTePicken: "stap:klaar_om_te_picken";
14
+ readonly stations: "stap:pickstations";
15
+ readonly geprint: "stap:pakbon_geprint";
16
+ readonly afgemeld: "stap:kar_afgemeld";
17
+ readonly controle: "stap:controle";
18
+ readonly eind: "__eind";
19
+ };
20
+ export type FlowNodeId = (typeof FLOW_NODE)[keyof typeof FLOW_NODE];
21
+ /** Leesbare naam van een vakje, voor het logboek en de tijdlijn. */
22
+ export declare const FLOW_NODE_LABEL: Record<string, string>;
23
+ /** Herkomst van een order (orders.order_source) → bronvakje op de kaart. */
24
+ export declare function bronNodeVoor(source: string | null | undefined): string | null;
25
+ export declare function flowNodeLabel(id: string | null | undefined): string;
26
+ //# sourceMappingURL=flowNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowNodes.d.ts","sourceRoot":"","sources":["../../src/lib/flowNodes.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CAmBZ,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEpE,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmBlD,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO7E;AAGD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGnE"}
@@ -0,0 +1,64 @@
1
+ // ============================================================================
2
+ // src/lib/flowNodes.ts — vaste vakjes van de flowkaart
3
+ // ============================================================================
4
+ // De Engine legt bij elke stap vast bij welk vakje van de flowkaart die stap
5
+ // hoort. Zo kleurt de kaart de echt gelopen route in plaats van een schatting.
6
+ // De ids komen letterlijk overeen met de knoop-ids uit flowTree.ts.
7
+ // ============================================================================
8
+ export const FLOW_NODE = {
9
+ start: "__start",
10
+ bron: "__bron",
11
+ bronFloriday: "__bron_floriday",
12
+ bronMail: "__bron_mail",
13
+ bronActiemail: "__bron_actiemail",
14
+ bronHandmatig: "__bron_handmatig",
15
+ samenvoegen: "stap:bestelregels_samenvoegen",
16
+ ontvangst: "stap:orders_combineren",
17
+ indeling: "stap:beladingindeling",
18
+ picken: "stap:picken",
19
+ vrijgave: "stap:drukte_vertraging",
20
+ klaarOmTePicken: "stap:klaar_om_te_picken",
21
+ stations: "stap:pickstations",
22
+ geprint: "stap:pakbon_geprint",
23
+ afgemeld: "stap:kar_afgemeld",
24
+ controle: "stap:controle",
25
+ eind: "__eind",
26
+ };
27
+ /** Leesbare naam van een vakje, voor het logboek en de tijdlijn. */
28
+ export const FLOW_NODE_LABEL = {
29
+ __start: "Order komt binnen",
30
+ __bron: "Waar komt de order vandaan?",
31
+ __bron_floriday: "Bestellingen uit Floriday",
32
+ __bron_mail: "Bestellingen uit de mail",
33
+ __bron_actiemail: "Bestellingen uit de actiemail",
34
+ __bron_handmatig: "Handmatige bestellingen",
35
+ "stap:bestelregels_samenvoegen": "Bestelregels samenvoegen",
36
+ "stap:orders_combineren": "Orders combineren",
37
+ "stap:beladingindeling": "Karrenindeling",
38
+ "stap:picken": "Order picken",
39
+ "stap:drukte_vertraging": "Vrijgave en aanmeldmoment",
40
+ "stap:klaar_om_te_picken": "Klaar om te picken",
41
+ "stap:pickstations": "Pickstations en documenten",
42
+ "stap:pakbon_geprint": "Pakbon geprint",
43
+ "stap:kar_afgemeld": "Kar afgemeld",
44
+ "stap:controle": "Controle en afmelden",
45
+ __eind: "Order afgehandeld",
46
+ };
47
+ /** Herkomst van een order (orders.order_source) → bronvakje op de kaart. */
48
+ export function bronNodeVoor(source) {
49
+ const s = (source ?? "").toLowerCase();
50
+ if (!s)
51
+ return null;
52
+ if (s.includes("floriday"))
53
+ return FLOW_NODE.bronFloriday;
54
+ if (s.includes("actie"))
55
+ return FLOW_NODE.bronActiemail;
56
+ if (s.includes("mail"))
57
+ return FLOW_NODE.bronMail;
58
+ return FLOW_NODE.bronHandmatig;
59
+ }
60
+ export function flowNodeLabel(id) {
61
+ if (!id)
62
+ return "Onbekend vakje";
63
+ return FLOW_NODE_LABEL[id] ?? id.replace(/^stap:/, "").replace(/_/g, " ");
64
+ }
@@ -0,0 +1,117 @@
1
+ import type { FlowTree } from "./flowTree";
2
+ import type { NodeTraceGroep } from "./nodeTrace";
3
+ import { type StopReden } from "./stopReden";
4
+ import type { TraceOrderStand } from "../hooks/useOrderTrace";
5
+ /** Eén herberekening zoals `logistics_trace_versions` die teruggeeft. */
6
+ export interface OrderVersie {
7
+ id: string;
8
+ nr: number;
9
+ startedAt: string | null;
10
+ claimedAt: string | null;
11
+ finishedAt: string | null;
12
+ windowEnd: string | null;
13
+ status: string | null;
14
+ error: string | null;
15
+ reason: string | null;
16
+ reasonCode: string | null;
17
+ attempts: number;
18
+ events: number;
19
+ errors: number;
20
+ warnings: number;
21
+ waiting: number;
22
+ printJobs: number;
23
+ printFailed: number;
24
+ shippingEvents: number;
25
+ shippingStatus: string | null;
26
+ lastErrorStep: string | null;
27
+ lastError: string | null;
28
+ lastPhase: string | null;
29
+ lastStep: string | null;
30
+ lastEventAt: string | null;
31
+ }
32
+ export interface OrderKop {
33
+ orderNumber: string;
34
+ orderSource: string | null;
35
+ status: string | null;
36
+ deliveryDate: string | null;
37
+ customerName: string | null;
38
+ createdAt: string | null;
39
+ bufferId: string | null;
40
+ planLockedAt: string | null;
41
+ cancelledAt: string | null;
42
+ }
43
+ export interface KarStand {
44
+ total: number;
45
+ printed: number;
46
+ controlled: number;
47
+ announced: number;
48
+ }
49
+ export interface OrderRoute {
50
+ /** Herkomst: bepaalt welke bron-tak blauw wordt. */
51
+ source: "floriday" | "mail" | "actiemail" | "handmatig" | null;
52
+ /** Stappen (wizard-ids, in volgorde) die de order heeft bereikt. */
53
+ reached: string[];
54
+ /** Stap waar het misging, met reden. */
55
+ stuck: {
56
+ stepId: string;
57
+ reason: string;
58
+ } | null;
59
+ /** Stap die nog bezig/wachtend is (geen fout). */
60
+ busy: {
61
+ stepId: string;
62
+ reason: string;
63
+ } | null;
64
+ /** Helemaal klaar: gecontroleerd en afgemeld. */
65
+ finished: boolean;
66
+ /** Korte samenvatting voor de kaart. */
67
+ summary: string;
68
+ }
69
+ export declare const REASON_LABEL: Record<string, string>;
70
+ export declare function redenTekst(code: string | null | undefined, error?: string | null): string;
71
+ /** Leidt uit één versie + de huidige stand van de order de gelopen route af. */
72
+ export declare function bepaalRoute(versie: OrderVersie | null, order: OrderKop | null, carts: KarStand | null, isLaatste: boolean): OrderRoute;
73
+ export declare function stapLabel(stepId: string): string;
74
+ export type RouteMarker = {
75
+ kind: "stuck" | "busy" | "done";
76
+ text: string;
77
+ /** Welke keuze de Engine hier maakte. */
78
+ beslissing?: string | null;
79
+ /** Waarom die keuze is gemaakt. */
80
+ waarom?: string | null;
81
+ /** Bepalende gegevens en instellingen. */
82
+ feiten?: string[];
83
+ /** Tijdstip van de laatste gebeurtenis in dit vakje. */
84
+ at?: string | null;
85
+ /** Opgetelde duur van de stappen in dit vakje. */
86
+ durationMs?: number | null;
87
+ /** Aantal vastgelegde gebeurtenissen in dit vakje. */
88
+ count?: number;
89
+ /** Hoogste aantal pogingen in dit vakje. */
90
+ attempts?: number;
91
+ /** Foutsoort van de zwaarste gebeurtenis. */
92
+ errorClass?: string | null;
93
+ /** Wat de order hierna doet. */
94
+ nextStep?: string | null;
95
+ /** Bewijs hoort bij een vakje dat door een instellingswijziging niet meer op de kaart ligt. */
96
+ verouderd?: boolean;
97
+ /** Dit is het laatste vakje van de route. */
98
+ eindpunt?: boolean;
99
+ /** Waarom de reis hier ophoudt. */
100
+ stop?: StopReden | null;
101
+ };
102
+ export interface RouteOverlay {
103
+ tree: FlowTree;
104
+ markers: Map<string, RouteMarker>;
105
+ /** Samenkomstpunten waar deze order nu wacht op andere takken. */
106
+ wachtpunten: Set<string>;
107
+ }
108
+ /**
109
+ * Maakt een kopie van de kaart waarin alleen de gelopen route "active" is.
110
+ * Knopen/pijlen die de order (nog) niet heeft bereikt worden "possible".
111
+ *
112
+ * Zijn er echte gebeurtenissen per vakje (`groepen`), dan winnen die: de reis
113
+ * komt dan uit wat de Engine heeft vastgelegd. De heuristiek hieronder blijft
114
+ * de terugval voor oudere gebeurtenissen zonder vakje.
115
+ */
116
+ export declare function applyRoute(tree: FlowTree, route: OrderRoute | null, groepen?: Map<string, NodeTraceGroep> | null, stand?: TraceOrderStand | null): RouteOverlay;
117
+ //# sourceMappingURL=flowRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowRoute.d.ts","sourceRoot":"","sources":["../../src/lib/flowRoute.ts"],"names":[],"mappings":"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"}