diff --git a/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor b/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor index b17c84b..4b86afc 100644 --- a/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor +++ b/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor @@ -2,14 +2,19 @@ @using System.ComponentModel.DataAnnotations @using Blazored.Typeahead @using Domain.Constants +@using Domain.Dtos @using Domain.Dtos.Sales @using phronCare.UIBlazor.Services.Lookups @using phronCare.UIBlazor.Services.Sales.DeliveryNotes +@using phronCare.UIBlazor.Services.Sales.Quotes +@using phronCare.UIBlazor.Shared.Modals @inject NavigationManager Navigation @inject IDeliveryNoteService DeliveryNoteService @inject ISalesLookupService SalesLookupService +@inject IQuoteService QuoteService @inject IToastService toastService +@inject IModalService Modal @@ -90,7 +95,7 @@ @if (Items.Any()) {
- +
@@ -105,9 +110,9 @@ @foreach (var item in Items) { - + -
#
@item.LineNumber@item.LineNumber - + @@ -121,9 +126,9 @@ - + + @@ -203,11 +208,66 @@ return Task.CompletedTask; } - private Task OnQuoteSelected(ELookUpItem? quote) + private async Task OnQuoteSelected(ELookUpItem? quote) { SelectedQuote = quote; Model.QuoteId = quote?.Id; - return Task.CompletedTask; + + if (quote is null) + return; + + var quoteDto = await QuoteService.GetDtoByIdAsync(quote.Id); + if (quoteDto is null) + { + toastService.ShowError("No se pudo cargar el presupuesto seleccionado."); + return; + } + + var mappedItems = BuildItemsFromApprovedQuote(quoteDto); + if (mappedItems.Count == 0) + { + toastService.ShowWarning("El presupuesto seleccionado no tiene ítems aprobados para precargar."); + return; + } + + if (Items.Any()) + { + var parameters = new ModalParameters(); + parameters.Add(nameof(ConfirmModal.Title), "Reemplazar ítems"); + parameters.Add(nameof(ConfirmModal.Message), "Ya hay ítems cargados. ¿Desea reemplazarlos por los ítems aprobados del presupuesto?"); + + var modal = Modal.Show("Confirmación", parameters); + var result = await modal.Result; + if (result.Cancelled) + return; + } + + Items = mappedItems; + ReindexItems(); + StateHasChanged(); + } + + private List BuildItemsFromApprovedQuote(QuoteDto quote) + { + return quote.Items + .Where(item => item.Approved) + .Select(item => new + { + Item = item, + Quantity = item.ApprovedQuantity.HasValue && item.ApprovedQuantity.Value > 0 + ? item.ApprovedQuantity.Value + : item.Quantity + }) + .Where(x => x.Quantity > 0) + .Select((x, index) => new DeliveryNoteItemRow + { + LineNumber = index + 1, + OriginType = (byte)DeliveryNoteItemOriginType.QuoteDetail, + QuoteDetailId = x.Item.Id, + Description = x.Item.Description, + Quantity = x.Quantity + }) + .ToList(); } private string? ValidateBeforeSave() diff --git a/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor.css b/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor.css new file mode 100644 index 0000000..f27182d --- /dev/null +++ b/phronCare.UIBlazor/Pages/Sales/DeliveryNotes/DeliveryNoteCreate.razor.css @@ -0,0 +1,33 @@ +.deliverynote-items-table td { + vertical-align: top; + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.deliverynote-items-table .line-number-cell, +.deliverynote-items-table .actions-cell { + vertical-align: middle; +} + +.deliverynote-items-table .form-control, +.deliverynote-items-table .form-select { + min-height: 38px; +} + +.deliverynote-items-table .item-description, +.deliverynote-items-table .item-notes { + min-height: calc(1.5em * 3 + 1rem + 2px); + resize: vertical; +} + +.deliverynote-items-table textarea.form-control { + line-height: 1.35; +} + +.deliverynote-items-table .text-end { + min-width: 90px; +} + +.deliverynote-items-table .actions-cell .btn { + margin-top: 0.35rem; +}