@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.
- package/dist-lib/components/A4StickervelKaart.d.ts +5 -0
- package/dist-lib/components/A4StickervelKaart.d.ts.map +1 -0
- package/dist-lib/components/A4StickervelKaart.js +123 -0
- package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
- package/dist-lib/components/KlaarOmTePrintenBlok.js +50 -7
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +2 -1
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +3 -1
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekkenPage.js +2 -1
- package/dist-lib/components/StickerRouteTestKaart.d.ts +5 -0
- package/dist-lib/components/StickerRouteTestKaart.d.ts.map +1 -0
- package/dist-lib/components/StickerRouteTestKaart.js +75 -0
- package/dist-lib/components/UitwijkRegel.d.ts +5 -0
- package/dist-lib/components/UitwijkRegel.d.ts.map +1 -0
- package/dist-lib/components/UitwijkRegel.js +17 -0
- package/dist-lib/components/UitwijkTekening.d.ts +19 -0
- package/dist-lib/components/UitwijkTekening.d.ts.map +1 -0
- package/dist-lib/components/UitwijkTekening.js +21 -0
- package/dist-lib/index.d.ts +12 -0
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +14 -0
- package/dist-lib/integrations/supabase/types.d.ts +3227 -22
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/belading.d.ts +10 -0
- package/dist-lib/lib/belading.d.ts.map +1 -0
- package/dist-lib/lib/belading.js +49 -0
- package/dist-lib/lib/documentProfiles.js +2 -2
- package/dist-lib/lib/eigenDocumenten.d.ts +2 -0
- package/dist-lib/lib/eigenDocumenten.d.ts.map +1 -1
- package/dist-lib/lib/eigenDocumenten.js +23 -0
- package/dist-lib/lib/fieldRegistry.js +3 -2
- package/dist-lib/lib/installCheck.d.ts +36 -0
- package/dist-lib/lib/installCheck.d.ts.map +1 -0
- package/dist-lib/lib/installCheck.js +65 -0
- package/dist-lib/lib/klaarOmTePrinten.d.ts +15 -1
- package/dist-lib/lib/klaarOmTePrinten.d.ts.map +1 -1
- package/dist-lib/lib/klaarOmTePrinten.js +19 -1
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +20 -17
- package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +22 -9
- package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
- package/dist-lib/lib/pakbonContent.js +4 -1
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +5 -2
- package/dist-lib/lib/pakbonPresentation.d.ts +3 -1
- package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
- package/dist-lib/lib/pakbonPresentation.js +13 -6
- package/dist-lib/lib/printQueue.server.d.ts +24 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +239 -17
- package/dist-lib/lib/printService.server.d.ts.map +1 -1
- package/dist-lib/lib/printService.server.js +3 -2
- package/dist-lib/lib/profielHtml.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.js +2 -1
- package/dist-lib/lib/standaardLayouts.server.d.ts +6 -0
- package/dist-lib/lib/standaardLayouts.server.d.ts.map +1 -1
- package/dist-lib/lib/standaardLayouts.server.js +13 -0
- package/dist-lib/lib/stickerPlaatsing.d.ts +37 -0
- package/dist-lib/lib/stickerPlaatsing.d.ts.map +1 -0
- package/dist-lib/lib/stickerPlaatsing.js +122 -0
- package/dist-lib/lib/stickerUitwijk.d.ts +197 -0
- package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -0
- package/dist-lib/lib/stickerUitwijk.js +311 -0
- package/dist-lib/lib/testprint.d.ts +13 -0
- package/dist-lib/lib/testprint.d.ts.map +1 -1
- package/dist-lib/lib/testprint.js +38 -0
- package/dist-lib/lib/useDocumentData.js +1 -1
- package/dist-lib/lib/versie.generated.d.ts +1 -1
- package/dist-lib/lib/versie.generated.d.ts.map +1 -1
- package/dist-lib/lib/versie.generated.js +1 -1
- package/dist-lib/lib/vervoerder.d.ts +27 -3
- package/dist-lib/lib/vervoerder.d.ts.map +1 -1
- package/dist-lib/lib/vervoerder.js +65 -10
- package/dist-lib/lib/vroegeWaarschuwing.d.ts +21 -0
- package/dist-lib/lib/vroegeWaarschuwing.d.ts.map +1 -0
- package/dist-lib/lib/vroegeWaarschuwing.js +15 -0
- 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.
|
|
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,
|
|
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.
|
|
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
|
-
|
|
9
|
-
|
|
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":"
|
|
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
|
-
//
|
|
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
|
-
|
|
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:
|
|
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
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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",
|