Update Patch UI Authorize
All checks were successful
CI/CD Pipeline / Build and Deploy with Docker Compose (push) Successful in 6m22s

This commit is contained in:
Leandro Hernan Rojas 2025-05-29 21:16:55 -03:00
parent e276e9672c
commit 134e702273
3 changed files with 58 additions and 24 deletions

View File

@ -50,17 +50,31 @@ namespace Core.Services
public async Task<bool> AuthorizeQuoteAsync(int quoteId, List<QuoteAuthorizationDto> items)
{
var approvedDetails = items.Select(i => new EQuoteDetail
if (items == null)
throw new InvalidOperationException("No se recibieron ítems para autorizar.");
// Si no hay ítems aprobados, consideramos que es una anulación
var approvedDetails = items
.Where(i => i.Approved)
.Select(i =>
{
if (!i.ApprovedQuantity.HasValue || !i.ApprovedUnitPrice.HasValue)
throw new InvalidOperationException("Los ítems aprobados deben tener cantidad y precio válidos.");
return new EQuoteDetail
{
Id = i.Id,
Approved = i.Approved,
Approved = true,
Approvedquantity = i.ApprovedQuantity,
Approvedunitprice = i.ApprovedUnitPrice
};
}).ToList();
// Este llamado puede interpretar lista vacía como anulación completa
return await _quoteRepository.AuthorizeQuoteAsync(quoteId, approvedDetails);
}
#region Validaciones QuoteCreate
private void ValidateQuote(EQuoteHeader quote)
{

View File

@ -158,13 +158,13 @@ namespace phronCare.API.Controllers.Sales
public async Task<IActionResult> AuthorizeQuote([FromBody] QuoteAuthorizationRequest request)
{
if (request == null || request.Items == null)
return BadRequest("No se recibió información válida para autorizar o anular.");
return BadRequest("No se recibió información válida para autorizar.");
var result = await _quoteService.AuthorizeQuoteAsync(request.QuoteId, request.Items);
return result
? Ok(new { success = true, message = "Presupuesto procesado correctamente." })
: BadRequest(new { success = false, message = "No se pudo procesar el presupuesto." });
: BadRequest(new { success = false, message = "No se pudo autorizar el presupuesto." });
}
#endregion

View File

@ -176,21 +176,34 @@
{
var approvedItems = FormModel.Items
.Where(i => i.Approved)
.Select(i => new QuoteAuthorizationDto
.ToList();
// Validación: todos los ítems aprobados deben tener cantidad y precio válidos
var invalidItems = approvedItems
.Where(i => !i.ApprovedQuantity.HasValue || i.ApprovedQuantity <= 0
|| !i.ApprovedUnitPrice.HasValue || i.ApprovedUnitPrice <= 0)
.ToList();
if (invalidItems.Any())
{
toast.ShowError("Hay ítems aprobados sin cantidad o precio válido.");
return;
}
var payload = new QuoteAuthorizationRequest
{
QuoteId = QuoteId,
Items = approvedItems.Select(i => new QuoteAuthorizationDto
{
Id = i.Id,
Approved = true,
ApprovedQuantity = i.ApprovedQuantity,
ApprovedUnitPrice = i.ApprovedUnitPrice
})
.ToList();
var payload = new QuoteAuthorizationRequest
{
QuoteId = QuoteId,
Items = approvedItems
}).ToList()
};
try
{
var success = await quoteService.AuthorizeQuoteAsync(payload);
if (success)
{
@ -198,6 +211,7 @@
toast.ShowInfo("Presupuesto anulado correctamente.");
else
toast.ShowSuccess("Presupuesto autorizado con éxito.");
nav.NavigateTo("/quotes");
}
else
@ -205,6 +219,12 @@
toast.ShowError("No se pudo procesar el presupuesto.");
}
}
catch (Exception ex)
{
toast.ShowError($"Error inesperado: {ex.Message}");
}
}
private void Cancel() => nav.NavigateTo("/quotes");