@flowselections/layout-maker 1.69.5 → 1.69.10
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.
- package/dist-lib/components/AfleverbriefBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/AfleverbriefBuilderPage.js +16 -8
- package/dist-lib/components/BlokOntwerperPage.d.ts.map +1 -1
- package/dist-lib/components/BlokOntwerperPage.js +15 -8
- package/dist-lib/components/FormaatOrientatieBar.d.ts +2 -1
- package/dist-lib/components/FormaatOrientatieBar.d.ts.map +1 -1
- package/dist-lib/components/FormaatOrientatieBar.js +6 -4
- package/dist-lib/components/PakbonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/PakbonBuilderPage.js +16 -8
- package/dist-lib/components/ProductiebonBuilderPage.d.ts.map +1 -1
- package/dist-lib/components/ProductiebonBuilderPage.js +16 -10
- package/dist-lib/components/SysteemLayoutMelding.d.ts +6 -0
- package/dist-lib/components/SysteemLayoutMelding.d.ts.map +1 -0
- package/dist-lib/components/SysteemLayoutMelding.js +29 -0
- package/dist-lib/integrations/supabase/types.d.ts +220 -10
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/documentProfiles.js +2 -2
- package/dist-lib/lib/eigenDocumenten.d.ts.map +1 -1
- package/dist-lib/lib/eigenDocumenten.js +1 -0
- package/dist-lib/lib/fieldRegistry.js +3 -2
- package/dist-lib/lib/htmlPdf.server.d.ts.map +1 -1
- package/dist-lib/lib/htmlPdf.server.js +46 -4
- package/dist-lib/lib/layoutOpslaan.d.ts +16 -0
- package/dist-lib/lib/layoutOpslaan.d.ts.map +1 -0
- package/dist-lib/lib/layoutOpslaan.js +56 -0
- package/dist-lib/lib/orderData.server.d.ts.map +1 -1
- package/dist-lib/lib/orderData.server.js +7 -3
- package/dist-lib/lib/pakbonBuilder.d.ts +13 -0
- package/dist-lib/lib/pakbonBuilder.d.ts.map +1 -1
- package/dist-lib/lib/pakbonBuilder.js +53 -9
- package/dist-lib/lib/pakbonHtml.d.ts +2 -0
- package/dist-lib/lib/pakbonHtml.d.ts.map +1 -1
- package/dist-lib/lib/pakbonHtml.js +35 -7
- package/dist-lib/lib/printQueue.server.d.ts +13 -0
- package/dist-lib/lib/printQueue.server.d.ts.map +1 -1
- package/dist-lib/lib/printQueue.server.js +81 -4
- package/dist-lib/lib/profielHtml.d.ts.map +1 -1
- package/dist-lib/lib/profielHtml.js +2 -1
- package/dist-lib/lib/useDocumentData.d.ts +1 -0
- package/dist-lib/lib/useDocumentData.d.ts.map +1 -1
- package/dist-lib/lib/useDocumentData.js +9 -2
- package/dist-lib/lib/versie.generated.d.ts +1 -1
- package/dist-lib/lib/versie.generated.d.ts.map +1 -1
- package/dist-lib/lib/versie.generated.js +1 -1
- package/dist-lib/lib/vervoerder.d.ts +27 -3
- package/dist-lib/lib/vervoerder.d.ts.map +1 -1
- package/dist-lib/lib/vervoerder.js +65 -10
- package/package.json +2 -2
|
@@ -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, 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, 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";
|
|
@@ -24,8 +24,12 @@ const cel = (p, veld) => {
|
|
|
24
24
|
return "";
|
|
25
25
|
if (veld === "qrcode")
|
|
26
26
|
return "";
|
|
27
|
+
if (veld === "aantal" && p.aantal_onbekend)
|
|
28
|
+
return AANTAL_ONBEKEND;
|
|
27
29
|
return String(p[veld] ?? "");
|
|
28
30
|
};
|
|
31
|
+
/** Melding bij een regel waarvan het aantal planten niet te bepalen is. */
|
|
32
|
+
export const AANTAL_ONBEKEND = "Planten per fust onbekend";
|
|
29
33
|
/** Rendert uitsluitend een bestaande barcodewaarde uit de Engine-payload. */
|
|
30
34
|
function barcodeHtml(value, hoogteMm = 15) {
|
|
31
35
|
const tekst = String(value ?? "").trim();
|
|
@@ -150,6 +154,7 @@ function normProduct(p) {
|
|
|
150
154
|
fust_aantal: Number(p["fust_aantal"] ?? 0) || 0,
|
|
151
155
|
fustsoort: String(p["fustsoort"] ?? ""),
|
|
152
156
|
planten_per_fust: Number(p["planten_per_fust"] ?? 0) || 0,
|
|
157
|
+
...(p["aantal_onbekend"] === true ? { aantal_onbekend: true } : {}),
|
|
153
158
|
sticker: p["sticker"] == null || p["sticker"] === "" ? "–" : String(p["sticker"]),
|
|
154
159
|
onderdelen: Array.isArray(p["onderdelen"])
|
|
155
160
|
? p["onderdelen"].map((o) => ({
|
|
@@ -502,7 +507,9 @@ function fustVerzamellijstHtml(order, s) {
|
|
|
502
507
|
}
|
|
503
508
|
function karrenHtml(s, order, zoek,
|
|
504
509
|
/** Kop die op iedere nieuwe karpagina wordt herhaald (HELE KAR / DEELKAR). */
|
|
505
|
-
paginaKop = ""
|
|
510
|
+
paginaKop = "",
|
|
511
|
+
/** Kopblokken met `herhalen = "eerste_per_kar"`, vanaf de tweede kar. */
|
|
512
|
+
karStartKop = "") {
|
|
506
513
|
const modus = optS(s, "modus", "pagina");
|
|
507
514
|
if (modus === "geen")
|
|
508
515
|
return "";
|
|
@@ -526,13 +533,15 @@ paginaKop = "") {
|
|
|
526
533
|
const laagGroepen = groepeerIdentiekeLagen(lagen, String(lagenModus) === "gebundeld");
|
|
527
534
|
laagGroepen.forEach((lg, j) => {
|
|
528
535
|
const breek = i > 0 || j > 0;
|
|
529
|
-
|
|
536
|
+
const karKop = i > 0 && j === 0 ? karStartKop : "";
|
|
537
|
+
delen.push(`<div class="${breek ? "breekvoor" : ""}">${breek ? paginaKop : ""}${karKop}${blokFrame(s, karBlok(s, kar, [lg.laag], zoek, modus === "blok" || modus === "passend", groep.aantal))}</div>`);
|
|
530
538
|
});
|
|
531
539
|
return;
|
|
532
540
|
}
|
|
533
541
|
const breek = i > 0 && perPagina;
|
|
534
542
|
const scheider = i > 0 && !perPagina ? scheidingHtml(scheiding) : "";
|
|
535
|
-
|
|
543
|
+
const karKop = i > 0 ? karStartKop : "";
|
|
544
|
+
delen.push(`<div class="${breek ? "breekvoor" : ""} ${modus === "passend" ? "heelhouden" : ""}">${breek ? paginaKop : ""}${scheider}${karKop}${blokFrame(s, karBlok(s, kar, lagen, zoek, modus === "blok" || modus === "passend", groep.aantal))}</div>`);
|
|
536
545
|
});
|
|
537
546
|
return delen.join("");
|
|
538
547
|
}
|
|
@@ -731,14 +740,33 @@ export function renderPakbonBody(config, order, opties = {}) {
|
|
|
731
740
|
const klantKop = klantNaam
|
|
732
741
|
? `<div class="blok" style="font-size:16pt;font-weight:800;line-height:1.15">${esc(klantNaam)}</div>`
|
|
733
742
|
: "";
|
|
734
|
-
|
|
743
|
+
// "Weergave bij meerdere pakbonnen" per kopblok; ontbreekt = "document"
|
|
744
|
+
// (huidig gedrag). De grote klantnaam volgt de keuze van klantgegevens.
|
|
745
|
+
const herhaal = (s) => (HERHAAL_SECTIES.has(String(s.type)) ? kopHerhalen(s) : "document");
|
|
746
|
+
const klantSectie = zoek("klantgegevens");
|
|
747
|
+
const klantModus = klantSectie ? herhaal(klantSectie) : "document";
|
|
748
|
+
const kop = variantKop + (klantModus === "elke_pagina" ? "" : klantKop) + documentLogoHtml(cfg.logo, opts);
|
|
749
|
+
const karStartKop = (klantModus === "eerste_per_kar" ? klantKop : "") +
|
|
750
|
+
secties
|
|
751
|
+
.filter((s) => herhaal(s) === "eerste_per_kar")
|
|
752
|
+
.map((s) => blokFrame(s, sectieHtml(s, order, zoek, opts)))
|
|
753
|
+
.join("");
|
|
754
|
+
const paginaKopInhoud = (klantModus === "elke_pagina" ? klantKop : "") +
|
|
755
|
+
secties
|
|
756
|
+
.filter((s) => herhaal(s) === "elke_pagina")
|
|
757
|
+
.map((s) => blokFrame(s, sectieHtml(s, order, zoek, opts)))
|
|
758
|
+
.join("");
|
|
759
|
+
// De PDF-motor tekent .paginakop bovenaan iedere pagina en houdt die
|
|
760
|
+
// hoogte vrij van het afdrukgebied; in de HTML staat hij één keer bovenaan.
|
|
761
|
+
const paginaKop = paginaKopInhoud && !opties.zonderPaginavoet ? `<div class="paginakop">${paginaKopInhoud}</div>` : "";
|
|
735
762
|
const totalenSectie = zoek("totalen");
|
|
736
763
|
const totalenElkePagina = !!totalenSectie && opt(totalenSectie, "elke_pagina", false) === true;
|
|
737
764
|
const inhoud = secties
|
|
738
765
|
.filter((s) => !(s.type === "totalen" && totalenElkePagina))
|
|
739
766
|
.filter((s) => !(s.type === "barcode" && heeftKarBarcodes))
|
|
767
|
+
.filter((s) => herhaal(s) !== "elke_pagina")
|
|
740
768
|
.map((s) => s.type === "karren"
|
|
741
|
-
? karrenHtml(s, order, zoek, variantKop)
|
|
769
|
+
? karrenHtml(s, order, zoek, variantKop, karStartKop)
|
|
742
770
|
: blokFrame(s, sectieHtml(s, order, zoek, opts)))
|
|
743
771
|
.join("");
|
|
744
772
|
const pickSectie = alleSecties.find((s) => s.type === "pickmethode");
|
|
@@ -759,7 +787,7 @@ export function renderPakbonBody(config, order, opties = {}) {
|
|
|
759
787
|
const voet = totalenElkePagina && totalenSectie && !opties.zonderPaginavoet
|
|
760
788
|
? `<div class="paginavoet">${sectieHtml(totalenSectie, order, zoek, opts)}</div>`
|
|
761
789
|
: "";
|
|
762
|
-
return kop + inhoud + (barcode ? `<div class="blok">${barcode}</div>` : "") + voet;
|
|
790
|
+
return paginaKop + kop + inhoud + (barcode ? `<div class="blok">${barcode}</div>` : "") + voet;
|
|
763
791
|
}
|
|
764
792
|
/** Het documentlogo bovenaan de pakbon. */
|
|
765
793
|
function documentLogoHtml(logoCfg, opties) {
|
|
@@ -17,6 +17,19 @@ export declare class GeenDocumentFout extends Error {
|
|
|
17
17
|
export declare class WachtOpLayoutFout extends Error {
|
|
18
18
|
name: string;
|
|
19
19
|
}
|
|
20
|
+
/** Geen vervoerder (of Engine te oud): wachten tot hij is ingesteld, onbegrensd. */
|
|
21
|
+
export declare class WachtOpVervoerderFout extends Error {
|
|
22
|
+
name: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Bepaalt de vervoerder voor een eigen document. Alleen carrier_label uit de
|
|
26
|
+
* Engine (payload of logistics_brief_transport). Geeft null voor documenten
|
|
27
|
+
* zonder vervoerder (of Floriday 1-op-1). Gooit WachtOpVervoerderFout als hij
|
|
28
|
+
* ontbreekt; nooit een naam opzoeken, nooit "onbekend".
|
|
29
|
+
*/
|
|
30
|
+
export declare function bepaalVervoerder(db: PrintDb, job: Job, p: Job, layout: Job | null): Promise<string | null>;
|
|
31
|
+
/** Wacht op een vervoerder: blijft wachtend (geen eindstatus), reden zichtbaar in de wachtrij. */
|
|
32
|
+
export declare function wachtOpVervoerder(db: PrintDb, job: Job, reden: string): Promise<"wachtend">;
|
|
20
33
|
/** Blijvende contractfout: opnieuw proberen met dezelfde invoer kan niet slagen. */
|
|
21
34
|
export declare class EngineContractFout extends GeenDocumentFout {
|
|
22
35
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,OAAO,EAAuG,KAAK,gBAAgB,EAAkF,MAAM,mBAAmB,CAAC;AAc/O,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;AAiFD,2EAA2E;AAC3E,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;CACpC;AAED,+EAA+E;AAC/E,qBAAa,iBAAkB,SAAQ,KAAK;IACjC,IAAI,SAAuB;CACrC;AAED,oFAAoF;AACpF,qBAAa,kBAAmB,SAAQ,gBAAgB;IAC7C,IAAI,SAAwB;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;AAE5G,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAcnD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AASD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQnD;AAkCD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAIlE;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAe7C;AA8ND;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQlH;AAWD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqClF;AA2UD;;;;GAIG;AACH,gEAAgE;AAChE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMpG;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4CtG;AAoBD,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"printQueue.server.d.ts","sourceRoot":"","sources":["../../src/lib/printQueue.server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,OAAO,EAAuG,KAAK,gBAAgB,EAAkF,MAAM,mBAAmB,CAAC;AAc/O,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE/B,mFAAmF;AACnF,MAAM,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW1E;AAiFD,2EAA2E;AAC3E,qBAAa,gBAAiB,SAAQ,KAAK;IAChC,IAAI,SAAsB;CACpC;AAED,+EAA+E;AAC/E,qBAAa,iBAAkB,SAAQ,KAAK;IACjC,IAAI,SAAuB;CACrC;AAED,oFAAoF;AACpF,qBAAa,qBAAsB,SAAQ,KAAK;IACrC,IAAI,SAA2B;CACzC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBhH;AAED,kGAAkG;AAClG,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBjG;AAED,oFAAoF;AACpF,qBAAa,kBAAmB,SAAQ,gBAAgB;IAC7C,IAAI,SAAwB;CACtC;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,GAAG,eAAe,CAAC;AAE5G,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAcnD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AASD,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQnD;AAkCD,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAIlE;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAe7C;AA8ND;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQlH;AAWD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqClF;AA2UD;;;;GAIG;AACH,gEAAgE;AAChE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMpG;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4CtG;AAoBD,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,MAAM,CAAC,CAmdjB;AAGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAY1D;AAqBD,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAsCzG;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,EAAE,OAAO,EAAE,MAAM,iBAiBxH;AAED,mFAAmF;AACnF,wBAAsB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,iBAiBpD;AA8YD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAOD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGlG;AAqID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,SAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8GtF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,GAAG,GACP,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA6B1D"}
|
|
@@ -3,13 +3,13 @@
|
|
|
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 { carrierUitPayload, carrierUitTransport, ENGINE_TE_OUD, geenVervoerderTekst, metVervoerder, VERVOERDER_DOCUMENTEN, voorbeeldVervoerder } from "./vervoerder.js";
|
|
7
7
|
import { maakPakbonOrder, renderPakbonDocument, voorbeeldPakbonOrder, } from "./pakbonHtml.js";
|
|
8
8
|
import { bouwPakbonScanInhoud, bewaarPakbonScanInhoud } from "./pakbonScan.js";
|
|
9
9
|
import { bouwPakbonBarcodeVerzoek, geleverdeBarcodeVoorJob, vraagPakbonBarcodeAan, } from "./pakbonBarcodeVerzoek.js";
|
|
10
10
|
import { bepaalVolleKarStand, deelkarRegels, leesAfleverbriefConfig, pakbonLayoutVariant, } from "./pakbonBuilder.js";
|
|
11
11
|
import { renderProductiebonDocument } from "./productiebonHtml.js";
|
|
12
|
-
import { heeftOrderInhoud, laadOrderVanuitDatabase, laadPakbonData } from "./orderData.server.js";
|
|
12
|
+
import { heeftOrderInhoud, laadOrderVanuitDatabase, laadPakbonData, zoekOrderVerwijzing } from "./orderData.server.js";
|
|
13
13
|
import { profielHeeftInhoud, renderProfielDocument } from "./profielHtml.js";
|
|
14
14
|
import { bouwDocumentHtml, voorbeeldContext } from "./layoutPreview.js";
|
|
15
15
|
import { AfbeeldingInhoudFout, htmlNaarPdfServer, PdfRenderFout } from "./htmlNaarPdf.server.js";
|
|
@@ -132,6 +132,71 @@ export class WachtOpLayoutFout extends Error {
|
|
|
132
132
|
this.name = "WachtOpLayoutFout";
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
|
+
/** Geen vervoerder (of Engine te oud): wachten tot hij is ingesteld, onbegrensd. */
|
|
136
|
+
export class WachtOpVervoerderFout extends Error {
|
|
137
|
+
constructor() {
|
|
138
|
+
super(...arguments);
|
|
139
|
+
this.name = "WachtOpVervoerderFout";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Bepaalt de vervoerder voor een eigen document. Alleen carrier_label uit de
|
|
144
|
+
* Engine (payload of logistics_brief_transport). Geeft null voor documenten
|
|
145
|
+
* zonder vervoerder (of Floriday 1-op-1). Gooit WachtOpVervoerderFout als hij
|
|
146
|
+
* ontbreekt; nooit een naam opzoeken, nooit "onbekend".
|
|
147
|
+
*/
|
|
148
|
+
export async function bepaalVervoerder(db, job, p, layout) {
|
|
149
|
+
const dt = normaliseerDocumenttype(layout?.documenttype ?? job.documenttype);
|
|
150
|
+
if (!VERVOERDER_DOCUMENTEN.includes(dt))
|
|
151
|
+
return null;
|
|
152
|
+
if (String(layout?.bron ?? "") === "floriday" || String(p._herkomst ?? "") === "floriday")
|
|
153
|
+
return null;
|
|
154
|
+
if (isTestprintJob(job) || p.voorbeeld === true)
|
|
155
|
+
return voorbeeldVervoerder(p);
|
|
156
|
+
const ref = zoekOrderVerwijzing(p);
|
|
157
|
+
const ordernummer = String(ref.ordernummer ?? p.order_number ?? p.ordernummer ?? "").trim();
|
|
158
|
+
let r = carrierUitPayload(p);
|
|
159
|
+
if (r.soort === "afwezig") {
|
|
160
|
+
if (!ref.orderId) {
|
|
161
|
+
// Engine-opdracht zonder carrier_label en zonder order: Engine te oud.
|
|
162
|
+
if (isEngineOpdracht(job))
|
|
163
|
+
throw new WachtOpVervoerderFout(ENGINE_TE_OUD);
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const { data, error } = await db.rpc("logistics_brief_transport", {
|
|
167
|
+
p_order_id: ref.orderId,
|
|
168
|
+
...(ref.cartId ? { p_cart_id: ref.cartId } : {}),
|
|
169
|
+
});
|
|
170
|
+
if (error)
|
|
171
|
+
throw new WachtOpVervoerderFout(`${ENGINE_TE_OUD} (${String(error.message ?? "").slice(0, 120)})`);
|
|
172
|
+
r = carrierUitTransport(data);
|
|
173
|
+
if (r.soort === "afwezig")
|
|
174
|
+
throw new WachtOpVervoerderFout(ENGINE_TE_OUD);
|
|
175
|
+
}
|
|
176
|
+
if (r.soort === "geen")
|
|
177
|
+
throw new WachtOpVervoerderFout(geenVervoerderTekst(ordernummer));
|
|
178
|
+
return r.label;
|
|
179
|
+
}
|
|
180
|
+
/** Wacht op een vervoerder: blijft wachtend (geen eindstatus), reden zichtbaar in de wachtrij. */
|
|
181
|
+
export async function wachtOpVervoerder(db, job, reden) {
|
|
182
|
+
const nu = new Date().toISOString();
|
|
183
|
+
await db
|
|
184
|
+
.from("print_jobs")
|
|
185
|
+
.update({
|
|
186
|
+
status: "wachtend",
|
|
187
|
+
foutcode: "GEEN_VERVOERDER",
|
|
188
|
+
foutmelding: reden.slice(0, 500),
|
|
189
|
+
pogingen: Number(job.pogingen ?? 0) + 1,
|
|
190
|
+
volgende_poging: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
|
|
191
|
+
opgepakt_op: null,
|
|
192
|
+
voltooid_op: null,
|
|
193
|
+
updated_at: nu,
|
|
194
|
+
})
|
|
195
|
+
.eq("id", job.id)
|
|
196
|
+
.neq("status", "geannuleerd");
|
|
197
|
+
await log(db, job.id, "wacht_op_vervoerder", reden);
|
|
198
|
+
return "wachtend";
|
|
199
|
+
}
|
|
135
200
|
/** Blijvende contractfout: opnieuw proberen met dezelfde invoer kan niet slagen. */
|
|
136
201
|
export class EngineContractFout extends GeenDocumentFout {
|
|
137
202
|
constructor() {
|
|
@@ -922,6 +987,8 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
|
|
|
922
987
|
return meegestuurd;
|
|
923
988
|
}
|
|
924
989
|
const p = (job.payload ?? {});
|
|
990
|
+
// Vervoerder: alleen carrier_label uit de Engine. Ontbreekt hij → wachten.
|
|
991
|
+
const carrierLabel = await bepaalVervoerder(db, job, p, layout);
|
|
925
992
|
const liggend = String(layout.orientatie ?? "portrait") === "landscape";
|
|
926
993
|
const b = Number(layout.breedte_mm ?? 210);
|
|
927
994
|
const h = Number(layout.hoogte_mm ?? 297);
|
|
@@ -997,7 +1064,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
|
|
|
997
1064
|
const gekozen = (cartId ? karren.find((k) => String(k?.cart_id ?? "").trim() === cartId) : null) ??
|
|
998
1065
|
karren[0] ??
|
|
999
1066
|
null;
|
|
1000
|
-
const metTerugval = await metBedrijfsTerugval(db, { ...volledig, karren: gekozen ? [gekozen] : [] }, layout);
|
|
1067
|
+
const metTerugval = await metBedrijfsTerugval(db, metVervoerder({ ...volledig, karren: gekozen ? [gekozen] : [] }, p, carrierLabel), layout);
|
|
1001
1068
|
const order = metTerugval.order;
|
|
1002
1069
|
layout = metTerugval.layout;
|
|
1003
1070
|
return renderPakbonDocument(leesAfleverbriefConfig(layout.config), order, {
|
|
@@ -1074,7 +1141,7 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
|
|
|
1074
1141
|
if (isTestpakbon)
|
|
1075
1142
|
order = zonderBarcodes(order);
|
|
1076
1143
|
// Vervoerder/ophaalmoment alleen uit de printopdracht; ontbrekend = weglaten.
|
|
1077
|
-
order = metVervoerder(order, p);
|
|
1144
|
+
order = metVervoerder(order, p, carrierLabel);
|
|
1078
1145
|
if (isEngineOpdracht(job) && !isTestpakbon) {
|
|
1079
1146
|
let barcode = String(engineBarcode ?? "").trim();
|
|
1080
1147
|
if (!barcode) {
|
|
@@ -1271,6 +1338,13 @@ export async function bouwHtml(db, job, keuze, uitkomst) {
|
|
|
1271
1338
|
? null
|
|
1272
1339
|
: await laadOrderVanuitDatabase(db, p).catch(() => null);
|
|
1273
1340
|
const gegevens = { ...(uitDatabase ?? {}), ...(meegegeven ?? {}) };
|
|
1341
|
+
if (carrierLabel !== null) {
|
|
1342
|
+
// Eén bron: carrier_label. Overschrijft elke andere transporteurwaarde.
|
|
1343
|
+
gegevens.carrier_label = carrierLabel;
|
|
1344
|
+
gegevens.transporteur = carrierLabel;
|
|
1345
|
+
gegevens.verzending = { ...(gegevens.verzending ?? {}), transporteur: carrierLabel };
|
|
1346
|
+
gegevens.order = { ...(gegevens.order ?? {}), transporteur: carrierLabel, carrier_label: carrierLabel };
|
|
1347
|
+
}
|
|
1274
1348
|
const profielData = p.voorbeeld === true ? { ...voorbeeldContext(), ...(gegevens ?? {}) } : gegevens;
|
|
1275
1349
|
const profielHtml = renderProfielDocument(String(layout.documenttype), cfg, profielData, {
|
|
1276
1350
|
breedteMm,
|
|
@@ -1749,6 +1823,9 @@ async function verwerkJob(db, job) {
|
|
|
1749
1823
|
return "verstuurd";
|
|
1750
1824
|
}
|
|
1751
1825
|
catch (e) {
|
|
1826
|
+
if (e instanceof WachtOpVervoerderFout) {
|
|
1827
|
+
return await wachtOpVervoerder(db, job, e.message);
|
|
1828
|
+
}
|
|
1752
1829
|
if (e instanceof WachtOpLayoutFout) {
|
|
1753
1830
|
return await wachtOpLayout(db, job, e.message);
|
|
1754
1831
|
}
|
|
@@ -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;
|
|
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"],
|
|
@@ -89,6 +89,7 @@ export interface LayoutConflict {
|
|
|
89
89
|
/** Documentsoorten met meer dan één actieve layout binnen dezelfde bron. */
|
|
90
90
|
export declare function layoutConflicten(layouts: LayoutModel[]): LayoutConflict[];
|
|
91
91
|
export declare function verwijderLayout(id: string): Promise<void>;
|
|
92
|
+
export declare const LAYOUT_NIET_OPGESLAGEN = "Layout niet opgeslagen: geen rechten of layout niet gevonden";
|
|
92
93
|
export declare function updateLayout(id: string, patch: Record<string, unknown>): Promise<void>;
|
|
93
94
|
export declare function useLayoutDetail(layoutId: string): {
|
|
94
95
|
layout: LayoutModel | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useDocumentData.d.ts","sourceRoot":"","sources":["../../src/lib/useDocumentData.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,6 +84,9 @@ export async function dupliceerLayout(id) {
|
|
|
84
84
|
delete b.standaard_versie;
|
|
85
85
|
b.naam = `${String(b.naam)} (kopie)`;
|
|
86
86
|
b.is_standaard = false;
|
|
87
|
+
// Een kopie van een systeemlayout is zelf aanpasbaar.
|
|
88
|
+
if ("systeem" in b)
|
|
89
|
+
b.systeem = false;
|
|
87
90
|
const { data: nieuw, error } = await supabase
|
|
88
91
|
.from("document_layouts")
|
|
89
92
|
.insert(b)
|
|
@@ -151,13 +154,17 @@ export async function verwijderLayout(id) {
|
|
|
151
154
|
if (error)
|
|
152
155
|
throw error;
|
|
153
156
|
}
|
|
157
|
+
export const LAYOUT_NIET_OPGESLAGEN = "Layout niet opgeslagen: geen rechten of layout niet gevonden";
|
|
154
158
|
export async function updateLayout(id, patch) {
|
|
155
|
-
const { error } = await supabase
|
|
159
|
+
const { data, error } = await supabase
|
|
156
160
|
.from("document_layouts")
|
|
157
161
|
.update(patch)
|
|
158
|
-
.eq("id", id)
|
|
162
|
+
.eq("id", id)
|
|
163
|
+
.select("id");
|
|
159
164
|
if (error)
|
|
160
165
|
throw error;
|
|
166
|
+
if (!Array.isArray(data) || data.length === 0)
|
|
167
|
+
throw new Error(LAYOUT_NIET_OPGESLAGEN);
|
|
161
168
|
}
|
|
162
169
|
export function useLayoutDetail(layoutId) {
|
|
163
170
|
const [layout, setLayout] = useState(null);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PAKKET_VERSIE = "1.69.
|
|
1
|
+
export declare const PAKKET_VERSIE = "1.69.10";
|
|
2
2
|
//# sourceMappingURL=versie.generated.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versie.generated.d.ts","sourceRoot":"","sources":["../../src/lib/versie.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"versie.generated.d.ts","sourceRoot":"","sources":["../../src/lib/versie.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,YAAY,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Gegenereerd door scripts/schrijf-versie.cjs uit package.json. Niet met de hand wijzigen.
|
|
2
|
-
export const PAKKET_VERSIE = "1.69.
|
|
2
|
+
export const PAKKET_VERSIE = "1.69.10";
|
|
@@ -3,11 +3,35 @@ export interface VervoerderInfo {
|
|
|
3
3
|
ophaalmoment: string;
|
|
4
4
|
ophaaladres: string;
|
|
5
5
|
}
|
|
6
|
+
/** Documentsoorten van deze module die een vervoerder moeten tonen. */
|
|
7
|
+
export declare const VERVOERDER_DOCUMENTEN: readonly ["pakbon", "afleverbrief", "verzendlabel", "transportdocument"];
|
|
8
|
+
/** Voorbeeldwaarden voor testprint en editor (geen echte vervoerdersnaam). */
|
|
9
|
+
export declare const VOORBEELD_VERVOERDERS: readonly ["Voorbeeld Transport BV", "Eigen vervoer", "Afhalen"];
|
|
10
|
+
export declare const ENGINE_TE_OUD = "Logistieke Engine 1.0.184 of hoger nodig: de opdracht bevat geen vervoerder (carrier_label). Er is niets geprint.";
|
|
11
|
+
export declare function geenVervoerderTekst(ordernummer: string): string;
|
|
12
|
+
export type CarrierUitkomst = {
|
|
13
|
+
soort: "ok";
|
|
14
|
+
label: string;
|
|
15
|
+
} | {
|
|
16
|
+
soort: "geen";
|
|
17
|
+
} | {
|
|
18
|
+
soort: "afwezig";
|
|
19
|
+
};
|
|
20
|
+
/** Kiest het voorbeeldlabel voor een testprint (alleen één van de drie). */
|
|
21
|
+
export declare function voorbeeldVervoerder(payload: unknown): string;
|
|
22
|
+
/** Leest carrier_label uit één transportobject (payload of logistics_brief_transport). */
|
|
23
|
+
export declare function carrierUitTransport(t: unknown): CarrierUitkomst;
|
|
24
|
+
/** Zoekt carrier_label in de payload (bovenin, transport, data, data.transport). */
|
|
25
|
+
export declare function carrierUitPayload(payload: unknown): CarrierUitkomst;
|
|
6
26
|
/** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
|
|
7
27
|
export declare function ophaalmomentTekst(iso: unknown): string;
|
|
8
|
-
|
|
9
|
-
|
|
28
|
+
/** Ophaalmoment/-adres uit de payload. De vervoerder komt hier NIET vandaan. */
|
|
29
|
+
export declare function vervoerderUitPayload(payload: unknown, carrierLabel?: string | null): VervoerderInfo;
|
|
30
|
+
/**
|
|
31
|
+
* Zet vervoerder (alleen carrier_label) en ophaalgegevens op order.transport.
|
|
32
|
+
* Elke andere bronwaarde voor de transporteur wordt overschreven: geen terugval.
|
|
33
|
+
*/
|
|
10
34
|
export declare function metVervoerder<T extends {
|
|
11
35
|
transport: Record<string, unknown>;
|
|
12
|
-
}>(order: T, payload: unknown): T;
|
|
36
|
+
}>(order: T, payload: unknown, carrierLabel?: string | null): T;
|
|
13
37
|
//# sourceMappingURL=vervoerder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vervoerder.d.ts","sourceRoot":"","sources":["../../src/lib/vervoerder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vervoerder.d.ts","sourceRoot":"","sources":["../../src/lib/vervoerder.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,0EAA2E,CAAC;AAE9G,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,iEAAkE,CAAC;AAErG,eAAO,MAAM,aAAa,sHAC2F,CAAC;AAEtH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEzB,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAG5D;AAMD,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,CAa/D;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAWnE;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAUtD;AAeD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,cAAc,CAQzG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAC5E,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,CAAC,CAYH"}
|
|
@@ -1,8 +1,61 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// src/lib/vervoerder.ts — vervoerder en ophaalmoment uit de printopdracht.
|
|
3
|
-
//
|
|
3
|
+
// De vervoerder komt uitsluitend uit `carrier_label` van de Logistieke Engine
|
|
4
|
+
// (1.0.184+). Nooit opzoeken op naam, nooit terugvallen op een andere naam.
|
|
4
5
|
// ============================================================================
|
|
5
6
|
const tekst = (v) => (typeof v === "string" ? v.trim() : "");
|
|
7
|
+
const obj = (v) => (v && typeof v === "object" ? v : null);
|
|
8
|
+
/** Documentsoorten van deze module die een vervoerder moeten tonen. */
|
|
9
|
+
export const VERVOERDER_DOCUMENTEN = ["pakbon", "afleverbrief", "verzendlabel", "transportdocument"];
|
|
10
|
+
/** Voorbeeldwaarden voor testprint en editor (geen echte vervoerdersnaam). */
|
|
11
|
+
export const VOORBEELD_VERVOERDERS = ["Voorbeeld Transport BV", "Eigen vervoer", "Afhalen"];
|
|
12
|
+
export const ENGINE_TE_OUD = "Logistieke Engine 1.0.184 of hoger nodig: de opdracht bevat geen vervoerder (carrier_label). Er is niets geprint.";
|
|
13
|
+
export function geenVervoerderTekst(ordernummer) {
|
|
14
|
+
const nr = ordernummer.trim() || "zonder nummer";
|
|
15
|
+
return `Geen vervoerder bij order ${nr}: stel er een in bij de order of bij Afhandeling → Vervoerders`;
|
|
16
|
+
}
|
|
17
|
+
/** Kiest het voorbeeldlabel voor een testprint (alleen één van de drie). */
|
|
18
|
+
export function voorbeeldVervoerder(payload) {
|
|
19
|
+
const gevraagd = tekst(obj(payload)?.["voorbeeld_carrier_label"]);
|
|
20
|
+
return VOORBEELD_VERVOERDERS.includes(gevraagd) ? gevraagd : VOORBEELD_VERVOERDERS[0];
|
|
21
|
+
}
|
|
22
|
+
function isGeenBron(o) {
|
|
23
|
+
return [o["carrier_source"], o["vervoerder_bron"], o["bron"]].some((v) => tekst(v).toLowerCase() === "geen");
|
|
24
|
+
}
|
|
25
|
+
/** Leest carrier_label uit één transportobject (payload of logistics_brief_transport). */
|
|
26
|
+
export function carrierUitTransport(t) {
|
|
27
|
+
const o = obj(t);
|
|
28
|
+
if (!o)
|
|
29
|
+
return { soort: "afwezig" };
|
|
30
|
+
if (isGeenBron(o))
|
|
31
|
+
return { soort: "geen" };
|
|
32
|
+
const label = tekst(o["carrier_label"]);
|
|
33
|
+
if (label)
|
|
34
|
+
return { soort: "ok", label };
|
|
35
|
+
if ("carrier_label" in o)
|
|
36
|
+
return { soort: "geen" };
|
|
37
|
+
// De Engine meldt zelf dat de vervoerder ontbreekt.
|
|
38
|
+
const onbekend = Array.isArray(o["onbekend"]) ? o["onbekend"].map(tekst) : [];
|
|
39
|
+
if (onbekend.some((x) => x === "vervoerder" || x === "vervoerder_niet_eenduidig" || x === "order")) {
|
|
40
|
+
return { soort: "geen" };
|
|
41
|
+
}
|
|
42
|
+
return { soort: "afwezig" };
|
|
43
|
+
}
|
|
44
|
+
/** Zoekt carrier_label in de payload (bovenin, transport, data, data.transport). */
|
|
45
|
+
export function carrierUitPayload(payload) {
|
|
46
|
+
const p = obj(payload) ?? {};
|
|
47
|
+
const d = obj(p["data"]);
|
|
48
|
+
const plekken = [p, obj(p["transport"]), d, obj(d?.["transport"])];
|
|
49
|
+
let geen = false;
|
|
50
|
+
for (const plek of plekken) {
|
|
51
|
+
const r = carrierUitTransport(plek);
|
|
52
|
+
if (r.soort === "ok")
|
|
53
|
+
return r;
|
|
54
|
+
if (r.soort === "geen")
|
|
55
|
+
geen = true;
|
|
56
|
+
}
|
|
57
|
+
return geen ? { soort: "geen" } : { soort: "afwezig" };
|
|
58
|
+
}
|
|
6
59
|
/** ISO-tijd (UTC) → leesbaar in Europe/Amsterdam. Ongeldig → leeg. */
|
|
7
60
|
export function ophaalmomentTekst(iso) {
|
|
8
61
|
const s = tekst(iso);
|
|
@@ -31,26 +84,28 @@ function adresTekst(v) {
|
|
|
31
84
|
].filter(Boolean);
|
|
32
85
|
return delen.join(", ");
|
|
33
86
|
}
|
|
34
|
-
|
|
87
|
+
/** Ophaalmoment/-adres uit de payload. De vervoerder komt hier NIET vandaan. */
|
|
88
|
+
export function vervoerderUitPayload(payload, carrierLabel = null) {
|
|
35
89
|
const p = (payload && typeof payload === "object" ? payload : {});
|
|
36
|
-
const v = (p["vervoerder"] && typeof p["vervoerder"] === "object" ? p["vervoerder"] : {});
|
|
37
|
-
const naam = tekst(v["naam"]);
|
|
38
|
-
const code = tekst(v["code"]);
|
|
39
90
|
return {
|
|
40
|
-
transporteur:
|
|
91
|
+
transporteur: carrierLabel ?? "",
|
|
41
92
|
ophaalmoment: ophaalmomentTekst(p["ophaalmoment"]),
|
|
42
93
|
// Alleen payload.ophaaladres; vervoerder.adres wordt bewust genegeerd.
|
|
43
94
|
ophaaladres: adresTekst(p["ophaaladres"]),
|
|
44
95
|
};
|
|
45
96
|
}
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Zet vervoerder (alleen carrier_label) en ophaalgegevens op order.transport.
|
|
99
|
+
* Elke andere bronwaarde voor de transporteur wordt overschreven: geen terugval.
|
|
100
|
+
*/
|
|
101
|
+
export function metVervoerder(order, payload, carrierLabel = null) {
|
|
102
|
+
const v = vervoerderUitPayload(payload, carrierLabel);
|
|
49
103
|
return {
|
|
50
104
|
...order,
|
|
51
105
|
transport: {
|
|
52
106
|
...order.transport,
|
|
53
|
-
|
|
107
|
+
transporteur: v.transporteur,
|
|
108
|
+
carrier_label: v.transporteur,
|
|
54
109
|
ophaalmoment: v.ophaalmoment,
|
|
55
110
|
ophaaladres: v.ophaaladres,
|
|
56
111
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowselections/layout-maker",
|
|
3
|
-
"version": "1.69.
|
|
3
|
+
"version": "1.69.10",
|
|
4
4
|
"flowselections": {
|
|
5
5
|
"moduleId": "layout-maker",
|
|
6
6
|
"pages": [
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
"devDependencies": {
|
|
144
144
|
"@cloudflare/vite-plugin": "^1.25.5",
|
|
145
145
|
"@eslint/js": "^9.32.0",
|
|
146
|
-
"@flowselections/core": "1.0.
|
|
146
|
+
"@flowselections/core": "1.0.30",
|
|
147
147
|
"@lovable.dev/vite-tanstack-config": "2.26.5",
|
|
148
148
|
"@rsbuild/core": "^1.0.0",
|
|
149
149
|
"@tailwindcss/vite": "^4.2.1",
|