saveDevice method

Future<PosDeviceSettings> saveDevice(
  1. Map<String, dynamic> patch
)

Einstellungen dieses Geräts schreiben (Recht layout). shortcuts nur als ganze Karte aller bekannten Aktionen (posSettingsChanges liefert sie bei jeder Tastenänderung); sie wird vorab auf Doppelbelegung geprüft.

Implementation

Future<PosDeviceSettings> saveDevice(Map<String, dynamic> patch) async {
  const name = Aufrufe.setMyRegisterDeviceSettings;
  if (deviceId.trim().isEmpty) {
    throw const KasseneckValidationError(name, 'deviceId fehlt', 'request');
  }
  final gesendet = _pruefeTeil(name, 'device', patch, const PosDeviceSettings().toJson(), posDeviceValues);
  if (gesendet.containsKey('shortcuts')) {
    final karte = gesendet['shortcuts'];
    if (karte is! Map) {
      throw const KasseneckValidationError(name, 'device.shortcuts: keine Tastenkarte', 'request');
    }
    final tasten = <String, Object?>{};
    for (final e in karte.entries) {
      if (e.value == null) continue;
      final aktion = e.key.toString();
      if (!posShortcutActions.contains(aktion)) {
        throw KasseneckValidationError(name, 'device.shortcuts.$aktion: unbekannte Aktion', 'request');
      }
      tasten[aktion] = e.value;
    }
    // Nur die ganze Karte: der Server prüft Doppelbelegungen nur in der
    // gesendeten Karte, eine halbe (`{cash: ['Mod+K']}`) ließe eine
    // Doppelbelegung mit einer gespeicherten Taste durch.
    final fehlt = posShortcutActions.where((a) => !tasten.containsKey(a)).toList();
    if (fehlt.isNotEmpty) {
      throw KasseneckValidationError(
          name,
          'device.shortcuts: ganze Karte senden (posSettingsChanges), es fehlen ${fehlt.join(', ')}',
          'request');
    }
    // Doppelbelegung in der ganzen Karte, also in der ganzen Belegung.
    final konflikt = posShortcutConflict(tasten);
    if (konflikt != null) {
      throw KasseneckValidationError(
          name,
          'device.shortcuts.${konflikt.action}: Taste ${konflikt.key} schon belegt (${konflikt.heldBy})',
          'request');
    }
    gesendet['shortcuts'] = tasten;
  }
  final daten = await transport.call(name, params: {'deviceId': deviceId, 'device': gesendet});
  return PosDeviceSettings.fromJson(_stand(name, daten, 'device'));
}