This commit is contained in:
2025-12-25 13:54:49 -06:00
parent d405b61ddd
commit 3457721238
26 changed files with 3509 additions and 139 deletions

View File

@@ -1,12 +1,261 @@
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
{
public IActionResult Index()
private readonly IExpedienteRepository _expedienteRepository;
private readonly IAsistenciaRepository _asistenciaRepository;
public AsistenciaController(
IExpedienteRepository expedienteRepository,
IAsistenciaRepository asistenciaRepository)
{
return View();
_expedienteRepository = expedienteRepository;
_asistenciaRepository = asistenciaRepository;
}
public async Task<IActionResult> 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<string, string>();
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<IActionResult> 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<IActionResult> GuardarAsistenciasMasivas([FromBody] List<AsistenciaMasivaDto> asistencias)
{
try
{
var asistenciasModel = new List<Asistencia>();
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<IActionResult> 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<IActionResult> 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<DateTime> GetDiasDelMes(int año, int mes)
{
var dias = new List<DateTime>();
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<SelectListItem> GetListaMeses()
{
return new List<SelectListItem>
{
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<SelectListItem> GetListaAños()
{
var años = new List<SelectListItem>();
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<SelectListItem> GetDiasSemana()
{
return new List<SelectListItem>
{
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
}