public async Task <IActionResult> Edit(Guid id, ProductoViewModel productoViewModel) { var validateToken = await ValidatedToken(_configuration, _getHelper, "catalogo"); if (validateToken != null) { return(validateToken); } if (!await ValidateModulePermissions(_getHelper, moduloId, eTipoPermiso.PermisoEscritura)) { return(RedirectToAction(nameof(Index))); } if (id != productoViewModel.ProductoID) { TempData["toast"] = "Identificacor incorrecto, verifique."; return(RedirectToAction(nameof(Index))); } TempData["toast"] = "Falta información en algún campo, verifique."; await ValidateFieldsAsync(productoViewModel); if (ModelState.IsValid) { var producto = await _converterHelper.ToProductoAsync(productoViewModel, false); try { producto.PrecioCosto = _context.Productos .Where(p => p.ProductoID == producto.ProductoID) .Select(p => p.PrecioCosto).FirstOrDefault(); _context.Update(producto); var paquete = producto.Paquete; bool paqueteExists = PaqueteExists(producto.ProductoID); if (paquete != null) { if (paqueteExists) { _context.Update(paquete); } else { _context.Add(paquete); } } else { paquete = await _getHelper.GetPaqueteByIdAsync(producto.ProductoID); if (paquete != null) { if (paqueteExists) { _context.Remove(paquete); } } if (!producto.Activo) { var packages = await _context.Paquetes .Where(p => p.PiezaProductoID == producto.ProductoID) .ToListAsync(); if (packages != null) { foreach (var pack in packages) { var productoPack = await _getHelper .GetProductByIdAsync(pack.ProductoID); if (productoPack != null) { if (productoPack.Activo) { productoPack.Activo = producto.Activo; _context.Update(productoPack); } } } } } } await _context.SaveChangesAsync(); TempData["toast"] = "Los datos del producto fueron actualizados correctamente."; await BitacoraAsync("Actualizar", producto); return(RedirectToAction(nameof(Details), new { id = producto.ProductoID })); } catch (DbUpdateConcurrencyException ex) { if (!ProductoExists(productoViewModel.ProductoID)) { TempData["toast"] = "Registro inexistente."; } else { TempData["toast"] = "[Error] Los datos del producto no fueron actualizados."; } string excepcion = ex.InnerException != null?ex.InnerException.Message.ToString() : ex.ToString(); await BitacoraAsync("Actualizar", producto, excepcion); } catch (Exception ex) { TempData["toast"] = "[Error] Los datos del producto no fueron actualizados."; string excepcion = ex.InnerException != null?ex.InnerException.Message.ToString() : ex.ToString(); await BitacoraAsync("Actualizar", producto, excepcion); } } productoViewModel.TasasImpuestosDDL = await _combosHelper.GetComboTasaImpuestosAsync(); productoViewModel.UnidadesDDL = await _combosHelper.GetComboUnidadesAsync(); return(View(productoViewModel)); }