@flowselections/layout-maker 1.8.2 → 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 (58) hide show
  1. package/README.md +8 -1
  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/PrintersPage.d.ts.map +1 -1
  16. package/dist-lib/components/PrintersPage.js +7 -23
  17. package/dist-lib/components/WerkplekConfiguratiePage.d.ts.map +1 -1
  18. package/dist-lib/components/WerkplekConfiguratiePage.js +35 -24
  19. package/dist-lib/components/WerkplekkenTabel.d.ts +2 -2
  20. package/dist-lib/components/WerkplekkenTabel.d.ts.map +1 -1
  21. package/dist-lib/components/WerkplekkenTabel.js +4 -3
  22. package/dist-lib/index.d.ts +8 -3
  23. package/dist-lib/index.d.ts.map +1 -1
  24. package/dist-lib/index.js +9 -5
  25. package/dist-lib/integrations/supabase/auth-middleware.d.ts +491 -145
  26. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  27. package/dist-lib/integrations/supabase/client.server.d.ts +491 -145
  28. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  29. package/dist-lib/integrations/supabase/types.d.ts +505 -150
  30. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  31. package/dist-lib/lib/aiLayout.functions.d.ts +491 -145
  32. package/dist-lib/lib/aiLayout.functions.d.ts.map +1 -1
  33. package/dist-lib/lib/documentBron.d.ts +35 -0
  34. package/dist-lib/lib/documentBron.d.ts.map +1 -0
  35. package/dist-lib/lib/documentBron.js +62 -0
  36. package/dist-lib/lib/documentRoutering.d.ts +23 -0
  37. package/dist-lib/lib/documentRoutering.d.ts.map +1 -0
  38. package/dist-lib/lib/documentRoutering.js +58 -0
  39. package/dist-lib/lib/documentTypes.d.ts +54 -0
  40. package/dist-lib/lib/documentTypes.d.ts.map +1 -1
  41. package/dist-lib/lib/documentTypes.js +56 -0
  42. package/dist-lib/lib/formaatPrinters.d.ts +5 -0
  43. package/dist-lib/lib/formaatPrinters.d.ts.map +1 -1
  44. package/dist-lib/lib/formaatPrinters.js +12 -0
  45. package/dist-lib/lib/printApi.d.ts +20 -5
  46. package/dist-lib/lib/printApi.d.ts.map +1 -1
  47. package/dist-lib/lib/printApi.js +93 -32
  48. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  49. package/dist-lib/lib/printQueue.server.js +72 -1
  50. package/dist-lib/lib/printService.functions.d.ts +1964 -580
  51. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  52. package/dist-lib/lib/printerTelling.d.ts +24 -0
  53. package/dist-lib/lib/printerTelling.d.ts.map +1 -0
  54. package/dist-lib/lib/printerTelling.js +41 -0
  55. package/dist-lib/lib/useDocumentData.d.ts +4 -0
  56. package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
  57. package/dist-lib/lib/useDocumentData.js +106 -1
  58. package/package.json +7 -2
@@ -0,0 +1,62 @@
1
+ // ============================================================================
2
+ // src/lib/documentBron.ts — waar komt het document vandaan? Per documentsoort
3
+ // en per herkomst van de order (Floriday of een eigen order) kan worden gekozen
4
+ // tussen het meegestuurde externe document en een eigen ontwerp.
5
+ // ============================================================================
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { supabase } from "./supabaseClient.js";
8
+ export const HERKOMSTEN = [
9
+ { value: "floriday", label: "Floriday-order" },
10
+ { value: "eigen", label: "Eigen order" },
11
+ ];
12
+ export const BRONNEN = [
13
+ { value: "auto", label: "Automatisch" },
14
+ { value: "extern_pdf", label: "Document van Floriday" },
15
+ { value: "eigen_layout", label: "Eigen ontwerp" },
16
+ ];
17
+ const arr = (v) => (Array.isArray(v) ? v : []);
18
+ /** Alle bronregels, eventueel gefilterd op documentsoort. */
19
+ export function useBronregels(documenttype) {
20
+ const [regels, setRegels] = useState([]);
21
+ const [laden, setLaden] = useState(true);
22
+ const load = useCallback(async () => {
23
+ let query = supabase.from("document_bronregels").select("*");
24
+ if (documenttype)
25
+ query = query.eq("documenttype", documenttype);
26
+ const { data } = await query;
27
+ setRegels(arr(data));
28
+ setLaden(false);
29
+ }, [documenttype]);
30
+ useEffect(() => {
31
+ void load();
32
+ }, [load]);
33
+ return { regels, laden, reload: load };
34
+ }
35
+ /** Legt vast welke bron geldt voor een documentsoort bij een bepaalde herkomst. */
36
+ export async function zetBronregel(documenttype, herkomst, bron, layout_id) {
37
+ const { error } = await supabase.from("document_bronregels").upsert({ documenttype, herkomst, bron, layout_id: layout_id ?? null }, { onConflict: "documenttype,herkomst" });
38
+ if (error)
39
+ throw error;
40
+ }
41
+ /** Verwijdert een bronregel; daarna geldt weer het standaardgedrag. */
42
+ export async function verwijderBronregel(id) {
43
+ const { error } = await supabase.from("document_bronregels").delete().eq("id", id);
44
+ if (error)
45
+ throw error;
46
+ }
47
+ /**
48
+ * De ingestelde bron voor een documentsoort bij deze herkomst.
49
+ * Geeft `null` als er niets is ingesteld (dan geldt het standaardgedrag).
50
+ */
51
+ export async function bronVoorDocument(documenttype, herkomst) {
52
+ const h = (herkomst ?? "").trim();
53
+ if (!h)
54
+ return null;
55
+ const { data } = await supabase
56
+ .from("document_bronregels")
57
+ .select("*")
58
+ .eq("documenttype", documenttype)
59
+ .eq("herkomst", h)
60
+ .maybeSingle();
61
+ return data ?? null;
62
+ }
@@ -0,0 +1,23 @@
1
+ export interface WerkplekPrinter {
2
+ id: string;
3
+ documenttype: string;
4
+ werkplek: string;
5
+ printer_id: string | null;
6
+ papierformaat: string | null;
7
+ }
8
+ /** Alle werkplek-uitzonderingen, eventueel gefilterd op documentsoort. */
9
+ export declare function useWerkplekPrinters(documenttype?: string): {
10
+ koppelingen: WerkplekPrinter[];
11
+ laden: boolean;
12
+ reload: () => Promise<void>;
13
+ };
14
+ /** Legt vast dat een documentsoort op een werkplek naar een printer gaat. */
15
+ export declare function zetWerkplekPrinter(documenttype: string, werkplek: string, printer_id: string | null, papierformaat?: string | null): Promise<void>;
16
+ /** Verwijdert een werkplek-uitzondering. */
17
+ export declare function verwijderWerkplekPrinter(id: string): Promise<void>;
18
+ /**
19
+ * De printer die voor deze documentsoort op deze werkplek is ingesteld.
20
+ * Geeft `null` als er geen uitzondering bestaat.
21
+ */
22
+ export declare function printerVoorWerkplekDocument(documenttype: string, werkplek: string): Promise<string | null>;
23
+ //# sourceMappingURL=documentRoutering.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,58 @@
1
+ // ============================================================================
2
+ // src/lib/documentRoutering.ts — welke documentsoort gaat via welke werkplek
3
+ // naar welke printer. Uitzonderingen per werkplek staan hier; de standaard per
4
+ // documentsoort + formaat blijft in `formaatPrinters.ts`.
5
+ // ============================================================================
6
+ import { useCallback, useEffect, useState } from "react";
7
+ import { supabase } from "./supabaseClient.js";
8
+ const arr = (v) => (Array.isArray(v) ? v : []);
9
+ /** Alle werkplek-uitzonderingen, eventueel gefilterd op documentsoort. */
10
+ export function useWerkplekPrinters(documenttype) {
11
+ const [koppelingen, setKoppelingen] = useState([]);
12
+ const [laden, setLaden] = useState(true);
13
+ const load = useCallback(async () => {
14
+ let query = supabase.from("document_werkplek_printers").select("*");
15
+ if (documenttype)
16
+ query = query.eq("documenttype", documenttype);
17
+ const { data } = await query;
18
+ setKoppelingen(arr(data));
19
+ setLaden(false);
20
+ }, [documenttype]);
21
+ useEffect(() => {
22
+ void load();
23
+ }, [load]);
24
+ return { koppelingen, laden, reload: load };
25
+ }
26
+ /** Legt vast dat een documentsoort op een werkplek naar een printer gaat. */
27
+ export async function zetWerkplekPrinter(documenttype, werkplek, printer_id, papierformaat) {
28
+ const { error } = await supabase.from("document_werkplek_printers").upsert({
29
+ documenttype,
30
+ werkplek: werkplek.trim(),
31
+ printer_id,
32
+ papierformaat: papierformaat ?? null,
33
+ }, { onConflict: "documenttype,werkplek" });
34
+ if (error)
35
+ throw error;
36
+ }
37
+ /** Verwijdert een werkplek-uitzondering. */
38
+ export async function verwijderWerkplekPrinter(id) {
39
+ const { error } = await supabase.from("document_werkplek_printers").delete().eq("id", id);
40
+ if (error)
41
+ throw error;
42
+ }
43
+ /**
44
+ * De printer die voor deze documentsoort op deze werkplek is ingesteld.
45
+ * Geeft `null` als er geen uitzondering bestaat.
46
+ */
47
+ export async function printerVoorWerkplekDocument(documenttype, werkplek) {
48
+ const naam = (werkplek ?? "").trim();
49
+ if (!naam)
50
+ 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;
58
+ }
@@ -103,8 +103,62 @@ export interface LayoutModel {
103
103
  page_settings: PageSettings;
104
104
  /** documentspecifieke configuratie, opgebouwd uit het documentprofiel */
105
105
  config?: Record<string, Record<string, unknown>>;
106
+ /** herkomst van het document: "eigen" ontwerp of "floriday" */
107
+ bron?: string;
108
+ /** vaste layout die niet mag worden aangepast of verwijderd */
109
+ systeem?: boolean;
106
110
  updated_at: string;
107
111
  }
112
+ /** Is dit een vaste layout voor een document dat uit Floriday komt? */
113
+ export declare function isFloridayLayout(l: {
114
+ bron?: string | null;
115
+ systeem?: boolean | null;
116
+ }): boolean;
117
+ /** Toelichting bij een Floriday-layout. */
118
+ export declare const FLORIDAY_LAYOUT_TOELICHTING = "Document komt kant-en-klaar uit Floriday en wordt 1-op-1 afgedrukt.";
119
+ /** Vaste layouts die altijd aanwezig moeten zijn (documenten uit Floriday). */
120
+ export declare const FLORIDAY_SYSTEEM_LAYOUTS: readonly [{
121
+ readonly naam: "Afleverbrief (Floriday)";
122
+ readonly documenttype: "afleverbrief";
123
+ readonly papierformaat: "A4";
124
+ readonly breedte_mm: 210;
125
+ readonly hoogte_mm: 297;
126
+ }, {
127
+ readonly naam: "Veilingbrief (Floriday)";
128
+ readonly documenttype: "veilingbrief";
129
+ readonly papierformaat: "A4";
130
+ readonly breedte_mm: 210;
131
+ readonly hoogte_mm: 297;
132
+ }, {
133
+ readonly naam: "Sticker (Floriday)";
134
+ readonly documenttype: "sticker";
135
+ readonly papierformaat: "LABEL_100x62";
136
+ readonly breedte_mm: 100;
137
+ readonly hoogte_mm: 62;
138
+ }];
139
+ /** Toelichting bij een standaardlayout (geen Floriday-document). */
140
+ export declare const STANDAARD_LAYOUT_TOELICHTING = "Standaarddocument voor eigen orders. Volledig aanpasbaar \u2014 aanpassen kan per klant.";
141
+ /**
142
+ * Standaardlayouts die bij een verse shell altijd worden toegevoegd, los van
143
+ * Floriday. Deze zijn "eigen" (niet systeem) en dus vrij aanpasbaar/verwijderbaar.
144
+ * Het seeden gebeurt slechts één keer per shell (zie useDocumentData); als een
145
+ * gebruiker een layout verwijdert, wordt deze niet opnieuw aangemaakt.
146
+ */
147
+ export declare const STANDAARD_LAYOUTS: readonly [{
148
+ readonly naam: "Pakbon";
149
+ readonly documenttype: "pakbon";
150
+ readonly papierformaat: "A4";
151
+ readonly breedte_mm: 210;
152
+ readonly hoogte_mm: 297;
153
+ readonly omschrijving: "Standaarddocument voor eigen orders. Volledig aanpasbaar — aanpassen kan per klant.";
154
+ }, {
155
+ readonly naam: "Afleverbrief (BVO)";
156
+ readonly documenttype: "afleverbrief";
157
+ readonly papierformaat: "A4";
158
+ readonly breedte_mm: 210;
159
+ readonly hoogte_mm: 297;
160
+ readonly omschrijving: "Verzendbrief voor eigen (niet-Floriday) orders. Volledig aanpasbaar.";
161
+ }];
108
162
  export interface LayoutVariabele {
109
163
  id?: string;
110
164
  naam: string;
@@ -1 +1 @@
1
- {"version":3,"file":"documentTypes.d.ts","sourceRoot":"","sources":["../../src/lib/documentTypes.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,SAAS,GACT,cAAc,GACd,SAAS,GACT,SAAS,GACT,kBAAkB,GAClB,QAAQ,GACR,cAAc,GACd,cAAc,GACd,eAAe,GACf,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,YAAY,GACZ,cAAc,GACd,cAAc,GACd,MAAM,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAkBlE,CAAC;AAGF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,cAAc,EAAE,gBAAgB,EAU5C,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,YAAY,GACZ,MAAM,GACN,MAAM,GACN,WAAW,GACX,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,cAAc,GACd,OAAO,GACP,MAAM,GACN,cAAc,GACd,KAAK,GACL,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,YAAY,CAAC;IAC5B,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACpC,WAAW,EACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAmB1F,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,YAc7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,UAAU,EAM1C,CAAC"}
1
+ {"version":3,"file":"documentTypes.d.ts","sourceRoot":"","sources":["../../src/lib/documentTypes.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,62 @@ export const PAPIERFORMATEN = [
34
34
  { code: "LABEL_57x32", label: "Label 57 × 32 mm", breedte: 57, hoogte: 32 },
35
35
  { code: "VRIJ", label: "Vrij formaat", breedte: 210, hoogte: 297 },
36
36
  ];
37
+ /** Is dit een vaste layout voor een document dat uit Floriday komt? */
38
+ export function isFloridayLayout(l) {
39
+ return Boolean(l?.systeem) && String(l?.bron ?? "") === "floriday";
40
+ }
41
+ /** Toelichting bij een Floriday-layout. */
42
+ export const FLORIDAY_LAYOUT_TOELICHTING = "Document komt kant-en-klaar uit Floriday en wordt 1-op-1 afgedrukt.";
43
+ /** Vaste layouts die altijd aanwezig moeten zijn (documenten uit Floriday). */
44
+ export const FLORIDAY_SYSTEEM_LAYOUTS = [
45
+ {
46
+ naam: "Afleverbrief (Floriday)",
47
+ documenttype: "afleverbrief",
48
+ papierformaat: "A4",
49
+ breedte_mm: 210,
50
+ hoogte_mm: 297,
51
+ },
52
+ {
53
+ naam: "Veilingbrief (Floriday)",
54
+ documenttype: "veilingbrief",
55
+ papierformaat: "A4",
56
+ breedte_mm: 210,
57
+ hoogte_mm: 297,
58
+ },
59
+ {
60
+ naam: "Sticker (Floriday)",
61
+ documenttype: "sticker",
62
+ papierformaat: "LABEL_100x62",
63
+ breedte_mm: 100,
64
+ hoogte_mm: 62,
65
+ },
66
+ ];
67
+ /** Toelichting bij een standaardlayout (geen Floriday-document). */
68
+ export const STANDAARD_LAYOUT_TOELICHTING = "Standaarddocument voor eigen orders. Volledig aanpasbaar — aanpassen kan per klant.";
69
+ /**
70
+ * Standaardlayouts die bij een verse shell altijd worden toegevoegd, los van
71
+ * Floriday. Deze zijn "eigen" (niet systeem) en dus vrij aanpasbaar/verwijderbaar.
72
+ * Het seeden gebeurt slechts één keer per shell (zie useDocumentData); als een
73
+ * gebruiker een layout verwijdert, wordt deze niet opnieuw aangemaakt.
74
+ */
75
+ export const STANDAARD_LAYOUTS = [
76
+ {
77
+ naam: "Pakbon",
78
+ documenttype: "pakbon",
79
+ papierformaat: "A4",
80
+ breedte_mm: 210,
81
+ hoogte_mm: 297,
82
+ omschrijving: STANDAARD_LAYOUT_TOELICHTING,
83
+ },
84
+ {
85
+ naam: "Afleverbrief (BVO)",
86
+ documenttype: "afleverbrief",
87
+ papierformaat: "A4",
88
+ breedte_mm: 210,
89
+ hoogte_mm: 297,
90
+ omschrijving: "Verzendbrief voor eigen (niet-Floriday) orders. Volledig aanpasbaar.",
91
+ },
92
+ ];
37
93
  export const ELEMENT_STANDAARD = {
38
94
  tekst: { label: "Tekst", breedte: 60, hoogte: 8, content: "Nieuwe tekst" },
39
95
  veld: { label: "Databaseveld", breedte: 60, hoogte: 8, content: "{{order.nummer}}" },
@@ -11,4 +11,9 @@ export declare function useFormaatPrinters(documenttype: string): {
11
11
  export declare function zetFormaatPrinter(documenttype: string, formaat_code: string, printer_id: string | null): Promise<void>;
12
12
  /** Bepaalt welke printer bij een formaat hoort (voor automatisch afdrukken). */
13
13
  export declare function printerVoorFormaat(documenttype: string, formaat_code: string): Promise<string | null>;
14
+ /** Alle standaardkoppelingen (documentsoort + formaat), voor overzichten. */
15
+ export declare function useAlleFormaatPrinters(): {
16
+ koppelingen: FormaatPrinter[];
17
+ reload: () => Promise<void>;
18
+ };
14
19
  //# sourceMappingURL=formaatPrinters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"formaatPrinters.d.ts","sourceRoot":"","sources":["../../src/lib/formaatPrinters.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM;;;EAgBtD;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,iBAQ1B;AAED,gFAAgF;AAChF,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB"}
1
+ {"version":3,"file":"formaatPrinters.d.ts","sourceRoot":"","sources":["../../src/lib/formaatPrinters.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM;;;EAgBtD;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,IAAI,iBAQ1B;AAED,gFAAgF;AAChF,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB;;;EAarC"}
@@ -37,3 +37,15 @@ export async function printerVoorFormaat(documenttype, formaat_code) {
37
37
  .maybeSingle();
38
38
  return data?.printer_id ?? null;
39
39
  }
40
+ /** Alle standaardkoppelingen (documentsoort + formaat), voor overzichten. */
41
+ export function useAlleFormaatPrinters() {
42
+ const [koppelingen, setKoppelingen] = useState([]);
43
+ const load = useCallback(async () => {
44
+ const { data } = await supabase.from("document_formaat_printers").select("*");
45
+ setKoppelingen(arr(data));
46
+ }, []);
47
+ useEffect(() => {
48
+ void load();
49
+ }, [load]);
50
+ return { koppelingen, reload: load };
51
+ }
@@ -6,10 +6,18 @@ export interface PrintDocumentInput {
6
6
  layoutId?: string;
7
7
  /** Optioneel: specifieke printer. Anders wordt er automatisch gekozen. */
8
8
  printerId?: string;
9
+ /** Optioneel: naam van de werkplek/computer waar dit vandaan komt. */
10
+ werkplek?: string;
9
11
  /** Naam zoals die in de wachtrij verschijnt. */
10
12
  documentnaam: string;
11
13
  kopieen?: number;
12
- /** Vrije data die bij het afdrukken gebruikt wordt. */
14
+ /** Optioneel: waar de order vandaan komt ("floriday" of "eigen"). */
15
+ herkomst?: string;
16
+ /**
17
+ * Vrije data die bij het afdrukken gebruikt wordt. Geef hierin ALTIJD een
18
+ * order-kenmerk mee (`queue_item_id`, `order_id` of `ordernummer`): daarmee
19
+ * kunnen twee verschillende orders nooit als dubbele aanvraag worden gezien.
20
+ */
13
21
  payload?: Record<string, unknown>;
14
22
  isHerprint?: boolean;
15
23
  }
@@ -29,11 +37,12 @@ export declare class DubbeleAanvraagFout extends Error {
29
37
  */
30
38
  export declare function printDocument(input: PrintDocumentInput): Promise<PrintDocumentResult>;
31
39
  /**
32
- * De printer die aan een documentsoort hangt: eerst de standaard (of nieuwste
33
- * actieve) layout voor die soort, dan de printerkoppeling op die layout, anders
34
- * de koppeling op papierformaat. Geeft `null` als er niets gekoppeld is.
40
+ * De printer die aan een documentsoort hangt: eerst de uitzondering voor de
41
+ * werkplek, dan de standaard (of nieuwste actieve) layout voor die soort met
42
+ * zijn printerkoppeling, anders de koppeling op papierformaat. Geeft `null` als
43
+ * er niets gekoppeld is.
35
44
  */
36
- export declare function printerVoorDocumenttype(documenttype: DocumentType | string, papierformaat?: string): Promise<string | null>;
45
+ export declare function printerVoorDocumenttype(documenttype: DocumentType | string, papierformaat?: string, werkplek?: string): Promise<string | null>;
37
46
  export interface PrintPdfInput {
38
47
  /** Documentsoort, alleen voor overzicht en printerkeuze. */
39
48
  documenttype: DocumentType | string;
@@ -46,8 +55,12 @@ export interface PrintPdfInput {
46
55
  * layout of het papierformaat van de documentsoort.
47
56
  */
48
57
  printerId?: string;
58
+ /** Optioneel: werkplek/computernaam; bepaalt mee welke printer wordt gekozen. */
59
+ werkplek?: string;
49
60
  kopieen?: number;
50
61
  papierformaat?: string;
62
+ /** Optioneel: waar de order vandaan komt ("floriday" of "eigen"). */
63
+ herkomst?: string;
51
64
  payload?: Record<string, unknown>;
52
65
  isHerprint?: boolean;
53
66
  }
@@ -67,6 +80,8 @@ export interface PrintHtmlInput {
67
80
  /** Verplicht: zonder layout kan de wachtrij zelf geen printer afleiden. */
68
81
  printerId: string;
69
82
  kopieen?: number;
83
+ /** Optioneel: waar de order vandaan komt ("floriday" of "eigen"). */
84
+ herkomst?: string;
70
85
  payload?: Record<string, unknown>;
71
86
  isHerprint?: boolean;
72
87
  }
@@ -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":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAuGD,yEAAyE;AACzE,qBAAa,mBAAoB,SAAQ,KAAK;IACnC,IAAI,SAAyB;;CAIvC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkC3F;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,GAAG,MAAM,EACnC,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAGD,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkD/E;AAGD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,YAAY,GAAG,MAAM,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBjF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CA4BxF;AAaD,kFAAkF;AAClF,wBAAsB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM;QAQtD,MAAM;UACJ,MAAM;kBACE,MAAM;mBACL,MAAM;gBACT,MAAM;kBACJ,OAAO;KAExB;AAED,wDAAwD;AACxD,wBAAsB,mBAAmB;QAOjC,MAAM;UACJ,MAAM;WACL,MAAM;aACJ,MAAM,GAAG,IAAI;mBACP,MAAM,GAAG,IAAI;YACpB,OAAO;YACP,OAAO;KAElB"}
@@ -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"}