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) 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, Id = i.Id,
Approved = i.Approved, Approved = true,
Approvedquantity = i.ApprovedQuantity, Approvedquantity = i.ApprovedQuantity,
Approvedunitprice = i.ApprovedUnitPrice Approvedunitprice = i.ApprovedUnitPrice
};
}).ToList(); }).ToList();
// Este llamado puede interpretar lista vacía como anulación completa
return await _quoteRepository.AuthorizeQuoteAsync(quoteId, approvedDetails); return await _quoteRepository.AuthorizeQuoteAsync(quoteId, approvedDetails);
} }
#region Validaciones QuoteCreate #region Validaciones QuoteCreate
private void ValidateQuote(EQuoteHeader quote) private void ValidateQuote(EQuoteHeader quote)
{ {

View File

@ -158,13 +158,13 @@ namespace phronCare.API.Controllers.Sales
public async Task<IActionResult> AuthorizeQuote([FromBody] QuoteAuthorizationRequest request) public async Task<IActionResult> AuthorizeQuote([FromBody] QuoteAuthorizationRequest request)
{ {
if (request == null || request.Items == null) 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); var result = await _quoteService.AuthorizeQuoteAsync(request.QuoteId, request.Items);
return result return result
? Ok(new { success = true, message = "Presupuesto procesado correctamente." }) ? 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 #endregion

View File

@ -176,21 +176,34 @@
{ {
var approvedItems = FormModel.Items var approvedItems = FormModel.Items
.Where(i => i.Approved) .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, Id = i.Id,
Approved = true, Approved = true,
ApprovedQuantity = i.ApprovedQuantity, ApprovedQuantity = i.ApprovedQuantity,
ApprovedUnitPrice = i.ApprovedUnitPrice ApprovedUnitPrice = i.ApprovedUnitPrice
}) }).ToList()
.ToList();
var payload = new QuoteAuthorizationRequest
{
QuoteId = QuoteId,
Items = approvedItems
}; };
try
{
var success = await quoteService.AuthorizeQuoteAsync(payload); var success = await quoteService.AuthorizeQuoteAsync(payload);
if (success) if (success)
{ {
@ -198,6 +211,7 @@
toast.ShowInfo("Presupuesto anulado correctamente."); toast.ShowInfo("Presupuesto anulado correctamente.");
else else
toast.ShowSuccess("Presupuesto autorizado con éxito."); toast.ShowSuccess("Presupuesto autorizado con éxito.");
nav.NavigateTo("/quotes"); nav.NavigateTo("/quotes");
} }
else else
@ -205,6 +219,12 @@
toast.ShowError("No se pudo procesar el presupuesto."); toast.ShowError("No se pudo procesar el presupuesto.");
} }
} }
catch (Exception ex)
{
toast.ShowError($"Error inesperado: {ex.Message}");
}
}
private void Cancel() => nav.NavigateTo("/quotes"); private void Cancel() => nav.NavigateTo("/quotes");