@flowselections/layout-maker 1.69.15 → 1.69.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +3 -8
- package/dist-lib/integrations/supabase/types.d.ts +633 -120
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/etiketRollen.d.ts +41 -0
- package/dist-lib/lib/etiketRollen.d.ts.map +1 -0
- package/dist-lib/lib/etiketRollen.js +64 -0
- package/dist-lib/lib/formaatWeergave.d.ts +24 -0
- package/dist-lib/lib/formaatWeergave.d.ts.map +1 -0
- package/dist-lib/lib/formaatWeergave.js +24 -0
- package/dist-lib/lib/foutTekst.d.ts +3 -0
- package/dist-lib/lib/foutTekst.d.ts.map +1 -1
- package/dist-lib/lib/foutTekst.js +9 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts +80 -0
- package/dist-lib/lib/ontwerpKeuze.d.ts.map +1 -0
- package/dist-lib/lib/ontwerpKeuze.js +193 -0
- package/dist-lib/lib/printQueue.server.d.ts +4 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +237 -5
- package/dist-lib/lib/stickerOntwerp.d.ts +67 -0
- package/dist-lib/lib/stickerOntwerp.d.ts.map +1 -0
- package/dist-lib/lib/stickerOntwerp.js +109 -0
- package/dist-lib/lib/stickerUitwijk.d.ts +5 -0
- package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -1
- package/dist-lib/lib/stickerUitwijk.js +12 -1
- package/dist-lib/lib/testpagina.d.ts +7 -1
- package/dist-lib/lib/testpagina.d.ts.map +1 -1
- package/dist-lib/lib/testpagina.js +39 -5
- package/dist-lib/lib/versie.generated.d.ts +1 -1
- package/dist-lib/lib/versie.generated.js +1 -1
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +53 -3
- package/package.json +1 -1
- package/sql/print-schema.aanvulling.sql +5 -0
- package/sql/print-schema.sql +4234 -2884
- package/sql/print-schema.verslag.md +405 -0
|
@@ -26,6 +26,11 @@ import { etiketPast, leesGeladenEtiket, maatNl, pdfPaginaMm } from "./etiketCont
|
|
|
26
26
|
import { a4VelVoor, kiesUitwijkroute, leesA4StickervelWaarde, leesStickerInstellingenStrikt, uitwijkVoorPickschermen } from "./stickerUitwijk.js";
|
|
27
27
|
import { documentTypeLabel as documentTypeLabelVoor } from "./documentTypes.js";
|
|
28
28
|
import { PAPIERFORMATEN } from "./documentTypes.js";
|
|
29
|
+
import { kiesOntwerpEnPrinter, ontwerpKeuzeVoorOpslag } from "./ontwerpKeuze.js";
|
|
30
|
+
import { afdrukMaat } from "./formaatWeergave.js";
|
|
31
|
+
import { leesStickerOntwerp, stickerGegevens, stickerOntwerpHtml, VOORBEELD_STICKER, VELDEN_PER_KLASSE } from "./stickerOntwerp.js";
|
|
32
|
+
/** Documentsoorten waarvoor de keuzeregel (ontwerp + printer) geldt (1.69.20). */
|
|
33
|
+
export const KEUZE_SOORTEN = new Set(["sticker", "traysticker", "eigen_sticker", "verzendlabel"]);
|
|
29
34
|
const MAX_POGINGEN = 3;
|
|
30
35
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
31
36
|
/**
|
|
@@ -416,6 +421,11 @@ function isVoorbeeldAfdruk(job) {
|
|
|
416
421
|
return true;
|
|
417
422
|
return Boolean(p?.layoutId ?? p?.data?.layoutId ?? p?.layout_id);
|
|
418
423
|
}
|
|
424
|
+
/** Strikt: alleen "Voorbeeld printen" uit een ontwerper (payload.voorbeeld = true). */
|
|
425
|
+
function isOntwerperVoorbeeld(job) {
|
|
426
|
+
const p = (job.payload ?? {});
|
|
427
|
+
return p?.voorbeeld === true || p?.data?.voorbeeld === true;
|
|
428
|
+
}
|
|
419
429
|
/** Mag deze layout als ontwerp winnen van meegestuurde HTML? */
|
|
420
430
|
function magOntwerpWinnen(layout) {
|
|
421
431
|
if (!layout)
|
|
@@ -440,6 +450,13 @@ async function zoekLayout(db, job) {
|
|
|
440
450
|
throw new WachtOpLayoutFout("Wacht op layout_id van de Logistics Engine. Deze taak wordt niet met een vervangende layout uitgevoerd.");
|
|
441
451
|
}
|
|
442
452
|
const voorbeeld = !engineJob && heeftEigenOpmaak && isVoorbeeldAfdruk(job);
|
|
453
|
+
// 1.69.20: "Voorbeeld printen" gebruikt het geopende ontwerp (maat en soort),
|
|
454
|
+
// nooit de standaardlayout van de documentsoort. De meegestuurde opmaak blijft leidend.
|
|
455
|
+
if (!id && voorbeeld && isOntwerperVoorbeeld(job)) {
|
|
456
|
+
const vl = String(job.payload?.voorbeeld_layout_id ?? "").trim();
|
|
457
|
+
if (/^[0-9a-f-]{36}$/i.test(vl))
|
|
458
|
+
id = vl;
|
|
459
|
+
}
|
|
443
460
|
if (id) {
|
|
444
461
|
const { data } = await db
|
|
445
462
|
.from("document_layouts")
|
|
@@ -457,11 +474,14 @@ async function zoekLayout(db, job) {
|
|
|
457
474
|
};
|
|
458
475
|
}
|
|
459
476
|
const documenttype = normaliseerDocumenttype(leesDocumentCode(job) || job.documenttype);
|
|
477
|
+
// Standaardontwerpen van Flow Selections (bron flowselections) worden alleen
|
|
478
|
+
// via de keuzeregel gekozen, nooit als standaardlayout van de soort.
|
|
460
479
|
const { data } = await db
|
|
461
480
|
.from("document_layouts")
|
|
462
481
|
.select("*")
|
|
463
482
|
.eq("documenttype", documenttype)
|
|
464
483
|
.eq("actief", true)
|
|
484
|
+
.or("bron.is.null,bron.neq.flowselections")
|
|
465
485
|
.order("is_standaard", { ascending: false })
|
|
466
486
|
.order("updated_at", { ascending: false })
|
|
467
487
|
.limit(1);
|
|
@@ -1071,6 +1091,30 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
|
|
|
1071
1091
|
noteer("eigen_layout");
|
|
1072
1092
|
return controlelijstHtml(p, cfg);
|
|
1073
1093
|
}
|
|
1094
|
+
// Stickerontwerp met velden (fs_sticker, 1.69.20): standaardontwerpen van
|
|
1095
|
+
// Flow Selections en de stickerontwerper; opgemaakt op de maat van de layout
|
|
1096
|
+
// (bij een standaardontwerp is dat de maat van de rol).
|
|
1097
|
+
const fsSticker = leesStickerOntwerp(cfg);
|
|
1098
|
+
if (fsSticker) {
|
|
1099
|
+
const velden = fsSticker.velden.length ? fsSticker.velden : VELDEN_PER_KLASSE[fsSticker.klasse ?? "middel"];
|
|
1100
|
+
let gegevens = stickerGegevens(p);
|
|
1101
|
+
if (isTestprintJob(job) || isOntwerperVoorbeeld(job)) {
|
|
1102
|
+
gegevens = { ...VOORBEELD_STICKER };
|
|
1103
|
+
}
|
|
1104
|
+
else if (!gegevens.klantnaam || !gegevens.leverdatum) {
|
|
1105
|
+
const order = await laadOrderVanuitDatabase(db, p).catch(() => null);
|
|
1106
|
+
if (order)
|
|
1107
|
+
gegevens = stickerGegevens(p, order);
|
|
1108
|
+
}
|
|
1109
|
+
const inst = await bedrijfsInstelling(db).catch(() => null);
|
|
1110
|
+
let logoSrc = null;
|
|
1111
|
+
if (velden.includes("logo") && inst?.logoId) {
|
|
1112
|
+
const logos = await logosVoor(db, { config: { logo: { logoId: inst.logoId } } }).catch(() => []);
|
|
1113
|
+
logoSrc = logos.find((l) => l.id === inst.logoId)?.viewUrl ?? null;
|
|
1114
|
+
}
|
|
1115
|
+
noteer("eigen_layout");
|
|
1116
|
+
return stickerOntwerpHtml(gegevens, velden, { breedte_mm: breedteMm, hoogte_mm: hoogteMm }, { naam: String(inst?.naam ?? ""), logoSrc });
|
|
1117
|
+
}
|
|
1074
1118
|
// Stickers met "kies altijd de layout van de klant": meegestuurde opmaak van
|
|
1075
1119
|
// de klant wint. Is er niets meegestuurd, dan bepaalt de terugvalkeuze of we
|
|
1076
1120
|
// deze layout gebruiken of de opdracht netjes laten mislukken.
|
|
@@ -1695,7 +1739,7 @@ async function verwerkJob(db, job) {
|
|
|
1695
1739
|
throw new GeenDocumentFout(STICKER_MAAT_ONBEKEND);
|
|
1696
1740
|
await faseLog(db, job.id, "sticker_maat", { bron: stickerMaat.bron, breedte_mm: stickerMaat.breedte_mm, hoogte_mm: stickerMaat.hoogte_mm });
|
|
1697
1741
|
}
|
|
1698
|
-
else if (!klaar && layout?.config?.eigen_sticker) {
|
|
1742
|
+
else if (!klaar && layout?.config?.eigen_sticker && !isOntwerperVoorbeeld(job)) {
|
|
1699
1743
|
// Eigen sticker: werkelijke maat van de geüploade sticker; die kiest de
|
|
1700
1744
|
// printer en gaat door de etiketcontrole. Onbekend = niet printen.
|
|
1701
1745
|
const m = await zoekEigenStickerMaat(db, (job.payload ?? {}));
|
|
@@ -1713,7 +1757,7 @@ async function verwerkJob(db, job) {
|
|
|
1713
1757
|
}
|
|
1714
1758
|
}
|
|
1715
1759
|
klok.markeer("printer_resolved");
|
|
1716
|
-
|
|
1760
|
+
let printer = printerKeuze.printer;
|
|
1717
1761
|
if (!printer || !printer.extern_printer_id) {
|
|
1718
1762
|
await mislukt(db, job, printerKeuze.reden ||
|
|
1719
1763
|
`Printer '${printer?.naam ?? "onbekend"}' is niet aan PrintNode gekoppeld.`, true);
|
|
@@ -1725,9 +1769,36 @@ async function verwerkJob(db, job) {
|
|
|
1725
1769
|
await log(db, job.id, "annulering_bevestigd", "Niet afgeleverd: opdracht was geannuleerd.");
|
|
1726
1770
|
return "wachtend";
|
|
1727
1771
|
}
|
|
1772
|
+
// 1.69.20: één keuzeregel voor ontwerp + printer (stap 1–5).
|
|
1773
|
+
let ontwerpKeuze = null;
|
|
1774
|
+
let naarA4 = null;
|
|
1775
|
+
if (keuzeRegelGeldt(job)) {
|
|
1776
|
+
const k = await bepaalOntwerpKeuze(db, job, layout, printer, stickerMaat, !!klaar);
|
|
1777
|
+
if (k) {
|
|
1778
|
+
ontwerpKeuze = k.keuze;
|
|
1779
|
+
await log(db, job.id, "waarom", k.keuze.reden);
|
|
1780
|
+
for (const w of k.keuze.waarschuwingen)
|
|
1781
|
+
await log(db, job.id, "waarschuwing", w);
|
|
1782
|
+
if (k.keuze.stap === 5) {
|
|
1783
|
+
await db.from("print_jobs").update({ ontwerp_keuze: ontwerpKeuzeVoorOpslag(k.keuze) }).eq("id", job.id);
|
|
1784
|
+
await geweigerd(db, job, "FORMAAT_PAST_NIET", k.keuze.reden);
|
|
1785
|
+
return "mislukt";
|
|
1786
|
+
}
|
|
1787
|
+
if (k.printer)
|
|
1788
|
+
printer = k.printer;
|
|
1789
|
+
if (k.layout) {
|
|
1790
|
+
layout = k.layout;
|
|
1791
|
+
keuze.layout = k.layout;
|
|
1792
|
+
keuze.ontwerpWint = true;
|
|
1793
|
+
stickerMaat = null;
|
|
1794
|
+
}
|
|
1795
|
+
if (k.keuze.stap === 4)
|
|
1796
|
+
naarA4 = k.printer;
|
|
1797
|
+
}
|
|
1798
|
+
}
|
|
1728
1799
|
// Labelprinter: het geladen etiket is leidend (punt "geladen etiket").
|
|
1729
|
-
const label = await labelControleVoorbereiden(db, printer);
|
|
1730
|
-
if (!label && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? ""))) {
|
|
1800
|
+
const label = naarA4 ? null : await labelControleVoorbereiden(db, printer);
|
|
1801
|
+
if (!naarA4 && !label && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? ""))) {
|
|
1731
1802
|
await geweigerd(db, job, "GEEN_GELADEN_ETIKET", `${documentTypeLabelVoor(String(job.documenttype))} gaat alleen naar een labelprinter met een ingesteld geladen etiket; printer ${String(printer.naam ?? printer.id)} heeft er geen.`);
|
|
1732
1803
|
return "mislukt";
|
|
1733
1804
|
}
|
|
@@ -1806,7 +1877,30 @@ async function verwerkJob(db, job) {
|
|
|
1806
1877
|
const fitToPage = false;
|
|
1807
1878
|
let kopieenNaarPrinter = Number(job.kopieen ?? 1);
|
|
1808
1879
|
let papier = kiesPapier(formaten, breedteMm, hoogteMm);
|
|
1809
|
-
if (
|
|
1880
|
+
if (naarA4) {
|
|
1881
|
+
// Stap 4 van de keuzeregel: A4 met snijlijnen (of het A4-stickervel van de printplek), 1-op-1.
|
|
1882
|
+
const maat = stickerMaat ?? pdfPaginaMm(pdfBase64) ?? afdrukMaat(kiesFormaat(job, layout));
|
|
1883
|
+
const plekId = leesPrintPlekId(job) || (await zoekPrintPlekId(db, job).catch(() => null));
|
|
1884
|
+
const vel = plekId ? await leesA4Stickervel(db, String(plekId)) : null;
|
|
1885
|
+
const velIndeling = a4VelVoor(vel, maat);
|
|
1886
|
+
uitwijk = kiesUitwijkroute({
|
|
1887
|
+
sticker: maat,
|
|
1888
|
+
etiketten: [],
|
|
1889
|
+
a4Printer: { naam: String(naarA4.weergavenaam || naarA4.naam || "A4-printer"), id: String(naarA4.id) },
|
|
1890
|
+
a4VelIngesteld: !!velIndeling,
|
|
1891
|
+
a4VelIndeling: velIndeling,
|
|
1892
|
+
instelling: null,
|
|
1893
|
+
});
|
|
1894
|
+
if (uitwijk) {
|
|
1895
|
+
doelPrinter = naarA4;
|
|
1896
|
+
const geplaatst = await voerUitwijkUit(pdfBase64, uitwijk, maat, Number(job.kopieen ?? 1));
|
|
1897
|
+
pdfBase64 = geplaatst.pdfBase64;
|
|
1898
|
+
kopieenNaarPrinter = geplaatst.kopieen;
|
|
1899
|
+
papier = { paper: uitwijk.paper || null, rotate: 0, uitleg: uitwijk.reden };
|
|
1900
|
+
await log(db, job.id, "uitwijk", `${uitwijk.reden} (${uitwijk.printerNaam}).`);
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
else if (label) {
|
|
1810
1904
|
const maat = stickerMaat ?? (klaar ? pdfPaginaMm(pdfBase64) : null) ?? { breedte_mm: breedteMm, hoogte_mm: hoogteMm };
|
|
1811
1905
|
const uit = etiketPast({ ...maat, soortLabel: stickerCache?.sticker_type ? stickerTypeLabel(stickerCache.sticker_type) : documentTypeLabelVoor(String(job.documenttype ?? "Document")) }, label.etiket, label.naam, !!stickerMaat);
|
|
1812
1906
|
if (label.etiket && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? "")) && (uit.ok || uit.code === "FORMAAT_PAST_NIET")) {
|
|
@@ -1884,6 +1978,7 @@ async function verwerkJob(db, job) {
|
|
|
1884
1978
|
gebruikte_bron: uitkomst.bron,
|
|
1885
1979
|
extern_job_id: externJobId,
|
|
1886
1980
|
printer_keuze: await printerKeuzeVoor(db, job, doelPrinter, uitwijk),
|
|
1981
|
+
...(ontwerpKeuze ? { ontwerp_keuze: ontwerpKeuzeVoorOpslag(ontwerpKeuze) } : {}),
|
|
1887
1982
|
printnode_status: "new",
|
|
1888
1983
|
printnode_status_op: new Date().toISOString(),
|
|
1889
1984
|
verloopt_na_s: verloopt,
|
|
@@ -2450,3 +2545,140 @@ function leesWerkplekId(job) {
|
|
|
2450
2545
|
const v = String((job.payload ?? {})["werkplek_id"] ?? "").trim();
|
|
2451
2546
|
return /^[0-9a-f-]{36}$/i.test(v) ? v : null;
|
|
2452
2547
|
}
|
|
2548
|
+
// ============================================================================
|
|
2549
|
+
// 1.69.20 — keuzeregel ontwerp + printer (zie ontwerpKeuze.ts).
|
|
2550
|
+
// ============================================================================
|
|
2551
|
+
const KEUZE_PRINTER_VELDEN = "id, naam, weergavenaam, extern_printer_id, actief, papierformaat, ondersteunde_formaten, ondersteunde_laden, formaten_bijgewerkt_op, afdrukmethode, geladen_etiket";
|
|
2552
|
+
/** Geldt de keuzeregel? Niet voor een testprint op één printer en niet voor een testpagina. */
|
|
2553
|
+
export function keuzeRegelGeldt(job) {
|
|
2554
|
+
const p = (job.payload ?? {});
|
|
2555
|
+
if (p["is_testpagina"] === true)
|
|
2556
|
+
return false;
|
|
2557
|
+
if (p["is_testprint"] === true && p["uitwijk_test"] !== true)
|
|
2558
|
+
return false;
|
|
2559
|
+
return KEUZE_SOORTEN.has(normaliseerDocumenttype(leesDocumentCode(job) || job.documenttype));
|
|
2560
|
+
}
|
|
2561
|
+
const printerNaamVan = (p) => String(p.weergavenaam || p.naam || "Printer");
|
|
2562
|
+
function kandidaatUitLayout(l, herkomst) {
|
|
2563
|
+
const m = afdrukMaat(l);
|
|
2564
|
+
const fs = leesStickerOntwerp(l.config);
|
|
2565
|
+
return { id: String(l.id), naam: String(l.naam ?? "Ontwerp"), breedte_mm: m.breedte_mm, hoogte_mm: m.hoogte_mm, herkomst, ...(fs?.klasse ? { klasse: fs.klasse } : {}) };
|
|
2566
|
+
}
|
|
2567
|
+
/**
|
|
2568
|
+
* Bepaalt ontwerp en printer voor een sticker-achtig document. Geeft null als
|
|
2569
|
+
* de regel niet van toepassing is (bijvoorbeeld een eigen traysticker, die al
|
|
2570
|
+
* op de maat van het etiket wordt opgebouwd).
|
|
2571
|
+
*/
|
|
2572
|
+
async function bepaalOntwerpKeuze(db, job, layout, printer, stickerMaat, klaar) {
|
|
2573
|
+
const type = normaliseerDocumenttype(leesDocumentCode(job) || job.documenttype);
|
|
2574
|
+
const cfg = (layout?.config ?? {});
|
|
2575
|
+
if (cfg.eigen_traysticker)
|
|
2576
|
+
return null;
|
|
2577
|
+
const voorbeeld = isOntwerperVoorbeeld(job);
|
|
2578
|
+
const vast = klaar || voorbeeld;
|
|
2579
|
+
// Printers van de printplek: de gerouteerde printer eerst.
|
|
2580
|
+
const plekId = leesPrintPlekId(job) || (await zoekPrintPlekId(db, job).catch(() => "")) || "";
|
|
2581
|
+
const ids = [String(printer.id)];
|
|
2582
|
+
const labelToegewezen = new Set();
|
|
2583
|
+
let a4 = null;
|
|
2584
|
+
let a4Terugval = true;
|
|
2585
|
+
if (plekId) {
|
|
2586
|
+
const { data: rijen } = await db.from("document_printplek_printers").select("printer_id, documenttype").eq("print_plek_id", plekId);
|
|
2587
|
+
for (const r of arr(rijen)) {
|
|
2588
|
+
if (!KEUZE_SOORTEN.has(String(r.documenttype)) || !r.printer_id)
|
|
2589
|
+
continue;
|
|
2590
|
+
labelToegewezen.add(String(r.printer_id));
|
|
2591
|
+
if (!ids.includes(String(r.printer_id)))
|
|
2592
|
+
ids.push(String(r.printer_id));
|
|
2593
|
+
}
|
|
2594
|
+
const { data: plek } = await db.from("print_plekken").select("a4_terugval").eq("id", plekId).maybeSingle();
|
|
2595
|
+
a4Terugval = plek?.a4_terugval !== false;
|
|
2596
|
+
const { data: a4Id } = await db.rpc("printplek_printer", { _plek: plekId, _documenttype: "pakbon" });
|
|
2597
|
+
if (typeof a4Id === "string") {
|
|
2598
|
+
const { data } = await db.from("printers").select(KEUZE_PRINTER_VELDEN).eq("id", a4Id).maybeSingle();
|
|
2599
|
+
a4 = data && data.actief !== false && data.extern_printer_id ? data : null;
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2602
|
+
const { data: pr } = await db.from("printers").select(KEUZE_PRINTER_VELDEN).in("id", ids);
|
|
2603
|
+
const perId = new Map(arr(pr).map((p) => [String(p.id), p]));
|
|
2604
|
+
perId.set(String(printer.id), printer);
|
|
2605
|
+
const rolPrinters = [];
|
|
2606
|
+
for (const id of ids) {
|
|
2607
|
+
const p = perId.get(id);
|
|
2608
|
+
if (!p || p.actief === false || !p.extern_printer_id)
|
|
2609
|
+
continue;
|
|
2610
|
+
const e = leesGeladenEtiket(p.geladen_etiket);
|
|
2611
|
+
// Een printer zonder rol telt alleen mee (als "formaat onbekend") als hij voor stickers is ingesteld.
|
|
2612
|
+
if (!e && !labelToegewezen.has(id))
|
|
2613
|
+
continue;
|
|
2614
|
+
if (!e && a4 && String(a4.id) === id)
|
|
2615
|
+
continue;
|
|
2616
|
+
rolPrinters.push({ id, naam: printerNaamVan(p), breedte_mm: e?.breedte_mm ?? null, hoogte_mm: e?.hoogte_mm ?? null });
|
|
2617
|
+
}
|
|
2618
|
+
// Ontwerpen.
|
|
2619
|
+
const documentLabel = klaar ? (type === "traysticker" ? "Floriday-traysticker" : "Floriday-sticker") : documentTypeLabelVoor(type);
|
|
2620
|
+
let klant = null;
|
|
2621
|
+
const kweker = [];
|
|
2622
|
+
if (stickerMaat) {
|
|
2623
|
+
klant = { id: layout?.id ? String(layout.id) : null, naam: String(layout?.naam ?? documentLabel), breedte_mm: stickerMaat.breedte_mm, hoogte_mm: stickerMaat.hoogte_mm, herkomst: "klant" };
|
|
2624
|
+
}
|
|
2625
|
+
else if (layout && (voorbeeld || isEngineOpdracht(job) || cfg.klantlayout?.gebruik_klantlayout === true)) {
|
|
2626
|
+
klant = kandidaatUitLayout(layout, "klant");
|
|
2627
|
+
}
|
|
2628
|
+
else if (layout && String(layout.bron ?? "eigen") !== "flowselections") {
|
|
2629
|
+
kweker.push(kandidaatUitLayout(layout, "kweker"));
|
|
2630
|
+
}
|
|
2631
|
+
const rijen = new Map();
|
|
2632
|
+
const standaard = [];
|
|
2633
|
+
if (!vast) {
|
|
2634
|
+
const { data: eigen } = await db
|
|
2635
|
+
.from("document_layouts")
|
|
2636
|
+
.select("*")
|
|
2637
|
+
.eq("documenttype", type)
|
|
2638
|
+
.eq("actief", true)
|
|
2639
|
+
.order("is_standaard", { ascending: false })
|
|
2640
|
+
.order("updated_at", { ascending: false });
|
|
2641
|
+
for (const l of arr(eigen)) {
|
|
2642
|
+
rijen.set(String(l.id), l);
|
|
2643
|
+
const c = (l.config ?? {});
|
|
2644
|
+
if (String(l.bron ?? "eigen") === "flowselections") {
|
|
2645
|
+
standaard.push(kandidaatUitLayout(l, "standaard"));
|
|
2646
|
+
continue;
|
|
2647
|
+
}
|
|
2648
|
+
if (l.systeem === true || String(l.bron ?? "eigen") !== "eigen")
|
|
2649
|
+
continue;
|
|
2650
|
+
if (String(l.id) === String(layout?.id ?? "") || c.eigen_sticker || c.eigen_traysticker || c.klantlayout?.gebruik_klantlayout === true)
|
|
2651
|
+
continue;
|
|
2652
|
+
if (!(Number(l.breedte_mm) > 0) || !(Number(l.hoogte_mm) > 0))
|
|
2653
|
+
continue;
|
|
2654
|
+
kweker.push(kandidaatUitLayout(l, "kweker"));
|
|
2655
|
+
}
|
|
2656
|
+
}
|
|
2657
|
+
const keuze = kiesOntwerpEnPrinter({
|
|
2658
|
+
documentLabel,
|
|
2659
|
+
klant,
|
|
2660
|
+
kweker,
|
|
2661
|
+
standaard,
|
|
2662
|
+
printers: rolPrinters,
|
|
2663
|
+
a4Printer: a4 ? { id: String(a4.id), naam: printerNaamVan(a4) } : null,
|
|
2664
|
+
a4Terugval,
|
|
2665
|
+
vastFormaat: vast,
|
|
2666
|
+
});
|
|
2667
|
+
let nieuwePrinter = null;
|
|
2668
|
+
if (keuze.stap === 4)
|
|
2669
|
+
nieuwePrinter = a4;
|
|
2670
|
+
else if (keuze.printer && keuze.printer.id !== String(printer.id))
|
|
2671
|
+
nieuwePrinter = perId.get(keuze.printer.id) ?? null;
|
|
2672
|
+
let nieuweLayout = null;
|
|
2673
|
+
const gekozenId = keuze.ontwerp?.id ?? null;
|
|
2674
|
+
if ((keuze.stap === 2 || keuze.stap === 3) && gekozenId && gekozenId !== String(layout?.id ?? "")) {
|
|
2675
|
+
const rij = rijen.get(gekozenId);
|
|
2676
|
+
if (rij) {
|
|
2677
|
+
nieuweLayout =
|
|
2678
|
+
keuze.stap === 3 && keuze.opmaak_breedte_mm && keuze.opmaak_hoogte_mm
|
|
2679
|
+
? { ...rij, breedte_mm: keuze.opmaak_breedte_mm, hoogte_mm: keuze.opmaak_hoogte_mm, orientatie: "portrait" }
|
|
2680
|
+
: rij;
|
|
2681
|
+
}
|
|
2682
|
+
}
|
|
2683
|
+
return { keuze, printer: nieuwePrinter, layout: nieuweLayout };
|
|
2684
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { FormaatKlasse } from "./etiketRollen.js";
|
|
2
|
+
export declare const STICKER_VELDEN: readonly [{
|
|
3
|
+
readonly veld: "logo";
|
|
4
|
+
readonly label: "Logo";
|
|
5
|
+
}, {
|
|
6
|
+
readonly veld: "bedrijfsnaam";
|
|
7
|
+
readonly label: "Bedrijfsnaam";
|
|
8
|
+
}, {
|
|
9
|
+
readonly veld: "klantnaam";
|
|
10
|
+
readonly label: "Klant";
|
|
11
|
+
}, {
|
|
12
|
+
readonly veld: "ordernummer";
|
|
13
|
+
readonly label: "Order";
|
|
14
|
+
}, {
|
|
15
|
+
readonly veld: "leverdatum";
|
|
16
|
+
readonly label: "Leverdatum";
|
|
17
|
+
}, {
|
|
18
|
+
readonly veld: "afleverlocatie";
|
|
19
|
+
readonly label: "Afleverlocatie";
|
|
20
|
+
}, {
|
|
21
|
+
readonly veld: "product";
|
|
22
|
+
readonly label: "Product";
|
|
23
|
+
}, {
|
|
24
|
+
readonly veld: "planten_per_fust";
|
|
25
|
+
readonly label: "Planten per fust";
|
|
26
|
+
}, {
|
|
27
|
+
readonly veld: "fust";
|
|
28
|
+
readonly label: "Fust x van y";
|
|
29
|
+
}, {
|
|
30
|
+
readonly veld: "barcode";
|
|
31
|
+
readonly label: "Barcode (Code128)";
|
|
32
|
+
}];
|
|
33
|
+
export type StickerVeld = (typeof STICKER_VELDEN)[number]["veld"];
|
|
34
|
+
/** Velden per klasse (gelijk aan de standaardontwerpen in de database). */
|
|
35
|
+
export declare const VELDEN_PER_KLASSE: Record<FormaatKlasse, StickerVeld[]>;
|
|
36
|
+
/** Leest config.fs_sticker; null als het geen stickerontwerp is. */
|
|
37
|
+
export declare function leesStickerOntwerp(cfg: unknown): {
|
|
38
|
+
klasse: FormaatKlasse | null;
|
|
39
|
+
velden: StickerVeld[];
|
|
40
|
+
} | null;
|
|
41
|
+
export interface StickerGegevens {
|
|
42
|
+
klantnaam: string;
|
|
43
|
+
ordernummer: string;
|
|
44
|
+
leverdatum: string;
|
|
45
|
+
afleverlocatie: string;
|
|
46
|
+
product: string;
|
|
47
|
+
planten_per_fust: string;
|
|
48
|
+
fust_nummer: string;
|
|
49
|
+
fust_totaal: string;
|
|
50
|
+
barcode: string;
|
|
51
|
+
}
|
|
52
|
+
/** Gegevens uit de opdracht (en eventueel de order); lege velden blijven leeg. */
|
|
53
|
+
export declare function stickerGegevens(payload: unknown, order?: unknown): StickerGegevens;
|
|
54
|
+
/** Voorbeeldgegevens: geen echte order, geen echte namen. */
|
|
55
|
+
export declare const VOORBEELD_STICKER: StickerGegevens;
|
|
56
|
+
/**
|
|
57
|
+
* HTML van een stickerontwerp op een vaste maat (mm). Lettergrootte en
|
|
58
|
+
* barcodehoogte volgen de maat van het etiket; nooit buiten het etiket.
|
|
59
|
+
*/
|
|
60
|
+
export declare function stickerOntwerpHtml(g: StickerGegevens, velden: StickerVeld[], maat: {
|
|
61
|
+
breedte_mm: number;
|
|
62
|
+
hoogte_mm: number;
|
|
63
|
+
}, bedrijf?: {
|
|
64
|
+
naam?: string;
|
|
65
|
+
logoSrc?: string | null;
|
|
66
|
+
}): string;
|
|
67
|
+
//# sourceMappingURL=stickerOntwerp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickerOntwerp.d.ts","sourceRoot":"","sources":["../../src/lib/stickerOntwerp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,CAIlE,CAAC;AAQF,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAO/G;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,OAAc,GAAG,eAAe,CAoBxF;AAED,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,EAAE,eAU/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,eAAe,EAClB,MAAM,EAAE,WAAW,EAAE,EACrB,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/C,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GACvD,MAAM,CAsBR"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/stickerOntwerp.ts — stickerontwerp met velden (config.fs_sticker),
|
|
3
|
+
// voor de standaardontwerpen van Flow Selections en de stickerontwerper
|
|
4
|
+
// (1.69.20). Puur: geen database. Lege velden blijven leeg.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { code128BarsHtml } from "./code128.js";
|
|
7
|
+
export const STICKER_VELDEN = [
|
|
8
|
+
{ veld: "logo", label: "Logo" },
|
|
9
|
+
{ veld: "bedrijfsnaam", label: "Bedrijfsnaam" },
|
|
10
|
+
{ veld: "klantnaam", label: "Klant" },
|
|
11
|
+
{ veld: "ordernummer", label: "Order" },
|
|
12
|
+
{ veld: "leverdatum", label: "Leverdatum" },
|
|
13
|
+
{ veld: "afleverlocatie", label: "Afleverlocatie" },
|
|
14
|
+
{ veld: "product", label: "Product" },
|
|
15
|
+
{ veld: "planten_per_fust", label: "Planten per fust" },
|
|
16
|
+
{ veld: "fust", label: "Fust x van y" },
|
|
17
|
+
{ veld: "barcode", label: "Barcode (Code128)" },
|
|
18
|
+
];
|
|
19
|
+
/** Velden per klasse (gelijk aan de standaardontwerpen in de database). */
|
|
20
|
+
export const VELDEN_PER_KLASSE = {
|
|
21
|
+
groot: ["logo", "bedrijfsnaam", "klantnaam", "ordernummer", "leverdatum", "afleverlocatie", "product", "planten_per_fust", "fust", "barcode"],
|
|
22
|
+
middel: ["klantnaam", "ordernummer", "leverdatum", "afleverlocatie", "product", "planten_per_fust", "fust", "barcode"],
|
|
23
|
+
klein: ["ordernummer", "klantnaam", "fust", "barcode"],
|
|
24
|
+
};
|
|
25
|
+
const obj = (v) => (v && typeof v === "object" && !Array.isArray(v) ? v : {});
|
|
26
|
+
const tekst = (v) => (v == null ? "" : String(v).trim());
|
|
27
|
+
const esc = (v) => tekst(v).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
28
|
+
/** Leest config.fs_sticker; null als het geen stickerontwerp is. */
|
|
29
|
+
export function leesStickerOntwerp(cfg) {
|
|
30
|
+
const c = obj(obj(cfg)["fs_sticker"]);
|
|
31
|
+
if (!Object.keys(c).length)
|
|
32
|
+
return null;
|
|
33
|
+
const bekend = new Set(STICKER_VELDEN.map((v) => v.veld));
|
|
34
|
+
const velden = (Array.isArray(c["velden"]) ? c["velden"] : []).map(String).filter((v) => bekend.has(v));
|
|
35
|
+
const k = tekst(c["klasse"]);
|
|
36
|
+
return { klasse: k === "groot" || k === "middel" || k === "klein" ? k : null, velden };
|
|
37
|
+
}
|
|
38
|
+
/** Gegevens uit de opdracht (en eventueel de order); lege velden blijven leeg. */
|
|
39
|
+
export function stickerGegevens(payload, order = null) {
|
|
40
|
+
const p = obj(payload);
|
|
41
|
+
const o = obj(order);
|
|
42
|
+
const ok = obj(o["klant"]);
|
|
43
|
+
const eerst = (...v) => v.map(tekst).find(Boolean) ?? "";
|
|
44
|
+
const tray = Array.isArray(p["tray_producten"]) ? obj(p["tray_producten"][0]) : {};
|
|
45
|
+
const ordernummer = eerst(p["order_number"], p["ordernummer"], o["ordernummer"], o["order_number"]);
|
|
46
|
+
const fustNummer = eerst(p["tray_nummer"], p["fust_nummer"], p["fust_volgnummer"]);
|
|
47
|
+
const fustTotaal = eerst(p["tray_totaal"], p["fust_totaal"], p["fusten_totaal"]);
|
|
48
|
+
return {
|
|
49
|
+
klantnaam: eerst(p["klantnaam"], p["customer_name"], ok["naam"], o["klantnaam"]),
|
|
50
|
+
ordernummer,
|
|
51
|
+
leverdatum: eerst(p["leverdatum"], p["delivery_date"], o["leverdatum"], o["delivery_date"]),
|
|
52
|
+
afleverlocatie: eerst(p["afleverlocatie"], p["delivery_location"], o["afleverlocatie"]),
|
|
53
|
+
product: eerst(p["productnaam"], p["artikelnaam"], p["product"], tray["naam"], tray["productnaam"]),
|
|
54
|
+
planten_per_fust: eerst(p["planten_per_fust"], p["aantal_per_fust"], tray["aantal"]),
|
|
55
|
+
fust_nummer: fustNummer,
|
|
56
|
+
fust_totaal: fustTotaal,
|
|
57
|
+
barcode: eerst(p["barcode"], ordernummer && fustNummer ? `${ordernummer}-T${fustNummer}` : ordernummer),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Voorbeeldgegevens: geen echte order, geen echte namen. */
|
|
61
|
+
export const VOORBEELD_STICKER = {
|
|
62
|
+
klantnaam: "Voorbeeldklant",
|
|
63
|
+
ordernummer: "VOORBEELD-0001",
|
|
64
|
+
leverdatum: "01-01-2027",
|
|
65
|
+
afleverlocatie: "Voorbeeldlocatie",
|
|
66
|
+
product: "Voorbeeldplant 12 cm",
|
|
67
|
+
planten_per_fust: "10",
|
|
68
|
+
fust_nummer: "1",
|
|
69
|
+
fust_totaal: "2",
|
|
70
|
+
barcode: "VOORBEELD-0001-T1",
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* HTML van een stickerontwerp op een vaste maat (mm). Lettergrootte en
|
|
74
|
+
* barcodehoogte volgen de maat van het etiket; nooit buiten het etiket.
|
|
75
|
+
*/
|
|
76
|
+
export function stickerOntwerpHtml(g, velden, maat, bedrijf = {}) {
|
|
77
|
+
const aan = new Set(velden);
|
|
78
|
+
const b = maat.breedte_mm;
|
|
79
|
+
const h = maat.hoogte_mm;
|
|
80
|
+
const kort = Math.min(b, h);
|
|
81
|
+
const pt = kort <= 30 ? 6.5 : kort <= 40 ? 7.5 : kort <= 70 ? 8 : 10;
|
|
82
|
+
const bcHoogte = Math.max(5, Math.min(14, h * 0.28));
|
|
83
|
+
const regel = (label, w) => (w ? `<div class="r"><b>${label}</b> ${esc(w)}</div>` : "");
|
|
84
|
+
const delen = [];
|
|
85
|
+
const kop = [];
|
|
86
|
+
if (aan.has("logo") && bedrijf.logoSrc)
|
|
87
|
+
kop.push(`<img class="logo" src="${bedrijf.logoSrc}" alt="">`);
|
|
88
|
+
if (aan.has("bedrijfsnaam") && bedrijf.naam)
|
|
89
|
+
kop.push(`<span class="bn">${esc(bedrijf.naam)}</span>`);
|
|
90
|
+
if (kop.length)
|
|
91
|
+
delen.push(`<div class="kop">${kop.join("")}</div>`);
|
|
92
|
+
if (aan.has("ordernummer"))
|
|
93
|
+
delen.push(regel("Order", g.ordernummer));
|
|
94
|
+
if (aan.has("klantnaam"))
|
|
95
|
+
delen.push(regel("Klant", g.klantnaam));
|
|
96
|
+
if (aan.has("leverdatum"))
|
|
97
|
+
delen.push(regel("Levering", g.leverdatum));
|
|
98
|
+
if (aan.has("afleverlocatie"))
|
|
99
|
+
delen.push(regel("Locatie", g.afleverlocatie));
|
|
100
|
+
if (aan.has("product"))
|
|
101
|
+
delen.push(regel("Product", g.product));
|
|
102
|
+
if (aan.has("planten_per_fust"))
|
|
103
|
+
delen.push(regel("Per fust", g.planten_per_fust));
|
|
104
|
+
if (aan.has("fust") && (g.fust_nummer || g.fust_totaal))
|
|
105
|
+
delen.push(`<div class="fust">Fust ${esc(g.fust_nummer)} van ${esc(g.fust_totaal)}</div>`);
|
|
106
|
+
if (aan.has("barcode") && g.barcode)
|
|
107
|
+
delen.push(`<div class="bc">${code128BarsHtml(g.barcode)}</div><div class="bct">${esc(g.barcode)}</div>`);
|
|
108
|
+
return `<!doctype html><html><head><meta charset="utf-8"><style>@page{size:${b}mm ${h}mm;margin:0}html,body{margin:0;padding:0}body{width:${b}mm;height:${h}mm;box-sizing:border-box;padding:1.5mm 2mm;font:${pt}pt Arial,sans-serif;overflow:hidden;display:flex;flex-direction:column}.kop{display:flex;align-items:center;gap:2mm;margin-bottom:1mm}.logo{max-height:${Math.min(12, h * 0.12)}mm;max-width:35mm}.bn{font-weight:bold}.r{line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fust{font-weight:bold;font-size:${pt + 2}pt;margin:0.5mm 0}.bc{display:flex;height:${bcHoogte}mm;margin-top:auto}.bct{text-align:center;font-size:${Math.max(5, pt - 1.5)}pt}</style></head><body>${delen.join("")}</body></html>`;
|
|
109
|
+
}
|
|
@@ -86,6 +86,11 @@ export interface UitwijkUitkomst {
|
|
|
86
86
|
}
|
|
87
87
|
/** Tolerantie bij het herkennen van een papiermaat van de printer. */
|
|
88
88
|
export declare const PAPIER_TOLERANTIE_MM = 1;
|
|
89
|
+
/** 1.69.20: nooit verkleinen onder 95 % (barcode-leesbaarheid), ook niet bij een lagere opgeslagen waarde. */
|
|
90
|
+
export declare const MIN_VERKLEIN_PCT = 95;
|
|
91
|
+
export declare function effectieveOndergrens(opgeslagen: number): number;
|
|
92
|
+
/** Waarschuwing voor een opgeslagen waarde onder 95 % (de instelling zelf blijft ongewijzigd). */
|
|
93
|
+
export declare function ondergrensWaarschuwing(label: string, opgeslagen: number): string | null;
|
|
89
94
|
/** Papiernaam op afmeting (±1 mm, ook gedraaid) uit de PrintNode-lijst; null als er geen is. */
|
|
90
95
|
export declare function papierOpMaat(formaten: PrinterFormaten | null | undefined, b: number, h: number): string | null;
|
|
91
96
|
/** Nominale smalste streep van een Code128/veilingbarcode op ware grootte. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stickerUitwijk.d.ts","sourceRoot":"","sources":["../../src/lib/stickerUitwijk.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,sBAAsB,GACtB,cAAc,GACd,eAAe,GACf,mBAAmB,CAAC;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,EAM5F,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;AAE3E,2EAA2E;AAC3E,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,mFAAmF;AACnF,oGAAoG;AACpG,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AAErE,sFAAsF;AACtF,wBAAgB,4BAA4B,IAAI,mBAAmB,CAIlE;AAED,8FAA8F;AAC9F,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAkBvE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAYpF;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAOzC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB;;;GAAsF,CAAC;AAExH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQxE;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,CAAC;AAE/G,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IACf,2EAA2E;IAC3E,SAAS,EAAE,KAAK,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB9G;AAGD,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,SAAqB,GAAG,OAAO,CAGvH;AAKD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;IACxB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,0EAA0E;IAC1E,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,eAAe,GAAG,IAAI,CAoEzB;AAED,oGAAoG;AACpG,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uFAAuF;AACvF,eAAO,MAAM,kBAAkB;;;;;CAA4E,CAAC;AAE5G,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAWtE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,EAAE,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,GAAG,IAAI,CAqB1H;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,EAAE,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE/G;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAI3E;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,eAAe,GAAG;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAE9I;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,eAAe,EAAE,EAC5B,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAClC,cAAc,EAAE,OAAO,EACvB,UAAU,EAAE,kBAAkB,EAC9B,KAAK,GAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAyB,GACxE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,EAAE,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,EACvG,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,eAAe,EAAE,CAAC;IAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,EACnH,UAAU,EAAE,kBAAkB,GAC7B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBpI"}
|
|
1
|
+
{"version":3,"file":"stickerUitwijk.d.ts","sourceRoot":"","sources":["../../src/lib/stickerUitwijk.ts"],"names":[],"mappings":"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"}
|
|
@@ -104,6 +104,17 @@ export function velindelingVoor(b, h) {
|
|
|
104
104
|
}
|
|
105
105
|
/** Tolerantie bij het herkennen van een papiermaat van de printer. */
|
|
106
106
|
export const PAPIER_TOLERANTIE_MM = 1;
|
|
107
|
+
/** 1.69.20: nooit verkleinen onder 95 % (barcode-leesbaarheid), ook niet bij een lagere opgeslagen waarde. */
|
|
108
|
+
export const MIN_VERKLEIN_PCT = 95;
|
|
109
|
+
export function effectieveOndergrens(opgeslagen) {
|
|
110
|
+
return Math.max(Number(opgeslagen) || 0, MIN_VERKLEIN_PCT);
|
|
111
|
+
}
|
|
112
|
+
/** Waarschuwing voor een opgeslagen waarde onder 95 % (de instelling zelf blijft ongewijzigd). */
|
|
113
|
+
export function ondergrensWaarschuwing(label, opgeslagen) {
|
|
114
|
+
return Number(opgeslagen) < MIN_VERKLEIN_PCT
|
|
115
|
+
? `${label} staat op ${Math.round(Number(opgeslagen))} %, wordt ${MIN_VERKLEIN_PCT} % (barcode-leesbaarheid)`
|
|
116
|
+
: null;
|
|
117
|
+
}
|
|
107
118
|
/** Papiernaam op afmeting (±1 mm, ook gedraaid) uit de PrintNode-lijst; null als er geen is. */
|
|
108
119
|
export function papierOpMaat(formaten, b, h) {
|
|
109
120
|
if (!formaten || typeof formaten !== "object" || Array.isArray(formaten))
|
|
@@ -190,7 +201,7 @@ export function kiesUitwijkroute(input) {
|
|
|
190
201
|
// 3b. verkleinen, verhouding gelijk, nooit uitrekken
|
|
191
202
|
const schaal = Math.min(eb / b, eh / h, 1);
|
|
192
203
|
const pct = Math.round(schaal * 100);
|
|
193
|
-
if (schaal * 100 >= input.instelling.ondergrens_pct - 1e-9 && (input.heeftBarcode === false || barcodeLeesbaar(schaal, e.dpi))) {
|
|
204
|
+
if (schaal * 100 >= effectieveOndergrens(input.instelling.ondergrens_pct) - 1e-9 && (input.heeftBarcode === false || barcodeLeesbaar(schaal, e.dpi))) {
|
|
194
205
|
kleiner.push({ afwijking: 1 - schaal, u: uit(e, "verkleind", Math.round(schaal * 100) / 100, rot, `Geprint op ${maat(e.breedte_mm, e.hoogte_mm)} in plaats van ${st}, verkleind tot ${pct}%`) });
|
|
195
206
|
}
|
|
196
207
|
}
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/** HTML van de testpagina op een rol van b × h mm (puur, voor tests). */
|
|
2
|
+
export declare function testpaginaRolHtml(printerNaam: string, rol: {
|
|
3
|
+
naam: string;
|
|
4
|
+
breedte_mm: number;
|
|
5
|
+
hoogte_mm: number;
|
|
6
|
+
}, datum: string): string;
|
|
7
|
+
export declare function drukTestpaginaAf(printerId: string, naam: string): Promise<boolean>;
|
|
2
8
|
//# sourceMappingURL=testpagina.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testpagina.d.ts","sourceRoot":"","sources":["../../src/lib/testpagina.ts"],"names":[],"mappings":"AAkBA,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1I;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA0CxF"}
|