@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 @@
|
|
|
1
|
+
{"version":3,"file":"stopReden.d.ts","sourceRoot":"","sources":["../../src/lib/stopReden.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC;CACpB;AAiBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,SAAS,CA+BZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,SAAS,CA+FZ;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAsC7F"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/stopReden.ts — waarom houdt de reis van deze order hier op?
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Eén bron van waarheid voor de tekst "Hier stopt de flow", die op het vakje in
|
|
5
|
+
// de kaart, in het zijpaneel en in de balk boven de kaart wordt getoond.
|
|
6
|
+
// Alleen lezen: hier wordt niets bepaald of gewijzigd.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
import { FLOW_NODE, flowNodeLabel } from "./flowNodes";
|
|
9
|
+
import { foutSoort, foutTekst } from "./foutTekst";
|
|
10
|
+
import { vakUitleg } from "./vakUitleg";
|
|
11
|
+
const WACHTRIJ_TEKST = {
|
|
12
|
+
pending: "de berekening staat in de wachtrij en is nog niet opgepakt",
|
|
13
|
+
queued: "de berekening staat in de wachtrij en is nog niet opgepakt",
|
|
14
|
+
running: "de berekening is op dit moment bezig",
|
|
15
|
+
blocked: "de berekening is geblokkeerd",
|
|
16
|
+
failed: "de laatste berekening is mislukt",
|
|
17
|
+
};
|
|
18
|
+
function tijdTekst(waarde) {
|
|
19
|
+
if (!waarde)
|
|
20
|
+
return null;
|
|
21
|
+
const d = new Date(waarde);
|
|
22
|
+
if (Number.isNaN(d.getTime()))
|
|
23
|
+
return null;
|
|
24
|
+
return d.toLocaleString("nl-NL", { day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit" });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Waarom de flow bij een samenkomstpunt blijft staan: de ingestelde voorwaarde
|
|
28
|
+
* is nog niet gehaald, of een verplichte tak is mislukt.
|
|
29
|
+
*/
|
|
30
|
+
export function samenkomstStop(input) {
|
|
31
|
+
const wachtOp = Array.isArray(input.wachtOp) ? input.wachtOp : [];
|
|
32
|
+
const mislukt = Array.isArray(input.mislukt) ? input.mislukt : [];
|
|
33
|
+
const feiten = [
|
|
34
|
+
`Voorwaarde: ${input.voorwaarde}`,
|
|
35
|
+
`Maximale wachttijd: ${input.maxWachtMinuten} minuten`,
|
|
36
|
+
];
|
|
37
|
+
if (wachtOp.length > 0)
|
|
38
|
+
feiten.push(`Nog niet klaar: ${wachtOp.join(", ")}`);
|
|
39
|
+
if (mislukt.length > 0) {
|
|
40
|
+
return {
|
|
41
|
+
soort: "mislukt",
|
|
42
|
+
titel: "Hier wacht de flow op een tak die is mislukt",
|
|
43
|
+
reden: `De verplichte tak ${mislukt.join(", ")} is mislukt, dus dit samenkomstpunt laat de order niet door.`,
|
|
44
|
+
feiten,
|
|
45
|
+
volgendeStap: "Oorzaak in die tak oplossen, of de voorwaarde van dit samenkomstpunt aanpassen",
|
|
46
|
+
verouderd: false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
soort: "handeling",
|
|
51
|
+
titel: "De flow wacht hier op andere takken",
|
|
52
|
+
reden: wachtOp.length > 0
|
|
53
|
+
? `Dit samenkomstpunt laat de order pas door als ${input.voorwaarde} klaar is. Nog niet klaar: ${wachtOp.join(", ")}.`
|
|
54
|
+
: `Dit samenkomstpunt laat de order pas door als ${input.voorwaarde} klaar is.`,
|
|
55
|
+
feiten,
|
|
56
|
+
volgendeStap: `Wachten tot die tak klaar is; na ${input.maxWachtMinuten} minuten gaat de flow alsnog verder`,
|
|
57
|
+
verouderd: false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Bepaalt in gewone taal waarom de blauwe route bij dit vakje ophoudt.
|
|
62
|
+
* Werkt ook als er voor dit vakje nog niets is vastgelegd.
|
|
63
|
+
*/
|
|
64
|
+
export function stopReden(input) {
|
|
65
|
+
const { nodeId, groep = null, stand = null } = input;
|
|
66
|
+
const verouderd = input.verouderd === true;
|
|
67
|
+
const uitleg = groep ? vakUitleg(groep) : null;
|
|
68
|
+
const feiten = uitleg ? [...uitleg.feiten] : [];
|
|
69
|
+
const vervolg = groep?.volgendeStap ?? stand?.nextStep ?? null;
|
|
70
|
+
const vakNaam = flowNodeLabel(nodeId);
|
|
71
|
+
const queue = (stand?.queueStatus ?? "").toLowerCase();
|
|
72
|
+
const standHier = !stand?.stuckNode || stand.stuckNode === nodeId;
|
|
73
|
+
// 1. Mislukt: er is een echte fout vastgelegd.
|
|
74
|
+
const foutmelding = groep?.status === "mislukt"
|
|
75
|
+
? foutTekst(groep.reden ?? null)
|
|
76
|
+
: standHier && stand?.stuckStatus === "mislukt"
|
|
77
|
+
? foutTekst(stand.stuckReason ?? stand.stuckError ?? stand.queueError ?? null)
|
|
78
|
+
: null;
|
|
79
|
+
if (foutmelding || queue === "failed") {
|
|
80
|
+
const soortFout = groep?.errorClass ?? foutSoort(stand?.stuckReason ?? stand?.queueError ?? null) ?? null;
|
|
81
|
+
if (soortFout)
|
|
82
|
+
feiten.push(`Foutsoort: ${soortFout}`);
|
|
83
|
+
if (stand?.tries && stand.tries > 0)
|
|
84
|
+
feiten.push(`Automatische pogingen: ${stand.tries}`);
|
|
85
|
+
const volgende = tijdTekst(stand?.nextAttemptAt);
|
|
86
|
+
if (volgende)
|
|
87
|
+
feiten.push(`Volgende poging: ${volgende}`);
|
|
88
|
+
const sinds = tijdTekst(stand?.blockedSince);
|
|
89
|
+
if (sinds)
|
|
90
|
+
feiten.push(`Geblokkeerd sinds: ${sinds}`);
|
|
91
|
+
return {
|
|
92
|
+
soort: "mislukt",
|
|
93
|
+
titel: "Hier is de order vastgelopen",
|
|
94
|
+
reden: foutmelding ??
|
|
95
|
+
foutTekst(stand?.queueError ?? null) ??
|
|
96
|
+
`De berekening van ${vakNaam} is mislukt.`,
|
|
97
|
+
feiten,
|
|
98
|
+
volgendeStap: vervolg ?? "Oorzaak oplossen en de order opnieuw aanmelden in de wachtrij",
|
|
99
|
+
verouderd,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// 2. Helemaal klaar.
|
|
103
|
+
if (nodeId === FLOW_NODE.eind) {
|
|
104
|
+
return {
|
|
105
|
+
soort: "klaar",
|
|
106
|
+
titel: "Hier eindigt de reis: de order is afgehandeld",
|
|
107
|
+
reden: uitleg?.waarom ?? "Alle karren zijn gepickt en gecontroleerd.",
|
|
108
|
+
feiten,
|
|
109
|
+
volgendeStap: null,
|
|
110
|
+
verouderd,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// 3. De berekening loopt nog of staat in de wachtrij.
|
|
114
|
+
if (queue && WACHTRIJ_TEKST[queue]) {
|
|
115
|
+
if (stand?.attempts && stand.attempts > 0)
|
|
116
|
+
feiten.push(`Pogingen: ${stand.attempts}`);
|
|
117
|
+
const volgende = tijdTekst(stand?.nextAttemptAt);
|
|
118
|
+
if (volgende)
|
|
119
|
+
feiten.push(`Volgende poging: ${volgende}`);
|
|
120
|
+
return {
|
|
121
|
+
soort: "wachtrij",
|
|
122
|
+
titel: "De flow staat hier stil: de berekening is nog niet klaar",
|
|
123
|
+
reden: `De reis houdt op bij ${vakNaam} omdat ${WACHTRIJ_TEKST[queue]}.`,
|
|
124
|
+
feiten,
|
|
125
|
+
volgendeStap: vervolg,
|
|
126
|
+
verouderd,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// 4. Wacht op een handeling (picken, printen, scannen, controle).
|
|
130
|
+
if (groep?.status === "wachtend" || groep?.status === "waarschuwing") {
|
|
131
|
+
return {
|
|
132
|
+
soort: "handeling",
|
|
133
|
+
titel: "De flow wacht hier",
|
|
134
|
+
reden: uitleg?.waarom ??
|
|
135
|
+
`${vakNaam} is nog niet afgerond; de order wacht op de volgende handeling.`,
|
|
136
|
+
feiten,
|
|
137
|
+
volgendeStap: vervolg,
|
|
138
|
+
verouderd,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// 5. Deze stap is geslaagd, maar van de vervolgstap is nog niets vastgelegd.
|
|
142
|
+
return {
|
|
143
|
+
soort: "nietvastgelegd",
|
|
144
|
+
titel: "De flow stopt hier: verder is nog niets vastgelegd",
|
|
145
|
+
reden: vervolg
|
|
146
|
+
? `${vakNaam} is afgerond, maar de volgende stap "${vervolg}" heeft voor deze order nog geen start, status of resultaat vastgelegd. Daarom kan de blauwe route nog niet aantonen dat de order daar is aangekomen.`
|
|
147
|
+
: `${vakNaam} is afgerond, maar er is voor deze order geen volgende stap of vervolgstatus vastgelegd. Daarom eindigt de aantoonbare blauwe route hier.`,
|
|
148
|
+
feiten,
|
|
149
|
+
volgendeStap: vervolg
|
|
150
|
+
? `De stap "${vervolg}" moet starten en voor deze order een status of resultaat vastleggen.`
|
|
151
|
+
: "Controleer welke vervolgstap na dit vakje hoort te starten en waarom die nog geen status heeft vastgelegd.",
|
|
152
|
+
verouderd,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Waarom is de verzendbrief bij deze order nog niet opgehaald? Zet de
|
|
157
|
+
* alleen-lezen diagnose om naar dezelfde stoptekst als de rest van de kaart.
|
|
158
|
+
*/
|
|
159
|
+
export function verzendbriefStop(d) {
|
|
160
|
+
if (!d || !d.gevonden)
|
|
161
|
+
return null;
|
|
162
|
+
const status = (d.status ?? "").toLowerCase();
|
|
163
|
+
if (status === "geprint" || status === "klaar")
|
|
164
|
+
return null;
|
|
165
|
+
const feiten = [];
|
|
166
|
+
if (d.status)
|
|
167
|
+
feiten.push(`Status: ${d.status}`);
|
|
168
|
+
feiten.push(d.isFloriday
|
|
169
|
+
? `Aanvragen naar Floriday: ${d.aanvragenVerstuurd}`
|
|
170
|
+
: "Eigen verzendbrief (geen Floriday-order)");
|
|
171
|
+
if (d.pogingen > 0)
|
|
172
|
+
feiten.push(`Pogingen: ${d.pogingen}`);
|
|
173
|
+
const laatste = tijdTekst(d.laatsteAanvraag);
|
|
174
|
+
if (laatste)
|
|
175
|
+
feiten.push(`Laatste aanvraag: ${laatste}`);
|
|
176
|
+
if (d.afleveropdracht)
|
|
177
|
+
feiten.push(`Afleveropdracht: ${d.afleveropdracht}`);
|
|
178
|
+
if (d.wachtreden)
|
|
179
|
+
feiten.push(`Wachtreden: ${d.wachtreden}`);
|
|
180
|
+
// Een Floriday-order die wacht zonder ook maar één aanvraag is een fout in de
|
|
181
|
+
// omgeving, geen normale toestand. Ook een mislukte status is een fout.
|
|
182
|
+
const fout = status === "failed" ||
|
|
183
|
+
status === "mislukt" ||
|
|
184
|
+
status === "error" ||
|
|
185
|
+
(d.isFloriday && d.aanvragenVerstuurd === 0 && d.pogingen > 0);
|
|
186
|
+
return {
|
|
187
|
+
soort: fout ? "mislukt" : "handeling",
|
|
188
|
+
titel: fout ? "Hier loopt de verzendbrief vast" : "De verzendbrief is nog niet opgehaald",
|
|
189
|
+
reden: d.reden ??
|
|
190
|
+
(d.isFloriday
|
|
191
|
+
? "Er is nog geen officiele Floriday-afleverbrief opgehaald voor deze order."
|
|
192
|
+
: "De verzendbrief voor deze order is nog niet aangemaakt."),
|
|
193
|
+
feiten,
|
|
194
|
+
volgendeStap: d.actie ?? null,
|
|
195
|
+
verouderd: false,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskCounts.d.ts","sourceRoot":"","sources":["../../src/lib/taskCounts.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUnE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Takenteller: zet de databasetelling (open/geplande taken per module) om naar een map.
|
|
2
|
+
// Fail-closed: onleesbare invoer levert een lege telling op, geen verzonnen aantallen.
|
|
3
|
+
export function tellOpenTaken(rows) {
|
|
4
|
+
const out = {};
|
|
5
|
+
if (!Array.isArray(rows))
|
|
6
|
+
return out;
|
|
7
|
+
for (const r of rows) {
|
|
8
|
+
const mod = typeof r?.owner_module === "string" ? r.owner_module : null;
|
|
9
|
+
const n = Number(r?.open_count);
|
|
10
|
+
if (!mod || !Number.isFinite(n) || n < 0)
|
|
11
|
+
continue;
|
|
12
|
+
out[mod] = (out[mod] ?? 0) + n;
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskCounts.test.d.ts","sourceRoot":"","sources":["../../src/lib/taskCounts.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { tellOpenTaken } from "./taskCounts";
|
|
3
|
+
describe("tellOpenTaken", () => {
|
|
4
|
+
it("telt per module", () => {
|
|
5
|
+
expect(tellOpenTaken([{ owner_module: "verkoop", open_count: "36" }, { owner_module: "afhandeling", open_count: 136 }]))
|
|
6
|
+
.toEqual({ verkoop: 36, afhandeling: 136 });
|
|
7
|
+
});
|
|
8
|
+
it("onleesbare invoer geeft lege telling", () => {
|
|
9
|
+
expect(tellOpenTaken(null)).toEqual({});
|
|
10
|
+
expect(tellOpenTaken([{ owner_module: "x", open_count: "abc" }, { open_count: 3 }])).toEqual({});
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
export type TraceStatus = "geslaagd" | "wachtend" | "waarschuwing" | "overgeslagen" | "mislukt";
|
|
3
|
+
/**
|
|
4
|
+
* Foutsoort — zodat het logboek onderscheid maakt tussen een storing en een
|
|
5
|
+
* bewuste regel.
|
|
6
|
+
* technisch = database/API/printer/integratie ging stuk
|
|
7
|
+
* ontbrekende_gegevens = de order of stamgegevens missen iets
|
|
8
|
+
* configuratie = een instelling of koppeling staat niet goed
|
|
9
|
+
* regel = de Engine mag bewust niet verder (business rule)
|
|
10
|
+
* extern = een extern systeem heeft (nog) niet geleverd
|
|
11
|
+
*/
|
|
12
|
+
export type TraceErrorClass = "technisch" | "ontbrekende_gegevens" | "configuratie" | "regel" | "extern";
|
|
13
|
+
/** Berekening achter een beslissing, in begrijpelijke stappen. */
|
|
14
|
+
export interface TraceCalc {
|
|
15
|
+
/** Welke instelling(en) meespeelden. */
|
|
16
|
+
setting?: string;
|
|
17
|
+
/** De gebruikte waarden, bijv. { lagen: 7, maxPerKar: 5 }. */
|
|
18
|
+
values?: Record<string, unknown>;
|
|
19
|
+
/** De rekenstap zelf, bijv. "7 / 5". */
|
|
20
|
+
formula?: string;
|
|
21
|
+
/** De uitkomst, bijv. "1 volle kar + 1 deelkar". */
|
|
22
|
+
result?: string;
|
|
23
|
+
/** Conclusie in gewone taal. */
|
|
24
|
+
conclusion?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TraceEvent {
|
|
27
|
+
traceId?: string | null;
|
|
28
|
+
orderRef?: string | null;
|
|
29
|
+
orderSource?: "floriday" | "eigen" | null;
|
|
30
|
+
cartRef?: string | null;
|
|
31
|
+
slipRef?: string | null;
|
|
32
|
+
phase: string;
|
|
33
|
+
step: string;
|
|
34
|
+
status: TraceStatus;
|
|
35
|
+
actor?: string;
|
|
36
|
+
/** Vakje in de flowkaart waar deze stap hoort (id uit flowTree). */
|
|
37
|
+
nodeId?: string;
|
|
38
|
+
input?: unknown;
|
|
39
|
+
output?: unknown;
|
|
40
|
+
reads?: unknown;
|
|
41
|
+
decision?: string;
|
|
42
|
+
reason?: string;
|
|
43
|
+
values?: unknown;
|
|
44
|
+
rule?: string;
|
|
45
|
+
/** Berekening achter de beslissing. */
|
|
46
|
+
calc?: TraceCalc;
|
|
47
|
+
/** Wat de order hierna gaat doen. */
|
|
48
|
+
nextStep?: string;
|
|
49
|
+
errorClass?: TraceErrorClass;
|
|
50
|
+
dbTable?: string;
|
|
51
|
+
dbRecord?: string;
|
|
52
|
+
dbAction?: string;
|
|
53
|
+
dbOld?: unknown;
|
|
54
|
+
dbNew?: unknown;
|
|
55
|
+
externalSystem?: string;
|
|
56
|
+
externalAction?: string;
|
|
57
|
+
externalRef?: string;
|
|
58
|
+
externalStatus?: string;
|
|
59
|
+
externalResponse?: unknown;
|
|
60
|
+
error?: string;
|
|
61
|
+
attempts?: number;
|
|
62
|
+
nextAttemptAt?: string | null;
|
|
63
|
+
durationMs?: number;
|
|
64
|
+
}
|
|
65
|
+
/** Bepaalt de foutsoort uit een reden-code of foutmelding. */
|
|
66
|
+
export declare function classifyError(reasonCode?: string | null, message?: string | null): TraceErrorClass;
|
|
67
|
+
/** Nieuw trace-id voor één volledige verwerkingsronde van een order. */
|
|
68
|
+
export declare function newTraceId(): string;
|
|
69
|
+
/** Eén gebeurtenis vastleggen. Faalt nooit hard. */
|
|
70
|
+
export declare function trace(sb: SupabaseClient, event: TraceEvent): Promise<void>;
|
|
71
|
+
/** Meerdere gebeurtenissen in één keer vastleggen. */
|
|
72
|
+
export declare function traceBatch(sb: SupabaseClient, events: TraceEvent[]): Promise<void>;
|
|
73
|
+
/** Meet de duur van een stap en legt uitkomst of fout vast. */
|
|
74
|
+
export declare function traced<T>(sb: SupabaseClient, event: Omit<TraceEvent, "status">, run: () => Promise<T>): Promise<T>;
|
|
75
|
+
//# sourceMappingURL=trace.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.server.d.ts","sourceRoot":"","sources":["../../src/lib/trace.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/trace.server.ts — audittrail vanuit de Engine zelf
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Elke stap, beslissing, databasewijziging en externe aanvraag wordt hier
|
|
5
|
+
// vastgelegd via public.logistics_trace. Loggen mag de verwerking nooit
|
|
6
|
+
// blokkeren: fouten worden bewust ingeslikt.
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/** Bepaalt de foutsoort uit een reden-code of foutmelding. */
|
|
9
|
+
export function classifyError(reasonCode, message) {
|
|
10
|
+
const t = `${reasonCode ?? ""} ${message ?? ""}`.toLowerCase();
|
|
11
|
+
// Een volle planronde of een tijdslimiet bij het opslaan is druk, geen stukloop.
|
|
12
|
+
if (/deadline|statement timeout|deadlock/.test(t))
|
|
13
|
+
return "regel";
|
|
14
|
+
if (/afmeting|ontbreek|onbekend|geen regels|mist|niet gevuld|leeg/.test(t))
|
|
15
|
+
return "ontbrekende_gegevens";
|
|
16
|
+
if (/instelling|configurat|layout|mapping|niet ingesteld|werktijden/.test(t))
|
|
17
|
+
return "configuratie";
|
|
18
|
+
if (/kargrens|regel|niet toegestaan|geblokkeerd|vrijgave|aanmeldmoment|bevroren/.test(t))
|
|
19
|
+
return "regel";
|
|
20
|
+
if (/floriday|api|http|timeout|extern|printer/.test(t))
|
|
21
|
+
return "extern";
|
|
22
|
+
return "technisch";
|
|
23
|
+
}
|
|
24
|
+
/** Nieuw trace-id voor één volledige verwerkingsronde van een order. */
|
|
25
|
+
export function newTraceId() {
|
|
26
|
+
return globalThis.crypto?.randomUUID?.() ?? "";
|
|
27
|
+
}
|
|
28
|
+
function clean(event) {
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const [key, value] of Object.entries(event)) {
|
|
31
|
+
if (value !== undefined && value !== null && value !== "")
|
|
32
|
+
out[key] = value;
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
/** Eén gebeurtenis vastleggen. Faalt nooit hard. */
|
|
37
|
+
export async function trace(sb, event) {
|
|
38
|
+
try {
|
|
39
|
+
await sb.rpc("logistics_trace", { p: clean(event) });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* loggen mag de verwerking niet blokkeren */
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Meerdere gebeurtenissen in één keer vastleggen. */
|
|
46
|
+
export async function traceBatch(sb, events) {
|
|
47
|
+
if (!Array.isArray(events) || events.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
try {
|
|
50
|
+
await sb.rpc("logistics_trace_batch", { p: events.map(clean) });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* loggen mag de verwerking niet blokkeren */
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Meet de duur van een stap en legt uitkomst of fout vast. */
|
|
57
|
+
export async function traced(sb, event, run) {
|
|
58
|
+
const start = Date.now();
|
|
59
|
+
try {
|
|
60
|
+
const result = await run();
|
|
61
|
+
await trace(sb, {
|
|
62
|
+
...event,
|
|
63
|
+
status: "geslaagd",
|
|
64
|
+
durationMs: Date.now() - start,
|
|
65
|
+
output: event.output ?? result,
|
|
66
|
+
});
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
await trace(sb, {
|
|
71
|
+
...event,
|
|
72
|
+
status: "mislukt",
|
|
73
|
+
durationMs: Date.now() - start,
|
|
74
|
+
error: String(e?.message ?? e),
|
|
75
|
+
});
|
|
76
|
+
throw e;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type NodeTraceGroep } from "./nodeTrace";
|
|
2
|
+
export interface VakUitleg {
|
|
3
|
+
/** Welke keuze de Engine hier maakte. */
|
|
4
|
+
beslissing: string;
|
|
5
|
+
/** Waarom die keuze is gemaakt. */
|
|
6
|
+
waarom: string | null;
|
|
7
|
+
/** De bepalende gegevens en instellingen, als korte paren. */
|
|
8
|
+
feiten: string[];
|
|
9
|
+
/** Regel/instelling waarop de keuze steunt. */
|
|
10
|
+
regel: string | null;
|
|
11
|
+
/** Is dit afgeleid uit de registraties in plaats van vastgelegd? */
|
|
12
|
+
afgeleid: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Maakt van de gebeurtenissen van één vakje een vaste uitleg:
|
|
16
|
+
* welke keuze is gemaakt, waarom, en welke gegevens dat bepaalden.
|
|
17
|
+
*/
|
|
18
|
+
export declare function vakUitleg(groep: NodeTraceGroep): VakUitleg;
|
|
19
|
+
//# sourceMappingURL=vakUitleg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vakUitleg.d.ts","sourceRoot":"","sources":["../../src/lib/vakUitleg.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;CACnB;AA6DD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAoD1D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/vakUitleg.ts — wat is er in dit vakje besloten, en waarom
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Eén bron van uitleg voor zowel het vakje op de flowkaart als het zijpaneel.
|
|
5
|
+
// Alleen lezen: hier wordt niets bepaald, alleen leesbaar gemaakt.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { FLOW_NODE } from "./flowNodes";
|
|
8
|
+
import { foutTekst } from "./foutTekst";
|
|
9
|
+
import { isAutomatisch } from "./nodeTrace";
|
|
10
|
+
const LABELS = {
|
|
11
|
+
aanmeldmoment: "Aanmeldmoment",
|
|
12
|
+
nu: "Huidige tijd",
|
|
13
|
+
huidigeTijd: "Huidige tijd",
|
|
14
|
+
lagen: "Lagen",
|
|
15
|
+
maxPerKar: "Max. per kar",
|
|
16
|
+
karren: "Karren",
|
|
17
|
+
methode: "Methode",
|
|
18
|
+
deelkar: "Deelkar",
|
|
19
|
+
pickdatum: "Pickdatum",
|
|
20
|
+
pogingen: "Pogingen",
|
|
21
|
+
buffer: "Buffer",
|
|
22
|
+
klant: "Klant",
|
|
23
|
+
};
|
|
24
|
+
function labelVan(sleutel) {
|
|
25
|
+
if (LABELS[sleutel])
|
|
26
|
+
return LABELS[sleutel];
|
|
27
|
+
const met = sleutel.replace(/[_-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2");
|
|
28
|
+
return met.charAt(0).toUpperCase() + met.slice(1);
|
|
29
|
+
}
|
|
30
|
+
function waardeVan(v) {
|
|
31
|
+
if (v === null || v === undefined || v === "")
|
|
32
|
+
return null;
|
|
33
|
+
if (typeof v === "boolean")
|
|
34
|
+
return v ? "ja" : "nee";
|
|
35
|
+
if (typeof v === "number")
|
|
36
|
+
return String(v);
|
|
37
|
+
if (typeof v === "string")
|
|
38
|
+
return v.length > 60 ? `${v.slice(0, 57)}…` : v;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function paren(bron, uit, gezien) {
|
|
42
|
+
if (!bron || typeof bron !== "object" || Array.isArray(bron))
|
|
43
|
+
return;
|
|
44
|
+
for (const [sleutel, waarde] of Object.entries(bron)) {
|
|
45
|
+
const tekst = waardeVan(waarde);
|
|
46
|
+
if (!tekst)
|
|
47
|
+
continue;
|
|
48
|
+
const label = labelVan(sleutel);
|
|
49
|
+
if (gezien.has(label))
|
|
50
|
+
continue;
|
|
51
|
+
gezien.add(label);
|
|
52
|
+
uit.push(`${label}: ${tekst}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Leesbare zin wanneer de Engine (nog) geen besluit vastlegde. */
|
|
56
|
+
function afgeleideBeslissing(groep, laatste) {
|
|
57
|
+
const tabel = (laatste?.dbTable ?? "").toLowerCase();
|
|
58
|
+
const actie = (laatste?.dbAction ?? "").toUpperCase();
|
|
59
|
+
if (tabel === "logistics_plan_queue") {
|
|
60
|
+
if (actie === "INSERT")
|
|
61
|
+
return "Order aangemeld voor indeling";
|
|
62
|
+
if (groep.status === "mislukt")
|
|
63
|
+
return "Indeling mislukt";
|
|
64
|
+
if (groep.status === "wachtend")
|
|
65
|
+
return "Wacht op de planronde";
|
|
66
|
+
return "Indeling bijgewerkt";
|
|
67
|
+
}
|
|
68
|
+
if (groep.nodeId === FLOW_NODE.eind)
|
|
69
|
+
return "Order afgehandeld";
|
|
70
|
+
if (groep.status === "mislukt")
|
|
71
|
+
return "Hier is de order vastgelopen";
|
|
72
|
+
if (groep.status === "wachtend")
|
|
73
|
+
return "Order wacht in deze stap";
|
|
74
|
+
if (groep.status === "overgeslagen")
|
|
75
|
+
return "Deze stap is overgeslagen";
|
|
76
|
+
return "Deze stap is doorlopen";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Maakt van de gebeurtenissen van één vakje een vaste uitleg:
|
|
80
|
+
* welke keuze is gemaakt, waarom, en welke gegevens dat bepaalden.
|
|
81
|
+
*/
|
|
82
|
+
export function vakUitleg(groep) {
|
|
83
|
+
const events = Array.isArray(groep.events) ? groep.events : [];
|
|
84
|
+
const engine = events.filter((e) => !isAutomatisch(e));
|
|
85
|
+
const relevant = engine.length > 0 ? engine : events;
|
|
86
|
+
const laatste = relevant[relevant.length - 1] ?? null;
|
|
87
|
+
const laatsteMet = (kies) => {
|
|
88
|
+
for (let i = relevant.length - 1; i >= 0; i--) {
|
|
89
|
+
const ev = relevant[i];
|
|
90
|
+
if (!ev)
|
|
91
|
+
continue;
|
|
92
|
+
const v = kies(ev);
|
|
93
|
+
if (v !== null && v !== undefined && v !== "")
|
|
94
|
+
return v;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
};
|
|
98
|
+
const besluit = laatsteMet((e) => e.decision);
|
|
99
|
+
const fout = [...relevant].reverse().find((e) => e.status === "mislukt") ?? null;
|
|
100
|
+
const reden = foutTekst(laatsteMet((e) => e.reason) ?? fout?.error ?? groep.reden ?? null);
|
|
101
|
+
const regel = laatsteMet((e) => e.rule);
|
|
102
|
+
const calc = laatsteMet((e) => (e.calc && typeof e.calc === "object" ? e.calc : null));
|
|
103
|
+
const feiten = [];
|
|
104
|
+
const gezien = new Set();
|
|
105
|
+
if (calc) {
|
|
106
|
+
paren(calc["values"], feiten, gezien);
|
|
107
|
+
const rekenstap = waardeVan(calc["formula"]);
|
|
108
|
+
if (rekenstap && !gezien.has("Rekenstap")) {
|
|
109
|
+
gezien.add("Rekenstap");
|
|
110
|
+
feiten.push(`Rekenstap: ${rekenstap}`);
|
|
111
|
+
}
|
|
112
|
+
const uitkomst = waardeVan(calc["result"]);
|
|
113
|
+
if (uitkomst && !gezien.has("Uitkomst")) {
|
|
114
|
+
gezien.add("Uitkomst");
|
|
115
|
+
feiten.push(`Uitkomst: ${uitkomst}`);
|
|
116
|
+
}
|
|
117
|
+
const instelling = waardeVan(calc["setting"]);
|
|
118
|
+
if (instelling && !gezien.has("Instelling")) {
|
|
119
|
+
gezien.add("Instelling");
|
|
120
|
+
feiten.push(`Instelling: ${instelling}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
paren(laatsteMet((e) => e.values), feiten, gezien);
|
|
124
|
+
if (groep.pogingen > 1)
|
|
125
|
+
feiten.push(`Pogingen: ${groep.pogingen}`);
|
|
126
|
+
return {
|
|
127
|
+
beslissing: besluit ?? afgeleideBeslissing(groep, laatste),
|
|
128
|
+
waarom: reden,
|
|
129
|
+
feiten,
|
|
130
|
+
regel: regel ?? null,
|
|
131
|
+
afgeleid: !besluit,
|
|
132
|
+
};
|
|
133
|
+
}
|