@flowselections/layout-maker 1.62.3 → 1.63.2

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 (49) 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/PrintenInstellenWizard.js +1 -1
  7. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  8. package/dist-lib/components/PrinterSetupWizard.js +3 -1
  9. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  10. package/dist-lib/components/PrintplekDetailPage.js +42 -4
  11. package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
  12. package/dist-lib/components/TestprintDialog.js +15 -1
  13. package/dist-lib/components/WerkplekConfiguratiePage.js +2 -2
  14. package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
  15. package/dist-lib/components/WerkplekkenTab.js +13 -6
  16. package/dist-lib/integrations/supabase/types.d.ts +125 -0
  17. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  18. package/dist-lib/lib/afbeeldingMaat.d.ts +10 -0
  19. package/dist-lib/lib/afbeeldingMaat.d.ts.map +1 -0
  20. package/dist-lib/lib/afbeeldingMaat.js +39 -0
  21. package/dist-lib/lib/etiketControle.d.ts +9 -1
  22. package/dist-lib/lib/etiketControle.d.ts.map +1 -1
  23. package/dist-lib/lib/etiketControle.js +21 -4
  24. package/dist-lib/lib/htmlNaarPdf.server.d.ts +4 -0
  25. package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -1
  26. package/dist-lib/lib/htmlNaarPdf.server.js +5 -1
  27. package/dist-lib/lib/htmlPdf.server.d.ts +6 -0
  28. package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
  29. package/dist-lib/lib/htmlPdf.server.js +46 -10
  30. package/dist-lib/lib/logoLibrary.d.ts +25 -0
  31. package/dist-lib/lib/logoLibrary.d.ts.map +1 -1
  32. package/dist-lib/lib/logoLibrary.js +73 -1
  33. package/dist-lib/lib/opmaakLimiet.d.ts +8 -0
  34. package/dist-lib/lib/opmaakLimiet.d.ts.map +1 -0
  35. package/dist-lib/lib/opmaakLimiet.js +25 -0
  36. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  37. package/dist-lib/lib/printQueue.server.js +81 -20
  38. package/dist-lib/lib/printService.functions.js +2 -2
  39. package/dist-lib/lib/printplekken.d.ts +17 -1
  40. package/dist-lib/lib/printplekken.d.ts.map +1 -1
  41. package/dist-lib/lib/printplekken.js +42 -3
  42. package/dist-lib/lib/profielHtml.js +1 -1
  43. package/dist-lib/lib/shellPoort.d.ts +1 -1
  44. package/dist-lib/lib/shellPoort.js +1 -1
  45. package/dist-lib/lib/stickerFormaat.d.ts +21 -0
  46. package/dist-lib/lib/stickerFormaat.d.ts.map +1 -0
  47. package/dist-lib/lib/stickerFormaat.js +39 -0
  48. package/dist-lib/lib/testprint.js +1 -1
  49. 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 } 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,
@@ -1351,7 +1382,24 @@ async function verwerkJob(db, job) {
1351
1382
  const keuze = klaar ? { layout: null, ontwerpWint: false } : await zoekLayout(db, job);
1352
1383
  klok.markeer("layout_resolved");
1353
1384
  const layout = keuze.layout;
1385
+ // Klantsticker/traysticker: maat vaststellen (Floriday-formaat, anders de
1386
+ // PDF). Onbekend = niet printen. De maat kiest ook de printer via de
1387
+ // formaatregels, zodat een sticker op een etiket komt dat groot genoeg is.
1388
+ let stickerMaat = null;
1389
+ if (klaar && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? ""))) {
1390
+ stickerMaat = bepaalStickerMaat(floridayStickerMaat(job.payload), pdfPaginaMm(klaar));
1391
+ if (!stickerMaat)
1392
+ throw new GeenDocumentFout(STICKER_MAAT_ONBEKEND);
1393
+ await faseLog(db, job.id, "sticker_maat", { bron: stickerMaat.bron, breedte_mm: stickerMaat.breedte_mm, hoogte_mm: stickerMaat.hoogte_mm });
1394
+ }
1354
1395
  const printerKeuze = await zoekPrinter(db, job, layout);
1396
+ if (stickerMaat) {
1397
+ const viaFormaat = await printerVoorStickerFormaat(db, String(job.documenttype), stickerMaat);
1398
+ if (viaFormaat) {
1399
+ printerKeuze.printer = viaFormaat;
1400
+ await log(db, job.id, "formaat", `Printer gekozen via de formaatregel ${stickerFormaatCode(stickerMaat.breedte_mm, stickerMaat.hoogte_mm)}.`);
1401
+ }
1402
+ }
1355
1403
  klok.markeer("printer_resolved");
1356
1404
  const printer = printerKeuze.printer;
1357
1405
  if (!printer || !printer.extern_printer_id) {
@@ -1388,23 +1436,33 @@ async function verwerkJob(db, job) {
1388
1436
  const uitkomst = { bron: floriday ? "floriday_1op1" : "extern_pdf" };
1389
1437
  let pdfBase64 = klaar;
1390
1438
  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,
1439
+ const opmaakStart = Date.now();
1440
+ await faseLog(db, job.id, "opmaken_gestart", { layout_id: layout?.id ?? null });
1441
+ pdfBase64 = await metTijdslimiet(OPMAAK_LIMIET_MS, async () => {
1442
+ const html = await bouwHtml(db, job, keuze, uitkomst);
1443
+ await faseLog(db, job.id, "html_klaar", { ms: Date.now() - opmaakStart, tekens: html.length });
1444
+ if (!heeftZichtbareInhoud(html)) {
1445
+ throw new GeenDocumentFout("Het document was leeg: er zijn geen gegevens gevonden om af te drukken. " +
1446
+ "Controleer of de layout blokken bevat en of de order gegevens heeft.");
1447
+ }
1448
+ // Een voorbeeldafdruk koppelt bewust geen layout (het meegestuurde
1449
+ // ontwerp is leidend), maar geeft wél het papierformaat van de bewerkte
1450
+ // layout mee. Zonder dit zou het voorbeeld altijd op A4 uitkomen.
1451
+ const vf = (job.payload ?? {})["voorbeeld_formaat"];
1452
+ const liggend = String(layout?.orientatie ?? vf?.["orientatie"] ?? "portrait") === "landscape";
1453
+ const pdf = await htmlNaarPdfServer({
1454
+ html,
1455
+ breedteMm: Number(layout?.breedte_mm ?? vf?.["breedte_mm"] ?? 210),
1456
+ hoogteMm: Number(layout?.hoogte_mm ?? vf?.["hoogte_mm"] ?? 297),
1457
+ margeMm: Number(layout?.marge_boven ?? vf?.["marge_boven"] ?? 10),
1458
+ landschap: liggend,
1459
+ bijOvergeslagen: (src, reden) => {
1460
+ void faseLog(db, job.id, "afbeelding_weggelaten", { bron: src.split("?")[0]?.slice(0, 200), reden });
1461
+ },
1462
+ });
1463
+ return pdf;
1407
1464
  });
1465
+ await faseLog(db, job.id, "pdf_klaar", { ms: Date.now() - opmaakStart, bytes: Math.round((pdfBase64.length * 3) / 4) });
1408
1466
  }
1409
1467
  klok.markeer("rendered");
1410
1468
  if (await isJobGeannuleerd(db, String(job.id))) {
@@ -1417,8 +1475,8 @@ async function verwerkJob(db, job) {
1417
1475
  const hoogteMm = Number(layout?.hoogte_mm ?? vfPapier?.["hoogte_mm"] ?? standaardMaat(printer).hoogte);
1418
1476
  let papier = kiesPapier(formaten, breedteMm, hoogteMm);
1419
1477
  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);
1478
+ const maat = stickerMaat ?? (klaar ? pdfPaginaMm(pdfBase64) : null) ?? { breedte_mm: breedteMm, hoogte_mm: hoogteMm };
1479
+ const uit = etiketPast({ ...maat, soortLabel: documentTypeLabelVoor(String(job.documenttype ?? "Document")) }, label.etiket, label.naam, !!stickerMaat);
1422
1480
  if (!uit.ok) {
1423
1481
  await geweigerd(db, job, uit.code, uit.bericht);
1424
1482
  return "mislukt";
@@ -1502,7 +1560,10 @@ async function verwerkJob(db, job) {
1502
1560
  return await wachtOpLayout(db, job, e.message);
1503
1561
  }
1504
1562
  // Ontbreekt er een document of layout? Dan heeft opnieuw proberen geen zin.
1505
- const blijvend = e instanceof GeenDocumentFout;
1563
+ if (e instanceof OpmaakTeLangFout || e instanceof AfbeeldingInhoudFout) {
1564
+ await faseLog(db, job.id, "fout", { fase: e instanceof OpmaakTeLangFout ? "opmaken" : "afbeelding", fout: e.message });
1565
+ }
1566
+ const blijvend = e instanceof GeenDocumentFout || e instanceof OpmaakTeLangFout || e instanceof AfbeeldingInhoudFout;
1506
1567
  const tijdelijk = !blijvend && (e instanceof PdfRenderFout || e?.name === "PrintToegangFout");
1507
1568
  await mislukt(db, job, e instanceof Error ? e.message : "Afdrukken mislukt", tijdelijk);
1508
1569
  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();
@@ -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":"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"}
@@ -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.1";
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.1";
8
8
  export function normaliseerAdres(u) {
9
9
  const s = String(u ?? "").trim().replace(/\/+$/, "").toLowerCase();
10
10
  return s || null;
@@ -0,0 +1,21 @@
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
+ export declare function bepaalStickerMaat(floriday: {
12
+ breedte_mm: number;
13
+ hoogte_mm: number;
14
+ } | null, pdf: {
15
+ breedte_mm: number;
16
+ hoogte_mm: number;
17
+ } | null): StickerMaat | null;
18
+ export declare const STICKER_MAAT_ONBEKEND = "De maat van deze klantsticker is onbekend; er is niets geprint.";
19
+ /** Formaatcode voor de formaatregels: "48x48" (kleinste maat eerst, hele mm). */
20
+ export declare function stickerFormaatCode(b: number, h: number): string;
21
+ //# 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,CAYtG;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"}
@@ -0,0 +1,39 @@
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
+ return null;
26
+ }
27
+ export function bepaalStickerMaat(floriday, pdf) {
28
+ if (floriday)
29
+ return { ...floriday, bron: "floriday" };
30
+ if (pdf && pdf.breedte_mm > 0 && pdf.hoogte_mm > 0)
31
+ return { ...pdf, bron: "pdf" };
32
+ return null;
33
+ }
34
+ export const STICKER_MAAT_ONBEKEND = "De maat van deze klantsticker is onbekend; er is niets geprint.";
35
+ /** Formaatcode voor de formaatregels: "48x48" (kleinste maat eerst, hele mm). */
36
+ export function stickerFormaatCode(b, h) {
37
+ const [x, y] = [Math.round(b), Math.round(h)].sort((p, q) => p - q);
38
+ return `${x}x${y}`;
39
+ }
@@ -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.2",
4
4
  "flowselections": {
5
5
  "moduleId": "layout-maker",
6
6
  "pages": [