import type { InstellingDef } from "./documentProfiles.js"; export type PakbonSectieType = "logo" | "bedrijfsgegevens" | "klantgegevens" | "afleveradres" | "factuuradres" | "orderinformatie" | "transportinformatie" | "opmerkingen" | "orderregels" | "fustregels" | "pickmethode" | "karren" | "lagen" | "producten" | "fusten" | "totalen" | "handtekening" | "tekstblok" | "qrcode" | "barcode" | "afbeelding"; export interface PakbonKolom { key: string; label: string; breedte: number; uitlijning: "left" | "center" | "right"; fontfamilie?: string; fontgrootte?: number; kleur?: string; vet?: boolean; achtergrond?: string; rand?: boolean; } export interface PakbonConditie { veld: string; operator: "=" | "!=" | ">" | "<" | "bevat" | "leeg" | "niet_leeg"; waarde: string; } export interface PakbonSectie { id: string; type: PakbonSectieType; titel: string; zichtbaar: boolean; opties: Record; kolommen?: PakbonKolom[]; condities: PakbonConditie[]; } /** Logo dat op het hele document staat, los van de losse logo-sectie. */ export interface PakbonDocumentLogo { logoId: string | null; naam?: string | null; hoogte?: number; uitlijning?: "left" | "center" | "right"; } export interface PakbonConfig { secties: PakbonSectie[]; /** Documentlogo bovenaan elke pagina van dit document. */ logo?: PakbonDocumentLogo | null; } export declare const BESCHIKBARE_KOLOMMEN: { key: string; label: string; }[]; export declare function kolomLabel(key: string): string; export declare function nieuweKolom(key: string): PakbonKolom; /** * Geeft productvelden overal dezelfde relatieve breedte. Iedere laag wordt als * losse tabel gerenderd, dus de browser mag deze breedtes niet uit de inhoud * van één specifieke laag afleiden. */ export declare function productVeldBreedtes(velden: string[]): number[]; export interface SectieDef { type: PakbonSectieType; label: string; omschrijving: string; /** deze sectie werkt met een kolommenkiezer */ kolommen?: boolean; opties: InstellingDef[]; } export declare const FUST_VELD_OPTIES: { value: string; label: string; }[]; /** * Alle velden die op een fustregel van de afleverbrief kunnen staan. De * afleverbrief beschrijft één kar, dus kar- en laagnummer horen er ook bij. */ export declare const FUSTREGEL_VELD_OPTIES: { value: string; label: string; }[]; /** Labels van de fustregelvelden, gedeeld door scherm en afdruk. */ export declare const FUSTREGEL_LABELS: Record; /** Velden die rechts uitgelijnd horen te staan. */ export declare const FUSTREGEL_RECHTS: Set; export interface FustRegel { fustsoort: string; fusthoogte: string; belading: string; karnummer: string; laagnummer: string; artikelnummer: string; artikelnaam: string; potmaat: string; kleur: string; productgroep: string; locatie: string; planten_per_fust: number; fust_aantal: number; aantal: number; gewicht: string; barcode: string; } /** * Zet de karren van een levering om naar losse fustregels. Met `comprimeren` * komen identieke fusten (zelfde fustsoort, artikel, potmaat, kleur en aantal * planten per fust) op één regel te staan; het aantal fusten wordt opgeteld. * Zonder `comprimeren` krijgt elke losse fust een eigen regel. */ export declare function fustRegels(karren: unknown, opties?: { comprimeren?: boolean; sortering?: string; }): FustRegel[]; export declare const SECTIE_REGISTER: SectieDef[]; export declare function sectieDef(type: PakbonSectieType): SectieDef; export declare function nieuweSectie(type: PakbonSectieType): PakbonSectie; export declare function standaardPakbonConfig(): PakbonConfig; export declare function leesPakbonConfig(config: unknown): PakbonConfig; /** Standaardindeling van een afleverbrief: geen kar-, laag- of fustblokken. */ export declare function standaardAfleverbriefConfig(): PakbonConfig; /** * Blokken die op een afleverbrief thuishoren. Een afleverbrief beschrijft * altijd precies één kar, dus kar-, laag- en pickmethodeblokken vervallen. */ export declare const AFLEVERBRIEF_SECTIE_TYPES: PakbonSectieType[]; /** Leest de sectie-opbouw van een afleverbrief-layout. */ export declare function leesAfleverbriefConfig(config: unknown): PakbonConfig; /** Manier waarop de order gepickt wordt. */ export type PickMethode = "kar" | "fusten" | "beide"; /** Variant die de Logistics Engine voor een gecombineerde pakbon kiest. */ export type PakbonLayoutVariant = "full_cart" | "partial_order"; /** Normaliseert alleen de twee varianten uit het gedeelde Engine-contract. */ export declare function pakbonLayoutVariant(value: unknown): PakbonLayoutVariant | null; /** Actieve pickmethode van een pakbonconfiguratie. */ export declare function pickMethode(secties: PakbonSectie[] | undefined): PickMethode; /** Blokken die bij de gekozen pickmethode niet van toepassing zijn. */ export declare function sectieOnderdrukt(type: PakbonSectieType, methode: PickMethode): boolean; /** * Blokken die de Engine-variant weglaat. Zonder variant blijft de editor/het * losse voorbeeld compleet; een echte Engine-opdracht wordt in de wachtrij * geblokkeerd totdat de variant aanwezig is. */ export declare function sectieOnderdruktVoorVariant(type: PakbonSectieType, methode: PickMethode, variant?: PakbonLayoutVariant | null): boolean; export interface DemoProduct { artikelnummer: string; artikelnaam: string; potmaat: string; aantal: number; belading: string; barcode: string; opmerking: string; locatie: string; gewicht: string; productgroep: string; kleur: string; fust_aantal: number; fustsoort: string; planten_per_fust: number; } export interface DemoLaag { laagnummer: number; belading: string; potmaat: string; gewicht: string; opmerking: string; producten: DemoProduct[]; fusten: { fusttype: string; aantal: number; hoogte: string; belading: string; barcode: string; }[]; } export interface DemoKar { karnummer: number; route: string; chauffeur: string; gewicht: string; /** Gegevens die de Engine voor één volle of gedeeltelijke kar aanlevert. */ cart_label?: string; cart_index?: number; cart_total?: number; cart_id?: string; cart_items?: unknown[]; /** Bestaande Engine-barcode van deze kar; de Layout maker genereert deze nooit. */ barcode?: string; /** Kar bevat ook regels van een andere order (buffer-/gedeelde kar). */ gedeeld?: boolean; lagen: DemoLaag[]; } export declare const DEMO_ORDER: { order: { nummer: string; datum: string; leverdatum: string; referentie: string; opmerking: string; }; bedrijf: { naam: string; adres: string; plaats: string; telefoon: string; email: string; kvk: string; btw: string; }; klant: { naam: string; nummer: string; contact: string; referentie: string; }; afleveradres: { naam: string; adres: string; plaats: string; land: string; }; factuuradres: { naam: string; adres: string; plaats: string; land: string; }; transport: { transporteur: string; route: string; chauffeur: string; track: string; }; karren: DemoKar[]; }; export type DemoOrder = typeof DEMO_ORDER; export declare function alleProducten(order: DemoOrder): DemoProduct[]; export declare function totalen(order: DemoOrder): Record; export declare const CONDITIE_VELDEN: { value: string; label: string; }[]; export declare function conditieContext(order: DemoOrder): Record; export declare function sectieZichtbaar(sectie: PakbonSectie, ctx: Record): boolean; export declare function sorteerProducten(items: DemoProduct[], sortering: string): DemoProduct[]; /** Vervangt {{groep.veld}} codes door waarden uit de (voorbeeld)order. */ export declare function vulVeldcodes(tekst: string, order: DemoOrder): string; export interface KarGroep { kar: DemoKar; aantal: number; nummers: number[]; } export interface LaagGroep { laag: DemoLaag; aantal: number; nummers: number[]; } /** Groepeert identieke karren. Bij `aan = false` blijft elke kar los. */ export declare function groepeerIdentiekeKarren(karren: DemoKar[], aan: boolean): KarGroep[]; /** Groepeert identieke lagen binnen één kar. */ export declare function groepeerIdentiekeLagen(lagen: DemoLaag[], aan: boolean): LaagGroep[]; /** Tekst boven een gebundelde kar, bijv. "Deze kar 5× pakken". */ export declare function karBundelTekst(aantal: number): string; /** Tekst boven een gebundelde laag, bijv. "Deze laag 4×". */ export declare function laagBundelTekst(aantal: number): string; export interface FustVerzamelProduct { artikelnummer: string; artikelnaam: string; potmaat: string; kleur: string; productgroep: string; locatie: string; fustsoort: string; planten_per_fust: number; fust_aantal: number; aantal: number; } export interface FustVerzamelGroep { fusttype: string; aantal: number; hoogte: string; belading: string; producten: FustVerzamelProduct[]; } /** * Verzamellijst met alle fusten van een order, opgeteld per fusttype, * inclusief de producten die in dat fusttype gepickt moeten worden. * Een product hoort uitsluitend bij zijn eigen fustsoort — nooit bij alle * fustgroepen van de laag. */ export declare function fustVerzamellijst(karren: unknown): FustVerzamelGroep[]; /** * Voorbeeld van een deelkar (niet-volle kar): alleen een deel van de fusten, * zonder karindeling. Uitsluitend bedoeld voor het voorbeeld in de builder — * echte opdrachten krijgen hun gegevens van de Logistics Engine. */ export declare function deelkarVoorbeeldOrder(order?: DemoOrder): DemoOrder; /** Restregels zoals de Logistics Engine ze meestuurt onder `cart.cart_items`. */ export declare function deelkarRegels(order: unknown): Record[]; /** * Beperkt een order tot de restregels van één deelkar. Alleen wat de Engine * als `cart.cart_items` meestuurt komt op de restpakbon te staan; nooit de * volledige karinhoud. Wordt gedeeld door voorbeeld, PDF en print, zodat de * drie weergaven niet uiteen kunnen lopen. */ export declare function beperkTotDeelkar(order: T): T; //# sourceMappingURL=pakbonBuilder.d.ts.map