@flowselections/logistiek-engine 1.0.111 → 1.0.113
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/MisluktVerzendbrievenCard.d.ts.map +1 -1
- package/dist-lib/components/MisluktVerzendbrievenCard.js +3 -3
- package/dist-lib/hooks/useShippingNoteStatus.d.ts +3 -1
- package/dist-lib/hooks/useShippingNoteStatus.d.ts.map +1 -1
- package/dist-lib/hooks/useShippingNoteStatus.js +6 -3
- package/dist-lib/integrations/supabase/types.d.ts +400 -1
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.d.ts.map +1 -1
- package/dist-lib/lib/handlers/logistics-shipping-note-now.server.js +15 -4
- package/dist-lib/lib/handlers/logistics-tick.server.js +8 -0
- package/dist-lib/lib/modulePrompts.d.ts +2 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +43 -1
- package/dist-lib/lib/moduleVersion.d.ts +1 -1
- package/dist-lib/lib/moduleVersion.js +1 -1
- package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/shippingNoteQueue.server.js +51 -5
- package/dist-lib/lib/shippingNoteStates.d.ts +26 -0
- package/dist-lib/lib/shippingNoteStates.d.ts.map +1 -0
- package/dist-lib/lib/shippingNoteStates.js +38 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logistics-shipping-note-now.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-shipping-note-now.server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"logistics-shipping-note-now.server.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/logistics-shipping-note-now.server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQ5D,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CA2GnB"}
|
|
@@ -51,14 +51,25 @@ export async function handleShippingNoteNow(request, supabase) {
|
|
|
51
51
|
catch {
|
|
52
52
|
/* opschonen mag de ronde niet blokkeren */
|
|
53
53
|
}
|
|
54
|
-
// 2.
|
|
54
|
+
// 2. Alleen de aanvraag van díe pakbon wakker maken; nooit alles.
|
|
55
55
|
let wake = null;
|
|
56
|
+
let slipJobId = null;
|
|
56
57
|
try {
|
|
57
|
-
const
|
|
58
|
-
|
|
58
|
+
const body = (await request.clone().json().catch(() => ({})));
|
|
59
|
+
const v = typeof body["slipJobId"] === "string" ? body["slipJobId"].trim() : "";
|
|
60
|
+
slipJobId = /^[0-9a-f-]{36}$/i.test(v) ? v : null;
|
|
59
61
|
}
|
|
60
62
|
catch {
|
|
61
|
-
|
|
63
|
+
slipJobId = null;
|
|
64
|
+
}
|
|
65
|
+
if (slipJobId) {
|
|
66
|
+
try {
|
|
67
|
+
const { data } = await supabase.rpc("logistics_shipping_note_wake", { _slip_job_id: slipJobId });
|
|
68
|
+
wake = { gewekt: data ?? 0, slipJobId };
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
wake = null;
|
|
72
|
+
}
|
|
62
73
|
}
|
|
63
74
|
// 3. Gebundeld verwerken tot alles op is of het tijdbudget vol is; de knop
|
|
64
75
|
// hoeft niet te wachten tot de laatste ronde klaar is.
|
|
@@ -218,6 +218,14 @@ async function runTickRound(supabase, tickJob, ident) {
|
|
|
218
218
|
catch {
|
|
219
219
|
/* zelfherstel mag de ronde niet blokkeren */
|
|
220
220
|
}
|
|
221
|
+
// Vrijgeven (alleen database): wachtende aanvragen van orders met een
|
|
222
|
+
// goedgekeurde controlescan, zodra de poort het aanmaken toestaat.
|
|
223
|
+
try {
|
|
224
|
+
await supabase.rpc("logistics_shipping_note_release", { _order_number: null });
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
/* vrijgeven mag de ronde niet blokkeren */
|
|
228
|
+
}
|
|
221
229
|
const { runShippingNoteQueue } = await import("../shippingNoteQueue.server.js");
|
|
222
230
|
if (typeof runShippingNoteQueue !== "function") {
|
|
223
231
|
throw new Error("Deze versie van de Logistiek Engine bevat geen verzendbriefverwerking. Werk de module bij.");
|
|
@@ -27,6 +27,8 @@ export interface ModulePromptRevision {
|
|
|
27
27
|
summary: string;
|
|
28
28
|
/** Het gedeelde contract meesturen (alleen bij de eerste prompt). */
|
|
29
29
|
withSharedContract?: boolean;
|
|
30
|
+
/** De module heeft deze prompt uitgevoerd; de tekst blijft ongewijzigd staan. */
|
|
31
|
+
resolved?: boolean;
|
|
30
32
|
/** De inhoud van de prompt. */
|
|
31
33
|
body: string;
|
|
32
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAIvB,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,+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;;;;;;;;;;;CAIvB,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;AAy5ID,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"}
|
|
@@ -3799,6 +3799,7 @@ CONTROLELIJST
|
|
|
3799
3799
|
title: "Bestaande voorraadsleutel ook zonder Floriday-koppeling teruggeven",
|
|
3800
3800
|
date: "2026-10-08",
|
|
3801
3801
|
withSharedContract: false,
|
|
3802
|
+
resolved: true,
|
|
3802
3803
|
summary: "ensure_trade_item_stock_row_key geeft nu NULL zonder actieve Floriday-koppeling, ook als de rij al bestaat. Geef dan de bestaande canonieke sleutel terug.",
|
|
3803
3804
|
body: `WAAROM
|
|
3804
3805
|
In een shell zonder actieve Floriday-koppeling geeft
|
|
@@ -3821,6 +3822,44 @@ CONTROLELIJST
|
|
|
3821
3822
|
[ ] Zonder koppeling en zonder rij: NULL, geen rij.
|
|
3822
3823
|
[ ] Met koppeling: gedrag ongewijzigd.
|
|
3823
3824
|
[ ] Fysiek, minimum en inkomend worden nooit geraakt.
|
|
3825
|
+
[ ] Geen URL's, sleutels, project-refs, klantnamen of vaste id's in code of migratie.`,
|
|
3826
|
+
},
|
|
3827
|
+
{
|
|
3828
|
+
number: 7,
|
|
3829
|
+
title: "Afboeken van sets en groepen op onderdelen en leden",
|
|
3830
|
+
date: "2026-10-09",
|
|
3831
|
+
withSharedContract: false,
|
|
3832
|
+
summary: "Boek bij levering af op dezelfde onderdelen en leden als de reservering, via logistics_order_line_allocation, met change_source op elke update.",
|
|
3833
|
+
body: `WAAROM
|
|
3834
|
+
De Engine reserveert sets nu op hun onderdelen en groepen op hun leden (nooit op
|
|
3835
|
+
de set of de groepssleutel). De afboekfuncties zijn van de Voorraad-module en
|
|
3836
|
+
boeken nog af op het bestelde artikel (karrencontrole) of zonder sets
|
|
3837
|
+
(statuswissel). Dan klopt de voorraad na levering niet.
|
|
3838
|
+
|
|
3839
|
+
Let op: de karrencontrole (trg_cart_session_consume_fn) heeft nu GEEN controle
|
|
3840
|
+
op dubbel afboeken. Elke afgeronde karsessie boekt alle regels van de order
|
|
3841
|
+
opnieuw af.
|
|
3842
|
+
|
|
3843
|
+
WAT JE AANPAST (alleen in de Voorraad-module)
|
|
3844
|
+
1. In trg_orders_consume_on_complete_fn en trg_cart_session_consume_fn: per
|
|
3845
|
+
orderregel de rijen uit public.logistics_order_line_allocation(order_item_id)
|
|
3846
|
+
halen en per rij apply_stock_consumption(trade_item_key, qty, ...) aanroepen.
|
|
3847
|
+
Rijen met source = 'error' niet afboeken, wel vastleggen (consumption_blocked).
|
|
3848
|
+
2. Eén controle op dubbel afboeken per orderregel in BEIDE triggers (de
|
|
3849
|
+
karrencontrole heeft die nu niet).
|
|
3850
|
+
3. apply_stock_consumption: change_source in dezelfde update zetten
|
|
3851
|
+
(ORDER_DELIVERY, of FLORIDAY_ORDER voor Floriday-orders).
|
|
3852
|
+
4. Zet vóór elke update set_config('stock.change_source', '<bron>', true),
|
|
3853
|
+
zodat de logtrigger de bron leest.
|
|
3854
|
+
5. Structuur niet zelf uitklappen; de Engine levert onderdelen en leden.
|
|
3855
|
+
|
|
3856
|
+
CONTROLELIJST
|
|
3857
|
+
[ ] Set van 2x X + 1x groep, levering 3: X -6, gekozen lid -3, set 0.
|
|
3858
|
+
[ ] Groep: dezelfde leden als de reservering, groepssleutel nooit geraakt.
|
|
3859
|
+
[ ] Tweede keer afboeken doet niets.
|
|
3860
|
+
[ ] Een tweede afgeronde karsessie voor dezelfde order boekt niets af.
|
|
3861
|
+
[ ] Elke update heeft een change_source.
|
|
3862
|
+
[ ] Test met synthetische artikelen in een teruggedraaide transactie.
|
|
3824
3863
|
[ ] Geen URL's, sleutels, project-refs, klantnamen of vaste id's in code of migratie.`,
|
|
3825
3864
|
},
|
|
3826
3865
|
],
|
|
@@ -4350,10 +4389,13 @@ export function buildRevisionPrompt(prompt, revision) {
|
|
|
4350
4389
|
? `\n## Gedeeld contract\n\n${sharedBlock(prompt.moduleKey)}\n`
|
|
4351
4390
|
: `\n(Deze prompt is een aanvulling. Het gedeelde contract uit koppelprompt 1 blijft
|
|
4352
4391
|
onverkort gelden — niets terugdraaien.)\n`;
|
|
4392
|
+
const resolvedNote = revision.resolved
|
|
4393
|
+
? `(AFGEHANDELD — uitgevoerd door de module op ${revision.date}; blijft geldig, niets terugdraaien.)\n`
|
|
4394
|
+
: "";
|
|
4353
4395
|
return `# Koppelprompt ${revision.number} — ${prompt.label}
|
|
4354
4396
|
## ${revision.title} (${revision.date})
|
|
4355
4397
|
|
|
4356
|
-
${revision.summary}
|
|
4398
|
+
${resolvedNote}${revision.summary}
|
|
4357
4399
|
${shared}
|
|
4358
4400
|
## Wat deze module moet doen
|
|
4359
4401
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.113";
|
|
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.113";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shippingNoteQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNoteQueue.server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"shippingNoteQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNoteQueue.server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoCD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,eAAe,CAAC,CAiZ1B"}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
import { trace, newTraceId, classifyError } from "./trace.server.js";
|
|
15
15
|
import { FLOW_NODE } from "./flowNodes.js";
|
|
16
16
|
import { printViaLayout } from "./layoutPrint.server.js";
|
|
17
|
-
|
|
18
|
-
const
|
|
17
|
+
import { SHIPPING_NOTE_DEFINITIEVE_FOUTEN, definitieveFout, parseMaxAttempts } from "./shippingNoteStates.js";
|
|
18
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
19
19
|
function pickPdf(result) {
|
|
20
20
|
const base64 = result["pdfBase64"] ??
|
|
21
21
|
result["base64"] ??
|
|
@@ -41,6 +41,13 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
41
41
|
failed: 0,
|
|
42
42
|
errors: [],
|
|
43
43
|
};
|
|
44
|
+
// Grens uit de instelling (zelfde als in de database). Ontbreekt hij: niets oppakken.
|
|
45
|
+
const { data: maxData } = await sb.rpc("logistics_shipping_note_max_attempts");
|
|
46
|
+
const MAX_ATTEMPTS = parseMaxAttempts(maxData);
|
|
47
|
+
if (MAX_ATTEMPTS === null) {
|
|
48
|
+
run.errors.push("De instelling logistics_shipping_note_max_attempts ontbreekt of is ongeldig (1-200); er worden geen verzendbrieven opgehaald.");
|
|
49
|
+
return run;
|
|
50
|
+
}
|
|
44
51
|
const { data, error } = await sb.rpc("logistics_slip_note_claim", {
|
|
45
52
|
_limit: options.limit ?? 10,
|
|
46
53
|
_lease_seconds: 120,
|
|
@@ -98,7 +105,30 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
98
105
|
...(fulfillmentOrderId ? { externalRef: fulfillmentOrderId } : {}),
|
|
99
106
|
});
|
|
100
107
|
};
|
|
108
|
+
const definitief = async (code, detail) => {
|
|
109
|
+
const f = SHIPPING_NOTE_DEFINITIEVE_FOUTEN[code];
|
|
110
|
+
await faal(code, `${f.reden}${detail ? ` (${detail})` : ""} Advies: ${f.advies}`, row.fulfillment_order_id);
|
|
111
|
+
};
|
|
112
|
+
// Poort weigert of nog geen goedgekeurde controlescan: wacht op vrijgave, telt niet als poging.
|
|
113
|
+
const houdVast = async (reden) => {
|
|
114
|
+
await sb.rpc("logistics_slip_note_hold", { _id: row.id, _reason: reden });
|
|
115
|
+
run.waiting++;
|
|
116
|
+
await trace(sb, {
|
|
117
|
+
...basis,
|
|
118
|
+
step: "Wacht op vrijgave",
|
|
119
|
+
status: "wachtend",
|
|
120
|
+
decision: "wacht_op_vrijgave",
|
|
121
|
+
reason: reden,
|
|
122
|
+
rule: "De officiële Floriday-verzendbrief wordt pas na de controlescan aangemaakt",
|
|
123
|
+
nextStep: "Gaat vanzelf verder na een goedgekeurde controlescan met de poort open",
|
|
124
|
+
});
|
|
125
|
+
};
|
|
101
126
|
const wacht = async (reden, klasse) => {
|
|
127
|
+
const code = definitieveFout(reden);
|
|
128
|
+
if (code) {
|
|
129
|
+
await definitief(code, reden);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
102
132
|
if (attempts >= MAX_ATTEMPTS) {
|
|
103
133
|
await faal("wachten_verlopen", `Na ${attempts} pogingen is er nog steeds geen officiële verzendbrief. Laatste reden: ${reden}`);
|
|
104
134
|
return;
|
|
@@ -133,12 +163,14 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
133
163
|
await faal("geen_ordernummer", "Bij deze kar hoort geen ordernummer; de verzendbrief kan niet worden opgehaald.");
|
|
134
164
|
continue;
|
|
135
165
|
}
|
|
136
|
-
|
|
137
|
-
|
|
166
|
+
if (!row.order_id || !UUID_RE.test(row.order_id)) {
|
|
167
|
+
await definitief("geen_order_id");
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
138
170
|
const { data: order, error: orderError } = await sb
|
|
139
171
|
.from("orders")
|
|
140
172
|
.select("floriday_sales_order_id")
|
|
141
|
-
.eq("id", row.order_id
|
|
173
|
+
.eq("id", row.order_id)
|
|
142
174
|
.maybeSingle();
|
|
143
175
|
if (orderError) {
|
|
144
176
|
await wacht(`De Floriday-order kon niet worden gelezen: ${orderError.message}`, "tijdelijk");
|
|
@@ -165,6 +197,16 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
165
197
|
// aangemaakt.
|
|
166
198
|
let bestaandeFo = String(row.fulfillment_order_id ?? "").trim() || null;
|
|
167
199
|
if (!bestaandeFo) {
|
|
200
|
+
// Pas ná een goedgekeurde controlescan laten aanmaken.
|
|
201
|
+
const { data: goedgekeurd, error: goedError } = await sb.rpc("logistics_floriday_order_approved", {
|
|
202
|
+
_order_ref: row.order_number,
|
|
203
|
+
});
|
|
204
|
+
if (goedError || goedgekeurd !== true) {
|
|
205
|
+
await houdVast(goedError
|
|
206
|
+
? "De goedkeuring van de controlescan kan niet gelezen worden; er gaat niets naar Floriday."
|
|
207
|
+
: "Wacht op een goedgekeurde controlescan voordat Floriday de verzendbrief aanmaakt.");
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
168
210
|
const { createFlorydayDeliveryNote } = await import("./floridayDocuments.server.js");
|
|
169
211
|
const startAanmaak = Date.now();
|
|
170
212
|
const aangemaakt = await createFlorydayDeliveryNote(sb, row.order_number);
|
|
@@ -187,6 +229,10 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
187
229
|
.eq("id", row.id)
|
|
188
230
|
.is("fulfillment_order_id", null);
|
|
189
231
|
}
|
|
232
|
+
else if (aangemaakt.skipped) {
|
|
233
|
+
await houdVast(aangemaakt.error ?? "De poort staat het aanmaken van de verzendbrief niet toe.");
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
190
236
|
else if (!aangemaakt.ok) {
|
|
191
237
|
await wacht(`Wachten op Floriday-verzendbrief: ${aangemaakt.error ?? "Floriday heeft het document nog niet aangemaakt."}`, aangemaakt.skipped ? "nog_niet_beschikbaar" : classifyFloridayReason(aangemaakt.error ?? ""));
|
|
192
238
|
continue;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const SHIPPING_NOTE_STATUSSEN: readonly ["wachtend", "wacht_op_vrijgave", "geprint", "mislukt"];
|
|
2
|
+
export type ShippingNoteStatusWaarde = (typeof SHIPPING_NOTE_STATUSSEN)[number];
|
|
3
|
+
/** Definitieve fouten: direct mislukt, nooit opnieuw proberen. */
|
|
4
|
+
export declare const SHIPPING_NOTE_DEFINITIEVE_FOUTEN: {
|
|
5
|
+
readonly geen_order_id: {
|
|
6
|
+
readonly reden: "Bij deze pakbon hoort geen geldige order; de verzendbrief kan niet worden opgehaald.";
|
|
7
|
+
readonly advies: "Print de pakbon opnieuw vanaf het pickstation, zodat de order wordt meegegeven.";
|
|
8
|
+
};
|
|
9
|
+
readonly geen_karindeling: {
|
|
10
|
+
readonly reden: "Er is geen (volledige) karindeling voor deze order; Floriday kan de verzendbrief niet maken.";
|
|
11
|
+
readonly advies: "Plan de order opnieuw in op karren en print daarna de pakbon opnieuw.";
|
|
12
|
+
};
|
|
13
|
+
readonly ongeldige_gegevens: {
|
|
14
|
+
readonly reden: "De gegevens van deze order zijn ongeldig voor Floriday.";
|
|
15
|
+
readonly advies: "Controleer de order (artikelen, karren, lagen) en druk daarna op 'Opnieuw starten'.";
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type ShippingNoteDefinitieveFout = keyof typeof SHIPPING_NOTE_DEFINITIEVE_FOUTEN;
|
|
19
|
+
/** Instelling in module_runtime_config; geheel getal 1..200, startwaarde 60. */
|
|
20
|
+
export declare const SHIPPING_NOTE_MAX_ATTEMPTS_KEY = "logistics_shipping_note_max_attempts";
|
|
21
|
+
export declare const SHIPPING_NOTE_MAX_ATTEMPTS_MIN = 1;
|
|
22
|
+
export declare const SHIPPING_NOTE_MAX_ATTEMPTS_MAX = 200;
|
|
23
|
+
export declare function parseMaxAttempts(value: unknown): number | null;
|
|
24
|
+
/** Herkent een definitieve fout in een foutmelding; null = mogelijk tijdelijk. */
|
|
25
|
+
export declare function definitieveFout(message: string): ShippingNoteDefinitieveFout | null;
|
|
26
|
+
//# sourceMappingURL=shippingNoteStates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shippingNoteStates.d.ts","sourceRoot":"","sources":["../../src/lib/shippingNoteStates.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,kEAAmE,CAAC;AACxG,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;CAanC,CAAC;AACX,MAAM,MAAM,2BAA2B,GAAG,MAAM,OAAO,gCAAgC,CAAC;AAExF,gFAAgF;AAChF,eAAO,MAAM,8BAA8B,yCAAyC,CAAC;AACrF,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,2BAA2B,GAAG,IAAI,CAKnF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Toegestane waarden van de verzendbriefwachtrij (09-10-2026).
|
|
3
|
+
// Zelfde waarden als in de database (logistics_slip_shipping_note, module_runtime_config).
|
|
4
|
+
// ============================================================================
|
|
5
|
+
export const SHIPPING_NOTE_STATUSSEN = ["wachtend", "wacht_op_vrijgave", "geprint", "mislukt"];
|
|
6
|
+
/** Definitieve fouten: direct mislukt, nooit opnieuw proberen. */
|
|
7
|
+
export const SHIPPING_NOTE_DEFINITIEVE_FOUTEN = {
|
|
8
|
+
geen_order_id: {
|
|
9
|
+
reden: "Bij deze pakbon hoort geen geldige order; de verzendbrief kan niet worden opgehaald.",
|
|
10
|
+
advies: "Print de pakbon opnieuw vanaf het pickstation, zodat de order wordt meegegeven.",
|
|
11
|
+
},
|
|
12
|
+
geen_karindeling: {
|
|
13
|
+
reden: "Er is geen (volledige) karindeling voor deze order; Floriday kan de verzendbrief niet maken.",
|
|
14
|
+
advies: "Plan de order opnieuw in op karren en print daarna de pakbon opnieuw.",
|
|
15
|
+
},
|
|
16
|
+
ongeldige_gegevens: {
|
|
17
|
+
reden: "De gegevens van deze order zijn ongeldig voor Floriday.",
|
|
18
|
+
advies: "Controleer de order (artikelen, karren, lagen) en druk daarna op 'Opnieuw starten'.",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
/** Instelling in module_runtime_config; geheel getal 1..200, startwaarde 60. */
|
|
22
|
+
export const SHIPPING_NOTE_MAX_ATTEMPTS_KEY = "logistics_shipping_note_max_attempts";
|
|
23
|
+
export const SHIPPING_NOTE_MAX_ATTEMPTS_MIN = 1;
|
|
24
|
+
export const SHIPPING_NOTE_MAX_ATTEMPTS_MAX = 200;
|
|
25
|
+
export function parseMaxAttempts(value) {
|
|
26
|
+
const n = typeof value === "number" ? value : typeof value === "string" && /^\d{1,3}$/.test(value.trim()) ? Number(value) : NaN;
|
|
27
|
+
return Number.isInteger(n) && n >= SHIPPING_NOTE_MAX_ATTEMPTS_MIN && n <= SHIPPING_NOTE_MAX_ATTEMPTS_MAX ? n : null;
|
|
28
|
+
}
|
|
29
|
+
/** Herkent een definitieve fout in een foutmelding; null = mogelijk tijdelijk. */
|
|
30
|
+
export function definitieveFout(message) {
|
|
31
|
+
if (/invalid input syntax|uuid|geen (geldige )?order/i.test(message))
|
|
32
|
+
return "geen_order_id";
|
|
33
|
+
if (/karindeling|geen kar(ren)? ingedeeld/i.test(message))
|
|
34
|
+
return "geen_karindeling";
|
|
35
|
+
if (/hoort bij (g|een andere)|ongeldig|invalid|validation|422|400/i.test(message))
|
|
36
|
+
return "ongeldige_gegevens";
|
|
37
|
+
return null;
|
|
38
|
+
}
|