@page "/quotes" @using Domain.Dtos @using Domain.Generics @using phronCare.UIBlazor.Services.Sales.Quotes @inject NavigationManager Navigation @inject QuoteService quoteService @inject IToastService toastService

Consulta de Presupuestos


@if (PagedQuotes?.Items?.Any() == true) { @foreach (var quote in PagedQuotes.Items) { }
Quotenumber Emisión Estimada Cliente Médico Hospital Paciente Unidad Moneda Total Estado Vendedor Acciones
@quote.Quotenumber @quote.IssueDate.ToString("dd/MM/yyyy") @(quote.EstimatedDate.HasValue ? quote.EstimatedDate.Value.ToString("dd/MM/yyyy") : "—") @quote.CustomerName @quote.ProfessionalName @quote.InstitutionName @quote.PatientName @quote.BusinessUnitName @quote.Currency @string.Format("{0:N2}", quote.Total) @quote.Status @quote.SalespersonName
@if (SelectedQuote != null) {
Detalle Presupuesto @SelectedQuote?.Quotenumber
@if (activeTab == "Datos") {
Cliente:
@SelectedQuote?.CustomerName
Médico:
@SelectedQuote?.ProfessionalName
Hospital:
@SelectedQuote?.InstitutionName
Paciente:
@SelectedQuote?.PatientName
Emisión:
@SelectedQuote?.IssueDate.ToString("dd/MM/yyyy")
Estimada:
@SelectedQuote?.EstimatedDate?.ToString("dd/MM/yyyy")
Unidad Negocio:
@SelectedQuote?.BusinessUnitName
Moneda:
@SelectedQuote?.Currency
Vendedor:
@SelectedQuote?.SalespersonName
Estado:
@SelectedQuote?.Status
Observaciones:
SN
} else if (activeTab == "Items") { if (SelectedQuote?.Items == null || !SelectedQuote.Items.Any()) {

No hay productos en este presupuesto.

} else {
Productos cotizados
@foreach (var item in SelectedQuote.Items) { }
Descripción Cant. Precio U. Subtotal
@item.Description @item.Quantity @string.Format("{0:N2}", item.UnitPrice) @string.Format("{0:N2}", item.Quantity * item.UnitPrice)
} if (SelectedQuote?.Taxes != null && SelectedQuote.Taxes.Any()) {
Impuestos aplicados
@foreach (var tax in SelectedQuote.Taxes) { }
Impuesto Código Porcentaje Importe
@tax.TaxName @tax.TaxCode @string.Format("{0:N2}%", tax.TaxRate) @string.Format("{0:N2}", tax.TaxAmount)
} }
} } else if (IsLoading) {

Cargando...

} else {

No hay resultados.

}
@code { private QuoteSearchParams Filters = new() { PageSize = 9 }; private PagedResult? PagedQuotes; private QuoteDto? SelectedQuote { get; set; } private bool IsLoading; private int PaginaDeseada = 1; private string activeTab = "Datos"; private async Task Search() { try { IsLoading = true; PagedQuotes = await quoteService.SearchAsync( Filters.CustomerId, Filters.CustomerText, Filters.QuoteNumber, Filters.ProfessionalId, Filters.ProfessionalText, Filters.InstitutionId, Filters.InstitutionText, Filters.PatientId, Filters.PatientText, Filters.Status, Filters.IssueDateFrom, Filters.IssueDateTo, Filters.Page, Filters.PageSize); PaginaDeseada = Filters.Page; } catch (Exception ex) { toastService.ShowError(ex.Message); } finally { IsLoading = false; } } private void ToggleDetail(QuoteDto quote) { if (SelectedQuote?.Id == quote.Id) SelectedQuote = null; else { SelectedQuote = quote; activeTab = "Datos"; } } private async Task PrimeraPagina() { Filters.Page = 1; await Search(); } private async Task UltimaPagina() { Filters.Page = TotalPaginas; await Search(); } private async Task SiguientePagina() => await CambiarPagina(1); private async Task AnteriorPagina() => await CambiarPagina(-1); private async Task CambiarPagina(int delta) { var nuevaPagina = Filters.Page + delta; if (nuevaPagina >= 1 && nuevaPagina <= TotalPaginas) { Filters.Page = nuevaPagina; await Search(); } } private async Task IrAPagina() { if (PaginaDeseada >= 1 && PaginaDeseada <= TotalPaginas) { Filters.Page = PaginaDeseada; await Search(); } else { toastService.ShowWarning("Número de página fuera de rango."); } } private bool PuedeRetroceder => PagedQuotes != null && Filters.Page > 1; private bool PuedeAvanzar => PagedQuotes != null && Filters.Page < TotalPaginas; private int TotalPaginas => PagedQuotes is null ? 1 : (int)Math.Ceiling((double)(PagedQuotes.TotalItems) / Filters.PageSize); private void Create() { Navigation.NavigateTo("/quote/create/"); } private void OnClear() { Filters = new QuoteSearchParams(); PagedQuotes = null; PaginaDeseada = 1; } private string GetStatusBadge(string status) => status switch { "Emitido" => "bg-primary text-white", "Aprobado" => "bg-success", "Despacho" => "bg-info text-white", "SinConsumo" => "bg-warning text-dark", "Transito" => "bg-secondary text-white", "Cerrado" => "bg-dark text-white", _ => "bg-light text-dark" }; private async void PrintPdf(int quoteId, string quoteNumber) { try { await quoteService.ExportPdfAsync(quoteId,quoteNumber); } catch (Exception ex) { toastService.ShowError(ex.Message); } } }