@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 }
Registros
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; } } }