checkVoucher function

Future<VoucherCheck> checkVoucher(
  1. RegisterTransport transport,
  2. String code
)

Gutschein am Code pruefen (Gutschein-Recht voucherRedeem). Der Code wird tolerant eingelesen (Gross/klein, Bindestriche, Leerzeichen, O/0, I/L/1) und vor dem Senden auf sein Pruefzeichen geprueft: ein Tippfehler geht nie ueber das Netz, sondern endet mit KasseneckValidationError. Fachliche Fehler kommen als KasseneckApiError mit dem Code des Servers (voucher_not_found, too_many_voucher_checks, not_permitted …). Gesendet wird die Normalform; kein Text dieses Aufrufs nennt den Code.

Implementation

Future<VoucherCheck> checkVoucher(RegisterTransport transport, String code) async {
  const name = Aufrufe.checkVoucher;
  final geprueft = VoucherCode.validate(code);
  // Der Code steht bewusst nicht in der Meldung.
  if (geprueft is! Valid) throw const KasseneckValidationError(name, 'code ist kein gueltiger Gutscheincode', 'request');
  final normal = geprueft.normalized;
  final geheim = [normal, VoucherCode.format(normal)];
  final Map<String, dynamic> daten;
  try {
    daten = await transport.call(name, params: {'code': normal});
  } on KasseneckApiError catch (fehler) {
    // Ein Servertext, der den Code wiederholt, wird geschwaerzt; Code und
    // Daten bleiben, damit die Kasse am Code entscheidet.
    if (!geheim.any(fehler.message.contains)) rethrow;
    final text = geheim.fold(fehler.message, (t, g) => t.split(g).join('****'));
    throw KasseneckApiError(fehler.functionName, text, code: fehler.code, details: fehler.details);
  }
  return _pruefungLesen(name, daten);
}