public DataTable ObtenerAlmRegDocumentoPorTipoDoc(String TIPO_DOC)
        {
            DataSet _dataSet = new DataSet();
            DataView _dataView = new DataView();
            DataTable _dataTable = new DataTable();
            String sql = null;
            Boolean ejecutar = true;

            sql = "usp_alm_documentos_obtener_por_tipo_doc ";

            #region validaciones
            if (String.IsNullOrEmpty(TIPO_DOC) == false)
            {
                sql += "'" + TIPO_DOC + "'";
            }
            else
            {
                MensajeError += "El campo TIPO_DOC no puede ser nulo\n";
                ejecutar = false;
            }
            #endregion

            if (ejecutar)
            {
                Conexion conexion = new Conexion(Empresa);
                try
                {
                    _dataSet = conexion.ExecuteReader(sql);
                    _dataView = _dataSet.Tables[0].DefaultView;
                    _dataTable = _dataView.Table;
                }
                catch (Exception e)
                {
                    MensajeError = e.Message;
                }
                finally
                {
                    conexion.Desconectar();
                }
            }

            _dataTable.Columns.Add("NOMBRE_PROVEEDOR");

            ordenCompra _ordenCompra = new ordenCompra(Empresa, Usuario);
            proveedor _proveedor = new proveedor(Empresa, Usuario);
            Decimal ID_ORDEN = 0;
            Decimal ID_PROVEEDOR = 0;
            String[] ordenesCompraPorDocumento;
            DataTable tablaInfoOrden;
            DataRow filaInfoOrdenCompra;
            DataTable tablaInfoProveedor;
            DataRow filaInfoProveedor;

            foreach (DataRow fila in _dataTable.Rows)
            {
                try
                {
                    ordenesCompraPorDocumento = fila["ORIGEN"].ToString().Split(',');
                    ID_ORDEN = Convert.ToDecimal(ordenesCompraPorDocumento[0]);
                    tablaInfoOrden = _ordenCompra.ObtenerOrdenCompraPorId(ID_ORDEN);
                    filaInfoOrdenCompra = tablaInfoOrden.Rows[0];
                    ID_PROVEEDOR = Convert.ToDecimal(filaInfoOrdenCompra["ID_PROVEEDOR"]);
                    tablaInfoProveedor = _proveedor.ObtenerAlmRegProveedorPorRegistro(ID_PROVEEDOR);
                    filaInfoProveedor = tablaInfoProveedor.Rows[0];
                    fila["NOMBRE_PROVEEDOR"] = filaInfoProveedor["RAZON_SOCIAL"];
                }
                catch (Exception ex)
                {
                    fila["NOMBRE_PROVEEDOR"] = ex.Message;
                }
            }

            return _dataTable;
        }
        public Decimal AdicionarDatosFactura(Int32 ID_EMPLEADO,
            Int32 DOCUMENTO_ORIGEN,
            String TIPO_DOC,
            String ORIGEN,
            String NUMERO_DOCUMENTO,
            DateTime FECHA_DOCUMENTO,
            DateTime FECHA_VENCE,
            Int32 ID_BODEGA_DESTINO,
            Decimal VALOR,
            String ESTADO,
            String OBSERVACION_JUSTIFICACION,
            Int32 ID_PROVEEDOR,
            List<documento> listaDetalleFactura)
        {
            Decimal ID_DOCUMENTO = 0;
            Decimal ID_LOTE = 0;
            Decimal ID_INVENTARIO = 0;
            Decimal ID_DESCARGUE = 0;

            Boolean verificador = true;

            List<Decimal> listaDeOrdenesParaDescargadas = new List<Decimal>();

            Conexion conexion = new Conexion(Empresa);
            conexion.IniciarTransaccion();

            try
            {
                ID_DOCUMENTO = AdicionarAlmDocumentosParaFactura(ID_EMPLEADO, DOCUMENTO_ORIGEN, TIPO_DOC, ORIGEN, NUMERO_DOCUMENTO, FECHA_DOCUMENTO, FECHA_VENCE, ID_BODEGA_DESTINO, VALOR, ESTADO, OBSERVACION_JUSTIFICACION, conexion, ID_PROVEEDOR);

                if (ID_DOCUMENTO == 0)
                {
                    conexion.DeshacerTransaccion();
                    MensajeError = MensajeError;
                    verificador = false;
                }
                else
                {
                    lote _lote = new lote(Empresa, Usuario);
                    Inventario _inventario = new Inventario(Empresa, Usuario);
                    crtDescargueFactura _crtDescargueFactura = new crtDescargueFactura(Empresa, Usuario);
                    foreach (documento detalleFactura in listaDetalleFactura)
                    {
                        ID_LOTE = _lote.AdicionarAlmLote(Convert.ToInt32(ID_DOCUMENTO), Convert.ToInt32(detalleFactura.ID_PRODUCTO), Convert.ToInt32(detalleFactura.ID_BODEGA), FECHA_DOCUMENTO, detalleFactura.CANTIDAD, 0, detalleFactura.VALOR_UNIDAD, detalleFactura.TALLA, "S", conexion, detalleFactura.REEMBOLSO);

                        if (ID_LOTE == 0)
                        {
                            conexion.DeshacerTransaccion();
                            MensajeError = "ERROR: Ingresando el lote: " + _lote.MensajeError;
                            verificador = false;
                            break;
                        }
                        else
                        {
                            ID_INVENTARIO = _inventario.AdicionarAlmInventario(Convert.ToInt32(ID_DOCUMENTO), Convert.ToInt32(detalleFactura.ID_PRODUCTO), Convert.ToInt32(detalleFactura.ID_BODEGA), detalleFactura.CANTIDAD, detalleFactura.VALOR_UNIDAD, FECHA_DOCUMENTO, "ENTRADA", conexion, Convert.ToInt32(ID_LOTE), detalleFactura.TALLA, 0, 0, null, detalleFactura.REEMBOLSO);

                            if (ID_INVENTARIO == 0)
                            {
                                conexion.DeshacerTransaccion();
                                MensajeError = "ERROR: Ingresando el inventario: " + _inventario.MensajeError;
                                verificador = false;
                                break;
                            }
                            else
                            {
                                ID_DESCARGUE = _crtDescargueFactura.AdicionarAlmCrtDescargueInventario(ID_DOCUMENTO, detalleFactura.ID_ORDEN, detalleFactura.ID_PRODUCTO, detalleFactura.ID_DETALLE, detalleFactura.ID_BODEGA, ID_LOTE, detalleFactura.REFERENCIA_PRODUCTO, detalleFactura.TALLA, detalleFactura.CANTIDAD, conexion, detalleFactura.REEMBOLSO);

                                if (ID_DESCARGUE == 0)
                                {
                                    conexion.DeshacerTransaccion();
                                    MensajeError = "ERROR: Ingresando el descargue de inventario: " + _crtDescargueFactura.MensajeError;
                                    verificador = false;
                                    break;
                                }
                            }
                        }

                        if (listaDeOrdenesParaDescargadas.Contains(detalleFactura.ID_ORDEN) == false)
                        {
                            listaDeOrdenesParaDescargadas.Add(detalleFactura.ID_ORDEN);
                        }
                    }
                }

                if (verificador == true)
                {
                    ordenCompra _ordenCompra = new ordenCompra(Empresa, Usuario);
                    DataTable tablaDetalleOrden;
                    Int32 CANTIDAD_TOTAL_PRODUCTOS = 0;
                    Int32 CANTIDAD_TOTAL_DESCARGADA = 0;

                    foreach (Decimal orden in listaDeOrdenesParaDescargadas)
                    {
                        CANTIDAD_TOTAL_PRODUCTOS = 0;
                        CANTIDAD_TOTAL_DESCARGADA = 0;
                        tablaDetalleOrden = _ordenCompra.ObtenerDetallesOrdenCompraPorIdOrdenConCantidadDescargada(orden, conexion);

                        foreach (DataRow filaTabla in tablaDetalleOrden.Rows)
                        {
                            try
                            {
                                CANTIDAD_TOTAL_PRODUCTOS += Convert.ToInt32(filaTabla["CANTIDAD"]);
                                CANTIDAD_TOTAL_DESCARGADA += Convert.ToInt32(filaTabla["CANTIDAD_DESCARGADA"]);
                            }
                            catch (Exception ex)
                            {
                                MensajeError = "ERROR: Al intentar calcular estado de descarga de la orden de compra " + orden.ToString() + ". " + ex.Message;
                                conexion.DeshacerTransaccion();
                                verificador = false;
                                break;
                            }
                        }

                        if (verificador == true)
                        {
                            if ((CANTIDAD_TOTAL_PRODUCTOS - CANTIDAD_TOTAL_DESCARGADA) <= 0)
                            {
                                if (_ordenCompra.ActualizarestadoOrdenCompra(orden, tabla.VAR_ESTADO_ORDEN_COMPRA_FINALIZADA, null) == false)
                                {
                                    MensajeError = _ordenCompra.MensajeError;
                                    conexion.DeshacerTransaccion();
                                    verificador = false;
                                    break;
                                }
                            }
                            else
                            {
                                if (_ordenCompra.ActualizarestadoOrdenCompra(orden, tabla.VAR_ESTADO_ORDEN_COMPRA_ADJUNTADO_FACTURA, null) == false)
                                {
                                    MensajeError = _ordenCompra.MensajeError;
                                    conexion.DeshacerTransaccion();
                                    verificador = false;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (verificador == true)
                    {
                        conexion.AceptarTransaccion();
                    }
                }
            }
            catch (Exception ex)
            {
                conexion.DeshacerTransaccion();
                MensajeError = ex.Message;
                verificador = false;
            }
            finally
            {
                conexion.Desconectar();
            }

            if (verificador == true)
            {
                return ID_DOCUMENTO;
            }
            else
            {
                return 0;
            }
        }