feat(app): add onboarding and harden alarms
Build & Deploy Pluriwave / Análisis de código (push) Successful in 21s
Build & Deploy Pluriwave / Build APK + AAB release (push) Failing after 1m6s

This commit is contained in:
2026-05-23 01:22:37 +02:00
parent 27b8fccac9
commit 896349ad5f
44 changed files with 1772 additions and 241 deletions
@@ -1,6 +1,8 @@
import '../modelos/alarma_musical.dart';
class ServicioProgramacionAlarmas {
static const Duration toleranciaDisparoInminente = Duration(seconds: 90);
DateTime? calcularProxima({
required AlarmaMusical alarma,
required DateTime desde,
@@ -24,25 +26,27 @@ class ServicioProgramacionAlarmas {
final primerCandidato =
alarma.tipoProgramacion == TipoProgramacionAlarma.unica
? inicio
: inicio.isAfter(desde)
: _sigueSiendoInminente(inicio, desde)
? inicio
: inicio.add(const Duration(days: 1));
return switch (alarma.tipoProgramacion) {
TipoProgramacionAlarma.unica =>
primerCandidato.isAfter(desde) &&
_sigueSiendoInminente(primerCandidato, desde) &&
_esValida(alarma, primerCandidato, vacaciones, excepciones)
? primerCandidato
? _normalizarInminente(primerCandidato, desde)
: null,
TipoProgramacionAlarma.diaria => _buscarDiaria(
alarma,
primerCandidato,
desde,
vacaciones,
excepciones,
),
TipoProgramacionAlarma.diasSemana => _buscarPorDiasSemana(
alarma,
primerCandidato,
desde,
vacaciones,
excepciones,
),
@@ -60,12 +64,16 @@ class ServicioProgramacionAlarmas {
DateTime? _buscarDiaria(
AlarmaMusical alarma,
DateTime candidato,
DateTime desde,
List<RangoVacaciones> vacaciones,
List<ExcepcionAlarma> excepciones,
) {
var actual = candidato;
for (var i = 0; i < 370; i++) {
if (_esValida(alarma, actual, vacaciones, excepciones)) return actual;
if (_sigueSiendoInminente(actual, desde) &&
_esValida(alarma, actual, vacaciones, excepciones)) {
return _normalizarInminente(actual, desde);
}
actual = actual.add(const Duration(days: 1));
}
return null;
@@ -74,6 +82,7 @@ class ServicioProgramacionAlarmas {
DateTime? _buscarPorDiasSemana(
AlarmaMusical alarma,
DateTime candidato,
DateTime desde,
List<RangoVacaciones> vacaciones,
List<ExcepcionAlarma> excepciones,
) {
@@ -81,8 +90,9 @@ class ServicioProgramacionAlarmas {
var actual = candidato;
for (var i = 0; i < 370; i++) {
if (alarma.diasSemana.contains(actual.weekday) &&
_sigueSiendoInminente(actual, desde) &&
_esValida(alarma, actual, vacaciones, excepciones)) {
return actual;
return _normalizarInminente(actual, desde);
}
actual = actual.add(const Duration(days: 1));
}
@@ -111,4 +121,13 @@ class ServicioProgramacionAlarmas {
a.day == b.day &&
a.hour == b.hour &&
a.minute == b.minute;
bool _sigueSiendoInminente(DateTime candidato, DateTime desde) =>
candidato.isAfter(desde) ||
desde.difference(candidato) <= toleranciaDisparoInminente;
DateTime _normalizarInminente(DateTime candidato, DateTime desde) =>
candidato.isAfter(desde)
? candidato
: desde.add(const Duration(seconds: 2));
}