From 134e702273058539a4c7e3cb394988e300e0d84d Mon Sep 17 00:00:00 2001 From: Leandro Hernan Rojas Date: Thu, 29 May 2025 21:16:55 -0300 Subject: [PATCH] Update Patch UI Authorize --- Core/Services/QuoteService.cs | 28 ++++++++--- .../Controllers/Sales/QuoteController.cs | 4 +- .../Pages/Sales/Quotes/QuoteAuthorize.razor | 50 +++++++++++++------ 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/Core/Services/QuoteService.cs b/Core/Services/QuoteService.cs index 48fe83d..76fbb4d 100644 --- a/Core/Services/QuoteService.cs +++ b/Core/Services/QuoteService.cs @@ -50,17 +50,31 @@ namespace Core.Services public async Task AuthorizeQuoteAsync(int quoteId, List items) { - var approvedDetails = items.Select(i => new EQuoteDetail - { - Id = i.Id, - Approved = i.Approved, - Approvedquantity = i.ApprovedQuantity, - Approvedunitprice = i.ApprovedUnitPrice - }).ToList(); + 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 = 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) { diff --git a/phronCare.API/Controllers/Sales/QuoteController.cs b/phronCare.API/Controllers/Sales/QuoteController.cs index 684b40a..07fbdc7 100644 --- a/phronCare.API/Controllers/Sales/QuoteController.cs +++ b/phronCare.API/Controllers/Sales/QuoteController.cs @@ -158,13 +158,13 @@ namespace phronCare.API.Controllers.Sales public async Task 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 diff --git a/phronCare.UIBlazor/Pages/Sales/Quotes/QuoteAuthorize.razor b/phronCare.UIBlazor/Pages/Sales/Quotes/QuoteAuthorize.razor index a2df624..67a367a 100644 --- a/phronCare.UIBlazor/Pages/Sales/Quotes/QuoteAuthorize.razor +++ b/phronCare.UIBlazor/Pages/Sales/Quotes/QuoteAuthorize.razor @@ -172,25 +172,38 @@ } } - private async Task AuthorizeQuote() +private async Task AuthorizeQuote() +{ + var approvedItems = FormModel.Items + .Where(i => i.Approved) + .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()) { - var approvedItems = FormModel.Items - .Where(i => i.Approved) - .Select(i => new QuoteAuthorizationDto - { - Id = i.Id, - Approved = true, - ApprovedQuantity = i.ApprovedQuantity, - ApprovedUnitPrice = i.ApprovedUnitPrice - }) - .ToList(); + toast.ShowError("Hay ítems aprobados sin cantidad o precio válido."); + return; + } - var payload = new QuoteAuthorizationRequest + var payload = new QuoteAuthorizationRequest + { + QuoteId = QuoteId, + Items = approvedItems.Select(i => new QuoteAuthorizationDto { - QuoteId = QuoteId, - Items = approvedItems - }; + Id = i.Id, + Approved = true, + ApprovedQuantity = i.ApprovedQuantity, + ApprovedUnitPrice = i.ApprovedUnitPrice + }).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");