@page "/personal/asistencia"
@attribute [Authorize]
@inject IPersonnelService PersonnelSvc
@inject IDialogService DialogSvc
@inject ISnackbar Snackbar
Asistencia - AutoTaller ERP
Marcar entrada / salida
Selecciona un técnico y registra su entrada o salida del día.
Selecciona un técnico
@foreach (var t in tecnicos.Where(x => x.Activo))
{
@t.Codigo — @t.NombreCompleto
}
@(marcando ? "Procesando..." : "Marcar entrada / salida")
@if (!string.IsNullOrEmpty(mensaje))
{
@mensaje
}
Fecha
Técnico
Entrada
Salida
Horas
Extras
@context.Fecha.ToString("dd/MM/yyyy")
@context.Tecnico
@(context.HoraEntrada?.ToString("HH:mm") ?? "—")
@(context.HoraSalida?.ToString("HH:mm") ?? "—")
@context.HorasTrabajadas.ToString("N2")
@if (context.HorasExtras > 0)
{
@context.HorasExtras.ToString("N2") h
}
Sin registros para el rango seleccionado
@code {
private int? tecnicoSelId;
private string? observaciones;
private bool marcando;
private string? mensaje;
private Severity severidadMensaje = Severity.Info;
private List tecnicos = new();
private List asistencias = new();
private bool cargando = true;
private DateTime? desde = DateTime.Today.AddDays(-7);
private DateTime? hasta = DateTime.Today;
protected override async Task OnInitializedAsync()
{
tecnicos = await PersonnelSvc.ListarTecnicosAsync();
await CargarAsistenciasAsync();
}
private async Task CargarAsistenciasAsync()
{
if (!desde.HasValue || !hasta.HasValue) return;
cargando = true;
asistencias = await PersonnelSvc.ListarAsistenciasAsync(null, desde.Value, hasta.Value);
cargando = false;
}
private async Task Marcar()
{
if (tecnicoSelId == null) return;
marcando = true; mensaje = null;
try
{
await PersonnelSvc.MarcarEntradaSalidaAsync(new MarcarEntradaSalidaDto
{
TecnicoId = tecnicoSelId.Value,
Observaciones = observaciones
});
mensaje = "Marcado registrado correctamente";
severidadMensaje = Severity.Success;
observaciones = null;
await CargarAsistenciasAsync();
}
catch (Exception ex)
{
mensaje = ex.Message;
severidadMensaje = Severity.Error;
}
finally { marcando = false; }
}
}