251 lines
8.6 KiB
C#
251 lines
8.6 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using MieSystem.Models;
|
|
using MieSystem.Models.ViewModels;
|
|
using MieSystem.Services;
|
|
|
|
namespace MieSystem.Controllers
|
|
{
|
|
public class AsistenciaController : Controller
|
|
{
|
|
private readonly ExpedienteService expedienteService;
|
|
private readonly AsistenciaService asistenciaService;
|
|
public AsistenciaController(ExpedienteService expedienteService, AsistenciaService asistenciaService)
|
|
{
|
|
this.expedienteService = expedienteService;
|
|
this.asistenciaService = asistenciaService;
|
|
}
|
|
|
|
public async Task<IActionResult> Index(int? año, int? mes, string diasSemana = null)
|
|
{
|
|
var fechaActual = DateTime.Now;
|
|
var añoSeleccionado = año ?? fechaActual.Year;
|
|
var mesSeleccionado = mes ?? fechaActual.Month;
|
|
|
|
var expedientes = await expedienteService.GetActivosAsync();
|
|
|
|
var diasDelMes = GetDiasDelMes(añoSeleccionado, mesSeleccionado);
|
|
|
|
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 asistenciaService.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.ToString();
|
|
}
|
|
|
|
// 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[0],
|
|
UsuarioRegistro = User.Identity?.Name ?? "Sistema"
|
|
};
|
|
|
|
var resultado = await asistenciaService.SaveAsync(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[0],
|
|
UsuarioRegistro = User.Identity?.Name ?? "Sistema"
|
|
};
|
|
asistenciasModel.Add(asistencia);
|
|
}
|
|
|
|
var resultado = asistenciaService.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 asistenciaService.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
|
|
}
|