@flowselections/logistiek-engine 1.0.112 → 1.0.117
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 +530 -3
- 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/loadCarrierPlanning.server.d.ts +47 -0
- package/dist-lib/lib/loadCarrierPlanning.server.d.ts.map +1 -1
- package/dist-lib/lib/loadCarrierPlanning.server.js +181 -220
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +140 -0
- 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":"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;
|
|
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;AAuiJD,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"}
|
|
@@ -3325,6 +3325,146 @@ CONTROLELIJST
|
|
|
3325
3325
|
[ ] De verzendbrief gaat naar dezelfde printer als de pakbon.
|
|
3326
3326
|
[ ] De order blijft open tot de controlescan.`,
|
|
3327
3327
|
},
|
|
3328
|
+
{
|
|
3329
|
+
number: 40,
|
|
3330
|
+
title: "Pakbon per kar: alleen de eigen kar, nooit geprint zonder opdracht",
|
|
3331
|
+
date: "2026-10-09",
|
|
3332
|
+
summary: "Een rij van één kar print alleen die kar; een kar wordt pas als geprint gemarkeerd als er echt een printopdracht is; de pakbonsleutel bevat de kar.",
|
|
3333
|
+
body: `AANVULLING; eerdere prompts blijven gelden.
|
|
3334
|
+
|
|
3335
|
+
VASTGESTELDE FOUT (16-09 t/m 01-10)
|
|
3336
|
+
Vanaf een rij die bij één kar hoort, vroeg het pickscherm via
|
|
3337
|
+
pick_complete_print_carts alle karren van de order aan. Alleen kar 1 kreeg een
|
|
3338
|
+
opdracht; kar 2 t/m n werden door de ontdubbeling (print_jobs_dedupe, sleutel
|
|
3339
|
+
zonder kar) als dubbel overgeslagen. pick_complete_print_carts zette die karren
|
|
3340
|
+
toch in printed_cart_ids. Zo kregen 28 karren nooit een pakbon, terwijl ze als
|
|
3341
|
+
geprint stonden.
|
|
3342
|
+
|
|
3343
|
+
WAT DE ENGINE AL HEEFT GEDAAN (live)
|
|
3344
|
+
- pick_queue_cart_plan geeft bij een rij met een eigen kar (payload.cartId)
|
|
3345
|
+
alleen die kar terug: totalCarts = 1, cartTotal = totaal van order/buffer,
|
|
3346
|
+
rowCartId = de kar. Staat de kar niet meer in het plan, dan een fout
|
|
3347
|
+
"De kar van deze rij bestaat niet meer in het karplan; ververs de
|
|
3348
|
+
pickwachtrij." Rijen zonder eigen kar en buffers: ongewijzigd.
|
|
3349
|
+
- pick_enqueue_print_job (per kar) geeft idempotentie_sleutel
|
|
3350
|
+
pakbon:<queue_item_id>:<cart_id>:<layout_id|->:<printer_id|-> mee; bij een
|
|
3351
|
+
herprint geen sleutel (de trigger maakt die uniek).
|
|
3352
|
+
|
|
3353
|
+
WAT JIJ BOUWT
|
|
3354
|
+
1. Bied bij een rij met een eigen kar alleen die kar aan en print alleen die.
|
|
3355
|
+
Geen knop "alle karren" op een rij van één kar. Stuur nooit cart-id's mee
|
|
3356
|
+
die niet in pick_queue_cart_plan van die rij staan (anders volgt nu een
|
|
3357
|
+
fout en print er niets).
|
|
3358
|
+
2. pick_complete_print_carts, pick_complete_print_cart en pick_complete_print:
|
|
3359
|
+
zet een kar alleen in printed_cart_ids, en de rij alleen op geprint, als er
|
|
3360
|
+
echt een printopdracht is aangemaakt (job_id niet leeg). Is er geen
|
|
3361
|
+
opdracht, laat de kar open en geef per kar de melding: "Pakbon voor kar X
|
|
3362
|
+
is niet aangemaakt (dubbel binnen 10 minuten of geweigerd); probeer opnieuw
|
|
3363
|
+
of kies Herprint."
|
|
3364
|
+
3. pick_enqueue_print_job_from_cart: geef dezelfde sleutel per kar mee als de
|
|
3365
|
+
Engine (pakbon:<queue_item_id>:<cart_id>:<layout_id|->:<printer_id|->), en
|
|
3366
|
+
geen sleutel bij een herprint.
|
|
3367
|
+
4. Toon de fout "De kar van deze rij bestaat niet meer in het karplan;
|
|
3368
|
+
ververs de pickwachtrij" letterlijk in het scherm bij die rij, met een knop
|
|
3369
|
+
"Wachtrij verversen". Markeer niets als geprint en probeer niet zelf een
|
|
3370
|
+
andere kar.
|
|
3371
|
+
5. "Kar X van Y": X = cartSeq van de kar, Y = cartTotal (van het plan of van de
|
|
3372
|
+
kar). Gebruik NOOIT totalCarts uit het karplan van een rij; dat is bij een
|
|
3373
|
+
rij met eigen kar altijd 1.
|
|
3374
|
+
6. Een eerdere opdracht met status mislukt of geannuleerd blokkeert een nieuwe
|
|
3375
|
+
poging voor dezelfde kar niet (getest 09-10). Toon na zo'n fout gewoon
|
|
3376
|
+
opnieuw de printknop.
|
|
3377
|
+
7. Geen DELETE of UPDATE zonder WHERE (safeupdate staat aan).
|
|
3378
|
+
8. Test via de app-route met een tijdelijke testfunctie (alleen service_role),
|
|
3379
|
+
eerst safeupdate aantonen, altijd eindigen met een opzettelijke fout zodat
|
|
3380
|
+
alles wordt teruggedraaid; niets echt printen.
|
|
3381
|
+
|
|
3382
|
+
WAT JE NIET DOET
|
|
3383
|
+
- print_jobs_dedupe aanpassen (Layout maker).
|
|
3384
|
+
- Zelf karren samenstellen of uit het order-karplan halen.
|
|
3385
|
+
- Geen URL's, sleutels, project-refs, klantnamen of vaste id's in code.
|
|
3386
|
+
|
|
3387
|
+
CONTROLELIJST
|
|
3388
|
+
[ ] Rij van één kar: precies één pakbon, voor die kar.
|
|
3389
|
+
[ ] Meerdere karren onder een orderregel: één opdracht per kar.
|
|
3390
|
+
[ ] Dezelfde kar binnen 10 minuten opnieuw: overgeslagen en duidelijk gemeld,
|
|
3391
|
+
kar blijft open.
|
|
3392
|
+
[ ] Herprint geeft altijd een nieuwe opdracht.
|
|
3393
|
+
[ ] Geen kar staat op geprint zonder printopdracht.
|
|
3394
|
+
[ ] Meld terug met je pakketversie.`,
|
|
3395
|
+
},
|
|
3396
|
+
{
|
|
3397
|
+
number: 41,
|
|
3398
|
+
title: "Sets met onderdelen en verdeelmeldingen",
|
|
3399
|
+
date: "2026-10-12",
|
|
3400
|
+
summary: "Een set staat als één pakket op de kar met daaronder de onderdelen op het laagste niveau; groepen zijn al in leden uitgesplitst; meldingen letterlijk tonen.",
|
|
3401
|
+
body: `AANVULLING; bouwt voort op koppelprompt 40 en Pickschermen 1.0.25.
|
|
3402
|
+
Eerdere prompts blijven gelden.
|
|
3403
|
+
|
|
3404
|
+
INSTALLATIEVOLGORDE
|
|
3405
|
+
Eerst Logistiek Engine 1.0.116 installeren, daarna de nieuwe Pickschermen-versie.
|
|
3406
|
+
Draait de Engine nog niet op 1.0.116, dan ontbreken de onderdelen; toon dan
|
|
3407
|
+
"onderdelen onbekend" (zie punt 5).
|
|
3408
|
+
|
|
3409
|
+
BRON (de enige)
|
|
3410
|
+
- Lees de karrijen en onderdelen uit de bestaande functie
|
|
3411
|
+
pick_queue_cart_plan(queue_item_id) → carts[].items[].components.
|
|
3412
|
+
(Die functie haalt per order logistics_cart_slip_plan op; dezelfde rechten als
|
|
3413
|
+
nu, anon mag hem uitvoeren.)
|
|
3414
|
+
- GEEN directe tabeltoegang: lees order_cart_items, logistics_reservation_allocations
|
|
3415
|
+
of andere Engine-tabellen nooit rechtstreeks (geen .from(...)). Alleen via
|
|
3416
|
+
pick_queue_cart_plan.
|
|
3417
|
+
|
|
3418
|
+
WAT DE ENGINE AL HEEFT GEDAAN (live)
|
|
3419
|
+
- De karindeling gebruikt dezelfde verdeling als reservering en afboeken.
|
|
3420
|
+
- Een set gaat als één pakket in de kar (eigen afmeting/belading van de set).
|
|
3421
|
+
- carts[].items[].components (lijst) bij een setregel: per onderdeel
|
|
3422
|
+
{ trade_item_key, product_id, product_name, article_number, qty }. Het aantal
|
|
3423
|
+
is een heel getal en geldt voor de sets op díe kar. Bij een set binnen een set
|
|
3424
|
+
staan hier al de echte onderdelen op het laagste niveau. Bij andere regels is
|
|
3425
|
+
de lijst leeg.
|
|
3426
|
+
- carts[].items[].isSet (boolean): true bij een setregel, anders false. Ook true
|
|
3427
|
+
bij een setregel waarvan de onderdelen (nog) ontbreken.
|
|
3428
|
+
- Een groep is al in leden uitgesplitst: één kar-regel per lid.
|
|
3429
|
+
- warnings (lijst met tekst) in het resultaat van pick_queue_cart_plan:
|
|
3430
|
+
· warnings bovenaan: de meldingen van de rij (bij een rij met eigen kar alleen
|
|
3431
|
+
die van de order van die kar; bij een buffer alle orders, zonder dubbele);
|
|
3432
|
+
· orders[] = { orderId, orderNumber, warnings } per order in de rij.
|
|
3433
|
+
Alleen actuele meldingen; leeg ([]) als er niets speelt. Mogelijke teksten:
|
|
3434
|
+
"voorraadtekort op <lid> voor bevroren regel <order>; verdeling niet aangepast"
|
|
3435
|
+
en "groepsregel en ledenregels tegelijk; groepsregel niet meegeteld".
|
|
3436
|
+
|
|
3437
|
+
WAT JIJ BOUWT
|
|
3438
|
+
1. Setrij: toon de set als één pakket (naam, artikelnummer, aantal sets, kar)
|
|
3439
|
+
met daaronder ingesprongen de onderdelen uit components (onderdeel,
|
|
3440
|
+
artikelnummer, aantal). Niets zelf uitsplitsen of herberekenen.
|
|
3441
|
+
2. Afvinken gebeurt op de setrij (het aantal sets). Onderdelen zijn alleen
|
|
3442
|
+
informatie en krijgen geen eigen afvinkknop.
|
|
3443
|
+
3. Groepsleden zijn gewone rijen; toon geen groepshoofd als aparte rij.
|
|
3444
|
+
4. Toon de teksten uit warnings letterlijk bij de order of rij (orders[].warnings
|
|
3445
|
+
bij de betreffende order, anders warnings bovenaan). Lege lijst: niets tonen.
|
|
3446
|
+
Altijd Array.isArray vóór map. Zelf geen meldingen samenstellen.
|
|
3447
|
+
De melding "De kar van deze rij bestaat niet meer in het karplan; ververs de
|
|
3448
|
+
pickwachtrij" komt als fout van pick_queue_cart_plan; toon die letterlijk.
|
|
3449
|
+
5. isSet = true en components ontbreekt, is geen lijst of is leeg: toon
|
|
3450
|
+
"onderdelen onbekend" en laat afvinken gewoon toe. isSet = false: gewone
|
|
3451
|
+
regel, geen onderdelenblok en geen melding. Altijd Array.isArray vóór map/filter.
|
|
3452
|
+
6. Geen eigen voorraad- of reserveringslogica, geen schrijfacties op orderregels.
|
|
3453
|
+
7. Geen DELETE of UPDATE zonder WHERE (safeupdate staat aan).
|
|
3454
|
+
|
|
3455
|
+
WAT JE NIET DOET
|
|
3456
|
+
- Aantallen afleiden uit de setsamenstelling of groepen op naam herkennen.
|
|
3457
|
+
- De Engine-pakketversie aanpassen.
|
|
3458
|
+
- Geen URL's, sleutels, project-refs, klantnamen of vaste id's in code.
|
|
3459
|
+
|
|
3460
|
+
CONTROLELIJST
|
|
3461
|
+
[ ] Setrij met onderdelen, ook bij een set binnen een set.
|
|
3462
|
+
[ ] Onderdelen komen alleen uit pick_queue_cart_plan; geen .from() op Engine-tabellen.
|
|
3463
|
+
[ ] Groepsorder toont alleen ledenrijen.
|
|
3464
|
+
[ ] Tekortmelding en groepsmelding letterlijk zichtbaar, uit warnings; lege lijst toont niets.
|
|
3465
|
+
[ ] isSet true zonder onderdelen: "onderdelen onbekend", afvinken werkt; isSet false: gewone rij.
|
|
3466
|
+
[ ] Typecheck en build:lib geslaagd; meld terug met je pakketversie.`,
|
|
3467
|
+
},
|
|
3328
3468
|
],
|
|
3329
3469
|
},
|
|
3330
3470
|
scanners: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.117";
|
|
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.117";
|
|
@@ -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
|
+
}
|