feat: implement core domain models, authentication service, and UI components for the attendance system

This commit is contained in:
2026-07-31 14:39:25 -04:00
commit f476f704eb
329 changed files with 12622 additions and 0 deletions
@@ -0,0 +1,88 @@
using Microsoft.EntityFrameworkCore;
using Asistencia.Models;
namespace Asistencia.Data.Repositories;
public class AsistenciaRepository
{
private readonly AppDbContext _context;
public AsistenciaRepository(AppDbContext context)
{
_context = context;
}
public async Task<AsistenciaProfesor?> BuscarSesionActivaAsync(int idCursoAbierto, DateTime fecha)
{
return await _context.AsistenciasProfesor
.FirstOrDefaultAsync(a =>
a.IdCursoAbierto == idCursoAbierto &&
a.FechaAsistencia.Date == fecha.Date &&
a.Estado == "Activa");
}
public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut, DateTime fecha, string horaInicio)
{
var sesion = new AsistenciaProfesor
{
IdCursoAbierto = idCursoAbierto,
RutPasaporte = rut,
FechaAsistencia = fecha,
HoraInicio = horaInicio,
Estado = "Activa"
};
_context.AsistenciasProfesor.Add(sesion);
await _context.SaveChangesAsync();
return sesion;
}
public async Task<bool> FinalizarSesionAsync(int idSesion, string horaFin)
{
var sesion = await _context.AsistenciasProfesor.FindAsync(idSesion);
if (sesion == null) return false;
sesion.HoraFin = horaFin;
sesion.Estado = "Finalizada";
await _context.SaveChangesAsync();
return true;
}
public async Task<Dictionary<int, int>> ObtenerAsistenciaAlumnosAsync(int idCursoAbierto, DateTime fecha)
{
var alumnos = await _context.DetallesContrato
.Where(d => d.IdCursoAbierto == idCursoAbierto)
.ToListAsync();
var asistencias = await _context.AsistenciasAlumno
.Where(a => alumnos.Select(al => al.IdDetalleContrato).Contains(a.IdDetalleContrato)
&& a.FechaAsistencia.Date == fecha.Date)
.ToListAsync();
return asistencias.ToDictionary(a => a.IdDetalleContrato, a => a.IdTipoAsistencia);
}
public async Task GuardarAsistenciaAlumnoAsync(int idDetalleContrato, DateTime fecha, string hora, int tipoAsistencia)
{
var existing = await _context.AsistenciasAlumno
.FirstOrDefaultAsync(a => a.IdDetalleContrato == idDetalleContrato
&& a.FechaAsistencia.Date == fecha.Date);
if (existing != null)
{
existing.IdTipoAsistencia = tipoAsistencia;
existing.Hora = hora;
}
else
{
_context.AsistenciasAlumno.Add(new AsistenciaAlumno
{
IdDetalleContrato = idDetalleContrato,
FechaAsistencia = fecha,
Hora = hora,
IdTipoAsistencia = tipoAsistencia
});
}
await _context.SaveChangesAsync();
}
}