@flowselections/layout-maker 1.69.19 → 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 +474 -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/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.sql +285 -129
- package/sql/print-schema.verslag.md +5 -2
|
@@ -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,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
|
+
}
|
|
@@ -2,6 +2,8 @@ import type { SupabaseClient } from "@supabase/supabase-js";
|
|
|
2
2
|
import { type EigenStickerMaat } from "./eigenDocumenten.js";
|
|
3
3
|
import { type GeladenEtiket } from "./etiketControle.js";
|
|
4
4
|
import { type StickerSoort } from "./stickerUitwijk.js";
|
|
5
|
+
/** Documentsoorten waarvoor de keuzeregel (ontwerp + printer) geldt (1.69.20). */
|
|
6
|
+
export declare const KEUZE_SOORTEN: Set<string>;
|
|
5
7
|
type Job = Record<string, any>;
|
|
6
8
|
/** De databaseclient die de shell aanlevert. De module maakt er zelf nooit een. */
|
|
7
9
|
export type PrintDb = SupabaseClient<any, any, any>;
|
|
@@ -151,5 +153,7 @@ export declare function bepaalDocumentKeuze(db: PrintDb, job: Job): Promise<{
|
|
|
151
153
|
export declare function stickerSoortVoor(documenttype: string, layout: Job | null, floriday: boolean, klaar: boolean): StickerSoort;
|
|
152
154
|
/** Eigen ontwerp past niet op het geladen etiket: variant op de etiketmaat maken. */
|
|
153
155
|
export declare function eigenEtiketVariantNodig(layout: Job, etiket: GeladenEtiket): boolean;
|
|
156
|
+
/** Geldt de keuzeregel? Niet voor een testprint op één printer en niet voor een testpagina. */
|
|
157
|
+
export declare function keuzeRegelGeldt(job: Job): boolean;
|
|
154
158
|
export {};
|
|
155
159
|
//# sourceMappingURL=printQueue.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,OAAO,EAA+H,KAAK,gBAAgB,EAAkF,MAAM,mBAAmB,CAAC;AAQvQ,OAAO,EAAsD,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1G,OAAO,EAAkL,KAAK,YAAY,EAAwB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"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"}
|