@flowselections/layout-maker 1.24.1 → 1.26.0
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/README.md +139 -139
- package/dist-lib/components/AfdrukKnop.d.ts +19 -19
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +7 -7
- package/dist-lib/components/PrinterSetupWizard.js +3 -3
- package/dist-lib/components/PrintersRedirectPage.d.ts +1 -1
- package/dist-lib/components/PrintersRedirectPage.js +14 -14
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.server.js +9 -9
- package/dist-lib/lib/browserPrint.js +1 -1
- package/dist-lib/lib/layoutPreview.js +7 -7
- package/dist-lib/lib/orderData.server.d.ts +25 -3
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +171 -55
- package/dist-lib/lib/pakbonBuilder.d.ts +2 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +1 -1
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +53 -50
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/productiebonHtml.js +15 -15
- package/dist-lib/lib/profielHtml.js +18 -18
- package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
- package/dist-lib/lib/supabaseAdmin.server.js +43 -43
- package/dist-lib/lib/testpagina.js +3 -3
- package/dist-lib/lib/testprint.js +4 -4
- package/package.json +139 -139
|
@@ -26,7 +26,7 @@ export function paginaCss(formaat, orientatie, margeMm = 0) {
|
|
|
26
26
|
const gedraaid = formaat && orientatie === "landscape"
|
|
27
27
|
? `${formaat.hoogte}mm ${formaat.breedte}mm`
|
|
28
28
|
: size;
|
|
29
|
-
return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
|
|
29
|
+
return `@page { size: ${gedraaid}; margin: ${margeMm}mm; }
|
|
30
30
|
@media print { html, body { margin: 0; padding: 0; } }`;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
@@ -79,8 +79,8 @@ function elementHtml(el, ctx) {
|
|
|
79
79
|
case "cirkel":
|
|
80
80
|
return `<div style="${base};border-radius:50%;border:${s.randbreedte || 0.3}mm solid ${s.randkleur ?? "#111827"}"></div>`;
|
|
81
81
|
case "barcode":
|
|
82
|
-
return `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
|
|
83
|
-
<div style="width:100%;height:70%;background:repeating-linear-gradient(90deg,#111 0 1.2px,#fff 1.2px 3px)"></div>
|
|
82
|
+
return `<div style="${base};display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:monospace">
|
|
83
|
+
<div style="width:100%;height:70%;background:repeating-linear-gradient(90deg,#111 0 1.2px,#fff 1.2px 3px)"></div>
|
|
84
84
|
<div style="font-size:7pt">${esc(inhoud)}</div></div>`;
|
|
85
85
|
case "qrcode":
|
|
86
86
|
return `<div style="${base};background:repeating-conic-gradient(#111 0% 25%, #fff 0% 50%) 0 0/22% 22%"></div>`;
|
|
@@ -125,10 +125,10 @@ export function bouwDocumentHtml(layout, elementen, gegevens) {
|
|
|
125
125
|
const body = zichtbaar.map((e) => elementHtml(e, ctx)).join("");
|
|
126
126
|
const b = layout.orientatie === "landscape" ? layout.hoogte_mm : layout.breedte_mm;
|
|
127
127
|
const h = layout.orientatie === "landscape" ? layout.breedte_mm : layout.hoogte_mm;
|
|
128
|
-
return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
|
|
129
|
-
<style>@page{size:${b}mm ${h}mm;margin:0}
|
|
130
|
-
body{margin:0;background:#e5e7eb}
|
|
131
|
-
.pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
|
|
132
|
-
@media print{body{background:#fff}}</style></head>
|
|
128
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8"><title>${esc(layout.naam)}</title>
|
|
129
|
+
<style>@page{size:${b}mm ${h}mm;margin:0}
|
|
130
|
+
body{margin:0;background:#e5e7eb}
|
|
131
|
+
.pagina{position:relative;width:${b}mm;height:${h}mm;background:#fff;margin:0 auto;overflow:hidden}
|
|
132
|
+
@media print{body{background:#fff}}</style></head>
|
|
133
133
|
<body><div class="pagina">${body}</div></body></html>`;
|
|
134
134
|
}
|
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
import type { PrintDb } from "./printQueue.server.js";
|
|
2
2
|
type Rij = Record<string, any>;
|
|
3
|
+
export type PakbonScope = "order" | "buffer" | "cart";
|
|
3
4
|
/** Bevat de meegestuurde payload zelf al orderregels of karren? */
|
|
4
5
|
export declare function heeftOrderInhoud(bron: unknown): boolean;
|
|
5
|
-
/** Zoekt
|
|
6
|
+
/** Zoekt de scope-verwijzing in de (geneste) payload van een printopdracht. */
|
|
6
7
|
export declare function zoekOrderVerwijzing(payload: unknown): {
|
|
7
8
|
orderId: string | null;
|
|
8
9
|
ordernummer: string | null;
|
|
10
|
+
bufferId: string | null;
|
|
11
|
+
cartId: string | null;
|
|
9
12
|
};
|
|
10
13
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
14
|
+
* Bepaalt op basis van de payload welke scope actief is.
|
|
15
|
+
* orderId → order, bufferId → buffer, cartId → cart. Ontbreekt alles, dan
|
|
16
|
+
* order (huidig gedrag, met ordernummer als terugval).
|
|
17
|
+
*/
|
|
18
|
+
export declare function bepaalScope(payload: unknown): {
|
|
19
|
+
scope: PakbonScope;
|
|
20
|
+
id: string | null;
|
|
21
|
+
ordernummer: string | null;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Bouwt de ruwe pakbongegevens (vorm die `maakPakbonOrder` verwacht).
|
|
25
|
+
* Geeft `null` als er niets te vinden is.
|
|
26
|
+
*/
|
|
27
|
+
export declare function laadPakbonData(db: PrintDb, opties: {
|
|
28
|
+
scope: PakbonScope;
|
|
29
|
+
id: string | null;
|
|
30
|
+
ordernummer?: string | null;
|
|
31
|
+
}): Promise<Rij | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Terugvalpad vanuit de printwachtrij: leidt de scope af uit de payload en
|
|
34
|
+
* laadt de gegevens. Blijft bestaan zodat aanroepers niets hoeven te weten.
|
|
13
35
|
*/
|
|
14
36
|
export declare function laadOrderVanuitDatabase(db: PrintDb, payload: unknown): Promise<Rij | null>;
|
|
15
37
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAwBtD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAMA;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7E,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA2OrB;AAkCD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhG"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// src/lib/orderData.server.ts — ordergegevens ophalen uit de gedeelde database.
|
|
3
3
|
// ----------------------------------------------------------------------------
|
|
4
|
-
// Modules sturen bij een printopdracht vaak alleen verwijzingen mee (orderId
|
|
5
|
-
//
|
|
6
|
-
// basis van die verwijzing een volledig pakbon-model uit `orders`,
|
|
4
|
+
// Modules sturen bij een printopdracht vaak alleen verwijzingen mee (orderId,
|
|
5
|
+
// bufferId of cartId). Zonder inhoud zou de pakbon blanco worden. Dit bestand
|
|
6
|
+
// bouwt op basis van die verwijzing een volledig pakbon-model uit `orders`,
|
|
7
7
|
// `order_items`, `order_carts` en `order_cart_items`.
|
|
8
|
+
//
|
|
9
|
+
// Er is bewust ÉÉN laadfunctie met een scope-parameter:
|
|
10
|
+
// laadPakbonData({ scope: 'order' | 'buffer' | 'cart', id })
|
|
11
|
+
// Alle scopes leveren exact dezelfde vorm terug, zodat de renderer niet hoeft
|
|
12
|
+
// te weten welke scope actief was.
|
|
8
13
|
// Draait alleen op de server (printwachtrij).
|
|
9
14
|
// ============================================================================
|
|
10
15
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
11
16
|
const num = (v) => (Number.isFinite(Number(v)) ? Number(v) : 0);
|
|
17
|
+
const uniek = (v) => Array.from(new Set(v.map((x) => (x ? String(x) : "")).filter(Boolean)));
|
|
12
18
|
/**
|
|
13
19
|
* Deze tabellen horen bij een andere module. Bestaan ze in deze shell niet
|
|
14
20
|
* (of mag de server er niet bij), dan mag dat nooit een printopdracht laten
|
|
@@ -33,7 +39,7 @@ export function heeftOrderInhoud(bron) {
|
|
|
33
39
|
return true;
|
|
34
40
|
return arr(b["producten"]).length > 0 || arr(b["regels"]).length > 0;
|
|
35
41
|
}
|
|
36
|
-
/** Zoekt
|
|
42
|
+
/** Zoekt de scope-verwijzing in de (geneste) payload van een printopdracht. */
|
|
37
43
|
export function zoekOrderVerwijzing(payload) {
|
|
38
44
|
const kandidaten = [];
|
|
39
45
|
const verzamel = (v, diepte) => {
|
|
@@ -48,62 +54,153 @@ export function zoekOrderVerwijzing(payload) {
|
|
|
48
54
|
verzamel(payload, 0);
|
|
49
55
|
let orderId = null;
|
|
50
56
|
let ordernummer = null;
|
|
57
|
+
let bufferId = null;
|
|
58
|
+
let cartId = null;
|
|
51
59
|
for (const k of kandidaten) {
|
|
52
60
|
orderId ?? (orderId = (k["orderId"] ?? k["order_id"] ?? null));
|
|
61
|
+
bufferId ?? (bufferId = (k["bufferId"] ?? k["buffer_id"] ?? null));
|
|
62
|
+
cartId ?? (cartId = (k["cartId"] ?? k["cart_id"] ?? k["karId"] ?? null));
|
|
53
63
|
ordernummer ?? (ordernummer = (k["order_number"] ??
|
|
54
64
|
k["orderNumber"] ??
|
|
55
65
|
k["ordernummer"] ??
|
|
56
66
|
k["reference"] ??
|
|
57
67
|
null));
|
|
58
68
|
}
|
|
69
|
+
const id = (v) => (typeof v === "string" && v.length > 8 ? v : null);
|
|
59
70
|
return {
|
|
60
|
-
orderId:
|
|
71
|
+
orderId: id(orderId),
|
|
72
|
+
bufferId: id(bufferId),
|
|
73
|
+
cartId: id(cartId),
|
|
61
74
|
ordernummer: typeof ordernummer === "string" && ordernummer.trim() ? ordernummer.trim() : null,
|
|
62
75
|
};
|
|
63
76
|
}
|
|
64
77
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
78
|
+
* Bepaalt op basis van de payload welke scope actief is.
|
|
79
|
+
* orderId → order, bufferId → buffer, cartId → cart. Ontbreekt alles, dan
|
|
80
|
+
* order (huidig gedrag, met ordernummer als terugval).
|
|
67
81
|
*/
|
|
68
|
-
export
|
|
69
|
-
const { orderId, ordernummer } = zoekOrderVerwijzing(payload);
|
|
70
|
-
if (
|
|
71
|
-
return
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
export function bepaalScope(payload) {
|
|
83
|
+
const { orderId, bufferId, cartId, ordernummer } = zoekOrderVerwijzing(payload);
|
|
84
|
+
if (orderId)
|
|
85
|
+
return { scope: "order", id: orderId, ordernummer };
|
|
86
|
+
if (bufferId)
|
|
87
|
+
return { scope: "buffer", id: bufferId, ordernummer: null };
|
|
88
|
+
if (cartId)
|
|
89
|
+
return { scope: "cart", id: cartId, ordernummer: null };
|
|
90
|
+
return { scope: "order", id: null, ordernummer };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Bouwt de ruwe pakbongegevens (vorm die `maakPakbonOrder` verwacht).
|
|
94
|
+
* Geeft `null` als er niets te vinden is.
|
|
95
|
+
*/
|
|
96
|
+
export async function laadPakbonData(db, opties) {
|
|
97
|
+
const { scope, id } = opties;
|
|
98
|
+
const ordernummer = opties.ordernummer ?? null;
|
|
99
|
+
let orders = [];
|
|
100
|
+
let regels = [];
|
|
101
|
+
let karrenRijen = [];
|
|
102
|
+
/** Alleen bij order-scope: binnen gedeelde karren filteren op eigen regels. */
|
|
103
|
+
let beperkTotEigenRegels = false;
|
|
104
|
+
if (scope === "order") {
|
|
105
|
+
if (!id && !ordernummer)
|
|
106
|
+
return null;
|
|
107
|
+
let order = null;
|
|
108
|
+
if (id) {
|
|
109
|
+
order = await veilig(() => db.from("orders").select("*").eq("id", id).maybeSingle());
|
|
110
|
+
}
|
|
111
|
+
if (!order && ordernummer) {
|
|
112
|
+
const rijen = await veilig(() => db
|
|
113
|
+
.from("orders")
|
|
114
|
+
.select("*")
|
|
115
|
+
.eq("order_number", ordernummer)
|
|
116
|
+
.is("deleted_at", null)
|
|
117
|
+
.limit(1));
|
|
118
|
+
order = arr(rijen)[0] ?? null;
|
|
119
|
+
}
|
|
120
|
+
if (!order)
|
|
121
|
+
return null;
|
|
122
|
+
orders = [order];
|
|
123
|
+
beperkTotEigenRegels = true;
|
|
124
|
+
regels = arr(await veilig(() => db.from("order_items").select("*").eq("order_id", order["id"])));
|
|
125
|
+
const eigenRegelIds = regels.map((r) => String(r["id"]));
|
|
126
|
+
// 1) karren die exclusief bij deze order horen
|
|
127
|
+
// 2) gedeelde/buffer-karren waar wél regels van deze order op staan
|
|
128
|
+
const [eigen, gedeeldeItems] = await Promise.all([
|
|
129
|
+
veilig(() => db
|
|
130
|
+
.from("order_carts")
|
|
131
|
+
.select("*")
|
|
132
|
+
.eq("order_id", order["id"])
|
|
133
|
+
.order("cart_number", { ascending: true })),
|
|
134
|
+
eigenRegelIds.length
|
|
135
|
+
? veilig(() => db.from("order_cart_items").select("cart_id").in("order_item_id", eigenRegelIds))
|
|
136
|
+
: Promise.resolve([]),
|
|
137
|
+
]);
|
|
138
|
+
karrenRijen = arr(eigen);
|
|
139
|
+
const bekend = new Set(karrenRijen.map((k) => String(k["id"])));
|
|
140
|
+
const extraIds = uniek(arr(gedeeldeItems).map((i) => i["cart_id"])).filter((kid) => !bekend.has(kid));
|
|
141
|
+
if (extraIds.length) {
|
|
142
|
+
karrenRijen.push(...arr(await veilig(() => db.from("order_carts").select("*").in("id", extraIds))));
|
|
143
|
+
}
|
|
75
144
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
.
|
|
82
|
-
.
|
|
83
|
-
|
|
145
|
+
else {
|
|
146
|
+
if (!id)
|
|
147
|
+
return null;
|
|
148
|
+
// buffer: alle karren van de buffer. cart: precies één kar.
|
|
149
|
+
karrenRijen = arr(await veilig(() => scope === "buffer"
|
|
150
|
+
? db.from("order_carts").select("*").eq("buffer_id", id)
|
|
151
|
+
: db.from("order_carts").select("*").eq("id", id)));
|
|
152
|
+
if (!karrenRijen.length)
|
|
153
|
+
return null;
|
|
154
|
+
const items = arr(await veilig(() => db
|
|
155
|
+
.from("order_cart_items")
|
|
156
|
+
.select("order_item_id")
|
|
157
|
+
.in("cart_id", karrenRijen.map((k) => k["id"]))));
|
|
158
|
+
const regelIds = uniek(items.map((i) => i["order_item_id"]));
|
|
159
|
+
if (regelIds.length) {
|
|
160
|
+
regels = arr(await veilig(() => db.from("order_items").select("*").in("id", regelIds)));
|
|
161
|
+
}
|
|
162
|
+
const orderIds = uniek([
|
|
163
|
+
...regels.map((r) => r["order_id"]),
|
|
164
|
+
...karrenRijen.map((k) => k["order_id"]),
|
|
165
|
+
]);
|
|
166
|
+
if (orderIds.length) {
|
|
167
|
+
orders = arr(await veilig(() => db.from("orders").select("*").in("id", orderIds)));
|
|
168
|
+
}
|
|
84
169
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
.from("order_carts")
|
|
91
|
-
.select("*")
|
|
92
|
-
.eq("order_id", order["id"])
|
|
93
|
-
.order("cart_number", { ascending: true })),
|
|
94
|
-
]);
|
|
95
|
-
const regels = arr(regelsRuw);
|
|
96
|
-
const karrenRijen = arr(karrenRuw);
|
|
170
|
+
karrenRijen.sort((a, b) => num(a["cart_number"]) - num(b["cart_number"]));
|
|
171
|
+
const eigenRegelIds = new Set(regels.map((r) => String(r["id"])));
|
|
172
|
+
const eigenOrderIds = new Set(orders.map((o) => String(o["id"])));
|
|
173
|
+
const regelPerId = new Map(regels.map((r) => [String(r["id"]), r]));
|
|
174
|
+
// --- karitems -------------------------------------------------------------
|
|
97
175
|
let karItems = [];
|
|
98
176
|
if (karrenRijen.length) {
|
|
99
|
-
|
|
177
|
+
const alleItems = arr(await veilig(() => db
|
|
100
178
|
.from("order_cart_items")
|
|
101
179
|
.select("*")
|
|
102
180
|
.in("cart_id", karrenRijen.map((k) => k["id"]))));
|
|
181
|
+
const karVanId = new Map(karrenRijen.map((k) => [String(k["id"]), k]));
|
|
182
|
+
karItems = alleItems.filter((i) => {
|
|
183
|
+
const regelId = i["order_item_id"] ? String(i["order_item_id"]) : "";
|
|
184
|
+
if (!beperkTotEigenRegels)
|
|
185
|
+
return true;
|
|
186
|
+
if (regelId)
|
|
187
|
+
return eigenRegelIds.has(regelId);
|
|
188
|
+
const kar = karVanId.get(String(i["cart_id"] ?? ""));
|
|
189
|
+
return eigenOrderIds.has(String(kar?.["order_id"] ?? ""));
|
|
190
|
+
});
|
|
191
|
+
// Markeer gedeelde karren: kar staat niet op één van onze orders, of er
|
|
192
|
+
// staan regels van meerdere orders op.
|
|
193
|
+
for (const kar of karrenRijen) {
|
|
194
|
+
const kid = String(kar["id"]);
|
|
195
|
+
const opKar = alleItems.filter((i) => String(i["cart_id"] ?? "") === kid);
|
|
196
|
+
const ordersOpKar = uniek(opKar.map((i) => regelPerId.get(String(i["order_item_id"] ?? ""))?.["order_id"]));
|
|
197
|
+
const vreemdeRegels = opKar.some((i) => i["order_item_id"] && !eigenRegelIds.has(String(i["order_item_id"])));
|
|
198
|
+
const anderseigenaar = kar["order_id"] != null && !eigenOrderIds.has(String(kar["order_id"]));
|
|
199
|
+
kar["__gedeeld"] = ordersOpKar.length > 1 || vreemdeRegels || anderseigenaar;
|
|
200
|
+
}
|
|
103
201
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
.filter((v) => typeof v === "string")));
|
|
202
|
+
// --- productgegevens ------------------------------------------------------
|
|
203
|
+
const productIds = uniek([...regels, ...karItems].map((r) => r["product_id"]));
|
|
107
204
|
const producten = new Map();
|
|
108
205
|
if (productIds.length) {
|
|
109
206
|
const data = await veilig(() => db
|
|
@@ -113,12 +210,6 @@ export async function laadOrderVanuitDatabase(db, payload) {
|
|
|
113
210
|
for (const p of arr(data))
|
|
114
211
|
producten.set(String(p["id"]), p);
|
|
115
212
|
}
|
|
116
|
-
const regelPerProduct = new Map();
|
|
117
|
-
for (const r of regels) {
|
|
118
|
-
const key = String(r["product_id"] ?? r["id"]);
|
|
119
|
-
if (!regelPerProduct.has(key))
|
|
120
|
-
regelPerProduct.set(key, r);
|
|
121
|
-
}
|
|
122
213
|
const maakProduct = (bron, aantalPlanten, fusten, perFust) => {
|
|
123
214
|
const p = producten.get(String(bron["product_id"] ?? "")) ?? {};
|
|
124
215
|
const extra = (p["custom_fields"] ?? {});
|
|
@@ -163,6 +254,7 @@ export async function laadOrderVanuitDatabase(db, payload) {
|
|
|
163
254
|
karnummer: num(kar["cart_number"]) || index + 1,
|
|
164
255
|
route: String(kar["carrier_type"] ?? ""),
|
|
165
256
|
gewicht: kar["weight_kg"] ? `${num(kar["weight_kg"]).toFixed(1)} kg` : "",
|
|
257
|
+
gedeeld: kar["__gedeeld"] === true,
|
|
166
258
|
opmerking: String(kar["notes"] ?? ""),
|
|
167
259
|
lagen: lagen.slice(0, Math.max(maxLagen, lagen.length)).map((laag, j) => ({
|
|
168
260
|
laagnummer: j + 1,
|
|
@@ -174,26 +266,50 @@ export async function laadOrderVanuitDatabase(db, payload) {
|
|
|
174
266
|
});
|
|
175
267
|
// --- losse orderregels (zonder karindeling) -------------------------------
|
|
176
268
|
const losseRegels = regels.map((r) => {
|
|
177
|
-
const fusten = num(r["plants_per_crate"]) > 0
|
|
269
|
+
const fusten = num(r["plants_per_crate"]) > 0
|
|
270
|
+
? Math.ceil(num(r["quantity"]) / num(r["plants_per_crate"]))
|
|
271
|
+
: 0;
|
|
178
272
|
return maakProduct(r, num(r["quantity"]), fusten, num(r["plants_per_crate"]));
|
|
179
273
|
});
|
|
274
|
+
return { ...maakKopsecties(orders, scope), karren, producten: losseRegels };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Kopsecties bij één of meerdere orders. Conservatief: bij meerdere orders
|
|
278
|
+
* tonen we de klant (als die gelijk is) en géén willekeurig ordernummer.
|
|
279
|
+
*/
|
|
280
|
+
function maakKopsecties(orders, scope) {
|
|
281
|
+
const nummers = uniek(orders.map((o) => o["order_number"]));
|
|
282
|
+
const klanten = uniek(orders.map((o) => o["customer_name"]));
|
|
283
|
+
const klantIds = uniek(orders.map((o) => o["customer_id"]));
|
|
284
|
+
const eerste = orders[0] ?? {};
|
|
285
|
+
const meer = orders.length > 1;
|
|
286
|
+
const lijst = (v) => (v.length > 4 ? `${v.slice(0, 4).join(", ")} +${v.length - 4}` : v.join(", "));
|
|
180
287
|
return {
|
|
181
288
|
order: {
|
|
182
|
-
nummer: String(
|
|
183
|
-
datum: String(
|
|
184
|
-
leverdatum: String(
|
|
185
|
-
referentie:
|
|
186
|
-
opmerking: String(
|
|
289
|
+
nummer: meer ? "" : String(eerste["order_number"] ?? ""),
|
|
290
|
+
datum: String(eerste["order_date"] ?? ""),
|
|
291
|
+
leverdatum: String(eerste["delivery_date"] ?? ""),
|
|
292
|
+
referentie: lijst(nummers),
|
|
293
|
+
opmerking: meer ? "" : String(eerste["notes"] ?? ""),
|
|
294
|
+
aantal_orders: orders.length,
|
|
295
|
+
ordernummers: nummers,
|
|
296
|
+
scope,
|
|
187
297
|
},
|
|
188
298
|
klant: {
|
|
189
|
-
naam:
|
|
190
|
-
nummer:
|
|
191
|
-
referentie:
|
|
299
|
+
naam: klanten.length === 1 ? klanten[0] : klanten.length ? `Meerdere klanten (${klanten.length})` : "",
|
|
300
|
+
nummer: klantIds.length === 1 ? klantIds[0] : "",
|
|
301
|
+
referentie: lijst(nummers),
|
|
192
302
|
},
|
|
193
|
-
karren,
|
|
194
|
-
producten: losseRegels,
|
|
195
303
|
};
|
|
196
304
|
}
|
|
305
|
+
/**
|
|
306
|
+
* Terugvalpad vanuit de printwachtrij: leidt de scope af uit de payload en
|
|
307
|
+
* laadt de gegevens. Blijft bestaan zodat aanroepers niets hoeven te weten.
|
|
308
|
+
*/
|
|
309
|
+
export async function laadOrderVanuitDatabase(db, payload) {
|
|
310
|
+
const { scope, id, ordernummer } = bepaalScope(payload);
|
|
311
|
+
return laadPakbonData(db, { scope, id, ordernummer });
|
|
312
|
+
}
|
|
197
313
|
/** Telt fusten per soort op binnen één laag. */
|
|
198
314
|
function vatFustenSamen(producten) {
|
|
199
315
|
const per = new Map();
|
|
@@ -107,6 +107,8 @@ export interface DemoKar {
|
|
|
107
107
|
route: string;
|
|
108
108
|
chauffeur: string;
|
|
109
109
|
gewicht: string;
|
|
110
|
+
/** Kar bevat ook regels van een andere order (buffer-/gedeelde kar). */
|
|
111
|
+
gedeeld?: boolean;
|
|
110
112
|
lagen: DemoLaag[];
|
|
111
113
|
}
|
|
112
114
|
export declare const DEMO_ORDER: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pakbonBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonBuilder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,kBAAkB,GAClB,eAAe,GACf,cAAc,GACd,cAAc,GACd,iBAAiB,GACjB,qBAAqB,GACrB,aAAa,GACb,aAAa,GACb,aAAa,GACb,QAAQ,GACR,OAAO,GACP,WAAW,GACX,QAAQ,GACR,SAAS,GACT,cAAc,GACd,WAAW,GACX,QAAQ,GACR,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,yEAAyE;AACzE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAClC;AAID,eAAO,MAAM,oBAAoB,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAehE,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,UAErC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAYpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAsB9D;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,gBAAgB;;;GAU5B,CAAC;AA6BF,eAAO,MAAM,eAAe,EAAE,SAAS,EAgatC,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAE3D;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAcjE;AAED,wBAAgB,qBAAqB,IAAI,YAAY,CAmBpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAY9D;AAcD,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAOjF;AAID,uEAAuE;AACvE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,KAAK,GAAG,QAAQ,GACxB,OAAO,CAET;AAKD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnG;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AA2BD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAkGhB,OAAO,EAAE;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC;AAE1C,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,EAAE,CAE7D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GA2BjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC5B;AAID,eAAO,MAAM,eAAe,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAS7D,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAuB1F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAIvF;AAID,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAOpE;AA4BD,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,QAAQ,EAAE,CAenF;AAED,gDAAgD;AAChD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,SAAS,EAAE,CAenF;AAED,kEAAkE;AAClE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,iBAAiB,EAAE,CA6DtE"}
|
|
1
|
+
{"version":3,"file":"pakbonBuilder.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -814,7 +814,7 @@ function laagVingerafdruk(l) {
|
|
|
814
814
|
}
|
|
815
815
|
function karVingerafdruk(k) {
|
|
816
816
|
// karnummer bewust niet meegenomen: alleen de indeling telt
|
|
817
|
-
return [k.route, k.chauffeur, k.gewicht, (k.lagen ?? []).map(laagVingerafdruk).join("~")].join("#");
|
|
817
|
+
return [k.route, k.chauffeur, k.gewicht, k.gedeeld ? "gedeeld" : "", (k.lagen ?? []).map(laagVingerafdruk).join("~")].join("#");
|
|
818
818
|
}
|
|
819
819
|
/** Groepeert identieke karren. Bij `aan = false` blijft elke kar los. */
|
|
820
820
|
export function groepeerIdentiekeKarren(karren, aan) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAmBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC;AAEpC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAmBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC;AAEpC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAQD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAgE3D;AA6oBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CA8BR;AAgBD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CA2DR;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAsCN;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -43,6 +43,7 @@ export function maakPakbonOrder(input) {
|
|
|
43
43
|
route: String(k["route"] ?? ""),
|
|
44
44
|
chauffeur: String(k["chauffeur"] ?? ""),
|
|
45
45
|
gewicht: String(k["gewicht"] ?? ""),
|
|
46
|
+
gedeeld: k["gedeeld"] === true,
|
|
46
47
|
lagen: arr(k["lagen"]).map((l, j) => ({
|
|
47
48
|
laagnummer: Number(l["laagnummer"] ?? j + 1),
|
|
48
49
|
belading: String(l["belading"] ?? ""),
|
|
@@ -320,6 +321,8 @@ function karKop(s, kar, velden, bundelTekst = "") {
|
|
|
320
321
|
info.push(kar.chauffeur);
|
|
321
322
|
if (velden.includes("route") && kar.route)
|
|
322
323
|
info.push(kar.route);
|
|
324
|
+
if (kar.gedeeld)
|
|
325
|
+
info.push("gedeelde kar");
|
|
323
326
|
const toonNummer = velden.includes("karnummer");
|
|
324
327
|
if (!toonNummer && !info.length && !bundelTekst)
|
|
325
328
|
return "";
|
|
@@ -640,56 +643,56 @@ export function renderPakbonDocument(config, order, opties = {}) {
|
|
|
640
643
|
const font = opties.lettertype ?? 'Arial, Helvetica, "Segoe UI", sans-serif';
|
|
641
644
|
const grootte = opties.lettergrootte ?? 8.5;
|
|
642
645
|
const body = renderPakbonBody(config, order, opties);
|
|
643
|
-
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
644
|
-
<title>${esc(opties.titel ?? "Pakbon")}</title>
|
|
645
|
-
<style>
|
|
646
|
-
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
647
|
-
* { box-sizing: border-box; }
|
|
648
|
-
html, body { margin: 0; padding: 0; }
|
|
649
|
-
body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
|
|
650
|
-
.blok { margin-bottom: 2mm; }
|
|
651
|
-
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
652
|
-
.vet { font-weight: 600; }
|
|
653
|
-
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
654
|
-
.kv .k { color: #6b7280; }
|
|
655
|
-
.kv .v { font-weight: 500; }
|
|
656
|
-
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
|
|
657
|
-
.kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
658
|
-
table.regels { width: 100%; border-collapse: collapse; }
|
|
659
|
-
table.regels.vast { table-layout: fixed; }
|
|
660
|
-
table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
|
|
661
|
-
table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
|
|
662
|
-
table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
|
|
663
|
-
.rand { border: 0.2mm solid #d1d5db; }
|
|
664
|
-
.onder { border-bottom: 0.2mm solid #d1d5db; }
|
|
665
|
-
table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
|
|
666
|
-
tr.zebra td { background: #f3f4f6; }
|
|
667
|
-
.plijst { margin: 0; padding-left: 4mm; }
|
|
668
|
-
.groep { margin-bottom: 1.5mm; }
|
|
669
|
-
.regelrij { display: flex; gap: 2mm; }
|
|
670
|
-
.tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
|
|
671
|
-
.karblok { margin-bottom: 2mm; }
|
|
672
|
-
.karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
673
|
-
.karkop { display: flex; justify-content: space-between; align-items: center; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; }
|
|
674
|
-
.bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
|
|
675
|
-
.laag { margin-bottom: 1.5mm; }
|
|
676
|
-
.laagkop { display: flex; justify-content: space-between; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; }
|
|
677
|
-
.laagkop.compact { border-bottom: none; }
|
|
678
|
-
.meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
|
|
679
|
-
.totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
|
|
680
|
-
.paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; }
|
|
681
|
-
.handtekening { margin-top: 3mm; }
|
|
682
|
-
.lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
|
|
683
|
-
.lijnveld.hoog { padding-bottom: 10mm; }
|
|
684
|
-
.lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
|
|
685
|
-
.balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
|
|
686
|
-
.qr { border: 0.25mm dashed #9ca3af; }
|
|
687
|
-
.streepjes { width: 45mm; background: repeating-linear-gradient(to right, #111827 0 2px, transparent 2px 5px); }
|
|
688
|
-
.klein { font-size: 85%; color: #6b7280; }
|
|
689
|
-
.breekvoor { break-before: page; page-break-before: always; }
|
|
690
|
-
.heelhouden { break-inside: avoid; page-break-inside: avoid; }
|
|
691
|
-
img { max-width: 100%; }
|
|
692
|
-
</style></head>
|
|
646
|
+
return `<!doctype html><html lang="nl"><head><meta charset="utf-8" />
|
|
647
|
+
<title>${esc(opties.titel ?? "Pakbon")}</title>
|
|
648
|
+
<style>
|
|
649
|
+
@page { size: ${b}mm ${h}mm; margin: ${marge}mm; }
|
|
650
|
+
* { box-sizing: border-box; }
|
|
651
|
+
html, body { margin: 0; padding: 0; }
|
|
652
|
+
body { font-family: ${font}; font-size: ${grootte}pt; color: #111827; line-height: 1.35; }
|
|
653
|
+
.blok { margin-bottom: 2mm; }
|
|
654
|
+
.sectitel { font-size: 90%; font-weight: 600; text-transform: uppercase; color: #6b7280; margin-bottom: 0.6mm; }
|
|
655
|
+
.vet { font-weight: 600; }
|
|
656
|
+
.kv { display: flex; justify-content: space-between; gap: 3mm; }
|
|
657
|
+
.kv .k { color: #6b7280; }
|
|
658
|
+
.kv .v { font-weight: 500; }
|
|
659
|
+
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 6mm; }
|
|
660
|
+
.kader { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
661
|
+
table.regels { width: 100%; border-collapse: collapse; }
|
|
662
|
+
table.regels.vast { table-layout: fixed; }
|
|
663
|
+
table.regels.vast td, table.regels.vast th { overflow-wrap: anywhere; }
|
|
664
|
+
table.regels th, table.regels td { padding: 0.7mm 1mm; vertical-align: top; }
|
|
665
|
+
table.regels th { font-size: 90%; text-transform: uppercase; color: #6b7280; font-weight: 600; text-align: left; }
|
|
666
|
+
.rand { border: 0.2mm solid #d1d5db; }
|
|
667
|
+
.onder { border-bottom: 0.2mm solid #d1d5db; }
|
|
668
|
+
table.regels.compact th, table.regels.compact td { padding: 0.3mm 0.8mm; }
|
|
669
|
+
tr.zebra td { background: #f3f4f6; }
|
|
670
|
+
.plijst { margin: 0; padding-left: 4mm; }
|
|
671
|
+
.groep { margin-bottom: 1.5mm; }
|
|
672
|
+
.regelrij { display: flex; gap: 2mm; }
|
|
673
|
+
.tweekolom { display: grid; grid-template-columns: 1fr 1fr; gap: 3mm; }
|
|
674
|
+
.karblok { margin-bottom: 2mm; }
|
|
675
|
+
.karblok.omkaderd { border: 0.25mm solid #d1d5db; border-radius: 1mm; padding: 1.5mm; }
|
|
676
|
+
.karkop { display: flex; justify-content: space-between; align-items: center; padding: 0.8mm 1.5mm; border-radius: 1mm; margin-bottom: 1mm; }
|
|
677
|
+
.bundel { display: inline-block; border: 0.3mm dashed #6b7280; border-radius: 1mm; padding: 0.4mm 1.5mm; margin-bottom: 1mm; font-weight: 700; text-transform: uppercase; letter-spacing: 0.2mm; font-size: 90%; }
|
|
678
|
+
.laag { margin-bottom: 1.5mm; }
|
|
679
|
+
.laagkop { display: flex; justify-content: space-between; font-weight: 500; border-bottom: 0.2mm solid #d1d5db; padding-bottom: 0.4mm; margin-bottom: 0.6mm; }
|
|
680
|
+
.laagkop.compact { border-bottom: none; }
|
|
681
|
+
.meta { display: flex; gap: 3mm; font-size: 88%; font-weight: 400; color: #4b5563; }
|
|
682
|
+
.totalen { display: flex; flex-wrap: wrap; gap: 5mm; border-top: 0.25mm solid #d1d5db; padding-top: 1.2mm; font-weight: 500; }
|
|
683
|
+
.paginavoet { position: fixed; bottom: 0; left: 0; right: 0; background: #fff; }
|
|
684
|
+
.handtekening { margin-top: 3mm; }
|
|
685
|
+
.lijnveld { margin-top: 4mm; border-bottom: 0.25mm solid #6b7280; padding-bottom: 3mm; }
|
|
686
|
+
.lijnveld.hoog { padding-bottom: 10mm; }
|
|
687
|
+
.lijn { border-top: 0.25mm solid #d1d5db; margin: 1.5mm 0; }
|
|
688
|
+
.balk { height: 1mm; background: #374151; margin: 1.5mm 0; }
|
|
689
|
+
.qr { border: 0.25mm dashed #9ca3af; }
|
|
690
|
+
.streepjes { width: 45mm; background: repeating-linear-gradient(to right, #111827 0 2px, transparent 2px 5px); }
|
|
691
|
+
.klein { font-size: 85%; color: #6b7280; }
|
|
692
|
+
.breekvoor { break-before: page; page-break-before: always; }
|
|
693
|
+
.heelhouden { break-inside: avoid; page-break-inside: avoid; }
|
|
694
|
+
img { max-width: 100%; }
|
|
695
|
+
</style></head>
|
|
693
696
|
<body>${body}</body></html>`;
|
|
694
697
|
}
|
|
695
698
|
/** Handig voor testen: het document met de voorbeeldgegevens. */
|