168 lines
5.0 KiB
C#
168 lines
5.0 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using Asistencia.Models;
|
|
using Asistencia.Services;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace Asistencia.ViewModels;
|
|
|
|
public partial class AsistenciaViewModel : ObservableObject
|
|
{
|
|
private readonly AsistenciaService _asistenciaService;
|
|
private readonly AuthService _authService;
|
|
private readonly MainWindowViewModel _mainVm;
|
|
private readonly CursoAbierto _curso;
|
|
|
|
[ObservableProperty]
|
|
private string _nombreCurso = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private string _infoCurso = string.Empty;
|
|
|
|
[ObservableProperty]
|
|
private bool _enSesion;
|
|
|
|
[ObservableProperty]
|
|
private int _totalAlumnos;
|
|
|
|
[ObservableProperty]
|
|
private int _presentes;
|
|
|
|
[ObservableProperty]
|
|
private int _tardanzas;
|
|
|
|
[ObservableProperty]
|
|
private int _ausentes;
|
|
|
|
[ObservableProperty]
|
|
private string _mensajeEstado = string.Empty;
|
|
|
|
public ObservableCollection<AlumnoAsistenciaViewModel> Alumnos { get; } = new();
|
|
|
|
public AsistenciaViewModel(AsistenciaService asistenciaService, AuthService authService, CursoAbierto curso, MainWindowViewModel mainVm)
|
|
{
|
|
_asistenciaService = asistenciaService;
|
|
_authService = authService;
|
|
_mainVm = mainVm;
|
|
_curso = curso;
|
|
|
|
NombreCurso = curso.Curso?.NombreCurso ?? "Curso";
|
|
InfoCurso = $"{curso.Sala} | {curso.Sede} | {curso.HoraInicio} - {curso.HoraFin}";
|
|
|
|
_ = InitAsync();
|
|
}
|
|
|
|
private async Task InitAsync()
|
|
{
|
|
var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto);
|
|
EnSesion = sesion != null;
|
|
|
|
var alumnos = await _asistenciaService.ObtenerAlumnosAsync(_curso.IdCursoAbierto);
|
|
var asistencias = await _asistenciaService.ObtenerAsistenciaAlumnosAsync(_curso.IdCursoAbierto);
|
|
|
|
Alumnos.Clear();
|
|
foreach (var alumno in alumnos)
|
|
{
|
|
var tipo = asistencias.TryGetValue(alumno.IdDetalleContrato, out var t) ? t : TipoAsistencia.Ausente;
|
|
Alumnos.Add(new AlumnoAsistenciaViewModel(alumno, tipo));
|
|
}
|
|
|
|
TotalAlumnos = Alumnos.Count;
|
|
ActualizarContadores();
|
|
|
|
MensajeEstado = EnSesion
|
|
? "Sesion en curso - Puede registrar asistencia"
|
|
: "Inicie la sesion para registrar asistencia";
|
|
}
|
|
|
|
[RelayCommand]
|
|
private async Task IniciarSesionAsync()
|
|
{
|
|
if (_authService.CurrentUser == null) return;
|
|
|
|
await _asistenciaService.IniciarSesionAsync(_curso.IdCursoAbierto, _authService.CurrentUser.RutPasaporte);
|
|
EnSesion = true;
|
|
MensajeEstado = "Sesion iniciada - Registre la asistencia de los alumnos";
|
|
}
|
|
|
|
[RelayCommand]
|
|
private async Task FinalizarSesionAsync()
|
|
{
|
|
var sesion = await _asistenciaService.BuscarSesionActivaAsync(_curso.IdCursoAbierto);
|
|
if (sesion != null)
|
|
{
|
|
await _asistenciaService.FinalizarSesionAsync(sesion.Id);
|
|
}
|
|
EnSesion = false;
|
|
MensajeEstado = "Sesion finalizada";
|
|
}
|
|
|
|
[RelayCommand]
|
|
private async Task MarcarAlumnoAsync(AlumnoAsistenciaViewModel? alumno)
|
|
{
|
|
if (alumno == null || !EnSesion) return;
|
|
|
|
alumno.CiclarTipoAsistencia();
|
|
await _asistenciaService.GuardarAsistenciaAlumnoAsync(alumno.IdDetalleContrato, alumno.TipoAsistencia);
|
|
ActualizarContadores();
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void Volver()
|
|
{
|
|
_mainVm.NavigateToDashboard();
|
|
}
|
|
|
|
private void ActualizarContadores()
|
|
{
|
|
Presentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Presente);
|
|
Tardanzas = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Tardanza);
|
|
Ausentes = Alumnos.Count(a => a.TipoAsistencia == Models.TipoAsistencia.Ausente);
|
|
}
|
|
}
|
|
|
|
public partial class AlumnoAsistenciaViewModel : ObservableObject
|
|
{
|
|
public int IdDetalleContrato { get; }
|
|
public string NombreCompleto { get; }
|
|
|
|
[ObservableProperty]
|
|
private int _tipoAsistencia;
|
|
|
|
[ObservableProperty]
|
|
private string _tipoAsistenciaTexto;
|
|
|
|
[ObservableProperty]
|
|
private string _tipoAsistenciaColor;
|
|
|
|
public AlumnoAsistenciaViewModel(DetalleContrato alumno, int tipoInicial)
|
|
{
|
|
IdDetalleContrato = alumno.IdDetalleContrato;
|
|
NombreCompleto = alumno.NombreCompleto;
|
|
TipoAsistencia = tipoInicial;
|
|
ActualizarDisplay();
|
|
}
|
|
|
|
public void CiclarTipoAsistencia()
|
|
{
|
|
TipoAsistencia = TipoAsistencia switch
|
|
{
|
|
Models.TipoAsistencia.Presente => Models.TipoAsistencia.Tardanza,
|
|
Models.TipoAsistencia.Tardanza => Models.TipoAsistencia.Ausente,
|
|
_ => Models.TipoAsistencia.Presente
|
|
};
|
|
ActualizarDisplay();
|
|
}
|
|
|
|
private void ActualizarDisplay()
|
|
{
|
|
TipoAsistenciaTexto = Models.TipoAsistencia.Nombre(TipoAsistencia);
|
|
TipoAsistenciaColor = TipoAsistencia switch
|
|
{
|
|
Models.TipoAsistencia.Presente => "#28A745",
|
|
Models.TipoAsistencia.Tardanza => "#FFC107",
|
|
_ => "#DC3545"
|
|
};
|
|
}
|
|
}
|