Todo
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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" });
|
||||
|
||||
Reference in New Issue
Block a user