private void CargarDatosProyecto(CatAvanceTramites AvanceTramites, CatProyectos Proyecto, CatEmpresas Empresa, CatRepresentantesLegales Representante)
        {
            int PorcentajePositivo = 0;
            int PorcentajeNegativo = 100;

            ViewBag.DatosProyectos     = JsonConvert.SerializeObject(Proyecto);
            ViewBag.DatosEmpresa       = JsonConvert.SerializeObject(Empresa);
            ViewBag.DatosRepresentante = JsonConvert.SerializeObject(Representante);
            ViewBag.RFCRepresentante   = Representante.RL_RFC;

            ViewBag.NombreProyecto = Proyecto.P_NombreProyecto;
            ViewBag.FechaInicio    = Proyecto.P_FechaRegistro;
            ViewBag.DiasAgregados  = Proyecto.P_DiasAgregados;

            ViewBag.ImagenMapaTecnologia = ConfigurationManager.AppSettings["Img_MapaTecnologia"].ToString() + Proyecto.P_Tecnologia + ".jpg";
            ViewBag.NombreTecnologia     = Proyecto.P_Tecnologia;
            ViewBag.IdProyecto           = Proyecto.P_IdProyecto.ToString();
            ViewBag.IdGlobal             = Proyecto.P_IdGlobal;

            ViewBag.TramitesFinalizados = AvanceTramites.T_TramitesFinalizados;
            ViewBag.TramitesTotales     = AvanceTramites.T_TramitesTotales;
            try
            {
                PorcentajePositivo = (AvanceTramites.T_TramitesFinalizados * 100) / AvanceTramites.T_TramitesTotales;
                PorcentajeNegativo = 100 - PorcentajePositivo;
            }
            catch (Exception ex)
            {
            }


            ViewBag.PorcentajePositivo = PorcentajePositivo;
            ViewBag.PorcentajeNegativo = PorcentajeNegativo;

            LogicaProyecto.L_ActualizarAvanceProyecto(Proyecto.P_IdProyecto, PorcentajePositivo);
            double Finalizados = ((Convert.ToDouble(ViewBag.TramitesFinalizados)));
            double totales     = ((Convert.ToDouble(ViewBag.TramitesTotales)));
            double Porcentaje  = (Finalizados / totales * 100);
            string Val         = string.Format("{0:0}", Porcentaje);

            ViewBag.Porcentaje = Val;
        }
        public ActionResult ProyectoTramites()
        {
            string IdEstatusProyecto = "NO CAPTURADO";
            string resultado         = "";
            bool   ErrorBPM          = false;

            try
            {
                CatUsuarios Usuario = (CatUsuarios)Session["Usuario"];
                if (Usuario == null || Usuario.U_IdTipoUsuario != 2)
                {
                    TempData["notice"] = "La sesión ha expirado.";
                    return(RedirectToAction("Logout", "Home"));
                }

                int          Idproyecto    = Convert.ToInt32(Request.Form["IdProyecto"]);
                CatProyectos Proyecto      = LogicaProyecto.L_DetallesProyectos(Idproyecto);
                string       IdProyectoBPM = Idproyecto.ToString();
                string       Tecnologia    = Proyecto.P_Tecnologia.ToLower();

                //Crea la instancia de los WS de BPM que vaya a utilizar
                WSBPM_Nivel0.ProcessNivel0PortTypeClient CrearProyectos = new WSBPM_Nivel0.ProcessNivel0PortTypeClient();
                WSBPM_Nivel3.ProcessNivel3PortTypeClient EnviarEstatus  = new WSBPM_Nivel3.ProcessNivel3PortTypeClient();

                IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(Idproyecto);

                if (IdEstatusProyecto == "CAPTURADO")
                {
                    //COMUNICACIÓN: Enviar proyecto a BPM
                    CrearProyectos.InicioNivel0(Idproyecto.ToString(), Proyecto.P_Tecnologia.ToLower());
                    LogicaProyecto.L_ActualizarProyectoSeguimiento(Idproyecto, 2);
                    MetodoGeneral.RegistroDeError("Datos {IdProyecto: " + Idproyecto.ToString() + ", Tecnología: " + Proyecto.P_Tecnologia.ToLower() + "}", "Invocación Nivel 0 -");
                    MetodoGeneral.RegistroDeError(CrearProyectos.Endpoint.Address.ToString(), "Invocación Nivel 0 -");
                }

                IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(Idproyecto);

                if (IdEstatusProyecto == "ENVIADOBPM")
                {
                    //COMUNICACIÓN: Enviar proyecto a gobmx
                    resultado = MetodoGeneral.RegistrarReferenciaMacroTramite(Proyecto.P_IdGlobal, Usuario.U_RFCRepresentanteAsociado);
                    LogicaProyecto.L_ActualizarProyectoSeguimiento(Idproyecto, 3);
                    LogicaProyecto.L_ActualizarProyectoSeguimiento(Idproyecto, 4);
                }

                IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(Idproyecto);

                if (IdEstatusProyecto == "INICIADO" || IdEstatusProyecto == "SUSPENDIDO")
                {
                    //Preguntar estatus GOBMX
                    RespuestaConsultaMacroTramite Resultado = MetodoGeneral.ConsultarMacroTramite(Proyecto.P_IdGlobal);

                    //Guardar estatus de GOBMX en BD ENREL
                    if (Resultado.cadenaInteroperabilidad != null && Resultado.cadenaInteroperabilidad.Count > 0)
                    {
                        LogicaTramite.L_ActualizarEstatusTramite(Resultado, Proyecto.P_IdProyecto);
                    }

                    //Obtener estatus de los trámites ya en la base de datos que tienen que ser actualizados en BPM:
                    List <CatTramites> ListaTramitesActualizarBPM = LogicaTramite.L_SeleccionarProyectoTramitesParaEnviarBPM(Idproyecto);

                    //COMUNICACIÓN: Reporta estatus a BPM
                    try
                    {
                        foreach (CatTramites Tramite in ListaTramitesActualizarBPM)
                        {
                            if (Tramite.T_ConfirmacionBPM == false)
                            {
                                EnviarEstatus.receiveTask(Idproyecto.ToString(), Tramite.T_HomoClave, Tramite.T_Estatus.ToLower(), Tramite.T_Prorroga);
                                MetodoGeneral.RegistroDeError("IDPROYECTO = '" + Idproyecto.ToString() + "', HOMOCLAVE ='" + Tramite.T_HomoClave + "', ESTATUS = '" + Tramite.T_Estatus.ToLower() + "'", "Invocación Nivel 3 - ");
                                MetodoGeneral.RegistroDeError(EnviarEstatus.Endpoint.Address.ToString(), "Invocación Nivel 3 - ");
                            }
                            Thread.Sleep(100);
                        }
                    }
                    catch (Exception ex)
                    {
                        Session["TipoAlerta"] = "Error";
                        MetodoGeneral.RegistroDeError(ex.Message, "ProyectoTramites");
                        ErrorBPM = true;
                    }
                }



                IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(Idproyecto);

                switch (IdEstatusProyecto)
                {
                case "CAPTURADO":
                    Session["TipoAlerta"] = "Error";
                    TempData["notice"]    = "El proyecto se registró en ENREL pero no ha sido sido enviado al gestor de trámites.";
                    return(RedirectToAction("Index"));

                case "ENVIADOBPM":
                    Session["TipoAlerta"] = "Error";
                    TempData["notice"]    = "El proyecto no ha sido registrado en Gobmx.";
                    return(RedirectToAction("Index"));

                case "ENVIADOGOBMX":
                    Session["TipoAlerta"] = "Error";
                    TempData["notice"]    = "El proyecto ha sido registrado en Gobmx pero ocurrió un error inesperado";
                    return(RedirectToAction("Index"));

                case "CONCLUIDO":
                    bool Resultado = MetodoGeneral.NotificarEstatusMacroTramite(Proyecto.P_IdGlobal, "1", "1");
                    if (Resultado)
                    {
                        LogicaProyecto.L_ActualizarProyectoSeguimiento(Idproyecto, 7);
                    }
                    break;

                default: break;
                }

                //Obtener estatus de los trámites ya en la base de datos:
                Thread.Sleep(1000);
                List <CatTramites> ListaTramites = LogicaTramite.L_SeleccionarProyectoTramites(Idproyecto, Proyecto.P_IdGlobal, Usuario.U_RFCRepresentanteAsociado, Session["OpenId"].ToString());

                CatEmpresas Empresa         = LogicaEmpresa.L_DetallesEmpresa(Proyecto.P_IdEmpresa);
                int         IdRepresentante = (Int32)Session["IdRepresentanteActual"];
                CatRepresentantesLegales RepresentanteLegal = LogicaRepresentanteLegal.L_DetallesRepresentanteLegal(IdRepresentante);
                List <CatEstatusTramite> TablaEstatus       = LogicaTramite.L_TablaEstatusTramite();
                CatAvanceTramites        AvanceTramites     = LogicaTramite.L_AvanceTramites(ListaTramites);
                CargarDatosProyecto(AvanceTramites, Proyecto, Empresa, RepresentanteLegal);

                if (ErrorBPM)
                {
                    Session["TipoAlerta"] = "Error";
                    TempData["notice"]    = "La información podría no estar actualizada";
                }

                return(View(ListaTramites));
            }
            catch (Exception ex)
            {
                Session["TipoAlerta"] = "Error";
                MetodoGeneral.RegistroDeError(ex.Message, "ProyectoTramites");
                switch (IdEstatusProyecto)
                {
                case "CAPTURADO": TempData["notice"] = "El proyecto se registró en ENREL pero no ha sido sido enviado al gestor de trámites.";
                    return(RedirectToAction("Index"));

                case "ENVIADOBPM": TempData["notice"] = "El proyecto no ha sido registrado en Gobmx.";
                    return(RedirectToAction("Index"));

                case "ENVIADOGOBMX": TempData["notice"] = "El proyecto ha sido registrado en Gobmx pero ocurrió un error inesperado";
                    return(RedirectToAction("Index"));

                default: TempData["notice"] = "Error inesperado, por favor consulte a un administrador de la aplicación.";
                    return(RedirectToAction("Index"));
                }
            }
        }