feat(app): add onboarding and harden alarms
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user