@flowselections/layout-maker 1.69.8 → 1.69.13

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 (81) hide show
  1. package/dist-lib/components/A4StickervelKaart.d.ts +5 -0
  2. package/dist-lib/components/A4StickervelKaart.d.ts.map +1 -0
  3. package/dist-lib/components/A4StickervelKaart.js +123 -0
  4. package/dist-lib/components/KlaarOmTePrintenBlok.d.ts.map +1 -1
  5. package/dist-lib/components/KlaarOmTePrintenBlok.js +50 -7
  6. package/dist-lib/components/PrintQueuePage.d.ts.map +1 -1
  7. package/dist-lib/components/PrintQueuePage.js +2 -1
  8. package/dist-lib/components/PrintplekDetailPage.d.ts.map +1 -1
  9. package/dist-lib/components/PrintplekDetailPage.js +3 -1
  10. package/dist-lib/components/PrintplekkenPage.d.ts.map +1 -1
  11. package/dist-lib/components/PrintplekkenPage.js +2 -1
  12. package/dist-lib/components/StickerRouteTestKaart.d.ts +5 -0
  13. package/dist-lib/components/StickerRouteTestKaart.d.ts.map +1 -0
  14. package/dist-lib/components/StickerRouteTestKaart.js +75 -0
  15. package/dist-lib/components/UitwijkRegel.d.ts +5 -0
  16. package/dist-lib/components/UitwijkRegel.d.ts.map +1 -0
  17. package/dist-lib/components/UitwijkRegel.js +17 -0
  18. package/dist-lib/components/UitwijkTekening.d.ts +19 -0
  19. package/dist-lib/components/UitwijkTekening.d.ts.map +1 -0
  20. package/dist-lib/components/UitwijkTekening.js +21 -0
  21. package/dist-lib/index.d.ts +12 -0
  22. package/dist-lib/index.d.ts.map +1 -1
  23. package/dist-lib/index.js +14 -0
  24. package/dist-lib/integrations/supabase/types.d.ts +3227 -22
  25. package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
  26. package/dist-lib/lib/belading.d.ts +10 -0
  27. package/dist-lib/lib/belading.d.ts.map +1 -0
  28. package/dist-lib/lib/belading.js +49 -0
  29. package/dist-lib/lib/documentProfiles.js +2 -2
  30. package/dist-lib/lib/eigenDocumenten.d.ts +2 -0
  31. package/dist-lib/lib/eigenDocumenten.d.ts.map +1 -1
  32. package/dist-lib/lib/eigenDocumenten.js +23 -0
  33. package/dist-lib/lib/fieldRegistry.js +3 -2
  34. package/dist-lib/lib/installCheck.d.ts +36 -0
  35. package/dist-lib/lib/installCheck.d.ts.map +1 -0
  36. package/dist-lib/lib/installCheck.js +65 -0
  37. package/dist-lib/lib/klaarOmTePrinten.d.ts +15 -1
  38. package/dist-lib/lib/klaarOmTePrinten.d.ts.map +1 -1
  39. package/dist-lib/lib/klaarOmTePrinten.js +19 -1
  40. package/dist-lib/lib/orderData.server.d.ts.map +1 -1
  41. package/dist-lib/lib/orderData.server.js +20 -17
  42. package/dist-lib/lib/pakbonBuilder.d.ts +6 -0
  43. package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
  44. package/dist-lib/lib/pakbonBuilder.js +22 -9
  45. package/dist-lib/lib/pakbonContent.d.ts.map +1 -1
  46. package/dist-lib/lib/pakbonContent.js +4 -1
  47. package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
  48. package/dist-lib/lib/pakbonHtml.js +5 -2
  49. package/dist-lib/lib/pakbonPresentation.d.ts +3 -1
  50. package/dist-lib/lib/pakbonPresentation.d.ts.map +1 -1
  51. package/dist-lib/lib/pakbonPresentation.js +13 -6
  52. package/dist-lib/lib/printQueue.server.d.ts +24 -0
  53. package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
  54. package/dist-lib/lib/printQueue.server.js +239 -17
  55. package/dist-lib/lib/printService.server.d.ts.map +1 -1
  56. package/dist-lib/lib/printService.server.js +3 -2
  57. package/dist-lib/lib/profielHtml.d.ts.map +1 -1
  58. package/dist-lib/lib/profielHtml.js +2 -1
  59. package/dist-lib/lib/standaardLayouts.server.d.ts +6 -0
  60. package/dist-lib/lib/standaardLayouts.server.d.ts.map +1 -1
  61. package/dist-lib/lib/standaardLayouts.server.js +13 -0
  62. package/dist-lib/lib/stickerPlaatsing.d.ts +37 -0
  63. package/dist-lib/lib/stickerPlaatsing.d.ts.map +1 -0
  64. package/dist-lib/lib/stickerPlaatsing.js +122 -0
  65. package/dist-lib/lib/stickerUitwijk.d.ts +197 -0
  66. package/dist-lib/lib/stickerUitwijk.d.ts.map +1 -0
  67. package/dist-lib/lib/stickerUitwijk.js +311 -0
  68. package/dist-lib/lib/testprint.d.ts +13 -0
  69. package/dist-lib/lib/testprint.d.ts.map +1 -1
  70. package/dist-lib/lib/testprint.js +38 -0
  71. package/dist-lib/lib/useDocumentData.js +1 -1
  72. package/dist-lib/lib/versie.generated.d.ts +1 -1
  73. package/dist-lib/lib/versie.generated.d.ts.map +1 -1
  74. package/dist-lib/lib/versie.generated.js +1 -1
  75. package/dist-lib/lib/vervoerder.d.ts +27 -3
  76. package/dist-lib/lib/vervoerder.d.ts.map +1 -1
  77. package/dist-lib/lib/vervoerder.js +65 -10
  78. package/dist-lib/lib/vroegeWaarschuwing.d.ts +21 -0
  79. package/dist-lib/lib/vroegeWaarschuwing.d.ts.map +1 -0
  80. package/dist-lib/lib/vroegeWaarschuwing.js +15 -0
  81. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonHtml.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonHtml.ts"],"names":[],"mappings":"AAUA,OAAO,EA+BL,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;AASD,2EAA2E;AAC3E,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAmB3D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AAwFD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGlD;AA4pBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAmFR;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,EAgCL,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;AASD,2EAA2E;AAC3E,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAmB3D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqF3D;AAwFD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAGlD;AA8pBD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,GAAG,OAAO,EAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,GAAE,kBAAuB,GAC9B,MAAM,CAmFR;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"}
@@ -7,7 +7,7 @@
7
7
  // layoutconfiguratie en de echte ordergegevens. Zo tonen het live voorbeeld en
8
8
  // de afdruk altijd exact dezelfde secties — inclusief de orderregels.
9
9
  // ============================================================================
10
- import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, HERHAAL_SECTIES, kopHerhalen, karKopNummer, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, onderdeelCellen, onderdeelVelden, samenstellingTonen, voegProductSamen, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
10
+ import { DEMO_ORDER, deelkarVoorbeeldOrder, conditieContext, groepeerIdentiekeKarren, groepeerIdentiekeLagen, karBundelTekst, fustVerzamellijst, fustRegels, FUSTREGEL_LABELS, FUSTREGEL_RECHTS, pickMethode, pakbonLayoutVariant, productVeldBreedtes, sectieOnderdruktVoorVariant, HERHAAL_SECTIES, kopHerhalen, karKopNummer, laagBundelTekst, leesPakbonConfig, sectieZichtbaar, sorteerProducten, onderdeelCellen, zonderLegeKolommen, onderdeelVelden, samenstellingTonen, voegProductSamen, totalen, vulVeldcodes, } from "./pakbonBuilder.js";
11
11
  import { haalPrintLogos } from "./logoLibrary.js";
12
12
  import { code128BarsHtml } from "./code128.js";
13
13
  import { karMetadata } from "./pakbonPresentation.js";
@@ -312,7 +312,7 @@ function fustTabel(velden, fusten, titel) {
312
312
  return `${titel ? `<div class="sectitel">${esc(titel)}</div>` : ""}<table class="regels">${kop}${rijen}</table>`;
313
313
  }
314
314
  function productenHtml(sectie, laag, toonKop = true) {
315
- const velden = lijst(sectie, "velden");
315
+ let velden = lijst(sectie, "velden");
316
316
  if (!velden.length)
317
317
  return "";
318
318
  let producten = sorteerProducten(laag.producten, optS(sectie, "sortering", "eigen"));
@@ -329,6 +329,9 @@ function productenHtml(sectie, laag, toonKop = true) {
329
329
  }
330
330
  if (!producten.length)
331
331
  return "";
332
+ velden = zonderLegeKolommen(velden, producten, cel);
333
+ if (!velden.length)
334
+ return "";
332
335
  const label = (v) => v === "foto" ? "Foto" : v === "qrcode" ? "QR-code" : PRODUCT_LABELS[v] ?? v;
333
336
  const weergave = optS(sectie, "weergave", "tabel");
334
337
  const sub = samenstellingTonen(sectie.opties) ? onderdeelVelden(sectie.opties) : null;
@@ -1,8 +1,10 @@
1
- import type { DemoKar } from "./pakbonBuilder.js";
1
+ import { type DemoKar } from "./pakbonBuilder.js";
2
2
  /**
3
3
  * Canonieke zichtbare metadata van een kar. Zowel het live voorbeeld als de
4
4
  * print-renderer gebruiken deze lijst, zodat geen van beide zelf regels kan
5
5
  * toevoegen of in een andere volgorde kan zetten.
6
6
  */
7
7
  export declare function karMetadata(kar: DemoKar, velden: string[]): string[];
8
+ /** Stickers bij deze kar: planten van regels waar een sticker bij hoort. */
9
+ export declare function aantalStickersBijKar(kar: DemoKar): number;
8
10
  //# sourceMappingURL=pakbonPresentation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pakbonPresentation.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoBpE"}
1
+ {"version":3,"file":"pakbonPresentation.d.ts","sourceRoot":"","sources":["../../src/lib/pakbonPresentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwBpE;AACD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKzD"}
@@ -1,3 +1,4 @@
1
+ import { telwoord } from "./pakbonBuilder.js";
1
2
  /**
2
3
  * Canonieke zichtbare metadata van een kar. Zowel het live voorbeeld als de
3
4
  * print-renderer gebruiken deze lijst, zodat geen van beide zelf regels kan
@@ -5,8 +6,10 @@
5
6
  */
6
7
  export function karMetadata(kar, velden) {
7
8
  const info = [];
8
- if (velden.includes("lagen"))
9
- info.push(`${kar.lagen.length} lagen`);
9
+ if (velden.includes("lagen")) {
10
+ const gevuld = kar.lagen.filter((l) => (l.producten?.length ?? 0) > 0).length;
11
+ info.push(telwoord(gevuld || kar.lagen.length, "laag", "lagen"));
12
+ }
10
13
  if (velden.includes("producten")) {
11
14
  const aantal = kar.lagen.reduce((totaal, laag) => totaal + laag.producten.reduce((som, product) => som + product.aantal, 0), 0);
12
15
  info.push(`${aantal} producten`);
@@ -21,9 +24,13 @@ export function karMetadata(kar, velden) {
21
24
  info.push("gedeelde kar");
22
25
  // De karstand hoort in de grote karkop (`KAR 2 van 2`), niet nogmaals in
23
26
  // deze metaregel. Anders verschijnt dezelfde telling op twee plekken.
24
- if (kar.cart_id)
25
- info.push(`ID ${kar.cart_id}`);
26
- if (kar.cart_items?.length)
27
- info.push(`${kar.cart_items.length} karregels`);
27
+ if (velden.includes("stickers"))
28
+ info.push(telwoord(aantalStickersBijKar(kar), "sticker", "stickers"));
29
+ // Geen technisch kar-id en geen interne regeltelling op papier: de barcode
30
+ // identificeert de kar.
28
31
  return info;
29
32
  }
33
+ /** Stickers bij deze kar: planten van regels waar een sticker bij hoort. */
34
+ export function aantalStickersBijKar(kar) {
35
+ return kar.lagen.reduce((n, l) => n + l.producten.reduce((m, p) => m + (String(p.sticker ?? "") === "Ja" ? Number(p.aantal || 0) : 0), 0), 0);
36
+ }
@@ -1,5 +1,7 @@
1
1
  import type { SupabaseClient } from "@supabase/supabase-js";
2
2
  import { type EigenStickerMaat } from "./eigenDocumenten.js";
3
+ import { type GeladenEtiket } from "./etiketControle.js";
4
+ import { type StickerSoort } from "./stickerUitwijk.js";
3
5
  type Job = Record<string, any>;
4
6
  /** De databaseclient die de shell aanlevert. De module maakt er zelf nooit een. */
5
7
  export type PrintDb = SupabaseClient<any, any, any>;
@@ -17,6 +19,19 @@ export declare class GeenDocumentFout extends Error {
17
19
  export declare class WachtOpLayoutFout extends Error {
18
20
  name: string;
19
21
  }
22
+ /** Geen vervoerder (of Engine te oud): wachten tot hij is ingesteld, onbegrensd. */
23
+ export declare class WachtOpVervoerderFout extends Error {
24
+ name: string;
25
+ }
26
+ /**
27
+ * Bepaalt de vervoerder voor een eigen document. Alleen carrier_label uit de
28
+ * Engine (payload of logistics_brief_transport). Geeft null voor documenten
29
+ * zonder vervoerder (of Floriday 1-op-1). Gooit WachtOpVervoerderFout als hij
30
+ * ontbreekt; nooit een naam opzoeken, nooit "onbekend".
31
+ */
32
+ export declare function bepaalVervoerder(db: PrintDb, job: Job, p: Job, layout: Job | null): Promise<string | null>;
33
+ /** Wacht op een vervoerder: blijft wachtend (geen eindstatus), reden zichtbaar in de wachtrij. */
34
+ export declare function wachtOpVervoerder(db: PrintDb, job: Job, reden: string): Promise<"wachtend">;
20
35
  /** Blijvende contractfout: opnieuw proberen met dezelfde invoer kan niet slagen. */
21
36
  export declare class EngineContractFout extends GeenDocumentFout {
22
37
  name: string;
@@ -124,5 +139,14 @@ export declare function bepaalDocumentKeuze(db: PrintDb, job: Job): Promise<{
124
139
  keuze: LayoutKeuze;
125
140
  klaarPdf: string | null;
126
141
  }>;
142
+ /**
143
+ * Is dit een labelprinter? Ja als er een geladen etiket is ingesteld, of als
144
+ * een werkplek hem als labelprinter gebruikt. Alleen dan geldt de controle,
145
+ * zodat bestaande printers zonder werkplek precies blijven werken als nu.
146
+ */
147
+ /** Stickersoort voor de verkleininstelling (op configuratie en bron, nooit op naam). */
148
+ export declare function stickerSoortVoor(documenttype: string, layout: Job | null, floriday: boolean, klaar: boolean): StickerSoort;
149
+ /** Eigen ontwerp past niet op het geladen etiket: variant op de etiketmaat maken. */
150
+ export declare function eigenEtiketVariantNodig(layout: Job, etiket: GeladenEtiket): boolean;
127
151
  export {};
128
152
  //# sourceMappingURL=printQueue.server.d.ts.map
@@ -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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"}
@@ -3,23 +3,25 @@
3
3
  // Pakt wachtende opdrachten op, maakt er een PDF van en stuurt die stil naar
4
4
  // de juiste printer. Draait alleen op de server (cron / interne aanroep).
5
5
  // ============================================================================
6
- import { metVervoerder } from "./vervoerder.js";
6
+ import { voerUitwijkUit } from "./stickerPlaatsing.js";
7
+ import { carrierUitPayload, carrierUitTransport, ENGINE_TE_OUD, geenVervoerderTekst, metVervoerder, VERVOERDER_DOCUMENTEN, voorbeeldVervoerder } from "./vervoerder.js";
7
8
  import { maakPakbonOrder, renderPakbonDocument, voorbeeldPakbonOrder, } from "./pakbonHtml.js";
8
9
  import { bouwPakbonScanInhoud, bewaarPakbonScanInhoud } from "./pakbonScan.js";
9
10
  import { bouwPakbonBarcodeVerzoek, geleverdeBarcodeVoorJob, vraagPakbonBarcodeAan, } from "./pakbonBarcodeVerzoek.js";
10
11
  import { bepaalVolleKarStand, deelkarRegels, leesAfleverbriefConfig, pakbonLayoutVariant, } from "./pakbonBuilder.js";
11
12
  import { renderProductiebonDocument } from "./productiebonHtml.js";
12
- import { heeftOrderInhoud, laadOrderVanuitDatabase, laadPakbonData } from "./orderData.server.js";
13
+ import { heeftOrderInhoud, laadOrderVanuitDatabase, laadPakbonData, zoekOrderVerwijzing } from "./orderData.server.js";
13
14
  import { profielHeeftInhoud, renderProfielDocument } from "./profielHtml.js";
14
15
  import { bouwDocumentHtml, voorbeeldContext } from "./layoutPreview.js";
15
16
  import { AfbeeldingInhoudFout, htmlNaarPdfServer, PdfRenderFout } from "./htmlNaarPdf.server.js";
16
17
  import { bepaalStickerMaat, floridayStickerMaat, STICKER_MAAT_ONBEKEND, stickerFormaatCode, stickerIdUitPayload, stickerInfoUitCache, stickerNietNodig, stickerTypeLabel, STICKER_NIET_NODIG, FASE_NIET_NODIG } from "./stickerFormaat.js";
17
- import { controlelijstHtml, EIGEN_STICKER_MAAT_ONBEKEND, eigenStickerId, eigenStickerKlant, eigenStickerMaat, kiesTraystickerLogo, TRAYSTICKER_GEEN_INDELING, trayProducten, traystickerHtml } from "./eigenDocumenten.js";
18
+ import { controlelijstHtml, EIGEN_STICKER_MAAT_ONBEKEND, VOORBEELD_TRAY_PAYLOAD, eigenStickerId, eigenStickerKlant, eigenStickerMaat, kiesTraystickerLogo, TRAYSTICKER_GEEN_INDELING, trayProducten, traystickerHtml } from "./eigenDocumenten.js";
18
19
  import { OPMAAK_LIMIET_MS, OpmaakTeLangFout, metTijdslimiet } from "./opmaakLimiet.js";
19
20
  import { stuurPdfNaarPrinter, opdrachtStatusDetail, vervaltijdVoor } from "./printService.server.js";
20
21
  import { kiesPapier } from "./papierFormaten.js";
21
22
  import { waaromDezePrinter } from "./waaromPrinter.js";
22
- import { etiketPast, leesGeladenEtiket, pdfPaginaMm } from "./etiketControle.js";
23
+ import { etiketPast, leesGeladenEtiket, maatNl, pdfPaginaMm } from "./etiketControle.js";
24
+ import { a4VelVoor, kiesUitwijkroute, leesA4StickervelWaarde, leesStickerInstellingenStrikt, uitwijkVoorPickschermen } from "./stickerUitwijk.js";
23
25
  import { documentTypeLabel as documentTypeLabelVoor } from "./documentTypes.js";
24
26
  import { PAPIERFORMATEN } from "./documentTypes.js";
25
27
  const MAX_POGINGEN = 3;
@@ -132,6 +134,71 @@ export class WachtOpLayoutFout extends Error {
132
134
  this.name = "WachtOpLayoutFout";
133
135
  }
134
136
  }
137
+ /** Geen vervoerder (of Engine te oud): wachten tot hij is ingesteld, onbegrensd. */
138
+ export class WachtOpVervoerderFout extends Error {
139
+ constructor() {
140
+ super(...arguments);
141
+ this.name = "WachtOpVervoerderFout";
142
+ }
143
+ }
144
+ /**
145
+ * Bepaalt de vervoerder voor een eigen document. Alleen carrier_label uit de
146
+ * Engine (payload of logistics_brief_transport). Geeft null voor documenten
147
+ * zonder vervoerder (of Floriday 1-op-1). Gooit WachtOpVervoerderFout als hij
148
+ * ontbreekt; nooit een naam opzoeken, nooit "onbekend".
149
+ */
150
+ export async function bepaalVervoerder(db, job, p, layout) {
151
+ const dt = normaliseerDocumenttype(layout?.documenttype ?? job.documenttype);
152
+ if (!VERVOERDER_DOCUMENTEN.includes(dt))
153
+ return null;
154
+ if (String(layout?.bron ?? "") === "floriday" || String(p._herkomst ?? "") === "floriday")
155
+ return null;
156
+ if (isTestprintJob(job) || p.voorbeeld === true)
157
+ return voorbeeldVervoerder(p);
158
+ const ref = zoekOrderVerwijzing(p);
159
+ const ordernummer = String(ref.ordernummer ?? p.order_number ?? p.ordernummer ?? "").trim();
160
+ let r = carrierUitPayload(p);
161
+ if (r.soort === "afwezig") {
162
+ if (!ref.orderId) {
163
+ // Engine-opdracht zonder carrier_label en zonder order: Engine te oud.
164
+ if (isEngineOpdracht(job))
165
+ throw new WachtOpVervoerderFout(ENGINE_TE_OUD);
166
+ return null;
167
+ }
168
+ const { data, error } = await db.rpc("logistics_brief_transport", {
169
+ p_order_id: ref.orderId,
170
+ ...(ref.cartId ? { p_cart_id: ref.cartId } : {}),
171
+ });
172
+ if (error)
173
+ throw new WachtOpVervoerderFout(`${ENGINE_TE_OUD} (${String(error.message ?? "").slice(0, 120)})`);
174
+ r = carrierUitTransport(data);
175
+ if (r.soort === "afwezig")
176
+ throw new WachtOpVervoerderFout(ENGINE_TE_OUD);
177
+ }
178
+ if (r.soort === "geen")
179
+ throw new WachtOpVervoerderFout(geenVervoerderTekst(ordernummer));
180
+ return r.label;
181
+ }
182
+ /** Wacht op een vervoerder: blijft wachtend (geen eindstatus), reden zichtbaar in de wachtrij. */
183
+ export async function wachtOpVervoerder(db, job, reden) {
184
+ const nu = new Date().toISOString();
185
+ await db
186
+ .from("print_jobs")
187
+ .update({
188
+ status: "wachtend",
189
+ foutcode: "GEEN_VERVOERDER",
190
+ foutmelding: reden.slice(0, 500),
191
+ pogingen: Number(job.pogingen ?? 0) + 1,
192
+ volgende_poging: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
193
+ opgepakt_op: null,
194
+ voltooid_op: null,
195
+ updated_at: nu,
196
+ })
197
+ .eq("id", job.id)
198
+ .neq("status", "geannuleerd");
199
+ await log(db, job.id, "wacht_op_vervoerder", reden);
200
+ return "wachtend";
201
+ }
135
202
  /** Blijvende contractfout: opnieuw proberen met dezelfde invoer kan niet slagen. */
136
203
  export class EngineContractFout extends GeenDocumentFout {
137
204
  constructor() {
@@ -921,7 +988,9 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
921
988
  noteer("render_html");
922
989
  return meegestuurd;
923
990
  }
924
- const p = (job.payload ?? {});
991
+ let p = (job.payload ?? {});
992
+ // Vervoerder: alleen carrier_label uit de Engine. Ontbreekt hij → wachten.
993
+ const carrierLabel = await bepaalVervoerder(db, job, p, layout);
925
994
  const liggend = String(layout.orientatie ?? "portrait") === "landscape";
926
995
  const b = Number(layout.breedte_mm ?? 210);
927
996
  const h = Number(layout.hoogte_mm ?? 297);
@@ -941,6 +1010,9 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
941
1010
  }
942
1011
  // Eigen traysticker (fs.eigen_traysticker): één sticker per tray.
943
1012
  if (cfg.eigen_traysticker && typeof cfg.eigen_traysticker === "object") {
1013
+ // Testprint: voorbeeldgegevens (voorbeeldorder, fusten, een samenstelling).
1014
+ if (isTestprintJob(job) && !trayProducten(p))
1015
+ p = { ...VOORBEELD_TRAY_PAYLOAD, ...p };
944
1016
  if (!trayProducten(p))
945
1017
  throw new WachtOpLayoutFout(TRAYSTICKER_GEEN_INDELING);
946
1018
  const inst = await bedrijfsInstelling(db).catch(() => null);
@@ -997,7 +1069,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
997
1069
  const gekozen = (cartId ? karren.find((k) => String(k?.cart_id ?? "").trim() === cartId) : null) ??
998
1070
  karren[0] ??
999
1071
  null;
1000
- const metTerugval = await metBedrijfsTerugval(db, { ...volledig, karren: gekozen ? [gekozen] : [] }, layout);
1072
+ const metTerugval = await metBedrijfsTerugval(db, metVervoerder({ ...volledig, karren: gekozen ? [gekozen] : [] }, p, carrierLabel), layout);
1001
1073
  const order = metTerugval.order;
1002
1074
  layout = metTerugval.layout;
1003
1075
  return renderPakbonDocument(leesAfleverbriefConfig(layout.config), order, {
@@ -1074,7 +1146,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
1074
1146
  if (isTestpakbon)
1075
1147
  order = zonderBarcodes(order);
1076
1148
  // Vervoerder/ophaalmoment alleen uit de printopdracht; ontbrekend = weglaten.
1077
- order = metVervoerder(order, p);
1149
+ order = metVervoerder(order, p, carrierLabel);
1078
1150
  if (isEngineOpdracht(job) && !isTestpakbon) {
1079
1151
  let barcode = String(engineBarcode ?? "").trim();
1080
1152
  if (!barcode) {
@@ -1271,6 +1343,13 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
1271
1343
  ? null
1272
1344
  : await laadOrderVanuitDatabase(db, p).catch(() => null);
1273
1345
  const gegevens = { ...(uitDatabase ?? {}), ...(meegegeven ?? {}) };
1346
+ if (carrierLabel !== null) {
1347
+ // Eén bron: carrier_label. Overschrijft elke andere transporteurwaarde.
1348
+ gegevens.carrier_label = carrierLabel;
1349
+ gegevens.transporteur = carrierLabel;
1350
+ gegevens.verzending = { ...(gegevens.verzending ?? {}), transporteur: carrierLabel };
1351
+ gegevens.order = { ...(gegevens.order ?? {}), transporteur: carrierLabel, carrier_label: carrierLabel };
1352
+ }
1274
1353
  const profielData = p.voorbeeld === true ? { ...voorbeeldContext(), ...(gegevens ?? {}) } : gegevens;
1275
1354
  const profielHtml = renderProfielDocument(String(layout.documenttype), cfg, profielData, {
1276
1355
  breedteMm,
@@ -1543,7 +1622,7 @@ async function verwerkJob(db, job) {
1543
1622
  }
1544
1623
  const keuze = klaar ? { layout: null, ontwerpWint: false } : await zoekLayout(db, job);
1545
1624
  klok.markeer("layout_resolved");
1546
- const layout = keuze.layout;
1625
+ let layout = keuze.layout;
1547
1626
  // Klantsticker/traysticker: maat vaststellen (Floriday-formaat, anders de
1548
1627
  // PDF). Onbekend = niet printen. De maat kiest ook de printer via de
1549
1628
  // formaatregels, zodat een sticker op een etiket komt dat groot genoeg is.
@@ -1611,8 +1690,20 @@ async function verwerkJob(db, job) {
1611
1690
  await geweigerd(db, job, "GEEN_GELADEN_ETIKET", `${documentTypeLabelVoor(String(job.documenttype))} gaat alleen naar een labelprinter met een ingesteld geladen etiket; printer ${String(printer.naam ?? printer.id)} heeft er geen.`);
1612
1691
  return "mislukt";
1613
1692
  }
1693
+ // Eigen sticker/traysticker: variant op de maat van het geladen etiket,
1694
+ // opgebouwd uit dezelfde velden. Een eigen ontwerp wordt nooit geschaald
1695
+ // en de opgeslagen layout wordt niet gewijzigd (alleen deze opmaak).
1696
+ if (label?.etiket && layout && eigenEtiketVariantNodig(layout, label.etiket)) {
1697
+ const e = label.etiket;
1698
+ layout = { ...layout, breedte_mm: e.breedte_mm, hoogte_mm: e.hoogte_mm, orientatie: e.breedte_mm > e.hoogte_mm ? "landscape" : "portrait" };
1699
+ keuze.layout = layout;
1700
+ await log(db, job.id, "etiket", `Eigen ontwerp opgebouwd op de etiketmaat ${maatNl(e.breedte_mm, e.hoogte_mm)} (variant, niet geschaald).`);
1701
+ }
1614
1702
  const isTest = (job.payload ?? {})["is_testprint"] === true;
1615
- if (label && isTest && label.etiket) {
1703
+ // Testprint per uitwijkroute (1.69.12): de voorbeeldsticker houdt zijn
1704
+ // eigen maat, zodat de echte uitwijkroute zichtbaar wordt.
1705
+ const routeTest = (job.payload ?? {})["uitwijk_test"] === true;
1706
+ if (label && isTest && label.etiket && !routeTest) {
1616
1707
  // Een testprint gebruikt het formaat dat echt in de printer zit.
1617
1708
  const p = (job.payload ?? {});
1618
1709
  p["voorbeeld_formaat"] = {
@@ -1665,21 +1756,44 @@ async function verwerkJob(db, job) {
1665
1756
  const vfPapier = (job.payload ?? {})["voorbeeld_formaat"];
1666
1757
  const breedteMm = Number(layout?.breedte_mm ?? vfPapier?.["breedte_mm"] ?? standaardMaat(printer).breedte);
1667
1758
  const hoogteMm = Number(layout?.hoogte_mm ?? vfPapier?.["hoogte_mm"] ?? standaardMaat(printer).hoogte);
1759
+ let doelPrinter = printer;
1760
+ let uitwijk = null;
1761
+ const fitToPage = false;
1762
+ let kopieenNaarPrinter = Number(job.kopieen ?? 1);
1668
1763
  let papier = kiesPapier(formaten, breedteMm, hoogteMm);
1669
1764
  if (label) {
1670
1765
  const maat = stickerMaat ?? (klaar ? pdfPaginaMm(pdfBase64) : null) ?? { breedte_mm: breedteMm, hoogte_mm: hoogteMm };
1671
1766
  const uit = etiketPast({ ...maat, soortLabel: stickerCache?.sticker_type ? stickerTypeLabel(stickerCache.sticker_type) : documentTypeLabelVoor(String(job.documenttype ?? "Document")) }, label.etiket, label.naam, !!stickerMaat);
1672
- if (!uit.ok) {
1767
+ if (label.etiket && ETIKET_PDF_SOORTEN.has(String(job.documenttype ?? "")) && (uit.ok || uit.code === "FORMAAT_PAST_NIET")) {
1768
+ // 1.69.12: elke sticker via de uitwijkroute (vaste volgorde), papier
1769
+ // op afmeting gekozen; draaien/centreren/verkleinen in de PDF zelf.
1770
+ const keuzeUitwijk = await bepaalUitwijk(db, job, layout, !!floriday, !!klaar, maat, label, printer, formaten);
1771
+ if (!keuzeUitwijk) {
1772
+ await geweigerd(db, job, "FORMAAT_PAST_NIET", `${uit.ok ? "Geen passende papiermaat." : uit.bericht} Er is op deze printplek ook geen A4-printer om op uit te wijken.`);
1773
+ return "mislukt";
1774
+ }
1775
+ uitwijk = keuzeUitwijk.uitkomst;
1776
+ if (keuzeUitwijk.a4)
1777
+ doelPrinter = keuzeUitwijk.a4;
1778
+ const geplaatst = await voerUitwijkUit(pdfBase64, uitwijk, maat, Number(job.kopieen ?? 1));
1779
+ pdfBase64 = geplaatst.pdfBase64;
1780
+ kopieenNaarPrinter = geplaatst.kopieen;
1781
+ papier = { paper: uitwijk.paper || null, rotate: 0, uitleg: uitwijk.reden };
1782
+ await log(db, job.id, "uitwijk", `${uitwijk.reden} (${uitwijk.printerNaam}).`);
1783
+ }
1784
+ else if (!uit.ok) {
1673
1785
  await geweigerd(db, job, uit.code, uit.bericht);
1674
1786
  return "mislukt";
1675
1787
  }
1676
- papier = { paper: uit.paper, rotate: uit.rotate, uitleg: uit.uitleg };
1677
- await log(db, job.id, "etiket", `Labelprinter ${label.naam}: ${uit.uitleg}.`);
1788
+ else {
1789
+ papier = { paper: uit.paper, rotate: uit.rotate, uitleg: uit.uitleg };
1790
+ await log(db, job.id, "etiket", `Labelprinter ${label.naam}: ${uit.uitleg}.`);
1791
+ }
1678
1792
  }
1679
1793
  const verloopt = vervaltijdVoor(String(job.documenttype ?? ""));
1680
1794
  // Eén fysieke printer via meerdere computers: probeer de routes op
1681
1795
  // volgorde; valt de eerste weg, dan automatisch de volgende.
1682
- const routes = await printerRoutes(db, String(printer.id), String(printer.extern_printer_id));
1796
+ const routes = await printerRoutes(db, String(doelPrinter.id), String(doelPrinter.extern_printer_id));
1683
1797
  let externJobId = "";
1684
1798
  let laatsteFout = null;
1685
1799
  for (const [i, route] of routes.entries()) {
@@ -1690,9 +1804,9 @@ async function verwerkJob(db, job) {
1690
1804
  externPrinterId: route.extern,
1691
1805
  documentnaam: String(job.documentnaam ?? "Document"),
1692
1806
  pdfBase64,
1693
- kopieen: Number(job.kopieen ?? 1),
1807
+ kopieen: kopieenNaarPrinter,
1694
1808
  documenttype: String(job.documenttype ?? ""),
1695
- opties: { paper: papier.paper, rotate: papier.rotate, fitToPage: false },
1809
+ opties: { paper: papier.paper, rotate: papier.rotate, fitToPage },
1696
1810
  });
1697
1811
  if (i > 0) {
1698
1812
  await log(db, job.id, "route", `Verstuurd via computer ${route.computer ?? "andere route"}: de eerste computer was niet bereikbaar.`);
@@ -1717,7 +1831,7 @@ async function verwerkJob(db, job) {
1717
1831
  const { data: gekoppeldeJob } = await db
1718
1832
  .from("print_jobs")
1719
1833
  .update({
1720
- printer_id: printer.id,
1834
+ printer_id: doelPrinter.id,
1721
1835
  // layout_id blijft de aangeleverde invoer en wordt bewust niet
1722
1836
  // overschreven met de uitkomst.
1723
1837
  // Bij Floriday 1-op-1 wordt de Floriday-layout vastgelegd (alleen nieuwe opdrachten).
@@ -1745,10 +1859,15 @@ async function verwerkJob(db, job) {
1745
1859
  return "wachtend";
1746
1860
  }
1747
1861
  klok.markeer("submitted");
1748
- await log(db, job.id, "verstuurd", `Naar printer ${printer.naam ?? ""}. ${papier.uitleg} ${klok.samenvatting()}`);
1862
+ if (uitwijk)
1863
+ await legUitwijkVast(db, job, uitwijk);
1864
+ await log(db, job.id, "verstuurd", `Naar printer ${doelPrinter.naam ?? ""}. ${papier.uitleg} ${klok.samenvatting()}`);
1749
1865
  return "verstuurd";
1750
1866
  }
1751
1867
  catch (e) {
1868
+ if (e instanceof WachtOpVervoerderFout) {
1869
+ return await wachtOpVervoerder(db, job, e.message);
1870
+ }
1752
1871
  if (e instanceof WachtOpLayoutFout) {
1753
1872
  return await wachtOpLayout(db, job, e.message);
1754
1873
  }
@@ -2095,6 +2214,109 @@ export async function bepaalDocumentKeuze(db, job) {
2095
2214
  * een werkplek hem als labelprinter gebruikt. Alleen dan geldt de controle,
2096
2215
  * zodat bestaande printers zonder werkplek precies blijven werken als nu.
2097
2216
  */
2217
+ /** Stickersoort voor de verkleininstelling (op configuratie en bron, nooit op naam). */
2218
+ export function stickerSoortVoor(documenttype, layout, floriday, klaar) {
2219
+ const cfg = (layout?.config ?? {});
2220
+ if (cfg.eigen_traysticker)
2221
+ return "eigen_traysticker";
2222
+ if (cfg.eigen_sticker)
2223
+ return "eigen_sticker";
2224
+ const tray = String(documenttype) === "traysticker";
2225
+ if (floriday || (klaar && tray))
2226
+ return tray ? "floriday_traysticker" : "floriday_sticker";
2227
+ return "klantsticker";
2228
+ }
2229
+ /** Eigen ontwerp past niet op het geladen etiket: variant op de etiketmaat maken. */
2230
+ export function eigenEtiketVariantNodig(layout, etiket) {
2231
+ const cfg = (layout?.config ?? {});
2232
+ if (!cfg.eigen_traysticker && !cfg.eigen_sticker)
2233
+ return false;
2234
+ // Eigen sticker met geüploade afbeelding heeft een vaste maat: die volgt de uitwijkroute.
2235
+ if (cfg.eigen_sticker && !cfg.eigen_traysticker)
2236
+ return false;
2237
+ const b = Number(layout.breedte_mm ?? 0);
2238
+ const h = Number(layout.hoogte_mm ?? 0);
2239
+ if (!(b > 0) || !(h > 0))
2240
+ return false;
2241
+ return !etiketPast({ breedte_mm: b, hoogte_mm: h, soortLabel: "Traysticker" }, etiket, "").ok;
2242
+ }
2243
+ /**
2244
+ * Verkleininstelling via de databasefunctie (één bron met de vroege
2245
+ * waarschuwing; maakt de standaard aan als hij ontbreekt). null = niet
2246
+ * leesbaar: dan vervalt alleen de stap verkleinen, nooit wachten.
2247
+ */
2248
+ async function leesStickerInstelling(db) {
2249
+ const { data, error } = await db.rpc("layouts_sticker_verkleinen");
2250
+ if (error)
2251
+ return null;
2252
+ return leesStickerInstellingenStrikt(data);
2253
+ }
2254
+ /** Uitwijkroute voor een sticker die niet op het geladen etiket past. */
2255
+ async function bepaalUitwijk(db, job, layout, floriday, klaar, maat, label, printer, formaten = null) {
2256
+ const instellingen = await leesStickerInstelling(db).catch(() => null);
2257
+ const soort = stickerSoortVoor(String(job.documenttype ?? ""), layout, floriday, klaar);
2258
+ const etiketten = label.etiket
2259
+ ? [{ printerNaam: label.naam, printerId: String(printer.id), paper: label.etiket.standaard ? "" : label.etiket.naam, breedte_mm: label.etiket.breedte_mm, hoogte_mm: label.etiket.hoogte_mm, dpi: printerDpi(printer), formaten: formaten ? formaten : undefined }]
2260
+ : [];
2261
+ const plekId = leesPrintPlekId(job) || (await zoekPrintPlekId(db, job).catch(() => null));
2262
+ let a4 = null;
2263
+ if (plekId) {
2264
+ const { data: a4Id } = await db.rpc("printplek_printer", { _plek: plekId, _documenttype: "pakbon" });
2265
+ if (typeof a4Id === "string" && a4Id !== String(printer.id)) {
2266
+ const { data } = await db
2267
+ .from("printers")
2268
+ .select("id, naam, weergavenaam, extern_printer_id, actief, papierformaat, ondersteunde_formaten, geladen_etiket")
2269
+ .eq("id", a4Id)
2270
+ .maybeSingle();
2271
+ a4 = data && data.actief !== false && data.extern_printer_id ? data : null;
2272
+ }
2273
+ }
2274
+ // Ensure bij gebruik (eerste print): oude losse instelling overnemen.
2275
+ await db.rpc("layouts_zorg_voor_a4_stickervel").then(() => undefined, () => undefined);
2276
+ const vel = plekId ? await leesA4Stickervel(db, String(plekId)) : null;
2277
+ const velIndeling = a4VelVoor(vel, maat);
2278
+ const uitkomst = kiesUitwijkroute({
2279
+ sticker: maat,
2280
+ etiketten,
2281
+ a4Printer: a4 ? { naam: String(a4.weergavenaam || a4.naam || "A4-printer"), id: String(a4.id) } : null,
2282
+ a4VelIngesteld: !!velIndeling,
2283
+ a4VelIndeling: velIndeling,
2284
+ instelling: instellingen ? instellingen[soort] : null,
2285
+ });
2286
+ if (!uitkomst)
2287
+ return null;
2288
+ const naarA4 = uitkomst.uitwijkroute === "a4_vel" || uitkomst.uitwijkroute === "a4_snijlijnen";
2289
+ return { uitkomst, a4: naarA4 ? a4 : null };
2290
+ }
2291
+ /** A4-stickervel van de printplek (print_plekken.a4_stickervel, 1.69.12). */
2292
+ async function leesA4Stickervel(db, plekId) {
2293
+ const { data } = await db.from("print_plekken").select("a4_stickervel").eq("id", plekId).maybeSingle();
2294
+ return leesA4StickervelWaarde(data?.a4_stickervel);
2295
+ }
2296
+ /** Resolutie uit de PrintNode-gegevens; onbekend = null (de uitwijk neemt 203 dpi). */
2297
+ function printerDpi(printer) {
2298
+ const f = (printer?.ondersteunde_formaten ?? {});
2299
+ const d = Number(f?.dpi ?? (Array.isArray(f?.dpis) ? String(f.dpis[0]).split("x")[0] : NaN));
2300
+ return d > 0 ? d : null;
2301
+ }
2302
+ /** Legt vast wat er met de sticker gebeurd is (veldnamen voor Pickschermen 1.0.61). */
2303
+ async function legUitwijkVast(db, job, u) {
2304
+ // Pickschermen 1.0.61 leest uitwijkroute/printerNaam/schaal/reden; de
2305
+ // overige velden zijn alleen voor het voorbeeld in de printwachtrij.
2306
+ const waarde = {
2307
+ ...uitwijkVoorPickschermen(u),
2308
+ rotate: u.rotate,
2309
+ pagina_breedte_mm: u.pagina_breedte_mm,
2310
+ pagina_hoogte_mm: u.pagina_hoogte_mm,
2311
+ sticker_breedte_mm: u.sticker_breedte_mm,
2312
+ sticker_hoogte_mm: u.sticker_hoogte_mm,
2313
+ };
2314
+ const { error } = await db.from("print_jobs").update({ uitwijk: waarde }).eq("id", job.id);
2315
+ if (error)
2316
+ await faseLog(db, job.id, "uitwijk_niet_vastgelegd", { ...waarde, fout: error.message });
2317
+ else
2318
+ await faseLog(db, job.id, "uitwijk", waarde);
2319
+ }
2098
2320
  async function labelControleVoorbereiden(db, printer) {
2099
2321
  const etiket = leesGeladenEtiket(printer?.geladen_etiket);
2100
2322
  const naam = String(printer?.weergavenaam || printer?.naam || "onbekend");
@@ -1 +1 @@
1
- {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1C,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAWD,iFAAiF;AACjF,qBAAa,eAAgB,SAAQ,KAAK;;CAEzC;AAED,kFAAkF;AAClF,eAAO,MAAM,aAAa,gCAA2B,CAAC;AACtD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOvD,CAAC;AACF,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE9E;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7E;AA4CD,6EAA6E;AAC7E,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAmBrE;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASzE;AAED,2FAA2F;AAC3F,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CpF;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWjF;AAED,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AACtF,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAA0D,CAAC;AAEpH,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc,CAM5D;AAED,0DAA0D;AAC1D,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC,CAUzE;AAED,8EAA8E;AAC9E,wBAAsB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrF;AAGD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E,uDAAuD;AACvD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAejF;AAED,yCAAyC;AACzC,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qDAAqD;AACrD,wBAAsB,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAchE"}
1
+ {"version":3,"file":"printService.server.d.ts","sourceRoot":"","sources":["../../src/lib/printService.server.ts"],"names":[],"mappings":"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"}
@@ -113,8 +113,9 @@ export async function haalPrinterFormaten(externPrinterId) {
113
113
  export async function stuurPdfNaarPrinter(input) {
114
114
  const o = input.opties ?? {};
115
115
  const options = {
116
- // Bewust uit: anders schaalt de printer een etiket stilzwijgend naar A4.
117
- fit_to_page: o.fitToPage === true,
116
+ // Altijd uit (1.69.12): de printer of driver mag nooit zelf schalen;
117
+ // verkleinen/centreren gebeurt in de PDF.
118
+ fit_to_page: false,
118
119
  };
119
120
  if (o.paper)
120
121
  options["paper"] = o.paper;
@@ -1 +1 @@
1
- {"version":3,"file":"profielHtml.d.ts","sourceRoot":"","sources":["../../src/lib/profielHtml.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AA2ND,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAWjF;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CAwCR"}
1
+ {"version":3,"file":"profielHtml.d.ts","sourceRoot":"","sources":["../../src/lib/profielHtml.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AA4ND,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAWjF;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,mBAAwB,GAC/B,MAAM,CAwCR"}
@@ -48,7 +48,8 @@ const SYNONIEMEN = {
48
48
  plaats: ["ontvanger.plaats", "klant.plaats", "adres.plaats"],
49
49
  land: ["ontvanger.land", "klant.land", "adres.land"],
50
50
  klantnaam: ["klant.naam", "ontvanger.bedrijf", "klantnaam"],
51
- transporteur: ["verzending.transporteur", "order.transporteur", "transporteur"],
51
+ transporteur: ["carrier_label", "order.carrier_label", "verzending.transporteur", "order.transporteur", "transporteur"],
52
+ carrier_label: ["carrier_label", "order.carrier_label"],
52
53
  verzendmethode: ["verzending.methode", "order.verzendmethode", "verzendmethode"],
53
54
  route: ["verzending.route", "order.route", "route"],
54
55
  track_trace: ["verzending.track_trace", "order.track_trace", "trackTrace"],
@@ -28,5 +28,11 @@ export declare function zorgVoorStandaardLayoutsMetStatus(db: Db): Promise<{
28
28
  * (met de knop "Overnemen uit factuurgegevens"). Raakt de database niet.
29
29
  */
30
30
  export declare function zorgVoorBedrijfsgegevens(_db: Db): Promise<boolean>;
31
+ /**
32
+ * Ensure: zet de verkleininstelling per stickersoort in app_settings als die
33
+ * nog ontbreekt (gegevens reizen niet mee met de schemasync). Vult alleen
34
+ * ontbrekende soorten aan; een bestaande keuze wordt nooit overschreven.
35
+ */
36
+ export declare function zorgVoorStickerInstellingen(db: Db): Promise<boolean>;
31
37
  export {};
32
38
  //# sourceMappingURL=standaardLayouts.server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"standaardLayouts.server.d.ts","sourceRoot":"","sources":["../../src/lib/standaardLayouts.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAExC,eAAO,MAAM,wBAAwB,2MACqK,CAAC;AAE3M,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKrH;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAmBrG;AAED,kDAAkD;AAClD,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5E;AAED,wBAAsB,iCAAiC,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAOrH;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE"}
1
+ {"version":3,"file":"standaardLayouts.server.d.ts","sourceRoot":"","sources":["../../src/lib/standaardLayouts.server.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAExC,eAAO,MAAM,wBAAwB,2MACqK,CAAC;AAE3M,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKrH;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAmBrG;AAED,kDAAkD;AAClD,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5E;AAED,wBAAsB,iCAAiC,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAQrH;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAK1E"}
@@ -55,6 +55,7 @@ export async function zorgVoorStandaardLayoutsMetStatus(db) {
55
55
  const aanvulling = await vulStandaardenAan(db);
56
56
  if (aanvulling.schemaOntbreekt)
57
57
  return { aantal: 0, schemaOntbreekt: true };
58
+ await zorgVoorStickerInstellingen(db).catch(() => false);
58
59
  const { data, error: rpcFout } = await db.rpc("layout_zorg_systeemlayouts");
59
60
  if (rpcFout)
60
61
  throw new Error(`Standaardlayouts controleren mislukt: ${rpcFout.message}`);
@@ -70,3 +71,15 @@ export async function zorgVoorStandaardLayoutsMetStatus(db) {
70
71
  export async function zorgVoorBedrijfsgegevens(_db) {
71
72
  return false;
72
73
  }
74
+ /**
75
+ * Ensure: zet de verkleininstelling per stickersoort in app_settings als die
76
+ * nog ontbreekt (gegevens reizen niet mee met de schemasync). Vult alleen
77
+ * ontbrekende soorten aan; een bestaande keuze wordt nooit overschreven.
78
+ */
79
+ export async function zorgVoorStickerInstellingen(db) {
80
+ // 1.69.12: de standaardwaarden staan alleen in de databasefunctie.
81
+ const { error } = await db.rpc("layouts_zorg_voor_sticker_verkleinen");
82
+ if (error)
83
+ throw new Error(`Stickerinstellingen aanvullen mislukt: ${error.message}`);
84
+ return true;
85
+ }