Leandro Hernan Rojas c93eb192ca
All checks were successful
CI/CD Pipeline / Build and Deploy with Docker Compose (push) Successful in 4m52s
Add Patch PhTable in Customers 2
2025-04-06 18:51:44 -03:00

250 lines
8.5 KiB
Plaintext

@page "/customers"
@using phronCare.UIBlazor.Services.Sales
@using phronCare.UIBlazor.Data
@using Domain.Entities
@using Domain.Generics
@inject CustomerHttpService CustomerService
<h3 class="text-xl font-bold mb-4">Buscar Clientes</h3>
<div class="mb-4 space-y-2">
<input @bind="SearchParams.Name" placeholder="Nombre" class="border rounded p-1 w-full" />
<input @bind="SearchParams.Email" placeholder="Email" class="border rounded p-1 w-full" />
<input @bind="SearchParams.Document" placeholder="Documento" class="border rounded p-1 w-full" />
<button class="bg-blue-500 text-white px-4 py-2 rounded" @onclick="BuscarClientes">Buscar</button>
</div>
@if (TablaClientes != null && TablaClientes.Any())
{
<PhTable Columns="TableColumns"
Data="TablaClientes"
RowsPerPage="50"
ShowQuickSearch="false"
RenderSelect="false"
RenderButtons="false" />
<div class="mt-4 flex justify-between items-center">
<button class="bg-gray-300 px-4 py-2 rounded" @onclick="AnteriorPagina" disabled="@(!PuedeRetroceder)">Anterior</button>
<span>Página @SearchParams.Page de @TotalPaginas</span>
<button class="bg-gray-300 px-4 py-2 rounded" @onclick="SiguientePagina" disabled="@(!PuedeAvanzar)">Siguiente</button>
</div>
}
else
{
<p>No hay resultados.</p>
}
@code {
private CustomerSearchParams SearchParams = new();
private PagedResult<ECustomer>? PagedResult;
private List<Dictionary<string, object>> TablaClientes = new();
private List<string> TableColumns = new()
{
"Id", "Nombre", "Razon Social", "Activo", "Código Externo", "Crédito", "Límite",
"Email", "Teléfono", "Dirección", "Documento"
};
private async Task BuscarClientes()
{
SearchParams.Page = 1;
await CargarClientes();
}
private async Task CargarClientes()
{
PagedResult = await CustomerService.SearchCustomersAsync(SearchParams);
TablaClientes = PagedResult.Items.Select(c =>
{
var addr = c.PhSCustomerAddresses.FirstOrDefault();
var doc = c.PhSCustomerDocuments.FirstOrDefault();
return new Dictionary<string, object>
{
{ "Id", c.Id },
{ "Nombre", c.Name ?? string.Empty },
{ "Razon Social", c.BusinessName ?? string.Empty },
{ "Activo", c.Active ? "Sí" : "No" },
{ "Código Externo", c.ExternalCode },
{ "Crédito", c.HasCreditAccount ? "Sí" : "No" },
{ "Límite", c.CreditLimit },
{ "Email", addr?.Email ?? "" },
{ "Teléfono", addr?.Phonenumber ?? "" },
{ "Dirección", $"{addr?.Streetaddress1} {addr?.Streetaddress2}, {addr?.City}, {addr?.Postalcode}, {addr?.Country}" },
{ "Documento", $"{doc?.DocumentNumber} | {doc?.IssueDate?.ToString("yyyy-MM-dd")} - {doc?.ExpiryDate?.ToString("yyyy-MM-dd")}" }
};
}).ToList();
}
private async Task SiguientePagina()
{
if (PuedeAvanzar)
{
SearchParams.Page++;
await CargarClientes();
}
}
private async Task AnteriorPagina()
{
if (PuedeRetroceder)
{
SearchParams.Page--;
await CargarClientes();
}
}
private int TotalPaginas => PagedResult is null ? 1 :
(int)Math.Ceiling((double)(PagedResult.TotalItems) / SearchParams.PageSize);
private bool PuedeAvanzar => PagedResult != null && SearchParams.Page < TotalPaginas;
private bool PuedeRetroceder => PagedResult != null && SearchParams.Page > 1;
}
@* @page "/customers"
@using phronCare.UIBlazor.Services.Sales
@using phronCare.UIBlazor.Data
@using Domain.Generics
@inject CustomerHttpService CustomerService
@inject NavigationManager Nav
<h3 class="text-xl font-bold mb-4">Buscar Clientes</h3>
<div class="mb-4 space-y-2">
<input @bind="SearchParams.Name" placeholder="Nombre" class="border rounded p-1 w-full" />
<input @bind="SearchParams.Email" placeholder="Email" class="border rounded p-1 w-full" />
<input @bind="SearchParams.Document" placeholder="Documento" class="border rounded p-1 w-full" />
<button class="bg-blue-500 text-white px-4 py-2 rounded" @onclick="BuscarClientes">Buscar</button>
</div>
@if (PagedResult != null)
{
<table class="table-auto w-full border">
<thead>
<tr class="bg-gray-200">
<th class="px-2 py-1">Id</th>
<th>Name</th>
<th>BusinessName</th>
<th>Active</th>
<th>ExternalCode</th>
<th>HasCreditAccount</th>
<th>CreditLimit</th>
<th>Email</th>
<th>Phone</th>
<th>Dirección</th>
<th>Documento</th>
</tr>
</thead>
<tbody>
@foreach (var c in PagedResult.Items)
{
var addr = c.PhSCustomerAddresses.FirstOrDefault();
var doc = c.PhSCustomerDocuments.FirstOrDefault();
<tr class="border-b">
<td>@c.Id</td>
<td>@c.Name</td>
<td>@c.BusinessName</td>
<td>@(c.Active ? "Sí" : "No")</td>
<td>@c.ExternalCode</td>
<td>@(c.HasCreditAccount ? "Sí" : "No")</td>
<td>@c.CreditLimit</td>
<td>@addr?.Email</td>
<td>@addr?.Phonenumber</td>
<td>
@addr?.Streetaddress1 @addr?.Streetaddress2 <br />
@addr?.City, @addr?.Postalcode, @addr?.Country
</td>
<td>
@doc?.DocumentNumber <br />
@doc?.IssueDate?.ToString("yyyy-MM-dd") <br />
@doc?.ExpiryDate?.ToString("yyyy-MM-dd")
</td>
</tr>
}
</tbody>
</table>
<div class="mt-4 flex justify-between items-center">
<button class="bg-gray-300 px-4 py-2 rounded" @onclick="AnteriorPagina" disabled="@(!PuedeRetroceder)">Anterior</button>
<span>Página @SearchParams.Page de @TotalPaginas</span>
<button class="bg-gray-300 px-4 py-2 rounded" @onclick="SiguientePagina" disabled="@(!PuedeAvanzar)">Siguiente</button>
</div>
}
else
{
<p>No hay resultados.</p>
}
@code {
private CustomerSearchParams SearchParams = new();
private PagedResult<ECustomer>? PagedResult;
[Parameter, SupplyParameterFromQuery] public string? Name { get; set; }
[Parameter, SupplyParameterFromQuery] public string? Email { get; set; }
[Parameter, SupplyParameterFromQuery] public string? Document { get; set; }
[Parameter, SupplyParameterFromQuery] public int? Page { get; set; }
[Parameter, SupplyParameterFromQuery] public int? PageSize { get; set; }
protected override async Task OnParametersSetAsync()
{
SearchParams = new CustomerSearchParams
{
Name = Name,
Email = Email,
Document = Document,
Page = Page ?? 1,
PageSize = PageSize ?? 10
};
await CargarClientes();
}
private async Task BuscarClientes()
{
SearchParams.Page = 1;
ActualizarUrl();
await CargarClientes();
}
private async Task CargarClientes()
{
PagedResult = await CustomerService.SearchCustomersAsync(SearchParams);
}
private async Task SiguientePagina()
{
if (PuedeAvanzar)
{
SearchParams.Page++;
ActualizarUrl();
await CargarClientes();
}
}
private async Task AnteriorPagina()
{
if (PuedeRetroceder)
{
SearchParams.Page--;
ActualizarUrl();
await CargarClientes();
}
}
private void ActualizarUrl()
{
var query = $"/customers?name={SearchParams.Name}&email={SearchParams.Email}&document={SearchParams.Document}&page={SearchParams.Page}&pageSize={SearchParams.PageSize}";
Nav.NavigateTo(query);
}
private int TotalPaginas => PagedResult is null ? 1 :
(int)Math.Ceiling((double)(PagedResult.TotalItems) / SearchParams.PageSize);
private bool PuedeAvanzar => PagedResult != null && SearchParams.Page < TotalPaginas;
private bool PuedeRetroceder => PagedResult != null && SearchParams.Page > 1;
}
*@