@flowselections/logistiek-engine 1.0.177 → 1.0.181

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/db/schema/logistiek-engine.sql +850 -0
  2. package/dist-lib/components/BeladingIndelingCard.d.ts.map +1 -1
  3. package/dist-lib/components/BeladingIndelingCard.js +2 -0
  4. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts +11 -5
  5. package/dist-lib/integrations/supabase/previewAuthStorage.d.ts.map +1 -1
  6. package/dist-lib/integrations/supabase/previewAuthStorage.js +38 -21
  7. package/dist-lib/integrations/supabase/types.d.ts +137 -0
  8. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  9. package/dist-lib/lib/beladingRegels.d.ts +78 -0
  10. package/dist-lib/lib/beladingRegels.d.ts.map +1 -0
  11. package/dist-lib/lib/beladingRegels.js +143 -0
  12. package/dist-lib/lib/bulkLoadCarrierPlanning.server.js +2 -2
  13. package/dist-lib/lib/eigenTraysticker.d.ts +17 -0
  14. package/dist-lib/lib/eigenTraysticker.d.ts.map +1 -0
  15. package/dist-lib/lib/eigenTraysticker.js +32 -0
  16. package/dist-lib/lib/loadCarrierPlanning.server.d.ts +35 -3
  17. package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
  18. package/dist-lib/lib/loadCarrierPlanning.server.js +251 -89
  19. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  20. package/dist-lib/lib/modulePrompts.js +76 -0
  21. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  22. package/dist-lib/lib/moduleVersion.js +1 -1
  23. package/dist-lib/lib/planQueue.server.d.ts.map +1 -1
  24. package/dist-lib/lib/planQueue.server.js +26 -2
  25. package/dist-lib/lib/stickerQueue.server.d.ts +1 -1
  26. package/dist-lib/lib/stickerQueue.server.d.ts.map +1 -1
  27. package/dist-lib/lib/stickerQueue.server.js +88 -0
  28. package/package.json +1 -1
@@ -0,0 +1,78 @@
1
+ export interface BeladingVelden {
2
+ plants_per_crate: number;
3
+ crates_per_layer: number;
4
+ layers_per_cart: number;
5
+ }
6
+ export type BeladingVeld = keyof BeladingVelden;
7
+ export type DeelBelading = Partial<Record<BeladingVeld, number | null | undefined>>;
8
+ export declare const VELD_NAAM: Record<BeladingVeld, string>;
9
+ /** 0, negatief, leeg of geen getal = onbekend (nooit een waarde). */
10
+ export declare function positief(v: unknown): number | null;
11
+ /** Floriday-verpakking per veld; 0 (zoals bij klokorders) telt als onbekend. */
12
+ export declare function deelUitFloridayVerpakking(packing: unknown): DeelBelading | null;
13
+ export interface AanvulUitkomst {
14
+ belading: BeladingVelden | null;
15
+ ontbrekend: BeladingVeld[];
16
+ bronPerVeld: Partial<Record<BeladingVeld, string>>;
17
+ }
18
+ /**
19
+ * Vult elk veld afzonderlijk aan uit de bronnen in volgorde. Nooit een stille 1:
20
+ * blijft een veld leeg, dan is de uitkomst onvolledig en wordt alleen die regel geblokkeerd.
21
+ */
22
+ export declare function vulBeladingAan(bronnen: Array<{
23
+ naam: string;
24
+ waarden: DeelBelading | null | undefined;
25
+ }>): AanvulUitkomst;
26
+ export declare function redenOnvolledig(regel: string, ontbrekend: BeladingVeld[]): string;
27
+ /** Intern altijd planten. Eenheid fust (Aanbiedingsmail): quantity × planten per fust van de regel. */
28
+ export declare function plantenVanRegel(unit: string | null | undefined, quantity: unknown, ppcRegel: unknown): number | null;
29
+ /** Fusten voor een aantal planten; het laatste fust krijgt de rest. */
30
+ export declare function fustenVoorPlanten(planten: number, ppc: number): {
31
+ fusten: number;
32
+ laatste: number;
33
+ };
34
+ /** Karren voor één regel op een ladingdrager met lagen. */
35
+ export declare function karrenVoorFusten(fusten: number, b: Pick<BeladingVelden, "crates_per_layer" | "layers_per_cart">): number;
36
+ /** Aantal gaten/planten van een fusttype: capacity_units, anders "12 gaats" in de naam. */
37
+ export declare function fustCapaciteit(fust: {
38
+ capacity_units?: number | null;
39
+ name?: string | null;
40
+ } | null | undefined): number | null;
41
+ export declare const MAX_KARREN_PER_ORDER = 50;
42
+ export interface PlausibiliteitInvoer {
43
+ belading: BeladingVelden;
44
+ fust?: {
45
+ capacity_units?: number | null;
46
+ name?: string | null;
47
+ } | null;
48
+ maxLagenLadingdrager?: number | null;
49
+ }
50
+ /** Redenen waarom een belading onwaarschijnlijk is; leeg = in orde. */
51
+ export declare function plausibiliteit(inv: PlausibiliteitInvoer): string[];
52
+ export declare function karrenOnwaarschijnlijk(karren: number): string | null;
53
+ /** Sleutel van een bevestiging: één per order en verpakking. */
54
+ export declare function verpakkingSleutel(productId: string | null, b: BeladingVelden): string;
55
+ export interface InvariantRegel {
56
+ id: string;
57
+ planten: number;
58
+ plants_per_crate: number;
59
+ }
60
+ export interface InvariantKarRegel {
61
+ regelId: string;
62
+ cartId: string;
63
+ fusten: number;
64
+ planten?: number | null;
65
+ }
66
+ /**
67
+ * Elk fust van elke regel staat op precies één kar en de planten kloppen
68
+ * (laatste fust = rest). Geeft per afwijkende regel een uitleg.
69
+ */
70
+ export declare function controleerInvariant(regels: InvariantRegel[], karRegels: InvariantKarRegel[]): string[];
71
+ /** Eigen traystickers: wachten zolang bij één regel het fustaantal onbekend is. */
72
+ export declare function traystickerWachtReden(regels: Array<{
73
+ naam: string;
74
+ fusten: number | null | undefined;
75
+ }>): string | null;
76
+ /** Wachtrij: bezette lease = later opnieuw (nooit klaar zonder indeling). */
77
+ export declare function opnieuwOverSeconden(pogingen: number): number;
78
+ //# sourceMappingURL=beladingRegels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beladingRegels.d.ts","sourceRoot":"","sources":["../../src/lib/beladingRegels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ // ============================================================================
2
+ // 1.0.179: beladingregels voor alle ordersoorten (FO, HO, MO, AO).
3
+ // Pure functies: geen database. De indeler en de tests gebruiken dezelfde regels.
4
+ // ============================================================================
5
+ export const VELD_NAAM = {
6
+ plants_per_crate: "planten per fust",
7
+ crates_per_layer: "fusten per laag",
8
+ layers_per_cart: "lagen per ladingdrager",
9
+ };
10
+ const VELDEN = ["plants_per_crate", "crates_per_layer", "layers_per_cart"];
11
+ /** 0, negatief, leeg of geen getal = onbekend (nooit een waarde). */
12
+ export function positief(v) {
13
+ if (v === null || v === undefined || v === "")
14
+ return null;
15
+ const n = Number(v);
16
+ return Number.isFinite(n) && n > 0 ? Math.round(n) : null;
17
+ }
18
+ /** Floriday-verpakking per veld; 0 (zoals bij klokorders) telt als onbekend. */
19
+ export function deelUitFloridayVerpakking(packing) {
20
+ if (!packing || typeof packing !== "object")
21
+ return null;
22
+ const p = packing;
23
+ const d = {
24
+ plants_per_crate: positief(p.pieces_per_package ?? p.piecesPerPackage),
25
+ crates_per_layer: positief(p.packages_per_layer ?? p.packagesPerLayer),
26
+ layers_per_cart: positief(p.layers_per_load_carrier ?? p.layersPerLoadCarrier),
27
+ };
28
+ return VELDEN.some((v) => d[v] != null) ? d : null;
29
+ }
30
+ /**
31
+ * Vult elk veld afzonderlijk aan uit de bronnen in volgorde. Nooit een stille 1:
32
+ * blijft een veld leeg, dan is de uitkomst onvolledig en wordt alleen die regel geblokkeerd.
33
+ */
34
+ export function vulBeladingAan(bronnen) {
35
+ const uit = {};
36
+ const bronPerVeld = {};
37
+ for (const veld of VELDEN) {
38
+ for (const b of bronnen) {
39
+ const w = positief(b.waarden?.[veld]);
40
+ if (w != null) {
41
+ uit[veld] = w;
42
+ bronPerVeld[veld] = b.naam;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ const ontbrekend = VELDEN.filter((v) => uit[v] == null);
48
+ return { belading: ontbrekend.length === 0 ? uit : null, ontbrekend, bronPerVeld };
49
+ }
50
+ export function redenOnvolledig(regel, ontbrekend) {
51
+ return `Belading onvolledig voor ${regel}: ${ontbrekend.map((v) => VELD_NAAM[v]).join(", ")} onbekend ` +
52
+ "(niet op de orderregel, niet bij het product en geen standaard van de ladingdrager). Vul dit in; alleen deze regel wacht.";
53
+ }
54
+ /** Intern altijd planten. Eenheid fust (Aanbiedingsmail): quantity × planten per fust van de regel. */
55
+ export function plantenVanRegel(unit, quantity, ppcRegel) {
56
+ const q = Number(quantity);
57
+ if (!Number.isFinite(q) || q < 0)
58
+ return null;
59
+ if (String(unit ?? "").trim().toLowerCase() === "fust") {
60
+ const ppc = positief(ppcRegel);
61
+ return ppc == null ? null : Math.round(q * ppc);
62
+ }
63
+ return Math.round(q);
64
+ }
65
+ /** Fusten voor een aantal planten; het laatste fust krijgt de rest. */
66
+ export function fustenVoorPlanten(planten, ppc) {
67
+ if (planten <= 0 || ppc <= 0)
68
+ return { fusten: 0, laatste: 0 };
69
+ const fusten = Math.ceil(planten / ppc);
70
+ return { fusten, laatste: planten - ppc * (fusten - 1) };
71
+ }
72
+ /** Karren voor één regel op een ladingdrager met lagen. */
73
+ export function karrenVoorFusten(fusten, b) {
74
+ const perKar = b.crates_per_layer * b.layers_per_cart;
75
+ return perKar > 0 ? Math.ceil(fusten / perKar) : 0;
76
+ }
77
+ /** Aantal gaten/planten van een fusttype: capacity_units, anders "12 gaats" in de naam. */
78
+ export function fustCapaciteit(fust) {
79
+ if (!fust)
80
+ return null;
81
+ const c = positief(fust.capacity_units);
82
+ if (c != null)
83
+ return c;
84
+ const m = String(fust.name ?? "").match(/(\d+)\s*-?\s*(gaats|gats|gaten|holes?)/i);
85
+ return m ? positief(m[1]) : null;
86
+ }
87
+ export const MAX_KARREN_PER_ORDER = 50;
88
+ /** Redenen waarom een belading onwaarschijnlijk is; leeg = in orde. */
89
+ export function plausibiliteit(inv) {
90
+ const r = [];
91
+ const cap = fustCapaciteit(inv.fust);
92
+ if (inv.belading.plants_per_crate === 1 && cap != null && cap > 1) {
93
+ r.push(`1 plant per fust, terwijl het fust ${inv.fust?.name ?? ""} ${cap} plaatsen heeft`.replace(/\s+/g, " "));
94
+ }
95
+ const max = positief(inv.maxLagenLadingdrager);
96
+ if (max != null && inv.belading.layers_per_cart > max) {
97
+ r.push(`${inv.belading.layers_per_cart} lagen, terwijl de ladingdrager er maximaal ${max} heeft`);
98
+ }
99
+ return r;
100
+ }
101
+ export function karrenOnwaarschijnlijk(karren) {
102
+ return karren > MAX_KARREN_PER_ORDER
103
+ ? `De order krijgt ${karren} karren (meer dan ${MAX_KARREN_PER_ORDER})`
104
+ : null;
105
+ }
106
+ /** Sleutel van een bevestiging: één per order en verpakking. */
107
+ export function verpakkingSleutel(productId, b) {
108
+ return `${productId ?? "-"}:${b.plants_per_crate}x${b.crates_per_layer}x${b.layers_per_cart}`;
109
+ }
110
+ /**
111
+ * Elk fust van elke regel staat op precies één kar en de planten kloppen
112
+ * (laatste fust = rest). Geeft per afwijkende regel een uitleg.
113
+ */
114
+ export function controleerInvariant(regels, karRegels) {
115
+ const fouten = [];
116
+ for (const r of regels) {
117
+ if (r.planten <= 0)
118
+ continue;
119
+ const verwacht = fustenVoorPlanten(r.planten, r.plants_per_crate);
120
+ const op = karRegels.filter((k) => k.regelId === r.id);
121
+ const fusten = op.reduce((s, k) => s + (Number(k.fusten) || 0), 0);
122
+ if (fusten !== verwacht.fusten) {
123
+ fouten.push(`Regel ${r.id}: ${fusten} fust(en) op karren, verwacht ${verwacht.fusten}.`);
124
+ continue;
125
+ }
126
+ const metPlanten = op.filter((k) => k.planten != null);
127
+ if (metPlanten.length === op.length && op.length > 0) {
128
+ const planten = metPlanten.reduce((s, k) => s + Number(k.planten), 0);
129
+ if (planten !== r.planten)
130
+ fouten.push(`Regel ${r.id}: ${planten} planten op karren, verwacht ${r.planten}.`);
131
+ }
132
+ }
133
+ return fouten;
134
+ }
135
+ /** Eigen traystickers: wachten zolang bij één regel het fustaantal onbekend is. */
136
+ export function traystickerWachtReden(regels) {
137
+ const onbekend = regels.find((r) => !(Number(r.fusten) > 0));
138
+ return onbekend ? `Fustaantal van regel ${onbekend.naam} onbekend` : null;
139
+ }
140
+ /** Wachtrij: bezette lease = later opnieuw (nooit klaar zonder indeling). */
141
+ export function opnieuwOverSeconden(pogingen) {
142
+ return Math.min(300, 15 * Math.pow(2, Math.max(0, Math.min(5, pogingen))));
143
+ }
@@ -35,7 +35,7 @@ export async function planBuffersBatch(sb, cursor, limit = 20) {
35
35
  result.nextCursor = id;
36
36
  try {
37
37
  const plan = await replanBufferInternal(sb, id);
38
- if (plan.skipped === "locked") {
38
+ if (plan.skipped === "locked" || plan.skipped === "busy") {
39
39
  result.skippedLocked++;
40
40
  }
41
41
  else if (plan.skipped === "blocked") {
@@ -82,7 +82,7 @@ export async function planLooseOrdersBatch(sb, cursor, limit = 20) {
82
82
  const plan = await replanOrderInternal(sb, id);
83
83
  if (!plan)
84
84
  continue;
85
- if (plan.skipped === "locked") {
85
+ if (plan.skipped === "locked" || plan.skipped === "busy") {
86
86
  result.skippedLocked++;
87
87
  }
88
88
  else if (plan.skipped === "blocked") {
@@ -0,0 +1,17 @@
1
+ export interface TrayProduct {
2
+ artikelnummer: string | null;
3
+ naam: string | null;
4
+ aantal: number | null;
5
+ onderdelen?: unknown[];
6
+ }
7
+ export type TrayPayloadResult = {
8
+ ok: true;
9
+ payload: Record<string, unknown>;
10
+ } | {
11
+ ok: false;
12
+ reden: string;
13
+ };
14
+ /** Zelfde regel als logistics_tray_plants: planten per fust, laatste fust = de rest. */
15
+ export declare function trayPlanten(ppc: number | null, regelTotaal: number | null, fust: number, fusten: number): number | null;
16
+ export declare function controleerTrayPayload(raw: unknown): TrayPayloadResult;
17
+ //# sourceMappingURL=eigenTraysticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eigenTraysticker.d.ts","sourceRoot":"","sources":["../../src/lib/eigenTraysticker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIjC,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvH;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAerE"}
@@ -0,0 +1,32 @@
1
+ // 1.0.178: eigen traystickers (HO/MO/AO), één printopdracht per FUST.
2
+ // De database bouwt de payload (logistics_own_traysticker_payload); hier wordt
3
+ // hij gecontroleerd. Geen logo_url: Layouts haalt het eigen logo zelf op.
4
+ const ONBEKEND = "Aantal fusten onbekend";
5
+ /** Zelfde regel als logistics_tray_plants: planten per fust, laatste fust = de rest. */
6
+ export function trayPlanten(ppc, regelTotaal, fust, fusten) {
7
+ if (!ppc || ppc <= 0)
8
+ return null;
9
+ if (fust < fusten || regelTotaal == null)
10
+ return ppc;
11
+ const rest = regelTotaal - ppc * (fusten - 1);
12
+ return rest > 0 ? rest : ppc;
13
+ }
14
+ export function controleerTrayPayload(raw) {
15
+ if (!raw || typeof raw !== "object")
16
+ return { ok: false, reden: "Traysticker-gegevens niet leesbaar." };
17
+ const r = raw;
18
+ if (r["ok"] !== true)
19
+ return { ok: false, reden: String(r["reden"] ?? ONBEKEND) };
20
+ const p = r["payload"];
21
+ if (!p || typeof p !== "object")
22
+ return { ok: false, reden: ONBEKEND };
23
+ const pl = { ...p };
24
+ delete pl["logo_url"];
25
+ const nr = Number(pl["tray_nummer"]);
26
+ const tot = Number(pl["tray_totaal"]);
27
+ const producten = Array.isArray(pl["tray_producten"]) ? pl["tray_producten"] : [];
28
+ if (!Number.isInteger(nr) || !Number.isInteger(tot) || nr < 1 || tot < 1 || nr > tot || producten.length === 0) {
29
+ return { ok: false, reden: ONBEKEND };
30
+ }
31
+ return { ok: true, payload: pl };
32
+ }
@@ -2,6 +2,7 @@ import type { SupabaseClient } from "@supabase/supabase-js";
2
2
  import { type CarrierProfile, type PlannedLoadUnit, type PlannerInputItem } from "./loadCarrierPlanner.js";
3
3
  import { type LoadCarrierTypeRow } from "./loadCarrierTypes.js";
4
4
  import { type DimensionCart } from "./dimensionPlanner.js";
5
+ import { type BeladingVeld, type DeelBelading } from "./beladingRegels.js";
5
6
  export declare function resolveBufferForOrderInternal(sb: SupabaseClient, orderId: string): Promise<string | null>;
6
7
  interface Belading {
7
8
  plants_per_crate: number;
@@ -22,12 +23,38 @@ export declare function beladingFromFloridayPacking(packing: unknown): Belading
22
23
  * `orders.custom_fields.floriday_lines`. Dit is de enige bron die per regel klopt;
23
24
  * `custom_fields.floriday_packing` geldt voor de hele order.
24
25
  */
25
- export declare function beladingPerRegelUitOrder(customFields: unknown): Map<string, Belading>;
26
+ export declare function beladingPerRegelUitOrder(customFields: unknown): Map<string, DeelBelading>;
27
+ export interface BeladingUitkomst {
28
+ belading: Belading;
29
+ source: BeladingSource;
30
+ /** Velden die nergens gevonden zijn (0 in belading); de ladingdrager-standaard mag ze nog aanvullen. */
31
+ ontbrekend: BeladingVeld[];
32
+ /** Waarden komen uit meer dan één bron: dan nooit "leidend". */
33
+ aangevuld: boolean;
34
+ }
35
+ /**
36
+ * 1.0.179: belading per veld, nooit een stille 1. Volgorde per veld:
37
+ * handmatig vastgezet (alleen regel, dan product) of anders
38
+ * Floriday-regel -> orderregel-snapshot -> product -> order-brede Floriday-verpakking.
39
+ * De standaard van de ladingdrager vult daarna in de indeling nog fusten per laag en lagen aan.
40
+ * Blijft een veld leeg, dan wordt die regel geblokkeerd (belading_onvolledig).
41
+ */
42
+ export declare function resolveBelading(row: Record<string, any>, packing: Belading | null, linePacking?: DeelBelading | null): BeladingUitkomst;
26
43
  export interface ExpandOptions {
27
44
  /** Order-brede belading uit custom_fields.floriday_packing (laatste noodgreep). */
28
45
  packingByOrder?: Map<string, Belading>;
29
46
  /** Belading per orderregel uit custom_fields.floriday_lines, per order en artikel. */
30
- packingByOrderLine?: Map<string, Map<string, Belading>>;
47
+ packingByOrderLine?: Map<string, Map<string, DeelBelading>>;
48
+ /** 1.0.179: ontbrekende beladingvelden per orderregel-sleutel. */
49
+ ontbrekend?: Map<string, BeladingVeld[]>;
50
+ /** 1.0.179: regels waarvan het aantal planten niet bepaald kan worden (eenheid fust zonder planten per fust). */
51
+ onbekendePlanten?: Array<{
52
+ order_id: string | null;
53
+ order_item_id: string;
54
+ naam: string;
55
+ }>;
56
+ /** 1.0.179: fusttype per product voor de plausibiliteitscontrole. */
57
+ fustPerProduct?: Map<string, string | null>;
31
58
  /** Wordt gevuld met de gebruikte bron per orderregel-sleutel. */
32
59
  sources?: Map<string, BeladingSource>;
33
60
  /** Wordt gevuld met de onderdelen van een set per orderregel (aantallen voor de hele regel). */
@@ -79,6 +106,8 @@ export declare function scaleComponents(entry: {
79
106
  * Een groep wordt nooit via de naam herkend.
80
107
  */
81
108
  export declare function expandOrderItemsForPlanner(sb: SupabaseClient, rows: Array<Record<string, any>>, options?: ExpandOptions): Promise<PlannerInputItem[]>;
109
+ /** Invariant: elk fust van elke ingedeelde regel staat op precies één kar en de planten kloppen. */
110
+ export declare function invariantFouten(inputs: PlannerInputItem[], carts: PlannedLoadUnit[]): string[];
82
111
  export declare function loadCarrierProfiles(sb: SupabaseClient): Promise<LoadCarrierTypeRow[]>;
83
112
  export interface BeladingRules {
84
113
  maxOrders: number | null;
@@ -125,7 +154,8 @@ export interface ReplanResult {
125
154
  replacedManualCount: number;
126
155
  usedFloridayPacking: boolean;
127
156
  warnings: string[];
128
- skipped?: "locked" | "blocked";
157
+ /** locked = bevroren/vastgezet; busy = lease bezet (later opnieuw, nooit klaar); blocked = geblokkeerd. */
158
+ skipped?: "locked" | "blocked" | "busy";
129
159
  /** Leesbare reden waarom er niets is ingedeeld. */
130
160
  blockedReason?: string;
131
161
  /** Gebruikte beladingbronnen in deze buffer, met aantal orderregels per bron. */
@@ -135,6 +165,8 @@ export interface ReplanResult {
135
165
  export interface ReplanOptions {
136
166
  /** Alleen berekenen, niets wegschrijven. */
137
167
  dryRun?: boolean;
168
+ /** 1.0.179: de lease van deze buffer is in deze ronde al in handen (bijdelen); niet opnieuw aanvragen. */
169
+ leaseHeld?: boolean;
138
170
  /** Overschrijf het ladingdragertype dat de Rule Engine zou kiezen. */
139
171
  carrierType?: string | null;
140
172
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadCarrierPlanning.server.d.ts","sourceRoot":"","sources":["../../src/lib/loadCarrierPlanning.server.ts"],"names":[],"mappings":"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"}