import type { Voucher } from '../models/voucher.js'; import type { PosVoucherSettings, VoucherArticle, VoucherCheck } from '../pos/gutschein.js'; /** * Gutscheine der neuen Form im Zahlbetrag: Zwilling von * `gutschein-beleg.plane` im Backend, soweit er den Zahlbetrag bestimmt. * * Der Server macht aus den Wuenschen zusaetzliche Positionen (`kind` * `voucher` bzw. `voucher_float`, hinten an Ware und Trinkgeld angehaengt, in * der Reihenfolge der Wuensche) und Eintraege in Belegform; nur Eintraege der * Art Wert (`value`) und Rabatt (`promo`) gehen danach in die Toepfe und in * den Wertgutschein-Fluss (`gutschein-beleg.zahlbetrag`). Genau das steht * hier, mit derselben Euro-Arithmetik: * * - Mehrzweck einloesen: Eintrag `value`, mindert den Zahlbetrag als Fluss. * - Mehrzweck verkaufen: Eintrag `value` (+Fluss); ab dem Stichtag des * 0-%-Topfs stattdessen Position im 0-%-Satz ohne Fluss. * - Mehrzweck auszahlen: immer Position im 0-%-Satz (minus), kein Fluss. * - Einzweck: Position im Satz (Verkauf aus der Einstellung der Kasse, * Einloesung und Auszahlung aus der Pruefung des Gutscheins); als * Kleinunternehmer eingeloest anteilig auf alle Saetze des Korbs. * - Leistung verkaufen: Stueck mal Artikelpreis im Artikelsatz; einloesen: je * Satz eine Minuszeile ueber die gewaehlten Positionen. * - Aktion: Rabatt wie `promo`, Betrag aus der Pruefung, hoechstens die Summe. * * Kein Fehler wird still geschluckt: was der Server mit einem Gutschein-Code * abwiese, liefert `fehler` mit genau diesem Code (`voucher_*`). Der * Klartext-Code steht nie in einem Text. */ /** Position in der inneren Form des Backends (`beleg-toepfe.interneForm`). */ export interface Innen { amount: number; priceOne: number; vat: number; tip: 'staff' | 'owner' | null; /** `kind` der Position (Trinkgeld, Rabatt, Gutscheinzeile); Ware hat keines. */ kind?: string; articleId?: string; } /** Gutschein-Eintrag in Belegform, soweit Toepfe und Fluss ihn lesen. */ export interface Gutschein { action: string; type: string; value: number; /** Betrag steht schon als Position im 0-%-Topf: kein Fluss mehr. */ imNullTopf?: boolean; } /** Je Einloesung bzw. Auszahlung die gepruefte Sicht des Gutscheins (aus `checkVoucher`), zugeordnet ueber den Code. */ export interface VoucherDueInfo { /** Der Code, wie er gesendet wird (tolerant: Gross/klein, Bindestriche, `O`/`0`, `I`/`L`/`1`). */ code: string; check: VoucherCheck; } /** Artikel fuer den Verkauf eines Dienstleistungsgutscheins: Preis und Satz wie im Artikelstamm. */ export type VoucherDueArticle = Pick; /** * Stichtag des 0-%-Topfs fuer Mehrzweck-Verkaeufe (Backend * `gutschein-core.NULLTOPF_AB`). Solange er in der Zukunft liegt, zaehlt ein * Mehrzweck-Verkauf als Fluss; ab dem Tag als Position im 0-%-Satz. Der * Zahlbetrag bleibt gleich, Toepfe und Fluss verschieben sich. */ export declare const VOUCHER_ZERO_RATE_BUCKET_FROM = "2099-12-31"; export interface PlanOptionen { voucherInfo?: readonly VoucherDueInfo[]; voucherSettings?: PosVoucherSettings; voucherArticles?: readonly VoucherDueArticle[]; smallBusiness?: boolean; zeroRateBucketFrom?: string; /** Wiener Tag `YYYY-MM-DD`; der Aufrufer setzt den heutigen, wenn er fehlt. */ today: string; } export interface Plan { /** Positionen, die der Server hinten anhaengt. */ zusatz: Innen[]; /** Eintraege, die Toepfe und Fluss lesen (`gutschein-beleg.zahlbetrag`). */ gutscheine: Gutschein[]; /** Summe der Auszahlungen in Cent. */ auszahlungCents: number; /** Mindestens ein Wunsch der neuen Form: der Server rechnet mit `plane`. */ mitPlan: boolean; /** Summe der Einloese-Minuszeilen je Topf (Deckung, Vorbelegung). */ minusJeTopf: Map; } export interface PlanFehler { fehler: string; text: string; } type TopfName = 'amountRateStandard' | 'amountRateReduced1' | 'amountRateReduced2' | 'amountRateZero' | 'amountRateSpecial' | 'amountRatOthers'; /** `vat-buckets.bucketFuerSatz`. */ export declare function topfFuerSatz(vat: number): TopfName; /** Position, die ein Gutschein decken darf: weder Trinkgeld noch Gutscheinzeile. */ export declare function istDeckbar(p: Innen): boolean; /** Summe der Trinkgeldzeilen (Personal und Inhaber) in Cent, wie `centSumme(kunde.filter(istTip))` im Backend. */ export declare function trinkgeldCents(kunde: readonly Innen[]): number; /** Wie beleg-toepfe: Euro in Positionsreihenfolge aufsummieren, erst die Summe auf Cent runden. */ export declare function centSumme(liste: readonly Innen[]): number; /** Die Saetze, auf die `kuTeile` verteilt: je Satz `centSumme` der deckbaren Positionen, nur positive. */ export declare function kuSaetze(kunde: readonly Innen[]): Array<{ satzBp: number; basis: number; }>; /** * Wuensche und gelesene Eintraege in Positionen und Belegeintraege, wie * `plane` sie baut. `kunde` sind Ware und Trinkgeld in innerer Form. */ export declare function planeGutscheine(kunde: readonly Innen[], vouchers: readonly Voucher[], art: string, o: PlanOptionen): Plan | PlanFehler; export {};