import { type PosCodeTable, type PosCutMode, type PosPaperSize, type QrCorrection, type QrMatrix, type QrModuleSize, type QrSize, type RasterImage } from '../printing/index.js'; import type { ReceiptLayout } from './layout.js'; import { type ReceiptSheet, type SheetLogoSize, type LogoDimensions } from './blatt.js'; /** * Bruecke vom Layout-Modell zu ESC/POS-Bytes — der Bondrucker-Ausgabeweg. * * Hier, und nur hier, wird der Belegtext **druckbar gemacht** * ([escPosPrintableText]): Bondrucker sprechen eine Ein-Byte-Codepage, ein * „€" oder ein Emoji im Artikelnamen laesst die Kodierung werfen und den * gesamten Ausdruck ausfallen. Das Layout selbst fuehrt weiterhin echten Text * — auf dem Bildschirm soll „€" stehen und nicht „EUR". * * Ausgenommen ist der QR-Inhalt: er ist maschinenlesbar (RKSV) und wird * unveraendert uebergeben. Eine Zeichenersetzung machte den Code ungueltig; * ein unerwartetes Zeichen darin soll darum auffallen und nicht still * verfaelscht werden. */ /** * Wie der Beleg-QR auf das Papier kommt — Zwilling von `QrPrintMode` * (kasseneck_api/lib/enums/qr_print_mode.dart). * * - `native` — der Druckbefehl `GS ( k`; der Drucker zeichnet selbst. * Ohne Modellbefehl, also byteidentisch zum Bestand. * - `nativeModel1` — derselbe Befehl mit ausdruecklicher Wahl von **Modell 1** * (`GS ( k 04 00 31 41 31 00`). Fuer guenstige Geraete, die * nur diesen aelteren Symboltyp beherrschen; belegt ist * eines, das bei Modell 2 unter dem Code eine "0" ausgibt. * - `imageRaster` — der QR als Rasterbild. Braucht ein Raster vom Aufrufer * (`qrMatrix`), weil dieses Paket keine QR-Codes rechnet. */ export type QrPrintMode = 'native' | 'nativeModel1' | 'imageRaster'; /** Firmenlogo fuer den Druck: Stufe, Pixelmass des Originals und das fertige Rasterbild (`rasterizeLogo`). */ export interface PrintLogo { size: SheetLogoSize; pixelWidth: number; pixelHeight: number; raster: RasterImage; } /** Das Rasterbild muss genau so gross sein, wie das Blatt das Logo setzt -- sonst stuende am Bon ein anderes Logo als am Schirm. */ export declare function assertLogoRaster(logo: PrintLogo, dimensions: LogoDimensions, chars: number): void; /** * Baut das Blatt fuer einen Druckweg (ESC/POS, ePOS) an EINER Stelle: die * Zuordnung `PrintLogo` -> `SheetLogo` und die Groessenpruefung des mitgebrachten * Rasterbilds teilen sich beide Wege -- ohne das muesste eine Aenderung daran an * zwei Stellen nachgezogen werden. Wirft VOR jeder Ausgabe (also bevor der * Aufrufer auch nur ein Byte/Zeichen geschrieben hat), wenn das Rasterbild nicht * zur Logo-Stufe passt. */ export declare function blattFuerDruck(layout: ReceiptLayout, optionen: { zeichen: number; logo?: PrintLogo | null; marke?: boolean; qrGroesse: QrModuleSize; }): ReceiptSheet; export interface EscPosLayoutOptions { /** Papierbreite; Vorgabe ist die des Layouts (dessen Spaltenbreiten daran haengen). */ paperSize?: PosPaperSize; /** * Codepage des Druckers, Vorgabe `CP1252`; `null` laesst die des Geraets * stehen. Eine Tabelle des Katalogs (`CodeTableId`, im Drucker-Wizard * gewaehlt) druckt `€`, `§`, `°` als echtes Byte, wo die Tabelle sie hat, * sonst als Ersatzbuchstaben; ohne Wahl bleibt der Bon byte-gleich. */ codeTable?: PosCodeTable | null; /** Papierschnitt am Ende: `true` (voll), `'partial'` oder `false`. Vorgabe `true`. */ cut?: boolean | PosCutMode; /** * Feste Modulgroesse des QR-Codes. Gesetzt schaltet sie die Rechnung ab — * dann passt der Aufrufer selbst auf, dass das Symbol aufs Papier geht. */ qrSize?: QrSize; /** Fehlerkorrekturstufe des QR-Codes; Vorgabe `M` (wie ePOS, Bildweg und Blatt). */ qrCorrection?: QrCorrection; /** Deckel fuer die gerechnete Modulgroesse; Vorgabe `auto` (hoechstens 6 Punkte je Modul). */ qrModuleSize?: QrModuleSize; /** Druckweg des QR; Vorgabe `native` (der Bestandsweg). */ qrMode?: QrPrintMode; /** * Raster fuer den Bildweg — ohne das gibt es keinen Notausgang. * * Dieses Paket rechnet keine QR-Codes und verarbeitet keine Bilder (siehe * Kopf von `layout.ts`); der Aufrufer bringt das fertige Raster mit, etwa * aus der QR-Bibliothek, die er ohnehin fuer den Bildschirm benutzt. */ qrMatrix?: (payload: string) => QrMatrix; /** Firmenlogo; ohne Angabe kein Logo (Bestand). */ logo?: PrintLogo | null; /** Das Kasseneck-Logo am Ende (Konto-Flag `kreiseck_logo`). */ brandMark?: boolean; } /** * Der Bytestrom **samt** dem, was dem QR unterwegs zugestossen ist. * * Zwilling von `KeckPrintResult`: `qrError` heisst "Beleg ohne QR, * nachdrucken oder elektronisch ausgeben", `qrFallback` heisst "gedruckt, * aber der eingestellte Weg taugt fuer dieses Geraet nicht" — das eine gehoert * dem Kunden gesagt, das andere dem Chef. */ export interface EscPosLayoutResult { bytes: Uint8Array; qrError: string | null; qrFallback: string | null; } /** * Bytes fuer den Bondrucker -- **aus dem Zeichenraster** ([renderReceiptGrid]): * jede Rasterzeile geht als fertige, exakt N Zeichen breite Textzeile raus. * Keine eigene Spaltenrechnung, keine `ESC $`-Positionierung: was das Raster * zeigt, druckt der Drucker (Monospace, Font A: 32/48 Zeichen). */ export declare function escPosLayoutBytes(layout: ReceiptLayout, options?: EscPosLayoutOptions): Uint8Array; /** * Wie [escPosLayoutBytes], gibt aber zusaetzlich zurueck, was dem QR * zugestossen ist. Die Bytes sind dieselben; wer die Meldungen braucht, nimmt * diesen Weg. */ export declare function escPosLayoutResult(layout: ReceiptLayout, options?: EscPosLayoutOptions): EscPosLayoutResult;