@flowselections/layout-maker 1.53.4 → 1.55.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 (41) hide show
  1. package/dist-lib/components/LivePrintstatusRegel.d.ts.map +1 -1
  2. package/dist-lib/components/LivePrintstatusRegel.js +17 -7
  3. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  4. package/dist-lib/components/PrintQueuePage.js +22 -6
  5. package/dist-lib/components/TestprintDialog.d.ts.map +1 -1
  6. package/dist-lib/components/TestprintDialog.js +3 -2
  7. package/dist-lib/index.d.ts +2 -1
  8. package/dist-lib/index.d.ts.map +1 -1
  9. package/dist-lib/index.js +1 -0
  10. package/dist-lib/integrations/supabase/types.d.ts +84 -0
  11. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  12. package/dist-lib/lib/foutTekst.d.ts +2 -0
  13. package/dist-lib/lib/foutTekst.d.ts.map +1 -1
  14. package/dist-lib/lib/foutTekst.js +13 -1
  15. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  16. package/dist-lib/lib/orderData.server.js +31 -3
  17. package/dist-lib/lib/pakbonHtml.d.ts +2 -0
  18. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  19. package/dist-lib/lib/pakbonHtml.js +23 -4
  20. package/dist-lib/lib/printApi.d.ts +20 -0
  21. package/dist-lib/lib/printApi.d.ts.map +1 -1
  22. package/dist-lib/lib/printApi.js +19 -0
  23. package/dist-lib/lib/printQueue.server.d.ts +11 -2
  24. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  25. package/dist-lib/lib/printQueue.server.js +78 -19
  26. package/dist-lib/lib/printService.functions.d.ts +16 -0
  27. package/dist-lib/lib/printService.functions.d.ts.map +1 -1
  28. package/dist-lib/lib/printService.functions.js +7 -1
  29. package/dist-lib/lib/printnodeStatus.d.ts +2 -0
  30. package/dist-lib/lib/printnodeStatus.d.ts.map +1 -1
  31. package/dist-lib/lib/printnodeStatus.js +6 -0
  32. package/dist-lib/lib/printnodeWebhook.d.ts +9 -8
  33. package/dist-lib/lib/printnodeWebhook.d.ts.map +1 -1
  34. package/dist-lib/lib/printnodeWebhook.js +84 -58
  35. package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts +35 -0
  36. package/dist-lib/lib/printnodeWebhookBeheer.server.d.ts.map +1 -1
  37. package/dist-lib/lib/printnodeWebhookBeheer.server.js +103 -2
  38. package/dist-lib/lib/printnodeWebhookRoute.d.ts +2 -0
  39. package/dist-lib/lib/printnodeWebhookRoute.d.ts.map +1 -0
  40. package/dist-lib/lib/printnodeWebhookRoute.js +5 -0
  41. package/package.json +13 -1
@@ -2,6 +2,8 @@ export interface DubbelOrigineel {
2
2
  jobId: string | null;
3
3
  printerId: string | null;
4
4
  aangemaaktOp: string | null;
5
+ /** Status van de bestaande opdracht (indien bekend). */
6
+ status?: string | null;
5
7
  }
6
8
  /**
7
9
  * Herkent een geweigerd dubbel origineel (één origineel per kar per
@@ -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;CAC7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAiBxE;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,SAAoB,GAAG,MAAM,CAyB7E"}
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"}
@@ -18,6 +18,7 @@ export function leesDubbelOrigineel(err) {
18
18
  jobId: d["job_id"] ?? null,
19
19
  printerId: d["printer_id"] ?? null,
20
20
  aangemaaktOp: d["created_at"] ?? null,
21
+ status: d["status"] ?? null,
21
22
  };
22
23
  }
23
24
  catch {
@@ -49,5 +50,16 @@ export function leesbareFout(err, prefix = "Opslaan mislukt") {
49
50
  return `${prefix}: de gekozen printer of plek bestaat niet (meer).`;
50
51
  if (/failed to fetch|network/i.test(msg))
51
52
  return `${prefix}: geen verbinding met de server.`;
52
- return msg ? `${prefix}: ${msg.replace(/^[A-Z_]+:\s*/, "")}` : prefix;
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).`;
53
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAwBtD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAMA;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7E,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA6arB;AA+DD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhG"}
1
+ {"version":3,"file":"orderData.server.d.ts","sourceRoot":"","sources":["../../src/lib/orderData.server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAwBtD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKvD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAC7C,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAMA;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7E,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CA+arB;AAyFD;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGhG"}
@@ -424,7 +424,36 @@ export async function laadPakbonData(db, opties) {
424
424
  : 0;
425
425
  return maakProduct(r, num(r["quantity"]), fusten, num(r["plants_per_crate"]));
426
426
  });
427
- return { ...maakKopsecties(orders, scope), karren, producten: losseRegels };
427
+ const kop = maakKopsecties(orders, scope);
428
+ await vulKlantEnAdres(db, orders, kop);
429
+ return { ...kop, karren, producten: losseRegels };
430
+ }
431
+ /** Klant, klantnummer en afleveradres uit de klantkaart (match op customer_id). */
432
+ async function vulKlantEnAdres(db, orders, kop) {
433
+ const ids = uniek(orders.map((o) => o["customer_id"]));
434
+ const klant = (kop["klant"] ?? {});
435
+ klant["nummer"] = "";
436
+ if (ids.length !== 1)
437
+ return;
438
+ const c = await veilig(() => db
439
+ .from("customers")
440
+ .select("customer_number, company_name, contact_person, phone, email, street, house_number, address, address_line1, postal_code, city, country")
441
+ .eq("id", ids[0])
442
+ .maybeSingle());
443
+ if (!c)
444
+ return;
445
+ const t = (v) => (v == null ? "" : String(v).trim());
446
+ klant["nummer"] = t(c["customer_number"]);
447
+ if (!t(klant["naam"]))
448
+ klant["naam"] = t(c["company_name"]);
449
+ klant["contact"] = t(c["contact_person"]);
450
+ const straat = t(c["street"]) ? [t(c["street"]), t(c["house_number"])].filter(Boolean).join(" ") : t(c["address_line1"]) || t(c["address"]);
451
+ kop["afleveradres"] = {
452
+ naam: t(c["company_name"]) || t(klant["naam"]),
453
+ adres: straat,
454
+ plaats: [t(c["postal_code"]), t(c["city"])].filter(Boolean).join(" "),
455
+ land: t(c["country"]),
456
+ };
428
457
  }
429
458
  /**
430
459
  * Kopsecties bij één of meerdere orders. Conservatief: bij meerdere orders
@@ -464,7 +493,6 @@ function datumTekst(waarde) {
464
493
  function maakKopsecties(orders, scope) {
465
494
  const nummers = uniek(orders.map((o) => o["order_number"]));
466
495
  const klanten = uniek(orders.map((o) => o["customer_name"]));
467
- const klantIds = uniek(orders.map((o) => o["customer_id"]));
468
496
  const eerste = orders[0] ?? {};
469
497
  const meer = orders.length > 1;
470
498
  const lijst = (v) => (v.length > 4 ? `${v.slice(0, 4).join(", ")} +${v.length - 4}` : v.join(", "));
@@ -481,7 +509,7 @@ function maakKopsecties(orders, scope) {
481
509
  },
482
510
  klant: {
483
511
  naam: klanten.length === 1 ? klanten[0] : klanten.length ? `Meerdere klanten (${klanten.length})` : "",
484
- nummer: klantIds.length === 1 ? klantIds[0] : "",
512
+ nummer: "", // nooit het interne id; ingevuld uit de klantkaart
485
513
  referentie: lijst(nummers),
486
514
  },
487
515
  };
@@ -47,6 +47,8 @@ export declare function esc(v: unknown): string;
47
47
  * afdrukt.
48
48
  */
49
49
  export declare function maakPakbonOrder(input: unknown): PakbonOrder;
50
+ /** Een technische code (uuid) wordt nooit aan de klant getoond. */
51
+ export declare function zonderUuid(waarde: unknown): string;
50
52
  /** Bouwt alleen de inhoud (zonder <html>-wrapper) van de pakbon. */
51
53
  export declare function renderPakbonBody(config: PakbonConfig | unknown, order: PakbonOrder, opties?: PakbonRenderOpties): string;
52
54
  /** Bouwt een volledig printbaar HTML-document van de pakbon. */
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAyBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAMzB,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAyBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AA4rBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAyDR;AAgBD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAkFR;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAsCN;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf"}
1
+ {"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EAyBL,KAAK,SAAS,EAEd,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAMzB,2FAA2F;AAC3F,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAWD,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKtC;AAyBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AA4ED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGlD;AAsoBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAyDR;AAgBD,gEAAgE;AAChE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAkFR;AAED,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,WAAW,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,IAAI,CAsCN;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -202,8 +202,15 @@ function colgroupHtml(kols) {
202
202
  const b = kolBreedtes(kols);
203
203
  return `<colgroup>${b.map((w) => `<col style="width:${w.toFixed(4)}%">`).join("")}</colgroup>`;
204
204
  }
205
+ const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i;
206
+ /** Een technische code (uuid) wordt nooit aan de klant getoond. */
207
+ export function zonderUuid(waarde) {
208
+ const t = waarde == null ? "" : String(waarde).trim();
209
+ return UUID_RE.test(t) ? "" : t;
210
+ }
205
211
  function rij(label, waarde) {
206
- if (waarde === null || waarde === undefined || waarde === "")
212
+ waarde = zonderUuid(waarde);
213
+ if (waarde === "")
207
214
  return "";
208
215
  return `<div class="kv"><span class="k">${esc(label)}</span><span class="v">${esc(waarde)}</span></div>`;
209
216
  }
@@ -519,7 +526,19 @@ function scheidingHtml(modus) {
519
526
  return `<div class="balk"></div>`;
520
527
  return "";
521
528
  }
529
+ const KOP_BLOKKEN = new Set([
530
+ "bedrijfsgegevens", "klantgegevens", "afleveradres", "factuuradres", "orderinformatie", "transportinformatie",
531
+ ]);
532
+ /** Laat een kopblok weg als er niets in staat (geen lege kop). */
522
533
  function sectieHtml(s, order, zoek, opties) {
534
+ const html = sectieHtmlRuw(s, order, zoek, opties);
535
+ if (!KOP_BLOKKEN.has(String(s.type)))
536
+ return html;
537
+ const zonderTitel = html.replace(titelHtml(s), "");
538
+ const tekst = zonderTitel.replace(/<[^>]*>/g, "").replace(/&nbsp;|\s|·/g, "");
539
+ return tekst ? html : "";
540
+ }
541
+ function sectieHtmlRuw(s, order, zoek, opties) {
523
542
  switch (s.type) {
524
543
  case "logo": {
525
544
  const logoId = typeof s.opties?.["logoId"] === "string" ? String(s.opties["logoId"]) : null;
@@ -549,7 +568,7 @@ function sectieHtml(s, order, zoek, opties) {
549
568
  ].join(""));
550
569
  case "klantgegevens":
551
570
  return (titelHtml(s) +
552
- `<div class="vet">${esc(order.klant.naam)}</div>` +
571
+ `<div class="vet">${esc(zonderUuid(order.klant.naam))}</div>` +
553
572
  (opt(s, "toonKlantnummer", true) ? rij("Klantnummer", order.klant.nummer) : "") +
554
573
  (opt(s, "toonContact", true) ? rij("Contact", order.klant.contact) : "") +
555
574
  (opt(s, "toonReferentie", true) ? rij("Referentie", order.klant.referentie) : ""));
@@ -557,8 +576,8 @@ function sectieHtml(s, order, zoek, opties) {
557
576
  case "factuuradres": {
558
577
  const a = s.type === "afleveradres" ? order.afleveradres : order.factuuradres;
559
578
  return (titelHtml(s) +
560
- `<div class="vet">${esc(a.naam)}</div><div>${esc(a.adres)}</div><div>${esc(a.plaats)}</div>` +
561
- (opt(s, "toonLand", true) ? `<div>${esc(a.land)}</div>` : ""));
579
+ [a.naam, a.adres, a.plaats].map((v, i) => (zonderUuid(v) ? `<div${i === 0 ? ' class="vet"' : ""}>${esc(zonderUuid(v))}</div>` : "")).join("") +
580
+ (opt(s, "toonLand", true) && zonderUuid(a.land) ? `<div>${esc(a.land)}</div>` : ""));
562
581
  }
563
582
  case "orderinformatie":
564
583
  return (titelHtml(s) +
@@ -47,8 +47,28 @@ export declare class DubbelOrigineelFout extends Error {
47
47
  readonly bestaandJobId: string | null;
48
48
  readonly printerId: string | null;
49
49
  readonly aangemaaktOp: string | null;
50
+ readonly status: string | null;
50
51
  constructor(d: DubbelOrigineel);
51
52
  }
53
+ /** Resultaat van layout_print_document (SQL/RPC). */
54
+ export interface LayoutPrintDocumentRij {
55
+ job_id: string;
56
+ printer_id: string | null;
57
+ bestaand: boolean;
58
+ status: "wachtend" | "bezig" | "voltooid" | "mislukt" | "verlopen" | "geannuleerd" | string;
59
+ mislukt: boolean;
60
+ fout_code: string | null;
61
+ fout_bericht: string | null;
62
+ }
63
+ /** Fout als een herhaalsleutel naar een eerdere, mislukte opdracht wijst. */
64
+ export declare class EerdereOpdrachtMisluktFout extends Error {
65
+ readonly rij: LayoutPrintDocumentRij;
66
+ name: string;
67
+ readonly code = "EERDERE_OPDRACHT_MISLUKT";
68
+ constructor(rij: LayoutPrintDocumentRij);
69
+ }
70
+ /** Geeft de rij terug, of gooit als een bestaande opdracht mislukt/verlopen/geannuleerd is. */
71
+ export declare function controleerLayoutPrintRij(data: unknown): LayoutPrintDocumentRij;
52
72
  export interface MisluktePrintopdrachtInput {
53
73
  documenttype: DocumentType | string;
54
74
  documentnaam: 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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"}
@@ -122,8 +122,27 @@ export class DubbelOrigineelFout extends Error {
122
122
  this.bestaandJobId = d.jobId;
123
123
  this.printerId = d.printerId;
124
124
  this.aangemaaktOp = d.aangemaaktOp;
125
+ this.status = d.status ?? null;
125
126
  }
126
127
  }
128
+ /** Fout als een herhaalsleutel naar een eerdere, mislukte opdracht wijst. */
129
+ export class EerdereOpdrachtMisluktFout extends Error {
130
+ constructor(rij) {
131
+ super(`De eerdere opdracht met deze herhaalsleutel (${rij.job_id}) is ${rij.status}${rij.fout_bericht ? `: ${rij.fout_bericht}` : ""}. Gebruik een nieuwe sleutel om opnieuw te printen.`);
132
+ this.rij = rij;
133
+ this.name = "EerdereOpdrachtMisluktFout";
134
+ this.code = "EERDERE_OPDRACHT_MISLUKT";
135
+ }
136
+ }
137
+ /** Geeft de rij terug, of gooit als een bestaande opdracht mislukt/verlopen/geannuleerd is. */
138
+ export function controleerLayoutPrintRij(data) {
139
+ const rij = (Array.isArray(data) ? data[0] : data);
140
+ if (!rij?.job_id)
141
+ throw new Error("Geen opdracht teruggekregen.");
142
+ if (rij.bestaand && rij.mislukt)
143
+ throw new EerdereOpdrachtMisluktFout(rij);
144
+ return rij;
145
+ }
127
146
  /**
128
147
  * Legt een opdracht vast waarvan het document niet gemaakt kon worden
129
148
  * (bijv. een verzendbrief). Hij staat dan als "mislukt" met de reden in de
@@ -31,7 +31,7 @@ export type LayoutKeuze = {
31
31
  ontwerpWint: boolean;
32
32
  };
33
33
  /** Waar de uiteindelijke opmaak vandaan kwam (uitkomst, geen invoer). */
34
- export type GebruikteBron = "extern_pdf" | "eigen_layout" | "render_html" | "klantlayout";
34
+ export type GebruikteBron = "extern_pdf" | "eigen_layout" | "render_html" | "klantlayout" | "floriday_1op1";
35
35
  /** Meelifter waarin `bouwHtml` vastlegt welke bron het uiteindelijk werd. */
36
36
  export type BronUitkomst = {
37
37
  bron: GebruikteBron;
@@ -40,11 +40,20 @@ export type BronUitkomst = {
40
40
  export declare function normaliseerDocumenttype(type: unknown): string;
41
41
  /** Het layout-id zoals de Engine het aanlevert (kolom of payload). */
42
42
  export declare function leesEngineLayoutId(job: Job): string;
43
+ /**
44
+ * Herkent een ondertekende downloadlink naar de EIGEN bestandsopslag (adres
45
+ * uit de omgeving, niets vast in code) en geeft map + pad terug. Zo werkt een
46
+ * herprint ook als de link (1 uur geldig) al verlopen is.
47
+ */
48
+ export declare function eigenOpslagPad(url: string, eigenBasis: string | undefined): {
49
+ bucket: string;
50
+ pad: string;
51
+ } | null;
43
52
  /**
44
53
  * Haalt een kant-en-klare PDF van de opdracht op (klantstickers, standaard
45
54
  * Floriday-documenten). Die gaat ongewijzigd naar de printer.
46
55
  */
47
- export declare function kantEnKlarePdf(_db: PrintDb, job: Job): Promise<string | null>;
56
+ export declare function kantEnKlarePdf(db: PrintDb, job: Job): Promise<string | null>;
48
57
  /**
49
58
  * Bouwt de HTML van de opdracht.
50
59
  * Volgorde: gekoppelde layout wint > meegestuurde HTML > actieve layout van
@@ -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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"}
@@ -366,29 +366,70 @@ async function zoekBronregel(db, job) {
366
366
  * geen ontwerp maar een verwijzing naar het document dat Floriday aanlevert.
367
367
  */
368
368
  async function isFloridayLayoutKeuze(db, job) {
369
+ // Geldt ook voor Engine-opdrachten: een Floriday-layout is geen ontwerp maar
370
+ // de opdracht "druk het aangeleverde Floriday-document 1-op-1 af".
369
371
  const payload = (job.payload ?? {});
370
- if (isEngineOpdracht(job))
371
- return false;
372
372
  const id = job.layout_id ?? payload?.["layoutId"] ?? payload?.["layout_id"] ?? null;
373
373
  if (!id)
374
374
  return false;
375
375
  const { data } = await db
376
376
  .from("document_layouts")
377
- .select("systeem, bron")
377
+ .select("bron")
378
378
  .eq("id", id)
379
379
  .maybeSingle();
380
380
  const l = data;
381
- return Boolean(l?.systeem) && String(l?.bron ?? "") === "floriday";
381
+ return String(l?.bron ?? "") === "floriday";
382
+ }
383
+ /**
384
+ * Herkent een ondertekende downloadlink naar de EIGEN bestandsopslag (adres
385
+ * uit de omgeving, niets vast in code) en geeft map + pad terug. Zo werkt een
386
+ * herprint ook als de link (1 uur geldig) al verlopen is.
387
+ */
388
+ export function eigenOpslagPad(url, eigenBasis) {
389
+ if (!eigenBasis)
390
+ return null;
391
+ let u, b;
392
+ try {
393
+ u = new URL(url);
394
+ b = new URL(eigenBasis);
395
+ }
396
+ catch {
397
+ return null;
398
+ }
399
+ if (u.host !== b.host)
400
+ return null;
401
+ const m = u.pathname.match(/^\/storage\/v1\/object\/(?:sign|public|authenticated)\/([^/]+)\/(.+)$/);
402
+ if (!m)
403
+ return null;
404
+ return { bucket: decodeURIComponent(m[1]), pad: decodeURIComponent(m[2]) };
405
+ }
406
+ function blijvendeOpslag(job) {
407
+ const p = (job.payload ?? {});
408
+ const o = p["pdf_opslag"];
409
+ if (o && typeof o["bucket"] === "string" && typeof o["pad"] === "string") {
410
+ return { bucket: String(o["bucket"]), pad: String(o["pad"]) };
411
+ }
412
+ return null;
382
413
  }
383
414
  /**
384
415
  * Haalt een kant-en-klare PDF van de opdracht op (klantstickers, standaard
385
416
  * Floriday-documenten). Die gaat ongewijzigd naar de printer.
386
417
  */
387
- export async function kantEnKlarePdf(_db, job) {
418
+ export async function kantEnKlarePdf(db, job) {
388
419
  const direct = typeof job.pdf_base64 === "string" ? job.pdf_base64.trim() : "";
389
420
  if (direct.length > 100)
390
421
  return direct.replace(/^data:application\/pdf;base64,/i, "");
391
422
  const url = typeof job.pdf_url === "string" ? job.pdf_url.trim() : "";
423
+ const opslag = blijvendeOpslag(job) ??
424
+ (url ? eigenOpslagPad(url, process.env.SUPABASE_URL ?? process.env.VITE_SUPABASE_URL) : null);
425
+ if (opslag) {
426
+ const { data, error } = await db
427
+ .storage.from(opslag.bucket).download(opslag.pad);
428
+ if (error || !data) {
429
+ throw new PdfRenderFout("mislukt", `Floriday-document niet gevonden in de opslag (${opslag.bucket}): ${error?.message ?? "leeg bestand"}`);
430
+ }
431
+ return naarPdfBase64(new Uint8Array(await data.arrayBuffer()));
432
+ }
392
433
  if (!url)
393
434
  return null;
394
435
  if (!/^https?:\/\//i.test(url)) {
@@ -399,12 +440,15 @@ export async function kantEnKlarePdf(_db, job) {
399
440
  try {
400
441
  const res = await fetch(url, { signal: afbreken });
401
442
  if (!res.ok)
402
- throw new Error(`PDF ophalen mislukte (${res.status}).`);
443
+ throw new Error(`link verlopen of niet bereikbaar (HTTP ${res.status})`);
403
444
  bytes = new Uint8Array(await res.arrayBuffer());
404
445
  }
405
446
  catch (e) {
406
447
  throw new PdfRenderFout("mislukt", `De kant-en-klare PDF kon niet worden opgehaald: ${e instanceof Error ? e.message : "onbekend"}`);
407
448
  }
449
+ return naarPdfBase64(bytes);
450
+ }
451
+ function naarPdfBase64(bytes) {
408
452
  const kop = String.fromCharCode(...bytes.slice(0, 5));
409
453
  if (!kop.startsWith("%PDF")) {
410
454
  throw new GeenDocumentFout("Het opgehaalde bestand is geen PDF.");
@@ -1203,18 +1247,30 @@ async function verwerkJob(db, job) {
1203
1247
  let bron = await zoekBronregel(db, job);
1204
1248
  // 1b) Legacy Floriday-keuze; Engine-opdrachten volgen uitsluitend hun
1205
1249
  // eigen layout_id en worden nooit teruggezet naar een externe PDF.
1206
- if (!isEngineOpdracht(job) && await isFloridayLayoutKeuze(db, job)) {
1250
+ const floriday = await isFloridayLayoutKeuze(db, job);
1251
+ if (floriday) {
1207
1252
  bron = "extern_pdf";
1208
1253
  job.layout_id = null;
1209
1254
  }
1210
- if (bron === "eigen_layout" || isEngineOpdracht(job)) {
1255
+ if (!floriday && (bron === "eigen_layout" || isEngineOpdracht(job))) {
1211
1256
  job.pdf_base64 = null;
1212
1257
  job.pdf_url = null;
1213
1258
  }
1214
- // 2) Kant-en-klare PDF gaat alleen buiten het Engine-contract ongewijzigd
1215
- // door. De Engine bepaalt altijd de layout, ook als er een PDF aanwezig is.
1216
- const klaar = isEngineOpdracht(job) ? null : await kantEnKlarePdf(db, job);
1217
- if (!klaar && bron === "extern_pdf" && !isEngineOpdracht(job)) {
1259
+ // 2) Kant-en-klare PDF gaat ongewijzigd door. Bij een Floriday-layout ook
1260
+ // voor de Engine; anders bepaalt de Engine altijd de layout.
1261
+ let klaar = null;
1262
+ if (floriday || !isEngineOpdracht(job)) {
1263
+ try {
1264
+ klaar = await kantEnKlarePdf(db, job);
1265
+ }
1266
+ catch (e) {
1267
+ if (!floriday)
1268
+ throw e;
1269
+ await mislukt(db, job, `Floriday-document kon niet worden opgehaald: ${e instanceof Error ? e.message : "onbekend"}`, true);
1270
+ return "mislukt";
1271
+ }
1272
+ }
1273
+ if (!klaar && bron === "extern_pdf" && (floriday || !isEngineOpdracht(job))) {
1218
1274
  await mislukt(db, job, "Floriday-document ontbreekt: voor dit document is ingesteld dat het " +
1219
1275
  "aangeleverde document wordt gebruikt, maar er is geen PDF meegestuurd.", true);
1220
1276
  return "mislukt";
@@ -1238,7 +1294,7 @@ async function verwerkJob(db, job) {
1238
1294
  }
1239
1295
  // Uitkomst van de opmaakkeuze; wordt na verzending vastgelegd naast de
1240
1296
  // aangeleverde invoer, zodat achteraf zichtbaar is wat er gekozen is.
1241
- const uitkomst = { bron: "extern_pdf" };
1297
+ const uitkomst = { bron: floriday ? "floriday_1op1" : "extern_pdf" };
1242
1298
  let pdfBase64 = klaar;
1243
1299
  if (!pdfBase64) {
1244
1300
  const html = await bouwHtml(db, job, keuze, uitkomst);
@@ -1291,7 +1347,7 @@ async function verwerkJob(db, job) {
1291
1347
  printer_id: printer.id,
1292
1348
  // layout_id blijft de aangeleverde invoer en wordt bewust niet
1293
1349
  // overschreven met de uitkomst.
1294
- gebruikte_layout_id: uitkomst.bron === "extern_pdf" ? null : (layout?.id ?? null),
1350
+ gebruikte_layout_id: uitkomst.bron === "extern_pdf" || uitkomst.bron === "floriday_1op1" ? null : (layout?.id ?? null),
1295
1351
  gebruikte_bron: uitkomst.bron,
1296
1352
  extern_job_id: externJobId,
1297
1353
  printnode_status: "new",
@@ -1387,7 +1443,9 @@ async function synchroniseerStatussen(db) {
1387
1443
  const { data } = await db
1388
1444
  .from("print_jobs")
1389
1445
  .select("id, extern_job_id, pogingen, opgepakt_op")
1390
- .eq("status", "bezig")
1446
+ // Ook "voltooid" bij verzending maar nog zonder eindstatus van PrintNode
1447
+ // (bijv. een gemiste webhookmelding), hooguit 2 dagen terug.
1448
+ .or(`status.eq.bezig,and(status.eq.voltooid,printnode_status.in.(new,sent_to_client,queued),created_at.gt.${new Date(Date.now() - 2 * 864e5).toISOString()})`)
1391
1449
  .not("extern_job_id", "is", null)
1392
1450
  .order("created_at", { ascending: true })
1393
1451
  .limit(STATUS_MAX_PER_RONDE);
@@ -1622,16 +1680,17 @@ export async function bepaalDocumentKeuze(db, job) {
1622
1680
  let bron = await zoekBronregel(db, job);
1623
1681
  // Engine-opdrachten houden hun eigen layout_id; nooit vervangen door een
1624
1682
  // Floriday-PDF-keuze.
1625
- if (!isEngineOpdracht(job) && (await isFloridayLayoutKeuze(db, job))) {
1683
+ const floriday = await isFloridayLayoutKeuze(db, job);
1684
+ if (floriday) {
1626
1685
  bron = "extern_pdf";
1627
1686
  job.layout_id = null;
1628
1687
  }
1629
- if (bron === "eigen_layout" || isEngineOpdracht(job)) {
1688
+ if (!floriday && (bron === "eigen_layout" || isEngineOpdracht(job))) {
1630
1689
  job.pdf_base64 = null;
1631
1690
  job.pdf_url = null;
1632
1691
  }
1633
- const klaar = isEngineOpdracht(job) ? null : await kantEnKlarePdf(db, job);
1634
- if (!klaar && bron === "extern_pdf" && !isEngineOpdracht(job)) {
1692
+ const klaar = floriday || !isEngineOpdracht(job) ? await kantEnKlarePdf(db, job) : null;
1693
+ if (!klaar && bron === "extern_pdf" && (floriday || !isEngineOpdracht(job))) {
1635
1694
  throw new GeenDocumentFout("Voor dit document is ingesteld dat het aangeleverde document wordt " +
1636
1695
  "gebruikt, maar er is geen PDF meegestuurd.");
1637
1696
  }
@@ -133,7 +133,23 @@ export declare const webhookStatus: import("@tanstack/start-client-core").Option
133
133
  userId: string;
134
134
  claims: import("@supabase/auth-js").JwtPayload;
135
135
  }, undefined, undefined, undefined>], undefined, Promise<{
136
+ meldingen: {
137
+ ontvangen_op: string;
138
+ http_status: number;
139
+ soorten: string[];
140
+ printnode_ids: string[];
141
+ gematcht: number;
142
+ niet_gematcht: string[];
143
+ }[];
136
144
  aan: boolean;
145
+ weergave: "aan" | "uit" | "onbekend";
146
+ nietBereikbaar: boolean;
147
+ pnUrl: string | null;
148
+ pnGeslaagd: number | null;
149
+ pnMislukt: number | null;
150
+ pnOntvangen: number | null;
151
+ pnWeggegooid: number | null;
152
+ pnOpgehaaldOp: string | null;
137
153
  url: string | null;
138
154
  fout: string | null;
139
155
  melding: string | null;
@@ -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;;;;iFAevB,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,cAAc;;;;8CAED;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;GAyDvC,CAAC;AAEL,qDAAqD;AACrD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;GAUtB,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;;;;iFAevB,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"}
@@ -239,7 +239,13 @@ export const webhookStatus = createServerFn({ method: "POST" })
239
239
  try {
240
240
  const { supabaseAdmin } = await import("../integrations/supabase/client.server.js");
241
241
  const { leesKoppeling, veiligeStatus } = await import("./printnodeWebhookBeheer.server.js");
242
- return { ok: true, ...veiligeStatus(await leesKoppeling(supabaseAdmin)) };
242
+ const { data: m } = await supabaseAdmin
243
+ .from("printnode_webhook_meldingen")
244
+ .select("ontvangen_op, http_status, soorten, printnode_ids, gematcht, niet_gematcht")
245
+ .order("id", { ascending: false })
246
+ .limit(5);
247
+ const meldingen = (Array.isArray(m) ? m : []);
248
+ return { ok: true, ...veiligeStatus(await leesKoppeling(supabaseAdmin)), meldingen };
243
249
  }
244
250
  catch (e) {
245
251
  return { ok: false, fout: e instanceof Error ? e.message : "Status ophalen mislukt" };
@@ -10,5 +10,7 @@ export declare function printnodeStatusLabel(j: JobVoorLabel): string;
10
10
  export declare const SCANBARE_SOORTEN: Set<string>;
11
11
  /** Is "Opnieuw printen" / "Opnieuw proberen" zinvol voor deze opdracht? */
12
12
  export declare function opnieuwActie(j: JobVoorLabel): "opnieuw_proberen" | "opnieuw_printen" | null;
13
+ /** "gescand" alleen als de scan ná het printen van dit document was. */
14
+ export declare function scanLabel(scanTijd: number | string, printTijd: string | null | undefined): "gescand" | "eerder";
13
15
  export {};
14
16
  //# sourceMappingURL=printnodeStatus.d.ts.map
@@ -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,CAW5D;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAsD,CAAC;AAEpF,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,IAAI,CAI3F"}
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,CAW5D;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"}
@@ -41,3 +41,9 @@ export function opnieuwActie(j) {
41
41
  return "opnieuw_printen";
42
42
  return null;
43
43
  }
44
+ /** "gescand" alleen als de scan ná het printen van dit document was. */
45
+ export function scanLabel(scanTijd, printTijd) {
46
+ const scan = typeof scanTijd === "number" ? scanTijd : new Date(scanTijd).getTime();
47
+ const print = printTijd ? new Date(printTijd).getTime() : NaN;
48
+ return !Number.isNaN(print) && scan >= print ? "gescand" : "eerder";
49
+ }
@@ -1,12 +1,9 @@
1
1
  import type { SupabaseClient } from "@supabase/supabase-js";
2
2
  type Db = SupabaseClient<any, any, any>;
3
- /**
4
- * PrintNode documenteert alleen dat het secret "in each request" wordt
5
- * meegestuurd, niet in welk veld. Daarom: is het veld nog niet bekend, dan
6
- * zoeken we het ENE kopveld waarvan de waarde (in constante tijd) gelijk is
7
- * aan het secret en leggen alleen die naam vast. Daarna telt alleen dat veld.
8
- */
9
- export declare function controleerSecret(request: Request, secret: string, veld: string | null): {
3
+ /** De kop waarin PrintNode het geheim meestuurt (hulptekst webhookpagina). */
4
+ export declare const SECRET_KOP = "x-printnode-webhook-secret";
5
+ /** Controleert alleen de kop X-PrintNode-Webhook-Secret, in constante tijd. */
6
+ export declare function controleerSecret(request: Request, secret: string, _veld?: string | null): {
10
7
  ok: boolean;
11
8
  veld: string | null;
12
9
  };
@@ -15,8 +12,12 @@ export declare function secretKlopt(request: Request, secret: string): boolean;
15
12
  /**
16
13
  * Afhandeling van een webhookaanroep. Het geheim komt uit de eigen
17
14
  * koppelingstabel (servicerol). `secretVoorTest` alleen voor tests.
15
+ * Elk geldig (geheim klopt) verzoek krijgt 2xx + OK-kop, ook bij onbekende
16
+ * opdrachten of een fout in één melding.
18
17
  */
19
- export declare function behandelPrintNodeWebhook(request: Request, db: Db, secretVoorTest?: string): Promise<Response>;
18
+ export declare function behandelPrintNodeWebhook(request: Request, db: Db, secretVoorTest?: string, opties?: {
19
+ wachtMs?: number;
20
+ }): Promise<Response>;
20
21
  /** Haalt alle computers op bij PrintNode en slaat hun status op per id. */
21
22
  export declare function ververs(db: Db): Promise<number>;
22
23
  export {};
@@ -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;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,IAAI,GAClB;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAUtC;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE;AAOD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,EAAE,EACN,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,QAAQ,CAAC,CAqEnB;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;;;;;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,CA4EnB;AAED,2EAA2E;AAC3E,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrD"}