public void PuedeCrearProducto(double cantidad, double costoUnitario, double porcentajeDeUtilidad,
                                       string esperado)
        {
            var obtenido = ProductoPuedeCrear.PuedeCrearProducto(cantidad, costoUnitario, porcentajeDeUtilidad);

            Assert.AreEqual(esperado, string.Join(", ", obtenido));
        }
        public override Response Crear(ProductoRequest request)
        {
            var errores = ProductoPuedeCrear.PuedeCrearProducto
                              (request.CantidadProducto,
                              request.CostoUnitarioProducto, request.PorcentajeDeUtilidadProducto);

            if (errores.Any())
            {
                return new Response {
                           Mensaje = String.Join(", ", errores)
                }
            }
            ;

            ProductoSubCategoria subCategoria = BuscarSubCategoriaConId(request.IdSubCategoria);

            if (subCategoria == null)
            {
                return(new Response
                {
                    Mensaje = "La subcategoria no fué encontrada"
                });
            }

            Producto producto = this._unitOfWork.ProductoRepository.
                                FindFirstOrDefault(t => t.Nombre == request.NombreProducto);

            if (producto != null)
            {
                return new Response {
                           Mensaje = "El producto ya existe"
                }
            }
            ;
            try
            {
                producto = new CrearProductoFactory(request.Tipo).
                           CrearProducto(request.Especificacion);
            }
            catch (InvalidOperationException e)
            {
                return(new Response {
                    Mensaje = e.Message
                });
            }
            var emboltorio = this._unitOfWork.ProductoRepository
                             .FindFirstOrDefault(x => x.Id == request.IdEmboltorio);

            producto.SetNombre(request.NombreProducto).SetCantidad(request.CantidadProducto).
            SetCostoUnitario(request.CostoUnitarioProducto).
            SetPorcentajeDeUtilidad(request.PorcentajeDeUtilidadProducto).
            SetUnidadDeMedida(request.UnidadDeMedidaProducto);
            producto.SetEnvoltorio(emboltorio);
            producto.SetSubCategoria(subCategoria);

            this._unitOfWork.ProductoRepository.Add(producto);
            this._unitOfWork.Commit();
            return(new Response
            {
                Mensaje = "Producto registrado con éxito",
                Data = new ProductoRequest().Map(producto)
            });
        }
    }
}