import { type HobexReceipt } from '../models/index.js'; import type { InternerTransport } from '../client/aufrufe.js'; /** * Cent -> Euro. **Die einzige Umrechnungsstelle dieses Moduls.** Betraege * werden im ganzen Paket in Cent gefuehrt (exakte Ganzzahl-Arithmetik); die * Hobex-Schnittstelle erwartet dagegen Euro als Gleitkommazahl (`amount`, * `tip`), und das Backend reicht sie unveraendert an Hobex weiter. Das * Gegenstueck fuer die Antwortrichtung steht in models/hobex-receipt.ts. * * **Geerbte Ungenauigkeit, hier nicht behebbar:** das Backend addiert die * beiden Euro-Werte serverseitig (`check.params.amount + check.params.tip`, * functions/payment-endpoints.js) — aus 10,10 EUR und 0,20 EUR wird dort * `10.299999999999999`. Jede Rundung auf dieser Seite wuerde daran nichts * aendern, weil die Addition erst danach passiert; die saubere Loesung waere * ein Cent-Feld am Backend. */ export interface HobexPayOptions { /** Kennung der Zahlung — siehe [newHobexTransactionId]. */ transactionId: string; /** Zu belastender Betrag in **Cent** (ohne Trinkgeld). */ amountCents: number; /** Trinkgeld in **Cent**; Hobex belastet Betrag + Trinkgeld in einem. */ tipCents?: number; /** Freier Verwendungszweck, den Hobex mitfuehrt (z. B. Tischnummer). */ reference?: string; } export interface HobexRefundOptions { /** Kennung der zu erstattenden Zahlung. */ transactionId: string; /** Zu erstattender Betrag in **Cent** (ohne Trinkgeld). */ amountCents: number; /** Zu erstattendes Trinkgeld in **Cent**. */ tipCents?: number; } /** Zeit- und Zufallsquelle von [newHobexTransactionId] — fuer Tests einspeisbar. */ export interface HobexTransactionIdOptions { /** Zeitpunkt der Kennung; ohne Angabe jetzt. */ now?: Date; /** Zufallsquelle in `[0, 1)` wie `Math.random`; ohne Angabe `Math.random`. */ random?: () => number; } /** * Belastet eine Karte ueber die **Hobex-Cloud-API** und liefert den * entstandenen [HobexReceipt]. * * **Der Endpunkt heisst `hobexPayApi`** — mit Suffix; ohne ihn gibt es ihn * nicht. * * **Nie wiederholen.** Bei `isOutcomeUnknown(e)` (Netz, Zeitlimit, HTTP 5xx, * unlesbare Antwort, Fehlerhuelle ohne Code oder mit einem Code ausserhalb * der Ablehnungscodes, README `outcome`) kann die Karte belastet sein: den Stand * ueber die Transaktionskennung nachlesen, nicht ein zweites Mal belasten. */ export declare function hobexPay(transport: InternerTransport, options: HobexPayOptions): Promise; /** * Erstattet eine zuvor ueber die Hobex-Cloud getaetigte Zahlung. Das Backend * storniert zuerst (Void, solange der Tagesabschluss aussteht) und erstattet * erst danach. * * **Ohne Rueckgabewert, mit Absicht.** Das Vorbild liefert * `resJson['status'] == 'success'`; in diesem Paket wirft die Fehlerhuelle * schon im Transport, sobald der Status nicht ausdruecklich Erfolg ist. Ein * Wahrheitswert waere hier also immer `true` — eine Luege ueber den * Informationsgehalt, an der ein Aufrufer ein `if` aufhaengt, das nie greift. * Misserfolg kommt als geworfener Fehler: eine Fehlerhuelle als * [KasseneckApiError], `'rejected'` nur mit einem der Ablehnungscodes * (README `outcome`); ohne Code oder mit anderem Code, bei Netz, * Zeitlimit, HTTP 5xx und unlesbarer Erfolgsantwort `outcome: 'unknown'` * (die Erstattung kann gelaufen sein). * Ein `false` an dieser Stelle luede zum zweiten Versuch ein, also zur * doppelten Erstattung. **Nie wiederholen**, sondern den Stand nachlesen. * * **Der Endpunkt heisst `hobexRefundApi`** — mit Suffix. */ export declare function hobexRefund(transport: InternerTransport, options: HobexRefundOptions): Promise; /** * Erzeugt eine neue Hobex-Transaktionskennung: 19 Ziffern aus Zeitanteil und * Zufall (Zwilling von `newHobexTransactionId` im Vorbild, Zeile 522). * * Zwei bewusste Abweichungen: * * 1. **Wiener Wanduhrzeit statt Geraetezeit.** Das Vorbild nimmt * `DateTime.now()` in der Zeitzone des Geraets; damit haetten zwei Kassen * desselben Betriebs in verschiedenen Zeitzonen Kennungen, die sich um * Stunden unterscheiden, und der Tageswechsel in der Kennung faende nicht * zum Geschaeftstag statt. Fachlich ist Wien die Zeitzone (siehe * vienna-time.ts) — und eine Browser-Kasse laeuft in der Zeitzone des Gasts, * nicht des Betriebs. * 2. **Millisekunden statt Mikrosekunden.** JavaScript hat keine * Mikrosekunden-Uhr. Das Vorbild fuellt mit sechs Bruchteilsstellen auf und * haengt zwei Zufallsziffern an, von denen die Laengenbegrenzung eine wieder * abschneidet; hier stehen drei Bruchteilsstellen und vier Zufallsziffern. * Laenge und Form (nur Ziffern, 19 Stellen, `JJMMTThhmmss` voran) bleiben * gleich. * * Zeit- und Zufallsquelle sind einspeisbar, damit die Kennung pruefbar ist. */ export declare function newHobexTransactionId(options?: HobexTransactionIdOptions): string;