@flowselections/layout-maker 1.69.10 → 1.69.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist-lib/components/A4StickervelKaart.d.ts +5 -0
  2. package/dist-lib/components/A4StickervelKaart.d.ts.map +1 -0
  3. package/dist-lib/components/A4StickervelKaart.js +123 -0
  4. package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
  5. package/dist-lib/components/KlaarOmTePrintenBlok.js +50 -7
  6. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  7. package/dist-lib/components/PrintQueuePage.js +4 -6
  8. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  9. package/dist-lib/components/PrintplekDetailPage.js +3 -1
  10. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  11. package/dist-lib/components/PrintplekkenPage.js +2 -1
  12. package/dist-lib/components/StickerRouteTestKaart.d.ts +5 -0
  13. package/dist-lib/components/StickerRouteTestKaart.d.ts.map +1 -0
  14. package/dist-lib/components/StickerRouteTestKaart.js +75 -0
  15. package/dist-lib/components/UitwijkRegel.d.ts +5 -0
  16. package/dist-lib/components/UitwijkRegel.d.ts.map +1 -0
  17. package/dist-lib/components/UitwijkRegel.js +17 -0
  18. package/dist-lib/components/UitwijkTekening.d.ts +19 -0
  19. package/dist-lib/components/UitwijkTekening.d.ts.map +1 -0
  20. package/dist-lib/components/UitwijkTekening.js +21 -0
  21. package/dist-lib/index.d.ts +12 -0
  22. package/dist-lib/index.d.ts.map +1 -1
  23. package/dist-lib/index.js +14 -0
  24. package/dist-lib/integrations/supabase/types.d.ts +3714 -25
  25. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  26. package/dist-lib/integrations/supabase/types.js +1 -0
  27. package/dist-lib/lib/belading.d.ts +10 -0
  28. package/dist-lib/lib/belading.d.ts.map +1 -0
  29. package/dist-lib/lib/belading.js +49 -0
  30. package/dist-lib/lib/codelijstCache.d.ts +11 -0
  31. package/dist-lib/lib/codelijstCache.d.ts.map +1 -0
  32. package/dist-lib/lib/codelijstCache.js +117 -0
  33. package/dist-lib/lib/documentTypes.d.ts +1 -1
  34. package/dist-lib/lib/documentTypes.d.ts.map +1 -1
  35. package/dist-lib/lib/documentTypes.js +2 -1
  36. package/dist-lib/lib/eigenDocumenten.d.ts +2 -0
  37. package/dist-lib/lib/eigenDocumenten.d.ts.map +1 -1
  38. package/dist-lib/lib/eigenDocumenten.js +22 -0
  39. package/dist-lib/lib/installCheck.d.ts +36 -0
  40. package/dist-lib/lib/installCheck.d.ts.map +1 -0
  41. package/dist-lib/lib/installCheck.js +65 -0
  42. package/dist-lib/lib/kiesFormaat.d.ts +11 -0
  43. package/dist-lib/lib/kiesFormaat.d.ts.map +1 -0
  44. package/dist-lib/lib/kiesFormaat.js +32 -0
  45. package/dist-lib/lib/klaarOmTePrinten.d.ts +15 -1
  46. package/dist-lib/lib/klaarOmTePrinten.d.ts.map +1 -1
  47. package/dist-lib/lib/klaarOmTePrinten.js +19 -1
  48. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  49. package/dist-lib/lib/orderData.server.js +25 -31
  50. package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
  51. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  52. package/dist-lib/lib/pakbonBuilder.js +18 -5
  53. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  54. package/dist-lib/lib/pakbonContent.js +4 -1
  55. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  56. package/dist-lib/lib/pakbonHtml.js +5 -2
  57. package/dist-lib/lib/pakbonPresentation.d.ts +3 -1
  58. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  59. package/dist-lib/lib/pakbonPresentation.js +13 -6
  60. package/dist-lib/lib/printQueue.server.d.ts +16 -2
  61. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  62. package/dist-lib/lib/printQueue.server.js +305 -59
  63. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  64. package/dist-lib/lib/printService.server.js +3 -2
  65. package/dist-lib/lib/printerKeuze.d.ts +15 -0
  66. package/dist-lib/lib/printerKeuze.d.ts.map +1 -0
  67. package/dist-lib/lib/printerKeuze.js +32 -0
  68. package/dist-lib/lib/queueTick.d.ts.map +1 -1
  69. package/dist-lib/lib/queueTick.js +9 -1
  70. package/dist-lib/lib/runnerRegistry.server.d.ts +10 -0
  71. package/dist-lib/lib/runnerRegistry.server.d.ts.map +1 -1
  72. package/dist-lib/lib/runnerRegistry.server.js +55 -0
  73. package/dist-lib/lib/standaardLayouts.server.d.ts +6 -0
  74. package/dist-lib/lib/standaardLayouts.server.d.ts.map +1 -1
  75. package/dist-lib/lib/standaardLayouts.server.js +13 -0
  76. package/dist-lib/lib/stickerPlaatsing.d.ts +37 -0
  77. package/dist-lib/lib/stickerPlaatsing.d.ts.map +1 -0
  78. package/dist-lib/lib/stickerPlaatsing.js +122 -0
  79. package/dist-lib/lib/stickerUitwijk.d.ts +197 -0
  80. package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -0
  81. package/dist-lib/lib/stickerUitwijk.js +311 -0
  82. package/dist-lib/lib/testprint.d.ts +13 -0
  83. package/dist-lib/lib/testprint.d.ts.map +1 -1
  84. package/dist-lib/lib/testprint.js +38 -0
  85. package/dist-lib/lib/useDocumentData.js +1 -1
  86. package/dist-lib/lib/versie.generated.d.ts +1 -1
  87. package/dist-lib/lib/versie.generated.js +1 -1
  88. package/dist-lib/lib/vroegeWaarschuwing.d.ts +21 -0
  89. package/dist-lib/lib/vroegeWaarschuwing.d.ts.map +1 -0
  90. package/dist-lib/lib/vroegeWaarschuwing.js +15 -0
  91. package/package.json +1 -1
  92. package/sql/print-schema.sql +1 -0
@@ -0,0 +1,311 @@
1
+ // ============================================================================
2
+ // src/lib/stickerUitwijk.ts — stickers worden ALTIJD geprint, op het best
3
+ // passende etiket (1.69.11). Vervangt "nooit schalen; past niet = weigeren".
4
+ //
5
+ // Volgorde per sticker:
6
+ // a. precies passend etiket → "precies"
7
+ // b. 90° gedraaid passend → "gedraaid"
8
+ // c. best passend, kleinste afwijking:
9
+ // - groter etiket: 1-op-1 gecentreerd, nooit vergroten → "groter_etiket"
10
+ // - kleiner etiket: verkleinen met behoud van verhouding, alleen als het
11
+ // voor deze soort aan staat, binnen de ondergrens en met leesbare
12
+ // barcode → "verkleind"
13
+ // d. 1-op-1 op een A4-stickervel op de A4-printer → "a4_vel"
14
+ // e. geen vel ingesteld: 1-op-1 op gewoon A4 met snijlijnen → "a4_snijlijnen"
15
+ // Nooit uitrekken, nooit overslaan. Eén functie voor wachtrij, voorbeeld,
16
+ // Printen/Printplekken en de install_check.
17
+ // ============================================================================
18
+ export const STICKER_SOORTEN = [
19
+ { soort: "floriday_sticker", label: "Floriday-sticker", veilingbarcode: true },
20
+ { soort: "floriday_traysticker", label: "Floriday-traysticker", veilingbarcode: true },
21
+ { soort: "klantsticker", label: "Klantsticker", veilingbarcode: false },
22
+ { soort: "eigen_sticker", label: "Eigen sticker", veilingbarcode: false },
23
+ { soort: "eigen_traysticker", label: "Eigen traysticker", veilingbarcode: false },
24
+ ];
25
+ /** Sleutel in app_settings. De standaardwaarden staan alleen hieronder. */
26
+ export const STICKER_INSTELLING_SLEUTEL = "layouts.sticker_verkleinen";
27
+ /** Printplekken (ids, JSON-lijst) waar een A4-stickervel in de A4-printer ligt. */
28
+ /** @deprecated 1.69.12: vervangen door print_plekken.a4_stickervel; alleen nog voor de overname. */
29
+ export const A4_STICKERVEL_SLEUTEL = "layouts.a4_stickervel_plekken";
30
+ /** De enige plek met de standaardwaarden: aan, 90% met veilingbarcode, anders 85%. */
31
+ export function standaardStickerInstellingen() {
32
+ const uit = {};
33
+ for (const s of STICKER_SOORTEN)
34
+ uit[s.soort] = { toegestaan: true, ondergrens_pct: s.veilingbarcode ? 90 : 85 };
35
+ return uit;
36
+ }
37
+ /** Leest de opgeslagen waarde (tekst of object); ontbrekende soorten krijgen de standaard. */
38
+ export function leesStickerInstellingen(v) {
39
+ let o = v;
40
+ if (typeof v === "string") {
41
+ try {
42
+ o = JSON.parse(v);
43
+ }
44
+ catch {
45
+ o = null;
46
+ }
47
+ }
48
+ const basis = standaardStickerInstellingen();
49
+ if (!o || typeof o !== "object")
50
+ return basis;
51
+ for (const s of STICKER_SOORTEN) {
52
+ const r = o[s.soort];
53
+ if (!r || typeof r !== "object")
54
+ continue;
55
+ const t = r.toegestaan;
56
+ const g = Number(r.ondergrens_pct);
57
+ basis[s.soort] = {
58
+ toegestaan: typeof t === "boolean" ? t : basis[s.soort].toegestaan,
59
+ ondergrens_pct: g > 0 && g <= 100 ? g : basis[s.soort].ondergrens_pct,
60
+ };
61
+ }
62
+ return basis;
63
+ }
64
+ /**
65
+ * Strikt lezen (1.69.12): alleen een volledige instelling voor alle soorten
66
+ * telt; anders null. Geen aanvulling met standaardwaarden uit de code — die
67
+ * staan alleen in de databasefunctie layouts_zorg_voor_sticker_verkleinen.
68
+ */
69
+ export function leesStickerInstellingenStrikt(v) {
70
+ let o = v;
71
+ if (typeof v === "string") {
72
+ try {
73
+ o = JSON.parse(v);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ if (!o || typeof o !== "object")
80
+ return null;
81
+ const uit = {};
82
+ for (const s of STICKER_SOORTEN) {
83
+ const r = o[s.soort];
84
+ const g = Number(r?.["ondergrens_pct"]);
85
+ if (!r || typeof r["toegestaan"] !== "boolean" || !(g > 0 && g <= 100))
86
+ return null;
87
+ uit[s.soort] = { toegestaan: r["toegestaan"], ondergrens_pct: g };
88
+ }
89
+ return uit;
90
+ }
91
+ export const A4_VELINDELINGEN = [
92
+ { breedte_mm: 100, hoogte_mm: 62, kolommen: 2, rijen: 4 },
93
+ { breedte_mm: 100, hoogte_mm: 150, kolommen: 2, rijen: 1 },
94
+ { breedte_mm: 50, hoogte_mm: 50, kolommen: 4, rijen: 5 },
95
+ { breedte_mm: 40, hoogte_mm: 40, kolommen: 5, rijen: 7 },
96
+ { breedte_mm: 48, hoogte_mm: 48, kolommen: 4, rijen: 6 },
97
+ { breedte_mm: 50, hoogte_mm: 40, kolommen: 4, rijen: 7 },
98
+ ];
99
+ /** Gangbare etiketmaten (ook voor de varianten van eigen stickers). */
100
+ export const GANGBARE_ETIKETMATEN = A4_VELINDELINGEN.map((v) => ({ breedte_mm: v.breedte_mm, hoogte_mm: v.hoogte_mm }));
101
+ export function velindelingVoor(b, h) {
102
+ return (A4_VELINDELINGEN.find((v) => (Math.abs(v.breedte_mm - b) <= 1 && Math.abs(v.hoogte_mm - h) <= 1) ||
103
+ (Math.abs(v.breedte_mm - h) <= 1 && Math.abs(v.hoogte_mm - b) <= 1)) ?? null);
104
+ }
105
+ /** Tolerantie bij het herkennen van een papiermaat van de printer. */
106
+ export const PAPIER_TOLERANTIE_MM = 1;
107
+ /** Papiernaam op afmeting (±1 mm, ook gedraaid) uit de PrintNode-lijst; null als er geen is. */
108
+ export function papierOpMaat(formaten, b, h) {
109
+ if (!formaten || typeof formaten !== "object" || Array.isArray(formaten))
110
+ return null;
111
+ const kort = Math.min(b, h);
112
+ const lang = Math.max(b, h);
113
+ let beste = null;
114
+ for (const [naam, m] of Object.entries(formaten)) {
115
+ const w = Number(m?.[0]) / 10;
116
+ const hh = Number(m?.[1]) / 10;
117
+ if (!Number.isFinite(w) || !Number.isFinite(hh))
118
+ continue;
119
+ const k = Math.min(w, hh);
120
+ const l = Math.max(w, hh);
121
+ const dk = Math.abs(k - kort);
122
+ const dl = Math.abs(l - lang);
123
+ if (dk <= PAPIER_TOLERANTIE_MM + 1e-9 && dl <= PAPIER_TOLERANTIE_MM + 1e-9 && (!beste || dk + dl < beste.af))
124
+ beste = { naam, af: dk + dl };
125
+ }
126
+ return beste?.naam ?? null;
127
+ }
128
+ const MARGE_MM = 2;
129
+ /** Nominale smalste streep van een Code128/veilingbarcode op ware grootte. */
130
+ export const NOMINALE_STREEP_MM = 0.33;
131
+ /** Minimaal 2 printerpunten per smalste streep. */
132
+ export function barcodeLeesbaar(schaal, dpi, streep_mm = NOMINALE_STREEP_MM) {
133
+ const punt = 25.4 / (dpi && dpi > 0 ? dpi : 203);
134
+ return streep_mm * schaal >= 2 * punt - 1e-9;
135
+ }
136
+ const r = (n) => Math.round(n);
137
+ const maat = (b, h) => `${r(b)}×${r(h)}`;
138
+ /**
139
+ * Kiest de uitwijkroute, vaste volgorde:
140
+ * 1. precies passend etiket; 2. hetzelfde etiket gedraaid;
141
+ * 3. groter etiket 1-op-1 gecentreerd, en pas als geen etiket groot genoeg
142
+ * is: verkleinen (verhouding gelijk, ondergrens, barcode leesbaar);
143
+ * 4. A4-stickervel; 5. A4 met snijlijnen.
144
+ * Geeft null alleen als er helemaal geen printer is.
145
+ */
146
+ export function kiesUitwijkroute(input) {
147
+ const { breedte_mm: b, hoogte_mm: h } = input.sticker;
148
+ const liggend = b > h;
149
+ const draai = (e) => (liggend !== e.breedte_mm > e.hoogte_mm ? 90 : 0);
150
+ const bijna = (x, y) => Math.abs(x - y) <= MARGE_MM;
151
+ const st = maat(b, h);
152
+ // Papiermaat op afmeting; zonder passende papiermaat telt het etiket niet.
153
+ const zonderPapier = [];
154
+ const bruikbaar = [];
155
+ for (const e of input.etiketten) {
156
+ if (e.formaten === undefined) {
157
+ bruikbaar.push({ ...e, gekozenPaper: e.paper });
158
+ continue;
159
+ }
160
+ const naam = papierOpMaat(e.formaten, e.breedte_mm, e.hoogte_mm);
161
+ if (naam)
162
+ bruikbaar.push({ ...e, gekozenPaper: naam });
163
+ else
164
+ zonderPapier.push(`Printer ${e.printerNaam} heeft geen papiermaat ${maat(e.breedte_mm, e.hoogte_mm)} ingesteld`);
165
+ }
166
+ const uit = (e, route, schaal, rotate, reden) => ({
167
+ uitwijkroute: route, printerNaam: e.printerNaam, printerId: e.printerId, schaal, reden, paper: e.gekozenPaper, rotate, fitToPage: false,
168
+ pagina_breedte_mm: e.breedte_mm, pagina_hoogte_mm: e.hoogte_mm, sticker_breedte_mm: b, sticker_hoogte_mm: h,
169
+ });
170
+ // 1. precies
171
+ for (const e of bruikbaar) {
172
+ if (bijna(b, e.breedte_mm) && bijna(h, e.hoogte_mm))
173
+ return uit(e, "precies", 1, draai(e), `Geprint op ${maat(e.breedte_mm, e.hoogte_mm)}, precies passend`);
174
+ }
175
+ // 2. gedraaid
176
+ for (const e of bruikbaar) {
177
+ if (bijna(b, e.hoogte_mm) && bijna(h, e.breedte_mm))
178
+ return uit(e, "gedraaid", 1, 90, `Geprint op ${maat(e.breedte_mm, e.hoogte_mm)} in plaats van ${st}, 90° gedraaid`);
179
+ }
180
+ const groter = [];
181
+ const kleiner = [];
182
+ for (const e of bruikbaar) {
183
+ for (const rot of [0, 90]) {
184
+ const eb = rot ? e.hoogte_mm : e.breedte_mm;
185
+ const eh = rot ? e.breedte_mm : e.hoogte_mm;
186
+ if (b <= eb + MARGE_MM && h <= eh + MARGE_MM) {
187
+ groter.push({ afwijking: (eb * eh - b * h) / (b * h), u: uit(e, "groter_etiket", 1, rot, `Geprint op ${maat(e.breedte_mm, e.hoogte_mm)} in plaats van ${st}, 1-op-1 gecentreerd${rot ? " en 90° gedraaid" : ""}`) });
188
+ }
189
+ else if (input.instelling && input.instelling.toegestaan) {
190
+ // 3b. verkleinen, verhouding gelijk, nooit uitrekken
191
+ const schaal = Math.min(eb / b, eh / h, 1);
192
+ const pct = Math.round(schaal * 100);
193
+ if (schaal * 100 >= input.instelling.ondergrens_pct - 1e-9 && (input.heeftBarcode === false || barcodeLeesbaar(schaal, e.dpi))) {
194
+ 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
+ }
196
+ }
197
+ }
198
+ }
199
+ groter.sort((x, y) => x.afwijking - y.afwijking);
200
+ if (groter[0])
201
+ return groter[0].u;
202
+ kleiner.sort((x, y) => x.afwijking - y.afwijking);
203
+ if (kleiner[0])
204
+ return kleiner[0].u;
205
+ // 4 + 5: A4
206
+ if (input.a4Printer) {
207
+ if (!input.instelling && bruikbaar.length)
208
+ zonderPapier.push("Instelling verkleinen niet leesbaar");
209
+ const vooraf = zonderPapier.length ? `${zonderPapier.join("; ")} – ` : "";
210
+ const vel = input.a4VelIngesteld ? (input.a4VelIndeling ?? velindelingVoor(b, h)) : null;
211
+ const basis = { printerNaam: input.a4Printer.naam, printerId: input.a4Printer.id, schaal: 1, paper: "A4", rotate: 0, fitToPage: false, pagina_breedte_mm: 210, pagina_hoogte_mm: 297, sticker_breedte_mm: b, sticker_hoogte_mm: h };
212
+ return vel
213
+ ? { ...basis, uitwijkroute: "a4_vel", velindeling: vel, reden: `${vooraf}${vooraf ? "geprint" : "Geprint"} op A4-stickervel (${vel.kolommen}×${vel.rijen} van ${maat(vel.breedte_mm, vel.hoogte_mm)}) in plaats van ${st}, 1-op-1` }
214
+ : { ...basis, uitwijkroute: "a4_snijlijnen", reden: `${vooraf}${vooraf ? "geprint" : "Geprint"} op A4 met snijlijnen in plaats van ${st}, 1-op-1` };
215
+ }
216
+ return null;
217
+ }
218
+ /** Voorstelwaarden voor een eigen vel op de kaart A4-stickervel (alleen invulhulp). */
219
+ export const EIGEN_VEL_VOORSTEL = { marge_boven_mm: 10, marge_links_mm: 5, tussen_h_mm: 0, tussen_v_mm: 0 };
220
+ export function leesA4StickervelWaarde(v) {
221
+ if (!v || typeof v !== "object")
222
+ return null;
223
+ const o = v;
224
+ if (o["aanwezig"] !== true)
225
+ return { aanwezig: false };
226
+ const b = Number(o["breedte_mm"]);
227
+ const h = Number(o["hoogte_mm"]);
228
+ if (!(b > 0 && h > 0))
229
+ return { aanwezig: true };
230
+ const mm = (k) => { const n = Number(o[k]); return Number.isFinite(n) && n >= 0 ? n : undefined; };
231
+ const uit = { aanwezig: true, breedte_mm: b, hoogte_mm: h };
232
+ for (const k of ["marge_boven_mm", "marge_links_mm", "tussen_h_mm", "tussen_v_mm"]) {
233
+ const v = mm(k);
234
+ if (v !== undefined)
235
+ uit[k] = v;
236
+ }
237
+ return uit;
238
+ }
239
+ /**
240
+ * Velindeling voor deze sticker op deze printplek. Een eigen vel (met maat)
241
+ * gaat altijd vóór de standaardlijst; past de sticker daar niet op, dan geen
242
+ * vel (dus A4 met snijlijnen), nooit schalen. Zonder eigen maat: standaardlijst.
243
+ */
244
+ export function a4VelVoor(vel, sticker) {
245
+ if (!vel?.aanwezig)
246
+ return null;
247
+ const { breedte_mm: b, hoogte_mm: h } = sticker;
248
+ if (vel.breedte_mm !== undefined && vel.hoogte_mm !== undefined) {
249
+ if (Math.abs(vel.breedte_mm - b) > 1 || Math.abs(vel.hoogte_mm - h) > 1)
250
+ return null;
251
+ const mb = vel.marge_boven_mm ?? 0;
252
+ const ml = vel.marge_links_mm ?? 0;
253
+ const th = vel.tussen_h_mm ?? 0;
254
+ const tv = vel.tussen_v_mm ?? 0;
255
+ return {
256
+ breedte_mm: vel.breedte_mm,
257
+ hoogte_mm: vel.hoogte_mm,
258
+ kolommen: Math.max(1, Math.floor((210 - 2 * ml + th + 1e-9) / (vel.breedte_mm + th))),
259
+ rijen: Math.max(1, Math.floor((297 - 2 * mb + tv + 1e-9) / (vel.hoogte_mm + tv))),
260
+ marge_boven_mm: mb,
261
+ marge_links_mm: ml,
262
+ tussen_h_mm: th,
263
+ tussen_v_mm: tv,
264
+ };
265
+ }
266
+ return velindelingVoor(b, h);
267
+ }
268
+ /** Ligt er op deze printplek een vel dat bij deze stickermaat hoort? */
269
+ export function a4VelPast(vel, sticker) {
270
+ return !!a4VelVoor(vel, sticker);
271
+ }
272
+ /** Papiermaat-waarschuwing per etiket (voor Printplekken en install_check). */
273
+ export function papierWaarschuwingen(etiketten) {
274
+ return etiketten
275
+ .filter((e) => e.formaten !== undefined && !papierOpMaat(e.formaten, e.breedte_mm, e.hoogte_mm))
276
+ .map((e) => `Printer ${e.printerNaam} heeft geen papiermaat ${maat(e.breedte_mm, e.hoogte_mm)} ingesteld – stickers gaan naar A4. Stel de papiermaat in bij de printer.`);
277
+ }
278
+ /** Vastgelegde uitkomst met precies de veldnamen die Pickschermen 1.0.61 leest. */
279
+ export function uitwijkVoorPickschermen(u) {
280
+ return { uitwijkroute: u.uitwijkroute, printerNaam: u.printerNaam, schaal: u.schaal, reden: u.reden };
281
+ }
282
+ /** Overzicht per printplek: hoe elke gangbare maat geprint wordt (waarschuwing, geen blokkade). */
283
+ export function stickerMatenOverzicht(etiketten, a4Printer, a4VelIngesteld, instelling, maten = GANGBARE_ETIKETMATEN) {
284
+ return maten.map((m) => ({
285
+ maat: maat(m.breedte_mm, m.hoogte_mm),
286
+ uitkomst: kiesUitwijkroute({ sticker: m, etiketten, a4Printer, a4VelIngesteld, instelling }),
287
+ }));
288
+ }
289
+ /**
290
+ * Vroege waarschuwing: vergelijkt per dag en printplek de benodigde
291
+ * stickermaten (aangeleverd door Engine/Pickschermen) met de aanwezige
292
+ * etiketten. Alleen maten die niet precies of gedraaid passen komen terug.
293
+ */
294
+ export function vroegeStickerWaarschuwing(nodig, perPlek, instelling) {
295
+ const uit = [];
296
+ for (const n of Array.isArray(nodig) ? nodig : []) {
297
+ const plek = perPlek.get(n.print_plek_id) ?? { etiketten: [], a4Printer: null, a4VelIngesteld: false };
298
+ const u = kiesUitwijkroute({ sticker: n, etiketten: plek.etiketten, a4Printer: plek.a4Printer, a4VelIngesteld: plek.a4VelIngesteld, instelling });
299
+ if (u && (u.uitwijkroute === "precies" || u.uitwijkroute === "gedraaid"))
300
+ continue;
301
+ uit.push({
302
+ dag: n.dag,
303
+ print_plek_id: n.print_plek_id,
304
+ maat: maat(n.breedte_mm, n.hoogte_mm),
305
+ aantal: Number(n.aantal ?? 0),
306
+ uitwijkroute: u?.uitwijkroute ?? "geen_printer",
307
+ reden: u?.reden ?? "geen labelprinter en geen A4-printer op deze printplek",
308
+ });
309
+ }
310
+ return uit;
311
+ }
@@ -36,4 +36,17 @@ export interface TestprintResultaat {
36
36
  * routering en PrintNode-afhandeling worden gebruikt als bij echte documenten.
37
37
  */
38
38
  export declare function verstuurTestprint(documenttype: string, ctx: TestprintContext): Promise<TestprintResultaat>;
39
+ /** Voorbeeldstickers voor de testprint per uitwijkroute (1.69.12). */
40
+ export declare const VOORBEELD_STICKERMATEN: {
41
+ breedte_mm: number;
42
+ hoogte_mm: number;
43
+ uitleg: string;
44
+ }[];
45
+ /** HTML van een voorbeeldsticker met rand en maat; geen echte order. */
46
+ export declare function voorbeeldStickerHtml(b: number, h: number): string;
47
+ /** Testprint van een voorbeeldsticker op zijn eigen maat; de wachtrij kiest de uitwijkroute. */
48
+ export declare function verstuurStickerRouteTestprint(maat: {
49
+ breedte_mm: number;
50
+ hoogte_mm: number;
51
+ }, ctx: TestprintContext): Promise<TestprintResultaat>;
39
52
  //# sourceMappingURL=testprint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testprint.d.ts","sourceRoot":"","sources":["../../src/lib/testprint.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+B1F;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CA0B9F;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA6C7B"}
1
+ {"version":3,"file":"testprint.d.ts","sourceRoot":"","sources":["../../src/lib/testprint.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kDAAkD;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+B1F;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CA0B9F;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA6C7B;AAED,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAM7F,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,gGAAgG;AAChG,wBAAsB,6BAA6B,CACjD,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/C,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,kBAAkB,CAAC,CAoB7B"}
@@ -135,3 +135,41 @@ export async function verstuurTestprint(documenttype, ctx) {
135
135
  });
136
136
  return { jobId, printerId };
137
137
  }
138
+ /** Voorbeeldstickers voor de testprint per uitwijkroute (1.69.12). */
139
+ export const VOORBEELD_STICKERMATEN = [
140
+ { breedte_mm: 50, hoogte_mm: 40, uitleg: "bijv. op een 50×50-rol: 1-op-1 gecentreerd" },
141
+ { breedte_mm: 62, hoogte_mm: 100, uitleg: "bijv. op 100×62: gedraaid" },
142
+ { breedte_mm: 50, hoogte_mm: 50, uitleg: "zonder passend etiket: naar A4" },
143
+ { breedte_mm: 100, hoogte_mm: 62, uitleg: "traysticker" },
144
+ { breedte_mm: 100, hoogte_mm: 150, uitleg: "sticker" },
145
+ ];
146
+ /** HTML van een voorbeeldsticker met rand en maat; geen echte order. */
147
+ export function voorbeeldStickerHtml(b, h) {
148
+ return `<div style="box-sizing:border-box;width:${b}mm;height:${h}mm;border:0.4mm solid #000;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:Helvetica,Arial,sans-serif;text-align:center">
149
+ <div style="font-size:4mm;font-weight:bold">VOORBEELDSTICKER</div>
150
+ <div style="font-size:3.2mm">${Math.round(b)} × ${Math.round(h)} mm</div>
151
+ <div style="font-size:2.4mm">TESTAFDRUK – geen echte order</div></div>`;
152
+ }
153
+ /** Testprint van een voorbeeldsticker op zijn eigen maat; de wachtrij kiest de uitwijkroute. */
154
+ export async function verstuurStickerRouteTestprint(maat, ctx) {
155
+ const printplekId = ctx.printplekId ?? undefined;
156
+ const uitkomst = await routeringVoor({ documenttype: "sticker", printplekId: printplekId ?? null, werkplek: ctx.werkplek ?? null });
157
+ if (!uitkomst.printer_id)
158
+ throw new Error("Geen stickerprinter op deze printplek — stel dit in bij de printplek.");
159
+ const testId = `test-uitwijk-${maat.breedte_mm}x${maat.hoogte_mm}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
160
+ const { jobId } = await printHtml({
161
+ documenttype: "sticker",
162
+ documentnaam: `Testprint sticker ${Math.round(maat.breedte_mm)}×${Math.round(maat.hoogte_mm)}`,
163
+ html: voorbeeldStickerHtml(maat.breedte_mm, maat.hoogte_mm),
164
+ printerId: uitkomst.printer_id,
165
+ ...(printplekId ? { printplekId } : {}),
166
+ payload: {
167
+ test_id: testId,
168
+ is_testprint: true,
169
+ is_test: true,
170
+ uitwijk_test: true,
171
+ voorbeeld_formaat: { breedte_mm: maat.breedte_mm, hoogte_mm: maat.hoogte_mm, orientatie: maat.breedte_mm > maat.hoogte_mm ? "landscape" : "portrait", marge_boven: 0 },
172
+ },
173
+ });
174
+ return { jobId, printerId: uitkomst.printer_id };
175
+ }
@@ -332,7 +332,7 @@ export function usePrintJobs() {
332
332
  setLoading(true);
333
333
  const { data } = await supabase
334
334
  .from("print_jobs")
335
- .select("id, layout_id, printer_id, documenttype, documentnaam, status, paginas, kopieen, foutmelding, is_herprint, gebruiker_naam, created_at, voltooid_op, extern_job_id, gebruikte_layout_id, gebruikte_bron, payload, lokale_pdf_status, lokaal_opgeslagen_op, lokale_pdf_fout, lokale_pdf_print_plek_id, artefact_pad, artefact_sha256, artefact_bytes, verwerkingsfase, foutcode, printnode_status, printnode_bericht, printnode_status_op")
335
+ .select("id, layout_id, printer_id, documenttype, documentnaam, status, paginas, kopieen, foutmelding, is_herprint, gebruiker_naam, created_at, voltooid_op, extern_job_id, gebruikte_layout_id, gebruikte_bron, payload, lokale_pdf_status, lokaal_opgeslagen_op, lokale_pdf_fout, lokale_pdf_print_plek_id, artefact_pad, artefact_sha256, artefact_bytes, verwerkingsfase, foutcode, printnode_status, printnode_bericht, printnode_status_op, uitwijk, printer_keuze")
336
336
  .order("created_at", { ascending: false })
337
337
  .limit(200);
338
338
  setJobs(arr(data));
@@ -1,2 +1,2 @@
1
- export declare const PAKKET_VERSIE = "1.69.10";
1
+ export declare const PAKKET_VERSIE = "1.69.15";
2
2
  //# sourceMappingURL=versie.generated.d.ts.map
@@ -1,2 +1,2 @@
1
1
  // Gegenereerd door scripts/schrijf-versie.cjs uit package.json. Niet met de hand wijzigen.
2
- export const PAKKET_VERSIE = "1.69.10";
2
+ export const PAKKET_VERSIE = "1.69.15";
@@ -0,0 +1,21 @@
1
+ export interface VroegeWaarschuwingRegel {
2
+ dag: string;
3
+ print_plek_id: string;
4
+ maat: string;
5
+ aantal: number;
6
+ uitwijkroute: string;
7
+ schaal: number;
8
+ reden: string;
9
+ }
10
+ export declare function haalVroegeStickerWaarschuwing(db: {
11
+ rpc: (fn: string, args: Record<string, unknown>) => PromiseLike<{
12
+ data: unknown;
13
+ error: {
14
+ message?: string;
15
+ } | null;
16
+ }>;
17
+ }, van: string, tot: string): Promise<{
18
+ regels: VroegeWaarschuwingRegel[];
19
+ reden: string | null;
20
+ }>;
21
+ //# sourceMappingURL=vroegeWaarschuwing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vroegeWaarschuwing.d.ts","sourceRoot":"","sources":["../../src/lib/vroegeWaarschuwing.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,6BAA6B,CACjD,EAAE,EAAE;IAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,WAAW,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;CAAE,EAC9H,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAQtE"}
@@ -0,0 +1,15 @@
1
+ // ============================================================================
2
+ // src/lib/vroegeWaarschuwing.ts — vroege stickerwaarschuwing via de
3
+ // databasefunctie layouts_vroege_sticker_waarschuwing (1.69.12). Pickschermen
4
+ // roept dezelfde functie aan; de vergelijking zit dus op één plek.
5
+ // ============================================================================
6
+ export async function haalVroegeStickerWaarschuwing(db, van, tot) {
7
+ const { data, error } = await db.rpc("layouts_vroege_sticker_waarschuwing", { p_van: van, p_tot: tot });
8
+ if (error)
9
+ throw new Error(error.message || "Vroege stickerwaarschuwing kon niet worden opgehaald.");
10
+ const o = (data && typeof data === "object" ? data : {});
11
+ return {
12
+ regels: Array.isArray(o.regels) ? o.regels : [],
13
+ reden: typeof o.reden === "string" ? o.reden : null,
14
+ };
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/layout-maker",
3
- "version": "1.69.10",
3
+ "version": "1.69.15",
4
4
  "flowselections": {
5
5
  "moduleId": "layout-maker",
6
6
  "pages": [
@@ -37,6 +37,7 @@ alter type public.doc_layout_type add value if not exists 'veilingbon';
37
37
  alter type public.doc_layout_type add value if not exists 'afleverbrief';
38
38
  alter type public.doc_layout_type add value if not exists 'veilingbrief';
39
39
  alter type public.doc_layout_type add value if not exists 'traysticker';
40
+ alter type public.doc_layout_type add value if not exists 'eigen_sticker';
40
41
  do $$ begin if not exists (select 1 from pg_type where typname='doc_orientation') then create type public.doc_orientation as enum ('portrait', 'landscape'); end if; end $$;
41
42
  alter type public.doc_orientation add value if not exists 'portrait';
42
43
  alter type public.doc_orientation add value if not exists 'landscape';