private async Task <ProductoEspecificacionViewModel> ObtenerProductoEspecificacion(int id, ProductoEspecificacionViewModel productoEspecificacionView = null)
        {
            if (productoEspecificacionView == null)
            {
                var producto = new ProductoEspecificacionViewModel
                {
                    ProductoId = 0,
                    Producto   = await db.Producto.Where(x => x.ProductoId == id).Select(x => new Producto
                    {
                        DescripcionProducto = x.DescripcionProducto,
                        ObservacionProducto = x.ObservacionProducto,
                        CodigoProducto      = x.CodigoProducto,
                        Nominal             = x.Nominal,
                        Grado         = x.Grado,
                        ClaseProducto = new ClaseProducto {
                            ClaseDescripcion = x.ClaseProducto.ClaseDescripcion
                        },
                    }).FirstOrDefaultAsync(),
                    ProductoEspecificacion = await ListaProdctoEspecificacion(id)
                };
                return(producto);
            }

            var productoEspecificacionResult = new ProductoEspecificacionViewModel
            {
                ProductoId             = productoEspecificacionView.ProductoId,
                EspecificacionId       = productoEspecificacionView.EspecificacionId,
                RangoMaximo            = productoEspecificacionView.RangoMaximo,
                RangoMinimo            = productoEspecificacionView.RangoMinimo,
                ValorEsperado          = productoEspecificacionView.ValorEsperado,
                ProductoEspecificacion = await ListaProdctoEspecificacion(id),
                Producto = await db.Producto.Where(x => x.ProductoId == id).Select(x => new Producto
                {
                    DescripcionProducto = x.DescripcionProducto,
                    ObservacionProducto = x.ObservacionProducto,
                    Nominal             = x.Nominal,
                    Grado          = x.Grado,
                    CodigoProducto = x.CodigoProducto,
                    ClaseProducto  = new ClaseProducto {
                        ClaseDescripcion = x.ClaseProducto.ClaseDescripcion
                    },
                }).FirstOrDefaultAsync(),
            };

            return(productoEspecificacionResult);
        }
        public async Task <IActionResult> Especificaciones(ProductoEspecificacionViewModel productoEspecificacion)
        {
            try
            {
                await cargarListaEspecificacionesViewData();


                var existeRegistro = false;

                if (!await db.ProductoEspecificacion.AnyAsync(c => c.EspecificacionId == productoEspecificacion.EspecificacionId && c.ProductoId == productoEspecificacion.ProductoId))
                {
                    var especificacion = await db.Especificacion.Where(x => x.EspecificacionId == productoEspecificacion.EspecificacionId).FirstOrDefaultAsync();

                    var p = new ProductoEspecificacion
                    {
                        ProductoId       = productoEspecificacion.ProductoId,
                        EspecificacionId = productoEspecificacion.EspecificacionId,
                    };

                    switch (especificacion.TipoEspecificacion)
                    {
                    case "Rango":
                        if (productoEspecificacion.RangoMinimo == null && productoEspecificacion.RangoMaximo == null)
                        {
                            TempData["Mensaje"] = $"{Mensaje.Error}|{Mensaje.DebeIntroducirAlMenosUnRango}";
                            return(View(await ObtenerProductoEspecificacion(productoEspecificacion.ProductoId, productoEspecificacion)));
                        }
                        if (productoEspecificacion.RangoMinimo > productoEspecificacion.RangoMaximo)
                        {
                            TempData["Mensaje"] = $"{Mensaje.Error}|{Mensaje.RangoMinimoMayorRangoMaximo}";
                            return(View(await ObtenerProductoEspecificacion(productoEspecificacion.ProductoId, productoEspecificacion)));
                        }
                        p.RangoMaximo = productoEspecificacion.RangoMaximo;
                        p.RangoMinimo = productoEspecificacion.RangoMinimo;
                        break;

                    case "Texto":
                        p.ValorEsperado = productoEspecificacion.ValorEsperado;
                        break;

                    case "NĂºmero":
                        p.ValorEsperadoNum = productoEspecificacion.ValorEsperadoNum;
                        break;

                    case "Bit":
                        p.ValorEsperado = "CUMPLE";
                        break;
                    }
                    await db.AddAsync(p);
                }
                else
                {
                    existeRegistro = true;
                }

                if (!existeRegistro)
                {
                    await db.SaveChangesAsync();

                    TempData["Mensaje"] = $"{Mensaje.MensajeSatisfactorio}|{Mensaje.Satisfactorio}";
                    return(View(await ObtenerProductoEspecificacion(productoEspecificacion.ProductoId, null)));
                }
                else
                {
                    TempData["Mensaje"] = $"{Mensaje.Error}|{Mensaje.ExisteRegistro}";
                }

                return(View(await ObtenerProductoEspecificacion(productoEspecificacion.ProductoId, productoEspecificacion)));
            }
            catch (Exception)
            {
                return(this.Redireccionar($"{Mensaje.Error}|{Mensaje.Excepcion}"));
            }
        }