@flowselections/layout-maker 1.45.9 → 1.45.19

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 (65) hide show
  1. package/README.md +139 -139
  2. package/dist-lib/components/AfdrukKnop.d.ts +19 -19
  3. package/dist-lib/components/AfdrukKnop.js +64 -64
  4. package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
  5. package/dist-lib/components/NetwerkPrintersDialog.js +79 -79
  6. package/dist-lib/components/PakbonPreview.d.ts.map +1 -1
  7. package/dist-lib/components/PakbonPreview.js +2 -2
  8. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  9. package/dist-lib/components/PrintQueuePage.js +42 -5
  10. package/dist-lib/components/PrinterSetupWizard.js +3 -3
  11. package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
  12. package/dist-lib/components/PrintersRedirectPage.js +14 -14
  13. package/dist-lib/index.d.ts +1 -0
  14. package/dist-lib/index.d.ts.map +1 -1
  15. package/dist-lib/index.js +1 -0
  16. package/dist-lib/integrations/supabase/auth-middleware.d.ts +4489 -277
  17. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  18. package/dist-lib/integrations/supabase/client.server.d.ts +4489 -277
  19. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  20. package/dist-lib/integrations/supabase/client.server.js +1 -1
  21. package/dist-lib/integrations/supabase/moduleClient.d.ts +4489 -277
  22. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  23. package/dist-lib/integrations/supabase/types.d.ts +4506 -253
  24. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  25. package/dist-lib/lib/aiLayout.functions.d.ts +4489 -277
  26. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  27. package/dist-lib/lib/aiLayout.server.js +9 -9
  28. package/dist-lib/lib/browserPrint.js +1 -1
  29. package/dist-lib/lib/fieldRegistry.js +1 -0
  30. package/dist-lib/lib/layoutPreview.js +7 -7
  31. package/dist-lib/lib/logoLibrary.d.ts +2 -1
  32. package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
  33. package/dist-lib/lib/logoLibrary.js +42 -2
  34. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  35. package/dist-lib/lib/orderData.server.js +13 -0
  36. package/dist-lib/lib/pakbonBuilder.d.ts +26 -0
  37. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  38. package/dist-lib/lib/pakbonBuilder.js +37 -0
  39. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  40. package/dist-lib/lib/pakbonContent.js +2 -2
  41. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  42. package/dist-lib/lib/pakbonHtml.js +60 -60
  43. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  44. package/dist-lib/lib/pakbonPresentation.js +2 -4
  45. package/dist-lib/lib/pdfJobSaver.d.ts.map +1 -1
  46. package/dist-lib/lib/pdfJobSaver.js +31 -2
  47. package/dist-lib/lib/pdfMap.d.ts +7 -0
  48. package/dist-lib/lib/pdfMap.d.ts.map +1 -1
  49. package/dist-lib/lib/pdfMap.js +17 -0
  50. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  51. package/dist-lib/lib/printQueue.server.js +142 -15
  52. package/dist-lib/lib/printService.functions.d.ts +47214 -52
  53. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  54. package/dist-lib/lib/printService.functions.js +69 -0
  55. package/dist-lib/lib/printService.server.d.ts +2 -0
  56. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  57. package/dist-lib/lib/printService.server.js +10 -0
  58. package/dist-lib/lib/productiebonHtml.js +15 -15
  59. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  60. package/dist-lib/lib/profielHtml.js +22 -19
  61. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  62. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  63. package/dist-lib/lib/testpagina.js +3 -3
  64. package/dist-lib/lib/testprint.js +4 -4
  65. package/package.json +3 -3
@@ -2,15 +2,15 @@
2
2
  // src/lib/aiLayout.server.ts — hulpfuncties voor de AI-layoutgenerator
3
3
  // ============================================================================
4
4
  const GATEWAY = "https://ai.gateway.lovable.dev/v1/chat/completions";
5
- const SYSTEM_PROMPT = `Je bent een documentontwerper voor een Nederlands ERP-systeem.
6
- Je analyseert een bestaand document (PDF of afbeelding) en zet het om naar een herbruikbare layout.
7
- Herken logo's, adresblokken, koppen, tabellen met kolommen, totalen, barcodes en voetteksten.
8
- Vervang concrete gegevens door veldcodes zoals {{order.nummer}}, {{klant.naam}}, {{klant.adres}},
9
- {{factuur.totaal}}, {{systeem.datum}}. Coördinaten en afmetingen zijn in millimeters, linksboven is 0,0.
10
- Herken logo's als element van het type "logo". Je krijgt een lijst met logo's die al in de centrale
11
- Logo Bibliotheek staan; als het herkende logo daar duidelijk bij past, zet dan die exacte naam in
12
- "logo_naam". Past het bij geen enkel bekend logo, laat "logo_naam" dan leeg zodat het als nieuw logo
13
- kan worden voorgesteld.
5
+ const SYSTEM_PROMPT = `Je bent een documentontwerper voor een Nederlands ERP-systeem.
6
+ Je analyseert een bestaand document (PDF of afbeelding) en zet het om naar een herbruikbare layout.
7
+ Herken logo's, adresblokken, koppen, tabellen met kolommen, totalen, barcodes en voetteksten.
8
+ Vervang concrete gegevens door veldcodes zoals {{order.nummer}}, {{klant.naam}}, {{klant.adres}},
9
+ {{factuur.totaal}}, {{systeem.datum}}. Coördinaten en afmetingen zijn in millimeters, linksboven is 0,0.
10
+ Herken logo's als element van het type "logo". Je krijgt een lijst met logo's die al in de centrale
11
+ Logo Bibliotheek staan; als het herkende logo daar duidelijk bij past, zet dan die exacte naam in
12
+ "logo_naam". Past het bij geen enkel bekend logo, laat "logo_naam" dan leeg zodat het als nieuw logo
13
+ kan worden voorgesteld.
14
14
  Antwoord uitsluitend met JSON.`;
15
15
  const SCHEMA = {
16
16
  type: "object",
@@ -26,7 +26,7 @@ export function paginaCss(formaat, orientatie, margeMm = 0) {
26
26
  const gedraaid = formaat && orientatie === "landscape"
27
27
  ? `${formaat.hoogte}mm ${formaat.breedte}mm`
28
28
  : size;
29
- return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
29
+ return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
30
30
  @media print { html, body { margin: 0; padding: 0; } }`;
31
31
  }
32
32
  /**
@@ -82,6 +82,7 @@ registreerEntiteit({
82
82
  { pad: "regel.potmaat", label: "Potmaat", soort: "tekst", voorbeeld: "12 cm" },
83
83
  { pad: "regel.barcode", label: "Barcode", soort: "tekst", voorbeeld: "8712345678904" },
84
84
  { pad: "regel.locatie", label: "Locatie", soort: "tekst", voorbeeld: "A-12-3" },
85
+ { pad: "regel.afbeelding", label: "Stickerafbeelding", soort: "tekst", voorbeeld: "" },
85
86
  ],
86
87
  });
87
88
  registreerEntiteit({
@@ -81,8 +81,8 @@ function elementHtml(el, ctx) {
81
81
  return `<div style="${base};border-radius:50%;border:${s.randbreedte || 0.3}mm solid ${s.randkleur ?? "#111827"}"></div>`;
82
82
  case "barcode":
83
83
  return inhoud
84
- ? `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
85
- <div class="barcode-bars" data-barcode="${esc(inhoud)}" style="width:100%;height:70%;display:flex;background:#fff">${code128BarsHtml(inhoud)}</div>
84
+ ? `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
85
+ <div class="barcode-bars" data-barcode="${esc(inhoud)}" style="width:100%;height:70%;display:flex;background:#fff">${code128BarsHtml(inhoud)}</div>
86
86
  <div style="font-size:7pt">${esc(inhoud)}</div></div>`
87
87
  : "";
88
88
  case "qrcode":
@@ -128,10 +128,10 @@ export function bouwDocumentHtml(layout, elementen, gegevens) {
128
128
  const body = zichtbaar.map((e) => elementHtml(e, ctx)).join("");
129
129
  const b = layout.orientatie === "landscape" ? layout.hoogte_mm : layout.breedte_mm;
130
130
  const h = layout.orientatie === "landscape" ? layout.breedte_mm : layout.hoogte_mm;
131
- return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
132
- <style>@page{size:${b}mm ${h}mm;margin:0}
133
- body{margin:0;background:#e5e7eb}
134
- .pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
135
- @media print{body{background:#fff}}</style></head>
131
+ return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
132
+ <style>@page{size:${b}mm ${h}mm;margin:0}
133
+ body{margin:0;background:#e5e7eb}
134
+ .pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
135
+ @media print{body{background:#fff}}</style></head>
136
136
  <body><div class="pagina">${body}</div></body></html>`;
137
137
  }
@@ -82,7 +82,8 @@ export declare function formatteerBytes(n: number): string;
82
82
  /**
83
83
  * Logo's als ingebedde data-URL. Nodig bij afdrukken: een printvenster kan
84
84
  * tijdelijke (ondertekende) URL's soms niet op tijd laden, waardoor het logo
85
- * als kapotte afbeelding op papier komt.
85
+ * als kapotte afbeelding op papier komt. De afbeelding wordt eerst tot
86
+ * printformaat verkleind zodat de PDF-opdracht klein blijft.
86
87
  */
87
88
  export declare function haalPrintLogos(): Promise<{
88
89
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"logoLibrary.d.ts","sourceRoot":"","sources":["../../src/lib/logoLibrary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logoLibrary.d.ts","sourceRoot":"","sources":["../../src/lib/logoLibrary.ts"],"names":[],"mappings":"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"}
@@ -276,10 +276,50 @@ export function formatteerBytes(n) {
276
276
  return `${(n / 1024).toFixed(1)} kB`;
277
277
  return `${(n / 1024 / 1024).toFixed(1)} MB`;
278
278
  }
279
+ /**
280
+ * Maximale lange zijde van een ingebed printlogo. Een logo staat op papier
281
+ * hooguit enkele centimeters breed; 900 px is bij 300 dpi ruim voldoende.
282
+ * Zonder deze begrenzing gaat een origineel van meerdere megapixels als
283
+ * data-URL mee in de HTML, waardoor de PDF-server de opdracht niet meer
284
+ * aankan ("Internal server error").
285
+ */
286
+ const PRINT_LOGO_MAX_PX = 900;
287
+ /** Verkleint een raster-data-URL tot printformaat. SVG blijft ongewijzigd. */
288
+ async function verkleinPrintLogo(dataUrl) {
289
+ if (typeof document === "undefined")
290
+ return dataUrl;
291
+ if (/^data:image\/svg/i.test(dataUrl))
292
+ return dataUrl;
293
+ try {
294
+ const img = await new Promise((resolve, reject) => {
295
+ const i = new Image();
296
+ i.onload = () => resolve(i);
297
+ i.onerror = () => reject(new Error("logo onleesbaar"));
298
+ i.src = dataUrl;
299
+ });
300
+ const langste = Math.max(img.naturalWidth, img.naturalHeight, 1);
301
+ if (langste <= PRINT_LOGO_MAX_PX && dataUrl.length < 400000)
302
+ return dataUrl;
303
+ const schaal = Math.min(1, PRINT_LOGO_MAX_PX / langste);
304
+ const c = document.createElement("canvas");
305
+ c.width = Math.max(1, Math.round(img.naturalWidth * schaal));
306
+ c.height = Math.max(1, Math.round(img.naturalHeight * schaal));
307
+ const ctx = c.getContext("2d");
308
+ if (!ctx)
309
+ return dataUrl;
310
+ ctx.drawImage(img, 0, 0, c.width, c.height);
311
+ const klein = c.toDataURL("image/png");
312
+ return klein.length < dataUrl.length ? klein : dataUrl;
313
+ }
314
+ catch {
315
+ return dataUrl;
316
+ }
317
+ }
279
318
  /**
280
319
  * Logo's als ingebedde data-URL. Nodig bij afdrukken: een printvenster kan
281
320
  * tijdelijke (ondertekende) URL's soms niet op tijd laden, waardoor het logo
282
- * als kapotte afbeelding op papier komt.
321
+ * als kapotte afbeelding op papier komt. De afbeelding wordt eerst tot
322
+ * printformaat verkleind zodat de PDF-opdracht klein blijft.
283
323
  */
284
324
  export async function haalPrintLogos() {
285
325
  const logos = await haalLogos();
@@ -295,7 +335,7 @@ export async function haalPrintLogos() {
295
335
  reader.onerror = () => reject(new Error("Logo kon niet worden gelezen"));
296
336
  reader.readAsDataURL(data);
297
337
  });
298
- return { id: l.id, naam: l.naam, viewUrl: dataUrl };
338
+ return { id: l.id, naam: l.naam, viewUrl: await verkleinPrintLogo(dataUrl) };
299
339
  }
300
340
  catch {
301
341
  return { id: l.id, naam: l.naam, viewUrl: l.viewUrl ?? null };
@@ -1 +1 @@
1
- {"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAwBtD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAMA;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7E,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA8ZrB;AA+DD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhG"}
1
+ {"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAwBtD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAMA;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7E,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA6arB;AA+DD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhG"}
@@ -210,6 +210,18 @@ export async function laadPakbonData(db, opties) {
210
210
  for (const p of arr(data))
211
211
  producten.set(String(p["id"]), p);
212
212
  }
213
+ // --- traystickerafbeelding (gedeelde tabel, beheerd door de voorraadmodule) ---
214
+ // Alleen lezen. Ontbreekt de tabel of rij, dan blijft het veld leeg en
215
+ // tonen andere documentsoorten precies wat ze altijd al toonden.
216
+ const stickerUrls = new Map();
217
+ if (productIds.length) {
218
+ const data = await veilig(() => db.from("product_tray_stickers").select("product_id, bestand_url").in("product_id", productIds));
219
+ for (const s of arr(data)) {
220
+ const url = String(s["bestand_url"] ?? "").trim();
221
+ if (url)
222
+ stickerUrls.set(String(s["product_id"]), url);
223
+ }
224
+ }
213
225
  // --- verrijking vanuit Floriday-artikelcache ------------------------------
214
226
  // `products.unit` is vrijwel altijd "stuks" en zegt niets over het fust.
215
227
  // De echte fustsoort, potmaat en kleur staan in de Floriday-cache:
@@ -297,6 +309,7 @@ export async function laadPakbonData(db, opties) {
297
309
  const unit = String(p["unit"] ?? "").trim();
298
310
  return {
299
311
  artikelnummer: String(p["article_number"] ?? ""),
312
+ afbeelding: stickerUrls.get(String(bron["product_id"] ?? "")) ?? "",
300
313
  artikelnaam: taalTekst(bron["product_name"]) || taalTekst(p["product"]),
301
314
  potmaat: String(extra["potmaat"] ??
302
315
  extra["Potmaat"] ??
@@ -180,6 +180,32 @@ export interface DemoKar {
180
180
  gedeeld?: boolean;
181
181
  lagen: DemoLaag[];
182
182
  }
183
+ export interface VolleKarStandInvoer {
184
+ documentnaam?: unknown;
185
+ volleKarren?: unknown;
186
+ cartIndex?: unknown;
187
+ cartTotal?: unknown;
188
+ /** Positie afgeleid uit de actuele, niet-geannuleerde taken in dezelfde printsessie. */
189
+ reeksIndex?: unknown;
190
+ }
191
+ export interface VolleKarStand {
192
+ index: number;
193
+ totaal: number;
194
+ label: string;
195
+ }
196
+ /**
197
+ * Bepaalt de canonieke positie binnen de reeks volle karren. De Engine kan in
198
+ * cartTotal ook een afsluitende deelkar meetellen en stuurde bij oudere K2-jobs
199
+ * soms opnieuw cartIndex 1. De opdrachtaanduiding K1/K2 en fullCarts zijn dan
200
+ * de betrouwbare bronnen.
201
+ */
202
+ export declare function bepaalVolleKarStand(invoer: VolleKarStandInvoer): VolleKarStand | null;
203
+ /**
204
+ * Het karnummer zoals het in de karkop hoort te staan: bij een Engine-kar met
205
+ * bekende serie "1 van 3", anders het kale karnummer. Zo drukt een pakbon die
206
+ * per kar wordt uitgeprint nooit zomaar "KAR 1" terwijl er meerdere karren zijn.
207
+ */
208
+ export declare function karKopNummer(kar: DemoKar): string;
183
209
  export declare const DEMO_ORDER: {
184
210
  order: {
185
211
  nummer: string;
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonBuilder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pakbonBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonBuilder.ts"],"names":[],"mappings":"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"}
@@ -864,6 +864,43 @@ export function sectieOnderdruktVoorVariant(type, methode, variant) {
864
864
  return type === "pickmethode";
865
865
  return type === "pickmethode" ? false : [...KAR_SECTIES, "orderregels"].includes(type);
866
866
  }
867
+ /**
868
+ * Bepaalt de canonieke positie binnen de reeks volle karren. De Engine kan in
869
+ * cartTotal ook een afsluitende deelkar meetellen en stuurde bij oudere K2-jobs
870
+ * soms opnieuw cartIndex 1. De opdrachtaanduiding K1/K2 en fullCarts zijn dan
871
+ * de betrouwbare bronnen.
872
+ */
873
+ export function bepaalVolleKarStand(invoer) {
874
+ const naamMatch = /-K(\d+)$/i.exec(String(invoer.documentnaam ?? "").trim());
875
+ const positieUitNaam = Number(naamMatch?.[1] ?? 0);
876
+ const positieUitReeks = Number(invoer.reeksIndex ?? 0);
877
+ const ruweIndex = Number(invoer.cartIndex ?? 0);
878
+ const volleKarren = Number(invoer.volleKarren ?? 0);
879
+ const ruweTotaal = Number(invoer.cartTotal ?? 0);
880
+ // De actuele reeks is doorslaggevend wanneer de Engine verschillende
881
+ // kar-ID's toch allemaal als K1 aanlevert. Naam en cartIndex blijven veilige
882
+ // terugvallen voor losse/herdrukte opdrachten zonder herkenbare printsessie.
883
+ const index = positieUitReeks > 0 ? positieUitReeks : positieUitNaam > 0 ? positieUitNaam : ruweIndex;
884
+ const totaal = volleKarren > 0 ? volleKarren : ruweTotaal;
885
+ if (!(index > 0) || !(totaal > 0))
886
+ return null;
887
+ if (index > totaal) {
888
+ throw new Error(`Ongeldige volle-karstand: kar ${index} valt buiten een reeks van ${totaal}.`);
889
+ }
890
+ return { index, totaal, label: `Kar ${index} van ${totaal}` };
891
+ }
892
+ /**
893
+ * Het karnummer zoals het in de karkop hoort te staan: bij een Engine-kar met
894
+ * bekende serie "1 van 3", anders het kale karnummer. Zo drukt een pakbon die
895
+ * per kar wordt uitgeprint nooit zomaar "KAR 1" terwijl er meerdere karren zijn.
896
+ */
897
+ export function karKopNummer(kar) {
898
+ const index = Number(kar.cart_index ?? 0);
899
+ const totaal = Number(kar.cart_total ?? 0);
900
+ if (index > 0 && totaal > 1)
901
+ return `${index} van ${totaal}`;
902
+ return String(kar.karnummer);
903
+ }
867
904
  const p = (nr, naam, potmaat, aantal, locatie, groep, kleur) => ({
868
905
  artikelnummer: nr,
869
906
  artikelnaam: naam,
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonContent.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonContent.ts"],"names":[],"mappings":"AASA,OAAO,EAoBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAe,KAAK,IAAI,EAAmC,MAAM,kBAAkB,CAAC;AAE3F,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAomBF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,IAAI,EAAE,CAAC;IAClB,UAAU,EAAE,IAAI,EAAE,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA+EvE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAmB9E"}
1
+ {"version":3,"file":"pakbonContent.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonContent.ts"],"names":[],"mappings":"AASA,OAAO,EAqBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAe,KAAK,IAAI,EAAmC,MAAM,kBAAkB,CAAC;AAE3F,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAomBF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,IAAI,EAAE,CAAC;IAClB,UAAU,EAAE,IAAI,EAAE,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CA+EvE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAmB9E"}
@@ -6,7 +6,7 @@
6
6
  // layout-engine (pakbonDocument.ts) bepaalt WAAR het terechtkomt. Er is geen
7
7
  // tweede plek meer waar pakboninhoud wordt samengesteld.
8
8
  // ============================================================================
9
- import { beperkTotDeelkar, conditieContext, deelkarVoorbeeldOrder, fustVerzamellijst, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, laagBundelTekst, leesPakbonConfig, pakbonLayoutVariant, pickMethode, productVeldBreedtes, sectieOnderdruktVoorVariant, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
9
+ import { beperkTotDeelkar, conditieContext, deelkarVoorbeeldOrder, fustVerzamellijst, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karKopNummer, karBundelTekst, laagBundelTekst, leesPakbonConfig, pakbonLayoutVariant, pickMethode, productVeldBreedtes, sectieOnderdruktVoorVariant, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
10
10
  import { karMetadata } from "./pakbonPresentation.js";
11
11
  import { KLEUR_GRIJS } from "./pakbonDocument.js";
12
12
  const arr = (v) => (Array.isArray(v) ? v : []);
@@ -140,7 +140,7 @@ function laagKopFlow(s, laag, velden, bundel, basis) {
140
140
  function karKopFlow(s, kar, velden, bundel, basis) {
141
141
  const scheiding = optS(s, "scheiding", "kop");
142
142
  const tekst = optS(s, "koptekst", "KAR {kar}")
143
- .replace(/\{kar\}/g, String(kar.karnummer))
143
+ .replace(/\{kar\}/g, karKopNummer(kar))
144
144
  .replace(/\{route\}/g, kar.route)
145
145
  .replace(/\{chauffeur\}/g, kar.chauffeur)
146
146
  .replace(/\{lagen\}/g, String(kar.lagen.length))
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAwBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAMzB,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAyBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AA4rBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAyDR;AAgBD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAkFR;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAsCN;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAyBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAMzB,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAyBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AA4rBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAyDR;AAgBD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAkFR;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAsCN;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -7,7 +7,7 @@
7
7
  // layoutconfiguratie en de echte ordergegevens. Zo tonen het live voorbeeld en
8
8
  // de afdruk altijd exact dezelfde secties — inclusief de orderregels.
9
9
  // ============================================================================
10
- import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
10
+ import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, karKopNummer, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
11
11
  import { haalPrintLogos } from "./logoLibrary.js";
12
12
  import { code128BarsHtml } from "./code128.js";
13
13
  import { karMetadata } from "./pakbonPresentation.js";
@@ -346,7 +346,7 @@ const PRODUCT_LABELS = {
346
346
  function karKop(s, kar, velden, bundelTekst = "") {
347
347
  const scheiding = optS(s, "scheiding", "kop");
348
348
  const tekst = optS(s, "koptekst", "KAR {kar}")
349
- .replace(/\{kar\}/g, String(kar.karnummer))
349
+ .replace(/\{kar\}/g, karKopNummer(kar))
350
350
  .replace(/\{route\}/g, kar.route)
351
351
  .replace(/\{chauffeur\}/g, kar.chauffeur)
352
352
  .replace(/\{lagen\}/g, String(kar.lagen.length))
@@ -751,64 +751,64 @@ export function renderPakbonDocument(config, order, opties = {}) {
751
751
  // leest dit uit de meta, zodat de wachtrij niets extra hoeft door te geven.
752
752
  const totalen = arr(leesPakbonConfig(config).secties).find((s) => s.type === "totalen");
753
753
  const paginanummers = !!totalen && opt(totalen, "toon_paginanummer", false) === true;
754
- return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
755
- <meta name="pdf-paginanummers" content="${paginanummers ? "ja" : "nee"}" />
756
- <title>${esc(opties.titel ?? "Pakbon")}</title>
757
-
758
- <style>
759
- @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
760
- * { box-sizing: border-box; }
761
- html, body { margin: 0; padding: 0; }
762
- body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
763
- .pakbonvariant { border-top: 0.6mm solid #111827; border-bottom: 0.6mm solid #111827; padding: 2mm 1mm; margin-bottom: 2mm; text-align: center; font-size: 15pt; font-weight: 800; line-height: 1.1; }
764
- .blok { margin-bottom: 2mm; }
765
- .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
766
- .fustgroepkop { display: flex; justify-content: space-between; font-weight: 600; color: #111827; border-bottom: 0.45mm solid #111827; padding-bottom: 0.5mm; margin-bottom: 0.6mm; }
767
-
768
- .vet { font-weight: 600; }
769
- .kv { display: flex; justify-content: space-between; gap: 3mm; }
770
- .kv .k { color: #6b7280; }
771
- .kv .v { font-weight: 500; }
772
- .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
773
- .kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
774
- table.regels { width: 100%; border-collapse: collapse; }
775
- table.regels.vast { table-layout: fixed; }
776
- table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
777
- table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
778
- table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
779
- .rand { border: 0.2mm solid #d1d5db; }
780
- .onder { border-bottom: 0.2mm solid #d1d5db; }
781
- table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
782
- tr.zebra td { background: #f3f4f6; }
783
- .plijst { margin: 0; padding-left: 4mm; }
784
- .groep { margin-bottom: 1.5mm; }
785
- .regelrij { display: flex; gap: 2mm; }
786
- .tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
787
- .karblok { margin-bottom: 2mm; }
788
- .karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
789
- .karkop { display: block; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; overflow-wrap: anywhere; }
790
- .karkop-titel { font-weight: 700; }
791
- .karkop-meta { margin-top: 0.4mm; font-size: 78%; font-weight: 400; color: #4b5563; overflow-wrap: anywhere; }
792
- .bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
793
- .laag { margin-bottom: 1.5mm; }
794
- .laagkop { display: block; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; overflow-wrap: anywhere; }
795
- .laagkop-meta { margin-top: 0.25mm; font-size: 82%; font-weight: 400; color: #4b5563; overflow-wrap: anywhere; }
796
- .laagkop.compact { border-bottom: none; }
797
- .meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
798
- .totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
799
- .paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; border-top: 0.35mm solid #9ca3af; padding-top: 1mm; }
800
- .handtekening { margin-top: 3mm; }
801
- .lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
802
- .lijnveld.hoog { padding-bottom: 10mm; }
803
- .lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
804
- .balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
805
- .qr { border: 0.25mm dashed #9ca3af; }
806
- .barcode { display:flex; flex-direction:column; align-items:center; gap:0.8mm; } .barcode-bars { width:45mm; display:flex; background:#fff; }
807
- .klein { font-size: 85%; color: #6b7280; }
808
- .breekvoor { break-before: page; page-break-before: always; }
809
- .heelhouden { break-inside: avoid; page-break-inside: avoid; }
810
- img { max-width: 100%; }
811
- </style></head>
754
+ return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
755
+ <meta name="pdf-paginanummers" content="${paginanummers ? "ja" : "nee"}" />
756
+ <title>${esc(opties.titel ?? "Pakbon")}</title>
757
+
758
+ <style>
759
+ @page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
760
+ * { box-sizing: border-box; }
761
+ html, body { margin: 0; padding: 0; }
762
+ body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
763
+ .pakbonvariant { border-top: 0.6mm solid #111827; border-bottom: 0.6mm solid #111827; padding: 2mm 1mm; margin-bottom: 2mm; text-align: center; font-size: 15pt; font-weight: 800; line-height: 1.1; }
764
+ .blok { margin-bottom: 2mm; }
765
+ .sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
766
+ .fustgroepkop { display: flex; justify-content: space-between; font-weight: 600; color: #111827; border-bottom: 0.45mm solid #111827; padding-bottom: 0.5mm; margin-bottom: 0.6mm; }
767
+
768
+ .vet { font-weight: 600; }
769
+ .kv { display: flex; justify-content: space-between; gap: 3mm; }
770
+ .kv .k { color: #6b7280; }
771
+ .kv .v { font-weight: 500; }
772
+ .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
773
+ .kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
774
+ table.regels { width: 100%; border-collapse: collapse; }
775
+ table.regels.vast { table-layout: fixed; }
776
+ table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
777
+ table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
778
+ table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
779
+ .rand { border: 0.2mm solid #d1d5db; }
780
+ .onder { border-bottom: 0.2mm solid #d1d5db; }
781
+ table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
782
+ tr.zebra td { background: #f3f4f6; }
783
+ .plijst { margin: 0; padding-left: 4mm; }
784
+ .groep { margin-bottom: 1.5mm; }
785
+ .regelrij { display: flex; gap: 2mm; }
786
+ .tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
787
+ .karblok { margin-bottom: 2mm; }
788
+ .karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
789
+ .karkop { display: block; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; overflow-wrap: anywhere; }
790
+ .karkop-titel { font-weight: 700; }
791
+ .karkop-meta { margin-top: 0.4mm; font-size: 78%; font-weight: 400; color: #4b5563; overflow-wrap: anywhere; }
792
+ .bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
793
+ .laag { margin-bottom: 1.5mm; }
794
+ .laagkop { display: block; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; overflow-wrap: anywhere; }
795
+ .laagkop-meta { margin-top: 0.25mm; font-size: 82%; font-weight: 400; color: #4b5563; overflow-wrap: anywhere; }
796
+ .laagkop.compact { border-bottom: none; }
797
+ .meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
798
+ .totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
799
+ .paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; border-top: 0.35mm solid #9ca3af; padding-top: 1mm; }
800
+ .handtekening { margin-top: 3mm; }
801
+ .lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
802
+ .lijnveld.hoog { padding-bottom: 10mm; }
803
+ .lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
804
+ .balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
805
+ .qr { border: 0.25mm dashed #9ca3af; }
806
+ .barcode { display:flex; flex-direction:column; align-items:center; gap:0.8mm; } .barcode-bars { width:45mm; display:flex; background:#fff; }
807
+ .klein { font-size: 85%; color: #6b7280; }
808
+ .breekvoor { break-before: page; page-break-before: always; }
809
+ .heelhouden { break-inside: avoid; page-break-inside: avoid; }
810
+ img { max-width: 100%; }
811
+ </style></head>
812
812
  <body>${body}</body></html>`;
813
813
  }
814
814
  /** Handig voor testen: het document met de voorbeeldgegevens. */
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonPresentation.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAqBpE"}
1
+ {"version":3,"file":"pakbonPresentation.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoBpE"}
@@ -19,10 +19,8 @@ export function karMetadata(kar, velden) {
19
19
  info.push(kar.route);
20
20
  if (kar.gedeeld)
21
21
  info.push("gedeelde kar");
22
- const label = kar.cart_label ||
23
- (kar.cart_index && kar.cart_total ? `Kar ${kar.cart_index} van ${kar.cart_total}` : "");
24
- if (label)
25
- info.push(label);
22
+ // De karstand hoort in de grote karkop (`KAR 2 van 2`), niet nogmaals in
23
+ // deze metaregel. Anders verschijnt dezelfde telling op twee plekken.
26
24
  if (kar.cart_id)
27
25
  info.push(`ID ${kar.cart_id}`);
28
26
  if (kar.cart_items?.length)
@@ -1 +1 @@
1
- {"version":3,"file":"pdfJobSaver.d.ts","sourceRoot":"","sources":["../../src/lib/pdfJobSaver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgC5C,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACrD,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,uBAAuB,CAAC,EAAE,eAAe,CAAC;KAC3C;CACF;AAiND,8EAA8E;AAC9E,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCzE;AAED,mFAAmF;AACnF,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBvF;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,eAAe,GAAG,cAAc,CAAC,CAI1G;AAoCD,wBAAgB,kBAAkB,IAAI,IAAI,CA+BzC;AAED,kFAAkF;AAClF,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAehG"}
1
+ {"version":3,"file":"pdfJobSaver.d.ts","sourceRoot":"","sources":["../../src/lib/pdfJobSaver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAgC5C,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CACrD,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,uBAAuB,CAAC,EAAE,eAAe,CAAC;KAC3C;CACF;AA8OD,8EAA8E;AAC9E,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCzE;AAED,mFAAmF;AACnF,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBvF;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,eAAe,GAAG,cAAc,CAAC,CAI1G;AAoCD,wBAAgB,kBAAkB,IAAI,IAAI,CA+BzC;AAED,kFAAkF;AAClF,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAehG"}
@@ -1,7 +1,7 @@
1
1
  import { toast } from "@flowselections/core";
2
2
  import { supabase } from "./supabaseClient.js";
3
3
  import { startPdfMapGlobaleBanner } from "../components/PdfMapGlobaleBanner.js";
4
- import { bewaarInPdfMap, herstelPdfMapToestemming, koppelPdfMapAanPrintplek, luisterNaarPdfMapWijziging, lokalePdfPrintplek, pdfMapKoppeling, pdfMapToestemming, } from "./pdfMap.js";
4
+ import { bewaarInPdfMap, herstelPdfMapToestemming, koppelPdfMapAanPrintplek, luisterNaarPdfMapWijziging, lokalePdfPrintplek, pdfMapKoppeling, pdfMapToestemming, verwijderUitPdfMap, } from "./pdfMap.js";
5
5
  import { PDF_OPSLAG_MELDING } from "./pdfOpslagStatus.js";
6
6
  const SERVICE_INTERVAL_MS = 5000;
7
7
  const WACHT_INTERVAL_MS = 2000;
@@ -62,9 +62,21 @@ async function geefClaimTerug(jobId, schrijver) {
62
62
  if (error)
63
63
  console.warn("[layout-maker] PDF-opdracht teruggeven mislukt", error.message);
64
64
  }
65
+ /** Is deze opdracht net geannuleerd? Annuleren wint altijd van een lopende claim. */
66
+ async function isGeannuleerd(jobId) {
67
+ const { data } = await supabase
68
+ .from("print_jobs")
69
+ .select("status")
70
+ .eq("id", jobId)
71
+ .maybeSingle();
72
+ return data?.status === "geannuleerd";
73
+ }
65
74
  async function schrijfGeclaimdePdf(job, schrijver) {
66
75
  if (!job.printer_id || (!job.artefact_pad && !job.resultaat_pdf_base64))
67
76
  return false;
77
+ // Race met de annuleerknop: controleer vlak vóór het schrijven opnieuw.
78
+ if (await isGeannuleerd(job.id))
79
+ return true;
68
80
  const toestemming = await pdfMapToestemming(job.printer_id);
69
81
  if (toestemming !== "granted") {
70
82
  // Geen map of geen schrijfrecht op dít tabblad: terug in de wachtrij.
@@ -83,9 +95,26 @@ async function schrijfGeclaimdePdf(job, schrijver) {
83
95
  await rondClaimAf(job.id, schrijver, "schrijffout", PDF_OPSLAG_MELDING.schrijffout);
84
96
  return false;
85
97
  }
98
+ // Annulering tijdens het schrijven: haal het bestand meteen weer weg en
99
+ // bevestig niets meer aan de database. Annuleren wint altijd.
100
+ if (await isGeannuleerd(job.id)) {
101
+ await verwijderUitPdfMap(job.printer_id, naam);
102
+ return true;
103
+ }
86
104
  // Eerst het bestand sluiten, daarna pas de database bevestigen. Een fout in
87
105
  // deze bevestiging wordt nooit meer genegeerd of als succes aan de UI gemeld.
88
- await rondClaimAf(job.id, schrijver, "opgeslagen");
106
+ try {
107
+ await rondClaimAf(job.id, schrijver, "opgeslagen");
108
+ }
109
+ catch (fout) {
110
+ // Was de opdracht ondertussen geannuleerd, dan is de mislukte bevestiging
111
+ // juist de bedoeling: bestand weghalen en stilletjes afronden.
112
+ if (await isGeannuleerd(job.id)) {
113
+ await verwijderUitPdfMap(job.printer_id, naam);
114
+ return true;
115
+ }
116
+ throw fout;
117
+ }
89
118
  return true;
90
119
  }
91
120
  async function bepaalEigenPrintplek() {
@@ -14,6 +14,7 @@ type MapHandle = {
14
14
  close: () => Promise<void>;
15
15
  }>;
16
16
  }>;
17
+ removeEntry?: (naam: string) => Promise<void>;
17
18
  };
18
19
  export type PdfMapKoppeling = {
19
20
  versie: 1;
@@ -71,6 +72,12 @@ export declare function pdfMapNaam(printerId: string): Promise<string | null>;
71
72
  * de functie false terug en kan de aanroeper gewoon downloaden.
72
73
  */
73
74
  export declare function bewaarInPdfMap(printerId: string, bestandsnaam: string, blob: Blob): Promise<boolean>;
75
+ /**
76
+ * Verwijdert een zojuist weggeschreven bestand weer, bijvoorbeeld wanneer de
77
+ * opdracht tijdens het schrijven is geannuleerd. Lukt het niet, dan blijft het
78
+ * bestand staan en geeft de functie false terug.
79
+ */
80
+ export declare function verwijderUitPdfMap(printerId: string, bestandsnaam: string): Promise<boolean>;
74
81
  /** Controleert toestemming zonder een bestandsactie te starten. */
75
82
  export declare function pdfMapToestemming(printerId: string): Promise<"granted" | "prompt" | "denied" | "ontbreekt">;
76
83
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pdfMap.d.ts","sourceRoot":"","sources":["../../src/lib/pdfMap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdfMap.d.ts","sourceRoot":"","sources":["../../src/lib/pdfMap.ts"],"names":[],"mappings":"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"}