@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
@@ -0,0 +1,88 @@
1
+ // ============================================================================
2
+ // src/hooks/useAfrondWachtrij.ts — stand van de afrondwachtrij na de controle
3
+ // ============================================================================
4
+ // Leest logistics_order_finalize_overview en de openstaande/mislukte regels.
5
+ // Muteert niets, behalve wanneer expliciet opnieuw proberen wordt gevraagd.
6
+ // ============================================================================
7
+ import { useCallback, useEffect, useState } from "react";
8
+ import { supabase } from "../integrations/supabase/moduleClient.js";
9
+ const LEEG = {
10
+ wachtend: 0,
11
+ bezig: 0,
12
+ mislukt: 0,
13
+ oudsteWachttijdSeconden: 0,
14
+ laatsteFout: null,
15
+ laatstAfgerond: null,
16
+ };
17
+ export function useAfrondWachtrij(intervalMs = 20000) {
18
+ const [stand, setStand] = useState(LEEG);
19
+ const [regels, setRegels] = useState([]);
20
+ const [laden, setLaden] = useState(true);
21
+ const [fout, setFout] = useState(null);
22
+ const laad = useCallback(async () => {
23
+ setFout(null);
24
+ const { data, error } = await supabase.rpc("logistics_order_finalize_overview");
25
+ if (error) {
26
+ setFout(error.message);
27
+ setLaden(false);
28
+ return;
29
+ }
30
+ const rijen = Array.isArray(data) ? data : [];
31
+ const r = (rijen[0] ?? {});
32
+ setStand({
33
+ wachtend: Number(r["wachtend"] ?? 0),
34
+ bezig: Number(r["bezig"] ?? 0),
35
+ mislukt: Number(r["mislukt"] ?? 0),
36
+ oudsteWachttijdSeconden: Number(r["oudste_wachttijd_seconden"] ?? 0),
37
+ laatsteFout: r["laatste_fout"] ?? null,
38
+ laatstAfgerond: r["laatst_afgerond"] ?? null,
39
+ });
40
+ const { data: lijst } = await supabase
41
+ .from("logistics_order_finalize_queue")
42
+ .select("order_id,status,attempts,max_attempts,reason,last_error,requested_at,next_attempt_at")
43
+ .in("status", ["pending", "running", "failed"])
44
+ .order("requested_at", { ascending: true })
45
+ .limit(50);
46
+ const veilig = Array.isArray(lijst) ? lijst : [];
47
+ setRegels(veilig.map((x) => {
48
+ const row = x;
49
+ return {
50
+ orderId: String(row["order_id"] ?? ""),
51
+ status: String(row["status"] ?? ""),
52
+ pogingen: Number(row["attempts"] ?? 0),
53
+ maxPogingen: Number(row["max_attempts"] ?? 0),
54
+ reden: row["reason"] ?? null,
55
+ fout: row["last_error"] ?? null,
56
+ aangemeldOp: row["requested_at"] ?? null,
57
+ volgendePoging: row["next_attempt_at"] ?? null,
58
+ };
59
+ }));
60
+ setLaden(false);
61
+ }, []);
62
+ useEffect(() => {
63
+ void laad();
64
+ const t = setInterval(() => {
65
+ void laad();
66
+ }, Math.max(5000, intervalMs));
67
+ return () => clearInterval(t);
68
+ }, [laad, intervalMs]);
69
+ const opnieuw = useCallback(async (orderId) => {
70
+ const { error } = await supabase.rpc("logistics_order_finalize_retry", { p_order_id: orderId });
71
+ if (error) {
72
+ setFout(error.message);
73
+ return false;
74
+ }
75
+ await laad();
76
+ return true;
77
+ }, [laad]);
78
+ const naloop = useCallback(async () => {
79
+ const { error } = await supabase.rpc("logistics_order_finalize_reconcile", { p_days: 14, p_limit: 200 });
80
+ if (error) {
81
+ setFout(error.message);
82
+ return false;
83
+ }
84
+ await laad();
85
+ return true;
86
+ }, [laad]);
87
+ return { stand, regels, laden, fout, herlaad: laad, opnieuw, naloop };
88
+ }
@@ -0,0 +1,39 @@
1
+ export interface BeladingStand {
2
+ openTotaal: number;
3
+ beoordelen: number;
4
+ herstelbaar: number;
5
+ producten: number;
6
+ orders: number;
7
+ oudsteSeconden: number;
8
+ laatstHersteld: string | null;
9
+ laatstGemeten: string | null;
10
+ }
11
+ export interface Belading {
12
+ piecesPerPackage: number | null;
13
+ packagesPerLayer: number | null;
14
+ layersPerLoadCarrier: number | null;
15
+ loadCarrier: string | null;
16
+ }
17
+ export interface Beladingsafwijking {
18
+ id: string;
19
+ soort: "product" | "order_line";
20
+ productNaam: string | null;
21
+ orderNummer: string | null;
22
+ lokaal: Belading;
23
+ floriday: Belading;
24
+ beoordelen: boolean;
25
+ reden: string | null;
26
+ sinds: string | null;
27
+ laatstGezien: string | null;
28
+ }
29
+ export declare function useBeladingsafwijkingen(intervalMs?: number): {
30
+ stand: BeladingStand;
31
+ afwijkingen: Beladingsafwijking[];
32
+ laden: boolean;
33
+ bezig: boolean;
34
+ fout: string | null;
35
+ herlaad: () => Promise<void>;
36
+ nuControleren: () => Promise<boolean>;
37
+ afsluiten: (id: string, notitie?: string) => Promise<boolean>;
38
+ };
39
+ //# sourceMappingURL=useBeladingsafwijkingen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBeladingsafwijkingen.d.ts","sourceRoot":"","sources":["../../src/hooks/useBeladingsafwijkingen.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,QAAQ;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,YAAY,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAwBD,wBAAgB,uBAAuB,CAAC,UAAU,SAAQ;;;;;;;;oBAsF3C,MAAM,YAAY,MAAM;EAgBtC"}
@@ -0,0 +1,119 @@
1
+ // ============================================================================
2
+ // src/hooks/useBeladingsafwijkingen.ts — verschillen tussen onze belading en Floriday
3
+ // ============================================================================
4
+ // Leest logistics_packing_overview en de openstaande afwijkingen. Muteert niets,
5
+ // behalve wanneer expliciet om een nieuwe controle of om afsluiten wordt gevraagd.
6
+ // Een regel die handmatig is vastgezet wordt nooit automatisch aangepast; dat
7
+ // bewaakt de database zelf.
8
+ // ============================================================================
9
+ import { useCallback, useEffect, useState } from "react";
10
+ import { supabase } from "../integrations/supabase/moduleClient.js";
11
+ const LEEG = {
12
+ openTotaal: 0,
13
+ beoordelen: 0,
14
+ herstelbaar: 0,
15
+ producten: 0,
16
+ orders: 0,
17
+ oudsteSeconden: 0,
18
+ laatstHersteld: null,
19
+ laatstGemeten: null,
20
+ };
21
+ function leesBelading(waarde) {
22
+ const b = (waarde ?? {});
23
+ const getal = (v) => (v === null || v === undefined ? null : Number(v));
24
+ return {
25
+ piecesPerPackage: getal(b["pieces_per_package"]),
26
+ packagesPerLayer: getal(b["packages_per_layer"]),
27
+ layersPerLoadCarrier: getal(b["layers_per_load_carrier"]),
28
+ loadCarrier: b["load_carrier"] ?? null,
29
+ };
30
+ }
31
+ export function useBeladingsafwijkingen(intervalMs = 60000) {
32
+ const [stand, setStand] = useState(LEEG);
33
+ const [afwijkingen, setAfwijkingen] = useState([]);
34
+ const [laden, setLaden] = useState(true);
35
+ const [bezig, setBezig] = useState(false);
36
+ const [fout, setFout] = useState(null);
37
+ const laad = useCallback(async () => {
38
+ setFout(null);
39
+ const { data, error } = await supabase.rpc("logistics_packing_overview");
40
+ if (error) {
41
+ setFout(error.message);
42
+ setLaden(false);
43
+ return;
44
+ }
45
+ const rijen = Array.isArray(data) ? data : [];
46
+ const r = (rijen[0] ?? {});
47
+ setStand({
48
+ openTotaal: Number(r["open_totaal"] ?? 0),
49
+ beoordelen: Number(r["beoordelen"] ?? 0),
50
+ herstelbaar: Number(r["herstelbaar"] ?? 0),
51
+ producten: Number(r["producten"] ?? 0),
52
+ orders: Number(r["orders"] ?? 0),
53
+ oudsteSeconden: Number(r["oudste_seconden"] ?? 0),
54
+ laatstHersteld: r["laatst_hersteld"] ?? null,
55
+ laatstGemeten: r["laatst_gemeten"] ?? null,
56
+ });
57
+ const { data: lijst, error: lijstFout } = await supabase
58
+ .from("logistics_packing_deviations")
59
+ .select("id,scope,product_name,order_number,local_packing,floriday_packing,needs_human,human_reason,first_seen_at,last_seen_at")
60
+ .is("resolved_at", null)
61
+ .order("first_seen_at", { ascending: true })
62
+ .limit(100);
63
+ if (lijstFout)
64
+ setFout(lijstFout.message);
65
+ const veilig = Array.isArray(lijst) ? lijst : [];
66
+ setAfwijkingen(veilig.map((x) => {
67
+ const row = (x ?? {});
68
+ return {
69
+ id: String(row["id"] ?? ""),
70
+ soort: row["scope"] ?? "order_line",
71
+ productNaam: row["product_name"] ?? null,
72
+ orderNummer: row["order_number"] ?? null,
73
+ lokaal: leesBelading(row["local_packing"]),
74
+ floriday: leesBelading(row["floriday_packing"]),
75
+ beoordelen: row["needs_human"] === true,
76
+ reden: row["human_reason"] ?? null,
77
+ sinds: row["first_seen_at"] ?? null,
78
+ laatstGezien: row["last_seen_at"] ?? null,
79
+ };
80
+ }));
81
+ setLaden(false);
82
+ }, []);
83
+ useEffect(() => {
84
+ void laad();
85
+ const t = setInterval(() => {
86
+ void laad();
87
+ }, Math.max(15000, intervalMs));
88
+ return () => clearInterval(t);
89
+ }, [laad, intervalMs]);
90
+ /** Nu meten en waar veilig mogelijk bijwerken. */
91
+ const nuControleren = useCallback(async () => {
92
+ setBezig(true);
93
+ const { error } = await supabase.rpc("logistics_packing_reconcile", {
94
+ p_scan_limit: 500,
95
+ p_fix_limit: 100,
96
+ });
97
+ setBezig(false);
98
+ if (error) {
99
+ setFout(error.message);
100
+ return false;
101
+ }
102
+ await laad();
103
+ return true;
104
+ }, [laad]);
105
+ /** Een afwijking bewust afsluiten nadat een mens ernaar heeft gekeken. */
106
+ const afsluiten = useCallback(async (id, notitie) => {
107
+ const { error } = await supabase.rpc("logistics_packing_dismiss", {
108
+ p_id: id,
109
+ p_note: notitie ?? null,
110
+ });
111
+ if (error) {
112
+ setFout(error.message);
113
+ return false;
114
+ }
115
+ await laad();
116
+ return true;
117
+ }, [laad]);
118
+ return { stand, afwijkingen, laden, bezig, fout, herlaad: laad, nuControleren, afsluiten };
119
+ }
@@ -24,5 +24,12 @@ export declare function useGeblokkeerdeOrders(): {
24
24
  busy: boolean;
25
25
  refresh: () => Promise<void>;
26
26
  retry: (orderIds: string[]) => Promise<number>;
27
+ dubbelenOpruimen: (orderId: string) => Promise<{
28
+ ok: boolean;
29
+ reden: string;
30
+ verwijderd: number;
31
+ na: number;
32
+ meerTeDoen: boolean;
33
+ }>;
27
34
  };
28
35
  //# sourceMappingURL=useGeblokkeerdeOrders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGeblokkeerdeOrders.d.ts","sourceRoot":"","sources":["../../src/hooks/useGeblokkeerdeOrders.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY9C,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,UAGzD;AAED,wBAAgB,qBAAqB;;;;;;;sBAqDhB,MAAM,EAAE;EAmB5B"}
1
+ {"version":3,"file":"useGeblokkeerdeOrders.d.ts","sourceRoot":"","sources":["../../src/hooks/useGeblokkeerdeOrders.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAc9C,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,UAGzD;AAED,wBAAgB,qBAAqB;;;;;;;sBAqDhB,MAAM,EAAE;gCAwBT,MAAM;;;;;;;EAyBzB"}
@@ -4,7 +4,7 @@
4
4
  // logistics_blocked_orders / logistics_blocked_overview / logistics_plan_retry.
5
5
  // ============================================================================
6
6
  import { useCallback, useEffect, useState } from "react";
7
- import { supabase } from "../integrations/supabase/moduleClient";
7
+ import { supabase } from "../integrations/supabase/moduleClient.js";
8
8
  export const REDEN_LABEL = {
9
9
  belading_onbekend: "Belading onbekend",
10
10
  belading_onvolledig: "Belading onvolledig",
@@ -15,6 +15,7 @@ export const REDEN_LABEL = {
15
15
  geen_karren: "Geen karren berekend",
16
16
  verificatie_mislukt: "Controle mislukt",
17
17
  bufferdekking_onvolledig: "Buffer niet volledig gedekt",
18
+ dubbele_regels: "Dubbele bestelregels",
18
19
  karindeling_geblokkeerd: "Karindeling geblokkeerd",
19
20
  other: "Overige reden",
20
21
  };
@@ -90,5 +91,30 @@ export function useGeblokkeerdeOrders() {
90
91
  setBusy(false);
91
92
  }
92
93
  }, [load]);
93
- return { rows, overzicht, loading, error, busy, refresh: load, retry };
94
+ /**
95
+ * Dubbele bestelregels van één order opruimen. Bewust handmatig: van elke
96
+ * identieke regel blijft er één staan. De Engine weigert bij orders waarvan
97
+ * al iets is geprint, gescand of gecontroleerd.
98
+ */
99
+ const dubbelenOpruimen = useCallback(async (orderId) => {
100
+ setBusy(true);
101
+ try {
102
+ const { data, error: rpcError } = await supabase.rpc("logistics_cleanup_duplicate_order_lines", { p_order_id: orderId });
103
+ if (rpcError)
104
+ throw new Error(rpcError.message);
105
+ const raw = (data ?? {});
106
+ await load();
107
+ return {
108
+ ok: Boolean(raw["ok"]),
109
+ reden: raw["reden"] ?? null,
110
+ verwijderd: Number(raw["verwijderd"] ?? 0),
111
+ na: Number(raw["na"] ?? 0),
112
+ meerTeDoen: Boolean(raw["meerTeDoen"]),
113
+ };
114
+ }
115
+ finally {
116
+ setBusy(false);
117
+ }
118
+ }, [load]);
119
+ return { rows, overzicht, loading, error, busy, refresh: load, retry, dubbelenOpruimen };
94
120
  }
@@ -0,0 +1,78 @@
1
+ export interface TraceOrderRow {
2
+ orderRef: string;
3
+ orderSource: string | null;
4
+ state: string;
5
+ lastStep: string | null;
6
+ lastPhase: string | null;
7
+ lastStatus: string | null;
8
+ lastReason: string | null;
9
+ errors: number;
10
+ warnings: number;
11
+ waiting: number;
12
+ attempts: number;
13
+ traceId: string | null;
14
+ firstAt: string | null;
15
+ lastAt: string | null;
16
+ }
17
+ export interface TraceEventRow {
18
+ id: string;
19
+ traceId: string | null;
20
+ orderRef: string | null;
21
+ orderSource: string | null;
22
+ cartRef: string | null;
23
+ slipRef: string | null;
24
+ phase: string;
25
+ step: string;
26
+ status: string;
27
+ actor: string | null;
28
+ input: unknown;
29
+ output: unknown;
30
+ reads: unknown;
31
+ decision: string | null;
32
+ reason: string | null;
33
+ values: unknown;
34
+ rule: string | null;
35
+ dbTable: string | null;
36
+ dbRecord: string | null;
37
+ dbAction: string | null;
38
+ dbOld: unknown;
39
+ dbNew: unknown;
40
+ externalSystem: string | null;
41
+ externalAction: string | null;
42
+ externalRef: string | null;
43
+ externalStatus: string | null;
44
+ externalResponse: unknown;
45
+ error: string | null;
46
+ /** Soort fout: technisch, ontbrekende_gegevens, configuratie, regel of extern. */
47
+ errorClass: string | null;
48
+ /** Vakje in de flowkaart waar deze stap hoort. */
49
+ nodeId: string | null;
50
+ /** De berekening achter de beslissing. */
51
+ calc: unknown;
52
+ /** Wat de order hierna doet. */
53
+ nextStep: string | null;
54
+ attempts: number;
55
+ nextAttemptAt: string | null;
56
+ durationMs: number | null;
57
+ createdAt: string;
58
+ }
59
+ export declare function mapEvent(r: any): TraceEventRow;
60
+ export declare function useLogisticsTrace(): {
61
+ orders: TraceOrderRow[];
62
+ loading: boolean;
63
+ error: string | null;
64
+ search: string;
65
+ setSearch: import("react").Dispatch<import("react").SetStateAction<string>>;
66
+ status: string;
67
+ setStatus: import("react").Dispatch<import("react").SetStateAction<string>>;
68
+ hours: number;
69
+ setHours: import("react").Dispatch<import("react").SetStateAction<number>>;
70
+ refresh: () => Promise<void>;
71
+ };
72
+ export declare function useLogisticsTraceTimeline(orderRef: string | null): {
73
+ events: TraceEventRow[];
74
+ loading: boolean;
75
+ error: string | null;
76
+ refresh: () => Promise<void>;
77
+ };
78
+ //# sourceMappingURL=useLogisticsTrace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogisticsTrace.d.ts","sourceRoot":"","sources":["../../src/hooks/useLogisticsTrace.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kFAAkF;IAClF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0CAA0C;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAsBD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,aAAa,CAwC9C;AAED,wBAAgB,iBAAiB;;;;;;;;;;;EAmDhC;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;;;;;EAiChE"}
@@ -0,0 +1,152 @@
1
+ // ============================================================================
2
+ // src/hooks/useLogisticsTrace.ts — het logboek van de Logistiek Engine lezen
3
+ // ============================================================================
4
+ // Alles komt uit de database-functies logistics_trace_orders en
5
+ // logistics_trace_timeline. Er wordt niets afgeleid of aangevuld: wat hier
6
+ // staat, is echt door de Engine vastgelegd.
7
+ // ============================================================================
8
+ import { useCallback, useEffect, useState } from "react";
9
+ import { supabase } from "../integrations/supabase/moduleClient.js";
10
+ function mapOrder(r) {
11
+ return {
12
+ orderRef: String(r?.order_ref ?? ""),
13
+ orderSource: r?.order_source ?? null,
14
+ state: String(r?.state ?? "bezig"),
15
+ lastStep: r?.last_step ?? null,
16
+ lastPhase: r?.last_phase ?? null,
17
+ lastStatus: r?.last_status ?? null,
18
+ lastReason: r?.last_reason ?? null,
19
+ errors: Number(r?.errors ?? 0),
20
+ warnings: Number(r?.warnings ?? 0),
21
+ waiting: Number(r?.waiting ?? 0),
22
+ attempts: Number(r?.attempts ?? 0),
23
+ traceId: r?.trace_id ?? null,
24
+ firstAt: r?.first_at ?? null,
25
+ lastAt: r?.last_at ?? null,
26
+ };
27
+ }
28
+ export function mapEvent(r) {
29
+ return {
30
+ id: String(r?.id ?? ""),
31
+ traceId: r?.trace_id ?? null,
32
+ orderRef: r?.order_ref ?? null,
33
+ orderSource: r?.order_source ?? null,
34
+ cartRef: r?.cart_ref ?? null,
35
+ slipRef: r?.slip_ref ?? null,
36
+ phase: String(r?.phase ?? "onbekend"),
37
+ step: String(r?.step ?? "onbekend"),
38
+ status: String(r?.status ?? "geslaagd"),
39
+ actor: r?.actor ?? null,
40
+ input: r?.input ?? null,
41
+ output: r?.output ?? null,
42
+ reads: r?.reads ?? null,
43
+ decision: r?.decision ?? null,
44
+ reason: r?.reason ?? null,
45
+ values: r?.values_used ?? null,
46
+ rule: r?.rule ?? null,
47
+ dbTable: r?.db_table ?? null,
48
+ dbRecord: r?.db_record ?? null,
49
+ dbAction: r?.db_action ?? null,
50
+ dbOld: r?.db_old ?? null,
51
+ dbNew: r?.db_new ?? null,
52
+ externalSystem: r?.external_system ?? null,
53
+ externalAction: r?.external_action ?? null,
54
+ externalRef: r?.external_ref ?? null,
55
+ externalStatus: r?.external_status ?? null,
56
+ externalResponse: r?.external_response ?? null,
57
+ error: r?.error ?? null,
58
+ errorClass: r?.error_class ?? null,
59
+ nodeId: r?.node_id ?? null,
60
+ calc: r?.calc ?? null,
61
+ nextStep: r?.next_step ?? null,
62
+ attempts: Number(r?.attempts ?? 0),
63
+ nextAttemptAt: r?.next_attempt_at ?? null,
64
+ durationMs: r?.duration_ms === null || r?.duration_ms === undefined ? null : Number(r.duration_ms),
65
+ createdAt: String(r?.created_at ?? ""),
66
+ };
67
+ }
68
+ export function useLogisticsTrace() {
69
+ const [search, setSearch] = useState("");
70
+ const [status, setStatus] = useState("");
71
+ const [hours, setHours] = useState(48);
72
+ const [orders, setOrders] = useState([]);
73
+ const [loading, setLoading] = useState(true);
74
+ const [error, setError] = useState(null);
75
+ const load = useCallback(async () => {
76
+ setLoading(true);
77
+ setError(null);
78
+ try {
79
+ const since = new Date(Date.now() - hours * 3600000).toISOString();
80
+ const { data, error: rpcError } = await supabase.rpc("logistics_trace_orders", {
81
+ p_search: search || null,
82
+ p_status: status || null,
83
+ p_since: since,
84
+ p_limit: 200,
85
+ });
86
+ if (rpcError)
87
+ throw new Error(rpcError.message);
88
+ const safe = Array.isArray(data) ? data : [];
89
+ setOrders(safe.map(mapOrder));
90
+ }
91
+ catch (e) {
92
+ setError(e?.message ? String(e.message) : "Het logboek kon niet worden gelezen.");
93
+ setOrders([]);
94
+ }
95
+ finally {
96
+ setLoading(false);
97
+ }
98
+ }, [search, status, hours]);
99
+ useEffect(() => {
100
+ void load();
101
+ }, [load]);
102
+ useEffect(() => {
103
+ const timer = setInterval(() => void load(), 30000);
104
+ return () => clearInterval(timer);
105
+ }, [load]);
106
+ return {
107
+ orders,
108
+ loading,
109
+ error,
110
+ search,
111
+ setSearch,
112
+ status,
113
+ setStatus,
114
+ hours,
115
+ setHours,
116
+ refresh: load,
117
+ };
118
+ }
119
+ export function useLogisticsTraceTimeline(orderRef) {
120
+ const [events, setEvents] = useState([]);
121
+ const [loading, setLoading] = useState(false);
122
+ const [error, setError] = useState(null);
123
+ const load = useCallback(async () => {
124
+ if (!orderRef) {
125
+ setEvents([]);
126
+ return;
127
+ }
128
+ setLoading(true);
129
+ setError(null);
130
+ try {
131
+ const { data, error: rpcError } = await supabase.rpc("logistics_trace_timeline", {
132
+ p_order_ref: orderRef,
133
+ p_limit: 500,
134
+ });
135
+ if (rpcError)
136
+ throw new Error(rpcError.message);
137
+ const safe = Array.isArray(data) ? data : [];
138
+ setEvents(safe.map(mapEvent));
139
+ }
140
+ catch (e) {
141
+ setError(e?.message ? String(e.message) : "De tijdlijn kon niet worden gelezen.");
142
+ setEvents([]);
143
+ }
144
+ finally {
145
+ setLoading(false);
146
+ }
147
+ }, [orderRef]);
148
+ useEffect(() => {
149
+ void load();
150
+ }, [load]);
151
+ return { events, loading, error, refresh: load };
152
+ }
@@ -0,0 +1,11 @@
1
+ import { type NodeTraceGroep } from "../lib/nodeTrace";
2
+ import type { OrderVersie } from "../lib/flowRoute";
3
+ export declare function useOrderNodeTrace(orderRef: string | null, versie: OrderVersie | null): {
4
+ events: import("./useLogisticsTrace").TraceEventRow[];
5
+ groepen: Map<string, NodeTraceGroep>;
6
+ reis: NodeTraceGroep[];
7
+ loading: boolean;
8
+ error: string | null;
9
+ refresh: () => Promise<void>;
10
+ };
11
+ //# sourceMappingURL=useOrderNodeTrace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOrderNodeTrace.d.ts","sourceRoot":"","sources":["../../src/hooks/useOrderNodeTrace.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;;;;;;;EAkBpF"}
@@ -0,0 +1,26 @@
1
+ // ============================================================================
2
+ // src/hooks/useOrderNodeTrace.ts — de reis van één order per vakje
3
+ // ============================================================================
4
+ // Haalt de gebeurtenissen van een order (of van één herberekening) op en
5
+ // groepeert ze per vakje van de flowkaart. Leest alleen.
6
+ // ============================================================================
7
+ import { useMemo } from "react";
8
+ import { useLogisticsTraceTimeline } from "./useLogisticsTrace";
9
+ import { useVersieEvents } from "./useOrderVersies";
10
+ import { groepeerPerNode, reisVolgorde } from "../lib/nodeTrace";
11
+ export function useOrderNodeTrace(orderRef, versie) {
12
+ const alles = useLogisticsTraceTimeline(versie ? null : orderRef);
13
+ const perVersie = useVersieEvents(versie ? orderRef : null, versie);
14
+ const bron = versie ? perVersie : alles;
15
+ const events = Array.isArray(bron.events) ? bron.events : [];
16
+ const groepen = useMemo(() => groepeerPerNode(events), [events]);
17
+ const reis = useMemo(() => reisVolgorde(groepen), [groepen]);
18
+ return {
19
+ events,
20
+ groepen,
21
+ reis,
22
+ loading: bron.loading,
23
+ error: bron.error,
24
+ refresh: bron.refresh,
25
+ };
26
+ }
@@ -0,0 +1,74 @@
1
+ export interface TraceOrderOverzicht {
2
+ orderNumber: string;
3
+ orderSource: string | null;
4
+ orderStatus: string | null;
5
+ deliveryDate: string | null;
6
+ customerName: string | null;
7
+ createdAt: string | null;
8
+ cancelledAt: string | null;
9
+ bufferId: string | null;
10
+ state: string;
11
+ events: number;
12
+ versions: number;
13
+ errors: number;
14
+ waiting: number;
15
+ warnings: number;
16
+ attempts: number;
17
+ lastAt: string | null;
18
+ firstAt: string | null;
19
+ lastStep: string | null;
20
+ lastPhase: string | null;
21
+ lastStatus: string | null;
22
+ lastNode: string | null;
23
+ lastReason: string | null;
24
+ errorClass: string | null;
25
+ traceId: string | null;
26
+ queueStatus: string | null;
27
+ reasonCode: string | null;
28
+ queueError: string | null;
29
+ }
30
+ export interface TraceOrderStand {
31
+ orderRef: string;
32
+ lastStep: string | null;
33
+ lastNode: string | null;
34
+ lastPhase: string | null;
35
+ lastStatus: string | null;
36
+ lastAt: string | null;
37
+ stuckStep: string | null;
38
+ stuckNode: string | null;
39
+ stuckStatus: string | null;
40
+ stuckReason: string | null;
41
+ stuckError: string | null;
42
+ errorClass: string | null;
43
+ nextStep: string | null;
44
+ nextAttemptAt: string | null;
45
+ blockedSince: string | null;
46
+ tries: number;
47
+ attempts: number;
48
+ queueStatus: string | null;
49
+ reasonCode: string | null;
50
+ queueError: string | null;
51
+ }
52
+ export interface TraceFilters {
53
+ search: string;
54
+ state: string;
55
+ errorClass: string;
56
+ source: string;
57
+ step: string;
58
+ hours: number;
59
+ }
60
+ export declare function useOrderTraceOverzicht(): {
61
+ orders: TraceOrderOverzicht[];
62
+ loading: boolean;
63
+ error: string | null;
64
+ filters: TraceFilters;
65
+ patch: (p: Partial<TraceFilters>) => void;
66
+ reset: () => void;
67
+ refresh: () => Promise<void>;
68
+ };
69
+ export declare function useOrderTraceStand(orderRef: string | null): {
70
+ stand: TraceOrderStand | null;
71
+ loading: boolean;
72
+ refresh: () => Promise<void>;
73
+ };
74
+ //# sourceMappingURL=useOrderTrace.d.ts.map