@flowselections/logistiek-engine 1.0.120 → 1.0.123
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/BeheerPage.d.ts +2 -0
- package/dist-lib/components/BeheerPage.d.ts.map +1 -0
- package/dist-lib/components/BeheerPage.js +73 -0
- package/dist-lib/components/FlowPage.d.ts +1 -0
- package/dist-lib/components/FlowPage.d.ts.map +1 -1
- package/dist-lib/components/FlowPage.js +7 -1
- package/dist-lib/components/LogistiekEnginePage.d.ts.map +1 -1
- package/dist-lib/components/LogistiekEnginePage.js +14 -2
- package/dist-lib/components/ModulePromptsPage.d.ts +1 -0
- package/dist-lib/components/ModulePromptsPage.d.ts.map +1 -1
- package/dist-lib/components/ModulePromptsPage.js +7 -1
- package/dist-lib/components/RolPoort.d.ts +7 -0
- package/dist-lib/components/RolPoort.d.ts.map +1 -0
- package/dist-lib/components/RolPoort.js +12 -0
- package/dist-lib/components/RuleEnginePage.d.ts +2 -1
- package/dist-lib/components/RuleEnginePage.d.ts.map +1 -1
- package/dist-lib/components/RuleEnginePage.js +7 -1
- package/dist-lib/components/WerkwijzeHerindelingCard.d.ts.map +1 -1
- package/dist-lib/components/WerkwijzeHerindelingCard.js +2 -2
- package/dist-lib/hooks/useEngineRollen.d.ts +14 -0
- package/dist-lib/hooks/useEngineRollen.d.ts.map +1 -0
- package/dist-lib/hooks/useEngineRollen.js +50 -0
- package/dist-lib/index.d.ts +3 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +3 -0
- package/dist-lib/integrations/supabase/types.d.ts +461 -3
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/floridayPush.server.d.ts.map +1 -1
- package/dist-lib/lib/floridayPush.server.js +10 -0
- package/dist-lib/lib/handlers/logistics-tick.server.js +13 -0
- package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
- package/dist-lib/lib/modulePrompts.js +109 -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 +5 -0
- package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/shippingNoteQueue.server.js +61 -0
- package/package.json +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floridayPush.server.d.ts","sourceRoot":"","sources":["../../src/lib/floridayPush.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAc/C,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD;AAaD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,OAAO,2BAA2B,EAAE,WAAW,EAAE,CAAC;CACjE;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAUnE;;;;GAIG;AACH,wBAAsB,8BAA8B,CAClD,EAAE,EAAE,cAAc,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CACN;IACE,EAAE,EAAE,IAAI,CAAC;IACT,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,CAAC;IAC3E,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAC7C,CAoEA;AAED,8CAA8C;AAC9C,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAyHtB;AAQD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3F;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhG;AA6BD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"floridayPush.server.d.ts","sourceRoot":"","sources":["../../src/lib/floridayPush.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAc/C,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD;AAaD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,OAAO,2BAA2B,EAAE,WAAW,EAAE,CAAC;CACjE;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAUnE;;;;GAIG;AACH,wBAAsB,8BAA8B,CAClD,EAAE,EAAE,cAAc,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CACN;IACE,EAAE,EAAE,IAAI,CAAC;IACT,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,CAAC;IAC3E,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAC7C,CAoEA;AAED,8CAA8C;AAC9C,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAyHtB;AAQD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3F;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhG;AA6BD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,eAAe,CAAC,CAwL1B;AAQD,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F"}
|
|
@@ -280,6 +280,16 @@ export async function runFloridayPushQueue(sb, opts = {}) {
|
|
|
280
280
|
notApplicable: 0,
|
|
281
281
|
unknown: 0,
|
|
282
282
|
};
|
|
283
|
+
// Poort 0: alleen als de Engine de belading verstuurt (instelling
|
|
284
|
+
// belading_verstuurder = engine). Ontbreekt of anders: niets versturen.
|
|
285
|
+
try {
|
|
286
|
+
const { data } = await sb.rpc("logistics_belading_verstuurder");
|
|
287
|
+
if (data !== "engine")
|
|
288
|
+
return out;
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
return out;
|
|
292
|
+
}
|
|
283
293
|
// Poort 1: staat de schakelaar uit, dan verwerken we de wachtrij niet.
|
|
284
294
|
// Fail closed: onleesbaar betekent niet versturen.
|
|
285
295
|
try {
|
|
@@ -139,6 +139,19 @@ async function runTickRound(supabase, tickJob, ident) {
|
|
|
139
139
|
try {
|
|
140
140
|
const { runPlanQueue, prunePlanQueue } = await import("../planQueue.server.js");
|
|
141
141
|
plan = await runPlanQueue(supabase, { deadlineAt: Date.now() + 15000 });
|
|
142
|
+
// M12: een wek-aanroep kan net vóór de order zichtbaar of vrij is binnenkomen
|
|
143
|
+
// (rij nog vergrendeld door de aanmaakende transactie). Dan kort nawachten
|
|
144
|
+
// in plaats van tot de volgende minuutronde te wachten. Begrensd: max. 3 x.
|
|
145
|
+
for (let poging = 0; poging < 3; poging++) {
|
|
146
|
+
const claimed = Number(plan?.claimed ?? 0);
|
|
147
|
+
if (claimed > 0)
|
|
148
|
+
break;
|
|
149
|
+
const { data: due, error: dueError } = await supabase.rpc("logistics_plan_due_count");
|
|
150
|
+
if (dueError || Number(due ?? 0) === 0)
|
|
151
|
+
break;
|
|
152
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
153
|
+
plan = await runPlanQueue(supabase, { deadlineAt: Date.now() + 15000 });
|
|
154
|
+
}
|
|
142
155
|
await prunePlanQueue(supabase);
|
|
143
156
|
}
|
|
144
157
|
catch (e) {
|
|
@@ -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;AA6sJD,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"}
|
|
@@ -905,6 +905,79 @@ CONTROLELIJST
|
|
|
905
905
|
[ ] Een order zonder bufferpartners telt nog net zo als voorheen.
|
|
906
906
|
[ ] "Geen kar" verschijnt alleen als geen actieve regel op een kar ligt.`,
|
|
907
907
|
},
|
|
908
|
+
{
|
|
909
|
+
number: 20,
|
|
910
|
+
title: "Indelingsstatus per order tonen (Geen indeling)",
|
|
911
|
+
date: "2026-10-12",
|
|
912
|
+
withSharedContract: false,
|
|
913
|
+
summary: "Toon per order de indelingsstatus uit logistics_order_plan_coverage, ook voor orders op een gedeelde bufferkar.",
|
|
914
|
+
body: `WAAROM
|
|
915
|
+
Een order kan op een gedeelde bufferkar staan; de kar hangt dan aan de buffer
|
|
916
|
+
en niet aan de order. Tellen via order_carts.order_id geeft dan ten onrechte
|
|
917
|
+
"geen kar". De Engine levert nu per order één leesfunctie die dit wél goed doet.
|
|
918
|
+
|
|
919
|
+
WAT JE GEBRUIKT
|
|
920
|
+
select public.logistics_order_plan_coverage(<order-id>)
|
|
921
|
+
|
|
922
|
+
Antwoord (jsonb):
|
|
923
|
+
- state: ingedeeld | deels | geen_indeling | geen_regels; label in gewone taal
|
|
924
|
+
("Ingedeeld", "Deels ingedeeld", "Geen indeling").
|
|
925
|
+
- progressPct en reason.
|
|
926
|
+
- carts[]: cartId, cartNumber, bufferId, shared (gedeelde bufferkar),
|
|
927
|
+
carrierType, lines[] met alleen de regels van DEZE order (orderItemId,
|
|
928
|
+
productId, productName, crates, boxes).
|
|
929
|
+
- pickRows[]: queueItemId, documentNumber, cartId, printedAt, completedAt.
|
|
930
|
+
- pickStatus: geen_pickrij | open | bezig | gepickt; pickedAt bij gepickt.
|
|
931
|
+
|
|
932
|
+
REGELS
|
|
933
|
+
- Alleen voor ingelogde gebruikers (niet anoniem).
|
|
934
|
+
- Lees nooit zelf order_carts of order_cart_items; gebruik deze functie.
|
|
935
|
+
- Velden kunnen ontbreken of leeg zijn: altijd Array.isArray-controle.
|
|
936
|
+
- Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's in code
|
|
937
|
+
of migraties.
|
|
938
|
+
|
|
939
|
+
CONTROLELIJST
|
|
940
|
+
[ ] Verkoop toont per order het label; bij Geen indeling in rood met de reden.
|
|
941
|
+
[ ] Een order op een gedeelde bufferkar toont "Ingedeeld", niet "geen kar".
|
|
942
|
+
`,
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
number: 21,
|
|
946
|
+
title: "Indelingsstatus voor een lijst orders in één aanroep",
|
|
947
|
+
date: "2026-10-13",
|
|
948
|
+
withSharedContract: false,
|
|
949
|
+
summary: "Laad de indelingsstatus van een overzicht van orders met één aanroep van logistics_order_plan_coverage_list in plaats van één aanroep per order.",
|
|
950
|
+
body: `WAAROM
|
|
951
|
+
Prompt 20 levert de status per order. Een overzicht van honderden orders met
|
|
952
|
+
honderden losse aanroepen is traag (gemeten: 90 orders los ruim 15 seconden).
|
|
953
|
+
De lijstversie geeft dezelfde status voor maximaal 1.000 orders in één aanroep
|
|
954
|
+
(gemeten: 500 order-id's in circa 0,3 seconde).
|
|
955
|
+
|
|
956
|
+
WAT JE GEBRUIKT
|
|
957
|
+
supabase.rpc('logistics_order_plan_coverage_list', { p_order_ids: [<order-id>, ...] })
|
|
958
|
+
|
|
959
|
+
Antwoord: één rij per gevraagde order:
|
|
960
|
+
- order_id, order_number, buffer_id
|
|
961
|
+
- state: ingedeeld | deels | geen_indeling | geen_regels | onbekend
|
|
962
|
+
- label ("Ingedeeld", "Deels ingedeeld", "Geen indeling", "Geen regels", "Onbekend")
|
|
963
|
+
- progress_pct, reason (gewone taal, leeg bij Ingedeeld)
|
|
964
|
+
- cart_count, pick_row_count
|
|
965
|
+
- pick_status: geen_pickrij | open | bezig | gepickt; picked_at bij gepickt
|
|
966
|
+
Geen karren of regels; die haal je bij het openen van één order met prompt 20.
|
|
967
|
+
|
|
968
|
+
REGELS
|
|
969
|
+
- Alleen voor ingelogde gebruikers (niet anoniem).
|
|
970
|
+
- Maximaal 1.000 order-id's per aanroep; meer geeft een foutmelding. Splits in
|
|
971
|
+
stukken van hooguit 1.000.
|
|
972
|
+
- Altijd Array.isArray-controle op het antwoord.
|
|
973
|
+
- Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's in code.
|
|
974
|
+
|
|
975
|
+
CONTROLELIJST
|
|
976
|
+
[ ] Het orderoverzicht doet één aanroep per (stuk van) 1.000 orders.
|
|
977
|
+
[ ] Labels en status gelijk aan prompt 20 voor dezelfde order.
|
|
978
|
+
[ ] Geen indeling in rood met de reden.
|
|
979
|
+
`,
|
|
980
|
+
},
|
|
908
981
|
],
|
|
909
982
|
},
|
|
910
983
|
afhandeling: {
|
|
@@ -1808,6 +1881,42 @@ CONTROLELIJST
|
|
|
1808
1881
|
[ ] Een losgekoppelde order staat als aparte regel met eigen karren in de agenda's.
|
|
1809
1882
|
[ ] Afgehandelde karren houden hun nummer en blijven zichtbaar in de historie.`,
|
|
1810
1883
|
},
|
|
1884
|
+
{
|
|
1885
|
+
number: 20,
|
|
1886
|
+
title: "Karren, regels en pickstatus per order voor belading",
|
|
1887
|
+
date: "2026-10-12",
|
|
1888
|
+
withSharedContract: false,
|
|
1889
|
+
summary: "Gebruik logistics_order_plan_coverage voor karren, eigen regels, pickrij en gepickt-tijdstip per order (ook in een buffer).",
|
|
1890
|
+
body: `WAAROM
|
|
1891
|
+
Een order kan op een gedeelde bufferkar staan; de kar hangt dan aan de buffer
|
|
1892
|
+
en niet aan de order. Tellen via order_carts.order_id geeft dan ten onrechte
|
|
1893
|
+
"geen kar". De Engine levert nu per order één leesfunctie die dit wél goed doet.
|
|
1894
|
+
|
|
1895
|
+
WAT JE GEBRUIKT
|
|
1896
|
+
select public.logistics_order_plan_coverage(<order-id>)
|
|
1897
|
+
|
|
1898
|
+
Antwoord (jsonb):
|
|
1899
|
+
- state: ingedeeld | deels | geen_indeling | geen_regels; label in gewone taal
|
|
1900
|
+
("Ingedeeld", "Deels ingedeeld", "Geen indeling").
|
|
1901
|
+
- progressPct en reason.
|
|
1902
|
+
- carts[]: cartId, cartNumber, bufferId, shared (gedeelde bufferkar),
|
|
1903
|
+
carrierType, lines[] met alleen de regels van DEZE order (orderItemId,
|
|
1904
|
+
productId, productName, crates, boxes).
|
|
1905
|
+
- pickRows[]: queueItemId, documentNumber, cartId, printedAt, completedAt.
|
|
1906
|
+
- pickStatus: geen_pickrij | open | bezig | gepickt; pickedAt bij gepickt.
|
|
1907
|
+
|
|
1908
|
+
REGELS
|
|
1909
|
+
- Alleen voor ingelogde gebruikers (niet anoniem).
|
|
1910
|
+
- Lees nooit zelf order_carts of order_cart_items; gebruik deze functie.
|
|
1911
|
+
- Velden kunnen ontbreken of leeg zijn: altijd Array.isArray-controle.
|
|
1912
|
+
- Geen URL's, sleutels, project-refs, klantnamen of vaste database-id's in code
|
|
1913
|
+
of migraties.
|
|
1914
|
+
|
|
1915
|
+
CONTROLELIJST
|
|
1916
|
+
[ ] Belading per verkooporder gebruikt carts[].lines van deze order, ook in een buffer.
|
|
1917
|
+
[ ] Een order op een gedeelde bufferkar toont "Ingedeeld", niet "geen kar".
|
|
1918
|
+
`,
|
|
1919
|
+
},
|
|
1811
1920
|
],
|
|
1812
1921
|
},
|
|
1813
1922
|
pickschermen: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const MODULE_VERSION = "1.0.
|
|
1
|
+
export declare const MODULE_VERSION = "1.0.123";
|
|
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.123";
|
|
@@ -15,4 +15,9 @@ export interface ShippingNoteRun {
|
|
|
15
15
|
export declare function runShippingNoteQueue(sb: SupabaseClient, options?: {
|
|
16
16
|
limit?: number;
|
|
17
17
|
}): Promise<ShippingNoteRun>;
|
|
18
|
+
export type BeladingVerstuurder = "engine" | "afhandeling" | null;
|
|
19
|
+
/** Leest module_runtime_config.belading_verstuurder. Onleesbaar of ongeldig = null (fail closed). */
|
|
20
|
+
export declare function leesBeladingVerstuurder(sb: SupabaseClient): Promise<BeladingVerstuurder>;
|
|
21
|
+
export declare function parseBeladingVerstuurder(value: unknown): BeladingVerstuurder;
|
|
22
|
+
export declare function beladingWachtReden(verstuurder: BeladingVerstuurder): string;
|
|
18
23
|
//# sourceMappingURL=shippingNoteQueue.server.d.ts.map
|
|
@@ -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;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,
|
|
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,CA2b1B;AAMD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;AAElE,qGAAqG;AACrG,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAQ9F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAG5E;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,mBAAmB,GAAG,MAAM,CAI3E"}
|
|
@@ -123,6 +123,20 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
123
123
|
nextStep: "Gaat vanzelf verder na een goedgekeurde controlescan met de poort open",
|
|
124
124
|
});
|
|
125
125
|
};
|
|
126
|
+
// Belading is (nog) niet door Afhandeling verstuurd: wachten zonder poging.
|
|
127
|
+
const houdVastBelading = async (reden) => {
|
|
128
|
+
await sb.rpc("logistics_slip_note_hold_belading", { _id: row.id, _reason: reden });
|
|
129
|
+
run.waiting++;
|
|
130
|
+
await trace(sb, {
|
|
131
|
+
...basis,
|
|
132
|
+
step: "Wacht op belading door Afhandeling",
|
|
133
|
+
status: "wachtend",
|
|
134
|
+
decision: "wacht_op_belading",
|
|
135
|
+
reason: reden,
|
|
136
|
+
rule: "De Engine verstuurt geen belading; Afhandeling doet dat (instelling belading_verstuurder)",
|
|
137
|
+
nextStep: "Over 2 minuten opnieuw kijken of Floriday de verzendbrief heeft",
|
|
138
|
+
});
|
|
139
|
+
};
|
|
126
140
|
const wacht = async (reden, klasse) => {
|
|
127
141
|
const code = definitieveFout(reden);
|
|
128
142
|
if (code) {
|
|
@@ -196,7 +210,28 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
196
210
|
// al een fulfillment-order voor deze pakbon, dan wordt er geen tweede
|
|
197
211
|
// aangemaakt.
|
|
198
212
|
let bestaandeFo = String(row.fulfillment_order_id ?? "").trim() || null;
|
|
213
|
+
// Wie verstuurt de belading (fulfillment-order)? Alleen bij 'engine' doet
|
|
214
|
+
// de Engine stap 1. Ontbreekt of ongeldig: fail closed, niets versturen.
|
|
215
|
+
let wachtOpBelading = null;
|
|
199
216
|
if (!bestaandeFo) {
|
|
217
|
+
const verstuurder = await leesBeladingVerstuurder(sb);
|
|
218
|
+
if (verstuurder !== "engine") {
|
|
219
|
+
wachtOpBelading = beladingWachtReden(verstuurder);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (!bestaandeFo && wachtOpBelading) {
|
|
223
|
+
// Goedgekeurde controlescan blijft vereist (ook Floriday-authenticatie eist hem).
|
|
224
|
+
const { data: goedgekeurd } = await sb.rpc("logistics_floriday_order_approved", {
|
|
225
|
+
_order_ref: row.order_number,
|
|
226
|
+
});
|
|
227
|
+
if (goedgekeurd !== true) {
|
|
228
|
+
await houdVast("Wacht op een goedgekeurde controlescan; daarna verstuurt Afhandeling de belading.");
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Geen stap 1 en geen stap 2 zonder fulfillment-order: door naar stap 3
|
|
232
|
+
// (alleen lezen). Is de verzendbrief er nog niet, dan wachten zonder poging.
|
|
233
|
+
}
|
|
234
|
+
else if (!bestaandeFo) {
|
|
200
235
|
// Pas ná een goedgekeurde controlescan laten aanmaken.
|
|
201
236
|
const { data: goedgekeurd, error: goedError } = await sb.rpc("logistics_floriday_order_approved", {
|
|
202
237
|
_order_ref: row.order_number,
|
|
@@ -290,6 +325,11 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
290
325
|
if (!doc["ok"]) {
|
|
291
326
|
const message = String(doc["error"] ?? "") ||
|
|
292
327
|
"Wachten op officiële Floriday-afleverbrief: Floriday heeft het document nog niet aangemaakt.";
|
|
328
|
+
if (wachtOpBelading) {
|
|
329
|
+
// Belading is van Afhandeling: wachten verbruikt geen pogingen.
|
|
330
|
+
await houdVastBelading(`${wachtOpBelading} Laatste antwoord van Floriday: ${message}`);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
293
333
|
await wacht(message, classifyFloridayReason(message));
|
|
294
334
|
continue;
|
|
295
335
|
}
|
|
@@ -378,3 +418,24 @@ export async function runShippingNoteQueue(sb, options = {}) {
|
|
|
378
418
|
}
|
|
379
419
|
return run;
|
|
380
420
|
}
|
|
421
|
+
/** Leest module_runtime_config.belading_verstuurder. Onleesbaar of ongeldig = null (fail closed). */
|
|
422
|
+
export async function leesBeladingVerstuurder(sb) {
|
|
423
|
+
try {
|
|
424
|
+
const { data, error } = await sb.rpc("logistics_belading_verstuurder");
|
|
425
|
+
if (error)
|
|
426
|
+
return null;
|
|
427
|
+
return parseBeladingVerstuurder(data);
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
export function parseBeladingVerstuurder(value) {
|
|
434
|
+
const v = typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
435
|
+
return v === "engine" || v === "afhandeling" ? v : null;
|
|
436
|
+
}
|
|
437
|
+
export function beladingWachtReden(verstuurder) {
|
|
438
|
+
return verstuurder === "afhandeling"
|
|
439
|
+
? "Wacht op belading door Afhandeling."
|
|
440
|
+
: "De instelling belading_verstuurder ontbreekt of is ongeldig; de Engine verstuurt geen belading.";
|
|
441
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/logistiek-engine",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.123",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "logistiek-engine",
|
|
6
6
|
"pages": [
|
|
@@ -47,6 +47,11 @@
|
|
|
47
47
|
"export": "PlanWachtrijPage",
|
|
48
48
|
"route": "logistiek-engine/wachtrij",
|
|
49
49
|
"title": "Wachtrij"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"export": "BeheerPage",
|
|
53
|
+
"route": "logistiek-engine/beheer",
|
|
54
|
+
"title": "Beheer"
|
|
50
55
|
}
|
|
51
56
|
],
|
|
52
57
|
"serverRoutes": [
|