@page "/stock/productform" @page "/stock/productform/{ProductId:int}" @using Domain.Entities @using phronCare.UIBlazor.Services.Lookups @using phronCare.UIBlazor.Services.Stock @using phronCare.UIBlazor.Shared.Modals @using System.ComponentModel.DataAnnotations @using Blazored.Typeahead @inject NavigationManager Navigation @inject LSProductService productService @inject IStockLookUpService lookUpService @inject IToastService toastService @inject IModalService modalService

@(ProductId.HasValue ? "Editar producto" : "Nuevo producto")

@item.Nombre @item.Nombre
@item.Nombre @item.Nombre
@code { [Parameter] public int? ProductId { get; set; } private ELSProduct product = new(); private bool isSaving = false; private ELookUpItem? _selectedDivision; private ELookUpItem? _selectedUnit; private ELSProductDivision? selectedDivision; private ELSUnitOfMeasure? selectedUnit; private string returnUrl = "/stock/products"; protected override async Task OnInitializedAsync() { if (ProductId.HasValue) { product = await productService.GetByIdAsync(ProductId.Value) ?? new(); // Precargar División var divisionList = await lookUpService.GetProductDivisionsAsync(""); _selectedDivision = divisionList.FirstOrDefault(d => d.Id == product.DivisionId); // Precargar Unidad var unitList = await lookUpService.GetUnitsOfMeasureAsync(""); _selectedUnit = unitList.FirstOrDefault(u => u.Id == product.UnitId); } else { product = new(); } } private void OnDivisionSelected(ELookUpItem? selected) { _selectedDivision = selected; if (selected != null) product.DivisionId = selected.Id; } private void OnUnitSelected(ELookUpItem? selected) { _selectedUnit = selected; if (selected != null) product.UnitId = selected.Id; } private async Task HandleValidSubmit() { if (string.IsNullOrWhiteSpace(product.FactoryCode) || string.IsNullOrWhiteSpace(product.Name) || string.IsNullOrWhiteSpace(product.Descripcion) || product.ProductType <= 0 || product.TraceabilityType <= 0 || _selectedDivision is null || _selectedUnit is null) { toastService.ShowWarning("Por favor complete todos los campos obligatorios antes de guardar."); return; } var modal = modalService.Show("Confirmación", new ModalParameters { { "Message", "¿Desea guardar este producto?" } }); var result = await modal.Result; if (result.Cancelled) return; try { isSaving = true; product.DivisionId = _selectedDivision?.Id; product.UnitId = _selectedUnit?.Id ?? 0; HttpResponseMessage response; if (ProductId.HasValue) response = await productService.UpdateAsync(product); else response = await productService.CreateAsync(product); if (response.IsSuccessStatusCode) { toastService.ShowSuccess("Producto guardado correctamente."); Navigation.NavigateTo("/stock/products"); } else { var error = await response.Content.ReadAsStringAsync(); toastService.ShowError($"Error: {error}"); } } catch (Exception ex) { toastService.ShowError($"Error: {ex.Message}"); } finally { isSaving = false; } } private void Cancel() => Navigation.NavigateTo(returnUrl); }