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
}

View File

@@ -2,12 +2,9 @@
using System.Linq;
using System.Threading.Tasks;
using MieSystem.Models;
using System.Collections.Generic;
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using MieSystem.Models;
using MieSystem.Data.Interfaces;
using AspNetCoreGeneratedDocument;
using MieSystem.Models.ViewModels;
namespace MieSystem.Controllers
{
@@ -25,104 +22,22 @@ namespace MieSystem.Controllers
_expedienteRepository = expedienteRepository;
// Datos de prueba iniciales
if (_expedientes.Count == 0)
/*if (_expedientes.Count == 0)
{
_ = InitializeTestData();
}
}*/
}
private async Task InitializeTestData()
{
var today = DateTime.Today;
var lst = await _expedienteRepository.GetAllAsync();
_expedientes =new List<Expediente>(lst);
/*_expedientes.Add(new Expediente
{
Id = _idCounter++,
Nombre = "Juan",
Apellidos = "Pérez García",
FechaNacimiento = new DateTime(2015, 5, 10),
NombrePadre = "Carlos Pérez",
NombreMadre = "María García",
NombreResponsable = "Carlos Pérez",
ParentescoResponsable = "Padre",
Sexo = "M",
Direccion = "Calle Principal 123, Ciudad",
Telefono = "555-1234",
Observaciones = "Niño tranquilo",
FotoUrl = "/images/default-avatar.png",
FechaCreacion = DateTime.Now.AddDays(-30),
FechaActualizacion = DateTime.Now.AddDays(-30),
Activo = true
});
_expedientes.Add(new Expediente
{
Id = _idCounter++,
Nombre = "Ana",
Apellidos = "López Martínez",
FechaNacimiento = new DateTime(2016, today.Month, 15), // Cumple este mes
NombrePadre = "Pedro López",
NombreMadre = "Laura Martínez",
NombreResponsable = "Laura Martínez",
ParentescoResponsable = "Madre",
Sexo = "F",
Direccion = "Avenida Central 456, Ciudad",
Telefono = "555-5678",
Observaciones = "Alergia a los frutos secos",
FotoUrl = "/images/default-avatar.png",
FechaCreacion = DateTime.Now.AddDays(-15),
FechaActualizacion = DateTime.Now.AddDays(-15),
Activo = true
});
_expedientes.Add(new Expediente
{
Id = _idCounter++,
Nombre = "Carlos",
Apellidos = "Rodríguez Sánchez",
FechaNacimiento = new DateTime(2008, 8, 20), // Mayor de 14 años
NombrePadre = "Javier Rodríguez",
NombreMadre = "Carmen Sánchez",
NombreResponsable = "Javier Rodríguez",
ParentescoResponsable = "Padre",
Sexo = "M",
Direccion = "Plaza Mayor 789, Ciudad",
Telefono = "555-9012",
Observaciones = "Excelente estudiante",
FotoUrl = "/images/default-avatar.png",
FechaCreacion = DateTime.Now.AddDays(-60),
FechaActualizacion = DateTime.Now.AddDays(-60),
Activo = true
});
_expedientes.Add(new Expediente
{
Id = _idCounter++,
Nombre = "María",
Apellidos = "Gómez Fernández",
FechaNacimiento = new DateTime(2017, 11, 5),
NombrePadre = "Luis Gómez",
NombreMadre = "Sofía Fernández",
NombreResponsable = "Sofía Fernández",
ParentescoResponsable = "Madre",
Sexo = "F",
Direccion = "Calle Secundaria 101, Ciudad",
Telefono = "555-3456",
Observaciones = "Necesita atención especial en matemáticas",
FotoUrl = "/images/default-avatar.png",
FechaCreacion = DateTime.Now.AddDays(-45),
FechaActualizacion = DateTime.Now.AddDays(-45),
Activo = true
});*/
_expedientes = [.. lst];
}
// GET: Expedientes
public IActionResult Index()
{
_ = InitializeTestData();
return View();
}
@@ -130,6 +45,7 @@ namespace MieSystem.Controllers
[HttpGet]
public IActionResult GetDashboardStats()
{
_ = InitializeTestData();
var totalNinos = _expedientes.Count;
var mesActual = DateTime.Now.Month;
@@ -162,6 +78,9 @@ namespace MieSystem.Controllers
[HttpGet]
public IActionResult GetExpedientes(int page = 1, int pageSize = 10)
{
if (_expedientes.Count == 0)
_ = InitializeTestData();
var query = _expedientes
.Where(e => e.Activo)
.OrderBy(e => e.Apellidos)
@@ -316,7 +235,8 @@ namespace MieSystem.Controllers
ModelState.Remove("Observaciones");
if (ModelState.IsValid)
{
var expediente = _expedientes.FirstOrDefault(e => e.Id == id);
var expediente = await _expedienteRepository.GetByIdAsync(id);
//var expediente = _expedientes.FirstOrDefault(e => e.Id == id);
if (expediente == null)
{
return Json(new { success = false, message = "Expediente no encontrado" });
@@ -359,6 +279,7 @@ namespace MieSystem.Controllers
}
// Actualizar datos
expediente.Id = id;
expediente.Nombre = model.Nombre;
expediente.Apellidos = model.Apellidos;
expediente.FechaNacimiento = model.FechaNacimiento;
@@ -373,7 +294,16 @@ namespace MieSystem.Controllers
expediente.FotoUrl = fotoUrlActual;
expediente.FechaActualizacion = DateTime.Now;
return Json(new { success = true, message = "Expediente actualizado exitosamente" });
try
{
await _expedienteRepository.UpdateAsync(expediente);
return Json(new { success = true, message = "Expediente actualizado exitosamente" });
}
catch (Exception ex)
{
return Json(new { success = false, message = ex.Message });
}
}
return Json(new { success = false, message = "Error en los datos del formulario" });