ReceiptOutputEntry.fromJson constructor

ReceiptOutputEntry.fromJson(
  1. Map<String, dynamic> json
)

Liest einen gepufferten Eintrag (toJson) zurueck, streng: ein unbekanntes Feld (unbekanntes Feld "<name>", wie npm ohne den Vorsatz entries[i]: ) oder ein Feld mit falschem Typ wirft KasseneckValidationError (kind: request). Ein unbekanntes Feld ginge sonst still verloren (der Puffer haette etwas gemerkt, das nie gemeldet wird). Ob die Werte gueltig sind, prueft erst das Melden.

Implementation

factory ReceiptOutputEntry.fromJson(Map<String, dynamic> json) {
  const name = Aufrufe.logReceiptOutputs;
  for (final feld in json.keys) {
    if (!_eintragsfelder.contains(feld)) throw KasseneckValidationError(name, 'unbekanntes Feld "$feld"', 'request');
  }
  // Ein fehlendes Feld bleibt leer: das Melden weist es dann mit demselben
  // Grund ab wie das npm-Paket (`entries[i].key fehlt` ...).
  String text(String feld) {
    final w = json[feld];
    if (w == null) return '';
    if (w is! String) throw KasseneckValidationError(name, '$feld muss ein Text sein', 'request');
    return w;
  }

  final at = json['at'];
  final ergebnis = json['result'];
  // Ein ausdrueckliches null ist kein fehlendes Ergebnis, sondern ein Wert
  // ausserhalb des Katalogs (wie im npm-Paket); nur ein fehlendes Feld gilt
  // als ohne Ergebnis.
  if (ergebnis == null && json.containsKey('result')) {
    throw KasseneckValidationError(name, 'result muss ${receiptOutputResults.join(', ')} sein', 'request');
  }
  if (ergebnis != null && ergebnis is! String) {
    throw const KasseneckValidationError(name, 'result muss ein Text sein', 'request');
  }
  return ReceiptOutputEntry(
    key: text('key'),
    receiptId: text('receiptId'),
    kind: text('kind'),
    at: _ganzeZahl(at) ?? at ?? '',
    result: ergebnis as String?,
  );
}