rufen method
Einen Endpunkt rufen. params kommt zur Kasse dazu; null-Werte fallen
weg, damit das Backend „nicht gesetzt" nicht als ausdrückliche Angabe
missversteht.
frist überschreibt die Vorgabe für diesen einen Aufruf — der Abschluss
eines Belegs darf länger warten als eine Belegliste.
Implementation
Future<Map<String, dynamic>> rufen(
String name, {
Map<String, dynamic> params = const {},
Duration? frist,
}) async {
// Beides frisch — siehe Klassenkommentar.
final token = await idToken();
final sitzung = await sessionId();
if (token == null || token.isEmpty) {
throw KasseneckValidationError(name, 'idToken lieferte kein Token', 'request');
}
if (sitzung == null || sitzung.isEmpty) {
throw KasseneckValidationError(name, 'sessionId lieferte keine Sitzung', 'request');
}
final nutzlast = <String, dynamic>{'cashregisterId': cashregisterId};
params.forEach((schluessel, wert) {
if (wert != null) nutzlast[schluessel] = wert;
});
final http.Response antwort;
try {
antwort = await _http
.post(
Uri.parse('$baseUrl/$name'),
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
'register-session': sitzung,
},
body: jsonEncode({'params': nutzlast}),
)
.timeout(frist ?? _timeout);
} on Object {
throw KasseneckHttpError(name, 0, 'network');
}
Object? roh;
try {
roh = jsonDecode(antwort.body);
} on FormatException {
throw KasseneckHttpError(name, antwort.statusCode, 'not-json');
}
if (roh is! Map) throw KasseneckHttpError(name, antwort.statusCode, 'missing-status');
final huelle = Map<String, dynamic>.from(roh);
if (huelle['status'] == 'success') {
final daten = huelle['data'];
return daten is Map ? Map<String, dynamic>.from(daten) : <String, dynamic>{};
}
final meldung = huelle['message'];
throw KasseneckApiError(name, meldung is String && meldung.isNotEmpty ? meldung : 'Der Aufruf ist fehlgeschlagen.');
}