@flowselections/layout-maker 1.45.19 → 1.51.2
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/ComputerVerwijderenDialog.d.ts +16 -0
- package/dist-lib/components/ComputerVerwijderenDialog.d.ts.map +1 -0
- package/dist-lib/components/ComputerVerwijderenDialog.js +38 -0
- package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
- package/dist-lib/components/ComputersLijst.js +5 -2
- package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
- package/dist-lib/components/DocumentenPage.js +2 -3
- package/dist-lib/components/LayoutPrinterSelect.d.ts +3 -5
- package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -1
- package/dist-lib/components/LayoutPrinterSelect.js +40 -17
- package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
- package/dist-lib/components/LayoutsPage.js +28 -18
- package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
- package/dist-lib/components/PrintQueuePage.js +5 -71
- package/dist-lib/components/PrintenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintenPage.js +2 -3
- package/dist-lib/components/PrinterSetupWizard.d.ts +3 -1
- package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
- package/dist-lib/components/PrinterSetupWizard.js +15 -29
- package/dist-lib/components/PrinterVervangenDialog.d.ts +14 -0
- package/dist-lib/components/PrinterVervangenDialog.d.ts.map +1 -0
- package/dist-lib/components/PrinterVervangenDialog.js +44 -0
- package/dist-lib/components/PrintersPage.d.ts.map +1 -1
- package/dist-lib/components/PrintersPage.js +2 -2
- package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekDetailPage.js +173 -68
- package/dist-lib/components/PrintplekVerwijderenDialog.d.ts +9 -0
- package/dist-lib/components/PrintplekVerwijderenDialog.d.ts.map +1 -0
- package/dist-lib/components/PrintplekVerwijderenDialog.js +34 -0
- package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
- package/dist-lib/components/PrintplekWizard.js +3 -85
- package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
- package/dist-lib/components/PrintplekkenPage.js +28 -6
- package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
- package/dist-lib/components/WerkplekConfiguratiePage.js +67 -25
- package/dist-lib/index.d.ts +9 -12
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +7 -13
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +1414 -24
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +1414 -24
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/moduleClient.d.ts +1414 -24
- package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +1471 -42
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/aiLayout.functions.d.ts +1414 -24
- package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
- package/dist-lib/lib/documentRoutering.d.ts +2 -1
- package/dist-lib/lib/documentRoutering.d.ts.map +1 -1
- package/dist-lib/lib/documentRoutering.js +5 -8
- package/dist-lib/lib/foutTekst.d.ts +3 -0
- package/dist-lib/lib/foutTekst.d.ts.map +1 -0
- package/dist-lib/lib/foutTekst.js +25 -0
- package/dist-lib/lib/printApi.d.ts +0 -2
- package/dist-lib/lib/printApi.d.ts.map +1 -1
- package/dist-lib/lib/printApi.js +13 -60
- package/dist-lib/lib/printQueue.server.d.ts +8 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +55 -133
- package/dist-lib/lib/printRoutering.d.ts +34 -0
- package/dist-lib/lib/printRoutering.d.ts.map +1 -0
- package/dist-lib/lib/printRoutering.js +69 -0
- package/dist-lib/lib/printService.functions.d.ts +6980 -30
- package/dist-lib/lib/printService.functions.d.ts.map +1 -1
- package/dist-lib/lib/printplekken.d.ts +67 -2
- package/dist-lib/lib/printplekken.d.ts.map +1 -1
- package/dist-lib/lib/printplekken.js +141 -10
- package/dist-lib/lib/useDocumentData.d.ts +15 -10
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +43 -34
- package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
- package/dist-lib/lib/voorbeeldPrint.js +7 -39
- package/package.json +2 -2
- package/dist-lib/components/PdfMapAutoSaver.d.ts +0 -6
- package/dist-lib/components/PdfMapAutoSaver.d.ts.map +0 -1
- package/dist-lib/components/PdfMapAutoSaver.js +0 -12
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts +0 -12
- package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +0 -1
- package/dist-lib/components/PdfMapGlobaleBanner.js +0 -30
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts +0 -8
- package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +0 -1
- package/dist-lib/components/PdfMapToestemmingBanner.js +0 -245
- package/dist-lib/lib/pdfJobSaver.d.ts +0 -24
- package/dist-lib/lib/pdfJobSaver.d.ts.map +0 -1
- package/dist-lib/lib/pdfJobSaver.js +0 -405
- package/dist-lib/lib/pdfMap.d.ts +0 -90
- package/dist-lib/lib/pdfMap.d.ts.map +0 -1
- package/dist-lib/lib/pdfMap.js +0 -349
- package/dist-lib/lib/pdfOpslagStatus.d.ts +0 -23
- package/dist-lib/lib/pdfOpslagStatus.d.ts.map +0 -1
- package/dist-lib/lib/pdfOpslagStatus.js +0 -74
- package/dist-lib/lib/pdfPrinter.d.ts +0 -9
- package/dist-lib/lib/pdfPrinter.d.ts.map +0 -1
- package/dist-lib/lib/pdfPrinter.js +0 -34
|
@@ -17,7 +17,8 @@ export declare function zetWerkplekPrinter(documenttype: string, werkplek: strin
|
|
|
17
17
|
export declare function verwijderWerkplekPrinter(id: string): Promise<void>;
|
|
18
18
|
/**
|
|
19
19
|
* De printer die voor deze documentsoort op deze werkplek is ingesteld.
|
|
20
|
-
* Geeft `null` als er geen uitzondering bestaat.
|
|
20
|
+
* Geeft `null` als er geen (bruikbare) uitzondering bestaat. Berekend met de
|
|
21
|
+
* gedeelde routering, dus gelijk aan wat er bij het printen gebeurt.
|
|
21
22
|
*/
|
|
22
23
|
export declare function printerVoorWerkplekDocument(documenttype: string, werkplek: string): Promise<string | null>;
|
|
23
24
|
//# sourceMappingURL=documentRoutering.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentRoutering.d.ts","sourceRoot":"","sources":["../../src/lib/documentRoutering.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"documentRoutering.d.ts","sourceRoot":"","sources":["../../src/lib/documentRoutering.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAID,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM;;;;EAiBxD;AAED,6EAA6E;AAC7E,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,iBAY9B;AAED,4CAA4C;AAC5C,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,iBAGxD;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKxB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { useCallback, useEffect, useState } from "react";
|
|
7
7
|
import { supabase } from "./supabaseClient.js";
|
|
8
|
+
import { routeringVoor } from "./printRoutering.js";
|
|
8
9
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
9
10
|
/** Alle werkplek-uitzonderingen, eventueel gefilterd op documentsoort. */
|
|
10
11
|
export function useWerkplekPrinters(documenttype) {
|
|
@@ -42,17 +43,13 @@ export async function verwijderWerkplekPrinter(id) {
|
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
45
|
* De printer die voor deze documentsoort op deze werkplek is ingesteld.
|
|
45
|
-
* Geeft `null` als er geen uitzondering bestaat.
|
|
46
|
+
* Geeft `null` als er geen (bruikbare) uitzondering bestaat. Berekend met de
|
|
47
|
+
* gedeelde routering, dus gelijk aan wat er bij het printen gebeurt.
|
|
46
48
|
*/
|
|
47
49
|
export async function printerVoorWerkplekDocument(documenttype, werkplek) {
|
|
48
50
|
const naam = (werkplek ?? "").trim();
|
|
49
51
|
if (!naam)
|
|
50
52
|
return null;
|
|
51
|
-
const {
|
|
52
|
-
|
|
53
|
-
.select("printer_id")
|
|
54
|
-
.eq("documenttype", documenttype)
|
|
55
|
-
.eq("werkplek", naam)
|
|
56
|
-
.maybeSingle();
|
|
57
|
-
return data?.printer_id ?? null;
|
|
53
|
+
const u = await routeringVoor({ documenttype, werkplek: naam });
|
|
54
|
+
return u.bron === "werkplek" ? u.printer_id : null;
|
|
58
55
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foutTekst.d.ts","sourceRoot":"","sources":["../../src/lib/foutTekst.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,SAAoB,GAAG,MAAM,CAoB7E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/foutTekst.ts — databasefouten omzetten naar leesbare tekst.
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/** Maakt van een (Supabase-)fout een zin die de gebruiker zelf kan herleiden. */
|
|
5
|
+
export function leesbareFout(err, prefix = "Opslaan mislukt") {
|
|
6
|
+
const e = (err ?? {});
|
|
7
|
+
const msg = String(e.message ?? (typeof err === "string" ? err : "")).trim();
|
|
8
|
+
if (msg.includes("PRINTER_NIET_OP_PLEK")) {
|
|
9
|
+
const m = msg.match(/werkplek\s+(.+?)\.?$/);
|
|
10
|
+
return `${prefix}: deze printer is niet gekoppeld aan de printplek${m ? ` van werkplek ${m[1]}` : ""}. Koppel hem eerst aan de printplek.`;
|
|
11
|
+
}
|
|
12
|
+
if (msg.includes("PRINTER_NIET_GEKOPPELD") || msg.includes("niet gekoppeld aan")) {
|
|
13
|
+
return `${prefix}: ${msg.replace(/^[A-Z_]+:\s*/, "")}`;
|
|
14
|
+
}
|
|
15
|
+
if (e.code === "42501" || /permission denied|row-level security/i.test(msg)) {
|
|
16
|
+
return `${prefix}: geen rechten om dit te wijzigen.`;
|
|
17
|
+
}
|
|
18
|
+
if (e.code === "23505")
|
|
19
|
+
return `${prefix}: deze regel bestaat al.`;
|
|
20
|
+
if (e.code === "23503")
|
|
21
|
+
return `${prefix}: de gekozen printer of plek bestaat niet (meer).`;
|
|
22
|
+
if (/failed to fetch|network/i.test(msg))
|
|
23
|
+
return `${prefix}: geen verbinding met de server.`;
|
|
24
|
+
return msg ? `${prefix}: ${msg.replace(/^[A-Z_]+:\s*/, "")}` : prefix;
|
|
25
|
+
}
|
|
@@ -63,8 +63,6 @@ export declare function printerVoorLayout(layout: {
|
|
|
63
63
|
documenttype?: string | null;
|
|
64
64
|
papierformaat?: string | null;
|
|
65
65
|
}, werkplek?: string, printplekId?: string): Promise<string | null>;
|
|
66
|
-
/** Afdrukmethode van één printer, gebruikt voor PDF-specifieke voorcontroles. */
|
|
67
|
-
export declare function printerAfdrukmethode(printerId: string): Promise<string | null>;
|
|
68
66
|
export interface PrintPdfInput {
|
|
69
67
|
/** Documentsoort, alleen voor overzicht en printerkeuze. */
|
|
70
68
|
documenttype: DocumentType | string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printApi.d.ts","sourceRoot":"","sources":["../../src/lib/printApi.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"printApi.d.ts","sourceRoot":"","sources":["../../src/lib/printApi.ts"],"names":[],"mappings":"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"}
|
package/dist-lib/lib/printApi.js
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
// Andere modules gebruiken uitsluitend deze functies; zij hoeven de tabellen
|
|
5
5
|
// van deze module niet te kennen.
|
|
6
6
|
import { supabase } from "./supabaseClient.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { printplekNaam, printplekVoorComputer } from "./printplekken.js";
|
|
8
|
+
import { routeringVoor } from "./printRoutering.js";
|
|
9
9
|
import { bronVoorDocument } from "./documentBron.js";
|
|
10
|
-
import { bewaarPdfJobZodraKlaar } from "./pdfJobSaver.js";
|
|
11
10
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
12
11
|
/** Zoekt de te gebruiken layout: expliciet, anders standaard, anders de nieuwste. */
|
|
13
12
|
async function bepaalLayout(documenttype, layoutId) {
|
|
@@ -35,40 +34,15 @@ async function bepaalLayout(documenttype, layoutId) {
|
|
|
35
34
|
* 3. koppeling op layout, 4. koppeling op documentsoort + formaat.
|
|
36
35
|
*/
|
|
37
36
|
async function bepaalPrinter(documenttype, layoutId, papierformaat, werkplek, printplekId) {
|
|
38
|
-
//
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (viaWerkplek)
|
|
48
|
-
return viaWerkplek;
|
|
49
|
-
}
|
|
50
|
-
if (layoutId) {
|
|
51
|
-
const { data: mappings } = await supabase
|
|
52
|
-
.from("printer_mappings")
|
|
53
|
-
.select("printer_id, prioriteit")
|
|
54
|
-
.eq("layout_id", layoutId)
|
|
55
|
-
.order("prioriteit");
|
|
56
|
-
const viaLayout = arr(mappings)[0]?.printer_id;
|
|
57
|
-
if (viaLayout)
|
|
58
|
-
return viaLayout;
|
|
59
|
-
}
|
|
60
|
-
if (papierformaat) {
|
|
61
|
-
const { data } = await supabase
|
|
62
|
-
.from("document_formaat_printers")
|
|
63
|
-
.select("printer_id")
|
|
64
|
-
.eq("documenttype", documenttype)
|
|
65
|
-
.eq("formaat_code", papierformaat)
|
|
66
|
-
.maybeSingle();
|
|
67
|
-
const viaFormaat = data?.printer_id;
|
|
68
|
-
if (viaFormaat)
|
|
69
|
-
return viaFormaat;
|
|
70
|
-
}
|
|
71
|
-
return null;
|
|
37
|
+
// Eén gedeelde routering in de database: dezelfde als de printwachtrij.
|
|
38
|
+
const uitkomst = await routeringVoor({
|
|
39
|
+
documenttype,
|
|
40
|
+
layoutId,
|
|
41
|
+
papierformaat,
|
|
42
|
+
werkplek: werkplek ?? null,
|
|
43
|
+
printplekId: printplekId ?? null,
|
|
44
|
+
});
|
|
45
|
+
return uitkomst.printer_id;
|
|
72
46
|
}
|
|
73
47
|
/**
|
|
74
48
|
* Kenmerk waarmee de wachtrij twee opdrachten van elkaar kan onderscheiden.
|
|
@@ -121,12 +95,6 @@ async function zetInWachtrij(rij) {
|
|
|
121
95
|
// blijft de opdracht gewoon wachtend staan voor een volgende poging.
|
|
122
96
|
if (id) {
|
|
123
97
|
void startWachtrijVerwerking();
|
|
124
|
-
const printerId = typeof rij.printer_id === "string" ? rij.printer_id : null;
|
|
125
|
-
// Bij de virtuele PDF-printer blijft deze browser wachten op de gemaakte
|
|
126
|
-
// PDF en schrijft hem meteen naar de lokaal gekozen map. Voor gewone
|
|
127
|
-
// printers stopt de helper direct omdat daar geen maphandle voor bestaat.
|
|
128
|
-
if (printerId)
|
|
129
|
-
void bewaarPdfJobZodraKlaar(id, printerId);
|
|
130
98
|
}
|
|
131
99
|
return id;
|
|
132
100
|
}
|
|
@@ -207,20 +175,6 @@ export async function printerVoorLayout(layout, werkplek, printplekId) {
|
|
|
207
175
|
const documenttype = String(layout.documenttype ?? "");
|
|
208
176
|
return bepaalPrinter(documenttype, layout.id ?? null, layout.papierformaat ?? null, werkplek ?? null, printplekId ?? null);
|
|
209
177
|
}
|
|
210
|
-
/** Afdrukmethode van één printer, gebruikt voor PDF-specifieke voorcontroles. */
|
|
211
|
-
export async function printerAfdrukmethode(printerId) {
|
|
212
|
-
const id = printerId.trim();
|
|
213
|
-
if (!id)
|
|
214
|
-
return null;
|
|
215
|
-
const { data, error } = await supabase
|
|
216
|
-
.from("printers")
|
|
217
|
-
.select("afdrukmethode")
|
|
218
|
-
.eq("id", id)
|
|
219
|
-
.maybeSingle();
|
|
220
|
-
if (error)
|
|
221
|
-
throw error;
|
|
222
|
-
return data?.afdrukmethode ?? null;
|
|
223
|
-
}
|
|
224
178
|
/**
|
|
225
179
|
* Print een kant-en-klare PDF (klantsticker, Floriday-document, factuur van een
|
|
226
180
|
* externe dienst). De PDF gaat ongewijzigd naar de printer; er wordt geen
|
|
@@ -402,9 +356,8 @@ export async function printVerzendbriefVoorKar(input) {
|
|
|
402
356
|
const documenttype = "afleverbrief";
|
|
403
357
|
const cart = (input.cart ?? {});
|
|
404
358
|
const karnaam = String(cart["cart_label"] ?? cart["cartLabel"] ?? cart["cart_id"] ?? cart["cartId"] ?? "").trim();
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
(await printerVoorDocumenttype(documenttype, input.papierformaat, input.werkplek, input.printplekId));
|
|
359
|
+
// Eén gedeelde routering: dezelfde als de wachtrij en het printplekoverzicht.
|
|
360
|
+
const printerId = await printerVoorDocumenttype(documenttype, input.papierformaat, input.werkplek, input.printplekId);
|
|
408
361
|
if (!printerId) {
|
|
409
362
|
throw new GeenPrinterFout(await geenPrinterMelding(documenttype, input.printplekId ?? null, input.werkplek ?? null));
|
|
410
363
|
}
|
|
@@ -56,6 +56,14 @@ export declare function bouwHtml(db: PrintDb, job: Job, keuze: LayoutKeuze, uitk
|
|
|
56
56
|
* lege layout of een opdracht zonder gegevens een blanco vel opleveren.
|
|
57
57
|
*/
|
|
58
58
|
export declare function heeftZichtbareInhoud(html: string): boolean;
|
|
59
|
+
/** Hoe vaak een opdracht op een ontbrekende layout mag wachten. */
|
|
60
|
+
export declare const MAX_WACHT_OP_LAYOUT = 3;
|
|
61
|
+
/**
|
|
62
|
+
* Zet een opdracht terug om later opnieuw te proberen, maar begrensd: na
|
|
63
|
+
* MAX_WACHT_OP_LAYOUT pogingen wordt hij leesbaar "mislukt", zodat hij niet
|
|
64
|
+
* eindeloos blijft rondgaan en onder de gewone opschoning valt.
|
|
65
|
+
*/
|
|
66
|
+
export declare function wachtOpLayout(db: PrintDb, job: Job, reden: string): Promise<"wachtend" | "mislukt">;
|
|
59
67
|
export interface WachtrijResultaat {
|
|
60
68
|
opgepakt: number;
|
|
61
69
|
verstuurd: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAkC5D,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;AAoDD,2EAA2E;AAC3E,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;CACpC;AAED,+EAA+E;AAC/E,qBAAa,iBAAkB,SAAQ,KAAK;IACjC,IAAI,SAAuB;CACrC;AAED,oFAAoF;AACpF,qBAAa,kBAAmB,SAAQ,gBAAgB;IAC7C,IAAI,SAAwB;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAE1F,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAcnD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AASD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQnD;AA2PD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;
|
|
1
|
+
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAkC5D,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;AAoDD,2EAA2E;AAC3E,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;CACpC;AAED,+EAA+E;AAC/E,qBAAa,iBAAkB,SAAQ,KAAK;IACjC,IAAI,SAAuB;CACrC;AAED,oFAAoF;AACpF,qBAAa,kBAAmB,SAAQ,gBAAgB;IAC7C,IAAI,SAAwB;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAE1F,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAcnD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AASD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQnD;AA2PD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;AAsRD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CAuZjB;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AAqBD,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAsCzG;AAoZD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwFtF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA4B1D"}
|
|
@@ -582,88 +582,41 @@ async function zoekPrinter(db, job, layout) {
|
|
|
582
582
|
const explicietePlek = leesPrintPlekId(job);
|
|
583
583
|
// Een Engine-printplek is een harde keuze. Nooit terugvallen op computer,
|
|
584
584
|
// layout of bedrijfsregels wanneer de Engine een print_plek_id meegaf.
|
|
585
|
+
// Alleen een printer die nog echt aan de plek gekoppeld én actief is telt.
|
|
586
|
+
const plekPrinter = async (plek) => {
|
|
587
|
+
const { data } = await db.rpc("printplek_printer", { _plek: plek, _documenttype: type });
|
|
588
|
+
return typeof data === "string" ? data : null;
|
|
589
|
+
};
|
|
585
590
|
if (explicietePlek) {
|
|
586
|
-
|
|
587
|
-
.from("document_printplek_printers")
|
|
588
|
-
.select("printer_id")
|
|
589
|
-
.eq("print_plek_id", explicietePlek)
|
|
590
|
-
.eq("documenttype", type)
|
|
591
|
-
.maybeSingle();
|
|
592
|
-
printer = await pak(pp?.printer_id);
|
|
591
|
+
printer = await pak(await plekPrinter(explicietePlek));
|
|
593
592
|
if (printer)
|
|
594
593
|
return { printer, reden: "" };
|
|
595
594
|
const { data: plek } = await db.from("print_plekken").select("naam").eq("id", explicietePlek).maybeSingle();
|
|
596
595
|
return {
|
|
597
596
|
printer: null,
|
|
598
|
-
reden: `
|
|
597
|
+
reden: `GEEN_PRINTER: printplek '${String(plek?.naam ?? explicietePlek)}' heeft geen gekoppelde printer voor documenttype '${type}'.`,
|
|
599
598
|
};
|
|
600
599
|
}
|
|
601
|
-
// 2.
|
|
600
|
+
// 2-5. Gedeelde routering (printplek → werkplek → layout → standaard),
|
|
601
|
+
// dezelfde databasefunctie die het overzicht en layout_print_document
|
|
602
|
+
// gebruiken.
|
|
602
603
|
const plekId = await zoekPrintPlekId(db, job);
|
|
603
|
-
if (plekId) {
|
|
604
|
-
const { data: pp } = await db
|
|
605
|
-
.from("document_printplek_printers")
|
|
606
|
-
.select("printer_id")
|
|
607
|
-
.eq("print_plek_id", plekId)
|
|
608
|
-
.eq("documenttype", type)
|
|
609
|
-
.maybeSingle();
|
|
610
|
-
printer = await pak(pp?.printer_id);
|
|
611
|
-
if (printer)
|
|
612
|
-
return { printer, reden: "" };
|
|
613
|
-
}
|
|
614
|
-
else if (pickstation) {
|
|
604
|
+
if (!plekId && pickstation) {
|
|
615
605
|
return {
|
|
616
606
|
printer: null,
|
|
617
607
|
reden: `Pickstation '${pickstation}' heeft geen printplek. Koppel dit station aan een printplek.`,
|
|
618
608
|
};
|
|
619
609
|
}
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
printer = await pak(wp?.printer_id);
|
|
629
|
-
if (printer)
|
|
630
|
-
return { printer, reden: "" };
|
|
631
|
-
}
|
|
632
|
-
if (layout?.id) {
|
|
633
|
-
const { data } = await db
|
|
634
|
-
.from("printer_mappings")
|
|
635
|
-
.select("printer_id")
|
|
636
|
-
.eq("layout_id", layout.id)
|
|
637
|
-
.order("prioriteit", { ascending: true })
|
|
638
|
-
.limit(1);
|
|
639
|
-
printer = await pak(arr(data)[0]?.printer_id);
|
|
640
|
-
if (printer)
|
|
641
|
-
return { printer, reden: "" };
|
|
642
|
-
}
|
|
643
|
-
// 4. Bedrijfsbrede standaardregel: eerst op documenttype + papierformaat,
|
|
644
|
-
// daarna op documenttype alleen. Geen "pak de enige printer"-noodgreep
|
|
645
|
-
// meer: dan zou er stil op de verkeerde printer geprint kunnen worden.
|
|
646
|
-
const formaat = layout?.papierformaat ?? "A4";
|
|
647
|
-
const { data: fm } = await db
|
|
648
|
-
.from("document_formaat_printers")
|
|
649
|
-
.select("printer_id")
|
|
650
|
-
.eq("documenttype", type)
|
|
651
|
-
.eq("formaat_code", formaat)
|
|
652
|
-
.maybeSingle();
|
|
653
|
-
printer = await pak(fm?.printer_id);
|
|
610
|
+
const { data: route } = await db.rpc("printer_routering", {
|
|
611
|
+
_documenttype: type,
|
|
612
|
+
_print_plek_id: plekId || null,
|
|
613
|
+
_werkplek: werkplek || null,
|
|
614
|
+
_layout_id: layout?.id ?? null,
|
|
615
|
+
_papierformaat: layout?.papierformaat ?? null,
|
|
616
|
+
});
|
|
617
|
+
printer = await pak(route?.printer_id);
|
|
654
618
|
if (printer)
|
|
655
619
|
return { printer, reden: "" };
|
|
656
|
-
const { data: alle } = await db
|
|
657
|
-
.from("document_formaat_printers")
|
|
658
|
-
.select("printer_id")
|
|
659
|
-
.eq("documenttype", type)
|
|
660
|
-
.not("printer_id", "is", null)
|
|
661
|
-
.limit(5);
|
|
662
|
-
for (const regel of arr(alle)) {
|
|
663
|
-
printer = await pak(regel.printer_id);
|
|
664
|
-
if (printer)
|
|
665
|
-
return { printer, reden: "" };
|
|
666
|
-
}
|
|
667
620
|
if (plekId) {
|
|
668
621
|
const naam = (await printplekNaamVoorJob(db, job)) ?? "onbekend";
|
|
669
622
|
return {
|
|
@@ -1104,22 +1057,51 @@ function plattePayload(payload) {
|
|
|
1104
1057
|
loop(payload, "", 0);
|
|
1105
1058
|
return uit;
|
|
1106
1059
|
}
|
|
1107
|
-
|
|
1060
|
+
/** Hoe vaak een opdracht op een ontbrekende layout mag wachten. */
|
|
1061
|
+
export const MAX_WACHT_OP_LAYOUT = 3;
|
|
1062
|
+
/**
|
|
1063
|
+
* Zet een opdracht terug om later opnieuw te proberen, maar begrensd: na
|
|
1064
|
+
* MAX_WACHT_OP_LAYOUT pogingen wordt hij leesbaar "mislukt", zodat hij niet
|
|
1065
|
+
* eindeloos blijft rondgaan en onder de gewone opschoning valt.
|
|
1066
|
+
*/
|
|
1067
|
+
export async function wachtOpLayout(db, job, reden) {
|
|
1068
|
+
const pogingen = Number(job.pogingen ?? 0) + 1;
|
|
1069
|
+
const nu = new Date().toISOString();
|
|
1070
|
+
if (pogingen >= MAX_WACHT_OP_LAYOUT) {
|
|
1071
|
+
const melding = `De layout voor dit document is na ${MAX_WACHT_OP_LAYOUT} pogingen nog steeds niet beschikbaar. ${reden}`.slice(0, 500);
|
|
1072
|
+
await db
|
|
1073
|
+
.from("print_jobs")
|
|
1074
|
+
.update({
|
|
1075
|
+
status: "mislukt",
|
|
1076
|
+
verwerkingsfase: "mislukt",
|
|
1077
|
+
foutcode: "blijvende_fout",
|
|
1078
|
+
foutmelding: melding,
|
|
1079
|
+
pogingen,
|
|
1080
|
+
volgende_poging: null,
|
|
1081
|
+
fase_voltooid_op: nu,
|
|
1082
|
+
voltooid_op: nu,
|
|
1083
|
+
updated_at: nu,
|
|
1084
|
+
})
|
|
1085
|
+
.eq("id", job.id)
|
|
1086
|
+
.neq("status", "geannuleerd");
|
|
1087
|
+
await log(db, job.id, "mislukt", melding);
|
|
1088
|
+
return "mislukt";
|
|
1089
|
+
}
|
|
1108
1090
|
await db
|
|
1109
1091
|
.from("print_jobs")
|
|
1110
1092
|
.update({
|
|
1111
1093
|
status: "wachtend",
|
|
1112
|
-
lokale_pdf_status: "wachtend",
|
|
1113
|
-
lokale_pdf_fout: reden.slice(0, 500),
|
|
1114
1094
|
foutmelding: reden.slice(0, 500),
|
|
1095
|
+
pogingen,
|
|
1115
1096
|
volgende_poging: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
|
|
1116
1097
|
opgepakt_op: null,
|
|
1117
1098
|
voltooid_op: null,
|
|
1118
|
-
updated_at:
|
|
1099
|
+
updated_at: nu,
|
|
1119
1100
|
})
|
|
1120
1101
|
.eq("id", job.id)
|
|
1121
1102
|
.neq("status", "geannuleerd");
|
|
1122
|
-
await log(db, job.id, "wacht_op_engine_layout", reden);
|
|
1103
|
+
await log(db, job.id, "wacht_op_engine_layout", `${reden} (poging ${pogingen}/${MAX_WACHT_OP_LAYOUT})`);
|
|
1104
|
+
return "wachtend";
|
|
1123
1105
|
}
|
|
1124
1106
|
async function mislukt(db, job, reden, terugNaarWachtend) {
|
|
1125
1107
|
const pogingen = Number(job.pogingen ?? 0);
|
|
@@ -1243,9 +1225,7 @@ async function verwerkJob(db, job) {
|
|
|
1243
1225
|
const printerKeuze = await zoekPrinter(db, job, layout);
|
|
1244
1226
|
klok.markeer("printer_resolved");
|
|
1245
1227
|
const printer = printerKeuze.printer;
|
|
1246
|
-
|
|
1247
|
-
const isPdfPrinter = String(printer?.afdrukmethode ?? "") === "pdf";
|
|
1248
|
-
if (!printer || (!isPdfPrinter && !printer.extern_printer_id)) {
|
|
1228
|
+
if (!printer || !printer.extern_printer_id) {
|
|
1249
1229
|
await mislukt(db, job, printerKeuze.reden ||
|
|
1250
1230
|
`Printer '${printer?.naam ?? "onbekend"}' is niet aan PrintNode gekoppeld.`, true);
|
|
1251
1231
|
return "mislukt";
|
|
@@ -1284,61 +1264,6 @@ async function verwerkJob(db, job) {
|
|
|
1284
1264
|
await log(db, job.id, "annulering_bevestigd", "Niet afgeleverd: tijdens het opmaken geannuleerd.");
|
|
1285
1265
|
return "wachtend";
|
|
1286
1266
|
}
|
|
1287
|
-
// Virtuele PDF-printer: niets gaat naar een fysieke printer; de opgemaakte
|
|
1288
|
-
// PDF wordt op de opdracht bewaard en is daarna te downloaden in de
|
|
1289
|
-
// wachtrij. De opdracht is meteen voltooid.
|
|
1290
|
-
if (isPdfPrinter) {
|
|
1291
|
-
// Bewaar de PDF één keer als binair artefact. De wachtrij en Realtime
|
|
1292
|
-
// vervoeren daarna alleen metadata; de werkplek downloadt precies dit bestand.
|
|
1293
|
-
const artefact = await bewaarPdfArtefact(db, String(job.id), pdfBase64);
|
|
1294
|
-
if (await isJobGeannuleerd(db, String(job.id))) {
|
|
1295
|
-
await db.storage.from("print-artifacts").remove([artefact.pad]);
|
|
1296
|
-
await log(db, job.id, "annulering_bevestigd", "PDF-artefact na annulering verwijderd.");
|
|
1297
|
-
return "wachtend";
|
|
1298
|
-
}
|
|
1299
|
-
// De opdracht blijft bewust op 'bezig' staan: hij is pas voltooid als de
|
|
1300
|
-
// werkplek het bestand echt in de PDF-map heeft gezet. De lokale service
|
|
1301
|
-
// zet daarna 'opgeslagen' + 'voltooid', of 'mislukt' met een leesbare zin.
|
|
1302
|
-
const { data: opgeslagenJob, error: statusFout } = await db
|
|
1303
|
-
.from("print_jobs")
|
|
1304
|
-
.update({
|
|
1305
|
-
printer_id: printer.id,
|
|
1306
|
-
gebruikte_layout_id: uitkomst.bron === "extern_pdf" ? null : (layout?.id ?? null),
|
|
1307
|
-
gebruikte_bron: uitkomst.bron,
|
|
1308
|
-
status: "bezig",
|
|
1309
|
-
verwerkingsfase: "pdf_gereed",
|
|
1310
|
-
fase_voltooid_op: new Date().toISOString(),
|
|
1311
|
-
foutcode: null,
|
|
1312
|
-
lokale_pdf_status: "gereed",
|
|
1313
|
-
lokale_pdf_print_plek_id: (await zoekPrintPlekId(db, job)) || null,
|
|
1314
|
-
lokale_pdf_fout: null,
|
|
1315
|
-
lokaal_opgeslagen_op: null,
|
|
1316
|
-
foutmelding: null,
|
|
1317
|
-
artefact_pad: artefact.pad,
|
|
1318
|
-
artefact_sha256: artefact.sha256,
|
|
1319
|
-
artefact_bytes: artefact.bytes,
|
|
1320
|
-
artefact_gereed_op: new Date().toISOString(),
|
|
1321
|
-
resultaat_pdf_base64: null,
|
|
1322
|
-
volgende_poging: null,
|
|
1323
|
-
updated_at: new Date().toISOString(),
|
|
1324
|
-
})
|
|
1325
|
-
.eq("id", job.id)
|
|
1326
|
-
.neq("status", "geannuleerd")
|
|
1327
|
-
.select("id")
|
|
1328
|
-
.maybeSingle();
|
|
1329
|
-
if (statusFout) {
|
|
1330
|
-
await mislukt(db, job, `Opdracht afronden mislukt: ${statusFout.message}`, true);
|
|
1331
|
-
return "mislukt";
|
|
1332
|
-
}
|
|
1333
|
-
if (!opgeslagenJob) {
|
|
1334
|
-
await db.storage.from("print-artifacts").remove([artefact.pad]);
|
|
1335
|
-
await log(db, job.id, "annulering_bevestigd", "PDF-artefact na gelijktijdige annulering verwijderd.");
|
|
1336
|
-
return "wachtend";
|
|
1337
|
-
}
|
|
1338
|
-
klok.markeer("pdf_ready");
|
|
1339
|
-
await log(db, job.id, "pdf_gereed", `PDF gereed voor lokale opslag via ${printer.naam ?? "PDF-printer"}. ${klok.samenvatting()}`);
|
|
1340
|
-
return "verstuurd";
|
|
1341
|
-
}
|
|
1342
1267
|
const formaten = await zorgVoorFormaten(db, printer);
|
|
1343
1268
|
const vfPapier = (job.payload ?? {})["voorbeeld_formaat"];
|
|
1344
1269
|
const breedteMm = Number(layout?.breedte_mm ?? vfPapier?.["breedte_mm"] ?? standaardMaat(printer).breedte);
|
|
@@ -1389,8 +1314,7 @@ async function verwerkJob(db, job) {
|
|
|
1389
1314
|
}
|
|
1390
1315
|
catch (e) {
|
|
1391
1316
|
if (e instanceof WachtOpLayoutFout) {
|
|
1392
|
-
await wachtOpLayout(db, job, e.message);
|
|
1393
|
-
return "wachtend";
|
|
1317
|
+
return await wachtOpLayout(db, job, e.message);
|
|
1394
1318
|
}
|
|
1395
1319
|
// Ontbreekt er een document of layout? Dan heeft opnieuw proberen geen zin.
|
|
1396
1320
|
const blijvend = e instanceof GeenDocumentFout;
|
|
@@ -1502,8 +1426,6 @@ async function vervalControle(db) {
|
|
|
1502
1426
|
.select("id, pogingen")
|
|
1503
1427
|
.eq("status", "bezig")
|
|
1504
1428
|
.is("extern_job_id", null)
|
|
1505
|
-
// PDF-opdrachten die op de werkplek wachten zijn niet vastgelopen.
|
|
1506
|
-
.or("lokale_pdf_status.is.null,lokale_pdf_status.not.in.(wachtend,bezig,gereed)")
|
|
1507
1429
|
.or(`opgepakt_op.lt.${grensClaim},and(opgepakt_op.is.null,updated_at.lt.${grensClaim})`)
|
|
1508
1430
|
.limit(50);
|
|
1509
1431
|
for (const job of arr(vastgelopen)) {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
2
|
+
export type RouteringBron = "printplek" | "werkplek" | "layout" | "standaard" | "geen";
|
|
3
|
+
export interface OvergeslagenRegel {
|
|
4
|
+
bron: Exclude<RouteringBron, "geen">;
|
|
5
|
+
regel_id: string;
|
|
6
|
+
printer_id: string | null;
|
|
7
|
+
reden: "ontbreekt" | "inactief" | "niet_bruikbaar";
|
|
8
|
+
}
|
|
9
|
+
export interface RouteringUitkomst {
|
|
10
|
+
bron: RouteringBron;
|
|
11
|
+
printer_id: string | null;
|
|
12
|
+
regel_id: string | null;
|
|
13
|
+
print_plek_id: string | null;
|
|
14
|
+
werkplek: string | null;
|
|
15
|
+
layout_id: string | null;
|
|
16
|
+
papierformaat: string | null;
|
|
17
|
+
overgeslagen: OvergeslagenRegel[];
|
|
18
|
+
}
|
|
19
|
+
export interface RouteringInvoer {
|
|
20
|
+
documenttype: string;
|
|
21
|
+
printplekId?: string | null;
|
|
22
|
+
werkplek?: string | null;
|
|
23
|
+
layoutId?: string | null;
|
|
24
|
+
papierformaat?: string | null;
|
|
25
|
+
}
|
|
26
|
+
/** Roept de gedeelde routering aan; `db` mag de server-client van de shell zijn. */
|
|
27
|
+
export declare function routeringVoor(invoer: RouteringInvoer, db?: SupabaseClient<any, any, any>): Promise<RouteringUitkomst>;
|
|
28
|
+
/** Uitkomst per documentsoort × computer van een printplek (null = zonder computer). */
|
|
29
|
+
export declare function useRouteringOverzicht(printplekId: string, documenttypes: string[], computers: string[]): {
|
|
30
|
+
uitkomsten: Record<string, RouteringUitkomst>;
|
|
31
|
+
laden: boolean;
|
|
32
|
+
reload: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=printRoutering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printRoutering.d.ts","sourceRoot":"","sources":["../../src/lib/printRoutering.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAEvF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,gBAAgB,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAuBD,oFAAoF;AACpF,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,EAAE,GAAE,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAwD,GACvF,OAAO,CAAC,iBAAiB,CAAC,CAU5B;AAED,wFAAwF;AACxF,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,SAAS,EAAE,MAAM,EAAE;;;;EA+BpB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// src/lib/printRoutering.ts — dunne laag over de gedeelde databasefunctie
|
|
3
|
+
// `printer_routering`. Dezelfde functie bepaalt de printer bij het echte
|
|
4
|
+
// printen (wachtrij, module-API en layout_print_document), dus wat het
|
|
5
|
+
// overzicht toont is precies wat er gebeurt.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { useCallback, useEffect, useState } from "react";
|
|
8
|
+
import { supabase } from "./supabaseClient.js";
|
|
9
|
+
const LEEG = {
|
|
10
|
+
bron: "geen",
|
|
11
|
+
printer_id: null,
|
|
12
|
+
regel_id: null,
|
|
13
|
+
print_plek_id: null,
|
|
14
|
+
werkplek: null,
|
|
15
|
+
layout_id: null,
|
|
16
|
+
papierformaat: null,
|
|
17
|
+
overgeslagen: [],
|
|
18
|
+
};
|
|
19
|
+
function normaliseer(data) {
|
|
20
|
+
if (!data || typeof data !== "object")
|
|
21
|
+
return LEEG;
|
|
22
|
+
const d = data;
|
|
23
|
+
return {
|
|
24
|
+
...LEEG,
|
|
25
|
+
...d,
|
|
26
|
+
overgeslagen: Array.isArray(d.overgeslagen) ? d.overgeslagen : [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Roept de gedeelde routering aan; `db` mag de server-client van de shell zijn. */
|
|
30
|
+
export async function routeringVoor(invoer, db = supabase) {
|
|
31
|
+
const { data, error } = await db.rpc("printer_routering", {
|
|
32
|
+
_documenttype: invoer.documenttype,
|
|
33
|
+
_print_plek_id: invoer.printplekId || null,
|
|
34
|
+
_werkplek: invoer.werkplek?.trim() || null,
|
|
35
|
+
_layout_id: invoer.layoutId || null,
|
|
36
|
+
_papierformaat: invoer.papierformaat || null,
|
|
37
|
+
});
|
|
38
|
+
if (error)
|
|
39
|
+
throw error;
|
|
40
|
+
return normaliseer(data);
|
|
41
|
+
}
|
|
42
|
+
/** Uitkomst per documentsoort × computer van een printplek (null = zonder computer). */
|
|
43
|
+
export function useRouteringOverzicht(printplekId, documenttypes, computers) {
|
|
44
|
+
const [uitkomsten, setUitkomsten] = useState({});
|
|
45
|
+
const [laden, setLaden] = useState(true);
|
|
46
|
+
const sleutelTypes = documenttypes.join("|");
|
|
47
|
+
const sleutelPcs = computers.join("|");
|
|
48
|
+
const load = useCallback(async () => {
|
|
49
|
+
if (!printplekId)
|
|
50
|
+
return;
|
|
51
|
+
const pcs = computers.length ? computers : [null];
|
|
52
|
+
const taken = [];
|
|
53
|
+
for (const t of documenttypes) {
|
|
54
|
+
for (const pc of pcs) {
|
|
55
|
+
taken.push(routeringVoor({ documenttype: t, printplekId, werkplek: pc })
|
|
56
|
+
.catch(() => LEEG)
|
|
57
|
+
.then((u) => [`${t}::${pc ?? ""}`, u]));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const res = await Promise.all(taken);
|
|
61
|
+
setUitkomsten(Object.fromEntries(res));
|
|
62
|
+
setLaden(false);
|
|
63
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
|
+
}, [printplekId, sleutelTypes, sleutelPcs]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
void load();
|
|
67
|
+
}, [load]);
|
|
68
|
+
return { uitkomsten, laden, reload: load };
|
|
69
|
+
}
|