@flowselections/layout-maker 1.69.8 → 1.69.13

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 (81) 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 +2 -1
  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 +3227 -22
  25. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  26. package/dist-lib/lib/belading.d.ts +10 -0
  27. package/dist-lib/lib/belading.d.ts.map +1 -0
  28. package/dist-lib/lib/belading.js +49 -0
  29. package/dist-lib/lib/documentProfiles.js +2 -2
  30. package/dist-lib/lib/eigenDocumenten.d.ts +2 -0
  31. package/dist-lib/lib/eigenDocumenten.d.ts.map +1 -1
  32. package/dist-lib/lib/eigenDocumenten.js +23 -0
  33. package/dist-lib/lib/fieldRegistry.js +3 -2
  34. package/dist-lib/lib/installCheck.d.ts +36 -0
  35. package/dist-lib/lib/installCheck.d.ts.map +1 -0
  36. package/dist-lib/lib/installCheck.js +65 -0
  37. package/dist-lib/lib/klaarOmTePrinten.d.ts +15 -1
  38. package/dist-lib/lib/klaarOmTePrinten.d.ts.map +1 -1
  39. package/dist-lib/lib/klaarOmTePrinten.js +19 -1
  40. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  41. package/dist-lib/lib/orderData.server.js +20 -17
  42. package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
  43. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  44. package/dist-lib/lib/pakbonBuilder.js +22 -9
  45. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  46. package/dist-lib/lib/pakbonContent.js +4 -1
  47. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  48. package/dist-lib/lib/pakbonHtml.js +5 -2
  49. package/dist-lib/lib/pakbonPresentation.d.ts +3 -1
  50. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  51. package/dist-lib/lib/pakbonPresentation.js +13 -6
  52. package/dist-lib/lib/printQueue.server.d.ts +24 -0
  53. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  54. package/dist-lib/lib/printQueue.server.js +239 -17
  55. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  56. package/dist-lib/lib/printService.server.js +3 -2
  57. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  58. package/dist-lib/lib/profielHtml.js +2 -1
  59. package/dist-lib/lib/standaardLayouts.server.d.ts +6 -0
  60. package/dist-lib/lib/standaardLayouts.server.d.ts.map +1 -1
  61. package/dist-lib/lib/standaardLayouts.server.js +13 -0
  62. package/dist-lib/lib/stickerPlaatsing.d.ts +37 -0
  63. package/dist-lib/lib/stickerPlaatsing.d.ts.map +1 -0
  64. package/dist-lib/lib/stickerPlaatsing.js +122 -0
  65. package/dist-lib/lib/stickerUitwijk.d.ts +197 -0
  66. package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -0
  67. package/dist-lib/lib/stickerUitwijk.js +311 -0
  68. package/dist-lib/lib/testprint.d.ts +13 -0
  69. package/dist-lib/lib/testprint.d.ts.map +1 -1
  70. package/dist-lib/lib/testprint.js +38 -0
  71. package/dist-lib/lib/useDocumentData.js +1 -1
  72. package/dist-lib/lib/versie.generated.d.ts +1 -1
  73. package/dist-lib/lib/versie.generated.d.ts.map +1 -1
  74. package/dist-lib/lib/versie.generated.js +1 -1
  75. package/dist-lib/lib/vervoerder.d.ts +27 -3
  76. package/dist-lib/lib/vervoerder.d.ts.map +1 -1
  77. package/dist-lib/lib/vervoerder.js +65 -10
  78. package/dist-lib/lib/vroegeWaarschuwing.d.ts +21 -0
  79. package/dist-lib/lib/vroegeWaarschuwing.d.ts.map +1 -0
  80. package/dist-lib/lib/vroegeWaarschuwing.js +15 -0
  81. package/package.json +2 -2
@@ -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")
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.8";
1
+ export declare const PAKKET_VERSIE = "1.69.13";
2
2
  //# sourceMappingURL=versie.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"versie.generated.d.ts","sourceRoot":"","sources":["../../src/lib/versie.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,WAAW,CAAC"}
1
+ {"version":3,"file":"versie.generated.d.ts","sourceRoot":"","sources":["../../src/lib/versie.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,YAAY,CAAC"}
@@ -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.8";
2
+ export const PAKKET_VERSIE = "1.69.13";
@@ -3,11 +3,35 @@ export interface VervoerderInfo {
3
3
  ophaalmoment: string;
4
4
  ophaaladres: string;
5
5
  }
6
+ /** Documentsoorten van deze module die een vervoerder moeten tonen. */
7
+ export declare const VERVOERDER_DOCUMENTEN: readonly ["pakbon", "afleverbrief", "verzendlabel", "transportdocument"];
8
+ /** Voorbeeldwaarden voor testprint en editor (geen echte vervoerdersnaam). */
9
+ export declare const VOORBEELD_VERVOERDERS: readonly ["Voorbeeld Transport BV", "Eigen vervoer", "Afhalen"];
10
+ export declare const ENGINE_TE_OUD = "Logistieke Engine 1.0.184 of hoger nodig: de opdracht bevat geen vervoerder (carrier_label). Er is niets geprint.";
11
+ export declare function geenVervoerderTekst(ordernummer: string): string;
12
+ export type CarrierUitkomst = {
13
+ soort: "ok";
14
+ label: string;
15
+ } | {
16
+ soort: "geen";
17
+ } | {
18
+ soort: "afwezig";
19
+ };
20
+ /** Kiest het voorbeeldlabel voor een testprint (alleen één van de drie). */
21
+ export declare function voorbeeldVervoerder(payload: unknown): string;
22
+ /** Leest carrier_label uit één transportobject (payload of logistics_brief_transport). */
23
+ export declare function carrierUitTransport(t: unknown): CarrierUitkomst;
24
+ /** Zoekt carrier_label in de payload (bovenin, transport, data, data.transport). */
25
+ export declare function carrierUitPayload(payload: unknown): CarrierUitkomst;
6
26
  /** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
7
27
  export declare function ophaalmomentTekst(iso: unknown): string;
8
- export declare function vervoerderUitPayload(payload: unknown): VervoerderInfo;
9
- /** Zet bekende waarden op order.transport; ontbrekende blijven leeg (regel valt weg). */
28
+ /** Ophaalmoment/-adres uit de payload. De vervoerder komt hier NIET vandaan. */
29
+ export declare function vervoerderUitPayload(payload: unknown, carrierLabel?: string | null): VervoerderInfo;
30
+ /**
31
+ * Zet vervoerder (alleen carrier_label) en ophaalgegevens op order.transport.
32
+ * Elke andere bronwaarde voor de transporteur wordt overschreven: geen terugval.
33
+ */
10
34
  export declare function metVervoerder<T extends {
11
35
  transport: Record<string, unknown>;
12
- }>(order: T, payload: unknown): T;
36
+ }>(order: T, payload: unknown, carrierLabel?: string | null): T;
13
37
  //# sourceMappingURL=vervoerder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vervoerder.d.ts","sourceRoot":"","sources":["../../src/lib/vervoerder.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAUtD;AAeD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAWrE;AAED,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAW7G"}
1
+ {"version":3,"file":"vervoerder.d.ts","sourceRoot":"","sources":["../../src/lib/vervoerder.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,0EAA2E,CAAC;AAE9G,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,iEAAkE,CAAC;AAErG,eAAO,MAAM,aAAa,sHAC2F,CAAC;AAEtH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzB,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG5D;AAMD,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,CAa/D;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAWnE;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAUtD;AAeD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,cAAc,CAQzG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC5E,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,CAAC,CAYH"}
@@ -1,8 +1,61 @@
1
1
  // ============================================================================
2
2
  // src/lib/vervoerder.ts — vervoerder en ophaalmoment uit de printopdracht.
3
- // Alleen uit payload; nooit aanvullen. Een vervoerdersadres is geen ophaaladres.
3
+ // De vervoerder komt uitsluitend uit `carrier_label` van de Logistieke Engine
4
+ // (1.0.184+). Nooit opzoeken op naam, nooit terugvallen op een andere naam.
4
5
  // ============================================================================
5
6
  const tekst = (v) => (typeof v === "string" ? v.trim() : "");
7
+ const obj = (v) => (v && typeof v === "object" ? v : null);
8
+ /** Documentsoorten van deze module die een vervoerder moeten tonen. */
9
+ export const VERVOERDER_DOCUMENTEN = ["pakbon", "afleverbrief", "verzendlabel", "transportdocument"];
10
+ /** Voorbeeldwaarden voor testprint en editor (geen echte vervoerdersnaam). */
11
+ export const VOORBEELD_VERVOERDERS = ["Voorbeeld Transport BV", "Eigen vervoer", "Afhalen"];
12
+ export const ENGINE_TE_OUD = "Logistieke Engine 1.0.184 of hoger nodig: de opdracht bevat geen vervoerder (carrier_label). Er is niets geprint.";
13
+ export function geenVervoerderTekst(ordernummer) {
14
+ const nr = ordernummer.trim() || "zonder nummer";
15
+ return `Geen vervoerder bij order ${nr}: stel er een in bij de order of bij Afhandeling → Vervoerders`;
16
+ }
17
+ /** Kiest het voorbeeldlabel voor een testprint (alleen één van de drie). */
18
+ export function voorbeeldVervoerder(payload) {
19
+ const gevraagd = tekst(obj(payload)?.["voorbeeld_carrier_label"]);
20
+ return VOORBEELD_VERVOERDERS.includes(gevraagd) ? gevraagd : VOORBEELD_VERVOERDERS[0];
21
+ }
22
+ function isGeenBron(o) {
23
+ return [o["carrier_source"], o["vervoerder_bron"], o["bron"]].some((v) => tekst(v).toLowerCase() === "geen");
24
+ }
25
+ /** Leest carrier_label uit één transportobject (payload of logistics_brief_transport). */
26
+ export function carrierUitTransport(t) {
27
+ const o = obj(t);
28
+ if (!o)
29
+ return { soort: "afwezig" };
30
+ if (isGeenBron(o))
31
+ return { soort: "geen" };
32
+ const label = tekst(o["carrier_label"]);
33
+ if (label)
34
+ return { soort: "ok", label };
35
+ if ("carrier_label" in o)
36
+ return { soort: "geen" };
37
+ // De Engine meldt zelf dat de vervoerder ontbreekt.
38
+ const onbekend = Array.isArray(o["onbekend"]) ? o["onbekend"].map(tekst) : [];
39
+ if (onbekend.some((x) => x === "vervoerder" || x === "vervoerder_niet_eenduidig" || x === "order")) {
40
+ return { soort: "geen" };
41
+ }
42
+ return { soort: "afwezig" };
43
+ }
44
+ /** Zoekt carrier_label in de payload (bovenin, transport, data, data.transport). */
45
+ export function carrierUitPayload(payload) {
46
+ const p = obj(payload) ?? {};
47
+ const d = obj(p["data"]);
48
+ const plekken = [p, obj(p["transport"]), d, obj(d?.["transport"])];
49
+ let geen = false;
50
+ for (const plek of plekken) {
51
+ const r = carrierUitTransport(plek);
52
+ if (r.soort === "ok")
53
+ return r;
54
+ if (r.soort === "geen")
55
+ geen = true;
56
+ }
57
+ return geen ? { soort: "geen" } : { soort: "afwezig" };
58
+ }
6
59
  /** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
7
60
  export function ophaalmomentTekst(iso) {
8
61
  const s = tekst(iso);
@@ -31,26 +84,28 @@ function adresTekst(v) {
31
84
  ].filter(Boolean);
32
85
  return delen.join(", ");
33
86
  }
34
- export function vervoerderUitPayload(payload) {
87
+ /** Ophaalmoment/-adres uit de payload. De vervoerder komt hier NIET vandaan. */
88
+ export function vervoerderUitPayload(payload, carrierLabel = null) {
35
89
  const p = (payload && typeof payload === "object" ? payload : {});
36
- const v = (p["vervoerder"] && typeof p["vervoerder"] === "object" ? p["vervoerder"] : {});
37
- const naam = tekst(v["naam"]);
38
- const code = tekst(v["code"]);
39
90
  return {
40
- transporteur: naam ? (code ? `${naam} (${code})` : naam) : "",
91
+ transporteur: carrierLabel ?? "",
41
92
  ophaalmoment: ophaalmomentTekst(p["ophaalmoment"]),
42
93
  // Alleen payload.ophaaladres; vervoerder.adres wordt bewust genegeerd.
43
94
  ophaaladres: adresTekst(p["ophaaladres"]),
44
95
  };
45
96
  }
46
- /** Zet bekende waarden op order.transport; ontbrekende blijven leeg (regel valt weg). */
47
- export function metVervoerder(order, payload) {
48
- const v = vervoerderUitPayload(payload);
97
+ /**
98
+ * Zet vervoerder (alleen carrier_label) en ophaalgegevens op order.transport.
99
+ * Elke andere bronwaarde voor de transporteur wordt overschreven: geen terugval.
100
+ */
101
+ export function metVervoerder(order, payload, carrierLabel = null) {
102
+ const v = vervoerderUitPayload(payload, carrierLabel);
49
103
  return {
50
104
  ...order,
51
105
  transport: {
52
106
  ...order.transport,
53
- ...(v.transporteur ? { transporteur: v.transporteur } : {}),
107
+ transporteur: v.transporteur,
108
+ carrier_label: v.transporteur,
54
109
  ophaalmoment: v.ophaalmoment,
55
110
  ophaaladres: v.ophaaladres,
56
111
  },
@@ -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.8",
3
+ "version": "1.69.13",
4
4
  "flowselections": {
5
5
  "moduleId": "layout-maker",
6
6
  "pages": [
@@ -143,7 +143,7 @@
143
143
  "devDependencies": {
144
144
  "@cloudflare/vite-plugin": "^1.25.5",
145
145
  "@eslint/js": "^9.32.0",
146
- "@flowselections/core": "1.0.29",
146
+ "@flowselections/core": "1.0.30",
147
147
  "@lovable.dev/vite-tanstack-config": "2.26.5",
148
148
  "@rsbuild/core": "^1.0.0",
149
149
  "@tailwindcss/vite": "^4.2.1",