@flowselections/logistiek-engine 1.0.239 → 1.0.241
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/db/schema/logistiek-engine.sql +2097 -0
- package/dist-lib/components/GeblokkeerdeOrdersCard.d.ts.map +1 -1
- package/dist-lib/components/GeblokkeerdeOrdersCard.js +2 -2
- package/dist-lib/components/KarplanStatusCard.d.ts.map +1 -1
- package/dist-lib/components/KarplanStatusCard.js +7 -2
- package/dist-lib/components/StandaardgegevensCard.d.ts.map +1 -1
- package/dist-lib/components/StandaardgegevensCard.js +67 -4
- package/dist-lib/components/TaakGezondheidCard.d.ts.map +1 -1
- package/dist-lib/components/TaakGezondheidCard.js +5 -3
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts +2 -0
- package/dist-lib/hooks/useGeblokkeerdeOrders.d.ts.map +1 -1
- package/dist-lib/hooks/useGeblokkeerdeOrders.js +13 -0
- package/dist-lib/integrations/supabase/types.d.ts +750 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/engineStatusTeksten.d.ts +7 -0
- package/dist-lib/lib/engineStatusTeksten.d.ts.map +1 -0
- package/dist-lib/lib/engineStatusTeksten.js +22 -0
- package/dist-lib/lib/flowTree.js +3 -3
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +44 -0
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/dist-lib/lib/ophaalmomentTeksten.d.ts +9 -0
- package/dist-lib/lib/ophaalmomentTeksten.d.ts.map +1 -0
- package/dist-lib/lib/ophaalmomentTeksten.js +29 -0
- package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
- package/dist-lib/lib/ruleEngineSchema.js +27 -2
- package/dist-lib/lib/taakTeLaat.d.ts +7 -0
- package/dist-lib/lib/taakTeLaat.d.ts.map +1 -0
- package/dist-lib/lib/taakTeLaat.js +62 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Schemaversie die deze moduleversie verwacht (gelijk aan logistics_schema_versie()). */
|
|
2
|
+
export declare const VERWACHTE_SCHEMA_VERSIE = "2026-11-10c";
|
|
3
|
+
/** True als de database ouder is dan de module (geen of oudere versiemarkering). */
|
|
4
|
+
export declare function schemaVersieOud(versie: string | null | undefined): boolean;
|
|
5
|
+
/** "X leeg (Pickmodule)" -> "X ontbreken: de Pickschermen-module moet worden bijgewerkt." */
|
|
6
|
+
export declare function meldingGewoneTaal(m: string): string;
|
|
7
|
+
//# sourceMappingURL=engineStatusTeksten.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineStatusTeksten.d.ts","sourceRoot":"","sources":["../../src/lib/engineStatusTeksten.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AAErD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG1E;AAQD,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Teksten voor de Engine-status in gewone taal.
|
|
2
|
+
/** Schemaversie die deze moduleversie verwacht (gelijk aan logistics_schema_versie()). */
|
|
3
|
+
export const VERWACHTE_SCHEMA_VERSIE = "2026-11-10c";
|
|
4
|
+
/** True als de database ouder is dan de module (geen of oudere versiemarkering). */
|
|
5
|
+
export function schemaVersieOud(versie) {
|
|
6
|
+
if (!versie)
|
|
7
|
+
return true;
|
|
8
|
+
return versie < VERWACHTE_SCHEMA_VERSIE;
|
|
9
|
+
}
|
|
10
|
+
const MODULE_NAAM = {
|
|
11
|
+
Pickmodule: "Pickschermen-module",
|
|
12
|
+
Verkoop: "Verkoop-module",
|
|
13
|
+
Voorraad: "Voorraad-module",
|
|
14
|
+
};
|
|
15
|
+
/** "X leeg (Pickmodule)" -> "X ontbreken: de Pickschermen-module moet worden bijgewerkt." */
|
|
16
|
+
export function meldingGewoneTaal(m) {
|
|
17
|
+
const r = /^(.*?)\s+leeg\s+\(([^)]+)\)\s*$/.exec(String(m ?? ""));
|
|
18
|
+
if (!r)
|
|
19
|
+
return m;
|
|
20
|
+
const module = MODULE_NAAM[r[2]] ?? `${r[2]}-module`;
|
|
21
|
+
return `${r[1]} ontbreken: de ${module} moet worden bijgewerkt.`;
|
|
22
|
+
}
|
package/dist-lib/lib/flowTree.js
CHANGED
|
@@ -204,20 +204,20 @@ export function buildFlowTree(settings, overrides) {
|
|
|
204
204
|
}
|
|
205
205
|
// ── Floriday: bestelregels eerst samenvoegen tot één bestelling ────────────
|
|
206
206
|
const ovFields = (veilig["order_verwerking"]?.fields ?? {});
|
|
207
|
-
const samenvoegenAan = ovFields["floriday_merge_lines"]
|
|
207
|
+
const samenvoegenAan = ovFields["floriday_merge_lines"] === true;
|
|
208
208
|
add({
|
|
209
209
|
id: "stap:bestelregels_samenvoegen",
|
|
210
210
|
kind: "step",
|
|
211
211
|
label: "Bestelregels samenvoegen",
|
|
212
212
|
sublabel: samenvoegenAan
|
|
213
|
-
? "aan —
|
|
213
|
+
? "aan — orders van dezelfde klant, leverdag, afleverlocatie en ophaalmoment worden samen gepickt"
|
|
214
214
|
: "uit — elke Floriday-regel blijft een eigen order",
|
|
215
215
|
state: samenvoegenAan ? "active" : "disabled",
|
|
216
216
|
storeId: "order_verwerking",
|
|
217
217
|
fieldKeys: ["floriday_merge_lines"],
|
|
218
218
|
lines: [
|
|
219
219
|
samenvoegenAan
|
|
220
|
-
? "Samenvoegen: aan (zelfde klant,
|
|
220
|
+
? "Samenvoegen: aan (zelfde klant, leverdag, afleverlocatie en ophaalmoment)"
|
|
221
221
|
: "Samenvoegen: uit",
|
|
222
222
|
"Laagste FO-nummer blijft het ordernummer",
|
|
223
223
|
"Al ingedeelde, geprinte of gecontroleerde orders blijven ongewijzigd",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAsgND,eAAO,MAAM,cAAc,EAAE,YAAY,EAUL,CAAC;AAErC,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,oBAAoB,GAC7B,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE9D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,MAAM,CAiB9C;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,EAC1B,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAIR"}
|
|
@@ -2662,6 +2662,50 @@ afh_signup_groups, afh_signup_engine_moments en elke eigen telling van karren.
|
|
|
2662
2662
|
|
|
2663
2663
|
CONTROLELIJST
|
|
2664
2664
|
[ ] Een gearchiveerde kar telt niet mee in het aantal karren van de aanmeldmail.
|
|
2665
|
+
[ ] Meld terug met je pakketversie.`,
|
|
2666
|
+
},
|
|
2667
|
+
{
|
|
2668
|
+
number: 33,
|
|
2669
|
+
title: "Aanmeldmoment ook voor orders zonder kar, uit het ophaalmoment van de order",
|
|
2670
|
+
date: "2026-11-10",
|
|
2671
|
+
summary: "afh_signup_moment_for_orders geeft ook een tijdstip voor wachtende orders en volgt het ophaalmoment dat de Engine op de order zet.",
|
|
2672
|
+
body: `AANVULLING (eerdere prompts blijven geldig).
|
|
2673
|
+
|
|
2674
|
+
WAT ER NU GEBEURT
|
|
2675
|
+
- afh_signup_moment_for_orders zoekt een order alleen in groups[].orders van
|
|
2676
|
+
afh_signup_groups. Een order zonder kar staat in groups[].pending_orders
|
|
2677
|
+
(afh_signup_groups_wacht). Daardoor krijgt elke nog niet ingedeelde order
|
|
2678
|
+
bron 'onbekend', en de Engine toont "Tijdstip van de transportaanmelding is
|
|
2679
|
+
nog niet bekend". In dev nagespeeld: de order stond in pending_orders van de
|
|
2680
|
+
juiste groep (zelfde vervoerder, 09:30 ophalen, 08:00 aanmelden).
|
|
2681
|
+
- Afhandeling kiest het moment nu zelf uit carriers.pickup_moments (eerste
|
|
2682
|
+
aanmelddeadline na created_at). Het ophaalmoment dat de Engine op de order
|
|
2683
|
+
zet, wordt niet gelezen.
|
|
2684
|
+
|
|
2685
|
+
WAT DE ENGINE NU OP ELKE OPEN ORDER ZET (vanaf schema 2026-11-10c)
|
|
2686
|
+
- custom_fields.pickup_moment = "YYYY-MM-DD|HH:MM" (ophaaldag en -tijd)
|
|
2687
|
+
- custom_fields.pickup_moment_key = "pd@HH:MM|sd@HH:MM" (zelfde vorm als jouw
|
|
2688
|
+
pickup_moment_key: ophaaldagen@tijd | aanmelddagen@tijd)
|
|
2689
|
+
- custom_fields.pickup_moment_bron = "auto" (Engine) of afwezig (handmatig/Verkoop)
|
|
2690
|
+
- custom_fields.pickup_moment_reden = tekst als er geen moment is
|
|
2691
|
+
Welke tijd het wordt, staat in de werkwijze ("Ophaalmoment voor orders").
|
|
2692
|
+
|
|
2693
|
+
BOUW
|
|
2694
|
+
1. afh_signup_moment_for_orders: zoek de order ook in groups[].pending_orders.
|
|
2695
|
+
Staat hij daar, geef dan bron 'gepland' en aanmeld_at = signup_deadline van
|
|
2696
|
+
die groep min lead_minutes (dezelfde berekening als voor groups[].orders).
|
|
2697
|
+
2. afh_signup_groups_base: heeft de order een custom_fields.pickup_moment_key
|
|
2698
|
+
die voorkomt in carriers.pickup_moments van zijn vervoerder, kies dan dat
|
|
2699
|
+
moment in plaats van de eigen keuze op created_at. Ontbreekt de sleutel of
|
|
2700
|
+
past hij niet, houd je huidige keuze.
|
|
2701
|
+
3. Een kar (order_carts.pickup_moment_key) blijft voorgaan, zoals nu.
|
|
2702
|
+
4. Niets anders wijzigen; geen eigen standaardtijden.
|
|
2703
|
+
|
|
2704
|
+
CONTROLELIJST
|
|
2705
|
+
[ ] Nieuwe order met vervoerder, nog zonder kar: logistics_aanmeldmoment geeft
|
|
2706
|
+
een tijd in plaats van "nog niet bekend".
|
|
2707
|
+
[ ] Order met pickup_moment_key "0@19:30|0@18:00": groep 19:30, aanmelden 18:00.
|
|
2708
|
+
[ ] Order met kar: ongewijzigd.
|
|
2665
2709
|
[ ] Meld terug met je pakketversie.`,
|
|
2666
2710
|
},
|
|
2667
2711
|
],
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.241";
|
|
2
2
|
//# sourceMappingURL=moduleVersion.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatisch gegenereerd door prebuild:lib; niet handmatig aanpassen.
|
|
2
|
-
export const MODULE_VERSION = "1.0.
|
|
2
|
+
export const MODULE_VERSION = "1.0.241";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type OphaalmomentInfo = {
|
|
2
|
+
zonderMoment?: number;
|
|
3
|
+
redenen?: Record<string, number>;
|
|
4
|
+
momentenTot?: string | null;
|
|
5
|
+
momentenTeKort?: boolean;
|
|
6
|
+
ongekoppeld?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function ophaalmomentMeldingen(info: OphaalmomentInfo, datum: (d: string) => string): string[];
|
|
9
|
+
//# sourceMappingURL=ophaalmomentTeksten.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ophaalmomentTeksten.d.ts","sourceRoot":"","sources":["../../src/lib/ophaalmomentTeksten.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAWF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,EAAE,CAuBpG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Meldingen in gewone taal voor de ophaalmomentstatus in Engine-status (alleen beheer).
|
|
2
|
+
const REDEN_TEKST = {
|
|
3
|
+
geen_vervoerder: "geen vervoerder",
|
|
4
|
+
geen_moment_op_dag: "vervoerder heeft geen ophaalmoment op die dag",
|
|
5
|
+
geen_moment_voor_levertijd: "geen ophaalmoment ruim vóór de levertijd van de klant",
|
|
6
|
+
geen_tijdzone: "tijdzone van de vestiging ontbreekt",
|
|
7
|
+
geen_leverdag: "geen leverdag",
|
|
8
|
+
nog_niet_gevuld: "wordt bij de volgende wijziging ingevuld",
|
|
9
|
+
};
|
|
10
|
+
export function ophaalmomentMeldingen(info, datum) {
|
|
11
|
+
const uit = [];
|
|
12
|
+
const zonder = Number(info.zonderMoment ?? 0);
|
|
13
|
+
if (zonder > 0) {
|
|
14
|
+
const redenen = Object.entries(info.redenen ?? {})
|
|
15
|
+
.filter(([, n]) => Number(n) > 0)
|
|
16
|
+
.map(([code, n]) => `${n}× ${REDEN_TEKST[code] ?? code}`);
|
|
17
|
+
uit.push(`${zonder} orders van de komende dagen hebben nog geen ophaalmoment${redenen.length ? ` (${redenen.join(", ")})` : ""}.`);
|
|
18
|
+
}
|
|
19
|
+
if (info.momentenTeKort) {
|
|
20
|
+
uit.push(info.momentenTot
|
|
21
|
+
? `De ophaalmomenten zijn maar tot ${datum(info.momentenTot)} bekend; de nachtelijke verversing draait niet.`
|
|
22
|
+
: "Er zijn nog geen ophaalmomenten bekend; de nachtelijke verversing draait niet.");
|
|
23
|
+
}
|
|
24
|
+
const ongekoppeld = Number(info.ongekoppeld ?? 0);
|
|
25
|
+
if (ongekoppeld > 0) {
|
|
26
|
+
uit.push(`${ongekoppeld} ophaalmomenten horen bij een vervoerder die niet meer te herkennen is.`);
|
|
27
|
+
}
|
|
28
|
+
return uit;
|
|
29
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,UAAU,GACV,MAAM,GACN,UAAU,GACV,OAAO,GACP,MAAM,GACN,QAAQ,GACR,aAAa,GACb,SAAS,GACT,SAAS,GACT,UAAU,CAAC;AAMf,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,wGAAwG;IACxG,SAAS,CAAC,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;CAC/C;AAGD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAID,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAQzC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,WAAW,EAK5C,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAI9D,eAAO,MAAM,UAAU,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,8 +39,33 @@ export const RULE_STEPS = [
|
|
|
39
39
|
key: "floriday_merge_lines",
|
|
40
40
|
label: "Floriday-bestelregels samenvoegen tot \u00e9\u00e9n bestelling",
|
|
41
41
|
type: "toggle",
|
|
42
|
-
default:
|
|
43
|
-
description: "
|
|
42
|
+
default: false,
|
|
43
|
+
description: "Orders van dezelfde klant en leverdag die volgens de orderbuffer in dezelfde groep vallen, worden samen gepickt. Staat de orderbuffer uit, dan wordt er niets gecombineerd.",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: "pickup_moment_rule",
|
|
47
|
+
label: "Ophaalmoment voor orders",
|
|
48
|
+
type: "select",
|
|
49
|
+
default: "eerste",
|
|
50
|
+
options: [
|
|
51
|
+
{ value: "eerste", label: "Het eerste ophaalmoment van de leverdag" },
|
|
52
|
+
{
|
|
53
|
+
value: "laatste_voor_levertijd",
|
|
54
|
+
label: "Het laatste ophaalmoment dat ruim vóór de levertijd van de klant valt (zonder levertijd: het eerste)",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
description: "Elke open order met een vervoerder krijgt automatisch een ophaalmoment uit de ophaalmomenten van die vervoerder. Een handmatig gekozen moment blijft altijd staan.",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: "pickup_moment_marge_uren",
|
|
61
|
+
label: "Minimaal ... uur vóór de levertijd",
|
|
62
|
+
type: "number",
|
|
63
|
+
unit: "uur",
|
|
64
|
+
min: 0,
|
|
65
|
+
max: 48,
|
|
66
|
+
default: 2,
|
|
67
|
+
description: "Hoeveel uur het ophaalmoment minstens vóór de levertijd van de klant moet liggen.",
|
|
68
|
+
dependsOn: { key: "pickup_moment_rule", in: ["laatste_voor_levertijd"] },
|
|
44
69
|
},
|
|
45
70
|
],
|
|
46
71
|
},
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Interval in minuten voor gangbare cronschema's; null als onbekend. */
|
|
2
|
+
export declare function intervalMinuten(schema: string): number | null;
|
|
3
|
+
/** True als de taak langer dan 2x zijn interval niet draaide. */
|
|
4
|
+
export declare function taakTeLaat(laatsteStart: string | null, schema: string, nu?: number): boolean;
|
|
5
|
+
/** Foutmelding van een taak in gewone taal. */
|
|
6
|
+
export declare function taakFoutGewoneTaal(bericht: string | null): string | null;
|
|
7
|
+
//# sourceMappingURL=taakTeLaat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taakTeLaat.d.ts","sourceRoot":"","sources":["../../src/lib/taakTeLaat.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB7D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,OAAO,CAOxG;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAcxE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Bewaking geplande taken: interval uit het cronschema en "te laat" (> 2x interval).
|
|
2
|
+
/** Interval in minuten voor gangbare cronschema's; null als onbekend. */
|
|
3
|
+
export function intervalMinuten(schema) {
|
|
4
|
+
const s = String(schema ?? "").trim();
|
|
5
|
+
const sec = /^(\d+)\s*seconds?$/i.exec(s);
|
|
6
|
+
if (sec)
|
|
7
|
+
return Math.max(1, Number(sec[1]) / 60);
|
|
8
|
+
const d = s.split(/\s+/);
|
|
9
|
+
if (d.length !== 5)
|
|
10
|
+
return null;
|
|
11
|
+
const [min, uur, dag, maand, wd] = d;
|
|
12
|
+
const rest = dag === "*" && maand === "*" && wd === "*";
|
|
13
|
+
if (!rest)
|
|
14
|
+
return null;
|
|
15
|
+
if (uur === "*") {
|
|
16
|
+
if (min === "*")
|
|
17
|
+
return 1;
|
|
18
|
+
const m = /^\*\/(\d+)$/.exec(min);
|
|
19
|
+
if (m)
|
|
20
|
+
return Number(m[1]);
|
|
21
|
+
if (/^\d+(,\d+)+$/.test(min))
|
|
22
|
+
return Math.ceil(60 / min.split(",").length);
|
|
23
|
+
if (/^\d+$/.test(min))
|
|
24
|
+
return 60;
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const u = /^\*\/(\d+)$/.exec(uur);
|
|
28
|
+
if (u && /^\d+$/.test(min))
|
|
29
|
+
return Number(u[1]) * 60;
|
|
30
|
+
if (/^\d+$/.test(uur) && /^\d+$/.test(min))
|
|
31
|
+
return 24 * 60;
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/** True als de taak langer dan 2x zijn interval niet draaide. */
|
|
35
|
+
export function taakTeLaat(laatsteStart, schema, nu = Date.now()) {
|
|
36
|
+
const iv = intervalMinuten(schema);
|
|
37
|
+
if (iv == null)
|
|
38
|
+
return false;
|
|
39
|
+
if (!laatsteStart)
|
|
40
|
+
return true;
|
|
41
|
+
const t = new Date(laatsteStart).getTime();
|
|
42
|
+
if (!Number.isFinite(t))
|
|
43
|
+
return false;
|
|
44
|
+
return nu - t > 2 * iv * 60000;
|
|
45
|
+
}
|
|
46
|
+
/** Foutmelding van een taak in gewone taal. */
|
|
47
|
+
export function taakFoutGewoneTaal(bericht) {
|
|
48
|
+
if (!bericht)
|
|
49
|
+
return null;
|
|
50
|
+
const b = bericht.toLowerCase();
|
|
51
|
+
if (b.includes("timeout") || b.includes("time-out") || b.includes("statement timeout") || b.includes("canceling statement"))
|
|
52
|
+
return "De taak duurde te lang en is afgebroken. De volgende keer probeert hij het opnieuw.";
|
|
53
|
+
if (b.includes("does not exist") || b.includes("bestaat niet"))
|
|
54
|
+
return "De taak gebruikt een onderdeel dat in deze database ontbreekt. Supabase bijwerken nodig.";
|
|
55
|
+
if (b.includes("permission denied") || b.includes("niet ingelogd") || b.includes("geen toegang"))
|
|
56
|
+
return "De taak had geen toestemming om zijn werk te doen. Neem contact op met de beheerder.";
|
|
57
|
+
if (b.includes("lock") || b.includes("deadlock"))
|
|
58
|
+
return "De taak moest wachten op ander werk en is gestopt. De volgende keer probeert hij het opnieuw.";
|
|
59
|
+
if (b.includes("connection") || b.includes("could not connect"))
|
|
60
|
+
return "De taak kon de shell niet bereiken. De volgende keer probeert hij het opnieuw.";
|
|
61
|
+
return "De taak is mislukt. Neem contact op met de beheerder als dit blijft gebeuren.";
|
|
62
|
+
}
|