@flowselections/layout-maker 1.62.3 → 1.63.5

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 (58) hide show
  1. package/dist-lib/components/BevestigDialog.d.ts +9 -0
  2. package/dist-lib/components/BevestigDialog.d.ts.map +1 -0
  3. package/dist-lib/components/BevestigDialog.js +24 -0
  4. package/dist-lib/components/LogosPage.d.ts.map +1 -1
  5. package/dist-lib/components/LogosPage.js +27 -5
  6. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  7. package/dist-lib/components/PrintQueuePage.js +2 -1
  8. package/dist-lib/components/PrintenInstellenWizard.js +1 -1
  9. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  10. package/dist-lib/components/PrinterSetupWizard.js +3 -1
  11. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  12. package/dist-lib/components/PrintplekDetailPage.js +42 -4
  13. package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
  14. package/dist-lib/components/TestprintDialog.js +15 -1
  15. package/dist-lib/components/WerkplekConfiguratiePage.js +2 -2
  16. package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
  17. package/dist-lib/components/WerkplekkenTab.js +13 -6
  18. package/dist-lib/integrations/supabase/types.d.ts +364 -0
  19. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  20. package/dist-lib/lib/afbeeldingMaat.d.ts +10 -0
  21. package/dist-lib/lib/afbeeldingMaat.d.ts.map +1 -0
  22. package/dist-lib/lib/afbeeldingMaat.js +39 -0
  23. package/dist-lib/lib/etiketControle.d.ts +9 -1
  24. package/dist-lib/lib/etiketControle.d.ts.map +1 -1
  25. package/dist-lib/lib/etiketControle.js +21 -4
  26. package/dist-lib/lib/htmlNaarPdf.server.d.ts +4 -0
  27. package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -1
  28. package/dist-lib/lib/htmlNaarPdf.server.js +5 -1
  29. package/dist-lib/lib/htmlPdf.server.d.ts +6 -0
  30. package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
  31. package/dist-lib/lib/htmlPdf.server.js +46 -10
  32. package/dist-lib/lib/logoLibrary.d.ts +25 -0
  33. package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
  34. package/dist-lib/lib/logoLibrary.js +73 -1
  35. package/dist-lib/lib/opmaakLimiet.d.ts +8 -0
  36. package/dist-lib/lib/opmaakLimiet.d.ts.map +1 -0
  37. package/dist-lib/lib/opmaakLimiet.js +25 -0
  38. package/dist-lib/lib/printQueue.server.d.ts +2 -0
  39. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  40. package/dist-lib/lib/printQueue.server.js +122 -20
  41. package/dist-lib/lib/printService.functions.js +2 -2
  42. package/dist-lib/lib/printService.server.d.ts +2 -0
  43. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  44. package/dist-lib/lib/printService.server.js +2 -1
  45. package/dist-lib/lib/printnodeStatus.d.ts +2 -0
  46. package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
  47. package/dist-lib/lib/printnodeStatus.js +10 -0
  48. package/dist-lib/lib/printplekken.d.ts +17 -1
  49. package/dist-lib/lib/printplekken.d.ts.map +1 -1
  50. package/dist-lib/lib/printplekken.js +42 -3
  51. package/dist-lib/lib/profielHtml.js +1 -1
  52. package/dist-lib/lib/shellPoort.d.ts +1 -1
  53. package/dist-lib/lib/shellPoort.js +1 -1
  54. package/dist-lib/lib/stickerFormaat.d.ts +46 -0
  55. package/dist-lib/lib/stickerFormaat.d.ts.map +1 -0
  56. package/dist-lib/lib/stickerFormaat.js +96 -0
  57. package/dist-lib/lib/testprint.js +1 -1
  58. package/package.json +1 -1
@@ -12,7 +12,9 @@ import { renderProductiebonDocument } from "./productiebonHtml.js";
12
12
  import { heeftOrderInhoud, laadOrderVanuitDatabase, laadPakbonData } from "./orderData.server.js";
13
13
  import { profielHeeftInhoud, renderProfielDocument } from "./profielHtml.js";
14
14
  import { bouwDocumentHtml, voorbeeldContext } from "./layoutPreview.js";
15
- import { htmlNaarPdfServer, PdfRenderFout } from "./htmlNaarPdf.server.js";
15
+ import { AfbeeldingInhoudFout, htmlNaarPdfServer, PdfRenderFout } from "./htmlNaarPdf.server.js";
16
+ import { bepaalStickerMaat, floridayStickerMaat, STICKER_MAAT_ONBEKEND, stickerFormaatCode, stickerIdUitPayload, stickerInfoUitCache, stickerNietNodig, stickerTypeLabel, STICKER_NIET_NODIG, FASE_NIET_NODIG } from "./stickerFormaat.js";
17
+ import { OPMAAK_LIMIET_MS, OpmaakTeLangFout, metTijdslimiet } from "./opmaakLimiet.js";
16
18
  import { stuurPdfNaarPrinter, opdrachtStatusDetail, vervaltijdVoor } from "./printService.server.js";
17
19
  import { kiesPapier } from "./papierFormaten.js";
18
20
  import { waaromDezePrinter } from "./waaromPrinter.js";
@@ -40,6 +42,35 @@ export async function controleerClient(db) {
40
42
  return `Achtergrondprinten is niet ingesteld: de server kan niet bij de database (${e instanceof Error ? e.message : "onbekende fout"}).`;
41
43
  }
42
44
  }
45
+ /** Fase met tijd en details in het logboek, zodat een vastloper nooit stil is. */
46
+ async function faseLog(db, jobId, fase, detail) {
47
+ try {
48
+ await log(db, String(jobId), "fase", JSON.stringify({ fase, op: new Date().toISOString(), ...detail }));
49
+ }
50
+ catch {
51
+ /* loggen mag het printen nooit blokkeren */
52
+ }
53
+ }
54
+ /** Printer uit de formaatregels (documentsoort + formaat), beide richtingen. */
55
+ async function printerVoorStickerFormaat(db, documenttype, maat) {
56
+ const code = stickerFormaatCode(maat.breedte_mm, maat.hoogte_mm);
57
+ const { data } = await db
58
+ .from("document_formaat_printers")
59
+ .select("printer_id, formaat_code")
60
+ .eq("documenttype", documenttype)
61
+ .not("printer_id", "is", null);
62
+ const rijen = Array.isArray(data) ? data : [];
63
+ // Formaatcodes zijn bv. "STICKER_100x150"; vergelijk alleen de maat, in beide richtingen.
64
+ const passend = rijen.find((r) => {
65
+ const m = /(\d+)\s*x\s*(\d+)\s*$/i.exec(String(r.formaat_code ?? ""));
66
+ return !!m && stickerFormaatCode(Number(m[1]), Number(m[2])) === code;
67
+ });
68
+ const id = passend?.printer_id;
69
+ if (!id)
70
+ return null;
71
+ const { data: p } = await db.from("printers").select("*").eq("id", id).eq("actief", true).maybeSingle();
72
+ return p ?? null;
73
+ }
43
74
  async function log(db, jobId, gebeurtenis, detail) {
44
75
  await db.from("print_job_logs").insert({
45
76
  job_id: jobId,
@@ -1220,6 +1251,25 @@ export async function geweigerd(db, job, code, bericht) {
1220
1251
  .neq("status", "geannuleerd");
1221
1252
  await log(db, job.id, "geweigerd", `${code}: ${bericht}`);
1222
1253
  }
1254
+ /** Koper wil deze sticker niet: eindstatus zonder fout en zonder nieuwe poging. */
1255
+ export async function nietNodig(db, job) {
1256
+ const nu = new Date().toISOString();
1257
+ await db
1258
+ .from("print_jobs")
1259
+ .update({
1260
+ status: "geannuleerd",
1261
+ verwerkingsfase: FASE_NIET_NODIG,
1262
+ fase_voltooid_op: nu,
1263
+ foutcode: null,
1264
+ foutmelding: STICKER_NIET_NODIG,
1265
+ volgende_poging: null,
1266
+ voltooid_op: nu,
1267
+ updated_at: nu,
1268
+ })
1269
+ .eq("id", job.id)
1270
+ .neq("status", "geannuleerd");
1271
+ await log(db, job.id, FASE_NIET_NODIG, STICKER_NIET_NODIG);
1272
+ }
1223
1273
  async function mislukt(db, job, reden, terugNaarWachtend) {
1224
1274
  const pogingen = Number(job.pogingen ?? 0);
1225
1275
  const opnieuw = terugNaarWachtend && pogingen < MAX_POGINGEN;
@@ -1351,7 +1401,45 @@ async function verwerkJob(db, job) {
1351
1401
  const keuze = klaar ? { layout: null, ontwerpWint: false } : await zoekLayout(db, job);
1352
1402
  klok.markeer("layout_resolved");
1353
1403
  const layout = keuze.layout;
1404
+ // Klantsticker/traysticker: maat vaststellen (Floriday-formaat, anders de
1405
+ // PDF). Onbekend = niet printen. De maat kiest ook de printer via de
1406
+ // formaatregels, zodat een sticker op een etiket komt dat groot genoeg is.
1407
+ let stickerMaat = null;
1408
+ let stickerCache = null;
1409
+ if (ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? ""))) {
1410
+ const sid = stickerIdUitPayload(job.payload);
1411
+ if (sid) {
1412
+ const { data: rij } = await db
1413
+ .from("floriday_customer_stickers_cache")
1414
+ .select("sticker_width_mm, sticker_height_mm, sticker_type, should_be_printed")
1415
+ .eq("floriday_id", sid)
1416
+ .eq("is_deleted", false)
1417
+ .order("updated_at", { ascending: false })
1418
+ .limit(1)
1419
+ .maybeSingle();
1420
+ stickerCache = stickerInfoUitCache(rij);
1421
+ }
1422
+ if (stickerNietNodig(stickerCache, job.payload)) {
1423
+ await nietNodig(db, job);
1424
+ return "mislukt";
1425
+ }
1426
+ }
1427
+ if (klaar && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? ""))) {
1428
+ stickerMaat = stickerCache?.maat
1429
+ ? { ...stickerCache.maat, bron: "floriday" }
1430
+ : bepaalStickerMaat(floridayStickerMaat(job.payload), pdfPaginaMm(klaar));
1431
+ if (!stickerMaat)
1432
+ throw new GeenDocumentFout(STICKER_MAAT_ONBEKEND);
1433
+ await faseLog(db, job.id, "sticker_maat", { bron: stickerMaat.bron, breedte_mm: stickerMaat.breedte_mm, hoogte_mm: stickerMaat.hoogte_mm });
1434
+ }
1354
1435
  const printerKeuze = await zoekPrinter(db, job, layout);
1436
+ if (stickerMaat) {
1437
+ const viaFormaat = await printerVoorStickerFormaat(db, String(job.documenttype), stickerMaat);
1438
+ if (viaFormaat) {
1439
+ printerKeuze.printer = viaFormaat;
1440
+ await log(db, job.id, "formaat", `Printer gekozen via de formaatregel ${stickerFormaatCode(stickerMaat.breedte_mm, stickerMaat.hoogte_mm)}.`);
1441
+ }
1442
+ }
1355
1443
  klok.markeer("printer_resolved");
1356
1444
  const printer = printerKeuze.printer;
1357
1445
  if (!printer || !printer.extern_printer_id) {
@@ -1388,23 +1476,33 @@ async function verwerkJob(db, job) {
1388
1476
  const uitkomst = { bron: floriday ? "floriday_1op1" : "extern_pdf" };
1389
1477
  let pdfBase64 = klaar;
1390
1478
  if (!pdfBase64) {
1391
- const html = await bouwHtml(db, job, keuze, uitkomst);
1392
- if (!heeftZichtbareInhoud(html)) {
1393
- throw new GeenDocumentFout("Het document was leeg: er zijn geen gegevens gevonden om af te drukken. " +
1394
- "Controleer of de layout blokken bevat en of de order gegevens heeft.");
1395
- }
1396
- // Een voorbeeldafdruk koppelt bewust geen layout (het meegestuurde
1397
- // ontwerp is leidend), maar geeft wél het papierformaat van de bewerkte
1398
- // layout mee. Zonder dit zou het voorbeeld altijd op A4 uitkomen.
1399
- const vf = (job.payload ?? {})["voorbeeld_formaat"];
1400
- const liggend = String(layout?.orientatie ?? vf?.["orientatie"] ?? "portrait") === "landscape";
1401
- pdfBase64 = await htmlNaarPdfServer({
1402
- html,
1403
- breedteMm: Number(layout?.breedte_mm ?? vf?.["breedte_mm"] ?? 210),
1404
- hoogteMm: Number(layout?.hoogte_mm ?? vf?.["hoogte_mm"] ?? 297),
1405
- margeMm: Number(layout?.marge_boven ?? vf?.["marge_boven"] ?? 10),
1406
- landschap: liggend,
1479
+ const opmaakStart = Date.now();
1480
+ await faseLog(db, job.id, "opmaken_gestart", { layout_id: layout?.id ?? null });
1481
+ pdfBase64 = await metTijdslimiet(OPMAAK_LIMIET_MS, async () => {
1482
+ const html = await bouwHtml(db, job, keuze, uitkomst);
1483
+ await faseLog(db, job.id, "html_klaar", { ms: Date.now() - opmaakStart, tekens: html.length });
1484
+ if (!heeftZichtbareInhoud(html)) {
1485
+ throw new GeenDocumentFout("Het document was leeg: er zijn geen gegevens gevonden om af te drukken. " +
1486
+ "Controleer of de layout blokken bevat en of de order gegevens heeft.");
1487
+ }
1488
+ // Een voorbeeldafdruk koppelt bewust geen layout (het meegestuurde
1489
+ // ontwerp is leidend), maar geeft wél het papierformaat van de bewerkte
1490
+ // layout mee. Zonder dit zou het voorbeeld altijd op A4 uitkomen.
1491
+ const vf = (job.payload ?? {})["voorbeeld_formaat"];
1492
+ const liggend = String(layout?.orientatie ?? vf?.["orientatie"] ?? "portrait") === "landscape";
1493
+ const pdf = await htmlNaarPdfServer({
1494
+ html,
1495
+ breedteMm: Number(layout?.breedte_mm ?? vf?.["breedte_mm"] ?? 210),
1496
+ hoogteMm: Number(layout?.hoogte_mm ?? vf?.["hoogte_mm"] ?? 297),
1497
+ margeMm: Number(layout?.marge_boven ?? vf?.["marge_boven"] ?? 10),
1498
+ landschap: liggend,
1499
+ bijOvergeslagen: (src, reden) => {
1500
+ void faseLog(db, job.id, "afbeelding_weggelaten", { bron: src.split("?")[0]?.slice(0, 200), reden });
1501
+ },
1502
+ });
1503
+ return pdf;
1407
1504
  });
1505
+ await faseLog(db, job.id, "pdf_klaar", { ms: Date.now() - opmaakStart, bytes: Math.round((pdfBase64.length * 3) / 4) });
1408
1506
  }
1409
1507
  klok.markeer("rendered");
1410
1508
  if (await isJobGeannuleerd(db, String(job.id))) {
@@ -1417,8 +1515,8 @@ async function verwerkJob(db, job) {
1417
1515
  const hoogteMm = Number(layout?.hoogte_mm ?? vfPapier?.["hoogte_mm"] ?? standaardMaat(printer).hoogte);
1418
1516
  let papier = kiesPapier(formaten, breedteMm, hoogteMm);
1419
1517
  if (label) {
1420
- const maat = (klaar ? pdfPaginaMm(pdfBase64) : null) ?? { breedte_mm: breedteMm, hoogte_mm: hoogteMm };
1421
- const uit = etiketPast({ ...maat, soortLabel: documentTypeLabelVoor(String(job.documenttype ?? "Document")) }, label.etiket, label.naam);
1518
+ const maat = stickerMaat ?? (klaar ? pdfPaginaMm(pdfBase64) : null) ?? { breedte_mm: breedteMm, hoogte_mm: hoogteMm };
1519
+ const uit = etiketPast({ ...maat, soortLabel: stickerCache?.sticker_type ? stickerTypeLabel(stickerCache.sticker_type) : documentTypeLabelVoor(String(job.documenttype ?? "Document")) }, label.etiket, label.naam, !!stickerMaat);
1422
1520
  if (!uit.ok) {
1423
1521
  await geweigerd(db, job, uit.code, uit.bericht);
1424
1522
  return "mislukt";
@@ -1441,6 +1539,7 @@ async function verwerkJob(db, job) {
1441
1539
  documentnaam: String(job.documentnaam ?? "Document"),
1442
1540
  pdfBase64,
1443
1541
  kopieen: Number(job.kopieen ?? 1),
1542
+ documenttype: String(job.documenttype ?? ""),
1444
1543
  opties: { paper: papier.paper, rotate: papier.rotate, fitToPage: false },
1445
1544
  });
1446
1545
  if (i > 0) {
@@ -1502,7 +1601,10 @@ async function verwerkJob(db, job) {
1502
1601
  return await wachtOpLayout(db, job, e.message);
1503
1602
  }
1504
1603
  // Ontbreekt er een document of layout? Dan heeft opnieuw proberen geen zin.
1505
- const blijvend = e instanceof GeenDocumentFout;
1604
+ if (e instanceof OpmaakTeLangFout || e instanceof AfbeeldingInhoudFout) {
1605
+ await faseLog(db, job.id, "fout", { fase: e instanceof OpmaakTeLangFout ? "opmaken" : "afbeelding", fout: e.message });
1606
+ }
1607
+ const blijvend = e instanceof GeenDocumentFout || e instanceof OpmaakTeLangFout || e instanceof AfbeeldingInhoudFout;
1506
1608
  const tijdelijk = !blijvend && (e instanceof PdfRenderFout || e?.name === "PrintToegangFout");
1507
1609
  await mislukt(db, job, e instanceof Error ? e.message : "Afdrukken mislukt", tijdelijk);
1508
1610
  return "mislukt";
@@ -200,7 +200,7 @@ export const opnieuwPrinten = createServerFn({ method: "POST" })
200
200
  _print_plek_id: payload["print_plek_id"] ?? null,
201
201
  _werkplek: payload["werkplek"] ?? null,
202
202
  _kopieen: Number(job["kopieen"] ?? 1),
203
- _payload: { ...payload, opnieuw_van: job["id"] },
203
+ _payload: { ...payload, opnieuw_van: job["id"], herprint_alleen_dit_document: true },
204
204
  });
205
205
  if (e) {
206
206
  const { leesbareFout } = await import("./foutTekst.js");
@@ -224,7 +224,7 @@ export const opnieuwPrinten = createServerFn({ method: "POST" })
224
224
  render_html: job["render_html"] ?? null,
225
225
  is_herprint: true,
226
226
  bron_job_id: job["id"],
227
- payload: { ...payload, is_herprint: true, bron_job_id: job["id"] },
227
+ payload: { ...payload, is_herprint: true, herprint_alleen_dit_document: true, bron_job_id: job["id"] },
228
228
  })
229
229
  .select("id")
230
230
  .single();
@@ -28,6 +28,8 @@ export interface PrintOpdrachtInput {
28
28
  documentnaam: string;
29
29
  pdfBase64: string;
30
30
  kopieen?: number;
31
+ /** Documentsoort: bepaalt het maximum (sticker/traysticker 5000, anders 50). */
32
+ documenttype?: string | null;
31
33
  opties?: PrintOpties;
32
34
  }
33
35
  /** Fout voor een 409 van PrintNode: deze idempotentiesleutel is al ontvangen. */
@@ -1 +1 @@
1
- {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { kopieenVoorPrinter } from "./stickerFormaat.js";
1
2
  // ============================================================================
2
3
  // src/lib/printService.server.ts — communicatie met de externe printdienst.
3
4
  // Alleen server-side. Fouten worden vertaald naar begrijpelijke meldingen.
@@ -128,7 +129,7 @@ export async function stuurPdfNaarPrinter(input) {
128
129
  contentType: "pdf_base64",
129
130
  content: input.pdfBase64,
130
131
  source: sourceVoorJob(input.jobId),
131
- qty: Math.max(1, Math.min(50, input.kopieen ?? 1)),
132
+ qty: kopieenVoorPrinter(input.kopieen, input.documenttype),
132
133
  options,
133
134
  };
134
135
  if (typeof input.expireAfter === "number" && input.expireAfter > 0) {
@@ -13,5 +13,7 @@ export declare const SCANBARE_SOORTEN: Set<string>;
13
13
  export declare function opnieuwActie(j: JobVoorLabel): "opnieuw_proberen" | "opnieuw_printen" | null;
14
14
  /** "gescand" alleen als de scan ná het printen van dit document was. */
15
15
  export declare function scanLabel(scanTijd: number | string, printTijd: string | null | undefined): "gescand" | "eerder";
16
+ /** "Sticker × 480" voor sticker-opdrachten met meer dan één afdruk. */
17
+ export declare function aantalLabel(documenttype: string | null | undefined, kopieen: number | null | undefined): string | null;
16
18
  export {};
17
19
  //# sourceMappingURL=printnodeStatus.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"printnodeStatus.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeStatus.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzD,CAAC;AAEF,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAe5D;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAsD,CAAC;AAEpF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,CAI3F;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAI/G"}
1
+ {"version":3,"file":"printnodeStatus.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeStatus.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzD,CAAC;AAEF,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAiB5D;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAsD,CAAC;AAEpF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,CAI3F;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAI/G;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKtH"}
@@ -13,6 +13,8 @@ export const PRINTNODE_STATUS_LABEL = {
13
13
  };
14
14
  /** Label voor de statuskolom van de wachtrij. */
15
15
  export function printnodeStatusLabel(j) {
16
+ if (j.status === "geannuleerd" && j.verwerkingsfase === "niet_nodig")
17
+ return "Niet nodig – de koper wil geen sticker";
16
18
  if (j.status === "geannuleerd")
17
19
  return "Geannuleerd";
18
20
  if (j.foutcode === "AANLEVERING_MISLUKT")
@@ -53,3 +55,11 @@ export function scanLabel(scanTijd, printTijd) {
53
55
  const print = printTijd ? new Date(printTijd).getTime() : NaN;
54
56
  return !Number.isNaN(print) && scan >= print ? "gescand" : "eerder";
55
57
  }
58
+ /** "Sticker × 480" voor sticker-opdrachten met meer dan één afdruk. */
59
+ export function aantalLabel(documenttype, kopieen) {
60
+ const t = String(documenttype ?? "");
61
+ const n = Number(kopieen ?? 1);
62
+ if ((t !== "sticker" && t !== "traysticker") || !(n > 1))
63
+ return null;
64
+ return `${t === "traysticker" ? "Traysticker" : "Sticker"} × ${Math.floor(n)}`;
65
+ }
@@ -136,7 +136,7 @@ export declare function printerGebruik(printerId: string): Promise<PrinterGebrui
136
136
  /** Zet alle verwijzingen in één keer over naar `nieuw` (of `null` = geen printer). */
137
137
  export declare function vervangPrinterOveral(oud: string, nieuw: string | null): Promise<Record<string, number>>;
138
138
  /** De printplek waar een computer/werkplek bij hoort, of `null`. */
139
- export declare function printplekVoorComputer(computerNaam: string): Promise<string | null>;
139
+ export declare function printplekVoorComputer(computerNaam: string, printnodeComputerId?: number | string | null): Promise<string | null>;
140
140
  /** Naam van een printplek, voor nette foutmeldingen. */
141
141
  export declare function printplekNaam(printPlekId: string): Promise<string | null>;
142
142
  /**
@@ -154,4 +154,20 @@ export declare function useKoppelingVoorBron(bron: string, bronId: string, label
154
154
  ontkoppel: () => Promise<void>;
155
155
  herlaad: () => Promise<void>;
156
156
  };
157
+ export interface PrinterVerwijzingen {
158
+ printplek_regels: number;
159
+ werkplek_regels: {
160
+ werkplek: string;
161
+ documenttype: string;
162
+ }[];
163
+ werkplekken: {
164
+ naam: string;
165
+ rol: string;
166
+ }[];
167
+ }
168
+ /** Wat verwijst nog naar deze printer (printplekregels, uitzonderingen, werkplekken)? */
169
+ export declare function printerVerwijzingen(printPlekId: string, printerId: string): Promise<PrinterVerwijzingen>;
170
+ /** Aantal lege regels dat deze printer terug kan krijgen (herkend op PrintNode-nummer). */
171
+ export declare function printerHerstelVoorstel(printPlekId: string, printerId: string): Promise<number>;
172
+ export declare function printerHerstelUitvoeren(printPlekId: string, printerId: string): Promise<number>;
157
173
  //# sourceMappingURL=printplekken.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"printplekken.d.ts","sourceRoot":"","sources":["../../src/lib/printplekken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"printplekken.d.ts","sourceRoot":"","sources":["../../src/lib/printplekken.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAQD,0EAA0E;AAC1E,wBAAgB,eAAe;;;;;;;;;EAqC9B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAO9D;AAED,2EAA2E;AAC3E,wBAAgB,0BAA0B;;;;EAczC;AAMD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxF;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBAI1E;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAYD,4DAA4D;AAC5D,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAInF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAI7E;AAED,sFAAsF;AACtF,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,iBAU7C;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,iBAM3D;AAED,4EAA4E;AAC5E,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,iBAuB9B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,iBAYf;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAO/D;AAED,iEAAiE;AACjE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ5F;AAMD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKxB;AAMD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAM9E;AAED,wBAAgB,sBAAsB;;;EAOrC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,iBAc/G;AAED,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,iBAM1D;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAYvG;AAMD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAOtF;AAED,yEAAyE;AACzE,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAOxF;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAW/E;AAED,sFAAsF;AACtF,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,mCAO3E;AAED,oEAAoE;AACpE,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED,wDAAwD;AACxD,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO/E;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;2BAoBxD,MAAM;;;EA0B9B;AAID,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED,yFAAyF;AACzF,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAS9G;AAED,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpG;AAED,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIrG"}
@@ -310,7 +310,19 @@ export async function vervangPrinterOveral(oud, nieuw) {
310
310
  return (data ?? {});
311
311
  }
312
312
  /** De printplek waar een computer/werkplek bij hoort, of `null`. */
313
- export async function printplekVoorComputer(computerNaam) {
313
+ export async function printplekVoorComputer(computerNaam, printnodeComputerId) {
314
+ // Eerst op PrintNode-computernummer (vast), pas daarna op naam voor rijen zonder nummer.
315
+ const nr = printnodeComputerId != null && String(printnodeComputerId).trim() !== "" ? Number(printnodeComputerId) : NaN;
316
+ if (Number.isFinite(nr)) {
317
+ const { data } = await supabase
318
+ .from("print_plek_computers")
319
+ .select("print_plek_id")
320
+ .eq("printnode_computer_id", nr)
321
+ .limit(1);
322
+ const rij = Array.isArray(data) ? data[0] : undefined;
323
+ if (rij?.print_plek_id)
324
+ return rij.print_plek_id;
325
+ }
314
326
  const naam = (computerNaam ?? "").trim();
315
327
  if (!naam)
316
328
  return null;
@@ -318,8 +330,10 @@ export async function printplekVoorComputer(computerNaam) {
318
330
  .from("print_plek_computers")
319
331
  .select("print_plek_id")
320
332
  .eq("computer_naam", naam)
321
- .maybeSingle();
322
- return data?.print_plek_id ?? null;
333
+ .is("printnode_computer_id", null)
334
+ .limit(1);
335
+ const rij = Array.isArray(data) ? data[0] : undefined;
336
+ return rij?.print_plek_id ?? null;
323
337
  }
324
338
  /** Naam van een printplek, voor nette foutmeldingen. */
325
339
  export async function printplekNaam(printPlekId) {
@@ -376,3 +390,28 @@ export function useKoppelingVoorBron(bron, bronId, label) {
376
390
  herlaad: lees,
377
391
  };
378
392
  }
393
+ /** Wat verwijst nog naar deze printer (printplekregels, uitzonderingen, werkplekken)? */
394
+ export async function printerVerwijzingen(printPlekId, printerId) {
395
+ const { data, error } = await supabase.rpc("printer_verwijder_verwijzingen", { _plek: printPlekId, _printer: printerId });
396
+ if (error)
397
+ throw error;
398
+ const d = (data ?? {});
399
+ return {
400
+ printplek_regels: Number(d.printplek_regels ?? 0),
401
+ werkplek_regels: Array.isArray(d.werkplek_regels) ? d.werkplek_regels : [],
402
+ werkplekken: Array.isArray(d.werkplekken) ? d.werkplekken : [],
403
+ };
404
+ }
405
+ /** Aantal lege regels dat deze printer terug kan krijgen (herkend op PrintNode-nummer). */
406
+ export async function printerHerstelVoorstel(printPlekId, printerId) {
407
+ const { data, error } = await supabase.rpc("printer_herstel_voorstel", { _plek: printPlekId, _printer: printerId });
408
+ if (error)
409
+ throw error;
410
+ return Number(data ?? 0);
411
+ }
412
+ export async function printerHerstelUitvoeren(printPlekId, printerId) {
413
+ const { data, error } = await supabase.rpc("printer_herstel_uitvoeren", { _plek: printPlekId, _printer: printerId });
414
+ if (error)
415
+ throw error;
416
+ return Number(data ?? 0);
417
+ }
@@ -171,7 +171,7 @@ function groepHtml(groep, config, velden, data, opties) {
171
171
  velden["product.afbeelding"] ??
172
172
  String(zoekRegels(data).find((r) => r["afbeelding"])?.["afbeelding"] ?? "");
173
173
  delen.push(url
174
- ? `<img src="${esc(url)}" style="height:35mm" />`
174
+ ? `<img src="${esc(url)}" data-inhoud="1" style="height:35mm" />`
175
175
  : `<div class="lijnveld hoog"></div>`);
176
176
  }
177
177
  else if (inst.key === "handtekening") {
@@ -1,5 +1,5 @@
1
1
  /** Moduleversie van deze code. Gelijk houden aan package.json (test bewaakt dit). */
2
- export declare const MODULE_VERSIE = "1.62.0";
2
+ export declare const MODULE_VERSIE = "1.63.4";
3
3
  export declare function normaliseerAdres(u: unknown): string | null;
4
4
  /** -1 als a < b, 0 als gelijk, 1 als a > b (alleen cijfers, punt-gescheiden). */
5
5
  export declare function vergelijkVersie(a: string, b: string): number;
@@ -4,7 +4,7 @@
4
4
  // database. Niets vast in code; ontbreekt het adres, dan wordt er niet geprint.
5
5
  // ============================================================================
6
6
  /** Moduleversie van deze code. Gelijk houden aan package.json (test bewaakt dit). */
7
- export const MODULE_VERSIE = "1.62.0";
7
+ export const MODULE_VERSIE = "1.63.4";
8
8
  export function normaliseerAdres(u) {
9
9
  const s = String(u ?? "").trim().replace(/\/+$/, "").toLowerCase();
10
10
  return s || null;
@@ -0,0 +1,46 @@
1
+ export type StickerMaat = {
2
+ breedte_mm: number;
3
+ hoogte_mm: number;
4
+ bron: "floriday" | "pdf";
5
+ };
6
+ /** Leest widthInMm/heightInMm uit de payload (ook genest onder sticker/customerSticker). */
7
+ export declare function floridayStickerMaat(payload: unknown): {
8
+ breedte_mm: number;
9
+ hoogte_mm: number;
10
+ } | null;
11
+ /** Maximum afdrukken per opdracht: klantstickers per stuk tot 5000, de rest 50. */
12
+ export declare function maxKopieen(documenttype: string | null | undefined): number;
13
+ /** Aantal dat naar de printer gaat: binnen 1..max voor deze soort. */
14
+ export declare function kopieenVoorPrinter(kopieen: number | null | undefined, documenttype: string | null | undefined): number;
15
+ export declare function bepaalStickerMaat(floriday: {
16
+ breedte_mm: number;
17
+ hoogte_mm: number;
18
+ } | null, pdf: {
19
+ breedte_mm: number;
20
+ hoogte_mm: number;
21
+ } | null): StickerMaat | null;
22
+ export declare const STICKER_MAAT_ONBEKEND = "De maat van deze klantsticker is onbekend; er is niets geprint.";
23
+ /** Formaatcode voor de formaatregels: "48x48" (kleinste maat eerst, hele mm). */
24
+ export declare function stickerFormaatCode(b: number, h: number): string;
25
+ /** Floriday-stickernummer uit de payload (veld floriday_sticker_id; match op id, nooit op naam). */
26
+ export declare function stickerIdUitPayload(payload: unknown): string | null;
27
+ export type StickerCacheInfo = {
28
+ maat: {
29
+ breedte_mm: number;
30
+ hoogte_mm: number;
31
+ } | null;
32
+ sticker_type: string | null;
33
+ should_be_printed: boolean | null;
34
+ };
35
+ /** Leest een rij uit floriday_customer_stickers_cache (Floriday-authenticatie 1.0.87). */
36
+ export declare function stickerInfoUitCache(rij: unknown): StickerCacheInfo | null;
37
+ /** Koper wil geen sticker: cache of payload (shouldBePrinted) zegt expliciet false. */
38
+ export declare function stickerNietNodig(cache: StickerCacheInfo | null, payload: unknown): boolean;
39
+ /** "Potsticker 48 × 48 mm" — soort alleen als informatie, nooit voor het formaat. */
40
+ export declare function stickerTypeLabel(type: string | null | undefined, maat?: {
41
+ breedte_mm: number;
42
+ hoogte_mm: number;
43
+ } | null): string;
44
+ export declare const STICKER_NIET_NODIG = "De koper heeft aangegeven dat deze sticker niet geprint hoeft te worden.";
45
+ export declare const FASE_NIET_NODIG = "niet_nodig";
46
+ //# sourceMappingURL=stickerFormaat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stickerFormaat.d.ts","sourceRoot":"","sources":["../../src/lib/stickerFormaat.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,KAAK,CAAA;CAAE,CAAC;AAO9F,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBtG;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAG1E;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGtH;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC1D,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GACpD,WAAW,GAAG,IAAI,CAIpB;AAED,eAAO,MAAM,qBAAqB,oEAAoE,CAAC;AAEvG,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAUzE;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAO1F;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,MAAM,CAIjI;AAED,eAAO,MAAM,kBAAkB,6EAA6E,CAAC;AAC7G,eAAO,MAAM,eAAe,eAAe,CAAC"}
@@ -0,0 +1,96 @@
1
+ // ============================================================================
2
+ // src/lib/stickerFormaat.ts — maat van een klantsticker en of die past.
3
+ // Volgorde: formaat uit Floriday (widthInMm/heightInMm) → maat uit de PDF →
4
+ // onbekend = niet printen. Een sticker wordt nooit geschaald.
5
+ // ============================================================================
6
+ const getal = (v) => {
7
+ const n = Number(v);
8
+ return Number.isFinite(n) && n > 0 ? n : null;
9
+ };
10
+ /** Leest widthInMm/heightInMm uit de payload (ook genest onder sticker/customerSticker). */
11
+ export function floridayStickerMaat(payload) {
12
+ if (!payload || typeof payload !== "object")
13
+ return null;
14
+ const p = payload;
15
+ const kandidaten = [p, p["sticker"], p["customerSticker"], p["customer_sticker"], p["data"]];
16
+ for (const k of kandidaten) {
17
+ if (!k || typeof k !== "object")
18
+ continue;
19
+ const r = k;
20
+ const b = getal(r["widthInMm"] ?? r["sticker_width_mm"]);
21
+ const h = getal(r["heightInMm"] ?? r["sticker_height_mm"]);
22
+ if (b && h)
23
+ return { breedte_mm: b, hoogte_mm: h };
24
+ }
25
+ // Engine 1.0.164: sticker_formaat_mm: { breedte, hoogte }
26
+ const f = p["sticker_formaat_mm"];
27
+ if (f && typeof f === "object") {
28
+ const b = getal(f["breedte"]);
29
+ const h = getal(f["hoogte"]);
30
+ if (b && h)
31
+ return { breedte_mm: b, hoogte_mm: h };
32
+ }
33
+ return null;
34
+ }
35
+ /** Maximum afdrukken per opdracht: klantstickers per stuk tot 5000, de rest 50. */
36
+ export function maxKopieen(documenttype) {
37
+ const t = String(documenttype ?? "").trim();
38
+ return t === "sticker" || t === "traysticker" ? 5000 : 50;
39
+ }
40
+ /** Aantal dat naar de printer gaat: binnen 1..max voor deze soort. */
41
+ export function kopieenVoorPrinter(kopieen, documenttype) {
42
+ const n = Math.floor(Number(kopieen ?? 1));
43
+ return Math.max(1, Math.min(maxKopieen(documenttype), Number.isFinite(n) ? n : 1));
44
+ }
45
+ export function bepaalStickerMaat(floriday, pdf) {
46
+ if (floriday)
47
+ return { ...floriday, bron: "floriday" };
48
+ if (pdf && pdf.breedte_mm > 0 && pdf.hoogte_mm > 0)
49
+ return { ...pdf, bron: "pdf" };
50
+ return null;
51
+ }
52
+ export const STICKER_MAAT_ONBEKEND = "De maat van deze klantsticker is onbekend; er is niets geprint.";
53
+ /** Formaatcode voor de formaatregels: "48x48" (kleinste maat eerst, hele mm). */
54
+ export function stickerFormaatCode(b, h) {
55
+ const [x, y] = [Math.round(b), Math.round(h)].sort((p, q) => p - q);
56
+ return `${x}x${y}`;
57
+ }
58
+ /** Floriday-stickernummer uit de payload (veld floriday_sticker_id; match op id, nooit op naam). */
59
+ export function stickerIdUitPayload(payload) {
60
+ if (!payload || typeof payload !== "object")
61
+ return null;
62
+ const v = payload["floriday_sticker_id"];
63
+ return typeof v === "string" && v.trim() ? v.trim() : null;
64
+ }
65
+ /** Leest een rij uit floriday_customer_stickers_cache (Floriday-authenticatie 1.0.87). */
66
+ export function stickerInfoUitCache(rij) {
67
+ if (!rij || typeof rij !== "object")
68
+ return null;
69
+ const r = rij;
70
+ const b = getal(r["sticker_width_mm"]);
71
+ const h = getal(r["sticker_height_mm"]);
72
+ return {
73
+ maat: b && h ? { breedte_mm: b, hoogte_mm: h } : null,
74
+ sticker_type: typeof r["sticker_type"] === "string" && r["sticker_type"] ? r["sticker_type"] : null,
75
+ should_be_printed: typeof r["should_be_printed"] === "boolean" ? r["should_be_printed"] : null,
76
+ };
77
+ }
78
+ /** Koper wil geen sticker: cache of payload (shouldBePrinted) zegt expliciet false. */
79
+ export function stickerNietNodig(cache, payload) {
80
+ if (cache?.should_be_printed === false)
81
+ return true;
82
+ if (payload && typeof payload === "object") {
83
+ const p = payload;
84
+ if (p["shouldBePrinted"] === false || p["should_be_printed"] === false)
85
+ return true;
86
+ }
87
+ return false;
88
+ }
89
+ /** "Potsticker 48 × 48 mm" — soort alleen als informatie, nooit voor het formaat. */
90
+ export function stickerTypeLabel(type, maat) {
91
+ const t = String(type ?? "").trim().toUpperCase();
92
+ const soort = !t ? "Klantsticker" : t === "POT" ? "Potsticker" : `Klantsticker (${type})`;
93
+ return maat ? `${soort} ${Math.round(maat.breedte_mm)} × ${Math.round(maat.hoogte_mm)} mm` : soort;
94
+ }
95
+ export const STICKER_NIET_NODIG = "De koper heeft aangegeven dat deze sticker niet geprint hoeft te worden.";
96
+ export const FASE_NIET_NODIG = "niet_nodig";
@@ -131,7 +131,7 @@ export async function verstuurTestprint(documenttype, ctx) {
131
131
  printerId,
132
132
  ...(printplekId ? { printplekId } : {}),
133
133
  ...(werkplek ? { werkplek } : {}),
134
- payload: { test_id: testId, is_testprint: true },
134
+ payload: { test_id: testId, is_testprint: true, is_test: true },
135
135
  });
136
136
  return { jobId, printerId };
137
137
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/layout-maker",
3
- "version": "1.62.3",
3
+ "version": "1.63.5",
4
4
  "flowselections": {
5
5
  "moduleId": "layout-maker",
6
6
  "pages": [