@flowselections/layout-maker 1.59.1 → 1.61.1

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 (49) hide show
  1. package/dist-lib/components/LivePrintstatusRegel.d.ts.map +1 -1
  2. package/dist-lib/components/LivePrintstatusRegel.js +29 -29
  3. package/dist-lib/components/PrintInstallatiesBlok.d.ts +3 -0
  4. package/dist-lib/components/PrintInstallatiesBlok.d.ts.map +1 -0
  5. package/dist-lib/components/PrintInstallatiesBlok.js +29 -0
  6. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  7. package/dist-lib/components/PrintQueuePage.js +27 -8
  8. package/dist-lib/components/PrintStatusBanner.d.ts.map +1 -1
  9. package/dist-lib/components/PrintStatusBanner.js +3 -1
  10. package/dist-lib/components/PrintenInstellenWizard.d.ts.map +1 -1
  11. package/dist-lib/components/PrintenInstellenWizard.js +14 -1
  12. package/dist-lib/components/WerkplekOmzettingStap.d.ts.map +1 -1
  13. package/dist-lib/components/WerkplekOmzettingStap.js +2 -1
  14. package/dist-lib/components/WerkplekkenTab.d.ts.map +1 -1
  15. package/dist-lib/components/WerkplekkenTab.js +27 -3
  16. package/dist-lib/index.js +3 -3
  17. package/dist-lib/integrations/supabase/types.d.ts +701 -0
  18. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  19. package/dist-lib/lib/etiketControle.d.ts +8 -0
  20. package/dist-lib/lib/etiketControle.d.ts.map +1 -1
  21. package/dist-lib/lib/etiketControle.js +7 -2
  22. package/dist-lib/lib/foutTekst.d.ts +6 -0
  23. package/dist-lib/lib/foutTekst.d.ts.map +1 -1
  24. package/dist-lib/lib/foutTekst.js +46 -16
  25. package/dist-lib/lib/layoutVerwijzingen.js +1 -1
  26. package/dist-lib/lib/printApi.d.ts +1 -1
  27. package/dist-lib/lib/printApi.d.ts.map +1 -1
  28. package/dist-lib/lib/printApi.js +5 -4
  29. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  30. package/dist-lib/lib/printQueue.server.js +16 -2
  31. package/dist-lib/lib/printService.functions.d.ts +94 -0
  32. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/printService.functions.js +52 -2
  34. package/dist-lib/lib/printnodeStatus.d.ts +1 -0
  35. package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
  36. package/dist-lib/lib/printnodeStatus.js +4 -2
  37. package/dist-lib/lib/printnodeWebhook.d.ts +12 -0
  38. package/dist-lib/lib/printnodeWebhook.d.ts.map +1 -1
  39. package/dist-lib/lib/printnodeWebhook.js +27 -1
  40. package/dist-lib/lib/printplekken.js +1 -1
  41. package/dist-lib/lib/queueTick.d.ts.map +1 -1
  42. package/dist-lib/lib/queueTick.js +9 -0
  43. package/dist-lib/lib/runnerRegistry.server.d.ts +5 -0
  44. package/dist-lib/lib/runnerRegistry.server.d.ts.map +1 -1
  45. package/dist-lib/lib/runnerRegistry.server.js +22 -1
  46. package/dist-lib/lib/shellPoort.d.ts +21 -0
  47. package/dist-lib/lib/shellPoort.d.ts.map +1 -0
  48. package/dist-lib/lib/shellPoort.js +43 -0
  49. package/package.json +1 -1
@@ -15,6 +15,14 @@ export type EtiketUitkomst = {
15
15
  bericht: string;
16
16
  };
17
17
  export declare const maatTekst: (b: number, h: number) => string;
18
+ /** Leesbare maat voor de gebruiker: "25,1 × 88,9 mm". */
19
+ export declare const maatNl: (b: number, h: number) => string;
20
+ /** "99010 Standard Address (25,1 × 88,9 mm)". */
21
+ export declare const etiketTekst: (e: {
22
+ naam: string;
23
+ breedte_mm: number;
24
+ hoogte_mm: number;
25
+ }) => string;
18
26
  /** Leest een opgeslagen geladen etiket; ongeldig = null. */
19
27
  export declare function leesGeladenEtiket(v: unknown): GeladenEtiket | null;
20
28
  /** PrintNode-formaten (tienden mm) als keuzelijst in mm, zonder lege maten. */
@@ -1 +1 @@
1
- {"version":3,"file":"etiketControle.d.ts","sourceRoot":"","sources":["../../src/lib/etiketControle.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAKtF,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,WAA2B,CAAC;AAE1E,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAQlE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAW7D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAClE,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,WAAW,EAAE,MAAM,GAClB,cAAc,CAgChB;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa/F"}
1
+ {"version":3,"file":"etiketControle.d.ts","sourceRoot":"","sources":["../../src/lib/etiketControle.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAKtF,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,WAA2B,CAAC;AAC1E,yDAAyD;AACzD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,WACmC,CAAC;AAC/E,iDAAiD;AACjD,eAAO,MAAM,WAAW,GAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,WAC3B,CAAC;AAG5D,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAQlE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,EAAE,CAW7D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAClE,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,WAAW,EAAE,MAAM,GAClB,cAAc,CA6BhB;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAa/F"}
@@ -9,6 +9,11 @@
9
9
  const MARGE_MM = 2;
10
10
  const mm = (n) => Math.round(n * 10) / 10;
11
11
  export const maatTekst = (b, h) => `${mm(b)}×${mm(h)} mm`;
12
+ /** Leesbare maat voor de gebruiker: "25,1 × 88,9 mm". */
13
+ export const maatNl = (b, h) => `${String(mm(b)).replace(".", ",")} × ${String(mm(h)).replace(".", ",")} mm`;
14
+ /** "99010 Standard Address (25,1 × 88,9 mm)". */
15
+ export const etiketTekst = (e) => `${e.naam.trim()} (${maatNl(e.breedte_mm, e.hoogte_mm)})`;
16
+ const heel = (b, h) => `${Math.round(b)} × ${Math.round(h)} mm`;
12
17
  /** Leest een opgeslagen geladen etiket; ongeldig = null. */
13
18
  export function leesGeladenEtiket(v) {
14
19
  if (!v || typeof v !== "object")
@@ -46,7 +51,7 @@ export function etiketPast(doc, geladen, printerNaam) {
46
51
  return {
47
52
  ok: false,
48
53
  code: "GEEN_GELADEN_ETIKET",
49
- bericht: `Stel eerst het geladen etiket in voor labelprinter ${printerNaam}.`,
54
+ bericht: `Er is nog niet ingesteld welk etiket in labelprinter ${printerNaam} zit.`,
50
55
  };
51
56
  }
52
57
  const { breedte_mm: b, hoogte_mm: h } = doc;
@@ -56,7 +61,7 @@ export function etiketPast(doc, geladen, printerNaam) {
56
61
  return {
57
62
  ok: false,
58
63
  code: "FORMAAT_PAST_NIET",
59
- bericht: `${doc.soortLabel} ${maatTekst(b, h)} past niet op het geladen etiket ${maatTekst(geladen.breedte_mm, geladen.hoogte_mm)} van labelprinter ${printerNaam}.`,
64
+ bericht: `Past niet op het etiket in de printer (${heel(b, h)} op ${heel(geladen.breedte_mm, geladen.hoogte_mm)}).`,
60
65
  };
61
66
  }
62
67
  const docLiggend = b > h;
@@ -10,6 +10,12 @@ export interface DubbelOrigineel {
10
10
  * documentsoort) en geeft het bestaande opdracht-id, de printer en de tijd.
11
11
  */
12
12
  export declare function leesDubbelOrigineel(err: unknown): DubbelOrigineel | null;
13
+ /**
14
+ * Zet een bekende technische melding om naar een zin voor de gebruiker.
15
+ * Geeft null als de melding niet bekend is. De oorspronkelijke melding blijft
16
+ * bewaard en is alleen onder "Details voor beheer" te zien.
17
+ */
18
+ export declare function gebruikersTekst(melding: unknown, soortLabel?: (t: string) => string): string | null;
13
19
  /** Maakt van een (Supabase-)fout een zin die de gebruiker zelf kan herleiden. */
14
20
  export declare function leesbareFout(err: unknown, prefix?: string): string;
15
21
  //# sourceMappingURL=foutTekst.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"foutTekst.d.ts","sourceRoot":"","sources":["../../src/lib/foutTekst.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAkBxE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,SAAoB,GAAG,MAAM,CAgC7E"}
1
+ {"version":3,"file":"foutTekst.d.ts","sourceRoot":"","sources":["../../src/lib/foutTekst.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAkBxE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CA6BnG;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,SAAoB,GAAG,MAAM,CA2B7E"}
@@ -25,15 +25,52 @@ export function leesDubbelOrigineel(err) {
25
25
  return { jobId: null, printerId: null, aangemaaktOp: null };
26
26
  }
27
27
  }
28
+ /**
29
+ * Zet een bekende technische melding om naar een zin voor de gebruiker.
30
+ * Geeft null als de melding niet bekend is. De oorspronkelijke melding blijft
31
+ * bewaard en is alleen onder "Details voor beheer" te zien.
32
+ */
33
+ export function gebruikersTekst(melding, soortLabel) {
34
+ const m = String(melding ?? "").trim();
35
+ if (!m)
36
+ return null;
37
+ if (m.includes("FORMAAT_PAST_NIET")) {
38
+ if (m.includes("Past niet op het etiket"))
39
+ return m.replace(/^[A-Z_]+:\s*/, "");
40
+ const maten = [...m.matchAll(/(\d+(?:[.,]\d+)?)\s*[×x]\s*(\d+(?:[.,]\d+)?)\s*mm/g)].map((x) => `${Math.round(Number(x[1].replace(",", ".")))} × ${Math.round(Number(x[2].replace(",", ".")))} mm`);
41
+ return maten.length >= 2
42
+ ? `Past niet op het etiket in de printer (${maten[0]} op ${maten[1]}).`
43
+ : "Past niet op het etiket in de printer.";
44
+ }
45
+ if (m.includes("GEEN_GELADEN_ETIKET"))
46
+ return "Er is nog niet ingesteld welk etiket in de labelprinter zit.";
47
+ if (m.includes("GEEN_PRINTER")) {
48
+ const plek = m.match(/printplek '([^']*)'/)?.[1];
49
+ const type = m.match(/documenttype '([^']*)'/)?.[1];
50
+ const soort = type ? (soortLabel ? soortLabel(type) : type) : "dit document";
51
+ return `Er is geen printer ingesteld voor ‘${soort}’${plek ? ` op printplek ‘${plek}’` : ""}. Stel er een in bij Printen › Printplekken.`;
52
+ }
53
+ if (m.includes("DUBBEL_ORIGINEEL") || m.includes("print_jobs_een_origineel_per_kar")) {
54
+ return "Deze kar is al geprint. Gebruik ‘Opnieuw printen’.";
55
+ }
56
+ if (/layout_variant/i.test(m)) {
57
+ return "De pakbon wacht nog op de karindeling en wordt automatisch geprint zodra die klaar is.";
58
+ }
59
+ if (/Restpakbon zonder restregels/i.test(m)) {
60
+ return "De restpakbon is leeg (geen resterende fusten); er is niets geprint.";
61
+ }
62
+ return null;
63
+ }
28
64
  /** Maakt van een (Supabase-)fout een zin die de gebruiker zelf kan herleiden. */
29
65
  export function leesbareFout(err, prefix = "Opslaan mislukt") {
30
66
  const e = (err ?? {});
31
67
  const msg = String(e.message ?? (typeof err === "string" ? err : "")).trim();
32
68
  const dubbel = leesDubbelOrigineel(err);
33
- if (dubbel) {
34
- const tijd = dubbel.aangemaaktOp ? new Date(dubbel.aangemaaktOp).toLocaleString("nl-NL") : "eerder";
35
- return `${prefix}: voor deze kar is al een origineel gemaakt (opdracht ${dubbel.jobId ?? "?"}, ${tijd}). Gebruik "Opnieuw printen" voor een herprint.`;
36
- }
69
+ if (dubbel)
70
+ return "Deze kar is al geprint. Gebruik ‘Opnieuw printen’.";
71
+ const bekend = gebruikersTekst(msg);
72
+ if (bekend)
73
+ return bekend;
37
74
  if (msg.includes("PRINTER_NIET_OP_PLEK")) {
38
75
  const m = msg.match(/werkplek\s+(.+?)\.?$/);
39
76
  return `${prefix}: deze printer is niet gekoppeld aan de printplek${m ? ` van werkplek ${m[1]}` : ""}. Koppel hem eerst aan de printplek.`;
@@ -50,16 +87,9 @@ export function leesbareFout(err, prefix = "Opslaan mislukt") {
50
87
  return `${prefix}: de gekozen printer of plek bestaat niet (meer).`;
51
88
  if (/failed to fetch|network/i.test(msg))
52
89
  return `${prefix}: geen verbinding met de server.`;
53
- if (msg)
54
- return `${prefix}: ${msg.replace(/^[A-Z_]+:\s*/, "")}`;
55
- const extra = [e.details, e.hint, e.code ? `code ${e.code}` : ""].filter(Boolean).join(" — ");
56
- if (extra)
57
- return `${prefix}: ${extra}`;
58
- try {
59
- const ruw = JSON.stringify(err);
60
- if (ruw && ruw !== "{}" && ruw !== "null")
61
- return `${prefix}: ${ruw.slice(0, 300)}`;
62
- }
63
- catch { /* niets */ }
64
- return `${prefix} (geen reden ontvangen).`;
90
+ // Een gewone zin (geen code, geen JSON) mag de gebruiker zien.
91
+ const zin = msg.replace(/^[A-Z_]+:\s*/, "");
92
+ if (zin && !/^[A-Z0-9_]+$/.test(zin) && !/^[\[{]/.test(zin) && !/\b[A-Z]{2,}_[A-Z_]+\b/.test(zin))
93
+ return `${prefix}: ${zin}`;
94
+ return `${prefix}. Probeer het opnieuw; blijft het, meld het bij kantoor.`;
65
95
  }
@@ -112,7 +112,7 @@ export async function zetVerwijzingOm(v, nieuwLayoutId) {
112
112
  export const BRON_LABEL = {
113
113
  eigen_layout: "eigen layout",
114
114
  extern_pdf: "aangeleverd document",
115
- floriday_1op1: "Floriday-document (1-op-1)",
115
+ floriday_1op1: "Origineel Floriday-document",
116
116
  render_html: "aangeleverde opmaak",
117
117
  klantlayout: "klantlayout",
118
118
  onbekend: "onbekend",
@@ -1,5 +1,5 @@
1
1
  import { type DubbelOrigineel } from "./foutTekst.js";
2
- import type { DocumentType } from "./documentTypes.js";
2
+ import { type DocumentType } from "./documentTypes.js";
3
3
  export interface PrintDocumentInput {
4
4
  /** Documentsoort, bijv. "pakbon" of "productiebon". */
5
5
  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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"}
@@ -8,6 +8,7 @@ import { supabase } from "./supabaseClient.js";
8
8
  import { printplekNaam, printplekVoorComputer } from "./printplekken.js";
9
9
  import { routeringVoor } from "./printRoutering.js";
10
10
  import { bronVoorDocument } from "./documentBron.js";
11
+ import { documentTypeLabel } from "./documentTypes.js";
11
12
  const arr = (v) => (Array.isArray(v) ? v : []);
12
13
  /** Zoekt de te gebruiken layout: expliciet, anders standaard, anders de nieuwste. */
13
14
  async function bepaalLayout(documenttype, layoutId) {
@@ -116,7 +117,7 @@ export class DubbeleAanvraagFout extends Error {
116
117
  */
117
118
  export class DubbelOrigineelFout extends Error {
118
119
  constructor(d) {
119
- super(`DUBBEL_ORIGINEEL: voor deze kar is al een origineel gemaakt (opdracht ${d.jobId ?? "?"}). Gebruik een herprint.`);
120
+ super("Deze kar is al geprint. Gebruik ‘Opnieuw printen’.");
120
121
  this.name = "DubbelOrigineelFout";
121
122
  this.code = "DUBBEL_ORIGINEEL";
122
123
  this.bestaandJobId = d.jobId;
@@ -180,12 +181,12 @@ async function geenPrinterMelding(documenttype, printplekId, werkplek) {
180
181
  const plek = printplekId ?? (werkplek ? await printplekVoorComputer(werkplek) : null);
181
182
  const naam = plek ? await printplekNaam(plek) : null;
182
183
  if (naam) {
183
- return `Geen printer voor ${documenttype} op ${naam} — stel dit in bij Printplekken.`;
184
+ return `Er is geen printer ingesteld voor ‘${documentTypeLabel(documenttype)}’ op printplek ‘${naam}’. Stel er een in bij Printen › Printplekken.`;
184
185
  }
185
186
  if (werkplek) {
186
- return `Geen printer voor ${documenttype} op werkplek ${werkplek} — koppel deze werkplek aan een printplek en kies daar een printer.`;
187
+ return `Er is geen printer ingesteld voor ‘${documentTypeLabel(documenttype)}’ op werkplek ‘${werkplek}’. Koppel deze werkplek bij Printen › Printplekken.`;
187
188
  }
188
- return `Geen printer voor ${documenttype} — stel dit in bij Layouts en printers → Routering.`;
189
+ return `Er is geen printer ingesteld voor ‘${documentTypeLabel(documenttype)}’. Stel er een in bij Printen › Printplekken.`;
189
190
  }
190
191
  /**
191
192
  * Zet een document in de printwachtrij. Bedoeld voor gebruik vanuit andere
@@ -1 +1 @@
1
- {"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"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"}
@@ -853,7 +853,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
853
853
  : "kar";
854
854
  const engineVariant = job.layout_variant ?? p.layout_variant ?? p.layoutVariant ?? p.data?.layout_variant ?? null;
855
855
  if (isEngineOpdracht(job) && pakbonMethode === "beide" && !["full_cart", "partial_order"].includes(String(engineVariant ?? ""))) {
856
- throw new WachtOpLayoutFout("Wacht op layout_variant van de Logistics Engine: kies full_cart of partial_order.");
856
+ throw new WachtOpLayoutFout("De pakbon wacht nog op de karindeling en wordt automatisch geprint zodra die klaar is.");
857
857
  }
858
858
  // Barcode en kargegevens van de Engine mogen niet verloren gaan wanneer
859
859
  // de ordergegevens uit een subobject komen.
@@ -936,7 +936,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
936
936
  // verzameld moet worden. Dan liever geen pakbon dan een pakbon met de
937
937
  // volledige karinhoud erop.
938
938
  if (pakbonLayoutVariant(engineVariant) === "partial_order" && !deelkarRegels(order).length) {
939
- throw new EngineContractFout("Restpakbon zonder restregels: stuur de resterende regels mee als cart_items.");
939
+ throw new EngineContractFout("De restpakbon is leeg (geen resterende fusten); er is niets geprint.");
940
940
  }
941
941
  const cartId = engineCartId;
942
942
  const karren = Array.isArray(order.karren) ? order.karren : [];
@@ -1755,6 +1755,20 @@ export async function verwerkWachtrij(db, max = 5) {
1755
1755
  // Begrensd parallel: meerdere pakbonnen van één order lopen gelijktijdig,
1756
1756
  // maar één mislukte opdracht annuleert de andere nooit.
1757
1757
  const jobs = [...pdfJobs, ...gewoneJobs];
1758
+ // Vastleggen welke installatie (en versie) deze opdrachten verwerkt.
1759
+ if (jobs.length > 0) {
1760
+ try {
1761
+ const { eigenBasisUrl } = await import("./runnerRegistry.server.js");
1762
+ const { MODULE_VERSIE } = await import("./shellPoort.js");
1763
+ await db
1764
+ .from("print_jobs")
1765
+ .update({ verwerkt_door_runner: eigenBasisUrl(), verwerkt_met_versie: MODULE_VERSIE })
1766
+ .in("id", jobs.map((j) => j.id));
1767
+ }
1768
+ catch {
1769
+ /* vastleggen mag het printen nooit blokkeren */
1770
+ }
1771
+ }
1758
1772
  const uitkomsten = await metPool(jobs, JOB_PARALLEL, async (job) => {
1759
1773
  try {
1760
1774
  return await verwerkJob(db, job);
@@ -134,6 +134,7 @@ export declare const webhookStatus: import("@tanstack/start-client-core").Option
134
134
  claims: import("@supabase/auth-js").JwtPayload;
135
135
  }, undefined, undefined, undefined>], undefined, Promise<{
136
136
  meldingen: {
137
+ weergave: string;
137
138
  ontvangen_op: string;
138
139
  http_status: number;
139
140
  soorten: string[];
@@ -173,4 +174,97 @@ export declare const webhookOpnieuwKoppelen: import("@tanstack/start-client-core
173
174
  ok: false;
174
175
  reden: string;
175
176
  }>>;
177
+ /**
178
+ * Printinstallaties en of de Shell print. Alleen beheerders zien de lijst;
179
+ * iedereen ziet de stilstandmelding.
180
+ */
181
+ export declare const printInstallaties: import("@tanstack/start-client-core").OptionalFetcher<readonly [import("@tanstack/start-client-core").FunctionMiddlewareAfterServer<{}, unknown, undefined, {
182
+ supabase: import("../integrations/supabase/auth-middleware.js").AuthedSupabaseClient;
183
+ userId: string;
184
+ claims: import("@supabase/auth-js").JwtPayload;
185
+ }, undefined, undefined, undefined>], undefined, Promise<{
186
+ installaties: [];
187
+ stil: true;
188
+ reden: "geen_shell_adres";
189
+ sinds: null;
190
+ ok: true;
191
+ beheer: false;
192
+ } | {
193
+ installaties: [];
194
+ stil: true;
195
+ reden: "shell_niet_aangemeld";
196
+ sinds: null;
197
+ ok: true;
198
+ beheer: false;
199
+ } | {
200
+ installaties: [];
201
+ stil: true;
202
+ reden: "shell_reageert_niet";
203
+ sinds: string;
204
+ ok: true;
205
+ beheer: false;
206
+ } | {
207
+ installaties: [];
208
+ stil: false;
209
+ reden: null;
210
+ sinds: null;
211
+ ok: true;
212
+ beheer: false;
213
+ } | {
214
+ installaties: {
215
+ adres: string;
216
+ versie: string | null;
217
+ laatstActief: string | null;
218
+ actief: boolean;
219
+ isShell: boolean;
220
+ opdrachten7d: any;
221
+ }[];
222
+ stil: true;
223
+ reden: "geen_shell_adres";
224
+ sinds: null;
225
+ ok: true;
226
+ beheer: true;
227
+ } | {
228
+ installaties: {
229
+ adres: string;
230
+ versie: string | null;
231
+ laatstActief: string | null;
232
+ actief: boolean;
233
+ isShell: boolean;
234
+ opdrachten7d: any;
235
+ }[];
236
+ stil: true;
237
+ reden: "shell_niet_aangemeld";
238
+ sinds: null;
239
+ ok: true;
240
+ beheer: true;
241
+ } | {
242
+ installaties: {
243
+ adres: string;
244
+ versie: string | null;
245
+ laatstActief: string | null;
246
+ actief: boolean;
247
+ isShell: boolean;
248
+ opdrachten7d: any;
249
+ }[];
250
+ stil: true;
251
+ reden: "shell_reageert_niet";
252
+ sinds: string;
253
+ ok: true;
254
+ beheer: true;
255
+ } | {
256
+ installaties: {
257
+ adres: string;
258
+ versie: string | null;
259
+ laatstActief: string | null;
260
+ actief: boolean;
261
+ isShell: boolean;
262
+ opdrachten7d: any;
263
+ }[];
264
+ stil: false;
265
+ reden: null;
266
+ sinds: null;
267
+ ok: true;
268
+ beheer: true;
269
+ }>>;
176
270
  //# sourceMappingURL=printService.functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"printService.functions.d.ts","sourceRoot":"","sources":["../../src/lib/printService.functions.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe;;;;;;;;;;;;GASxB,CAAC;AAEL,eAAO,MAAM,qBAAqB;;;;8CAER;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;;;;;;;;;GAmBC,CAAC;AAEL,eAAO,MAAM,WAAW;;;;8CAEE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAU7C,CAAC;AAEL,eAAO,MAAM,uBAAuB;;;;+CAET;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;;;;;;;;;;GAqE5C,CAAC;AAEL,eAAO,MAAM,gBAAgB;;;;;;;;;;;;GAYzB,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;GAUnC,CAAC;AAEL,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;iFAgBvB,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;8CAED;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAyDvC,CAAC;AAEL,qDAAqD;AACrD,eAAO,MAAM,aAAa;;;;;;sBAYJ,MAAM;qBAAe,MAAM;iBAAW,MAAM,EAAE;uBAAiB,MAAM,EAAE;kBAAY,MAAM;uBAAiB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;GAMpI,CAAC;AAEL,qEAAqE;AACrE,eAAO,MAAM,sBAAsB;;;;;;;;;;GAoB/B,CAAC"}
1
+ {"version":3,"file":"printService.functions.d.ts","sourceRoot":"","sources":["../../src/lib/printService.functions.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe;;;;;;;;;;;;GASxB,CAAC;AAEL,eAAO,MAAM,qBAAqB;;;;8CAER;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;;;;;;;;;GAmBC,CAAC;AAEL,eAAO,MAAM,WAAW;;;;8CAEE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAU7C,CAAC;AAEL,eAAO,MAAM,uBAAuB;;;;+CAET;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;;;;;;;;;;GAqE5C,CAAC;AAEL,eAAO,MAAM,gBAAgB;;;;;;;;;;;;GAYzB,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;GAUnC,CAAC;AAEL,oFAAoF;AACpF,eAAO,MAAM,cAAc;;;;iFAgBvB,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;8CAED;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAyDvC,CAAC;AAEL,qDAAqD;AACrD,eAAO,MAAM,aAAa;;;;;;;sBAaJ,MAAM;qBAAe,MAAM;iBAAW,MAAM,EAAE;uBAAiB,MAAM,EAAE;kBAAY,MAAM;uBAAiB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;GAMpI,CAAC;AAEL,qEAAqE;AACrE,eAAO,MAAM,sBAAsB;;;;;;;;;;GAoB/B,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqD1B,CAAC"}
@@ -243,10 +243,11 @@ export const webhookStatus = createServerFn({ method: "POST" })
243
243
  const { leesKoppeling, veiligeStatus } = await import("./printnodeWebhookBeheer.server.js");
244
244
  const { data: m } = await supabaseAdmin
245
245
  .from("printnode_webhook_meldingen")
246
- .select("ontvangen_op, http_status, soorten, printnode_ids, gematcht, niet_gematcht")
246
+ .select("ontvangen_op, http_status, soorten, printnode_ids, gematcht, niet_gematcht, antwoord")
247
247
  .order("id", { ascending: false })
248
248
  .limit(5);
249
- const meldingen = (Array.isArray(m) ? m : []);
249
+ const { meldingWeergave } = await import("./printnodeWebhook.js");
250
+ const meldingen = (Array.isArray(m) ? m : []).map(({ antwoord, ...r }) => ({ ...r, weergave: meldingWeergave({ ...r, antwoord }) }));
250
251
  return { ok: true, ...veiligeStatus(await leesKoppeling(supabaseAdmin)), meldingen };
251
252
  }
252
253
  catch (e) {
@@ -273,3 +274,52 @@ export const webhookOpnieuwKoppelen = createServerFn({ method: "POST" })
273
274
  const u = await koppelWebhook(supabaseAdmin, { oorsprong });
274
275
  return u.ok ? { ok: true } : { ok: false, reden: u.reden ?? "Koppelen mislukt." };
275
276
  });
277
+ /**
278
+ * Printinstallaties en of de Shell print. Alleen beheerders zien de lijst;
279
+ * iedereen ziet de stilstandmelding.
280
+ */
281
+ export const printInstallaties = createServerFn({ method: "POST" })
282
+ .middleware([requireSupabaseAuth])
283
+ .handler(async ({ context }) => {
284
+ const ctx = context;
285
+ const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
286
+ const { maskeerAdres, normaliseerAdres } = await import("./shellPoort.js");
287
+ const db = supabaseAdmin;
288
+ const { data: cfg } = await db.from("module_runtime_config").select("value").eq("key", "shell_base_url").maybeSingle();
289
+ const shell = normaliseerAdres(cfg?.value);
290
+ const { data: r } = await db
291
+ .from("print_queue_runners")
292
+ .select("basis_url, module_versie, laatst_gezien, laatste_ok, actief, created_at")
293
+ .order("laatst_gezien", { ascending: false });
294
+ const runners = (Array.isArray(r) ? r : []);
295
+ const shellRij = shell ? runners.find((x) => normaliseerAdres(x.basis_url) === shell) ?? null : null;
296
+ const grens = Date.now() - 5 * 60 * 1000;
297
+ const shellLaatst = shellRij ? shellRij.laatste_ok ?? shellRij.created_at : null;
298
+ const stil = !shell
299
+ ? { stil: true, reden: "geen_shell_adres", sinds: null }
300
+ : !shellRij
301
+ ? { stil: true, reden: "shell_niet_aangemeld", sinds: null }
302
+ : shellLaatst && new Date(shellLaatst).getTime() < grens
303
+ ? { stil: true, reden: "shell_reageert_niet", sinds: shellLaatst }
304
+ : { stil: false, reden: null, sinds: null };
305
+ const rollen = await Promise.all(["admin", "superadmin", "developer"].map((rol) => ctx.supabase.rpc("has_role", { _user_id: ctx.userId, _role: rol }).then((x) => x.data === true)));
306
+ if (!rollen.some(Boolean))
307
+ return { ok: true, beheer: false, ...stil, installaties: [] };
308
+ const sinds = new Date(Date.now() - 7 * 86400000).toISOString();
309
+ const installaties = await Promise.all(runners.map(async (x) => {
310
+ const { count } = await db
311
+ .from("print_jobs")
312
+ .select("id", { count: "exact", head: true })
313
+ .eq("verwerkt_door_runner", x.basis_url)
314
+ .gte("created_at", sinds);
315
+ return {
316
+ adres: maskeerAdres(x.basis_url),
317
+ versie: x.module_versie,
318
+ laatstActief: x.laatst_gezien,
319
+ actief: x.actief,
320
+ isShell: !!shell && normaliseerAdres(x.basis_url) === shell,
321
+ opdrachten7d: count ?? 0,
322
+ };
323
+ }));
324
+ return { ok: true, beheer: true, ...stil, installaties };
325
+ });
@@ -3,6 +3,7 @@ interface JobVoorLabel {
3
3
  status: string;
4
4
  printnode_status?: string | null;
5
5
  foutcode?: string | null;
6
+ foutmelding?: string | null;
6
7
  }
7
8
  /** Label voor de statuskolom van de wachtrij. */
8
9
  export declare function printnodeStatusLabel(j: JobVoorLabel): string;
@@ -1 +1 @@
1
- {"version":3,"file":"printnodeStatus.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeStatus.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzD,CAAC;AAEF,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAa5D;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAsD,CAAC;AAEpF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,CAI3F;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAI/G"}
1
+ {"version":3,"file":"printnodeStatus.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeStatus.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMzD,CAAC;AAEF,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAe5D;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAsD,CAAC;AAEpF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,CAI3F;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAI/G"}
@@ -17,9 +17,11 @@ export function printnodeStatusLabel(j) {
17
17
  return "Geannuleerd";
18
18
  if (j.foutcode === "AANLEVERING_MISLUKT")
19
19
  return "Mislukt — geen document";
20
- if (j.foutcode === "FORMAAT_PAST_NIET")
20
+ // Oudere rijen hebben een andere foutcode, maar de melding begint met de code.
21
+ const fm = String(j.foutmelding ?? "");
22
+ if (j.foutcode === "FORMAAT_PAST_NIET" || fm.startsWith("FORMAAT_PAST_NIET"))
21
23
  return "Geweigerd – past niet";
22
- if (j.foutcode === "GEEN_GELADEN_ETIKET")
24
+ if (j.foutcode === "GEEN_GELADEN_ETIKET" || fm.startsWith("GEEN_GELADEN_ETIKET"))
23
25
  return "Geweigerd – geen etiket geladen";
24
26
  const pn = String(j.printnode_status ?? "").toLowerCase();
25
27
  if (pn && PRINTNODE_STATUS_LABEL[pn])
@@ -11,6 +11,18 @@ export declare function controleerSecret(request: Request, secret: string, _veld
11
11
  export declare function secretKlopt(request: Request, secret: string): boolean;
12
12
  /** Details van een geweigerde aanroep. Bevat nooit (een deel van) het geheim. */
13
13
  export declare function afwijzingDetails(request: Request): Promise<Record<string, unknown>>;
14
+ /**
15
+ * Herkent de oude verbindingstest (modules vóór 1.59.0): inhoud "[]", geen
16
+ * geheimkop en geen User-Agent. PrintNode stuurt altijd het geheim mee.
17
+ */
18
+ export declare function isOudeZelftest(d: Record<string, unknown> | null | undefined): boolean;
19
+ /** Korte, leesbare omschrijving van één vastgelegde melding (voor Details voor beheer). */
20
+ export declare function meldingWeergave(m: {
21
+ http_status: number;
22
+ soorten?: string[] | null;
23
+ gematcht?: number | null;
24
+ antwoord?: unknown;
25
+ }): string;
14
26
  /**
15
27
  * Afhandeling van een webhookaanroep. Het geheim komt uit de eigen
16
28
  * koppelingstabel (servicerol). `secretVoorTest` alleen voor tests.
@@ -1 +1 @@
1
- {"version":3,"file":"printnodeWebhook.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeWebhook.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAWxC,8EAA8E;AAC9E,eAAO,MAAM,UAAU,+BAA+B,CAAC;AAEvD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAGtC;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE;AA8BD,iFAAiF;AACjF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASzF;AASD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,EAAE,EACN,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAmFnB;AAED,2EAA2E;AAC3E,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrD"}
1
+ {"version":3,"file":"printnodeWebhook.d.ts","sourceRoot":"","sources":["../../src/lib/printnodeWebhook.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAWxC,8EAA8E;AAC9E,eAAO,MAAM,UAAU,+BAA+B,CAAC;AAEvD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAGtC;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE;AA8BD,iFAAiF;AACjF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAErF;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,CAAC,EAAE;IACjC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC9F,GAAG,MAAM,CAaT;AASD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,EAAE,EACN,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAqFnB;AAED,2EAA2E;AAC3E,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrD"}
@@ -66,6 +66,30 @@ export async function afwijzingDetails(request) {
66
66
  content_type: (request.headers.get("content-type") ?? "").slice(0, 60) || null,
67
67
  };
68
68
  }
69
+ /**
70
+ * Herkent de oude verbindingstest (modules vóór 1.59.0): inhoud "[]", geen
71
+ * geheimkop en geen User-Agent. PrintNode stuurt altijd het geheim mee.
72
+ */
73
+ export function isOudeZelftest(d) {
74
+ return !!d && d["secret_kop_aanwezig"] === false && !d["user_agent"] && Number(d["inhoud_lengte"] ?? 99) <= 2;
75
+ }
76
+ /** Korte, leesbare omschrijving van één vastgelegde melding (voor Details voor beheer). */
77
+ export function meldingWeergave(m) {
78
+ const soorten = Array.isArray(m.soorten) ? m.soorten : [];
79
+ const a = (m.antwoord && typeof m.antwoord === "object" ? m.antwoord : {});
80
+ if (m.http_status === 401) {
81
+ const d = (a["details"] && typeof a["details"] === "object" ? a["details"] : null);
82
+ if (soorten.includes("oude_zelftest") || isOudeZelftest(d)) {
83
+ return "Oude verbindingstest van een andere installatie (niet van PrintNode) — geweigerd";
84
+ }
85
+ return "Geweigerd: geheim ontbreekt of klopt niet";
86
+ }
87
+ if (m.http_status === 200 && (soorten.includes("zelftest") || soorten.length === 0))
88
+ return "Verbindingstest ✓";
89
+ if (m.http_status === 200)
90
+ return `Melding van PrintNode ✓ · ${m.gematcht ?? 0} bijgewerkt`;
91
+ return `Antwoord ${m.http_status}`;
92
+ }
69
93
  async function soortenUit(request) {
70
94
  try {
71
95
  const b = JSON.parse(await request.clone().text());
@@ -99,7 +123,9 @@ export async function behandelPrintNodeWebhook(request, db, secretVoorTest, opti
99
123
  if (!controleerSecret(request, secret).ok) {
100
124
  // Vastleggen wát er binnenkwam, zonder het geheim zelf: alleen of de kop er
101
125
  // was, hoe lang de inhoud is en welke soort melding het was.
102
- await noteer(db, { http_status: 401, soorten: await soortenUit(request), antwoord: { fout: "Ongeldig secret", details: await afwijzingDetails(request) } }, uitTabel);
126
+ const details = await afwijzingDetails(request);
127
+ const soorten401 = isOudeZelftest(details) ? ["oude_zelftest"] : await soortenUit(request);
128
+ await noteer(db, { http_status: 401, soorten: soorten401, antwoord: { fout: "Ongeldig secret", details } }, uitTabel);
103
129
  return Response.json({ ok: false, fout: "Ongeldig secret" }, { status: 401 });
104
130
  }
105
131
  // Eigen zelftest (geheim klopt): 200 + OK-kop, maar geen bewijs van PrintNode.
@@ -32,7 +32,7 @@ export function usePrintplekken() {
32
32
  ]);
33
33
  const eersteFout = p.error ?? c.error ?? r.error ?? k.error ?? t.error;
34
34
  setFout(eersteFout
35
- ? "Printplekken konden niet worden geladen. Voer sql/print-schema.sql uit in deze shell."
35
+ ? "Printplekken konden niet worden geladen. Neem contact op met Flow Selections."
36
36
  : null);
37
37
  setPlekken(arr(p.data));
38
38
  setComputers(arr(c.data));
@@ -1 +1 @@
1
- {"version":3,"file":"queueTick.d.ts","sourceRoot":"","sources":["../../src/lib/queueTick.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAiBxC;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyFzF"}
1
+ {"version":3,"file":"queueTick.d.ts","sourceRoot":"","sources":["../../src/lib/queueTick.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAiBxC;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmGzF"}
@@ -81,6 +81,15 @@ export async function behandelQueueTick(request, supabase) {
81
81
  return Response.json({ ok: false, fout: configFout }, { status: 500 });
82
82
  }
83
83
  void meldRunnerAan(supabase);
84
+ // Alleen de Shell verwerkt de printwachtrij. Andere installaties (ook
85
+ // voorbeeldomgevingen met nieuwere code) slaan over; geen stille wissel.
86
+ const { controleerShellPoort } = await import("./runnerRegistry.server.js");
87
+ const poort = await controleerShellPoort(supabase);
88
+ if (!poort.mag) {
89
+ if (poort.reden !== "niet_de_shell")
90
+ console.warn(`[printwachtrij] ${poort.tekst}`);
91
+ return Response.json({ ok: true, overgeslagen: poort.tekst, reden: poort.reden });
92
+ }
84
93
  // Lege shell: standaardlayouts aanmaken (servicerol), zodat een nieuwe klant
85
94
  // meteen kan printen zonder dat iemand een pagina opent of op een knop drukt.
86
95
  try {
@@ -6,6 +6,11 @@ export declare function eigenBasisUrl(): string | null;
6
6
  * minuten iets en laat fouten nooit doorwerken in de aanroeper.
7
7
  */
8
8
  export declare function meldRunnerAan(db: PrintDb): Promise<void>;
9
+ /**
10
+ * Mag deze installatie de printwachtrij verwerken? Alleen de Shell
11
+ * (shell_base_url uit module_runtime_config), met optioneel min_print_versie.
12
+ */
13
+ export declare function controleerShellPoort(db: PrintDb): Promise<import("./shellPoort.js").PoortUitkomst>;
9
14
  /** Controleert of de meegegeven sleutel bij een geregistreerde shell hoort. */
10
15
  export declare function isRunnerSleutel(db: PrintDb, sleutel: string): Promise<boolean>;
11
16
  //# sourceMappingURL=runnerRegistry.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runnerRegistry.server.d.ts","sourceRoot":"","sources":["../../src/lib/runnerRegistry.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD,8DAA8D;AAC9D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAS7C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC9D;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAapF"}
1
+ {"version":3,"file":"runnerRegistry.server.d.ts","sourceRoot":"","sources":["../../src/lib/runnerRegistry.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD,8DAA8D;AAC9D,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAS7C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC9D;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,OAAO,iDAcrD;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAapF"}