@page "/deliverynotes/create" @using System.ComponentModel.DataAnnotations @using Blazored.Typeahead @using Domain.Constants @using Domain.Dtos.Sales @using phronCare.UIBlazor.Services.Lookups @using phronCare.UIBlazor.Services.Sales.DeliveryNotes @inject NavigationManager Navigation @inject IDeliveryNoteService DeliveryNoteService @inject ISalesLookupService SalesLookupService @inject IToastService toastService

Emisión de Remito

@item.Nombre @item.Nombre
@item.Nombre @item.Nombre
@if (SelectedQuote is not null) {
Presupuesto vinculado: @SelectedQuote.Nombre
}
Ítems del remito
@if (Items.Any()) {
@foreach (var item in Items) { }
# Descripción Cantidad Origen Notas
@item.LineNumber
} else {
No hay ítems cargados.
}
@code { private DeliveryNoteCreatePageModel Model = new() { IssueDate = DateTime.Today }; private ELookUpItem? SelectedCustomer; private ELookUpItem? SelectedQuote; private List Items = new(); private bool IsSaving; private void AddItem() { Items.Add(new DeliveryNoteItemRow { LineNumber = Items.Count + 1, OriginType = (byte)DeliveryNoteItemOriginType.Manual, Quantity = 1 }); } private void RemoveItem(DeliveryNoteItemRow item) { if (Items.Remove(item)) { ReindexItems(); } } private void ReindexItems() { for (var i = 0; i < Items.Count; i++) { Items[i].LineNumber = i + 1; } } private Task OnCustomerSelected(ELookUpItem? customer) { SelectedCustomer = customer; Model.CustomerId = customer?.Id; return Task.CompletedTask; } private Task OnQuoteSelected(ELookUpItem? quote) { SelectedQuote = quote; Model.QuoteId = quote?.Id; return Task.CompletedTask; } private string? ValidateBeforeSave() { if (Items.Count == 0) return "Debe incluir al menos un ítem."; if (Items.Any(x => string.IsNullOrWhiteSpace(x.Description))) return "Todos los ítems deben tener descripción."; if (Items.Any(x => x.Quantity <= 0)) return "Todos los ítems deben tener cantidad mayor a cero."; return null; } private async Task HandleValidSubmit() { var validationError = ValidateBeforeSave(); if (!string.IsNullOrWhiteSpace(validationError)) { toastService.ShowError(validationError); return; } try { IsSaving = true; var request = new DeliveryNoteCreateRequest { DeliveryNoteNumber = Model.DeliveryNoteNumber.Trim(), IssueDate = Model.IssueDate!.Value, CustomerId = Model.CustomerId!.Value, QuoteId = Model.QuoteId, Observations = Model.Observations, ExtraInfoJson = Model.ExtraInfoJson, Items = Items.Select(x => new DeliveryNoteCreateItemRequest { OriginType = x.OriginType, OriginId = x.OriginId, QuoteDetailId = x.QuoteDetailId, Description = x.Description.Trim(), Quantity = x.Quantity, Notes = string.IsNullOrWhiteSpace(x.Notes) ? null : x.Notes.Trim() }).ToList() }; var response = await DeliveryNoteService.CreateAndIssueAsync(request); toastService.ShowSuccess($"Remito {response.DeliveryNoteNumber} emitido correctamente."); Navigation.NavigateTo("/deliverynotes"); } catch (Exception ex) { toastService.ShowError(ex.Message); } finally { IsSaving = false; } } private void BackToList() { Navigation.NavigateTo("/deliverynotes"); } private sealed class DeliveryNoteCreatePageModel { [Required(ErrorMessage = "El número de remito es obligatorio.")] public string DeliveryNoteNumber { get; set; } = string.Empty; [Required(ErrorMessage = "La fecha de emisión es obligatoria.")] public DateTime? IssueDate { get; set; } [Required(ErrorMessage = "El cliente es obligatorio.")] public int? CustomerId { get; set; } public int? QuoteId { get; set; } public string? Observations { get; set; } public string? ExtraInfoJson { get; set; } } private sealed class DeliveryNoteItemRow { public int LineNumber { get; set; } public byte OriginType { get; set; } public int? OriginId { get; set; } public int? QuoteDetailId { get; set; } public string Description { get; set; } = string.Empty; public decimal Quantity { get; set; } public string? Notes { get; set; } } }