@flowselections/layout-maker 1.69.19 → 1.69.23
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/FormaatOrientatieBar.d.ts.map +1 -1
- package/dist-lib/components/FormaatOrientatieBar.js +10 -7
- package/dist-lib/components/GeladenEtiketTab.d.ts.map +1 -1
- package/dist-lib/components/GeladenEtiketTab.js +3 -1
- package/dist-lib/components/InstelOverzichtKaart.d.ts +12 -0
- package/dist-lib/components/InstelOverzichtKaart.d.ts.map +1 -0
- package/dist-lib/components/InstelOverzichtKaart.js +78 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
- package/dist-lib/components/KlaarOmTePrintenBlok.js +2 -1
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +29 -5
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +9 -1
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +3 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +5 -9
- package/dist-lib/components/RolKeuze.d.ts +9 -0
- package/dist-lib/components/RolKeuze.d.ts.map +1 -0
- package/dist-lib/components/RolKeuze.js +91 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts +4 -0
- package/dist-lib/components/StickerOntwerpPage.d.ts.map +1 -0
- package/dist-lib/components/StickerOntwerpPage.js +77 -0
- package/dist-lib/components/SysteemLayoutMelding.d.ts +1 -1
- package/dist-lib/components/SysteemLayoutMelding.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.js +15 -7
- package/dist-lib/index.d.ts +5 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +5 -0
- package/dist-lib/integrations/supabase/types.d.ts +621 -120
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.d.ts.map +1 -1
- package/dist-lib/lib/directPrint.js +19 -0
- 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/instelOverzicht.d.ts +45 -0
- package/dist-lib/lib/instelOverzicht.d.ts.map +1 -0
- package/dist-lib/lib/instelOverzicht.js +106 -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/pakbonBuilder.d.ts +6 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +15 -0
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +2 -1
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +3 -1
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +3 -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 +274 -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/stickerRoute.d.ts +3 -0
- package/dist-lib/lib/stickerRoute.d.ts.map +1 -0
- package/dist-lib/lib/stickerRoute.js +5 -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/useNetwerkPrinters.d.ts +1 -0
- package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -1
- package/dist-lib/lib/useNetwerkPrinters.js +11 -3
- 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/dist-lib/lib/werkplekken.d.ts +5 -1
- package/dist-lib/lib/werkplekken.d.ts.map +1 -1
- package/dist-lib/lib/werkplekken.js +1 -1
- package/package.json +6 -1
- package/sql/print-schema.sql +320 -162
- package/sql/print-schema.verslag.md +5 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directPrint.d.ts","sourceRoot":"","sources":["../../src/lib/directPrint.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"directPrint.d.ts","sourceRoot":"","sources":["../../src/lib/directPrint.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAM9E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAsE9F"}
|
|
@@ -6,6 +6,8 @@ import { supabase } from "./supabaseClient.js";
|
|
|
6
6
|
import { bedoeldePrinter, formaatDef } from "./browserPrint.js";
|
|
7
7
|
import { htmlNaarPdfBase64 } from "./documentPdf.js";
|
|
8
8
|
import { verstuurPrintOpdracht } from "./printService.functions.js";
|
|
9
|
+
import { printHtml } from "./printApi.js";
|
|
10
|
+
import { isStickerOntwerpSoort } from "./stickerRoute.js";
|
|
9
11
|
/**
|
|
10
12
|
* Probeert het document rechtstreeks naar de ingestelde printer te sturen.
|
|
11
13
|
* Geeft `gelukt: false` terug wanneer er geen geschikte printer is; de
|
|
@@ -27,6 +29,23 @@ export async function printDirect(opdracht) {
|
|
|
27
29
|
const externId = printer?.extern_printer_id ?? null;
|
|
28
30
|
if (!printer || !externId)
|
|
29
31
|
return { gelukt: false };
|
|
32
|
+
// 1.69.20: sticker-achtige documenten gaan nooit rechtstreeks naar PrintNode,
|
|
33
|
+
// maar via de printwachtrij, zodat de keuzeregel (ontwerp + printer) geldt.
|
|
34
|
+
if (isStickerOntwerpSoort(opdracht.documenttype)) {
|
|
35
|
+
try {
|
|
36
|
+
await printHtml({
|
|
37
|
+
documenttype: opdracht.documenttype,
|
|
38
|
+
documentnaam: opdracht.documentnaam ?? "Document",
|
|
39
|
+
html: opdracht.html,
|
|
40
|
+
printerId: printer.id ?? undefined,
|
|
41
|
+
kopieen: opdracht.kopieen ?? 1,
|
|
42
|
+
});
|
|
43
|
+
return { gelukt: true, printernaam: printer.naam ?? undefined };
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
return { gelukt: false, reden: e instanceof Error ? e.message : "Er is geen printopdracht gemaakt.", printernaam: printer.naam ?? undefined };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
30
49
|
const formaat = opdracht.formaatCode
|
|
31
50
|
? formaatDef(opdracht.documenttype, opdracht.formaatCode)
|
|
32
51
|
: null;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { GeladenEtiket } from "./etiketControle.js";
|
|
2
|
+
import type { PrinterFormaten } from "./papierFormaten.js";
|
|
3
|
+
export interface EtiketRol {
|
|
4
|
+
id: string;
|
|
5
|
+
sleutel: string;
|
|
6
|
+
naam: string;
|
|
7
|
+
breedte_mm: number;
|
|
8
|
+
hoogte_mm: number;
|
|
9
|
+
doorlopend: boolean;
|
|
10
|
+
is_a4: boolean;
|
|
11
|
+
volgorde: number;
|
|
12
|
+
actief: boolean;
|
|
13
|
+
}
|
|
14
|
+
export type Invoerrichting = "korte_zijde" | "lange_zijde";
|
|
15
|
+
export declare const INVOERRICHTINGEN: {
|
|
16
|
+
waarde: Invoerrichting;
|
|
17
|
+
label: string;
|
|
18
|
+
}[];
|
|
19
|
+
/** Leest rijen uit print_etiketrollen; ongeldige rijen vallen weg. */
|
|
20
|
+
export declare function leesRollen(data: unknown): EtiketRol[];
|
|
21
|
+
/**
|
|
22
|
+
* Geladen etiket voor een gekozen rol. Kent de printer een papiermaat op
|
|
23
|
+
* afmeting (±1 mm), dan gaat die naam mee naar PrintNode; anders een vaste
|
|
24
|
+
* maat zonder papiernaam.
|
|
25
|
+
*/
|
|
26
|
+
export declare function rolNaarGeladenEtiket(rol: {
|
|
27
|
+
naam: string;
|
|
28
|
+
breedte_mm: number;
|
|
29
|
+
hoogte_mm: number;
|
|
30
|
+
}, formaten?: PrinterFormaten | null): GeladenEtiket;
|
|
31
|
+
export type FormaatKlasse = "groot" | "middel" | "klein";
|
|
32
|
+
/**
|
|
33
|
+
* Formaatklasse van een etiket:
|
|
34
|
+
* groot ≥ 100 × 100 (±1 mm)
|
|
35
|
+
* klein korte zijde ≤ 40 mm (89 × 25 tot 89 × 36)
|
|
36
|
+
* middel de rest (± 100 × 50 tot 102 × 62)
|
|
37
|
+
*/
|
|
38
|
+
export declare function formaatKlasse(b: number, h: number): FormaatKlasse;
|
|
39
|
+
/** Een rol van A4-formaat telt niet als etiketrol (dat is de A4-terugval). */
|
|
40
|
+
export declare function isA4Maat(b: number, h: number): boolean;
|
|
41
|
+
//# sourceMappingURL=etiketRollen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"etiketRollen.d.ts","sourceRoot":"","sources":["../../src/lib/etiketRollen.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAC3D,eAAO,MAAM,gBAAgB,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAGvE,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,CAqBrD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,aAAa,CAKnJ;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAMjE;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/etiketRollen.ts — rollen per printer (1.69.20).
|
|
3
|
+
// De keuzelijst staat als data in print_etiketrollen; hier alleen het lezen,
|
|
4
|
+
// de omzetting naar het geladen etiket en de formaatklasse.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { papierOpMaat } from "./stickerUitwijk.js";
|
|
7
|
+
export const INVOERRICHTINGEN = [
|
|
8
|
+
{ waarde: "korte_zijde", label: "Korte zijde eerst" },
|
|
9
|
+
{ waarde: "lange_zijde", label: "Lange zijde eerst" },
|
|
10
|
+
];
|
|
11
|
+
/** Leest rijen uit print_etiketrollen; ongeldige rijen vallen weg. */
|
|
12
|
+
export function leesRollen(data) {
|
|
13
|
+
const lijst = Array.isArray(data) ? data : [];
|
|
14
|
+
const uit = [];
|
|
15
|
+
for (const r of lijst) {
|
|
16
|
+
const b = Number(r?.["breedte_mm"]);
|
|
17
|
+
const h = Number(r?.["hoogte_mm"]);
|
|
18
|
+
const naam = String(r?.["naam"] ?? "").trim();
|
|
19
|
+
if (!naam || !(b > 0) || !(h > 0) || r?.["actief"] === false)
|
|
20
|
+
continue;
|
|
21
|
+
uit.push({
|
|
22
|
+
id: String(r["id"] ?? ""),
|
|
23
|
+
sleutel: String(r["sleutel"] ?? ""),
|
|
24
|
+
naam,
|
|
25
|
+
breedte_mm: b,
|
|
26
|
+
hoogte_mm: h,
|
|
27
|
+
doorlopend: r["doorlopend"] === true,
|
|
28
|
+
is_a4: r["is_a4"] === true,
|
|
29
|
+
volgorde: Number(r["volgorde"] ?? 100),
|
|
30
|
+
actief: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return uit.sort((a, b) => a.volgorde - b.volgorde || a.naam.localeCompare(b.naam));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Geladen etiket voor een gekozen rol. Kent de printer een papiermaat op
|
|
37
|
+
* afmeting (±1 mm), dan gaat die naam mee naar PrintNode; anders een vaste
|
|
38
|
+
* maat zonder papiernaam.
|
|
39
|
+
*/
|
|
40
|
+
export function rolNaarGeladenEtiket(rol, formaten) {
|
|
41
|
+
const papier = papierOpMaat(formaten ?? null, rol.breedte_mm, rol.hoogte_mm);
|
|
42
|
+
return papier
|
|
43
|
+
? { naam: papier, breedte_mm: rol.breedte_mm, hoogte_mm: rol.hoogte_mm }
|
|
44
|
+
: { naam: rol.naam, breedte_mm: rol.breedte_mm, hoogte_mm: rol.hoogte_mm, standaard: true };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Formaatklasse van een etiket:
|
|
48
|
+
* groot ≥ 100 × 100 (±1 mm)
|
|
49
|
+
* klein korte zijde ≤ 40 mm (89 × 25 tot 89 × 36)
|
|
50
|
+
* middel de rest (± 100 × 50 tot 102 × 62)
|
|
51
|
+
*/
|
|
52
|
+
export function formaatKlasse(b, h) {
|
|
53
|
+
const kort = Math.min(b, h);
|
|
54
|
+
const lang = Math.max(b, h);
|
|
55
|
+
if (kort >= 99 && lang >= 99)
|
|
56
|
+
return "groot";
|
|
57
|
+
if (kort <= 40)
|
|
58
|
+
return "klein";
|
|
59
|
+
return "middel";
|
|
60
|
+
}
|
|
61
|
+
/** Een rol van A4-formaat telt niet als etiketrol (dat is de A4-terugval). */
|
|
62
|
+
export function isA4Maat(b, h) {
|
|
63
|
+
return Math.abs(Math.min(b, h) - 210) <= 1 && Math.abs(Math.max(b, h) - 297) <= 1;
|
|
64
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MaatInvoer {
|
|
2
|
+
breedte_mm?: number | string | null;
|
|
3
|
+
hoogte_mm?: number | string | null;
|
|
4
|
+
orientatie?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface AfdrukMaat {
|
|
7
|
+
breedte_mm: number;
|
|
8
|
+
hoogte_mm: number;
|
|
9
|
+
}
|
|
10
|
+
/** Afdrukgebied zoals het geprint wordt (zelfde regel als de printwachtrij). */
|
|
11
|
+
export declare function afdrukMaat(l: MaatInvoer): AfdrukMaat;
|
|
12
|
+
/**
|
|
13
|
+
* Opslagwaarden voor een afdrukgebied zoals de gebruiker het invult. Liggend
|
|
14
|
+
* volgt uit de maat zelf, zodat "89 × 25" altijd als 89 breed × 25 hoog
|
|
15
|
+
* terugkomt (nooit als 25 × 89).
|
|
16
|
+
*/
|
|
17
|
+
export declare function opslagVoorAfdrukMaat(b: number, h: number): {
|
|
18
|
+
breedte_mm: number;
|
|
19
|
+
hoogte_mm: number;
|
|
20
|
+
orientatie: "portrait" | "landscape";
|
|
21
|
+
};
|
|
22
|
+
/** "89 × 25 mm" */
|
|
23
|
+
export declare function maatTekst(m: AfdrukMaat): string;
|
|
24
|
+
//# sourceMappingURL=formaatWeergave.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formaatWeergave.d.ts","sourceRoot":"","sources":["../../src/lib/formaatWeergave.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAIpD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAA;CAAE,CAE1I;AAID,mBAAmB;AACnB,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/formaatWeergave.ts — één manier om de maat van een ontwerp te tonen
|
|
3
|
+
// en op te slaan (1.69.20). De opgeslagen breedte/hoogte + oriëntatie worden
|
|
4
|
+
// overal omgezet naar het afdrukgebied "breedte × hoogte zoals ingevuld".
|
|
5
|
+
// ============================================================================
|
|
6
|
+
/** Afdrukgebied zoals het geprint wordt (zelfde regel als de printwachtrij). */
|
|
7
|
+
export function afdrukMaat(l) {
|
|
8
|
+
const b = Number(l.breedte_mm ?? 0);
|
|
9
|
+
const h = Number(l.hoogte_mm ?? 0);
|
|
10
|
+
return l.orientatie === "landscape" ? { breedte_mm: h, hoogte_mm: b } : { breedte_mm: b, hoogte_mm: h };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Opslagwaarden voor een afdrukgebied zoals de gebruiker het invult. Liggend
|
|
14
|
+
* volgt uit de maat zelf, zodat "89 × 25" altijd als 89 breed × 25 hoog
|
|
15
|
+
* terugkomt (nooit als 25 × 89).
|
|
16
|
+
*/
|
|
17
|
+
export function opslagVoorAfdrukMaat(b, h) {
|
|
18
|
+
return b > h ? { breedte_mm: h, hoogte_mm: b, orientatie: "landscape" } : { breedte_mm: b, hoogte_mm: h, orientatie: "portrait" };
|
|
19
|
+
}
|
|
20
|
+
const getal = (n) => String(Math.round(n * 10) / 10).replace(".", ",");
|
|
21
|
+
/** "89 × 25 mm" */
|
|
22
|
+
export function maatTekst(m) {
|
|
23
|
+
return `${getal(m.breedte_mm)} × ${getal(m.hoogte_mm)} mm`;
|
|
24
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type OntwerpKeuze } from "./ontwerpKeuze.js";
|
|
2
|
+
import { type StickerInstellingen } from "./stickerUitwijk.js";
|
|
3
|
+
export declare const OVERZICHT_SOORTEN: readonly ["sticker", "traysticker", "eigen_sticker", "verzendlabel"];
|
|
4
|
+
export interface OverzichtPrinter {
|
|
5
|
+
id: string;
|
|
6
|
+
naam: string;
|
|
7
|
+
geladen_etiket: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface OverzichtLayout {
|
|
10
|
+
id: string;
|
|
11
|
+
naam: string;
|
|
12
|
+
documenttype: string;
|
|
13
|
+
bron?: string | null;
|
|
14
|
+
actief?: boolean | null;
|
|
15
|
+
systeem?: boolean | null;
|
|
16
|
+
breedte_mm?: number | null;
|
|
17
|
+
hoogte_mm?: number | null;
|
|
18
|
+
orientatie?: string | null;
|
|
19
|
+
config?: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface OverzichtInvoer {
|
|
22
|
+
/** Printers van de printplek (lijst + per documentsoort toegewezen). */
|
|
23
|
+
printers: OverzichtPrinter[];
|
|
24
|
+
/** printer_id per documentsoort (document_printplek_printers). */
|
|
25
|
+
perSoort: {
|
|
26
|
+
documenttype: string;
|
|
27
|
+
printer_id: string | null;
|
|
28
|
+
}[];
|
|
29
|
+
a4Printer: {
|
|
30
|
+
id: string;
|
|
31
|
+
naam: string;
|
|
32
|
+
} | null;
|
|
33
|
+
a4Terugval: boolean;
|
|
34
|
+
layouts: OverzichtLayout[];
|
|
35
|
+
}
|
|
36
|
+
export interface OverzichtRegel {
|
|
37
|
+
sleutel: string;
|
|
38
|
+
document: string;
|
|
39
|
+
keuze: OntwerpKeuze;
|
|
40
|
+
kort: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function berekenInstelOverzicht(inv: OverzichtInvoer): OverzichtRegel[];
|
|
43
|
+
/** "Floriday-sticker: staat op 85 %, wordt 95 % (barcode-leesbaarheid)". */
|
|
44
|
+
export declare function ondergrensWaarschuwingen(inst: StickerInstellingen | null): string[];
|
|
45
|
+
//# sourceMappingURL=instelOverzicht.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instelOverzicht.d.ts","sourceRoot":"","sources":["../../src/lib/instelOverzicht.ts"],"names":[],"mappings":"AAOA,OAAO,EAA0D,KAAK,YAAY,EAAmB,MAAM,gBAAgB,CAAC;AAI5H,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG7E,eAAO,MAAM,iBAAiB,sEAAuE,CAAC;AAKtG,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;IAChE,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAwBD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,cAAc,EAAE,CAoD7E;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,MAAM,EAAE,CAQnF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/instelOverzicht.ts — wat er per documentsoort gebeurt op een
|
|
3
|
+
// printplek (1.69.20). Puur: bouwt de invoer voor de ene keuzeregel
|
|
4
|
+
// (kiesOntwerpEnPrinter) uit gelezen rijen, zodat instellen en printen
|
|
5
|
+
// dezelfde uitkomst tonen.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { kiesOntwerpEnPrinter, keuzeKort } from "./ontwerpKeuze.js";
|
|
8
|
+
import { afdrukMaat } from "./formaatWeergave.js";
|
|
9
|
+
import { leesStickerOntwerp } from "./stickerOntwerp.js";
|
|
10
|
+
import { leesGeladenEtiket } from "./etiketControle.js";
|
|
11
|
+
import { STICKER_SOORTEN } from "./stickerUitwijk.js";
|
|
12
|
+
import { documentTypeLabel } from "./documentTypes.js";
|
|
13
|
+
export const OVERZICHT_SOORTEN = ["sticker", "traysticker", "eigen_sticker", "verzendlabel"];
|
|
14
|
+
const MIN_PCT = 95;
|
|
15
|
+
function kandidaat(l, herkomst) {
|
|
16
|
+
const m = afdrukMaat(l);
|
|
17
|
+
const fs = leesStickerOntwerp(l.config);
|
|
18
|
+
return { id: l.id, naam: l.naam, breedte_mm: m.breedte_mm, hoogte_mm: m.hoogte_mm, herkomst, ...(fs?.klasse ? { klasse: fs.klasse } : {}) };
|
|
19
|
+
}
|
|
20
|
+
function rolPrinters(inv, soort) {
|
|
21
|
+
const perId = new Map(inv.printers.map((p) => [p.id, p]));
|
|
22
|
+
const ids = [];
|
|
23
|
+
for (const r of inv.perSoort)
|
|
24
|
+
if (r.documenttype === soort && r.printer_id && !ids.includes(r.printer_id))
|
|
25
|
+
ids.push(r.printer_id);
|
|
26
|
+
for (const p of inv.printers)
|
|
27
|
+
if (!ids.includes(p.id) && leesGeladenEtiket(p.geladen_etiket))
|
|
28
|
+
ids.push(p.id);
|
|
29
|
+
const uit = [];
|
|
30
|
+
for (const id of ids) {
|
|
31
|
+
const p = perId.get(id);
|
|
32
|
+
if (!p)
|
|
33
|
+
continue;
|
|
34
|
+
if (inv.a4Printer && inv.a4Printer.id === id && !leesGeladenEtiket(p.geladen_etiket))
|
|
35
|
+
continue;
|
|
36
|
+
const e = leesGeladenEtiket(p.geladen_etiket);
|
|
37
|
+
uit.push({ id, naam: p.naam, breedte_mm: e?.breedte_mm ?? null, hoogte_mm: e?.hoogte_mm ?? null });
|
|
38
|
+
}
|
|
39
|
+
return uit;
|
|
40
|
+
}
|
|
41
|
+
export function berekenInstelOverzicht(inv) {
|
|
42
|
+
const layouts = (Array.isArray(inv.layouts) ? inv.layouts : []).filter((l) => l.actief !== false);
|
|
43
|
+
const uit = [];
|
|
44
|
+
const voeg = (sleutel, document, keuze) => uit.push({ sleutel, document, keuze, kort: keuzeKort(keuze) });
|
|
45
|
+
// Floriday-stickers: vast formaat, alleen 1-op-1 of terugval.
|
|
46
|
+
const floriday = new Map();
|
|
47
|
+
for (const l of layouts) {
|
|
48
|
+
if (String(l.bron ?? "") !== "floriday" || (l.documenttype !== "sticker" && l.documenttype !== "traysticker"))
|
|
49
|
+
continue;
|
|
50
|
+
const m = afdrukMaat(l);
|
|
51
|
+
if (!(m.breedte_mm > 0) || !(m.hoogte_mm > 0))
|
|
52
|
+
continue;
|
|
53
|
+
floriday.set(`${l.documenttype}:${m.breedte_mm}x${m.hoogte_mm}`, l);
|
|
54
|
+
}
|
|
55
|
+
for (const [sleutel, l] of floriday) {
|
|
56
|
+
const label = l.documenttype === "traysticker" ? "Floriday-traysticker" : "Floriday-sticker";
|
|
57
|
+
voeg(`floriday:${sleutel}`, label, kiesOntwerpEnPrinter({
|
|
58
|
+
documentLabel: label,
|
|
59
|
+
klant: kandidaat(l, "klant"),
|
|
60
|
+
kweker: [],
|
|
61
|
+
standaard: [],
|
|
62
|
+
printers: rolPrinters(inv, l.documenttype),
|
|
63
|
+
a4Printer: inv.a4Printer,
|
|
64
|
+
a4Terugval: inv.a4Terugval,
|
|
65
|
+
vastFormaat: true,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
for (const soort of OVERZICHT_SOORTEN) {
|
|
69
|
+
const eigen = layouts.filter((l) => l.documenttype === soort);
|
|
70
|
+
const standaard = eigen.filter((l) => String(l.bron ?? "") === "flowselections").map((l) => kandidaat(l, "standaard"));
|
|
71
|
+
const kweker = eigen
|
|
72
|
+
.filter((l) => String(l.bron ?? "eigen") === "eigen" && l.systeem !== true)
|
|
73
|
+
.filter((l) => {
|
|
74
|
+
const c = (l.config ?? {});
|
|
75
|
+
const kl = (c["klantlayout"] ?? {});
|
|
76
|
+
return !c["eigen_traysticker"] && kl["gebruik_klantlayout"] !== true;
|
|
77
|
+
})
|
|
78
|
+
.map((l) => kandidaat(l, "kweker"))
|
|
79
|
+
.filter((k) => k.breedte_mm > 0 && k.hoogte_mm > 0);
|
|
80
|
+
if (!standaard.length && !kweker.length)
|
|
81
|
+
continue;
|
|
82
|
+
const label = documentTypeLabel(soort);
|
|
83
|
+
voeg(soort, label, kiesOntwerpEnPrinter({
|
|
84
|
+
documentLabel: label,
|
|
85
|
+
klant: null,
|
|
86
|
+
kweker,
|
|
87
|
+
standaard,
|
|
88
|
+
printers: rolPrinters(inv, soort),
|
|
89
|
+
a4Printer: inv.a4Printer,
|
|
90
|
+
a4Terugval: inv.a4Terugval,
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
return uit;
|
|
94
|
+
}
|
|
95
|
+
/** "Floriday-sticker: staat op 85 %, wordt 95 % (barcode-leesbaarheid)". */
|
|
96
|
+
export function ondergrensWaarschuwingen(inst) {
|
|
97
|
+
if (!inst)
|
|
98
|
+
return [];
|
|
99
|
+
const uit = [];
|
|
100
|
+
for (const s of STICKER_SOORTEN) {
|
|
101
|
+
const pct = Number(inst[s.soort]?.ondergrens_pct);
|
|
102
|
+
if (pct > 0 && pct < MIN_PCT)
|
|
103
|
+
uit.push(`${s.label}: staat op ${pct} %, wordt ${MIN_PCT} % (barcode-leesbaarheid)`);
|
|
104
|
+
}
|
|
105
|
+
return uit;
|
|
106
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type FormaatKlasse } from "./etiketRollen.js";
|
|
2
|
+
export declare const PAS_TOLERANTIE_MM = 1;
|
|
3
|
+
export declare const MIN_SCHAAL = 0.95;
|
|
4
|
+
export type OntwerpHerkomst = "klant" | "kweker" | "standaard";
|
|
5
|
+
export interface OntwerpKandidaat {
|
|
6
|
+
id: string | null;
|
|
7
|
+
naam: string;
|
|
8
|
+
/** Afdrukgebied van het ontwerp. Bij een standaardontwerp de nominale maat. */
|
|
9
|
+
breedte_mm: number;
|
|
10
|
+
hoogte_mm: number;
|
|
11
|
+
herkomst: OntwerpHerkomst;
|
|
12
|
+
/** Alleen standaardontwerpen: klasse; ze worden op de maat van de rol opgemaakt. */
|
|
13
|
+
klasse?: FormaatKlasse;
|
|
14
|
+
}
|
|
15
|
+
export interface RolPrinter {
|
|
16
|
+
id: string;
|
|
17
|
+
naam: string;
|
|
18
|
+
/** null = rol niet ingesteld ("formaat onbekend"). */
|
|
19
|
+
breedte_mm: number | null;
|
|
20
|
+
hoogte_mm: number | null;
|
|
21
|
+
}
|
|
22
|
+
export type Plaatsing = "precies" | "gedraaid" | "gecentreerd" | "verkleind" | "a4" | "geen";
|
|
23
|
+
export interface OntwerpKeuze {
|
|
24
|
+
stap: 1 | 2 | 3 | 4 | 5;
|
|
25
|
+
ontwerp: OntwerpKandidaat | null;
|
|
26
|
+
printer: {
|
|
27
|
+
id: string;
|
|
28
|
+
naam: string;
|
|
29
|
+
} | null;
|
|
30
|
+
/** Maat waarop het ontwerp wordt opgemaakt (bij stap 3 de rolmaat). */
|
|
31
|
+
opmaak_breedte_mm: number | null;
|
|
32
|
+
opmaak_hoogte_mm: number | null;
|
|
33
|
+
schaal: number;
|
|
34
|
+
draai: 0 | 90;
|
|
35
|
+
plaatsing: Plaatsing;
|
|
36
|
+
reden: string;
|
|
37
|
+
waarschuwingen: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface KeuzeInvoer {
|
|
40
|
+
/** Bijvoorbeeld "Eigen sticker" of "Floriday-sticker". */
|
|
41
|
+
documentLabel: string;
|
|
42
|
+
klant: OntwerpKandidaat | null;
|
|
43
|
+
kweker: OntwerpKandidaat[];
|
|
44
|
+
standaard: OntwerpKandidaat[];
|
|
45
|
+
/** Printers van de printplek; de gerouteerde printer eerst. */
|
|
46
|
+
printers: RolPrinter[];
|
|
47
|
+
a4Printer: {
|
|
48
|
+
id: string;
|
|
49
|
+
naam: string;
|
|
50
|
+
} | null;
|
|
51
|
+
a4Terugval: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Vast formaat (Floriday-PDF, geüploade sticker, voorbeeld van een geopend
|
|
54
|
+
* ontwerp): alleen het klantontwerp telt, geen andere ontwerpen.
|
|
55
|
+
*/
|
|
56
|
+
vastFormaat?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare const maatNl: (b: number, h: number) => string;
|
|
59
|
+
interface Pas {
|
|
60
|
+
plaatsing: "precies" | "gedraaid" | "gecentreerd" | "verkleind";
|
|
61
|
+
schaal: number;
|
|
62
|
+
draai: 0 | 90;
|
|
63
|
+
/** Lager = beter. */
|
|
64
|
+
score: number;
|
|
65
|
+
}
|
|
66
|
+
/** Past een ontwerp op een rol? ±1 mm, ook gedraaid; nooit vergroten; ≥ 95 %. */
|
|
67
|
+
export declare function pastOpRol(o: {
|
|
68
|
+
breedte_mm: number;
|
|
69
|
+
hoogte_mm: number;
|
|
70
|
+
}, rol: {
|
|
71
|
+
breedte_mm: number;
|
|
72
|
+
hoogte_mm: number;
|
|
73
|
+
}): Pas | null;
|
|
74
|
+
export declare function kiesOntwerpEnPrinter(input: KeuzeInvoer): OntwerpKeuze;
|
|
75
|
+
/** Kort, voor het instel-overzicht: "→ wordt A4 op XP-2200". */
|
|
76
|
+
export declare function keuzeKort(k: OntwerpKeuze): string;
|
|
77
|
+
/** Wat er vastgelegd wordt in print_jobs.ontwerp_keuze. */
|
|
78
|
+
export declare function ontwerpKeuzeVoorOpslag(k: OntwerpKeuze): Record<string, unknown>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=ontwerpKeuze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ontwerpKeuze.d.ts","sourceRoot":"","sources":["../../src/lib/ontwerpKeuze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/ontwerpKeuze.ts — de ene regel die bij elk sticker-achtig document
|
|
3
|
+
// (sticker, traysticker, eigen sticker, verzendlabel) een ontwerp én een
|
|
4
|
+
// printer kiest (1.69.20). Wachtrij, Voorbeeld printen en het instel-overzicht
|
|
5
|
+
// gebruiken alleen deze functie.
|
|
6
|
+
//
|
|
7
|
+
// Volgorde:
|
|
8
|
+
// 1. ontwerp dat bij de klant hoort, als het op een printer van de plek past
|
|
9
|
+
// 2. ontwerp van de kweker voor deze documentsoort dat past
|
|
10
|
+
// 3. standaardontwerp van Flow Selections in het formaat van een rol
|
|
11
|
+
// 4. A4 met snijlijnen, alleen als de A4-terugval op de printplek aan staat
|
|
12
|
+
// 5. weigeren, met een reden in gewone taal
|
|
13
|
+
// Passen: ±1 mm, ook 90° gedraaid. Nooit vergroten (wel centreren op een
|
|
14
|
+
// groter etiket), nooit verkleinen onder 95 %.
|
|
15
|
+
// ============================================================================
|
|
16
|
+
import { formaatKlasse, isA4Maat } from "./etiketRollen.js";
|
|
17
|
+
export const PAS_TOLERANTIE_MM = 1;
|
|
18
|
+
export const MIN_SCHAAL = 0.95;
|
|
19
|
+
const r1 = (n) => Math.round(n * 10) / 10;
|
|
20
|
+
const nl = (n) => String(r1(n)).replace(".", ",");
|
|
21
|
+
export const maatNl = (b, h) => `${nl(b)} × ${nl(h)} mm`;
|
|
22
|
+
/** Past een ontwerp op een rol? ±1 mm, ook gedraaid; nooit vergroten; ≥ 95 %. */
|
|
23
|
+
export function pastOpRol(o, rol) {
|
|
24
|
+
const t = PAS_TOLERANTIE_MM + 1e-9;
|
|
25
|
+
const { breedte_mm: b, hoogte_mm: h } = o;
|
|
26
|
+
if (!(b > 0) || !(h > 0))
|
|
27
|
+
return null;
|
|
28
|
+
const kandidaten = [];
|
|
29
|
+
for (const draai of [0, 90]) {
|
|
30
|
+
const eb = draai ? rol.hoogte_mm : rol.breedte_mm;
|
|
31
|
+
const eh = draai ? rol.breedte_mm : rol.hoogte_mm;
|
|
32
|
+
if (Math.abs(b - eb) <= t && Math.abs(h - eh) <= t) {
|
|
33
|
+
kandidaten.push({ plaatsing: draai ? "gedraaid" : "precies", schaal: 1, draai, score: draai ? 1 : 0 });
|
|
34
|
+
}
|
|
35
|
+
else if (b <= eb + t && h <= eh + t) {
|
|
36
|
+
kandidaten.push({ plaatsing: "gecentreerd", schaal: 1, draai, score: 10 + (eb * eh - b * h) / (b * h) });
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const s = Math.min(eb / b, eh / h);
|
|
40
|
+
if (s >= MIN_SCHAAL - 1e-9 && s < 1)
|
|
41
|
+
kandidaten.push({ plaatsing: "verkleind", schaal: Math.floor(s * 100) / 100, draai, score: 100 + (1 - s) });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
kandidaten.sort((x, y) => x.score - y.score);
|
|
45
|
+
return kandidaten[0] ?? null;
|
|
46
|
+
}
|
|
47
|
+
const plaatsingTekst = (p, rol) => p.plaatsing === "precies"
|
|
48
|
+
? "precies passend"
|
|
49
|
+
: p.plaatsing === "gedraaid"
|
|
50
|
+
? "90° gedraaid"
|
|
51
|
+
: p.plaatsing === "gecentreerd"
|
|
52
|
+
? `1-op-1 gecentreerd op ${maatNl(rol.breedte_mm, rol.hoogte_mm)}${p.draai ? ", 90° gedraaid" : ""}`
|
|
53
|
+
: `verkleind tot ${Math.round(p.schaal * 100)} %`;
|
|
54
|
+
const STAP_TEKST = {
|
|
55
|
+
klant: "ontwerp van de klant",
|
|
56
|
+
kweker: "eigen ontwerp",
|
|
57
|
+
standaard: "standaardontwerp van Flow Selections",
|
|
58
|
+
};
|
|
59
|
+
export function kiesOntwerpEnPrinter(input) {
|
|
60
|
+
const waarschuwingen = [];
|
|
61
|
+
const rollen = [];
|
|
62
|
+
for (const p of Array.isArray(input.printers) ? input.printers : []) {
|
|
63
|
+
if (!(Number(p.breedte_mm) > 0) || !(Number(p.hoogte_mm) > 0)) {
|
|
64
|
+
waarschuwingen.push(`Printer ${p.naam}: formaat onbekend – stel in welke rol erin zit.`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (isA4Maat(Number(p.breedte_mm), Number(p.hoogte_mm)))
|
|
68
|
+
continue;
|
|
69
|
+
rollen.push({ ...p, breedte_mm: Number(p.breedte_mm), hoogte_mm: Number(p.hoogte_mm) });
|
|
70
|
+
}
|
|
71
|
+
const beste = (o) => {
|
|
72
|
+
let top = null;
|
|
73
|
+
for (const p of rollen) {
|
|
74
|
+
const pas = pastOpRol(o, p);
|
|
75
|
+
if (pas && (!top || pas.score < top.pas.score))
|
|
76
|
+
top = { p, pas };
|
|
77
|
+
}
|
|
78
|
+
return top;
|
|
79
|
+
};
|
|
80
|
+
const uitkomst = (stap, o) => {
|
|
81
|
+
const t = beste(o);
|
|
82
|
+
if (!t)
|
|
83
|
+
return null;
|
|
84
|
+
return {
|
|
85
|
+
stap,
|
|
86
|
+
ontwerp: o,
|
|
87
|
+
printer: { id: t.p.id, naam: t.p.naam },
|
|
88
|
+
opmaak_breedte_mm: o.breedte_mm,
|
|
89
|
+
opmaak_hoogte_mm: o.hoogte_mm,
|
|
90
|
+
schaal: t.pas.schaal,
|
|
91
|
+
draai: t.pas.draai,
|
|
92
|
+
plaatsing: t.pas.plaatsing,
|
|
93
|
+
reden: `Stap ${stap}: ${STAP_TEKST[o.herkomst]} "${o.naam}" (${maatNl(o.breedte_mm, o.hoogte_mm)}) op ${t.p.naam} (${maatNl(t.p.breedte_mm, t.p.hoogte_mm)}), ${plaatsingTekst(t.pas, t.p)}.`,
|
|
94
|
+
waarschuwingen,
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
// 1. klant
|
|
98
|
+
if (input.klant) {
|
|
99
|
+
const u = uitkomst(1, input.klant);
|
|
100
|
+
if (u)
|
|
101
|
+
return u;
|
|
102
|
+
}
|
|
103
|
+
if (!input.vastFormaat) {
|
|
104
|
+
// 2. kweker
|
|
105
|
+
for (const o of input.kweker) {
|
|
106
|
+
const u = uitkomst(2, o);
|
|
107
|
+
if (u)
|
|
108
|
+
return u;
|
|
109
|
+
}
|
|
110
|
+
// 3. standaardontwerp op de maat van een rol (eerste printer met een passende klasse)
|
|
111
|
+
for (const p of rollen) {
|
|
112
|
+
const klasse = formaatKlasse(p.breedte_mm, p.hoogte_mm);
|
|
113
|
+
const o = input.standaard.find((s) => s.klasse === klasse);
|
|
114
|
+
if (!o)
|
|
115
|
+
continue;
|
|
116
|
+
return {
|
|
117
|
+
stap: 3,
|
|
118
|
+
ontwerp: o,
|
|
119
|
+
printer: { id: p.id, naam: p.naam },
|
|
120
|
+
opmaak_breedte_mm: p.breedte_mm,
|
|
121
|
+
opmaak_hoogte_mm: p.hoogte_mm,
|
|
122
|
+
schaal: 1,
|
|
123
|
+
draai: 0,
|
|
124
|
+
plaatsing: "precies",
|
|
125
|
+
reden: `Stap 3: standaardontwerp ${klasse} van Flow Selections, opgemaakt op de rol van ${p.naam} (${maatNl(p.breedte_mm, p.hoogte_mm)}).`,
|
|
126
|
+
waarschuwingen,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const gevraagd = input.klant ?? input.kweker[0] ?? null;
|
|
131
|
+
const gevraagdTekst = gevraagd ? `${input.documentLabel} ${maatNl(gevraagd.breedte_mm, gevraagd.hoogte_mm)}` : input.documentLabel;
|
|
132
|
+
const rollenTekst = rollen.length
|
|
133
|
+
? rollen.map((p) => `${p.naam} (${maatNl(p.breedte_mm, p.hoogte_mm)})`).join(", ")
|
|
134
|
+
: "geen labelprinter met ingestelde rol";
|
|
135
|
+
// 4. A4-terugval
|
|
136
|
+
if (input.a4Terugval && input.a4Printer) {
|
|
137
|
+
return {
|
|
138
|
+
stap: 4,
|
|
139
|
+
ontwerp: gevraagd ?? input.standaard.find((s) => s.klasse === "groot") ?? null,
|
|
140
|
+
printer: input.a4Printer,
|
|
141
|
+
opmaak_breedte_mm: gevraagd?.breedte_mm ?? null,
|
|
142
|
+
opmaak_hoogte_mm: gevraagd?.hoogte_mm ?? null,
|
|
143
|
+
schaal: 1,
|
|
144
|
+
draai: 0,
|
|
145
|
+
plaatsing: "a4",
|
|
146
|
+
reden: `Stap 4: ${gevraagdTekst} past op geen rol van deze printplek (${rollenTekst}) → A4 met snijlijnen op ${input.a4Printer.naam}.`,
|
|
147
|
+
waarschuwingen,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// 5. weigeren
|
|
151
|
+
const doen = input.a4Printer
|
|
152
|
+
? "Zet de A4-terugval aan op deze printplek, leg een passende rol in of kies een andere printer."
|
|
153
|
+
: "Koppel een A4-printer aan deze printplek en zet de A4-terugval aan, leg een passende rol in of kies een andere printer.";
|
|
154
|
+
return {
|
|
155
|
+
stap: 5,
|
|
156
|
+
ontwerp: gevraagd,
|
|
157
|
+
printer: null,
|
|
158
|
+
opmaak_breedte_mm: null,
|
|
159
|
+
opmaak_hoogte_mm: null,
|
|
160
|
+
schaal: 1,
|
|
161
|
+
draai: 0,
|
|
162
|
+
plaatsing: "geen",
|
|
163
|
+
reden: `Geweigerd: ${gevraagdTekst} past op geen printer van deze printplek. Rollen op de printplek: ${rollenTekst}. ${doen}`,
|
|
164
|
+
waarschuwingen,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** Kort, voor het instel-overzicht: "→ wordt A4 op XP-2200". */
|
|
168
|
+
export function keuzeKort(k) {
|
|
169
|
+
if (k.stap === 5)
|
|
170
|
+
return "→ wordt geweigerd: zet A4-terugval aan of kies een andere printer";
|
|
171
|
+
if (k.stap === 4)
|
|
172
|
+
return `→ wordt A4 op ${k.printer?.naam ?? "A4-printer"}`;
|
|
173
|
+
const maat = k.opmaak_breedte_mm && k.opmaak_hoogte_mm ? ` (${maatNl(k.opmaak_breedte_mm, k.opmaak_hoogte_mm)})` : "";
|
|
174
|
+
return `→ ${k.ontwerp?.naam ?? "ontwerp"}${maat} op ${k.printer?.naam ?? "printer"}`;
|
|
175
|
+
}
|
|
176
|
+
/** Wat er vastgelegd wordt in print_jobs.ontwerp_keuze. */
|
|
177
|
+
export function ontwerpKeuzeVoorOpslag(k) {
|
|
178
|
+
return {
|
|
179
|
+
stap: k.stap,
|
|
180
|
+
layout_id: k.ontwerp?.id ?? null,
|
|
181
|
+
ontwerp_naam: k.ontwerp?.naam ?? null,
|
|
182
|
+
herkomst: k.ontwerp?.herkomst ?? null,
|
|
183
|
+
printer_id: k.printer?.id ?? null,
|
|
184
|
+
printer_naam: k.printer?.naam ?? null,
|
|
185
|
+
opmaak_breedte_mm: k.opmaak_breedte_mm,
|
|
186
|
+
opmaak_hoogte_mm: k.opmaak_hoogte_mm,
|
|
187
|
+
schaal: k.schaal,
|
|
188
|
+
draai: k.draai,
|
|
189
|
+
plaatsing: k.plaatsing,
|
|
190
|
+
reden: k.reden,
|
|
191
|
+
waarschuwingen: k.waarschuwingen,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -123,6 +123,10 @@ export declare function sectieDef(type: PakbonSectieType): SectieDef;
|
|
|
123
123
|
export declare function nieuweSectie(type: PakbonSectieType): PakbonSectie;
|
|
124
124
|
export declare function standaardPakbonConfig(): PakbonConfig;
|
|
125
125
|
export declare function leesPakbonConfig(config: unknown): PakbonConfig;
|
|
126
|
+
/** Ladingdragertekst(en) van de karren; leeg als de Engine het veld niet levert. */
|
|
127
|
+
export declare function ladingdragerTekst(order: {
|
|
128
|
+
karren?: DemoKar[];
|
|
129
|
+
}): string;
|
|
126
130
|
/** Standaardindeling van een afleverbrief: geen kar-, laag- of fustblokken. */
|
|
127
131
|
export declare function standaardAfleverbriefConfig(): PakbonConfig;
|
|
128
132
|
/**
|
|
@@ -221,6 +225,8 @@ export interface DemoKar {
|
|
|
221
225
|
barcode?: string;
|
|
222
226
|
/** Kar bevat ook regels van een andere order (buffer-/gedeelde kar). */
|
|
223
227
|
gedeeld?: boolean;
|
|
228
|
+
/** Engine 1.0.201: ladingdragerTekst, bv. "Deense container + 3 platen (3,2 lagen, 41 %)". */
|
|
229
|
+
ladingdrager_tekst?: string;
|
|
224
230
|
lagen: DemoLaag[];
|
|
225
231
|
}
|
|
226
232
|
export interface VolleKarStandInvoer {
|