fix(alarms): harden native alarm lifecycle
This commit is contained in:
@@ -171,6 +171,61 @@ class ServicioAlarmas {
|
||||
return nuevo;
|
||||
}
|
||||
|
||||
Future<ConfiguracionAlarmas> sincronizarEjecucionesNativas(
|
||||
Map<String, DateTime> ejecuciones,
|
||||
) async {
|
||||
if (ejecuciones.isEmpty) return cargar();
|
||||
|
||||
final config = await cargar();
|
||||
final ahora = _reloj();
|
||||
var huboCambios = false;
|
||||
final alarmas =
|
||||
config.alarmas.map((alarma) {
|
||||
final gestionadaEn = ejecuciones[alarma.id];
|
||||
if (gestionadaEn == null) return alarma;
|
||||
final ultima = alarma.ultimaEjecucionGestionada;
|
||||
if (ultima != null && !gestionadaEn.isAfter(ultima)) return alarma;
|
||||
|
||||
final proxima = alarma.proximaProgramable;
|
||||
if (proxima != null &&
|
||||
proxima.isAfter(
|
||||
gestionadaEn.add(
|
||||
ServicioProgramacionAlarmas.toleranciaDisparoInminente,
|
||||
),
|
||||
)) {
|
||||
return alarma;
|
||||
}
|
||||
|
||||
final siguiente = _programacion.calcularSiguienteDespuesDeEjecucion(
|
||||
alarma: alarma,
|
||||
ejecucion: gestionadaEn,
|
||||
vacaciones: config.vacaciones,
|
||||
excepciones: config.excepciones,
|
||||
);
|
||||
huboCambios = true;
|
||||
return alarma.copyWith(
|
||||
activa:
|
||||
alarma.tipoProgramacion == TipoProgramacionAlarma.unica
|
||||
? false
|
||||
: alarma.activa,
|
||||
proximaEjecucion: siguiente,
|
||||
limpiarProximaEjecucion: true,
|
||||
limpiarSnooze: true,
|
||||
ultimaEjecucionGestionada: gestionadaEn,
|
||||
actualizadaEn: ahora,
|
||||
);
|
||||
}).toList();
|
||||
|
||||
if (!huboCambios) return config;
|
||||
final nuevo = ConfiguracionAlarmas(
|
||||
alarmas: alarmas,
|
||||
vacaciones: config.vacaciones,
|
||||
excepciones: config.excepciones,
|
||||
);
|
||||
await _guardar(nuevo);
|
||||
return nuevo;
|
||||
}
|
||||
|
||||
Future<ConfiguracionAlarmas> saltarProxima(String alarmaId) async {
|
||||
final config = await cargar();
|
||||
final alarma = config.alarmas.firstWhere((a) => a.id == alarmaId);
|
||||
|
||||
Reference in New Issue
Block a user