listRegisterSessionsForDevice method

Future<RegisterSessionsStand> listRegisterSessionsForDevice({
  1. required String ownerUid,
  2. required String deviceId,
  3. required String deviceSecret,
})

Welche Sitzungen hält diese Kasse gerade? Für den Anmeldebildschirm, wenn alle Lizenzplätze belegt sind: statt dass das Backend still die älteste verdrängt, sieht der Kassier, welche — und gibt ihre Kennung als takeoverSessionId bei registerUserLogin mit. Ausgewiesen wird sich über das Gerätegeheimnis wie bei listRegisterUsersForDevice; die Kasse bestimmt das Backend aus dem Gerät.

Implementation

Future<RegisterSessionsStand> listRegisterSessionsForDevice({
  required String ownerUid,
  required String deviceId,
  required String deviceSecret,
}) async {
  const name = Aufrufe.listRegisterSessionsForDevice;
  _ausweisPflicht(name, ownerUid, deviceId, deviceSecret);
  final daten = await _rufen(name, {
    'ownerUid': ownerUid,
    'deviceId': deviceId,
    'deviceSecret': deviceSecret,
  });

  final liste = daten['sessions'];
  if (liste is! List) {
    throw const KasseneckValidationError(name, 'Antwort enthaelt keine Sitzungsliste (data.sessions fehlt)', 'response');
  }
  final sessions = liste.map((eintrag) {
    final roh = eintrag is Map ? Map<String, dynamic>.from(eintrag) : <String, dynamic>{};
    final id = roh['id'];
    // Ohne Kennung wäre die Zeile nicht wählbar — eine Schaltfläche, die
    // nichts tun kann, ist schlimmer als keine.
    if (id is! String || id.isEmpty) {
      throw const KasseneckValidationError(name, 'Sitzung ohne Kennung in der Antwort (id fehlt)', 'response');
    }
    final label = roh['deviceLabel'];
    final userName = roh['userName'];
    final geraet = roh['deviceId'];
    return RegisterSession(
      id: id,
      deviceId: geraet is String && geraet.isNotEmpty ? geraet : null,
      deviceLabel: label is String && label.isNotEmpty ? label : 'Kasse',
      startedAt: roh['startedAt'] is num ? (roh['startedAt'] as num).toInt() : null,
      expiresAt: roh['expiresAt'] is num ? (roh['expiresAt'] as num).toInt() : null,
      selbst: roh['selbst'] == true,
      // Nur übernehmen, wenn wirklich einer kam: ein leerer String stünde in
      // der Oberfläche als namenlose Zeile, statt die Spalte wegzulassen.
      userName: userName is String && userName.isNotEmpty ? userName : null,
    );
  }).toList(growable: false);
  final lizenzen = daten['licenses'];
  final licenses = lizenzen is num && lizenzen > 0 ? lizenzen.toInt() : 1;
  return RegisterSessionsStand(licenses: licenses, sessions: sessions);
}