//Procedimiento almacenado utilizado para insertar y modificar las actualizaciones de costo de productos
 public int funMantenimiento(clsCosActCstProductos csRegistro, int varOperacion)
 {
     try
     {
         csAccesoDatos.funIniciarSesion("conDBUmbrella");
         int varCodigo = (int)csAccesoDatos.GDatos.funTraerValorEscalar("proGra_ActCstProductosMantenimiento", csRegistro.CabCodigo, csRegistro.DocCodigo, csRegistro.CabNumero, csRegistro.CabFecha,
                                                                        csRegistro.BodCodigo, csRegistro.CabDescripcion, csRegistro.CabComentario, csRegistro.CabComenDiario,
                                                                        csRegistro.EstCodigo, varOperacion, clsVariablesGlobales.varCodUsuario, csRegistro.DetActCstFormulacion,
                                                                        csRegistro.DetActCstMaterial);
         csAccesoDatos.proFinalizarSesion();
         return(varCodigo);
     }
     catch (Exception) { throw; }
 }
        //Funcion utilizada para asignar los valores recuperados de la consulta a las propiedades de las clases
        private static clsCosActCstProductos funRegistro(DataRow drRegistro, clsCosActCstProductos objRegistro)
        {
            objRegistro.CabCodigo = drRegistro["CabCodigo"] == System.DBNull.Value ? 0 : int.Parse(drRegistro["CabCodigo"].ToString());
            objRegistro.DocCodigo = drRegistro["DocCodigo"] == System.DBNull.Value ? 0 : int.Parse(drRegistro["DocCodigo"].ToString());
            objRegistro.DocNombre = drRegistro["DocNombre"] == System.DBNull.Value ? "" : drRegistro["DocNombre"].ToString();
            objRegistro.CabNumero = drRegistro["CabNumero"] == System.DBNull.Value ? 0 : int.Parse(drRegistro["CabNumero"].ToString());

            objRegistro.CabFecha = (DateTime)drRegistro["CabFecha"];

            objRegistro.BodCodigo      = drRegistro["BodCodigo"] == System.DBNull.Value ? "" : drRegistro["BodCodigo"].ToString();
            objRegistro.BodNombre      = drRegistro["BodNombre"] == System.DBNull.Value ? "" : drRegistro["BodNombre"].ToString();
            objRegistro.CabDescripcion = drRegistro["CabDescripcion"] == System.DBNull.Value ? "" : drRegistro["CabDescripcion"].ToString();
            objRegistro.CabComentario  = drRegistro["CabComentario"] == System.DBNull.Value ? "" : drRegistro["CabComentario"].ToString();
            objRegistro.CabComenDiario = drRegistro["CabComenDiario"] == System.DBNull.Value ? "" : drRegistro["CabComenDiario"].ToString();
            objRegistro.EstCodigo      = drRegistro["EstCodigo"] == System.DBNull.Value ? "" : drRegistro["EstCodigo"].ToString();

            objRegistro.UsuCrea          = drRegistro["UsuCrea"] == null ? "" : drRegistro["UsuCrea"].ToString();
            objRegistro.UsuFechaCrea     = drRegistro["UsuFechaCrea"] == DBNull.Value ? DateTime.Now : (DateTime)drRegistro["UsuFechaCrea"];
            objRegistro.UsuCrea          = drRegistro["UsuModifica"] == null ? "" : drRegistro["UsuModifica"].ToString();
            objRegistro.UsuFechaModifica = drRegistro["UsuFechaModifica"] == DBNull.Value ? DateTime.Now : (DateTime)drRegistro["UsuFechaModifica"];

            return(objRegistro);
        }
        //Funcion utilizada para enviar el documentos al sistema SAP
        public static string funEnviarDocumentoSAP(clsCosActCstProductos objRegistro, int varCabNumero)
        {
            try
            {
                string mError = "";

                csAccesoDatos.proIniciarSesionSAP();
                //Declaramos la variables para obtener la informacion que vamos a utilizar
                int    varCabCodigo      = objRegistro.CabCodigo;      //Codigo key del documento
                int    varDocCodigo      = objRegistro.DocCodigo;      //Codigo del documento
                string varDocNombre      = objRegistro.DocNombre;      //Descripcion del documento
                string varCabComentario  = objRegistro.CabComentario;  //Comentario para el documento
                string varCabComenDiario = objRegistro.CabComenDiario; //Comentario para el diario contable
                string varBodCodigo      = objRegistro.BodCodigo;      //Bodega donde se va ingresar el inventario

                DateTime varCabFecha = objRegistro.CabFecha;           //Fecha del documento

                //Recorremos el datatable de los items a producir
                foreach (DataRow drItemProducir in objRegistro.DetActCstFormulacion.Rows)
                {
                    int varDetSecuencia = int.Parse(drItemProducir["DetSecuencia"].ToString()); //Linea de detalle del documento
                    //Recuperamos la informacion con respecto a la salida de mercancia enviada a SAP
                    DataTable dtSalMercanciaSAP = funVerificarSalMercanciaSAP(varDocNombre, varCabNumero, varDetSecuencia);
                    //Verificamos si existe una salida en el sistema SAP del documento enviado
                    if (dtSalMercanciaSAP.Rows.Count.Equals(0))
                    {
                        mError = funEnviarSalidaSAP(mError, varCabCodigo, varCabNumero, varDocCodigo, varDetSecuencia, varDocNombre, varCabFecha, varCabComentario, varCabComenDiario, objRegistro.DetActCstMaterial, drItemProducir);
                    }
                    else
                    {
                        //Verificamos si ya esta actualizado el campo de SAP salida
                        if (int.Parse(drItemProducir["DetNumeroSAPSalida"].ToString()).Equals(0))
                        {
                            //Actualizamos la linea del detalle con la informacion de SAP de la salida de mercancias en la tabla de detalle de actualizacion de costos de formulacion
                            int varDocEntrySAPSalida = int.Parse(dtSalMercanciaSAP.Rows[0]["DocEntry"].ToString());
                            int varDocNumSAPSalida   = int.Parse(dtSalMercanciaSAP.Rows[0]["DocNum"].ToString());
                            proActSAPDetActCstFormulacion(varDocEntrySAPSalida, varDocNumSAPSalida, varCabCodigo, varDetSecuencia, 1, 0);

                            drItemProducir["DetNumeroSAPSalida"] = varDocNumSAPSalida;
                            drItemProducir.AcceptChanges();
                            mError = "";
                        }
                    }
                    //Verificamos que en el proceso de salida de mercancia no haya habido ningun error
                    if (mError.Equals(""))
                    {
                        //Recuperamos la informacion con respecto a la entrada de mercancia enviada a SAP
                        DataTable dtEntMercanciaSAP = funVerificarEntMercanciaSAP(varDocNombre, varCabNumero, varDetSecuencia);
                        //Verificamos si existe una entrada en el sistema SAP del documento enviado
                        if (dtEntMercanciaSAP.Rows.Count.Equals(0))
                        {
                            mError = funEnviarEntradaSAP(mError, varCabCodigo, varCabNumero, varDocCodigo, varDetSecuencia, varDocNombre, varCabFecha, varCabComentario, varCabComenDiario, varBodCodigo, drItemProducir);
                        }
                        else
                        {
                            if (int.Parse(drItemProducir["DetNumeroSAPEntrada"].ToString()).Equals(0))
                            {
                                //Actualizamos la linea del detalle con la informacion de SAP de la entrada de mercancias en la tabla de detalle de actualizacion de costos de formulacion
                                int varDocEntrySAPEntrada = int.Parse(dtEntMercanciaSAP.Rows[0]["DocEntry"].ToString());
                                int varDocNumSAPEntrada   = int.Parse(dtEntMercanciaSAP.Rows[0]["DocNum"].ToString());
                                proActSAPDetActCstFormulacion(varDocEntrySAPEntrada, varDocNumSAPEntrada, varCabCodigo, varDetSecuencia, 2, 0);

                                drItemProducir["DetNumeroSAPEntrada"] = varDocNumSAPEntrada;
                                drItemProducir.AcceptChanges();
                                mError = "";
                            }
                        }
                    }
                    //Verificamos que en el proceso de entrada de mercancia no haya habido ningun error
                    if (mError.Equals(""))
                    {
                        //Recuperamos informacion con respecto a los totales para encontrar diferencias tanto en entrada como salida de mercancias
                        double varValorSalida  = funRecTotSalMercanciaSAP(varDocNombre, varCabNumero, varDetSecuencia);
                        double varValorEntrada = funRecTotEntMercanciaSAP(varDocNombre, varCabNumero, varDetSecuencia);
                        double varValor        = Math.Round(Math.Abs(varValorEntrada - varValorSalida), 2);

                        //Verificamos si existe diferencias entre los valores totales de entrada y salida de mercancia
                        if (varValorSalida != varValorEntrada)
                        {
                            //Recuperamos la informacion con respecto a la entrada de mercancia enviada a SAP
                            DataTable dtDiarioSAP = funVerificarDiarioSAP(varDocNombre, varCabNumero, varDetSecuencia);
                            //Verificamos si existe un diario en el sistema SAP del documento enviado
                            if (dtDiarioSAP.Rows.Count.Equals(0))
                            {
                                if (varValorSalida < varValorEntrada)
                                {
                                    mError = funEnviarDiarioSAP(mError, varCabCodigo, varCabNumero, varDocCodigo, varDetSecuencia, varDocNombre, varCabFecha, varCabComenDiario, "Debe", varValor, drItemProducir);
                                }
                                else
                                {
                                    mError = funEnviarDiarioSAP(mError, varCabCodigo, varCabNumero, varDocCodigo, varDetSecuencia, varDocNombre, varCabFecha, varCabComenDiario, "Haber", varValor, drItemProducir);
                                }
                            }
                            else
                            {
                                if (int.Parse(drItemProducir["DetNumeroSAPDiario"].ToString()).Equals(0))
                                {
                                    //Actualizamos la linea del detalle con la informacion de SAP de la salida de mercancias en la tabla de detalle de actualizacion de costos de formulacion
                                    int varDocEntrySAPDiario = int.Parse(dtDiarioSAP.Rows[0]["TransId"].ToString());
                                    int varDocNumSAPDiario   = int.Parse(dtDiarioSAP.Rows[0]["Number"].ToString());
                                    proActSAPDetActCstFormulacion(varDocEntrySAPDiario, varDocNumSAPDiario, varCabCodigo, varDetSecuencia, 3, 0);

                                    drItemProducir["DetNumeroSAPDiario"] = varDocNumSAPDiario;
                                    drItemProducir.AcceptChanges();
                                    mError = "";
                                }
                            }
                        }
                        else
                        {
                            //Actualizamos la linea del detalle con la informacion de SAP de la salida de mercancias en la tabla de detalle de actualizacion de costos de formulacion
                            proActSAPDetActCstFormulacion(-1, -1, varCabCodigo, varDetSecuencia, 3, 0);

                            drItemProducir["DetNumeroSAPDiario"] = -1;
                            drItemProducir.AcceptChanges();
                            mError = "";
                        }
                    }
                }

                //Validamos si todos los items a producir fueron enviados a SAP para cerrar la orden
                if (clsCosActCstProductos.funVerificarDetItemProducirSAP(varCabCodigo).Equals(0))
                {
                    //Actualizamos el estado de la orden a SAP
                    csAccesoDatos.funIniciarSesion("conDBUmbrella");
                    csAccesoDatos.GDatos.funEjecutarSql(string.Format("Update GRA_CABACTCSTPRODUCTOS Set EstCodigo = 'Sap' Where CabCodigo = {0}", varCabCodigo));
                    csAccesoDatos.GDatos.funEjecutarSql(string.Format("Update GRA_DETACTCSTFORMULACION Set EstCodigo = 'Sap' Where CabCodigo = {0}", varCabCodigo));
                    csAccesoDatos.GDatos.funEjecutarSql(string.Format("Update GRA_DETACTCSTMATERIAL Set EstCodigo = 'Sap' Where CabCodigo = {0}", varCabCodigo));
                    csAccesoDatos.proFinalizarSesion();
                }

                return("");
            }
            catch (Exception e)  { throw new Exception(e.Message); }
            finally { csAccesoDatos.proFinalizarSesionSAP(); }
        }