private void btnSincronizar_Click(object sender, EventArgs e)
        {
            this.tmrMigracion.Enabled   = false;
            this.btnSincronizar.Enabled = false;
            this.stlMensaje.Text        = string.Empty;

            try
            {
                DateTime recepcion = this.ultimaFecha;

                var lstBeConfiguracion = new List <BE.Configuracion>();
                if (this.cboSociedades.SelectedIndex == 0)
                {
                    lstBeConfiguracion = new BD.Configuracion().Listar();
                }
                else
                {
                    var beEmpresa       = (BE.Empresa) this.cboSociedades.SelectedItem;
                    var beConfiguracion = new BD.Configuracion().Obtener(beEmpresa);
                    if (beConfiguracion != null)
                    {
                        lstBeConfiguracion.Add(beConfiguracion);
                    }
                    else
                    {
                        General.CriticalMessage("La sociedad seleccionada no tiene configuración");
                        return;
                    }
                }


                foreach (var beConfiguracion in lstBeConfiguracion)
                {
                    #region Obtener Datos de WS

                    this.stlMensaje.Text = $"Obteniendo los datos de la sociedad { beConfiguracion.Empresa.Nombre } del Servicio Web";

                    bool existeDatosSalida    = false;
                    bool existeDatosEntrada   = false;
                    bool existeDatosSolicitud = false;

                    int idEmpresa = beConfiguracion.Empresa.Id;
                    var tasksWs   = new[]
                    {
                        Task <bool> .Factory.StartNew(() => ObtenerSalidasWs(recepcion, idEmpresa)),
                        Task <bool> .Factory.StartNew(() => ObtenerEntradasWs(recepcion, idEmpresa)),
                        Task <bool> .Factory.StartNew(() => ObtenerSolicitudesWs(recepcion, idEmpresa))
                    };

                    try
                    {
                        Task.WaitAll(tasksWs);
                    }
                    catch (AggregateException exTask)
                    {
                        throw exTask.Flatten();
                    }

                    existeDatosSalida    = tasksWs[0].Result;
                    existeDatosEntrada   = tasksWs[1].Result;
                    existeDatosSolicitud = tasksWs[2].Result;

                    #endregion

                    #region Registrar Datos en BD

                    this.stlMensaje.Text = $"Guardando los datos de la sociedad { beConfiguracion.Empresa.Nombre }";

                    bool registraDatosSalida    = false;
                    bool registraDatosEntrada   = false;
                    bool registraDatosSolicitud = false;

                    var bdSap = new BD.Sap(beConfiguracion.Servidor,
                                           beConfiguracion.BaseDatos,
                                           beConfiguracion.UsuarioBD,
                                           beConfiguracion.ClaveBD);

                    var tasksBd = new[]
                    {
                        Task <bool> .Factory.StartNew(() => RegistrarSalidaBD(ref bdSap, beConfiguracion.Empresa)),
                        Task <bool> .Factory.StartNew(() => RegistrarEntradaBD(ref bdSap, beConfiguracion.Empresa)),
                        Task <bool> .Factory.StartNew(() => RegistrarSolicitudBD(ref bdSap, beConfiguracion.Empresa))
                    };

                    try
                    {
                        Task.WaitAll(tasksBd);
                    }
                    catch (AggregateException exTask)
                    {
                        throw exTask.Flatten();
                    }

                    registraDatosSalida    = tasksBd[0].Result;
                    registraDatosEntrada   = tasksBd[1].Result;
                    registraDatosSolicitud = tasksBd[2].Result;

                    #endregion

                    #region Enviar Datos a SAP

                    this.stlMensaje.Text = $"Enviado los datos de la sociedad { beConfiguracion.Empresa.Nombre } al SAP";

                    #region Conectar a SAP

                    string server        = beConfiguracion.Servidor;
                    string licenseServer = beConfiguracion.LicenciaSAP;
                    string companyDB     = beConfiguracion.BaseDatos;
                    string dbUserName    = beConfiguracion.UsuarioBD;
                    string dbPassword    = beConfiguracion.ClaveBD;
                    string userName      = beConfiguracion.UsuarioSAP;
                    string password      = beConfiguracion.ClaveSAP;

                    var diConexion = new DI.DiConexion(server, licenseServer, companyDB,
                                                       dbUserName, dbPassword,
                                                       userName, password);

                    #endregion

                    var tasksSap = new[]
                    {
                        Task.Factory.StartNew(() => EnviarSalidasSap(ref diConexion, beConfiguracion.Empresa)),
                        Task.Factory.StartNew(() => EnviarEntradasSap(ref diConexion, beConfiguracion.Empresa)),
                        Task.Factory.StartNew(() => EnviarSolicitudesSap(ref diConexion, beConfiguracion.Empresa))
                    };
                    Task.WaitAll(tasksSap);

                    #region Desconectar a SAP

                    diConexion.Desconectar();
                    diConexion.Dispose();

                    #endregion

                    #endregion
                }

                this.stlMensaje.Text = "Sincronización Completada";

                this.ObtenerUltimaSincronizacion();
                this.CargarDocumentosError();
            }
            catch (Exception ex)
            {
                General.ErrorMessage(ex.Message);
            }
            finally
            {
                this.btnSincronizar.Enabled = true;
                this.tmrMigracion.Enabled   = true;
            }
        }
        private void btnEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                this.btnEnviar.Enabled = false;
                this.stlMensaje.Text   = string.Empty;

                if (this.dgvDocumentosError.CurrentRow == null)
                {
                    return;
                }

                var uiDocumento = (Documento)this.dgvDocumentosError.CurrentRow.DataBoundItem;
                if (uiDocumento.Estado != ERROR)
                {
                    return;
                }

                int    errCode    = 0;
                string errMessage = "";

                var beEmpresa       = new BD.Empresa().Obtener(uiDocumento.EmpresaId);
                var beConfiguracion = new BD.Configuracion().Obtener(beEmpresa);

                string server        = beConfiguracion.Servidor;
                string licenseServer = beConfiguracion.LicenciaSAP;
                string companyDB     = beConfiguracion.BaseDatos;
                string dbUserName    = beConfiguracion.UsuarioBD;
                string dbPassword    = beConfiguracion.ClaveBD;
                string userName      = beConfiguracion.UsuarioSAP;
                string password      = beConfiguracion.ClaveSAP;

                this.stlMensaje.Text = $"Conectando al SBO de la compañia { beConfiguracion.Empresa.Nombre }";

                using (var sbo = new DI.DiConexion(server, licenseServer, companyDB,
                                                   dbUserName, dbPassword,
                                                   userName, password))
                {
                    var sapBd   = new BD.Sap(server, companyDB, dbUserName, dbPassword);
                    var errorBd = new BD.Error();

                    switch (uiDocumento.TipoId)
                    {
                    case SALIDA:     // "Salida de Almacen":
                        var bdSalida = new BD.SalidaAlmacen();
                        var beSalida = bdSalida.Obtener(uiDocumento.Id);
                        if (beSalida != null)
                        {
                            var seSalida = TD.BeToSe.SalidaAlmacen(beSalida);

                            this.stlMensaje.Text = $"Enviando Salida de Almacen";

                            string docEntry = new DI.DiSalidaAlmacen(sbo.oCompany).Enviar(seSalida, out errCode, out errMessage);
                            if (docEntry.Length > 0)
                            {
                                beSalida.CodSap = int.Parse(docEntry);
                            }

                            var rpta = bdSalida.Actualizar(beSalida);
                            if (rpta == true && errCode != 0)
                            {
                                this.RegistrarErrorSap(SALIDA, beSalida.IdSalidaAlmacen, errMessage);
                            }
                        }
                        break;

                    case ENTRADA:     // "Entrada de Almacen":
                        var bdEntrada = new BD.EntradaAlmacen();
                        var beEntrada = bdEntrada.Obtener(uiDocumento.Id);
                        if (beEntrada != null)
                        {
                            var seEntrada = TD.BeToSe.EntradaAlmacen(beEntrada);

                            this.stlMensaje.Text = $"Enviando Entrada de Almacen";

                            string docEntry = new DI.DiEntradaAlmacenPorCompra(sbo.oCompany).Enviar(seEntrada, out errCode, out errMessage);
                            if (docEntry.Length > 0)
                            {
                                beEntrada.CodSap = int.Parse(docEntry);
                            }

                            var rpta = bdEntrada.Actualizar(beEntrada);
                            if (rpta == true && errCode != 0)
                            {
                                this.RegistrarErrorSap(SALIDA, beEntrada.IdEntradaAlmacen, errMessage);
                            }
                        }
                        break;

                    case SOLICITUD:     // "Solicitud de Compra":
                        var bdSolicitud = new BD.SolicitudCompra();
                        var beSolicitud = bdSolicitud.Obtener(uiDocumento.Id);
                        if (beSolicitud != null)
                        {
                            var seSolicitud = TD.BeToSe.SolicitudCompra(beSolicitud);

                            this.stlMensaje.Text = $"Enviando Solicitud de Compra";

                            string docEntry = new DI.DiSolicitudCompra(sbo.oCompany).Enviar(seSolicitud, out errCode, out errMessage);
                            if (docEntry.Length > 0)
                            {
                                beSolicitud.CodSap = int.Parse(docEntry);
                            }

                            var rpta = bdSolicitud.Actualizar(beSolicitud);
                            if (rpta == true && errCode != 0)
                            {
                                this.RegistrarErrorSap(SOLICITUD, beSolicitud.IdSolicitudCompra, errMessage);
                            }
                        }
                        break;

                    default:
                        break;
                    }
                }

                this.stlMensaje.Text = "Sincronización Completada";
                this.CargarDocumentosError();
            }
            catch (Exception ex)
            {
                General.ErrorMessage(ex.Message);
            }
            finally
            {
                this.btnEnviar.Enabled = true;
            }
        }
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                #region Validaciones

                var beEmpresa = (BE.Empresa) this.cboEmpresa.SelectedItem;
                if (beEmpresa == null)
                {
                    this.cboEmpresa.Focus();
                    General.CriticalMessage("Seleccione una Empresa");
                    return;
                }

                if (this.txtServidor.Text.Trim().Length == 0)
                {
                    this.txtServidor.Focus();
                    General.CriticalMessage("Ingrese una Servidor");
                    return;
                }

                if (this.txtLicenciaSBO.Text.Trim().Length == 0)
                {
                    this.txtLicenciaSBO.Focus();
                    General.CriticalMessage("Ingrese una Servidor de Licencia");
                    return;
                }

                if (this.txtUsuarioSBO.Text.Trim().Length == 0)
                {
                    this.txtUsuarioSBO.Focus();
                    General.CriticalMessage("Ingrese un Usuario de SBO");
                    return;
                }

                if (this.txtClaveSBO.Text.Trim().Length == 0)
                {
                    this.txtClaveSBO.Focus();
                    General.CriticalMessage("Ingrese una Clave de SBO");
                    return;
                }

                if (this.txtNombreBD.Text.Trim().Length == 0)
                {
                    this.txtNombreBD.Focus();
                    General.CriticalMessage("Ingrese una Base de Datos");
                    return;
                }

                if (this.txtUsuarioBD.Text.Trim().Length == 0)
                {
                    this.txtUsuarioBD.Focus();
                    General.CriticalMessage("Ingrese un Usuario de BD");
                    return;
                }

                if (this.txtClaveBD.Text.Trim().Length == 0)
                {
                    this.txtClaveBD.Focus();
                    General.CriticalMessage("Ingrese una Clave de BD");
                    return;
                }

                #endregion

                if (this.configuracion == null)
                {
                    this.configuracion = new BE.Configuracion();
                }

                this.configuracion.Empresa = beEmpresa;

                this.configuracion.Servidor = this.txtServidor.Text;

                this.configuracion.LicenciaSAP = this.txtLicenciaSBO.Text;
                this.configuracion.UsuarioSAP  = this.txtUsuarioSBO.Text;
                this.configuracion.ClaveSAP    = this.txtClaveSBO.Text;

                //this.configuracion.TipoBD = int.Parse(this.cboTipoBD.SelectedValue);

                this.configuracion.BaseDatos = this.txtNombreBD.Text;
                this.configuracion.UsuarioBD = this.txtUsuarioBD.Text;
                this.configuracion.ClaveBD   = this.txtClaveBD.Text;

                bool rpta = false;
                if (this.configuracion.Id == 0)
                {
                    rpta = new BD.Configuracion().Insertar(ref this.configuracion);
                }
                else
                {
                    rpta = new BD.Configuracion().Actualizar(this.configuracion);
                }

                if (rpta)
                {
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                General.ErrorMessage(ex.Message);
            }
        }