@page "/expeditions" @using Domain.Dtos @using Domain.Dtos.Stock @using Domain.Generics @using System.Text.Json @using phronCare.UIBlazor.Services.Stock.Expeditions @inject IExpeditionService expeditionService @inject NavigationManager Nav @inject IToastService Toast

Consulta de Expediciones

@* TODO: reemplazar por BlazoredTypeahead cuando conectes lookup de ubicaciones *@
@if (result?.Items?.Any() == true) { @foreach (var e in result!.Items!) { } } else if (IsLoading) { } else { }
Fecha Estado Referencia Ext. Paciente Médico Hospital Observaciones Acciones
@e.Expeditionnumber @e.Issuedate.ToString("yyyy-MM-dd") @e.Status @e.ExternalReference @GetPatient(e.ExtrainfoJson) @GetProfessional(e.ExtrainfoJson) @GetInstitution(e.ExtrainfoJson) @e.Observations
Cargando...
Sin resultados
@if (result is not null && result.TotalItems > 0) { var from = ((page - 1) * pageSize) + 1; var to = Math.Min(page * pageSize, result.TotalItems); Mostrando @from–@to de @result.TotalItems }
@code { private LSProductSearchParams SearchParams = new() { Page = 1, PageSize = 10 }; private Filters filters = new(); private PagedResult? result; private bool IsLoading; private int page = 1; private int pageSize = 10; private int TotalPages => result is null ? 1 : (int)Math.Ceiling((double)result.TotalItems / result.PageSize); private ExpeditionDto? selected; private bool drawerOpen; private bool loadingDetail; private async Task OpenDetailAsync(ExpeditionDto dto) { // Abro el drawer con lo que ya tengo (encabezado) drawerOpen = true; selected = dto; StateHasChanged(); // Traigo el DTO completo (incluye Items) var full = await expeditionService.GetDtoByIdAsync(dto.Id); if (full is not null) { selected = full; // ahora sí con Items } else { Toast.ShowError("No se pudo cargar el detalle de la expedición."); } // opcional: si querés mostrar un spinner en el drawer mientras carga loadingDetail = false; StateHasChanged(); } private async Task Search() { try { IsLoading = true; result = await expeditionService.SearchAsync( expeditionNumber: filters.Number, status: filters.Status, issueDateFrom: filters.From, issueDateTo: filters.To, locationId: filters.LocationId, page: page, pageSize: pageSize); StateHasChanged(); } catch (Exception ex) { Toast.ShowError(ex.Message); } finally { IsLoading = false; } } private void Clear() { filters = new(); page = 1; result = null; } private void Create() { Nav.NavigateTo("/expeditions/create"); } private async Task ExportarExcel() { SearchParams.Page = 1; SearchParams.PageSize = int.MaxValue; // Exportar todos los resultados try { await expeditionService.ExportFilteredAsync(SearchParams); Toast.ShowSuccess("Exportación completada."); } catch (Exception ex) { Toast.ShowError($"Error: {ex.Message}"); } } // private async Task ExportCurrent() // { // // Opcional: /api/lsm/expeditions/export?{filtros} // Toast.ShowInfo("Export en preparación."); // } private async Task ViewPdf(int id, string number) { await expeditionService.ExportPdfAsync(id, number); } private void OpenDetail(ExpeditionDto dto) { selected = dto; drawerOpen = true; } private async Task OnExportPdfRequested((int Id, string Number) payload) { await expeditionService.ExportPdfAsync(payload.Id, payload.Number); } private async Task PrevPage() { if (page <= 1) return; page--; await Search(); } private async Task NextPage() { if (result is null || page >= TotalPages) return; page++; await Search(); } private void ChangePageSize(string? value) { if (int.TryParse(value, out var newSize) && newSize > 0) { pageSize = newSize; page = 1; _ = Search(); } } public class Filters { public string? Number { get; set; } public string? Status { get; set; } public DateTime? From { get; set; } public DateTime? To { get; set; } public int? LocationId { get; set; } } private static string? GetProfessional(string? json) => TryGetString(json, "Professional"); private static string? GetInstitution(string? json) => TryGetString(json, "Institution"); private static string? GetPatient(string? json) => TryGetString(json, "Patient"); private static string? GetSurgeryDateShort(string? json) => TryGetDate(json, "SurgeryDate")?.ToString("dd/MM/yyyy"); private static string? TryGetString(string? json, string propName) { if (string.IsNullOrWhiteSpace(json)) return null; try { using var doc = JsonDocument.Parse(json); var root = doc.RootElement; if (root.ValueKind != JsonValueKind.Object) return null; foreach (var p in root.EnumerateObject()) if (string.Equals(p.Name, propName, StringComparison.OrdinalIgnoreCase) && p.Value.ValueKind == JsonValueKind.String) return p.Value.GetString(); return null; } catch { return null; } } private static DateTime? TryGetDate(string? json, string propName) { var s = TryGetString(json, propName); if (string.IsNullOrWhiteSpace(s)) return null; if (DateTime.TryParse(s, out var dt)) return dt; return null; } }