Kreiseck β€” Software Solutions

Kasseneck Flutter API

The Austrian RKSV-compliant cash register, right inside your Flutter app.
Issue signed receipts, take card payments and print β€” in a few lines of Dart.

pub version pub points platform RKSV compliant by Kreiseck


kasseneck_api is the official Flutter client for Kasseneck β€” a fully RKSV-compliant (Austrian Registrierkassensicherheitsverordnung) point-of-sale backend by Kreiseck Software Solutions. It takes care of the signed Datenerfassungsprotokoll, card-payment terminals, receipt printing and PDF reports, so you can focus on your app.

πŸ”‘ You need an API key & a cashregister token to operate a register. Request yours at office@kreiseck.com Β· kreiseck.com

✨ Features

  • 🧾 RKSV receipts β€” standard, cancellation, zero & training; signed JWS chain + QR code
  • πŸ’Ά All Austrian VAT rates β€” incl. the new 4.9 % Grundnahrungsmittel rate (from 1 Jul 2026)
  • πŸͺ™ Exact money β€” amounts are integer cents internally (no floating-point drift)
  • πŸ’³ Card payments out of the box β€” Hobex (Cloud & on-terminal HPS), myPOS, GP Tom, SumUp β€” and any other method via CreditCardProvider.custom
  • 🎟️ Vouchers β€” value & promo, sell & redeem, with proportional VAT split
  • πŸ–¨οΈ Printing β€” Bluetooth & Wi-Fi (ESC/POS) plus the myPOS built-in printer
  • πŸ“± Drop-in receipt widget for on-screen display
  • πŸ“Š Reports & invoices β€” daily / monthly PDF
  • πŸ”— Stripe payment links for remote & online payments

🧩 Requirements

  • Flutter Β· Dart >= 3.6
  • A Kasseneck API key + cashregister token (β†’ Kreiseck)
  • An Android device/terminal for card payments & Bluetooth printing

πŸ“¦ Installation

dependencies:
  kasseneck_api: ^3.0.0
flutter pub get

πŸš€ Quick start

import 'package:kasseneck_api/kasseneck_api.dart';
import 'package:kasseneck_api/models/kasseneck_item.dart';
import 'package:kasseneck_api/enums/vat_rate.dart';
import 'package:kasseneck_api/enums/keck_payment_method.dart';

final kasseneck = KasseneckApi(
  apiKey: 'YOUR_API_KEY',
  cashregisterToken: 'YOUR_CASHREGISTER_TOKEN',
);

// A cash sale with two items β€” prices are integer cents (320 = € 3.20)
final receipt = await kasseneck.sellReceipt(
  paymentMethod: KeckPaymentMethod.cash,
  customerDetails: ['Max Mustermann'],
  items: [
    KasseneckItem(name: 'Coffee', quantity: 2, vat: VatRate.vat20,      priceCents: 320),
    KasseneckItem(name: 'Bread',  quantity: 1, vat: VatRate.vat4komma9, priceCents: 240),
    // or, if you have euro doubles: KasseneckItem.euro(..., singlePrice: 3.20)
  ],
);

print('Receipt ${receipt?.receiptId} β€” signed: ${receipt?.signatureSuccess}');

πŸ’‘ Models & enums live in their own files β€” import the ones you use (models/…, enums/…). Payment, refund, cancellation, zero & training receipts all run through the same KasseneckApi instance.

πŸ’³ Card payments

Card payments work out of the box with several terminals β€” and you're never locked in:

Method How
Hobex Cloud kasseneck.hobexPay(...) / hobexRefund(...)
Hobex HPS (local terminal) import 'package:kasseneck_api/hobex_hps.dart'; β†’ HpsClient
myPOS Β· GP Tom Β· SumUp supported & rendered on the receipt
Any other terminal/method CreditCardProvider.custom β€” just pass your own card data

Whatever terminal you use, hand the result to sellReceipt(...) as cardPaymentData and it is stored and printed on the receipt.

Example β€” local Hobex terminal (HPS) β†’ signed receipt
import 'package:kasseneck_api/hobex_hps.dart'; // HpsClient, TransactionResponse, HobexReceipt

final hps = HpsClient(tid: '3600335'); // TID without leading zero

// 1) Charge the card on the terminal
final res = await hps.payment(amount: 12.50);
if (!res.isApproved) return; // declined -> res.responseCode / res.responseText

// 2) Adapt the terminal result, 3) create the signed receipt
final card = HobexReceipt.fromHps(res);
await kasseneck.sellReceipt(
  paymentMethod: KeckPaymentMethod.creditCard,
  creditCardProvider: card.creditCardProvider, // hobexHps
  cardPaymentId: card.transactionId,
  cardPaymentData: card.toCardPaymentData(),
  items: [KasseneckItem(name: 'Lunch', quantity: 1, vat: VatRate.vat10, priceCents: 1250)],
);

Also available: hps.refund(...), hps.cancel(...), hps.transactionStatus(...), hps.diagnosis(). A declined payment is not an exception β€” it's res.isApproved == false.

πŸ–¨οΈ Printing

// Bluetooth (ESC/POS)
await kasseneck.initBluetoothPrinter(printerAddress: 'AA:BB:CC:DD:EE:FF');
await receipt!.printReceiptBluetooth();

// QR garbled or missing? Printers differ in which command they support:
await receipt.printReceiptBluetooth(qrMode: QrPrintMode.imageBitImage); // or .native

// Wi-Fi
await kasseneck.initWifiPrinter('192.168.0.50', KeckPaperSize.mm80);
await receipt.printReceiptWifi();

// Open the cash drawer
await KasseneckApi.openCashDrawer();

πŸ“± On-screen receipt

A ready-made widget renders the full receipt (logo, items, VAT table, QR, card details):

KeckReceiptWidget(receipt: receipt);

πŸ“Š Reports & invoices

final monthly = await kasseneck.downloadMonthlyReport(ReportMonth.now()); // Uint8List (PDF)
final daily   = await kasseneck.downloadDailyReport(DateTime.now());
final history = await kasseneck.getReceipts(start, end);

πŸ‡¦πŸ‡Ή RKSV compliance

Every receipt is chained and signed (ES256 / JWS) and exposed as the machine-readable QR payload, exactly as required by the Austrian RKSV. Signature-device outages are detected (receipt.signatureSuccess / receipt.isSigFailed) and printed on the receipt.

πŸ—‚οΈ Versioning

This package follows semantic versioning β€” see the CHANGELOG. Latest: 3.2.0 β€” optional Kreiseck branding at the end of receipts (print, widget & PDF).

πŸ’¬ Support

Kreiseck Software Solutions β€” office@kreiseck.com Β· kreiseck.com

πŸ“„ License

See LICENSE.

Libraries

enums/cashbox_status
enums/credit_card_provider
enums/keck_invoice_payment_methode
enums/keck_month
enums/keck_paper_size
enums/keck_payment_method
enums/qr_print_mode
enums/receipt_print_type
enums/receipt_type
enums/signature_status
enums/vat_rate
enums/voucher_action
enums/voucher_type
hobex_hps
hobex Payment Service (HPS) β€” typed client for the terminal's local REST API (http://127.0.0.1:8080 when the app runs on the terminal).
kasse
Die Kasse am Tresen: Einstellungen, Warenkorb, Kassieren und Belege β€” gemeinsam von Browser-Kasse und App.
kasseneck_api
models/beleg_layout
Beleg-Zeilenmodell (Zwilling von @kreiseck/kasseneck-api/receipt ReceiptLayout): das Backend liefert es bei getReceipt als layout mit, damit App, Bondrucker, Browser-Kasse und PDF dieselben Zeilen zeigen β€” Kopf/Fuß wie beim Ausstellen des Belegs, Belegart-Aufdruck (STORNOBELEG, TRAININGSBELEG, NULLBELEG …), reduzierter Nullbeleg, Testkasse/Testsignatur.
models/beleg_raster
Zeichenraster (Zwilling von renderReceiptGrid im JS-Paket @kreiseck/kasseneck-api): der Beleg als Zeilen mit exakt N Zeichen (58 mm = 32, 80 mm = 48) β€” die eine Wahrheit fΓΌr Bildschirm, Bondruck und PDF. Regeln (fest, damit ΓΌberall dasselbe herauskommt):
models/cashregister
models/hobex_receipt
models/kasseneck_item
models/kasseneck_receipt
models/keck_customer
models/keck_customer_address
models/keck_invoice
models/keck_invoice_item
models/keck_print_result
models/keck_sepa_info
models/keck_user
models/keck_voucher
models/report_month
models/stripe_url_seesion
models/sumup_checkout_response
printing
Oeffentliches Barrel fuer den vendierten ESC/POS-Druck-Stack.
register
Kopplung und Anmeldung eines KassengerΓ€ts (RKSV-Kasse).
services/keck_printer
services/logo_service
services/printer_service
services/rksv_service
services/sumup_service
services/vienna_time
widgets/keck_receipt_lines_widget
widgets/keck_receipt_widget