using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MieSystem.Data.Interfaces; using MieSystem.Models; using MieSystem.Models.ViewModels; namespace MieSystem.Controllers { public class AsistenciaController : Controller { private readonly IExpedienteRepository _expedienteRepository; private readonly IAsistenciaRepository _asistenciaRepository; public AsistenciaController( IExpedienteRepository expedienteRepository, IAsistenciaRepository asistenciaRepository) { _expedienteRepository = expedienteRepository; _asistenciaRepository = asistenciaRepository; } public async Task Index(int? año, int? mes, string diasSemana = null) { // Valores por defecto: mes actual var fechaActual = DateTime.Now; var añoSeleccionado = año ?? fechaActual.Year; var mesSeleccionado = mes ?? fechaActual.Month; // Obtener todos los niños activos var expedientes = await _expedienteRepository.GetActivosAsync(); // Obtener días del mes seleccionado var diasDelMes = GetDiasDelMes(añoSeleccionado, mesSeleccionado); // Filtrar por días de semana si se especifica if (!string.IsNullOrEmpty(diasSemana)) { var diasFiltro = diasSemana.Split(',') .Select(d => int.Parse(d)) .ToList(); diasDelMes = diasDelMes.Where(d => diasFiltro.Contains((int)d.DayOfWeek)).ToList(); } // Obtener asistencias para el mes var asistencias = await _asistenciaRepository.GetAsistenciasPorMesAsync( añoSeleccionado, mesSeleccionado); // Crear diccionario para acceso rápido var dictAsistencias = new Dictionary(); foreach (var asistencia in asistencias) { var key = $"{asistencia.ExpedienteId}_{asistencia.Fecha:yyyy-MM-dd}"; dictAsistencias[key] = asistencia.Estado; } // Crear modelo de vista var model = new AsistenciaViewModel { Año = añoSeleccionado, Mes = mesSeleccionado, NombreMes = GetNombreMes(mesSeleccionado), DiasSemanaSeleccionados = diasSemana, Expedientes = expedientes.ToList(), DiasDelMes = diasDelMes, Asistencias = dictAsistencias }; ViewBag.Meses = GetListaMeses(); ViewBag.Años = GetListaAños(); ViewBag.DiasSemana = GetDiasSemana(); return View(model); } [HttpPost] public async Task GuardarAsistencia(int expedienteId, string fecha, string estado) { try { if (!DateTime.TryParse(fecha, out DateTime fechaDate)) { return Json(new { success = false, message = "Fecha inválida" }); } var asistencia = new Asistencia { ExpedienteId = expedienteId, Fecha = fechaDate, Estado = estado, UsuarioRegistro = User.Identity?.Name ?? "Sistema" }; var resultado = await _asistenciaRepository.GuardarAsistenciaAsync(asistencia); return Json(new { success = resultado, message = "Asistencia guardada" }); } catch (Exception ex) { return Json(new { success = false, message = ex.Message }); } } [HttpPost] public async Task GuardarAsistenciasMasivas([FromBody] List asistencias) { try { var asistenciasModel = new List(); foreach (var asistenciaDto in asistencias) { var asistencia = new Asistencia { ExpedienteId = asistenciaDto.ExpedienteId, Fecha = asistenciaDto.Fecha, Estado = asistenciaDto.Estado, UsuarioRegistro = User.Identity?.Name ?? "Sistema" }; asistenciasModel.Add(asistencia); } var resultado = await _asistenciaRepository.GuardarAsistenciasMasivasAsync(asistenciasModel); return Json(new { success = resultado, message = resultado ? "Asistencias guardadas correctamente" : "Error al guardar asistencias" }); } catch (Exception ex) { return Json(new { success = false, message = ex.Message }); } } [HttpGet] public async Task ObtenerEstadisticas(int año, int mes) { try { var estadisticas = await _asistenciaRepository.GetEstadisticasMesAsync(año, mes); return Json(estadisticas); } catch (Exception ex) { return Json(new { error = ex.Message }); } } [HttpGet] public async Task ExportarExcel(int año, int mes, string diasSemana = null) { // Implementar exportación a Excel // Por ahora solo redirige return Content($"Exportar Excel: Año={año}, Mes={mes}, Días={diasSemana}"); } #region Métodos auxiliares privados private List GetDiasDelMes(int año, int mes) { var dias = new List(); var fecha = new DateTime(año, mes, 1); var ultimoDia = fecha.AddMonths(1).AddDays(-1); for (var dia = fecha; dia <= ultimoDia; dia = dia.AddDays(1)) { dias.Add(dia); } return dias; } private string GetNombreMes(int mes) { return mes switch { 1 => "Enero", 2 => "Febrero", 3 => "Marzo", 4 => "Abril", 5 => "Mayo", 6 => "Junio", 7 => "Julio", 8 => "Agosto", 9 => "Septiembre", 10 => "Octubre", 11 => "Noviembre", 12 => "Diciembre", _ => "Mes inválido" }; } private List GetListaMeses() { return new List { new SelectListItem { Value = "1", Text = "Enero" }, new SelectListItem { Value = "2", Text = "Febrero" }, new SelectListItem { Value = "3", Text = "Marzo" }, new SelectListItem { Value = "4", Text = "Abril" }, new SelectListItem { Value = "5", Text = "Mayo" }, new SelectListItem { Value = "6", Text = "Junio" }, new SelectListItem { Value = "7", Text = "Julio" }, new SelectListItem { Value = "8", Text = "Agosto" }, new SelectListItem { Value = "9", Text = "Septiembre" }, new SelectListItem { Value = "10", Text = "Octubre" }, new SelectListItem { Value = "11", Text = "Noviembre" }, new SelectListItem { Value = "12", Text = "Diciembre" } }; } private List GetListaAños() { var años = new List(); var añoActual = DateTime.Now.Year; for (int i = añoActual - 5; i <= añoActual + 1; i++) { años.Add(new SelectListItem { Value = i.ToString(), Text = i.ToString(), Selected = i == añoActual }); } return años; } private List GetDiasSemana() { return new List { new SelectListItem { Value = "1", Text = "Lunes" }, new SelectListItem { Value = "2", Text = "Martes" }, new SelectListItem { Value = "3", Text = "Miércoles" }, new SelectListItem { Value = "4", Text = "Jueves" }, new SelectListItem { Value = "5", Text = "Viernes" }, new SelectListItem { Value = "6", Text = "Sábado" }, new SelectListItem { Value = "0", Text = "Domingo" } }; } #endregion } #region Modelos de vista public class SelectListItem { public string Value { get; set; } public string Text { get; set; } public bool Selected { get; set; } } #endregion }