@flowselections/layout-maker 1.3.2 → 1.6.5
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 +24 -24
- package/dist-lib/components/AfdrukKnop.d.ts +3 -1
- package/dist-lib/components/AfdrukKnop.d.ts.map +1 -1
- package/dist-lib/components/AfdrukKnop.js +24 -3
- package/dist-lib/components/ComputersLijst.d.ts +23 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -0
- package/dist-lib/components/ComputersLijst.js +75 -0
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +2 -0
- package/dist-lib/components/LogosPage.d.ts.map +1 -1
- package/dist-lib/components/LogosPage.js +2 -0
- package/dist-lib/components/NetwerkPrintersDialog.d.ts +8 -0
- package/dist-lib/components/NetwerkPrintersDialog.d.ts.map +1 -0
- package/dist-lib/components/NetwerkPrintersDialog.js +79 -0
- package/dist-lib/components/PrintProgrammaUitleg.d.ts +5 -0
- package/dist-lib/components/PrintProgrammaUitleg.d.ts.map +1 -0
- package/dist-lib/components/PrintProgrammaUitleg.js +19 -0
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +37 -3
- package/dist-lib/components/PrinterKaart.d.ts +17 -0
- package/dist-lib/components/PrinterKaart.d.ts.map +1 -0
- package/dist-lib/components/PrinterKaart.js +14 -0
- package/dist-lib/components/PrinterSetupWizard.d.ts +11 -1
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +134 -64
- package/dist-lib/components/PrinterStatsKaarten.d.ts +11 -0
- package/dist-lib/components/PrinterStatsKaarten.d.ts.map +1 -0
- package/dist-lib/components/PrinterStatsKaarten.js +8 -0
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +120 -49
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts +2 -0
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -0
- package/dist-lib/components/WerkplekConfiguratiePage.js +101 -0
- package/dist-lib/components/WerkplekkenTabel.d.ts +14 -0
- package/dist-lib/components/WerkplekkenTabel.d.ts.map +1 -0
- package/dist-lib/components/WerkplekkenTabel.js +16 -0
- package/dist-lib/index.d.ts +18 -7
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +18 -7
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +925 -34
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +925 -34
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +920 -29
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.js +12 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +925 -34
- 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.d.ts +1 -0
- package/dist-lib/lib/browserPrint.d.ts.map +1 -1
- package/dist-lib/lib/browserPrint.js +6 -6
- package/dist-lib/lib/centralAuth.server.d.ts +13 -0
- package/dist-lib/lib/centralAuth.server.d.ts.map +1 -0
- package/dist-lib/lib/centralAuth.server.js +60 -0
- package/dist-lib/lib/directPrint.d.ts +26 -0
- package/dist-lib/lib/directPrint.d.ts.map +1 -0
- package/dist-lib/lib/directPrint.js +65 -0
- package/dist-lib/lib/documentPdf.d.ts +11 -0
- package/dist-lib/lib/documentPdf.d.ts.map +1 -0
- package/dist-lib/lib/documentPdf.js +62 -0
- package/dist-lib/lib/htmlNaarPdf.server.d.ts +14 -0
- package/dist-lib/lib/htmlNaarPdf.server.d.ts.map +1 -0
- package/dist-lib/lib/htmlNaarPdf.server.js +34 -0
- package/dist-lib/lib/htmlPdf.server.d.ts +29 -0
- package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -0
- package/dist-lib/lib/htmlPdf.server.js +1009 -0
- package/dist-lib/lib/layoutPreview.d.ts +1 -1
- package/dist-lib/lib/layoutPreview.d.ts.map +1 -1
- package/dist-lib/lib/layoutPreview.js +9 -9
- package/dist-lib/lib/logoLibrary.d.ts +1 -1
- package/dist-lib/lib/logoLibrary.js +5 -3
- package/dist-lib/lib/orderData.server.d.ts +15 -0
- package/dist-lib/lib/orderData.server.d.ts.map +1 -0
- package/dist-lib/lib/orderData.server.js +194 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +22 -2
- package/dist-lib/lib/pakbonHtml.js +50 -50
- package/dist-lib/lib/printQueue.server.d.ts +31 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -0
- package/dist-lib/lib/printQueue.server.js +435 -0
- package/dist-lib/lib/printService.functions.d.ts +103742 -0
- package/dist-lib/lib/printService.functions.d.ts.map +1 -0
- package/dist-lib/lib/printService.functions.js +94 -0
- package/dist-lib/lib/printService.server.d.ts +31 -0
- package/dist-lib/lib/printService.server.d.ts.map +1 -0
- package/dist-lib/lib/printService.server.js +110 -0
- package/dist-lib/lib/productiebonHtml.d.ts +18 -0
- package/dist-lib/lib/productiebonHtml.d.ts.map +1 -0
- package/dist-lib/lib/productiebonHtml.js +166 -0
- package/dist-lib/lib/profielHtml.d.ts +14 -0
- package/dist-lib/lib/profielHtml.d.ts.map +1 -0
- package/dist-lib/lib/profielHtml.js +256 -0
- package/dist-lib/lib/runnerRegistry.server.d.ts +10 -0
- package/dist-lib/lib/runnerRegistry.server.d.ts.map +1 -0
- package/dist-lib/lib/runnerRegistry.server.js +79 -0
- package/dist-lib/lib/supabaseAdmin.server.d.ts +6 -0
- package/dist-lib/lib/supabaseAdmin.server.d.ts.map +1 -0
- package/dist-lib/lib/supabaseAdmin.server.js +43 -0
- package/dist-lib/lib/testpagina.d.ts +2 -0
- package/dist-lib/lib/testpagina.d.ts.map +1 -0
- package/dist-lib/lib/testpagina.js +31 -0
- package/dist-lib/lib/useAutoRefresh.d.ts +8 -0
- package/dist-lib/lib/useAutoRefresh.d.ts.map +1 -0
- package/dist-lib/lib/useAutoRefresh.js +44 -0
- package/dist-lib/lib/useDocumentData.d.ts +4 -3
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +10 -7
- package/dist-lib/lib/useNetwerkPrinters.d.ts +12 -0
- package/dist-lib/lib/useNetwerkPrinters.d.ts.map +1 -0
- package/dist-lib/lib/useNetwerkPrinters.js +26 -0
- package/package.json +125 -117
|
@@ -14,5 +14,5 @@ export declare const VOORBEELD_REGELS: {
|
|
|
14
14
|
belading: string;
|
|
15
15
|
korting_pct: string;
|
|
16
16
|
}[];
|
|
17
|
-
export declare function bouwDocumentHtml(layout: LayoutModel, elementen: LayoutElementModel[]): string;
|
|
17
|
+
export declare function bouwDocumentHtml(layout: LayoutModel, elementen: LayoutElementModel[], gegevens?: Record<string, string>): string;
|
|
18
18
|
//# sourceMappingURL=layoutPreview.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutPreview.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPreview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEvE,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIzD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE5E;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAuB5F;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;GAI5B,CAAC;AA0FF,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"layoutPreview.d.ts","sourceRoot":"","sources":["../../src/lib/layoutPreview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEvE,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIzD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE5E;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAuB5F;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;GAI5B,CAAC;AA0FF,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,kBAAkB,EAAE,EAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAaR"}
|
|
@@ -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>`;
|
|
@@ -119,16 +119,16 @@ function elementHtml(el, ctx) {
|
|
|
119
119
|
return `<div style="${base}">${esc(inhoud)}</div>`;
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
export function bouwDocumentHtml(layout, elementen) {
|
|
123
|
-
const ctx = voorbeeldContext();
|
|
122
|
+
export function bouwDocumentHtml(layout, elementen, gegevens) {
|
|
123
|
+
const ctx = { ...voorbeeldContext(), ...(gegevens ?? {}) };
|
|
124
124
|
const zichtbaar = elementen.filter((e) => !e.verborgen && conditieVoldoet(e, ctx));
|
|
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
|
}
|
|
@@ -50,7 +50,7 @@ export declare function haalLogos(): Promise<LogoModel[]>;
|
|
|
50
50
|
export declare function useLogos(): {
|
|
51
51
|
logos: LogoModel[];
|
|
52
52
|
loading: boolean;
|
|
53
|
-
reload: () => Promise<void>;
|
|
53
|
+
reload: (stil?: boolean) => Promise<void>;
|
|
54
54
|
};
|
|
55
55
|
export interface UploadInput {
|
|
56
56
|
file: File;
|
|
@@ -102,13 +102,15 @@ export async function haalLogos() {
|
|
|
102
102
|
export function useLogos() {
|
|
103
103
|
const [logos, setLogos] = useState([]);
|
|
104
104
|
const [loading, setLoading] = useState(true);
|
|
105
|
-
const load = useCallback(async () => {
|
|
106
|
-
|
|
105
|
+
const load = useCallback(async (stil = false) => {
|
|
106
|
+
if (!stil)
|
|
107
|
+
setLoading(true);
|
|
107
108
|
try {
|
|
108
109
|
setLogos(await haalLogos());
|
|
109
110
|
}
|
|
110
111
|
catch {
|
|
111
|
-
|
|
112
|
+
if (!stil)
|
|
113
|
+
setLogos([]);
|
|
112
114
|
}
|
|
113
115
|
setLoading(false);
|
|
114
116
|
}, []);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type Rij = Record<string, any>;
|
|
2
|
+
/** Bevat de meegestuurde payload zelf al orderregels of karren? */
|
|
3
|
+
export declare function heeftOrderInhoud(bron: unknown): boolean;
|
|
4
|
+
/** Zoekt het order-id in de (geneste) payload van een printopdracht. */
|
|
5
|
+
export declare function zoekOrderVerwijzing(payload: unknown): {
|
|
6
|
+
orderId: string | null;
|
|
7
|
+
ordernummer: string | null;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Bouwt de ruwe ordergegevens (vorm die `maakPakbonOrder` verwacht) op basis
|
|
11
|
+
* van het order-id of ordernummer. Geeft `null` als de order niet te vinden is.
|
|
12
|
+
*/
|
|
13
|
+
export declare function laadOrderVanuitDatabase(payload: unknown): Promise<Rij | null>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=orderData.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAYA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAK/B,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAyBA;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAsJnF"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/orderData.server.ts — ordergegevens ophalen uit de gedeelde database.
|
|
3
|
+
// ----------------------------------------------------------------------------
|
|
4
|
+
// Modules sturen bij een printopdracht vaak alleen verwijzingen mee (orderId of
|
|
5
|
+
// ordernummer). Zonder inhoud zou de pakbon blanco worden. Dit bestand bouwt op
|
|
6
|
+
// basis van die verwijzing een volledig pakbon-model uit `orders`,
|
|
7
|
+
// `order_items`, `order_carts` en `order_cart_items`.
|
|
8
|
+
// Draait alleen op de server (printwachtrij).
|
|
9
|
+
// ============================================================================
|
|
10
|
+
import { adminDb as supabaseAdmin } from "./supabaseAdmin.server";
|
|
11
|
+
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
12
|
+
const num = (v) => (Number.isFinite(Number(v)) ? Number(v) : 0);
|
|
13
|
+
/** Bevat de meegestuurde payload zelf al orderregels of karren? */
|
|
14
|
+
export function heeftOrderInhoud(bron) {
|
|
15
|
+
const b = (bron && typeof bron === "object" ? bron : {});
|
|
16
|
+
const karren = arr(b["karren"]);
|
|
17
|
+
if (karren.some((k) => arr(k["lagen"]).length))
|
|
18
|
+
return true;
|
|
19
|
+
return arr(b["producten"]).length > 0 || arr(b["regels"]).length > 0;
|
|
20
|
+
}
|
|
21
|
+
/** Zoekt het order-id in de (geneste) payload van een printopdracht. */
|
|
22
|
+
export function zoekOrderVerwijzing(payload) {
|
|
23
|
+
const kandidaten = [];
|
|
24
|
+
const verzamel = (v, diepte) => {
|
|
25
|
+
if (!v || typeof v !== "object" || diepte > 3)
|
|
26
|
+
return;
|
|
27
|
+
kandidaten.push(v);
|
|
28
|
+
for (const w of Object.values(v)) {
|
|
29
|
+
if (w && typeof w === "object" && !Array.isArray(w))
|
|
30
|
+
verzamel(w, diepte + 1);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
verzamel(payload, 0);
|
|
34
|
+
let orderId = null;
|
|
35
|
+
let ordernummer = null;
|
|
36
|
+
for (const k of kandidaten) {
|
|
37
|
+
orderId ?? (orderId = (k["orderId"] ?? k["order_id"] ?? null));
|
|
38
|
+
ordernummer ?? (ordernummer = (k["order_number"] ??
|
|
39
|
+
k["orderNumber"] ??
|
|
40
|
+
k["ordernummer"] ??
|
|
41
|
+
k["reference"] ??
|
|
42
|
+
null));
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
orderId: typeof orderId === "string" && orderId.length > 8 ? orderId : null,
|
|
46
|
+
ordernummer: typeof ordernummer === "string" && ordernummer.trim() ? ordernummer.trim() : null,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Bouwt de ruwe ordergegevens (vorm die `maakPakbonOrder` verwacht) op basis
|
|
51
|
+
* van het order-id of ordernummer. Geeft `null` als de order niet te vinden is.
|
|
52
|
+
*/
|
|
53
|
+
export async function laadOrderVanuitDatabase(payload) {
|
|
54
|
+
const { orderId, ordernummer } = zoekOrderVerwijzing(payload);
|
|
55
|
+
if (!orderId && !ordernummer)
|
|
56
|
+
return null;
|
|
57
|
+
let order = null;
|
|
58
|
+
if (orderId) {
|
|
59
|
+
const { data } = await supabaseAdmin.from("orders").select("*").eq("id", orderId).maybeSingle();
|
|
60
|
+
order = data ?? null;
|
|
61
|
+
}
|
|
62
|
+
if (!order && ordernummer) {
|
|
63
|
+
const { data } = await supabaseAdmin
|
|
64
|
+
.from("orders")
|
|
65
|
+
.select("*")
|
|
66
|
+
.eq("order_number", ordernummer)
|
|
67
|
+
.is("deleted_at", null)
|
|
68
|
+
.limit(1);
|
|
69
|
+
order = arr(data)[0] ?? null;
|
|
70
|
+
}
|
|
71
|
+
if (!order)
|
|
72
|
+
return null;
|
|
73
|
+
const [{ data: regelsRuw }, { data: karrenRuw }] = await Promise.all([
|
|
74
|
+
supabaseAdmin.from("order_items").select("*").eq("order_id", order["id"]),
|
|
75
|
+
supabaseAdmin
|
|
76
|
+
.from("order_carts")
|
|
77
|
+
.select("*")
|
|
78
|
+
.eq("order_id", order["id"])
|
|
79
|
+
.order("cart_number", { ascending: true }),
|
|
80
|
+
]);
|
|
81
|
+
const regels = arr(regelsRuw);
|
|
82
|
+
const karrenRijen = arr(karrenRuw);
|
|
83
|
+
let karItems = [];
|
|
84
|
+
if (karrenRijen.length) {
|
|
85
|
+
const { data } = await supabaseAdmin
|
|
86
|
+
.from("order_cart_items")
|
|
87
|
+
.select("*")
|
|
88
|
+
.in("cart_id", karrenRijen.map((k) => k["id"]));
|
|
89
|
+
karItems = arr(data);
|
|
90
|
+
}
|
|
91
|
+
const productIds = Array.from(new Set([...regels, ...karItems]
|
|
92
|
+
.map((r) => r["product_id"])
|
|
93
|
+
.filter((v) => typeof v === "string")));
|
|
94
|
+
const producten = new Map();
|
|
95
|
+
if (productIds.length) {
|
|
96
|
+
const { data } = await supabaseAdmin
|
|
97
|
+
.from("products")
|
|
98
|
+
.select("id, product, article_number, barcode, location, unit, weight, custom_fields")
|
|
99
|
+
.in("id", productIds);
|
|
100
|
+
for (const p of arr(data))
|
|
101
|
+
producten.set(String(p["id"]), p);
|
|
102
|
+
}
|
|
103
|
+
const regelPerProduct = new Map();
|
|
104
|
+
for (const r of regels) {
|
|
105
|
+
const key = String(r["product_id"] ?? r["id"]);
|
|
106
|
+
if (!regelPerProduct.has(key))
|
|
107
|
+
regelPerProduct.set(key, r);
|
|
108
|
+
}
|
|
109
|
+
const maakProduct = (bron, aantalPlanten, fusten, perFust) => {
|
|
110
|
+
const p = producten.get(String(bron["product_id"] ?? "")) ?? {};
|
|
111
|
+
const extra = (p["custom_fields"] ?? {});
|
|
112
|
+
return {
|
|
113
|
+
artikelnummer: String(p["article_number"] ?? ""),
|
|
114
|
+
artikelnaam: String(bron["product_name"] ?? p["product"] ?? ""),
|
|
115
|
+
potmaat: String(extra["potmaat"] ?? extra["Potmaat"] ?? ""),
|
|
116
|
+
aantal: aantalPlanten,
|
|
117
|
+
barcode: String(p["barcode"] ?? ""),
|
|
118
|
+
locatie: String(p["location"] ?? ""),
|
|
119
|
+
gewicht: bron["weight_kg"] ? `${num(bron["weight_kg"]).toFixed(1)} kg` : "",
|
|
120
|
+
fust_aantal: fusten,
|
|
121
|
+
fustsoort: String(extra["fustsoort"] ?? p["unit"] ?? ""),
|
|
122
|
+
planten_per_fust: perFust,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
// --- karren met lagen -----------------------------------------------------
|
|
126
|
+
const karren = karrenRijen.map((kar, index) => {
|
|
127
|
+
const items = karItems.filter((i) => i["cart_id"] === kar["id"]);
|
|
128
|
+
const maxLagen = Math.max(1, num(kar["max_layers"]) || 0) || 1;
|
|
129
|
+
const lagen = [];
|
|
130
|
+
let huidige = null;
|
|
131
|
+
for (const item of items) {
|
|
132
|
+
const fusten = num(item["crates"]);
|
|
133
|
+
const perFust = num(item["plants_per_crate"]);
|
|
134
|
+
const perLaag = num(item["crates_per_layer"]);
|
|
135
|
+
const deel = num(item["layer_fraction"]) ||
|
|
136
|
+
(perLaag > 0 ? fusten / perLaag : 0) ||
|
|
137
|
+
(num(item["layer_share_pct"]) ? num(item["layer_share_pct"]) / 100 : 0) ||
|
|
138
|
+
1;
|
|
139
|
+
const product = maakProduct(item, fusten * perFust || num(item["boxes"]), fusten, perFust);
|
|
140
|
+
if (!huidige || huidige.ruimte + deel > 1.0001) {
|
|
141
|
+
huidige = { producten: [], ruimte: 0 };
|
|
142
|
+
lagen.push(huidige);
|
|
143
|
+
}
|
|
144
|
+
huidige.producten.push(product);
|
|
145
|
+
huidige.ruimte += deel;
|
|
146
|
+
}
|
|
147
|
+
if (!lagen.length)
|
|
148
|
+
lagen.push({ producten: [], ruimte: 0 });
|
|
149
|
+
return {
|
|
150
|
+
karnummer: num(kar["cart_number"]) || index + 1,
|
|
151
|
+
route: String(kar["carrier_type"] ?? ""),
|
|
152
|
+
gewicht: kar["weight_kg"] ? `${num(kar["weight_kg"]).toFixed(1)} kg` : "",
|
|
153
|
+
opmerking: String(kar["notes"] ?? ""),
|
|
154
|
+
lagen: lagen.slice(0, Math.max(maxLagen, lagen.length)).map((laag, j) => ({
|
|
155
|
+
laagnummer: j + 1,
|
|
156
|
+
belading: `${Math.round(Math.min(laag.ruimte, 1) * 100)}%`,
|
|
157
|
+
producten: laag.producten,
|
|
158
|
+
fusten: vatFustenSamen(laag.producten),
|
|
159
|
+
})),
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
// --- losse orderregels (zonder karindeling) -------------------------------
|
|
163
|
+
const losseRegels = regels.map((r) => {
|
|
164
|
+
const fusten = num(r["plants_per_crate"]) > 0 ? Math.ceil(num(r["quantity"]) / num(r["plants_per_crate"])) : 0;
|
|
165
|
+
return maakProduct(r, num(r["quantity"]), fusten, num(r["plants_per_crate"]));
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
order: {
|
|
169
|
+
nummer: String(order["order_number"] ?? ""),
|
|
170
|
+
datum: String(order["order_date"] ?? ""),
|
|
171
|
+
leverdatum: String(order["delivery_date"] ?? ""),
|
|
172
|
+
referentie: String(order["order_number"] ?? ""),
|
|
173
|
+
opmerking: String(order["notes"] ?? ""),
|
|
174
|
+
},
|
|
175
|
+
klant: {
|
|
176
|
+
naam: String(order["customer_name"] ?? ""),
|
|
177
|
+
nummer: String(order["customer_id"] ?? ""),
|
|
178
|
+
referentie: String(order["order_number"] ?? ""),
|
|
179
|
+
},
|
|
180
|
+
karren,
|
|
181
|
+
producten: losseRegels,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/** Telt fusten per soort op binnen één laag. */
|
|
185
|
+
function vatFustenSamen(producten) {
|
|
186
|
+
const per = new Map();
|
|
187
|
+
for (const p of producten) {
|
|
188
|
+
const soort = String(p["fustsoort"] ?? "").trim() || "fust";
|
|
189
|
+
per.set(soort, (per.get(soort) ?? 0) + num(p["fust_aantal"]));
|
|
190
|
+
}
|
|
191
|
+
return Array.from(per.entries())
|
|
192
|
+
.filter(([, aantal]) => aantal > 0)
|
|
193
|
+
.map(([fusttype, aantal]) => ({ fusttype, aantal }));
|
|
194
|
+
}
|
|
@@ -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,
|
|
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"}
|
|
@@ -713,7 +713,13 @@ export function alleProducten(order) {
|
|
|
713
713
|
export function totalen(order) {
|
|
714
714
|
const producten = alleProducten(order);
|
|
715
715
|
const lagen = order.karren.reduce((n, k) => n + k.lagen.length, 0);
|
|
716
|
-
|
|
716
|
+
// Ontbreekt de fustlijst per laag, dan tellen we de fusten van de producten.
|
|
717
|
+
const fusten = order.karren.reduce((n, k) => n +
|
|
718
|
+
k.lagen.reduce((m, l) => {
|
|
719
|
+
const uitLijst = (l.fusten ?? []).reduce((x, f) => x + Number(f.aantal ?? 0), 0);
|
|
720
|
+
const uitProducten = (l.producten ?? []).reduce((x, p2) => x + Number(p2.fust_aantal ?? 0), 0);
|
|
721
|
+
return m + (uitLijst || uitProducten);
|
|
722
|
+
}, 0), 0);
|
|
717
723
|
const stuks = producten.reduce((n, p2) => n + p2.aantal, 0);
|
|
718
724
|
const gewicht = producten.reduce((n, p2) => n + parseFloat(p2.gewicht), 0);
|
|
719
725
|
return {
|
|
@@ -867,8 +873,22 @@ export function fustVerzamellijst(karren) {
|
|
|
867
873
|
const map = new Map();
|
|
868
874
|
for (const kar of lijst) {
|
|
869
875
|
for (const laag of Array.isArray(kar?.lagen) ? kar.lagen : []) {
|
|
870
|
-
const fusten = Array.isArray(laag?.fusten) ? laag.fusten : [];
|
|
871
876
|
const producten = Array.isArray(laag?.producten) ? laag.producten : [];
|
|
877
|
+
// Zonder aparte fustlijst: fusten afleiden uit de producten, zodat een
|
|
878
|
+
// module die alleen orderregels aanlevert toch een verzamellijst krijgt.
|
|
879
|
+
const opgegeven = Array.isArray(laag?.fusten) ? laag.fusten : [];
|
|
880
|
+
const afgeleid = new Map();
|
|
881
|
+
if (!opgegeven.length) {
|
|
882
|
+
for (const pr of producten) {
|
|
883
|
+
const soort = String(pr?.fustsoort ?? "").trim() || "Onbekend";
|
|
884
|
+
const aantal = Number(pr?.fust_aantal ?? 0) || 0;
|
|
885
|
+
if (aantal > 0)
|
|
886
|
+
afgeleid.set(soort, (afgeleid.get(soort) ?? 0) + aantal);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
const fusten = opgegeven.length
|
|
890
|
+
? opgegeven
|
|
891
|
+
: Array.from(afgeleid.entries()).map(([fusttype, aantal]) => ({ fusttype, aantal }));
|
|
872
892
|
for (const f of fusten) {
|
|
873
893
|
const type = String(f?.fusttype ?? f?.fustsoort ?? "Onbekend");
|
|
874
894
|
let groep = map.get(type);
|
|
@@ -640,56 +640,56 @@ export function renderPakbonDocument(config, order, opties = {}) {
|
|
|
640
640
|
const font = opties.lettertype ?? 'Arial, Helvetica, "Segoe UI", sans-serif';
|
|
641
641
|
const grootte = opties.lettergrootte ?? 8.5;
|
|
642
642
|
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>
|
|
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>
|
|
693
693
|
<body>${body}</body></html>`;
|
|
694
694
|
}
|
|
695
695
|
/** Handig voor testen: het document met de voorbeeldgegevens. */
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
type Job = Record<string, any>;
|
|
2
|
+
type LayoutKeuze = {
|
|
3
|
+
layout: Job | null;
|
|
4
|
+
expliciet: boolean;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Haalt een kant-en-klare PDF van de opdracht op (klantstickers, standaard
|
|
8
|
+
* Floriday-documenten). Die gaat ongewijzigd naar de printer.
|
|
9
|
+
*/
|
|
10
|
+
export declare function kantEnKlarePdf(job: Job): Promise<string | null>;
|
|
11
|
+
/**
|
|
12
|
+
* Bouwt de HTML van de opdracht.
|
|
13
|
+
* Volgorde: gekoppelde layout wint > meegestuurde HTML > actieve layout van
|
|
14
|
+
* het documenttype. Zo werkt een bijgewerkte layout meteen door.
|
|
15
|
+
*/
|
|
16
|
+
export declare function bouwHtml(job: Job, keuze: LayoutKeuze): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Controleert of het document echt iets afdrukt. Zonder deze controle kan een
|
|
19
|
+
* lege layout of een opdracht zonder gegevens een blanco vel opleveren.
|
|
20
|
+
*/
|
|
21
|
+
export declare function heeftZichtbareInhoud(html: string): boolean;
|
|
22
|
+
export interface WachtrijResultaat {
|
|
23
|
+
opgepakt: number;
|
|
24
|
+
verstuurd: number;
|
|
25
|
+
mislukt: number;
|
|
26
|
+
bijgewerkt: number;
|
|
27
|
+
}
|
|
28
|
+
/** Eén ronde: wachtende opdrachten afdrukken en statussen bijwerken. */
|
|
29
|
+
export declare function verwerkWachtrij(max?: number): Promise<WachtrijResultaat>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=printQueue.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAoBA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAe/B,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAqC9D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BrE;AAqED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoH5E;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AA6ID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wEAAwE;AACxE,wBAAsB,eAAe,CAAC,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBzE"}
|