/// <summary>
        /// Confirma una venta registrando sus ítems en el sistema.
        /// La venta debe poseer items.
        /// </summary>
        /// <param name="venta">La venta a registrar.</param>
        /// <exception cref="ReglasNegocioException">Si ocurre un error de negocio.</exception>
        public void ConfirmarVenta(Venta venta)
        {
            if (venta.Items.Count.Equals(0))
            {
                throw new ReglasNegocioException("La venta no contiene ningún ítem.");
            }

            BaseDatos db = new BaseDatos();

            try {
                db.Conectar();
                db.ComenzarTransaccion();

                string sql = "INSERT ItemsVenta (CodigoVenta, CodigoProducto, Cantidad) VALUES (@venta, @producto, @cantidad); SELECT @@IDENTITY";
                foreach (ItemVenta item in venta.Items)
                {
                    db.CrearComando(sql);
                    db.AsignarParametroEntero("@venta", venta.Codigo);
                    db.AsignarParametroEntero("@producto", item.Producto.Codigo);
                    db.AsignarParametroEntero("@cantidad", item.Cantidad);
                    item.Codigo = db.EjecutarEscalar();
                }
                db.ConfirmarTransaccion();
            } catch (BaseDatosException ex) {
                db.CancelarTransaccion();
                throw new ReglasNegocioException("Error al registrar la venta.", ex);
            } finally {
                db.Desconectar();
            }
        }
        /// <summary>
        /// Cancela una venta.
        /// </summary>
        /// <param name="venta">La venta a cancelar.</param>
        /// <exception cref="ReglasNegocioException">Si ocurre un error de negocio.</exception>
        public void CancelarVenta(Venta venta)
        {
            BaseDatos db = new BaseDatos();

            try {
                db.Conectar();
                db.ComenzarTransaccion();

                string sql = "DELETE ItemsVenta WHERE Codigo = @codigo";
                foreach (ItemVenta item in venta.Items)
                {
                    db.CrearComando(sql);
                    db.AsignarParametroEntero("@codigo", item.Codigo);
                    db.EjecutarComando();
                }

                sql = "DELETE Ventas WHERE Codigo = @codigo";
                db.CrearComando(sql);
                db.AsignarParametroEntero("@codigo", venta.Codigo);
                db.EjecutarComando();

                db.ConfirmarTransaccion();
            } catch (BaseDatosException ex) {
                db.CancelarTransaccion();
                throw new ReglasNegocioException("Error al cancelar la venta.", ex);
            } finally {
                db.Desconectar();
            }
        }
        /// <summary>
        /// Obtiene los ítems de una venta.
        /// </summary>
        /// <param name="venta">La venta cuyos ítems se van a obtener.</param>
        /// <returns>Los ítems de la venta.</returns>
        /// <exception cref="ReglasNegocioException">Si ocurre un error de negocio.</exception>
        private List <ItemVenta> ObtenerItemsVenta(Venta venta)
        {
            List <ItemVenta> items = new List <ItemVenta>();

            try {
                string    sql = "SELECT Codigo, Cantidad, CodigoProducto FROM ItemsVenta WHERE CodigoVenta=@venta";
                BaseDatos db  = new BaseDatos();
                db.Conectar();
                db.CrearComando(sql);
                db.AsignarParametroEntero("@venta", venta.Codigo);
                DbDataReader datosItems = db.EjecutarConsulta();

                ItemVenta         item         = null;
                CatalogoProductos catalogoProd = new CatalogoProductos();
                while (datosItems.Read())
                {
                    try {
                        Producto producto = catalogoProd.ObtenerProducto(datosItems.GetInt32(2));
                        item = new ItemVenta(datosItems.GetInt32(0), producto, datosItems.GetInt32(1));

                        venta.AgregarItem(item);
                    } catch (InvalidCastException ex) {
                        throw new ReglasNegocioException("Los tipos no coinciden.", ex);
                    } catch (DataException ex) {
                        throw new ReglasNegocioException("Error de ADO.NET.", ex);
                    }
                }
                datosItems.Close();
                db.Desconectar();
            } catch (BaseDatosException) {
                throw new ReglasNegocioException("Error al acceder a la base de datos para obtener los ítems de venta.");
            } catch (ReglasNegocioException ex) {
                throw new ReglasNegocioException("Error a obtener los ítems de venta. " + ex.Message);
            }
            return(items);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Obtiene un producto en base a su código.
        /// </summary>
        /// <param name="codigo">El código del producto.</param>
        /// <returns>El producto encontrado.</returns>
        /// <exception cref="ReglasNegocioException">Si ocurre un error de negocio.</exception>
        public Producto ObtenerProducto(int codigo)
        {
            Producto producto = null;

            try {
                if (codigo <= 0)
                {
                    throw new ReglasNegocioException("El código es inválido.");
                }

                string    sql = "SELECT Codigo, Descripcion, Precio FROM Productos WHERE Codigo=@codigo";
                BaseDatos db  = new BaseDatos();
                db.Conectar();
                db.CrearComando(sql);
                db.AsignarParametroEntero("@codigo", codigo);
                DbDataReader datos = db.EjecutarConsulta();

                while (datos.Read())
                {
                    try {
                        producto = new Producto(datos.GetInt32(0), datos.GetString(1), datos.GetDouble(2));
                    } catch (InvalidCastException ex) {
                        throw new ReglasNegocioException("Los tipos no coinciden.", ex);
                    } catch (DataException ex) {
                        throw new ReglasNegocioException("Error de ADO.NET.", ex);
                    }
                }
                datos.Close();
                db.Desconectar();
            } catch (BaseDatosException) {
                throw new ReglasNegocioException("Error al acceder a la base de datos para obtener los productos.");
            } catch (ReglasNegocioException ex) {
                throw new ReglasNegocioException("Error a obtener los productos. " + ex.Message);
            }
            return(producto);
        }