@flowselections/logistiek-engine 1.0.151 → 1.0.155

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 (34) hide show
  1. package/dist-lib/components/AutomatischVersturenCard.d.ts.map +1 -1
  2. package/dist-lib/components/AutomatischVersturenCard.js +1 -1
  3. package/dist-lib/components/BeheerPage.d.ts.map +1 -1
  4. package/dist-lib/components/BeheerPage.js +2 -1
  5. package/dist-lib/components/ConsistentieCard.d.ts.map +1 -1
  6. package/dist-lib/components/ConsistentieCard.js +1 -1
  7. package/dist-lib/components/OpruimlijstKarrenCard.d.ts +2 -0
  8. package/dist-lib/components/OpruimlijstKarrenCard.d.ts.map +1 -0
  9. package/dist-lib/components/OpruimlijstKarrenCard.js +42 -0
  10. package/dist-lib/hooks/useWerkwijzeStatus.d.ts.map +1 -1
  11. package/dist-lib/hooks/useWerkwijzeStatus.js +28 -2
  12. package/dist-lib/integrations/supabase/types.d.ts +588 -0
  13. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  14. package/dist-lib/lib/autoSend.d.ts +1 -0
  15. package/dist-lib/lib/autoSend.d.ts.map +1 -1
  16. package/dist-lib/lib/autoSend.functions.d.ts +1 -0
  17. package/dist-lib/lib/autoSend.functions.d.ts.map +1 -1
  18. package/dist-lib/lib/autoSend.functions.js +2 -0
  19. package/dist-lib/lib/autoSend.js +3 -0
  20. package/dist-lib/lib/autoSend.server.d.ts.map +1 -1
  21. package/dist-lib/lib/autoSend.server.js +9 -0
  22. package/dist-lib/lib/floridayCartCarriers.js +1 -1
  23. package/dist-lib/lib/floridayPush.server.js +1 -1
  24. package/dist-lib/lib/handlers/logistics-tick.server.js +8 -0
  25. package/dist-lib/lib/modulePrompts.d.ts.map +1 -1
  26. package/dist-lib/lib/modulePrompts.js +279 -0
  27. package/dist-lib/lib/moduleVersion.d.ts +1 -1
  28. package/dist-lib/lib/moduleVersion.js +1 -1
  29. package/dist-lib/lib/ruleEngineSchema.d.ts.map +1 -1
  30. package/dist-lib/lib/ruleEngineSchema.js +8 -1
  31. package/dist-lib/lib/shippingNoteQueue.server.d.ts.map +1 -1
  32. package/dist-lib/lib/shippingNoteQueue.server.js +10 -7
  33. package/dist-lib/lib/stickerRules.js +1 -1
  34. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  export declare const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
2
2
  export declare const AUTO_SEND_WACHTTIJDEN_MIN: readonly [1, 5, 15, 60];
3
3
  export declare const AUTO_SEND_MAX_POGINGEN = 5;
4
+ export declare const AUTO_SEND_ROUTE_ONTBREEKT = "Het adres voor automatisch versturen bestaat niet in deze Shell. Werk Afhandeling bij en publiceer de Shell opnieuw.";
4
5
  export declare const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
5
6
  export declare function normaliseerShellAdres(v: unknown): string | null;
6
7
  export declare function autoSendBody(orderId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"autoSend.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,4CAA4C,CAAC;AACxE,eAAO,MAAM,yBAAyB,yBAA0B,CAAC;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,qBAAqB,+DAA+D,CAAC;AAElG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AASD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5G;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAoBpG"}
1
+ {"version":3,"file":"autoSend.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,4CAA4C,CAAC;AACxE,eAAO,MAAM,yBAAyB,yBAA0B,CAAC;AACjE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,yBAAyB,yHACkF,CAAC;AACzH,eAAO,MAAM,qBAAqB,+DAA+D,CAAC;AAElG,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AASD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5G;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEvG;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAqBpG"}
@@ -6,5 +6,6 @@ export declare const getAutoSendConfig: import("@tanstack/start-client-core").Op
6
6
  sleutelOpTeHalen: boolean;
7
7
  sleutelReden: string | null;
8
8
  adresAanwezig: boolean;
9
+ routeOntbreekt: boolean;
9
10
  }>>;
10
11
  //# sourceMappingURL=autoSend.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"autoSend.functions.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.functions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;sBAEmB,OAAO;kBAAgB,MAAM,GAAG,IAAI;mBAAiB,OAAO;GAWzG,CAAC"}
1
+ {"version":3,"file":"autoSend.functions.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.functions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;sBAEmB,OAAO;kBAAgB,MAAM,GAAG,IAAI;mBAAiB,OAAO;oBAAkB,OAAO;GAalI,CAAC"}
@@ -10,9 +10,11 @@ export const getAutoSendConfig = createServerFn({ method: "GET" })
10
10
  const { haalAutoSendSleutel } = await import("./centralSecrets.server.js");
11
11
  const s = await haalAutoSendSleutel();
12
12
  const adres = await leesShellAdres(supabaseAdmin);
13
+ const { data: ontbreekt } = await supabaseAdmin.rpc("logistics_auto_send_route_missing");
13
14
  return {
14
15
  sleutelOpTeHalen: s.sleutel !== null,
15
16
  sleutelReden: s.sleutel === null ? s.reden : null,
16
17
  adresAanwezig: adres !== null,
18
+ routeOntbreekt: ontbreekt === true,
17
19
  };
18
20
  });
@@ -10,6 +10,7 @@
10
10
  export const AUTO_SEND_PATH = "/api/public/hooks/afhandeling-auto-send";
11
11
  export const AUTO_SEND_WACHTTIJDEN_MIN = [1, 5, 15, 60];
12
12
  export const AUTO_SEND_MAX_POGINGEN = 5;
13
+ export const AUTO_SEND_ROUTE_ONTBREEKT = "Het adres voor automatisch versturen bestaat niet in deze Shell. Werk Afhandeling bij en publiceer de Shell opnieuw.";
13
14
  export const AUTO_SEND_ADRES_REDEN = "Automatisch versturen niet mogelijk: Shell-adres ontbreekt";
14
15
  export function normaliseerShellAdres(v) {
15
16
  if (typeof v !== "string")
@@ -63,6 +64,8 @@ export function beoordeelAntwoord(status, tekst) {
63
64
  return { soort: "verstuurd", reden: null };
64
65
  const delen = [code, fout].filter((x) => !!x && x.trim() !== "");
65
66
  const reden = (delen.length ? delen.join(": ") : `Afhandeling antwoordde ${status}`).slice(0, 300);
67
+ if (status === 404)
68
+ return { soort: "definitief", reden: AUTO_SEND_ROUTE_ONTBREEKT };
66
69
  if (status === 400 || status === 422)
67
70
  return { soort: "definitief", reden };
68
71
  return { soort: "opnieuw", reden };
@@ -1 +1 @@
1
- {"version":3,"file":"autoSend.server.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;GA0DvF"}
1
+ {"version":3,"file":"autoSend.server.d.ts","sourceRoot":"","sources":["../../src/lib/autoSend.server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAW5D,uFAAuF;AACvF,wBAAsB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/E;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;GAkEvF"}
@@ -55,6 +55,15 @@ export async function runAutoSendQueue(sb, opts = {}) {
55
55
  if (uitkomst.soort === "verstuurd") {
56
56
  run.sent++;
57
57
  await finish(true, null, res.status);
58
+ // Zelfde route als na handmatig versturen: verzendbrief direct klaarzetten.
59
+ try {
60
+ await sb.rpc("logistics_shipping_note_ensure_accepted", { p_order_id: row.order_id, p_limit: 50 });
61
+ const { runShippingNoteQueue } = await import("./shippingNoteQueue.server.js");
62
+ await runShippingNoteQueue(sb, { limit: 10 });
63
+ }
64
+ catch {
65
+ /* de minuutronde pakt het alsnog op */
66
+ }
58
67
  }
59
68
  else if (uitkomst.soort === "definitief") {
60
69
  run.definitief++;
@@ -140,6 +140,6 @@ export function decideFulfillmentStatus(result) {
140
140
  kind: "wachten",
141
141
  status: status || null,
142
142
  tijdelijk: false,
143
- reden: `Floriday verwerkt de fulfillment-order nog (status ${status || "onbekend"}).`,
143
+ reden: "Floriday is de levering nog aan het verwerken.",
144
144
  };
145
145
  }
@@ -56,7 +56,7 @@ export async function findDeliveryOrderForSalesOrder(sb, salesOrderId) {
56
56
  return {
57
57
  ok: false,
58
58
  code: "delivery_order_not_found_local",
59
- error: `Nog geen delivery-order in de cache voor sales-order ${salesOrderId}. De push wacht tot de synchronisatie hem binnenhaalt.`,
59
+ error: "Floriday heeft de levering voor deze order nog niet aangemaakt. Het systeem probeert het automatisch opnieuw.",
60
60
  };
61
61
  }
62
62
  if (rows.length > 1) {
@@ -239,6 +239,14 @@ async function runTickRound(supabase, tickJob, ident) {
239
239
  catch {
240
240
  /* vrijgeven mag de ronde niet blokkeren */
241
241
  }
242
+ // 1.0.153: belading door Floriday geaccepteerd (op welke manier ook
243
+ // verstuurd)? Dan per kar een verzendbriefaanvraag klaarzetten.
244
+ try {
245
+ await supabase.rpc("logistics_shipping_note_ensure_accepted", { p_order_id: null, p_limit: 100 });
246
+ }
247
+ catch {
248
+ /* mag de ronde niet blokkeren */
249
+ }
242
250
  const { runShippingNoteQueue } = await import("../shippingNoteQueue.server.js");
243
251
  if (typeof runShippingNoteQueue !== "function") {
244
252
  throw new Error("Deze versie van de Logistiek Engine bevat geen verzendbriefverwerking. Werk de module bij.");
@@ -1 +1 @@
1
- {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAuwKD,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"}
1
+ {"version":3,"file":"modulePrompts.d.ts","sourceRoot":"","sources":["../../src/lib/modulePrompts.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;CAKvB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,oBAAoB,CAAC;AAKhE,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAmiLD,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"}
@@ -1016,6 +1016,40 @@ CONTROLELIJST
1016
1016
  [ ] Geen eigen ladingdragercontrole meer.
1017
1017
  [ ] Nieuwe Floriday-order die wel wordt ingedeeld: geen mail.
1018
1018
  [ ] Mail noemt de koper als klant.
1019
+ [ ] Meld terug met je pakketversie.`,
1020
+ },
1021
+ {
1022
+ number: 23,
1023
+ title: "Buffertotalen in logistics_order_plan_coverage_list",
1024
+ date: "2026-10-16",
1025
+ summary: "Nieuwe kolommen buffer_order_count en buffer_cart_count; tel karren per gecombineerde order, niet per order.",
1026
+ body: `KOPPELPROMPT VERKOOP 23 – vereist Logistiek Engine 1.0.153
1027
+
1028
+ WAAROM
1029
+ Verkoop telde karren per order op (FO-2601428 + FO-2601429: 3 in plaats van 2)
1030
+ en elke order kreeg "gedeeld" omdat buffer_id altijd gevuld is.
1031
+
1032
+ WAT ER IS
1033
+ public.logistics_order_plan_coverage_list(p_order_ids uuid[]) heeft twee extra
1034
+ kolommen; de bestaande kolommen en hun volgorde zijn ongewijzigd:
1035
+ - buffer_order_count int – aantal orders in dezelfde gecombineerde order
1036
+ (niet verwijderd, niet geannuleerd); 1 = losse order
1037
+ - buffer_cart_count int – aantal unieke karren van de hele gecombineerde order
1038
+ (een gedeelde kar telt één keer)
1039
+ Rechten ongewijzigd: alleen ingelogde gebruikers (authenticated, service_role).
1040
+
1041
+ WAT JIJ DOET
1042
+ 1. Toon "gedeeld" alleen als buffer_order_count > 1, niet op buffer_id.
1043
+ 2. Toon het aantal karren van een gecombineerde order uit buffer_cart_count;
1044
+ tel cart_count van de losse orders niet bij elkaar op.
1045
+ 3. Maximaal 1000 order-id's per aanroep, zoals nu.
1046
+
1047
+ REGELS
1048
+ - Match op id. Geen omgevingswaarden. Wijzig geen Engine-functies of -rechten.
1049
+
1050
+ CONTROLELIJST
1051
+ [ ] Buffer met 2 orders en 2 karren: beide orders tonen 2 karren, "gedeeld".
1052
+ [ ] Losse order: geen "gedeeld".
1019
1053
  [ ] Meld terug met je pakketversie.`,
1020
1054
  },
1021
1055
  ],
@@ -2096,6 +2130,98 @@ CENTRAL_AUTH_URL ontbreekt — poging 0 van 5".
2096
2130
  CONTROLELIJST
2097
2131
  [ ] Antwoord bevat code (of status) en error zoals hierboven.
2098
2132
  [ ] Handtekening van de Engine wordt geaccepteerd met dezelfde sleutel.
2133
+ [ ] Meld terug met je pakketversie.`,
2134
+ },
2135
+ {
2136
+ number: 25,
2137
+ title: "Zelfde vertrek als de planning: vervoerder, momentsleutel en vertrek per kar",
2138
+ date: "2026-10-16",
2139
+ summary: "Lees order_carts.carrier_id, pickup_moment_key, departure_at en late_signup over voor de aanmeldmail.",
2140
+ body: `KOPPELPROMPT AFHANDELING 25 – vereist Logistiek Engine 1.0.153
2141
+
2142
+ WAAROM
2143
+ De aanmeldmail en de planning moeten altijd hetzelfde vertrek gebruiken. De
2144
+ Engine rekent nu het vertrek met jouw regel uit planning.ts en legt het per
2145
+ kar vast.
2146
+
2147
+ WAT DE ENGINE DOET (alleen lezen in carriers)
2148
+ - Vervoerder per order, op id: eerst orders.custom_fields->>'carrier' (bestaat de
2149
+ vervoerder), dan het werkgebied zoals jouw afh_signup_groups, dan de
2150
+ standaardvervoerder (is_default).
2151
+ - Regel: bezorgdag = dag 0; per moment pickup_days en signup_days in WERKdagen
2152
+ terugtellen; kies het eerstvolgende moment waarvan de aanmelddeadline op het
2153
+ binnenkomstmoment van de order nog niet voorbij was; alle deadlines voorbij:
2154
+ het laatste moment, gemarkeerd "te laat aangemeld".
2155
+ - Werkdagen en tijdzone komen uit de instellingen bij Werktijden (pickwerkdagen),
2156
+ niet vast ma–vr.
2157
+ - Een moment zonder pickup_time of signup_time wordt overgeslagen; jij vult nu
2158
+ 16:00/17:30 in. Voorstel: neem de Engine-regel over (geen standaardtijd).
2159
+
2160
+ NIEUWE KOLOMMEN IN order_carts (gevuld door de Engine)
2161
+ - carrier_id uuid
2162
+ - pickup_moment_key text, formaat "<pickup_days>@<pickup_time>|<signup_days>@<signup_time>", bijv. "1@15:00|1@13:00"
2163
+ - departure_at timestamptz (berekend vertrek)
2164
+ - late_signup boolean
2165
+ pickup_moment_id blijft leeg (carriers.pickup_moments heeft geen id per moment).
2166
+ Een kar met pickup_locked = true wordt niet overschreven.
2167
+
2168
+ WAT JIJ DOET
2169
+ 1. Lees voor de aanmeldmail per kar carrier_id, pickup_moment_key en departure_at
2170
+ uit order_carts, op kar-id. Groepeer daarop; reken niet zelf opnieuw.
2171
+ 2. Ontbreekt departure_at (oude orders): val terug op je huidige berekening en
2172
+ toon in "Details voor beheer" dat de planning nog niets vastlegde.
2173
+ 3. Toon late_signup als "te laat aangemeld".
2174
+ 4. Vervang in afh_subtract_workdays de vaste ma–vr door de pickwerkdagen
2175
+ (public.logistics_is_pick_workday(date)), zodat beide kanten dezelfde dagen tellen.
2176
+
2177
+ VERZENDBRIEF
2178
+ Na een geaccepteerde belading (automatisch, handmatig of buffer) zet de Engine
2179
+ nu zelf per kar de Floriday-verzendbrief klaar. Je hoeft niets extra aan te
2180
+ roepen; de route logistics-shipping-note-now blijft werken.
2181
+
2182
+ REGELS
2183
+ - Match op id. Geen omgevingswaarden. Wijzig geen Engine-functies of -rechten.
2184
+
2185
+ CONTROLELIJST
2186
+ [ ] Order levering maandag, geplaatst vrijdag vóór 13:00: mail en planning "vr 15:00".
2187
+ [ ] Na 13:00 geplaatst: "te laat aangemeld", nooit een dag zonder ophaalmoment.
2188
+ [ ] Mail gebruikt departure_at uit order_carts.
2189
+ [ ] Meld terug met je pakketversie.`,
2190
+ },
2191
+ {
2192
+ number: 26,
2193
+ title: "Werkdagen alleen via logistics_is_pick_workday (incl. afwijkende dagen)",
2194
+ date: "2026-10-16",
2195
+ summary: "Gebruik voor de aanmeldmail uitsluitend public.logistics_is_pick_workday(date) als werkdagbron.",
2196
+ body: `KOPPELPROMPT AFHANDELING 26 – vereist Logistiek Engine 1.0.154
2197
+
2198
+ WAAROM
2199
+ Werkdagen moeten op één plek worden bepaald. Vanaf 1.0.154 neemt de Engine
2200
+ ook de "Afwijkende dagen" uit Werktijden mee.
2201
+
2202
+ WAT public.logistics_is_pick_workday(p_date date) RETURNS boolean NU DOET
2203
+ 1. Afwijkende dag als gesloten ingesteld → false.
2204
+ 2. Afwijkende dag met geldige tijden (sluit > opent) → true, ook op een dag
2205
+ die normaal dicht is (bijv. zaterdag).
2206
+ 3. Geen afwijkende dag → true als de weekdag in de pickwerkdagen van de
2207
+ werkwijze staat ÉN er een actief openingsvenster in Werktijden is.
2208
+ 4. Tijdzone ontbreekt in Werktijden → fout (fail closed), geen standaard.
2209
+ Naam, argument, returntype en rechten zijn ongewijzigd.
2210
+ De tijden van een afwijkende dag staan in public.logistics_day_windows(date).
2211
+
2212
+ WAT JIJ DOET
2213
+ 1. Gebruik in afh_subtract_workdays en overal in de aanmeldmail uitsluitend
2214
+ public.logistics_is_pick_workday(date) om werkdagen te tellen. Haal eigen
2215
+ weekdaglijsten (ma–vr) en eigen feestdaglogica weg.
2216
+ 2. Vang de fout bij ontbrekende tijdzone af en toon die in "Details voor
2217
+ beheer"; reken niet door met een standaard.
2218
+
2219
+ REGELS
2220
+ - Wijzig geen Engine-functies of -rechten. Geen omgevingswaarden.
2221
+
2222
+ CONTROLELIJST
2223
+ [ ] Maandag als gesloten afwijkende dag: aanmelddeadline en ophaalmoment schuiven naar de vorige werkdag, gelijk aan de planning.
2224
+ [ ] Zaterdag met afwijkende tijden telt als werkdag.
2099
2225
  [ ] Meld terug met je pakketversie.`,
2100
2226
  },
2101
2227
  ],
@@ -3898,6 +4024,123 @@ REGELS
3898
4024
  CONTROLELIJST
3899
4025
  [ ] Bij een net geprinte pakbon verschijnt geen "tijdelijk niet bereikbaar" meer.`,
3900
4026
  },
4027
+ {
4028
+ number: 46,
4029
+ title: "Vaste karnummering, wachtende deelkar en verzendstatus",
4030
+ date: "2026-10-16",
4031
+ summary: "Kar X van Y is overal gelijk, een wachtende deelkar blijft zichtbaar maar is niet printbaar tot wachtTot, en nieuwe leesfunctie pickstation_auto_send_status.",
4032
+ body: `KOPPELPROMPT PICKSCHERMEN 46 — vereist Logistiek Engine 1.0.152.
4033
+ Eerst de Engine installeren, daarna de nieuwe Pickschermen-versie.
4034
+
4035
+ 1. VASTE NUMMERING (geen wijziging in veldnamen)
4036
+ Een kar houdt na indeling altijd hetzelfde nummer, ook als andere karren al
4037
+ geprint of gescand zijn. Overal gelijk:
4038
+ - pick_queue: document_number "PB-<order>-K<n>", payload.cartSeq, payload.cartIndex,
4039
+ payload.cartTotal, payload.totalCarts, payload.cartLabel ("Kar n van N").
4040
+ - pick_queue_cart_plan(_queue_item_id): root totalCarts = root cartTotal = N,
4041
+ carts[0].cartSeq/cartTotal/cartLabel gelijk aan de regel.
4042
+ - logistics_cart_plan_status: totalCarts = N; pickMode is nu een object
4043
+ ({ pickMode, cartsPerPrint, showCartControl, autoSendLoading }), geen tekst meer.
4044
+ Je mag de kar blijven weggooien als cartTotal van de kar ≠ cartTotal van de root;
4045
+ dat komt niet meer voor.
4046
+ Items in carts[].items hebben nu orderId en orderNumber; belongsToOrder hoort bij
4047
+ de order die het meeste op die kar heeft (carts[].orderId).
4048
+ Meldingen (warnings, zoals een voorraadtekort) staan alleen nog in het karplan
4049
+ van kar 1 van een order.
4050
+
4051
+ 2. WACHTENDE DEELKAR (nieuw)
4052
+ Een deelkar die nog wacht staat nu als regel in de wachtrij in plaats van te
4053
+ ontbreken. Velden in payload én in pick_queue_cart_plan (root):
4054
+ - printbaar boolean; false zolang de kar wacht
4055
+ - wachtTot tijdstip (ISO, UTC) tot wanneer de kar wacht, of null
4056
+ - wachtReden tekst voor de medewerker, bijv. "Deelkar wacht tot 22:40 op mogelijke aanvulling."
4057
+ Toon zo'n regel grijs met de tekst "Deelkar wacht tot HH:MM op mogelijke
4058
+ aanvulling" (HH:MM in de tijdzone van de vestiging; wachtReden bevat die tekst al).
4059
+ Print een regel met printbaar = false NOOIT, ook niet bij "alles printen". Zodra
4060
+ de wachttijd voorbij is, zet de Engine printbaar op true bij de volgende ronde.
4061
+ due_at van de regel is gelijk aan wachtTot.
4062
+
4063
+ 3. AFGESLOTEN REGELS
4064
+ De Engine verwijdert geen pickregels meer, maar sluit ze af:
4065
+ - kar gescand/afgemeld → completed_at
4066
+ - kar vervallen door herindeling, of order geannuleerd/verwijderd → cancelled_at
4067
+ Blijf regels met completed_at of cancelled_at verbergen.
4068
+
4069
+ 4. NIEUWE LEESFUNCTIE pickstation_auto_send_status(p_slug text, p_order_id uuid) returns jsonb
4070
+ Zonder login, alleen lezen. Toegang alleen als p_slug een actief pickstation is en
4071
+ de order in een niet-geannuleerde regel van dat station staat (payload.orderId of
4072
+ payload.orderIds) — zelfde controle als pickstation_order_sticker_meldingen.
4073
+ Met toegang:
4074
+ { toegang: true, status: { status, sentAt, sentHow, nextAttemptAt, attempts,
4075
+ maxAttempts, orderId, orderIds, bufferId, routeOntbreekt, tekst } }
4076
+ status: geen | wachtend | bezig | verstuurd | mislukt
4077
+ sentHow: automatisch | handmatig (alleen bij verstuurd)
4078
+ tekst: kant-en-klare zin voor de medewerker
4079
+ Zonder toegang: { toegang: false, reden } met reden
4080
+ onbekend_of_inactief_station | niet_in_wachtrij_station.
4081
+ Bij een buffer is er één verzendtaak voor alle orders; elke order van de buffer
4082
+ geeft dezelfde status.
4083
+
4084
+ 5. REGELS
4085
+ - Match altijd op id, nooit op naam. Niets hardcoded.
4086
+ - Wijzig geen rechten of RLS.
4087
+
4088
+ CONTROLELIJST
4089
+ [ ] Buffer van 2 karren: na print+scan kar 1 blijft "PB-…-K2 · Kar 2 van 2" staan.
4090
+ [ ] Wachtende deelkar is zichtbaar met "wacht tot", niet printbaar.
4091
+ [ ] pickstation_auto_send_status toont "Verstuurd (handmatig) om …" na handmatig versturen.
4092
+ [ ] Meld terug met je pakketversie.`,
4093
+ },
4094
+ {
4095
+ number: 47,
4096
+ title: "Velden per kar: fust, vertrek, begin pickvenster en reden",
4097
+ date: "2026-10-16",
4098
+ summary: "pickStartsAt/reasonCode in de karplanstatus; cartCrates/departureAt in pickregel en karplan.",
4099
+ body: `KOPPELPROMPT PICKSCHERMEN 47 – vereist Logistiek Engine 1.0.153
4100
+
4101
+ WAAROM
4102
+ Het pickstation moet tonen wanneer een kar vertrekt, hoeveel fust er op déze
4103
+ kar staat en wanneer het picken begint, zonder zelf tijden af te leiden.
4104
+
4105
+ NIEUWE VELDEN (ontbrekende waarde = null, nooit een terugvalwaarde)
4106
+ 1. logistics_cart_plan_status(p_ref) (en dus ook de openbare variant):
4107
+ - pickStartsAt: ISO-tijd in UTC, begin van het pickvenster, of null
4108
+ - reasonCode: 'pick_window_not_started' | 'not_released' | 'plan_missing' | 'ready'
4109
+ - reason blijft bestaan (tekst voor de medewerker)
4110
+ 2. pick_queue.payload (alleen karregels van de Engine, payload.cartRowFor gevuld):
4111
+ - cartCrates: fust op déze kar
4112
+ - bufferCrates: fust van alle karren van de order of gecombineerde order
4113
+ - departureAt: ISO UTC vertrekmoment van de kar, of null
4114
+ - pickStartsAt: ISO UTC begin pickvenster, of null
4115
+ - forcedPickDay: 'JJJJ-MM-DD' als de regel bewust vooruit is gemaakt
4116
+ - payload.crates blijft ongewijzigd (totaal), gebruik voortaan cartCrates
4117
+ 3. pick_queue_cart_plan(_queue_item_id), in de root én in elk element van carts[]:
4118
+ - cartCrates, bufferCrates, departureAt, pickStartsAt
4119
+ - releaseAt: ISO UTC moment waarop de kar printbaar wordt, of null
4120
+ - releaseReason: tekst waarom de kar nog niet vrij is, of null
4121
+ - carrierId, pickupMomentKey, lateSignup (alleen in carts[])
4122
+
4123
+ WAT JE TOONT
4124
+ - reasonCode = 'pick_window_not_started' en pickStartsAt gevuld:
4125
+ "Wordt vrijgegeven <dag> <datum> om <tijd>" (tijdzone van de vestiging).
4126
+ - departureAt gevuld: "Vertrek <dag> <tijd>". Null: geen vertrektijd tonen.
4127
+ - Fust: cartCrates; eventueel "van <bufferCrates>" ernaast.
4128
+ - Vooruit printen: kies alleen werkdagen. pick_sync_pick_day geeft bij een
4129
+ niet-werkdag { error: 'Kies een werkdag om vooruit te printen.' }; toon die tekst.
4130
+ Bij een bewust gekozen werkdag zijn alle karren printbaar, behalve een
4131
+ deelkar die nog wacht (printbaar=false, wachtTot, wachtReden).
4132
+
4133
+ REGELS
4134
+ - Match op id (cartId, queue-id), nooit op naam. Niets hardcoded.
4135
+ - Wijzig geen rechten of RLS; de rechten van deze functies zijn ongewijzigd.
4136
+
4137
+ CONTROLELIJST
4138
+ [ ] Order met levering maandag, geplaatst vrijdag: pickdag vrijdag, vertrek volgens ophaalmoment.
4139
+ [ ] Niet-vrijgegeven kar toont "Wordt vrijgegeven … om …".
4140
+ [ ] Bufferkar toont het eigen aantal fust (cartCrates), niet het totaal.
4141
+ [ ] Vooruit printen op een werkdag maakt karren printbaar, behalve een wachtende deelkar.
4142
+ [ ] Meld terug met je pakketversie.`,
4143
+ },
3901
4144
  ],
3902
4145
  },
3903
4146
  scanners: {
@@ -5225,6 +5468,42 @@ CONTROLELIJST
5225
5468
  [ ] Terugmelding met de telling per bron.
5226
5469
  [ ] Melding sluit vanzelf als de bron sluit.
5227
5470
  [ ] Teller daalt; geen meldingen van verzonden of geannuleerde orders.
5471
+ [ ] Meld terug met je pakketversie.`,
5472
+ },
5473
+ {
5474
+ number: 2,
5475
+ title: "Vertrek per ophaalmoment en karrencontrole vandaag",
5476
+ date: "2026-10-16",
5477
+ summary: "Twee alleen-lezen functies voor het dashboard: logistics_pickup_moments_today en control_today_scan_summary.",
5478
+ body: `KOPPELPROMPT DASHBOARDS 2 – vereist Logistiek Engine 1.0.153
5479
+
5480
+ WAAROM
5481
+ Je vroeg om het vertrek per ophaalmoment vandaag en de karrencontrole van
5482
+ vandaag. Beide functies zijn er nu; alleen lezen, alleen voor ingelogde gebruikers.
5483
+
5484
+ 1. public.logistics_pickup_moments_today() returns jsonb (array):
5485
+ { carrier_id, pickup_moment_key, departure_at, naam_vervoerder, karren_totaal, karren_klaar }
5486
+ - Gegroepeerd op order_carts.carrier_id + pickup_moment_key + departure_at, nooit op naam.
5487
+ - "Vandaag" = logistics_local_today(): karren uit logistics_cart_index(vandaag, vandaag)
5488
+ plus karren met departure_at op vandaag (tijdzone van de vestiging).
5489
+ - karren_klaar = karren met een goedgekeurde controlescan (afmelden legt die ook vast).
5490
+ - Karren zonder vertrek: één aparte rij met carrier_id = null, pickup_moment_key = null,
5491
+ departure_at = null. naam_vervoerder is alleen voor weergave.
5492
+ - pickup_moment_id blijft leeg; gebruik het niet.
5493
+
5494
+ 2. public.control_today_scan_summary() returns jsonb:
5495
+ { karren_totaal, karren_gescand, dag }
5496
+ - Op unieke kar uit logistics_cart_index(vandaag, vandaag); gescand = goedgekeurde scan.
5497
+ - Dit is dezelfde definitie als de Controlepost. control_get_todays_carts() telt
5498
+ karnummers (ook losse/oude); gebruik daarom deze functie en niet die combinatie.
5499
+
5500
+ REGELS
5501
+ - Match op id. Geen omgevingswaarden. Wijzig geen Engine-functies of -rechten.
5502
+
5503
+ CONTROLELIJST
5504
+ [ ] Tegel "Vertrek vandaag" toont per ophaalmoment totaal en klaar.
5505
+ [ ] Karren zonder vertrek staan in een eigen rij.
5506
+ [ ] Karrencontrole vandaag gelijk aan de Controlepost.
5228
5507
  [ ] Meld terug met je pakketversie.`,
5229
5508
  },
5230
5509
  ],
@@ -1,2 +1,2 @@
1
- export declare const MODULE_VERSION = "1.0.151";
1
+ export declare const MODULE_VERSION = "1.0.155";
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.151";
2
+ export const MODULE_VERSION = "1.0.155";
@@ -1 +1 @@
1
- {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ruleEngineSchema.d.ts","sourceRoot":"","sources":["../../src/lib/ruleEngineSchema.ts"],"names":[],"mappings":"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"}
@@ -339,7 +339,14 @@ export const RULE_STEPS = [
339
339
  label: "Automatisch versturen na de laatste goedgekeurde kar",
340
340
  type: "toggle",
341
341
  default: false,
342
- description: "Alleen voor Floriday-orders. Staat dit aan, dan vraagt de Engine Afhandeling om de belading te versturen zodra alle karren van de order goedgekeurd zijn gescand. Eén keer per order; bij een fout tot 5 pogingen met oplopende wachttijd.",
342
+ description: "Alleen voor Floriday-orders. Staat dit aan, dan vraagt de Engine Afhandeling om de belading te versturen zodra alle karren van de order goedgekeurd zijn gescand. Eén keer per order, bij een buffer één keer voor alle orders samen; bij een fout tot 5 pogingen met oplopende wachttijd.",
343
+ },
344
+ {
345
+ key: "deelkar_wacht_minuten",
346
+ label: "Wachttijd deelkar (minuten)",
347
+ type: "number",
348
+ default: 15,
349
+ description: "Zo lang wacht een niet-volle kar na de start van het picken op mogelijke aanvulling. Het pickscherm toont tot hoe laat.",
343
350
  },
344
351
  {
345
352
  key: "scanner",
@@ -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;AAQ5D,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,CA4d1B;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"}
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;AAQ5D,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,CA+d1B;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"}
@@ -195,7 +195,7 @@ export async function runShippingNoteQueue(sb, options = {}) {
195
195
  }
196
196
  const salesOrderId = String(order?.["floriday_sales_order_id"] ?? "").trim();
197
197
  if (!salesOrderId) {
198
- await faal("sales_order_ontbreekt", "Bij deze FO-order ontbreekt het Floriday sales-order-ID; de verzendbrief kan niet worden opgehaald.");
198
+ await faal("sales_order_ontbreekt", "Deze Floriday-order mist het Floriday-nummer. Werk de order bij via Orders.");
199
199
  continue;
200
200
  }
201
201
  // Geannuleerd in Floriday? Dan direct stoppen in plaats van de volle wachttijd.
@@ -333,12 +333,15 @@ export async function runShippingNoteQueue(sb, options = {}) {
333
333
  continue;
334
334
  }
335
335
  // De pakbon is de bron voor printplek en kar; de printer kiest de Layout maker.
336
- const { data: slip } = await sb
337
- .from("print_jobs")
338
- .select("payload, is_herprint")
339
- .eq("id", row.slip_job_id)
340
- .maybeSingle();
341
- const slipRow = (slip ?? null);
336
+ // Aanvragen die zijn klaargezet na een geaccepteerde belading (1.0.153)
337
+ // hebben geen pakbon-printopdracht: dan geldt de kar van de aanvraag zelf.
338
+ const naAcceptatie = String(row.batch_key ?? "").startsWith("na-acceptatie:");
339
+ const { data: slip } = naAcceptatie
340
+ ? { data: null }
341
+ : await sb.from("print_jobs").select("payload, is_herprint").eq("id", row.slip_job_id).maybeSingle();
342
+ const slipRow = naAcceptatie
343
+ ? { payload: { cart_id: row.cart_id }, is_herprint: false }
344
+ : (slip ?? null);
342
345
  if (!slipRow) {
343
346
  await faal("pakbon_verdwenen", "De bijbehorende pakbon bestaat niet meer; er wordt geen losse verzendbrief gemaakt.", fulfillmentOrderId);
344
347
  continue;
@@ -77,7 +77,7 @@ export function controleerEtiket(sticker, etiketten, bron = "sticker") {
77
77
  if (etiketten === null) {
78
78
  return {
79
79
  ok: false,
80
- reden: "Het geladen etiket kon niet worden gelezen (geladen_etiketten van Layouts en printers 1.56.0 ontbreekt of gaf een fout); niet geprint.",
80
+ reden: "Sticker niet geprint: het etiketformaat van de printer is onbekend. Stel het geladen etiket in bij Printen.",
81
81
  etiket: null,
82
82
  };
83
83
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/logistiek-engine",
3
- "version": "1.0.151",
3
+ "version": "1.0.155",
4
4
  "flowselections": {
5
5
  "moduleId": "logistiek-engine",
6
6
  "pages": [