import type { ReceiptLayout } from './layout.js'; import type { PosPaperSize } from '../printing/escpos.js'; import { type QrModuleSize, type RasterImage } from '../printing/index.js'; import { type PrintLogo } from './layout-escpos.js'; /** * ePOS-Print XML (Epson TM-Drucker: Server Direct Print, ePOS-Print ueber * HTTP) -- **aus dem Zeichenraster**: jede Rasterzeile wird eine -Zeile * mit exakt N Zeichen und Zeilenumbruch, Aufdrucke als Rahmen aus * Rasterzeilen, QR als , Leerraum als , am Ende Schnitt. Kein * eigenes Setzen -- was Bildschirm, ESC/POS und PDF zeigen, druckt der Epson * Zeile fuer Zeile genauso. * * Nur der Inhalt …; die Huelle (PrintRequestInfo * fuer Server Direct Print bzw. SOAP fuer ePOS-Print) baut der Aufrufer. */ export interface EposPrintXmlOptions { /** Zeichen je Zeile; Vorgabe nach `layout.paperSize` (32/48). */ charsPerLine?: number; /** * **Feste** QR-Modulgroesse (Epson `width` 3..16). Gesetzt schaltet sie die * Rechnung ab -- dann passt der Aufrufer selbst auf, dass das Symbol samt * Ruhezone auf die Rolle geht. */ qrWidth?: number; /** * Deckel fuer die gerechnete QR-Modulgroesse; Vorgabe `auto` (hoechstens 6 * Punkte je Modul) -- wie ESC/POS, Blatt und der Flutter-Zwilling. * * Bis 0.13 stand hier `mittel` (heute `medium`), weil `auto` damals beim ESC/POS-Wert 4 * deckelte und dieser Weg seit jeher mit 6 druckt. Seit `auto` ueberall 6 * heisst, ist das derselbe Wert: ohne Wahl kommt kein Byte anders heraus. */ qrModuleSize?: QrModuleSize; /** Papierschnitt am Ende, Vorgabe true. */ cut?: boolean; /** Firmenlogo; ohne Angabe kein Logo. */ logo?: PrintLogo | null; /** Das Kasseneck-Logo am Ende (Konto-Flag `kreiseck_logo`). */ brandMark?: boolean; } /** * Das XML **samt** dem, was dem QR unterwegs zugestossen ist -- dieselbe * Buchfuehrung wie `EscPosLayoutResult` am ESC/POS-Weg. */ export interface EposPrintResult { xml: string; /** Der Beleg ging ohne QR hinaus; das Symbol passt auch mit 3 Punkten nicht. */ qrError: string | null; /** Der QR steht da, aber unter der Mindest-Modulgroesse. */ qrFallback: string | null; } export declare function eposXmlEscape(text: string): string; /** Ein Rasterbild als ePOS-`` (einfarbig, Punktmass, Rasterzeilen Base64). */ export declare function eposImageXml(image: RasterImage): string; /** Nur das XML; wer die QR-Meldungen braucht, nimmt [eposPrintXmlResult]. */ export declare function eposPrintXml(layout: ReceiptLayout, options?: EposPrintXmlOptions): string; /** * Wie [eposPrintXml], gibt aber zusaetzlich zurueck, was dem QR zugestossen * ist. * * **Die QR-Modulgroesse wird gerechnet.** Vorher stand hier fest 6, unabhaengig * von der Papierbreite: ein Beleg-QR mit realer RKSV-Nutzlast hat 57 Module, * mit Ruhezone 65, bei sechs Punkten also 390 Druckpunkte -- und ein * 58-mm-Kopf hat 384. Der Epson schneidet ein zu breites Symbol nicht ab, er * laesst es weg; genau daran fehlte am echten Beleg der QR. */ export declare function eposPrintXmlResult(layout: ReceiptLayout, options?: EposPrintXmlOptions): EposPrintResult; /** * Epson-Drucker mit ePOS-Print direkt aus dem Browser ansprechen (ohne * Server-Umweg): POST an `https:///cgi-bin/epos/service.cgi`. Der Drucker * antwortet mit CORS- und Private-Network-Headern (am TM-T20 nachgemessen); * sein selbstsigniertes Zertifikat muss der Browser einmal akzeptiert haben. * Modelle ohne Server Direct Print (TM-T20 & Co.) drucken so trotzdem aus * Kasse, Panel und Labor. */ export interface EposDirectOptions { /** IPv4/Hostname des Druckers im lokalen Netz. */ ip: string; /** ePOS Device ID (Druckermenue), Vorgabe `local_printer`. */ devid?: string; /** Papier des Druckers -- bestimmt das Raster; Vorgabe: das des Layouts. */ paperSize?: PosPaperSize; /** Feste QR-Modulgroesse; siehe [EposPrintXmlOptions.qrWidth]. */ qrWidth?: number; /** Deckel fuer die gerechnete QR-Modulgroesse; siehe [EposPrintXmlOptions.qrModuleSize]. */ qrModuleSize?: QrModuleSize; /** Firmenlogo; ohne Angabe kein Logo. */ logo?: PrintLogo | null; /** Das Kasseneck-Logo am Ende (Konto-Flag `kreiseck_logo`). */ brandMark?: boolean; timeoutMs?: number; } export interface EposResponse { success: boolean; /** Epson-Fehlercode (`EPTR_COVER_OPEN`, `EPTR_REC_EMPTY`, ...), leer bei Erfolg; `keine_antwort` bei unlesbarer Antwort. */ code: string; status: string; } export declare function eposServiceUrl(ip: string, devid?: string, timeoutMs?: number): string; export declare function eposSoapEnvelope(innerXml: string): string; export declare function eposParseResponse(text: string): EposResponse; /** * Ob ein Aufruf an [eposDirectSend] an einem ZEITABLAUF scheiterte oder an * einer sonst abgelehnten/nie zustande gekommenen Verbindung -- ein Aufrufer * muss das unterscheiden koennen. Ein Zeitablauf heisst "der Drucker koennte * noch antworten, spaeter nochmal versuchen"; eine Ablehnung heisst "unter * dieser Adresse ist niemand" (falsche IP, Kabel raus, Zertifikat nicht * akzeptiert). Vor dieser Klasse trug die eine Fehlermeldung fuer beide * Faelle keine maschinenlesbare Unterscheidung -- ein Aufrufer haette sie nur * am Text erraten koennen, und genau diese Art von Kopplung an einen Text hat * sich an anderer Stelle in diesem Vorhaben schon als brueckig erwiesen. */ export declare class EposConnectionError extends Error { readonly name = "EposConnectionError"; readonly ip: string; /** `true`, wenn das Zeitlimit ablief, BEVOR eine Antwort da war. */ readonly timedOut: boolean; constructor(ip: string, timedOut: boolean); } /** Beleg direkt drucken; wirft bei Netz-/Zertifikatsproblemen, sonst die Drucker-Antwort. */ export declare function eposDirectPrint(layout: ReceiptLayout, o: EposDirectOptions, fetchFn?: typeof fetch): Promise; /** Verbindungstest: leeres Dokument, druckt nichts, liefert den Druckerstatus. */ export declare function eposDirectStatus(o: EposDirectOptions, fetchFn?: typeof fetch): Promise;