@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.
- package/dist-lib/components/AfrondWachtrijCard.d.ts +2 -0
- package/dist-lib/components/AfrondWachtrijCard.d.ts.map +1 -0
- package/dist-lib/components/AfrondWachtrijCard.js +27 -0
- package/dist-lib/components/BeladingsafwijkingenCard.d.ts +2 -0
- package/dist-lib/components/BeladingsafwijkingenCard.d.ts.map +1 -0
- package/dist-lib/components/BeladingsafwijkingenCard.js +44 -0
- package/dist-lib/components/FlowCanvas.d.ts +34 -0
- package/dist-lib/components/FlowCanvas.d.ts.map +1 -0
- package/dist-lib/components/FlowCanvas.js +490 -0
- package/dist-lib/components/FlowOrders.d.ts +8 -0
- package/dist-lib/components/FlowOrders.d.ts.map +1 -0
- package/dist-lib/components/FlowOrders.js +171 -0
- package/dist-lib/components/FlowPage.d.ts +2 -0
- package/dist-lib/components/FlowPage.d.ts.map +1 -0
- package/dist-lib/components/FlowPage.js +310 -0
- package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
- package/dist-lib/components/GeblokkeerdeOrdersCard.js +21 -2
- package/dist-lib/components/InklapbaarVenster.d.ts +9 -0
- package/dist-lib/components/InklapbaarVenster.d.ts.map +1 -0
- package/dist-lib/components/InklapbaarVenster.js +10 -0
- package/dist-lib/components/KardekkingCard.d.ts +2 -0
- package/dist-lib/components/KardekkingCard.d.ts.map +1 -0
- package/dist-lib/components/KardekkingCard.js +29 -0
- package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
- package/dist-lib/components/LogistiekEnginePage.js +15 -3
- package/dist-lib/components/LogistiekEngineQueuePage.d.ts +2 -0
- package/dist-lib/components/LogistiekEngineQueuePage.d.ts.map +1 -0
- package/dist-lib/components/LogistiekEngineQueuePage.js +13 -0
- package/dist-lib/components/NodeTracePanel.d.ts +14 -0
- package/dist-lib/components/NodeTracePanel.d.ts.map +1 -0
- package/dist-lib/components/NodeTracePanel.js +46 -0
- package/dist-lib/components/OrderJourneyBar.d.ts +9 -0
- package/dist-lib/components/OrderJourneyBar.d.ts.map +1 -0
- package/dist-lib/components/OrderJourneyBar.js +26 -0
- package/dist-lib/components/OrderLogboek.d.ts +10 -0
- package/dist-lib/components/OrderLogboek.d.ts.map +1 -0
- package/dist-lib/components/OrderLogboek.js +92 -0
- package/dist-lib/components/OrderStopBanner.d.ts +12 -0
- package/dist-lib/components/OrderStopBanner.d.ts.map +1 -0
- package/dist-lib/components/OrderStopBanner.js +36 -0
- package/dist-lib/components/OrderTraceDetails.d.ts +22 -0
- package/dist-lib/components/OrderTraceDetails.d.ts.map +1 -0
- package/dist-lib/components/OrderTraceDetails.js +88 -0
- package/dist-lib/components/PlanWachtrijPage.d.ts +2 -0
- package/dist-lib/components/PlanWachtrijPage.d.ts.map +1 -0
- package/dist-lib/components/PlanWachtrijPage.js +99 -0
- package/dist-lib/components/PlannerDiffCard.d.ts +2 -0
- package/dist-lib/components/PlannerDiffCard.d.ts.map +1 -0
- package/dist-lib/components/PlannerDiffCard.js +25 -0
- package/dist-lib/components/RegiePage.d.ts.map +1 -1
- package/dist-lib/components/RegiePage.js +28 -78
- package/dist-lib/components/TaakGezondheidCard.d.ts +2 -0
- package/dist-lib/components/TaakGezondheidCard.d.ts.map +1 -0
- package/dist-lib/components/TaakGezondheidCard.js +31 -0
- package/dist-lib/components/WerktijdenCard.d.ts +2 -0
- package/dist-lib/components/WerktijdenCard.d.ts.map +1 -0
- package/dist-lib/components/WerktijdenCard.js +37 -0
- package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
- package/dist-lib/components/WerkwijzeHerindelingCard.js +100 -6
- package/dist-lib/hooks/useAfrondWachtrij.d.ts +28 -0
- package/dist-lib/hooks/useAfrondWachtrij.d.ts.map +1 -0
- package/dist-lib/hooks/useAfrondWachtrij.js +88 -0
- package/dist-lib/hooks/useBeladingsafwijkingen.d.ts +39 -0
- package/dist-lib/hooks/useBeladingsafwijkingen.d.ts.map +1 -0
- package/dist-lib/hooks/useBeladingsafwijkingen.js +119 -0
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +7 -0
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
- package/dist-lib/hooks/useGeblokkeerdeOrders.js +28 -2
- package/dist-lib/hooks/useLogisticsTrace.d.ts +78 -0
- package/dist-lib/hooks/useLogisticsTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useLogisticsTrace.js +152 -0
- package/dist-lib/hooks/useOrderNodeTrace.d.ts +11 -0
- package/dist-lib/hooks/useOrderNodeTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderNodeTrace.js +26 -0
- package/dist-lib/hooks/useOrderTrace.d.ts +74 -0
- package/dist-lib/hooks/useOrderTrace.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderTrace.js +134 -0
- package/dist-lib/hooks/useOrderVersies.d.ts +47 -0
- package/dist-lib/hooks/useOrderVersies.d.ts.map +1 -0
- package/dist-lib/hooks/useOrderVersies.js +194 -0
- package/dist-lib/hooks/usePlanWachtrij.d.ts +33 -0
- package/dist-lib/hooks/usePlanWachtrij.d.ts.map +1 -0
- package/dist-lib/hooks/usePlanWachtrij.js +104 -0
- package/dist-lib/hooks/useRecalcJob.js +1 -1
- package/dist-lib/hooks/useRuleEngine.d.ts +1 -0
- package/dist-lib/hooks/useRuleEngine.d.ts.map +1 -1
- package/dist-lib/hooks/useRuleEngine.js +1 -0
- package/dist-lib/hooks/useShippingNoteDiagnose.d.ts +20 -0
- package/dist-lib/hooks/useShippingNoteDiagnose.d.ts.map +1 -0
- package/dist-lib/hooks/useShippingNoteDiagnose.js +52 -0
- package/dist-lib/hooks/useShippingNoteStatus.d.ts +29 -0
- package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -0
- package/dist-lib/hooks/useShippingNoteStatus.js +107 -0
- package/dist-lib/hooks/useTaakGezondheid.d.ts +16 -0
- package/dist-lib/hooks/useTaakGezondheid.d.ts.map +1 -0
- package/dist-lib/hooks/useTaakGezondheid.js +43 -0
- package/dist-lib/hooks/useWerktijden.d.ts +33 -0
- package/dist-lib/hooks/useWerktijden.d.ts.map +1 -0
- package/dist-lib/hooks/useWerktijden.js +88 -0
- package/dist-lib/hooks/useWerkwijzeStatus.d.ts +12 -1
- package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
- package/dist-lib/hooks/useWerkwijzeStatus.js +61 -5
- package/dist-lib/index.d.ts +23 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +23 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +4993 -459
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +4993 -459
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.js +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +4993 -459
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/previewAuthStorage.d.ts +1 -1
- package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/previewAuthStorage.js +8 -1
- package/dist-lib/integrations/supabase/types.d.ts +5022 -432
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/attachAuthToken.js +1 -1
- package/dist-lib/lib/bufferDecision.test.d.ts +2 -0
- package/dist-lib/lib/bufferDecision.test.d.ts.map +1 -0
- package/dist-lib/lib/bufferDecision.test.js +104 -0
- package/dist-lib/lib/cartCoverage.functions.d.ts +30820 -0
- package/dist-lib/lib/cartCoverage.functions.d.ts.map +1 -0
- package/dist-lib/lib/cartCoverage.functions.js +20 -0
- package/dist-lib/lib/cartPlanRequests.server.d.ts +1 -1
- package/dist-lib/lib/cartPlanRequests.server.d.ts.map +1 -1
- package/dist-lib/lib/cartPlanRequests.server.js +49 -8
- package/dist-lib/lib/floridayDocuments.functions.d.ts +13623 -21
- package/dist-lib/lib/floridayDocuments.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayDocuments.functions.js +5 -5
- package/dist-lib/lib/floridayDocuments.server.d.ts +14 -0
- package/dist-lib/lib/floridayDocuments.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayDocuments.server.js +58 -0
- package/dist-lib/lib/floridayGuard.server.d.ts +1 -1
- package/dist-lib/lib/floridayGuard.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayGuard.server.js +6 -3
- package/dist-lib/lib/floridayPush.functions.d.ts +4993 -459
- package/dist-lib/lib/floridayPush.functions.d.ts.map +1 -1
- package/dist-lib/lib/floridayPush.functions.js +3 -3
- package/dist-lib/lib/flowGraph.d.ts +43 -0
- package/dist-lib/lib/flowGraph.d.ts.map +1 -0
- package/dist-lib/lib/flowGraph.js +153 -0
- package/dist-lib/lib/flowJourney.d.ts +40 -0
- package/dist-lib/lib/flowJourney.d.ts.map +1 -0
- package/dist-lib/lib/flowJourney.js +156 -0
- package/dist-lib/lib/flowNodes.d.ts +26 -0
- package/dist-lib/lib/flowNodes.d.ts.map +1 -0
- package/dist-lib/lib/flowNodes.js +64 -0
- package/dist-lib/lib/flowRoute.d.ts +117 -0
- package/dist-lib/lib/flowRoute.d.ts.map +1 -0
- package/dist-lib/lib/flowRoute.js +583 -0
- package/dist-lib/lib/flowTree.d.ts +149 -0
- package/dist-lib/lib/flowTree.d.ts.map +1 -0
- package/dist-lib/lib/flowTree.js +908 -0
- package/dist-lib/lib/foutTekst.d.ts +4 -0
- package/dist-lib/lib/foutTekst.d.ts.map +1 -0
- package/dist-lib/lib/foutTekst.js +43 -0
- package/dist-lib/lib/handlers/index.d.ts +1 -0
- package/dist-lib/lib/handlers/index.d.ts.map +1 -1
- package/dist-lib/lib/handlers/index.js +1 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts +3 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -0
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +100 -0
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts +2 -0
- package/dist-lib/lib/handlers/logistics-tick.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-tick.server.js +153 -2
- package/dist-lib/lib/handlers/logistics-tick.test.d.ts +2 -0
- package/dist-lib/lib/handlers/logistics-tick.test.d.ts.map +1 -0
- package/dist-lib/lib/handlers/logistics-tick.test.js +63 -0
- package/dist-lib/lib/loadCarrierPlanner.d.ts +2 -0
- package/dist-lib/lib/loadCarrierPlanner.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanner.js +18 -0
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts +22705 -35
- package/dist-lib/lib/loadCarrierPlanning.functions.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.functions.js +7 -7
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts +33 -12
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.server.js +534 -228
- package/dist-lib/lib/logisticsPlanner.d.ts.map +1 -1
- package/dist-lib/lib/logisticsPlanner.js +14 -2
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts +9082 -14
- package/dist-lib/lib/logisticsRecalcJob.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.functions.js +4 -4
- package/dist-lib/lib/logisticsRecalcJob.server.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalcJob.server.js +17 -2
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts +4993 -459
- package/dist-lib/lib/logisticsRecalculate.functions.d.ts.map +1 -1
- package/dist-lib/lib/logisticsRecalculate.functions.js +2 -2
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +893 -0
- package/dist-lib/lib/nodeTrace.d.ts +65 -0
- package/dist-lib/lib/nodeTrace.d.ts.map +1 -0
- package/dist-lib/lib/nodeTrace.js +182 -0
- package/dist-lib/lib/pickQueueCleanup.server.d.ts +14 -0
- package/dist-lib/lib/pickQueueCleanup.server.d.ts.map +1 -0
- package/dist-lib/lib/pickQueueCleanup.server.js +80 -0
- package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/planQueue.server.js +164 -3
- package/dist-lib/lib/plannerDiff.d.ts +37 -0
- package/dist-lib/lib/plannerDiff.d.ts.map +1 -0
- package/dist-lib/lib/plannerDiff.functions.d.ts +30821 -0
- package/dist-lib/lib/plannerDiff.functions.d.ts.map +1 -0
- package/dist-lib/lib/plannerDiff.functions.js +21 -0
- package/dist-lib/lib/plannerDiff.js +74 -0
- package/dist-lib/lib/plannerDiff.server.d.ts +5 -0
- package/dist-lib/lib/plannerDiff.server.d.ts.map +1 -0
- package/dist-lib/lib/plannerDiff.server.js +60 -0
- package/dist-lib/lib/plannerDiff.test.d.ts +2 -0
- package/dist-lib/lib/plannerDiff.test.d.ts.map +1 -0
- package/dist-lib/lib/plannerDiff.test.js +41 -0
- package/dist-lib/lib/resolveBuffer.test.d.ts +2 -0
- package/dist-lib/lib/resolveBuffer.test.d.ts.map +1 -0
- package/dist-lib/lib/resolveBuffer.test.js +38 -0
- package/dist-lib/lib/ruleEngineImpact.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineImpact.js +11 -4
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +102 -6
- package/dist-lib/lib/ruleEngineWizard.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineWizard.js +3 -1
- package/dist-lib/lib/shippingNoteQueue.server.d.ts +18 -0
- package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/shippingNoteQueue.server.js +304 -0
- package/dist-lib/lib/stopReden.d.ts +43 -0
- package/dist-lib/lib/stopReden.d.ts.map +1 -0
- package/dist-lib/lib/stopReden.js +197 -0
- package/dist-lib/lib/taskCounts.d.ts +2 -0
- package/dist-lib/lib/taskCounts.d.ts.map +1 -0
- package/dist-lib/lib/taskCounts.js +15 -0
- package/dist-lib/lib/taskCounts.test.d.ts +2 -0
- package/dist-lib/lib/taskCounts.test.d.ts.map +1 -0
- package/dist-lib/lib/taskCounts.test.js +12 -0
- package/dist-lib/lib/trace.server.d.ts +75 -0
- package/dist-lib/lib/trace.server.d.ts.map +1 -0
- package/dist-lib/lib/trace.server.js +78 -0
- package/dist-lib/lib/vakUitleg.d.ts +19 -0
- package/dist-lib/lib/vakUitleg.d.ts.map +1 -0
- package/dist-lib/lib/vakUitleg.js +133 -0
- package/package.json +158 -131
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts +0 -2
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.d.ts.map +0 -1
- package/dist-lib/components/rule-engine/FloridayConnectionBanner.js +0 -41
- package/dist-lib/integrations/supabase/client.d.ts +0 -20293
- package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
- package/dist-lib/integrations/supabase/client.js +0 -13
|
@@ -0,0 +1,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,
|
|
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
|
-
|
|
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
|