@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.
Files changed (95) hide show
  1. package/dist-lib/components/ComputerVerwijderenDialog.d.ts +16 -0
  2. package/dist-lib/components/ComputerVerwijderenDialog.d.ts.map +1 -0
  3. package/dist-lib/components/ComputerVerwijderenDialog.js +38 -0
  4. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  5. package/dist-lib/components/ComputersLijst.js +5 -2
  6. package/dist-lib/components/DocumentenPage.d.ts.map +1 -1
  7. package/dist-lib/components/DocumentenPage.js +2 -3
  8. package/dist-lib/components/LayoutPrinterSelect.d.ts +3 -5
  9. package/dist-lib/components/LayoutPrinterSelect.d.ts.map +1 -1
  10. package/dist-lib/components/LayoutPrinterSelect.js +40 -17
  11. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  12. package/dist-lib/components/LayoutsPage.js +28 -18
  13. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  14. package/dist-lib/components/PrintQueuePage.js +5 -71
  15. package/dist-lib/components/PrintenPage.d.ts.map +1 -1
  16. package/dist-lib/components/PrintenPage.js +2 -3
  17. package/dist-lib/components/PrinterSetupWizard.d.ts +3 -1
  18. package/dist-lib/components/PrinterSetupWizard.d.ts.map +1 -1
  19. package/dist-lib/components/PrinterSetupWizard.js +15 -29
  20. package/dist-lib/components/PrinterVervangenDialog.d.ts +14 -0
  21. package/dist-lib/components/PrinterVervangenDialog.d.ts.map +1 -0
  22. package/dist-lib/components/PrinterVervangenDialog.js +44 -0
  23. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  24. package/dist-lib/components/PrintersPage.js +2 -2
  25. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  26. package/dist-lib/components/PrintplekDetailPage.js +173 -68
  27. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts +9 -0
  28. package/dist-lib/components/PrintplekVerwijderenDialog.d.ts.map +1 -0
  29. package/dist-lib/components/PrintplekVerwijderenDialog.js +34 -0
  30. package/dist-lib/components/PrintplekWizard.d.ts.map +1 -1
  31. package/dist-lib/components/PrintplekWizard.js +3 -85
  32. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  33. package/dist-lib/components/PrintplekkenPage.js +28 -6
  34. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  35. package/dist-lib/components/WerkplekConfiguratiePage.js +67 -25
  36. package/dist-lib/index.d.ts +9 -12
  37. package/dist-lib/index.d.ts.map +1 -1
  38. package/dist-lib/index.js +7 -13
  39. package/dist-lib/integrations/supabase/auth-middleware.d.ts +1414 -24
  40. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  41. package/dist-lib/integrations/supabase/client.server.d.ts +1414 -24
  42. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  43. package/dist-lib/integrations/supabase/moduleClient.d.ts +1414 -24
  44. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -1
  45. package/dist-lib/integrations/supabase/types.d.ts +1471 -42
  46. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  47. package/dist-lib/lib/aiLayout.functions.d.ts +1414 -24
  48. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  49. package/dist-lib/lib/documentRoutering.d.ts +2 -1
  50. package/dist-lib/lib/documentRoutering.d.ts.map +1 -1
  51. package/dist-lib/lib/documentRoutering.js +5 -8
  52. package/dist-lib/lib/foutTekst.d.ts +3 -0
  53. package/dist-lib/lib/foutTekst.d.ts.map +1 -0
  54. package/dist-lib/lib/foutTekst.js +25 -0
  55. package/dist-lib/lib/printApi.d.ts +0 -2
  56. package/dist-lib/lib/printApi.d.ts.map +1 -1
  57. package/dist-lib/lib/printApi.js +13 -60
  58. package/dist-lib/lib/printQueue.server.d.ts +8 -0
  59. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  60. package/dist-lib/lib/printQueue.server.js +55 -133
  61. package/dist-lib/lib/printRoutering.d.ts +34 -0
  62. package/dist-lib/lib/printRoutering.d.ts.map +1 -0
  63. package/dist-lib/lib/printRoutering.js +69 -0
  64. package/dist-lib/lib/printService.functions.d.ts +6980 -30
  65. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  66. package/dist-lib/lib/printplekken.d.ts +67 -2
  67. package/dist-lib/lib/printplekken.d.ts.map +1 -1
  68. package/dist-lib/lib/printplekken.js +141 -10
  69. package/dist-lib/lib/useDocumentData.d.ts +15 -10
  70. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  71. package/dist-lib/lib/useDocumentData.js +43 -34
  72. package/dist-lib/lib/voorbeeldPrint.d.ts.map +1 -1
  73. package/dist-lib/lib/voorbeeldPrint.js +7 -39
  74. package/package.json +2 -2
  75. package/dist-lib/components/PdfMapAutoSaver.d.ts +0 -6
  76. package/dist-lib/components/PdfMapAutoSaver.d.ts.map +0 -1
  77. package/dist-lib/components/PdfMapAutoSaver.js +0 -12
  78. package/dist-lib/components/PdfMapGlobaleBanner.d.ts +0 -12
  79. package/dist-lib/components/PdfMapGlobaleBanner.d.ts.map +0 -1
  80. package/dist-lib/components/PdfMapGlobaleBanner.js +0 -30
  81. package/dist-lib/components/PdfMapToestemmingBanner.d.ts +0 -8
  82. package/dist-lib/components/PdfMapToestemmingBanner.d.ts.map +0 -1
  83. package/dist-lib/components/PdfMapToestemmingBanner.js +0 -245
  84. package/dist-lib/lib/pdfJobSaver.d.ts +0 -24
  85. package/dist-lib/lib/pdfJobSaver.d.ts.map +0 -1
  86. package/dist-lib/lib/pdfJobSaver.js +0 -405
  87. package/dist-lib/lib/pdfMap.d.ts +0 -90
  88. package/dist-lib/lib/pdfMap.d.ts.map +0 -1
  89. package/dist-lib/lib/pdfMap.js +0 -349
  90. package/dist-lib/lib/pdfOpslagStatus.d.ts +0 -23
  91. package/dist-lib/lib/pdfOpslagStatus.d.ts.map +0 -1
  92. package/dist-lib/lib/pdfOpslagStatus.js +0 -74
  93. package/dist-lib/lib/pdfPrinter.d.ts +0 -9
  94. package/dist-lib/lib/pdfPrinter.d.ts.map +0 -1
  95. 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":"AASA,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;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxB"}
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 { data } = await supabase
52
- .from("document_werkplek_printers")
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,3 @@
1
+ /** Maakt van een (Supabase-)fout een zin die de gebruiker zelf kan herleiden. */
2
+ export declare function leesbareFout(err: unknown, prefix?: string): string;
3
+ //# sourceMappingURL=foutTekst.d.ts.map
@@ -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":"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"}
1
+ {"version":3,"file":"printApi.d.ts","sourceRoot":"","sources":["../../src/lib/printApi.ts"],"names":[],"mappings":"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"}
@@ -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 { printerVoorWerkplekDocument } from "./documentRoutering.js";
8
- import { printerVoorPrintplek, printplekNaam, printplekVoorComputer } from "./printplekken.js";
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
- // Geen printplek meegegeven? Dan kijken we of de werkplek er bij een hoort.
39
- const plek = printplekId ?? (werkplek ? await printplekVoorComputer(werkplek) : null);
40
- if (plek) {
41
- const viaPlek = await printerVoorPrintplek(plek, documenttype);
42
- if (viaPlek)
43
- return viaPlek;
44
- }
45
- if (werkplek) {
46
- const viaWerkplek = await printerVoorWerkplekDocument(documenttype, werkplek);
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
- const printerId = (input.printplekId ? await printerVoorPrintplek(input.printplekId, documenttype) : null) ??
406
- (input.werkplek ? await printerVoorWerkplek(input.werkplek, input.papierformaat) : null) ??
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;AAkUD;;;;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;AAwfD,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"}
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
- const { data: pp } = await db
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: `Printplek '${String(plek?.naam ?? explicietePlek)}' heeft geen printer voor documenttype '${type}'.`,
597
+ reden: `GEEN_PRINTER: printplek '${String(plek?.naam ?? explicietePlek)}' heeft geen gekoppelde printer voor documenttype '${type}'.`,
599
598
  };
600
599
  }
601
- // 2. Regel van de printplek waar de opdracht vandaan komt.
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
- // 3. Uitzondering voor de werkplek waar de opdracht vandaan komt.
621
- if (werkplek) {
622
- const { data: wp } = await db
623
- .from("document_werkplek_printers")
624
- .select("printer_id")
625
- .eq("documenttype", type)
626
- .eq("werkplek", werkplek)
627
- .maybeSingle();
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
- async function wachtOpLayout(db, job, reden) {
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: new Date().toISOString(),
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
- // Virtuele PDF-printer: geen PrintNode nodig; de PDF wordt bewaard.
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
+ }