@flowselections/floriday-afhandeling-module 1.0.32 → 1.0.33

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 (63) hide show
  1. package/dist-lib/components/afhandeling/AutoProcessStatus.js +1 -1
  2. package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts +6 -6
  3. package/dist-lib/components/afhandeling/ControleLijstPrint.d.ts.map +1 -1
  4. package/dist-lib/components/afhandeling/ControleLijstPrint.js +73 -48
  5. package/dist-lib/components/afhandeling/ControlePage.d.ts.map +1 -1
  6. package/dist-lib/components/afhandeling/ControlePage.js +25 -5
  7. package/dist-lib/components/afhandeling/DagDetailDialog.d.ts.map +1 -1
  8. package/dist-lib/components/afhandeling/DagDetailDialog.js +48 -24
  9. package/dist-lib/components/afhandeling/WeekAgendaView.d.ts.map +1 -1
  10. package/dist-lib/components/afhandeling/WeekAgendaView.js +16 -5
  11. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts +10 -0
  12. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.d.ts.map +1 -0
  13. package/dist-lib/components/afhandeling/WerkplekWaarschuwing.js +28 -0
  14. package/dist-lib/components/pickstation/PakbonTemplate.js +70 -70
  15. package/dist-lib/components/pickstation/printDocuments.d.ts +9 -2
  16. package/dist-lib/components/pickstation/printDocuments.d.ts.map +1 -1
  17. package/dist-lib/components/pickstation/printDocuments.js +8 -52
  18. package/dist-lib/components/settings/AfhandelingSettingsCard.d.ts.map +1 -1
  19. package/dist-lib/components/settings/AfhandelingSettingsCard.js +12 -1
  20. package/dist-lib/hooks/useEngineTasks.js +1 -1
  21. package/dist-lib/hooks/useOrderPlanning.d.ts.map +1 -1
  22. package/dist-lib/hooks/useOrderPlanning.js +32 -14
  23. package/dist-lib/integrations/supabase/auth-middleware.d.ts +18 -13
  24. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
  25. package/dist-lib/integrations/supabase/client.server.d.ts +18 -13
  26. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
  27. package/dist-lib/integrations/supabase/{client.d.ts → moduleClient.d.ts} +20 -14
  28. package/dist-lib/integrations/supabase/moduleClient.d.ts.map +1 -0
  29. package/dist-lib/integrations/supabase/moduleClient.js +38 -0
  30. package/dist-lib/integrations/supabase/types.d.ts +19 -14
  31. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  32. package/dist-lib/integrations/supabase/types.js +3 -0
  33. package/dist-lib/lib/afhandelingSettings.functions.d.ts +36 -26
  34. package/dist-lib/lib/afhandelingSettings.functions.d.ts.map +1 -1
  35. package/dist-lib/lib/carrierSignupMail.server.js +26 -26
  36. package/dist-lib/lib/carriers.functions.d.ts +90 -65
  37. package/dist-lib/lib/carriers.functions.d.ts.map +1 -1
  38. package/dist-lib/lib/cartAssignments.functions.d.ts +90 -65
  39. package/dist-lib/lib/cartAssignments.functions.d.ts.map +1 -1
  40. package/dist-lib/lib/cartControl.functions.d.ts +180 -130
  41. package/dist-lib/lib/cartControl.functions.d.ts.map +1 -1
  42. package/dist-lib/lib/deliveryNotePrint.d.ts +14 -6
  43. package/dist-lib/lib/deliveryNotePrint.d.ts.map +1 -1
  44. package/dist-lib/lib/deliveryNotePrint.js +61 -14
  45. package/dist-lib/lib/floriday.functions.d.ts +18 -13
  46. package/dist-lib/lib/floriday.functions.d.ts.map +1 -1
  47. package/dist-lib/lib/floridayAutoProcess.js +1 -1
  48. package/dist-lib/lib/logisticsEngine/capacity.js +1 -1
  49. package/dist-lib/lib/logisticsEngine/emitQueue.d.ts +20 -0
  50. package/dist-lib/lib/logisticsEngine/emitQueue.d.ts.map +1 -0
  51. package/dist-lib/lib/logisticsEngine/emitQueue.js +88 -0
  52. package/dist-lib/lib/logisticsEngine/engine.js +1 -1
  53. package/dist-lib/lib/logisticsEngine/reschedule.js +1 -1
  54. package/dist-lib/lib/logisticsEngine/staffPlanning.js +1 -1
  55. package/dist-lib/lib/printing.d.ts +56 -0
  56. package/dist-lib/lib/printing.d.ts.map +1 -0
  57. package/dist-lib/lib/printing.js +209 -0
  58. package/package.json +3 -1
  59. package/dist-lib/integrations/supabase/auth-attacher.d.ts +0 -2
  60. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +0 -1
  61. package/dist-lib/integrations/supabase/auth-attacher.js +0 -12
  62. package/dist-lib/integrations/supabase/client.d.ts.map +0 -1
  63. package/dist-lib/integrations/supabase/client.js +0 -13
@@ -0,0 +1,88 @@
1
+ // Begrensde meldlus richting de Logistics Engine.
2
+ //
3
+ // Zonder begrenzing werd elke wachtende order bij elke render/verversing
4
+ // opnieuw gemeld: 148 orders = 148 RPC-calls per paginabezoek, eindeloos
5
+ // herhaald en zonder zichtbare melding als het bleef mislukken.
6
+ //
7
+ // Regels:
8
+ // - elke order krijgt hooguit MAX_ATTEMPTS pogingen;
9
+ // - tussen pogingen geldt exponentiële backoff;
10
+ // - per ronde worden hooguit MAX_PER_ROUND orders gemeld;
11
+ // - na de laatste mislukte poging geven we definitief op, zichtbaar in de UI.
12
+ /** Maximaal aantal meldingen per ronde (per paginabezoek/verversing). */
13
+ export const MAX_PER_ROUND = 10;
14
+ /** Maximaal aantal pogingen per order voordat we definitief opgeven. */
15
+ export const MAX_ATTEMPTS = 4;
16
+ const BACKOFF_MS = [30000, 2 * 60000, 10 * 60000, 30 * 60000];
17
+ const registry = new Map();
18
+ const inFlight = new Set();
19
+ function stateFor(ref) {
20
+ let s = registry.get(ref);
21
+ if (!s) {
22
+ s = { attempts: 0, nextAttemptAt: 0, done: false, gaveUp: false };
23
+ registry.set(ref, s);
24
+ }
25
+ return s;
26
+ }
27
+ /** Mag deze order nu gemeld worden? */
28
+ export function mayEmit(ref, now = Date.now()) {
29
+ const s = stateFor(ref);
30
+ if (s.done || s.gaveUp || inFlight.has(ref))
31
+ return false;
32
+ return now >= s.nextAttemptAt;
33
+ }
34
+ /** Selecteer maximaal MAX_PER_ROUND refs die nu aan de beurt zijn. */
35
+ export function selectEmitBatch(refs, now = Date.now()) {
36
+ const batch = [];
37
+ for (const ref of refs) {
38
+ if (batch.length >= MAX_PER_ROUND)
39
+ break;
40
+ if (mayEmit(ref, now))
41
+ batch.push(ref);
42
+ }
43
+ return batch;
44
+ }
45
+ export function markInFlight(ref) {
46
+ inFlight.add(ref);
47
+ }
48
+ export function markResult(ref, ok, error) {
49
+ inFlight.delete(ref);
50
+ const s = stateFor(ref);
51
+ if (ok) {
52
+ s.done = true;
53
+ s.gaveUp = false;
54
+ s.lastError = undefined;
55
+ return;
56
+ }
57
+ s.attempts += 1;
58
+ s.lastError = error;
59
+ if (s.attempts >= MAX_ATTEMPTS) {
60
+ s.gaveUp = true;
61
+ s.nextAttemptAt = Number.POSITIVE_INFINITY;
62
+ }
63
+ else {
64
+ s.nextAttemptAt = Date.now() + (BACKOFF_MS[s.attempts - 1] ?? 30 * 60000);
65
+ }
66
+ }
67
+ export function emitQueueStatus(refs) {
68
+ const gaveUp = [];
69
+ let lastError = null;
70
+ for (const ref of refs) {
71
+ const s = registry.get(ref);
72
+ if (s?.gaveUp) {
73
+ gaveUp.push(ref);
74
+ if (s.lastError)
75
+ lastError = s.lastError;
76
+ }
77
+ }
78
+ return { gaveUp, lastError };
79
+ }
80
+ /** Handmatig opnieuw proberen (bv. na een knop in de UI). */
81
+ export function resetEmitQueue(refs) {
82
+ if (!refs) {
83
+ registry.clear();
84
+ return;
85
+ }
86
+ for (const ref of refs)
87
+ registry.delete(ref);
88
+ }
@@ -4,7 +4,7 @@
4
4
  * Deze module beslist zelf niets meer over buffering, belading, picken of
5
5
  * transport. Alle besluiten komen van de Rule Engine (stap 3 "Order picken").
6
6
  */
7
- import { supabase } from "../../integrations/supabase/client";
7
+ import { supabase } from "../../integrations/supabase/moduleClient";
8
8
  export const OWNER_MODULE = "afhandeling";
9
9
  export const SOURCE_MODULE = "afhandeling";
10
10
  /** Vraag het indelingsbesluit op. Nooit zelf indelen zonder dit besluit. */
@@ -2,7 +2,7 @@
2
2
  * Order verzetten — uitsluitend via de twee RPC's van de Logistics Engine.
3
3
  * Deze module rekent zelf niets uit en doet nooit een eigen UPDATE.
4
4
  */
5
- import { supabase } from "../../integrations/supabase/client";
5
+ import { supabase } from "../../integrations/supabase/moduleClient";
6
6
  export async function previewReschedule(input) {
7
7
  const { data, error } = await supabase.rpc("logistics_reschedule_preview", {
8
8
  p_order_ref: input.orderRef,
@@ -1,4 +1,4 @@
1
- import { supabase } from "../../integrations/supabase/client";
1
+ import { supabase } from "../../integrations/supabase/moduleClient";
2
2
  import { SOURCE_MODULE } from "./engine";
3
3
  export function toDateKey(d) {
4
4
  const m = String(d.getMonth() + 1).padStart(2, "0");
@@ -0,0 +1,56 @@
1
+ export declare const WERKPLEK_STORAGE_KEY = "afhandeling.werkplek";
2
+ /** Documentsoorten die deze module aanbiedt. */
3
+ export type AfhandelingDocumenttype = "pakbon" | "controlelijst" | "afleverbrief" | "veilingbrief";
4
+ export declare class GeenWerkplekFout extends Error {
5
+ constructor();
6
+ }
7
+ export declare class GeenPrinterFout extends Error {
8
+ readonly werkplek: string;
9
+ readonly papierformaat: string;
10
+ constructor(werkplek: string, papierformaat: string);
11
+ }
12
+ export declare class PrintApiNietBeschikbaarFout extends Error {
13
+ constructor(fn: string);
14
+ }
15
+ export declare function getWerkplek(): string | null;
16
+ export declare function setWerkplek(werkplek: string): void;
17
+ /** True zodra de shell een layout-maker met de volledige print-API levert. */
18
+ export declare function printApiBeschikbaar(): Promise<boolean>;
19
+ /** Zoekt de printer die bij de ingestelde werkplek en het papierformaat hoort. */
20
+ export declare function resolvePrinter(papierformaat?: string): Promise<string>;
21
+ export interface JobStatus {
22
+ status: string;
23
+ foutmelding?: string | null;
24
+ }
25
+ /** Volgt een printopdracht tot voltooid; gooit met de wachtrijfout bij mislukt. */
26
+ export declare function wachtOpJob(jobId: string): Promise<void>;
27
+ export interface PrintOpties {
28
+ documenttype: AfhandelingDocumenttype;
29
+ documentnaam: string;
30
+ isHerprint?: boolean;
31
+ papierformaat?: string;
32
+ /** Wacht tot de opdracht daadwerkelijk geprint is (standaard aan). */
33
+ volgStatus?: boolean;
34
+ }
35
+ /** Print een externe PDF (afleverbrief, veilingbrief) via de wachtrij. */
36
+ export declare function printPdfDocument(opties: PrintOpties & {
37
+ pdfBase64: string;
38
+ }): Promise<string>;
39
+ /** Print zelf opgemaakte HTML (controlelijst) via de wachtrij. */
40
+ export declare function printHtmlDocument(opties: PrintOpties & {
41
+ html: string;
42
+ }): Promise<string>;
43
+ /**
44
+ * Print een document met een centraal ontwerp (pakbon). De wachtrij kiest
45
+ * zelf de actieve layout én de bijbehorende printer.
46
+ */
47
+ export declare function printLayoutDocument(opties: {
48
+ documenttype: AfhandelingDocumenttype;
49
+ documentnaam: string;
50
+ payload: Record<string, unknown>;
51
+ isHerprint?: boolean;
52
+ volgStatus?: boolean;
53
+ }): Promise<string>;
54
+ /** Nederlandse melding voor een printfout. */
55
+ export declare function printFoutMelding(err: unknown): string;
56
+ //# sourceMappingURL=printing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printing.d.ts","sourceRoot":"","sources":["../../src/lib/printing.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAE3D,gDAAgD;AAChD,MAAM,MAAM,uBAAuB,GAC/B,QAAQ,GACR,eAAe,GACf,cAAc,GACd,cAAc,CAAC;AAEnB,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,qBAAa,eAAgB,SAAQ,KAAK;aACZ,QAAQ,EAAE,MAAM;aAAkB,aAAa,EAAE,MAAM;gBAAvD,QAAQ,EAAE,MAAM,EAAkB,aAAa,EAAE,MAAM;CAIpF;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,EAAE,EAAE,MAAM;CAMvB;AAMD,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAQ3C;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CASlD;AAqBD,8EAA8E;AAC9E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAMD,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,aAAa,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1E;AAMD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,mFAAmF;AACnF,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC7D;AAWD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,uBAAuB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,0EAA0E;AAC1E,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,kEAAkE;AAClE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,YAAY,EAAE,uBAAuB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlB;AAMD,8CAA8C;AAC9C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAcrD"}
@@ -0,0 +1,209 @@
1
+ // Centrale printlaag: alle printacties van deze module lopen via de
2
+ // print-API van @flowselections/layout-maker. Geen verborgen iframes,
3
+ // geen browser-printdialoog, geen directe writes naar print_jobs.
4
+ export const WERKPLEK_STORAGE_KEY = "afhandeling.werkplek";
5
+ export class GeenWerkplekFout extends Error {
6
+ constructor() {
7
+ super("Geen werkplek ingesteld — stel de werkplek in bij Instellingen.");
8
+ this.name = "GeenWerkplekFout";
9
+ }
10
+ }
11
+ export class GeenPrinterFout extends Error {
12
+ constructor(werkplek, papierformaat) {
13
+ super(`Geen printer gekoppeld aan deze werkplek (${werkplek}, ${papierformaat}).`);
14
+ this.werkplek = werkplek;
15
+ this.papierformaat = papierformaat;
16
+ this.name = "GeenPrinterFout";
17
+ }
18
+ }
19
+ export class PrintApiNietBeschikbaarFout extends Error {
20
+ constructor(fn) {
21
+ super(`De printservice mist functie "${fn}". Werk @flowselections/layout-maker bij in de shell.`);
22
+ this.name = "PrintApiNietBeschikbaarFout";
23
+ }
24
+ }
25
+ // --------------------------------------------------------------------------
26
+ // Werkplek
27
+ // --------------------------------------------------------------------------
28
+ export function getWerkplek() {
29
+ if (typeof window === "undefined")
30
+ return null;
31
+ try {
32
+ const v = window.localStorage.getItem(WERKPLEK_STORAGE_KEY);
33
+ return v && v.trim() ? v.trim() : null;
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ export function setWerkplek(werkplek) {
40
+ if (typeof window === "undefined")
41
+ return;
42
+ try {
43
+ const v = werkplek.trim();
44
+ if (v)
45
+ window.localStorage.setItem(WERKPLEK_STORAGE_KEY, v);
46
+ else
47
+ window.localStorage.removeItem(WERKPLEK_STORAGE_KEY);
48
+ }
49
+ catch {
50
+ // negeren: printen faalt dan met een duidelijke melding
51
+ }
52
+ }
53
+ let apiPromise = null;
54
+ async function loadPrintApi() {
55
+ apiPromise ?? (apiPromise = import("@flowselections/layout-maker"));
56
+ return apiPromise;
57
+ }
58
+ async function apiFn(naam) {
59
+ const api = await loadPrintApi();
60
+ const fn = api[naam];
61
+ if (typeof fn !== "function")
62
+ throw new PrintApiNietBeschikbaarFout(naam);
63
+ return fn;
64
+ }
65
+ /** True zodra de shell een layout-maker met de volledige print-API levert. */
66
+ export async function printApiBeschikbaar() {
67
+ try {
68
+ const api = await loadPrintApi();
69
+ return ["printPdf", "printHtml", "printerVoorWerkplek"].every((n) => typeof api[n] === "function");
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ // --------------------------------------------------------------------------
76
+ // Printer bepalen
77
+ // --------------------------------------------------------------------------
78
+ /** Zoekt de printer die bij de ingestelde werkplek en het papierformaat hoort. */
79
+ export async function resolvePrinter(papierformaat = "A4") {
80
+ const werkplek = getWerkplek();
81
+ if (!werkplek)
82
+ throw new GeenWerkplekFout();
83
+ const printerVoorWerkplek = await apiFn("printerVoorWerkplek");
84
+ const printerId = await printerVoorWerkplek(werkplek, papierformaat);
85
+ if (!printerId)
86
+ throw new GeenPrinterFout(werkplek, papierformaat);
87
+ return printerId;
88
+ }
89
+ /** Volgt een printopdracht tot voltooid; gooit met de wachtrijfout bij mislukt. */
90
+ export async function wachtOpJob(jobId) {
91
+ let volg = null;
92
+ try {
93
+ volg = await apiFn("volgJobStatus");
94
+ }
95
+ catch {
96
+ // Oudere layout-maker zonder statusfeed: opdracht staat in de wachtrij.
97
+ return;
98
+ }
99
+ await new Promise((resolve, reject) => {
100
+ let klaar = false;
101
+ const stop = (unsub) => {
102
+ if (typeof unsub === "function") {
103
+ try {
104
+ unsub();
105
+ }
106
+ catch {
107
+ // negeren
108
+ }
109
+ }
110
+ };
111
+ const unsub = volg(jobId, (s) => {
112
+ if (klaar)
113
+ return;
114
+ const status = (s?.status ?? "").toLowerCase();
115
+ if (status === "voltooid" || status === "gereed" || status === "klaar") {
116
+ klaar = true;
117
+ stop(unsub);
118
+ resolve();
119
+ }
120
+ else if (status === "mislukt" || status === "fout" || status === "geannuleerd") {
121
+ klaar = true;
122
+ stop(unsub);
123
+ reject(new Error(s?.foutmelding || "De printer meldde een fout."));
124
+ }
125
+ });
126
+ // Veiligheidsklep: na 2 minuten niet blijven wachten.
127
+ setTimeout(() => {
128
+ if (klaar)
129
+ return;
130
+ klaar = true;
131
+ stop(unsub);
132
+ resolve();
133
+ }, 120000);
134
+ });
135
+ }
136
+ // --------------------------------------------------------------------------
137
+ // Printacties
138
+ // --------------------------------------------------------------------------
139
+ function stripDataPrefix(base64) {
140
+ const idx = base64.indexOf("base64,");
141
+ return idx >= 0 ? base64.slice(idx + 7) : base64;
142
+ }
143
+ /** Print een externe PDF (afleverbrief, veilingbrief) via de wachtrij. */
144
+ export async function printPdfDocument(opties) {
145
+ const printerId = await resolvePrinter(opties.papierformaat ?? "A4");
146
+ const printPdf = await apiFn("printPdf");
147
+ const res = await printPdf({
148
+ documenttype: opties.documenttype,
149
+ documentnaam: opties.documentnaam,
150
+ pdfBase64: stripDataPrefix(opties.pdfBase64),
151
+ printerId,
152
+ isHerprint: opties.isHerprint ?? false,
153
+ });
154
+ if (opties.volgStatus !== false)
155
+ await wachtOpJob(res.jobId);
156
+ return res.jobId;
157
+ }
158
+ /** Print zelf opgemaakte HTML (controlelijst) via de wachtrij. */
159
+ export async function printHtmlDocument(opties) {
160
+ const printerId = await resolvePrinter(opties.papierformaat ?? "A4");
161
+ const printHtml = await apiFn("printHtml");
162
+ const res = await printHtml({
163
+ documenttype: opties.documenttype,
164
+ documentnaam: opties.documentnaam,
165
+ html: opties.html,
166
+ printerId,
167
+ isHerprint: opties.isHerprint ?? false,
168
+ });
169
+ if (opties.volgStatus !== false)
170
+ await wachtOpJob(res.jobId);
171
+ return res.jobId;
172
+ }
173
+ /**
174
+ * Print een document met een centraal ontwerp (pakbon). De wachtrij kiest
175
+ * zelf de actieve layout én de bijbehorende printer.
176
+ */
177
+ export async function printLayoutDocument(opties) {
178
+ const printDocument = await apiFn("printDocument");
179
+ const res = await printDocument({
180
+ documenttype: opties.documenttype,
181
+ documentnaam: opties.documentnaam,
182
+ payload: opties.payload,
183
+ isHerprint: opties.isHerprint ?? false,
184
+ });
185
+ if (opties.volgStatus !== false)
186
+ await wachtOpJob(res.jobId);
187
+ return res.jobId;
188
+ }
189
+ // --------------------------------------------------------------------------
190
+ // Meldingen
191
+ // --------------------------------------------------------------------------
192
+ /** Nederlandse melding voor een printfout. */
193
+ export function printFoutMelding(err) {
194
+ if (err instanceof GeenWerkplekFout) {
195
+ return "Geen werkplek ingesteld — stel de werkplek in bij Instellingen.";
196
+ }
197
+ if (err instanceof GeenPrinterFout) {
198
+ return `Geen printer gekoppeld aan deze werkplek (${err.werkplek}).`;
199
+ }
200
+ if (err instanceof PrintApiNietBeschikbaarFout)
201
+ return err.message;
202
+ const naam = err?.name ?? "";
203
+ if (naam === "DubbeleAanvraagFout") {
204
+ return "Dit document is al aangevraagd — gebruik 'Opnieuw printen' om het toch te printen.";
205
+ }
206
+ if (err instanceof Error)
207
+ return err.message;
208
+ return "Printen mislukt.";
209
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/floriday-afhandeling-module",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -34,12 +34,14 @@
34
34
  },
35
35
  "peerDependencies": {
36
36
  "@flowselections/core": "*",
37
+ "@flowselections/layout-maker": ">=1.7.3",
37
38
  "@tanstack/react-query": "^5",
38
39
  "react": "^18 || ^19",
39
40
  "react-dom": "^18 || ^19"
40
41
  },
41
42
  "dependencies": {
42
43
  "@ai-sdk/openai-compatible": "^3.0.9",
44
+ "@flowselections/layout-maker": "^1.7.3",
43
45
  "@supabase/supabase-js": "^2.110.8",
44
46
  "ai": "^7.0.26"
45
47
  },
@@ -1,2 +0,0 @@
1
- export declare const attachSupabaseAuth: import("@tanstack/start-client-core").FunctionMiddlewareAfterClient<{}, unknown, undefined, undefined, undefined>;
2
- //# sourceMappingURL=auth-attacher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-attacher.d.ts","sourceRoot":"","sources":["../../../src/integrations/supabase/auth-attacher.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,kBAAkB,mHAQ9B,CAAA"}
@@ -1,12 +0,0 @@
1
- // This file is automatically generated. Do not edit it directly.
2
- import { createMiddleware } from '@tanstack/react-start';
3
- import { supabase } from './client';
4
- // Must be registered as a global `functionMiddleware` in `src/start.ts`; otherwise
5
- // the browser never attaches the bearer token to serverFn RPCs.
6
- export const attachSupabaseAuth = createMiddleware({ type: 'function' }).client(async ({ next }) => {
7
- const { data } = await supabase.auth.getSession();
8
- const token = data.session?.access_token;
9
- return next({
10
- headers: token ? { Authorization: `Bearer ${token}` } : {},
11
- });
12
- });