@flowselections/layout-maker 1.8.3 → 1.13.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 (68) hide show
  1. package/README.md +139 -132
  2. package/dist-lib/components/ComputersLijst.d.ts +2 -1
  3. package/dist-lib/components/ComputersLijst.d.ts.map +1 -1
  4. package/dist-lib/components/ComputersLijst.js +2 -2
  5. package/dist-lib/components/DocumentRouteringPage.d.ts +2 -0
  6. package/dist-lib/components/DocumentRouteringPage.d.ts.map +1 -0
  7. package/dist-lib/components/DocumentRouteringPage.js +115 -0
  8. package/dist-lib/components/LayoutsPage.d.ts.map +1 -1
  9. package/dist-lib/components/LayoutsPage.js +13 -8
  10. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  11. package/dist-lib/components/PrintQueuePage.js +16 -1
  12. package/dist-lib/components/PrintStatusBanner.d.ts +8 -0
  13. package/dist-lib/components/PrintStatusBanner.d.ts.map +1 -0
  14. package/dist-lib/components/PrintStatusBanner.js +15 -0
  15. package/dist-lib/components/PrinterSetupWizard.js +1 -1
  16. package/dist-lib/components/PrintersPage.d.ts.map +1 -1
  17. package/dist-lib/components/PrintersPage.js +7 -23
  18. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  19. package/dist-lib/components/WerkplekConfiguratiePage.js +35 -24
  20. package/dist-lib/components/WerkplekkenTabel.d.ts +2 -2
  21. package/dist-lib/components/WerkplekkenTabel.d.ts.map +1 -1
  22. package/dist-lib/components/WerkplekkenTabel.js +4 -3
  23. package/dist-lib/index.d.ts +8 -3
  24. package/dist-lib/index.d.ts.map +1 -1
  25. package/dist-lib/index.js +9 -5
  26. package/dist-lib/integrations/supabase/auth-middleware.d.ts +491 -145
  27. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  28. package/dist-lib/integrations/supabase/client.server.d.ts +491 -145
  29. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  30. package/dist-lib/integrations/supabase/types.d.ts +505 -150
  31. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  32. package/dist-lib/lib/aiLayout.functions.d.ts +491 -145
  33. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  34. package/dist-lib/lib/aiLayout.server.js +9 -9
  35. package/dist-lib/lib/browserPrint.js +5 -5
  36. package/dist-lib/lib/documentBron.d.ts +35 -0
  37. package/dist-lib/lib/documentBron.d.ts.map +1 -0
  38. package/dist-lib/lib/documentBron.js +62 -0
  39. package/dist-lib/lib/documentRoutering.d.ts +23 -0
  40. package/dist-lib/lib/documentRoutering.d.ts.map +1 -0
  41. package/dist-lib/lib/documentRoutering.js +58 -0
  42. package/dist-lib/lib/documentTypes.d.ts +54 -0
  43. package/dist-lib/lib/documentTypes.d.ts.map +1 -1
  44. package/dist-lib/lib/documentTypes.js +56 -0
  45. package/dist-lib/lib/formaatPrinters.d.ts +5 -0
  46. package/dist-lib/lib/formaatPrinters.d.ts.map +1 -1
  47. package/dist-lib/lib/formaatPrinters.js +12 -0
  48. package/dist-lib/lib/layoutPreview.js +7 -7
  49. package/dist-lib/lib/pakbonHtml.js +50 -50
  50. package/dist-lib/lib/printApi.d.ts +20 -5
  51. package/dist-lib/lib/printApi.d.ts.map +1 -1
  52. package/dist-lib/lib/printApi.js +93 -32
  53. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  54. package/dist-lib/lib/printQueue.server.js +72 -1
  55. package/dist-lib/lib/printService.functions.d.ts +1964 -580
  56. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  57. package/dist-lib/lib/printerTelling.d.ts +24 -0
  58. package/dist-lib/lib/printerTelling.d.ts.map +1 -0
  59. package/dist-lib/lib/printerTelling.js +41 -0
  60. package/dist-lib/lib/productiebonHtml.js +15 -15
  61. package/dist-lib/lib/profielHtml.js +18 -18
  62. package/dist-lib/lib/supabaseAdmin.server.d.ts +5 -5
  63. package/dist-lib/lib/supabaseAdmin.server.js +43 -43
  64. package/dist-lib/lib/testpagina.js +1 -1
  65. package/dist-lib/lib/useDocumentData.d.ts +4 -0
  66. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  67. package/dist-lib/lib/useDocumentData.js +106 -1
  68. package/package.json +6 -1
@@ -4,6 +4,8 @@
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 { bronVoorDocument } from "./documentBron.js";
7
9
  const arr = (v) => (Array.isArray(v) ? v : []);
8
10
  /** Zoekt de te gebruiken layout: expliciet, anders standaard, anders de nieuwste. */
9
11
  async function bepaalLayout(documenttype, layoutId) {
@@ -25,16 +27,26 @@ async function bepaalLayout(documenttype, layoutId) {
25
27
  .limit(1);
26
28
  return arr(data)[0] ?? null;
27
29
  }
28
- /** Kiest een printer: koppeling op layout, anders koppeling op formaat. */
29
- async function bepaalPrinter(documenttype, layoutId, papierformaat) {
30
- const { data: mappings } = await supabase
31
- .from("printer_mappings")
32
- .select("printer_id, prioriteit")
33
- .eq("layout_id", layoutId)
34
- .order("prioriteit");
35
- const viaLayout = arr(mappings)[0]?.printer_id;
36
- if (viaLayout)
37
- return viaLayout;
30
+ /**
31
+ * Kiest een printer: uitzondering voor de werkplek, anders koppeling op layout,
32
+ * anders koppeling op documentsoort + formaat.
33
+ */
34
+ async function bepaalPrinter(documenttype, layoutId, papierformaat, werkplek) {
35
+ if (werkplek) {
36
+ const viaWerkplek = await printerVoorWerkplekDocument(documenttype, werkplek);
37
+ if (viaWerkplek)
38
+ return viaWerkplek;
39
+ }
40
+ if (layoutId) {
41
+ const { data: mappings } = await supabase
42
+ .from("printer_mappings")
43
+ .select("printer_id, prioriteit")
44
+ .eq("layout_id", layoutId)
45
+ .order("prioriteit");
46
+ const viaLayout = arr(mappings)[0]?.printer_id;
47
+ if (viaLayout)
48
+ return viaLayout;
49
+ }
38
50
  if (papierformaat) {
39
51
  const { data } = await supabase
40
52
  .from("document_formaat_printers")
@@ -48,6 +60,29 @@ async function bepaalPrinter(documenttype, layoutId, papierformaat) {
48
60
  }
49
61
  return null;
50
62
  }
63
+ /**
64
+ * Kenmerk waarmee de wachtrij twee opdrachten van elkaar kan onderscheiden.
65
+ * Aanleverende modules horen altijd een order-kenmerk mee te geven
66
+ * (`queue_item_id`, `order_id` of `ordernummer` in de payload); zonder zo'n
67
+ * kenmerk valt de dubbelbescherming terug op het document zelf.
68
+ */
69
+ function orderKenmerk(payload) {
70
+ const p = payload ?? {};
71
+ for (const sleutel of ["queue_item_id", "order_id", "ordernummer", "order_number", "orderId"]) {
72
+ const w = p[sleutel];
73
+ if (typeof w === "string" && w.trim())
74
+ return w.trim();
75
+ if (typeof w === "number" && Number.isFinite(w))
76
+ return String(w);
77
+ }
78
+ return null;
79
+ }
80
+ function waarschuwZonderKenmerk(documentnaam, payload) {
81
+ if (orderKenmerk(payload))
82
+ return;
83
+ console.warn(`[layout-maker] Printopdracht "${documentnaam}" heeft geen order-kenmerk in de payload ` +
84
+ `(queue_item_id / order_id / ordernummer). De dubbelbescherming valt terug op het document zelf.`);
85
+ }
51
86
  /** Rij in de wachtrij zetten. Geeft null als de dubbelbeveiliging hem tegenhield. */
52
87
  async function zetInWachtrij(rij) {
53
88
  const { data, error } = await supabase
@@ -76,18 +111,26 @@ export class DubbeleAanvraagFout extends Error {
76
111
  * modules binnen dezelfde shell en database.
77
112
  */
78
113
  export async function printDocument(input) {
79
- const layout = await bepaalLayout(input.documenttype, input.layoutId);
114
+ const regel = await bronVoorDocument(input.documenttype, input.herkomst);
115
+ const layoutKeuze = input.layoutId ?? (regel?.bron === "eigen_layout" ? (regel.layout_id ?? undefined) : undefined);
116
+ const layout = await bepaalLayout(input.documenttype, layoutKeuze);
80
117
  if (!layout)
81
118
  throw new Error(`Geen layout gevonden voor documenttype "${input.documenttype}"`);
82
119
  const printerId = input.printerId ??
83
- (await bepaalPrinter(input.documenttype, layout.id, layout.papierformaat ?? null));
120
+ (await bepaalPrinter(input.documenttype, layout.id, layout.papierformaat ?? null, input.werkplek ?? null));
121
+ waarschuwZonderKenmerk(input.documentnaam, input.payload);
84
122
  const jobId = await zetInWachtrij({
85
123
  layout_id: layout.id,
86
124
  printer_id: printerId,
87
125
  documenttype: input.documenttype,
88
126
  documentnaam: input.documentnaam,
89
127
  kopieen: input.kopieen ?? 1,
90
- payload: input.payload ?? {},
128
+ payload: {
129
+ ...(input.payload ?? {}),
130
+ ...(input.werkplek ? { werkplek: input.werkplek } : {}),
131
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
132
+ },
133
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
91
134
  is_herprint: input.isHerprint ?? false,
92
135
  });
93
136
  if (!jobId)
@@ -95,24 +138,14 @@ export async function printDocument(input) {
95
138
  return { jobId, layoutId: layout.id, printerId };
96
139
  }
97
140
  /**
98
- * De printer die aan een documentsoort hangt: eerst de standaard (of nieuwste
99
- * actieve) layout voor die soort, dan de printerkoppeling op die layout, anders
100
- * de koppeling op papierformaat. Geeft `null` als er niets gekoppeld is.
141
+ * De printer die aan een documentsoort hangt: eerst de uitzondering voor de
142
+ * werkplek, dan de standaard (of nieuwste actieve) layout voor die soort met
143
+ * zijn printerkoppeling, anders de koppeling op papierformaat. Geeft `null` als
144
+ * er niets gekoppeld is.
101
145
  */
102
- export async function printerVoorDocumenttype(documenttype, papierformaat) {
146
+ export async function printerVoorDocumenttype(documenttype, papierformaat, werkplek) {
103
147
  const layout = await bepaalLayout(documenttype);
104
- if (!layout) {
105
- if (!papierformaat)
106
- return null;
107
- const { data } = await supabase
108
- .from("document_formaat_printers")
109
- .select("printer_id")
110
- .eq("documenttype", documenttype)
111
- .eq("formaat_code", papierformaat)
112
- .maybeSingle();
113
- return data?.printer_id ?? null;
114
- }
115
- return bepaalPrinter(documenttype, layout.id, papierformaat ?? layout.papierformaat ?? null);
148
+ return bepaalPrinter(documenttype, layout?.id ?? null, papierformaat ?? layout?.papierformaat ?? null, werkplek ?? null);
116
149
  }
117
150
  /**
118
151
  * Print een kant-en-klare PDF (klantsticker, Floriday-document, factuur van een
@@ -123,18 +156,41 @@ export async function printPdf(input) {
123
156
  const base64 = (input.pdfBase64 ?? "").replace(/^data:application\/pdf;base64,/i, "").trim();
124
157
  if (!base64 && !input.pdfUrl)
125
158
  throw new Error("Geef een PDF mee via pdfBase64 of pdfUrl.");
159
+ // Is ingesteld dat deze herkomst altijd een eigen ontwerp krijgt, dan wordt de
160
+ // meegestuurde PDF genegeerd en het document zelf opgemaakt.
161
+ const regel = await bronVoorDocument(input.documenttype, input.herkomst);
162
+ if (regel?.bron === "eigen_layout") {
163
+ const res = await printDocument({
164
+ documenttype: input.documenttype,
165
+ documentnaam: input.documentnaam,
166
+ layoutId: regel.layout_id ?? undefined,
167
+ printerId: input.printerId,
168
+ werkplek: input.werkplek,
169
+ kopieen: input.kopieen,
170
+ herkomst: input.herkomst,
171
+ payload: input.payload,
172
+ isHerprint: input.isHerprint,
173
+ });
174
+ return { jobId: res.jobId };
175
+ }
126
176
  const printerId = input.printerId ??
127
- (await printerVoorDocumenttype(input.documenttype, input.papierformaat));
177
+ (await printerVoorDocumenttype(input.documenttype, input.papierformaat, input.werkplek));
128
178
  if (!printerId) {
129
179
  throw new Error(`Geen printer gekoppeld voor ${input.documenttype} — stel dit in bij Layouts en printers.`);
130
180
  }
181
+ waarschuwZonderKenmerk(input.documentnaam, input.payload);
131
182
  const jobId = await zetInWachtrij({
132
183
  layout_id: null,
133
184
  printer_id: printerId,
134
185
  documenttype: input.documenttype,
135
186
  documentnaam: input.documentnaam,
136
187
  kopieen: input.kopieen ?? 1,
137
- payload: input.payload ?? {},
188
+ payload: {
189
+ ...(input.payload ?? {}),
190
+ ...(input.werkplek ? { werkplek: input.werkplek } : {}),
191
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
192
+ },
193
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
138
194
  is_herprint: input.isHerprint ?? false,
139
195
  ...(base64 ? { pdf_base64: base64 } : {}),
140
196
  ...(input.pdfUrl ? { pdf_url: input.pdfUrl } : {}),
@@ -152,13 +208,18 @@ export async function printHtml(input) {
152
208
  throw new Error("Er is geen opmaak meegegeven.");
153
209
  if (!input.printerId)
154
210
  throw new Error("Kies een printer: een HTML-opdracht heeft geen layout.");
211
+ waarschuwZonderKenmerk(input.documentnaam, input.payload);
155
212
  const jobId = await zetInWachtrij({
156
213
  layout_id: null,
157
214
  printer_id: input.printerId,
158
215
  documenttype: input.documenttype,
159
216
  documentnaam: input.documentnaam,
160
217
  kopieen: input.kopieen ?? 1,
161
- payload: input.payload ?? {},
218
+ payload: {
219
+ ...(input.payload ?? {}),
220
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
221
+ },
222
+ ...(input.herkomst ? { herkomst: input.herkomst } : {}),
162
223
  is_herprint: input.isHerprint ?? false,
163
224
  render_html: input.html,
164
225
  });
@@ -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;AAc5D,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;AAeD,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAqC9D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;AAqED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoHzF;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AA6ID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wEAAwE;AACxE,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBtF"}
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;AAc5D,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;AAeD,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AA8E9D;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BnF;AAmFD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAoHzF;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AAyKD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wEAAwE;AACxE,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmBtF"}
@@ -76,6 +76,46 @@ async function zoekLayout(db, job) {
76
76
  .limit(1);
77
77
  return { layout: (arr(data)[0] ?? null), expliciet: false };
78
78
  }
79
+ /**
80
+ * De bronregel voor deze documentsoort en de herkomst van de order. Geeft
81
+ * `null` als er niets is ingesteld; dan geldt het standaardgedrag.
82
+ */
83
+ async function zoekBronregel(db, job) {
84
+ const payload = (job.payload ?? {});
85
+ const herkomst = String(job.herkomst ?? payload?.["herkomst"] ?? "").trim();
86
+ if (!herkomst)
87
+ return null;
88
+ const { data } = await db
89
+ .from("document_bronregels")
90
+ .select("bron, layout_id")
91
+ .eq("documenttype", job.documenttype)
92
+ .eq("herkomst", herkomst)
93
+ .maybeSingle();
94
+ const regel = data;
95
+ if (!regel || regel.bron === "auto")
96
+ return null;
97
+ if (regel.bron === "eigen_layout" && regel.layout_id && !job.layout_id) {
98
+ job.layout_id = regel.layout_id;
99
+ }
100
+ return regel.bron;
101
+ }
102
+ /**
103
+ * Is aan deze opdracht een vaste Floriday-layout gekoppeld? Zulke layouts zijn
104
+ * geen ontwerp maar een verwijzing naar het document dat Floriday aanlevert.
105
+ */
106
+ async function isFloridayLayoutKeuze(db, job) {
107
+ const payload = (job.payload ?? {});
108
+ const id = job.layout_id ?? payload?.["layoutId"] ?? payload?.["layout_id"] ?? null;
109
+ if (!id)
110
+ return false;
111
+ const { data } = await db
112
+ .from("document_layouts")
113
+ .select("systeem, bron")
114
+ .eq("id", id)
115
+ .maybeSingle();
116
+ const l = data;
117
+ return Boolean(l?.systeem) && String(l?.bron ?? "") === "floriday";
118
+ }
79
119
  /**
80
120
  * Haalt een kant-en-klare PDF van de opdracht op (klantstickers, standaard
81
121
  * Floriday-documenten). Die gaat ongewijzigd naar de printer.
@@ -126,6 +166,19 @@ async function zoekPrinter(db, job, layout) {
126
166
  let printer = await pak(job.printer_id);
127
167
  if (printer)
128
168
  return printer;
169
+ // Uitzondering voor de werkplek waar de opdracht vandaan komt.
170
+ const werkplek = String(job.payload?.werkplek ?? "").trim();
171
+ if (werkplek) {
172
+ const { data: wp } = await db
173
+ .from("document_werkplek_printers")
174
+ .select("printer_id")
175
+ .eq("documenttype", job.documenttype)
176
+ .eq("werkplek", werkplek)
177
+ .maybeSingle();
178
+ printer = await pak(wp?.printer_id);
179
+ if (printer)
180
+ return printer;
181
+ }
129
182
  if (layout?.id) {
130
183
  const { data } = await db
131
184
  .from("printer_mappings")
@@ -344,8 +397,26 @@ async function verwerkJob(db, job) {
344
397
  await log(db, job.id, "overgeslagen", "Stond al bij de printer.");
345
398
  return "verstuurd";
346
399
  }
347
- // 1) Kant-en-klare PDF (klantsticker, Floriday-document) gaat ongewijzigd door.
400
+ // 1) Bronregel: bepaalt of het meegestuurde document wordt gebruikt of dat
401
+ // er altijd een eigen ontwerp wordt opgemaakt.
402
+ let bron = await zoekBronregel(db, job);
403
+ // 1b) Is er een vaste Floriday-layout gekozen? Die staat alleen voor het
404
+ // kant-en-klare document uit Floriday: dat gaat 1-op-1 naar de printer.
405
+ if (await isFloridayLayoutKeuze(db, job)) {
406
+ bron = "extern_pdf";
407
+ job.layout_id = null;
408
+ }
409
+ if (bron === "eigen_layout") {
410
+ job.pdf_base64 = null;
411
+ job.pdf_url = null;
412
+ }
413
+ // 2) Kant-en-klare PDF (klantsticker, Floriday-document) gaat ongewijzigd door.
348
414
  const klaar = await kantEnKlarePdf(db, job);
415
+ if (!klaar && bron === "extern_pdf") {
416
+ await mislukt(db, job, "Floriday-document ontbreekt: voor dit document is ingesteld dat het " +
417
+ "aangeleverde document wordt gebruikt, maar er is geen PDF meegestuurd.", true);
418
+ return "mislukt";
419
+ }
349
420
  const keuze = klaar ? { layout: null, expliciet: false } : await zoekLayout(db, job);
350
421
  const layout = keuze.layout;
351
422
  const printer = await zoekPrinter(db, job, layout);