From d45fbe60dbe5487d4fda0d99a1cb97467a803794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Bautista=20Fern=C3=A1ndez?= Date: Fri, 29 May 2026 13:29:41 +0200 Subject: [PATCH] fix(alarms): skip handled occurrence when recalculating --- .../servicio_programacion_alarmas.dart | 6 ++++++ .../servicio_programacion_alarmas_test.dart | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/servicios/servicio_programacion_alarmas.dart b/lib/servicios/servicio_programacion_alarmas.dart index 6a5429b..86c37c4 100644 --- a/lib/servicios/servicio_programacion_alarmas.dart +++ b/lib/servicios/servicio_programacion_alarmas.dart @@ -124,6 +124,12 @@ class ServicioProgramacionAlarmas { List vacaciones, List excepciones, ) { + final ultimaGestionada = alarma.ultimaEjecucionGestionada; + if (ultimaGestionada != null && + _mismaEjecucion(ultimaGestionada, candidato)) { + return false; + } + if (!alarma.sonarEnVacaciones && estaEnVacaciones(candidato, vacaciones)) { return false; } diff --git a/test/servicios/servicio_programacion_alarmas_test.dart b/test/servicios/servicio_programacion_alarmas_test.dart index 30954ea..a6d2aae 100644 --- a/test/servicios/servicio_programacion_alarmas_test.dart +++ b/test/servicios/servicio_programacion_alarmas_test.dart @@ -148,6 +148,25 @@ void main() { expect(siguiente, DateTime(2026, 5, 26, 7, 30)); }); + test('no reutiliza ejecucion gestionada aunque siga en tolerancia', () { + final alarma = AlarmaMusical( + id: 'a9', + nombre: 'Diaria gestionada', + hora: 7, + minuto: 30, + tipoProgramacion: TipoProgramacionAlarma.diaria, + diasSemana: const [], + ultimaEjecucionGestionada: DateTime(2026, 5, 25, 7, 30), + ); + + final proxima = servicio.calcularProxima( + alarma: alarma, + desde: DateTime(2026, 5, 25, 7, 30, 20), + ); + + expect(proxima, DateTime(2026, 5, 26, 7, 30)); + }); + test('calcula siguiente por dias de semana despues de ejecucion', () { final alarma = AlarmaMusical( id: 'a7',