public ActionResult Metodo_InsertarProyecto(CatProyectos Proyecto, string Accion, FormCollection Formulario, IEnumerable <HttpPostedFileBase> files)
        {
            CatUsuarios Usuario = (CatUsuarios)Session["Usuario"];

            if (Usuario == null || Usuario.U_IdTipoUsuario != 2)
            {
                TempData["notice"] = "La sesión ha expirado.";
                return(RedirectToAction("Logout", "Home"));
            }
            string Validacion        = "";
            string RFCUsuario        = Session["RFCAsociado"].ToString();
            int    IdProyecto        = 0;
            string IdEstatusProyecto = "NO CAPTURADO";
            string resultado;

            try
            {
                Validacion = MetodoGeneral.ValidarFIEL(files, Proyecto.P_ClavePrivada, RFCUsuario);
                if (Validacion == "Validación exitosa")
                {
                    Proyecto.P_IdEmpresa = Usuario.U_IdEmpresa;
                    IdProyecto           = 0;
                    IdProyecto           = LogicaProyecto.L_InsertarProyecto(Proyecto, Usuario.U_IdUsuario);

                    IdEstatusProyecto = "NO CAPTURADO";

                    if (IdProyecto > 0)
                    {
                        Proyecto = LogicaProyecto.L_DetallesProyectos(IdProyecto);
                        LogicaProyecto.L_ActualizarProyectoSeguimiento(IdProyecto, 1);

                        IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(IdProyecto);

                        LogicaProyecto.L_ResetProyectoPregunta(IdProyecto);
                        foreach (var item in Formulario)
                        {
                            string[] Cadena = (item.ToString()).Split('_');

                            if (Cadena[0] == "Pregunta")
                            {
                                int  value     = Convert.ToInt32(Formulario[item.ToString()]);
                                bool respuesta = Convert.ToBoolean(value);
                                LogicaProyecto.L_ActualizarProyectoPregunta(IdProyecto, Convert.ToInt32(Cadena[1]), respuesta);
                            }
                        }

                        IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(IdProyecto);

                        if (IdEstatusProyecto == "CAPTURADO")
                        {
                            //@@ No se usa para pruebas en desarrollo @@//

                            //COMUNICACIÓN: Enviar proyecto a BPM
                            WSBPM_Nivel0.ProcessNivel0PortTypeClient CrearProyectos = new WSBPM_Nivel0.ProcessNivel0PortTypeClient();
                            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 -");
                        }

                        Thread.Sleep(3000);

                        for (int i = 0; i < 2; i++)
                        {
                            IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(IdProyecto);
                            if (IdEstatusProyecto == "ENVIADOBPM")
                            {
                                break;
                            }
                            Thread.Sleep(1000);
                        }

                        if (IdEstatusProyecto == "ENVIADOBPM")
                        {
                            //COMUNICACIÓN: Enviar proyecto a gobmx
                            MetodoGeneral.RegistroDeError("Datos {IdProyecto: " + Proyecto.P_IdGlobal + ", RFC: " + Usuario.U_RFCRepresentanteAsociado + "}", "Invocacion GOB MX");

                            resultado = MetodoGeneral.RegistrarReferenciaMacroTramite(Proyecto.P_IdGlobal, Usuario.U_RFCRepresentanteAsociado);
                            LogicaProyecto.L_ActualizarProyectoSeguimiento(IdProyecto, 3);
                            LogicaProyecto.L_ActualizarProyectoSeguimiento(IdProyecto, 4);
                        }
                        //COMUNICACIÓN: Enviar proyecto a WS de las Dependencias involucradas.
                        // Hacemos el consumo del WebService CRE
                        NotificacionIOP    Servicio  = new NotificacionIOP();
                        RespuestaClienteWS Respuesta = new RespuestaClienteWS();
                        //RespuestaClienteWS RespuestaCNC = new RespuestaClienteWS();
                        int IdRepresentante = (Int32)Session["IdRepresentanteActual"];
                        Respuesta = Servicio.CreNotificacion(Proyecto.P_IdGlobal, Proyecto.P_IdEmpresa, Proyecto.P_IdProyecto, IdRepresentante);
                        //RespuestaCNC = Servicio.CNCNotificacion(Proyecto.P_IdGlobal, Proyecto.P_IdEmpresa, Proyecto.P_IdProyecto, IdRepresentante); //En espera



                        IdEstatusProyecto = LogicaProyecto.L_SeleccionarProyectoSeguimiento(IdProyecto);

                        switch (IdEstatusProyecto)
                        {
                        case "NO CAPTURADO":
                            string Mensaje1 = "El proyecto no ha sido registrado en ENREL.";
                            MetodoGeneral.RegistroDeError(Mensaje1, "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación";
                            Session["TipoAlerta"] = "Error";
                            return(RedirectToAction("Index"));

                        case "CAPTURADO":
                            string Mensaje2 = "Proyecto registrado en la BD de ENREL, pero no se envió al BPM. IdProyecto = '" + IdProyecto + "'";
                            MetodoGeneral.RegistroDeError("Proyecto registrado en la BD de ENREL, pero no se envió al BPM.", "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación";
                            Session["TipoAlerta"] = "Error";
                            return(RedirectToAction("Index"));

                        case "ENVIADOBPM":
                            string Mensaje3 = "Proyecto registrado en la BD de ENREL, pero no se registró en GOBMX. IdProyecto = '" + IdProyecto + "'";
                            MetodoGeneral.RegistroDeError(Mensaje3, "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación";
                            Session["TipoAlerta"] = "Error";
                            return(RedirectToAction("Index"));

                        case "ENVIADOGOBMX":
                            string Mensaje4 = "Proyecto registrado en la BD de ENREL, pero no se ha registrado el estatus INICIADO. IdProyecto = '" + IdProyecto + "'";
                            MetodoGeneral.RegistroDeError(Mensaje4, "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación";
                            Session["TipoAlerta"] = "Error";
                            return(RedirectToAction("Index"));

                        case "INICIADO":
                            string Mensaje5 = "Proyecto registrado exitosamente. IdProyecto = '" + IdProyecto + "'";
                            MetodoGeneral.RegistroDeError(Mensaje5, "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "El proyecto se ha registrado exitosamente.";
                            Session["TipoAlerta"] = "Correcto";
                            return(RedirectToAction("Index"));

                        default:
                            string Mensaje6 = "Error inesperado. IdProyecto = '" + IdProyecto + "'";
                            MetodoGeneral.RegistroDeError(Mensaje6, "Proyectos: Insertar Proyecto");
                            TempData["notice"]    = "Error inesperado, por favor consulte a un administrador de la aplicación.";
                            Session["TipoAlerta"] = "Error";
                            return(RedirectToAction("Index"));
                        }
                    }
                    else
                    {
                        Session["TipoAlerta"] = "Error";
                        List <CatPreguntas> ListaPreguntas = LogicaProyecto.L_SeleccionarPreguntas(Proyecto.P_IdTecnologia);
                        ViewBag.ListaPreguntas = new SelectList(ListaPreguntas, "IdPregunta", "Pregunta");
                        CargarListasDesplegables(Proyecto.P_CodigoPostal, Proyecto.P_IdEntidadFederativa, Proyecto.P_IdMunicipio, Proyecto.P_IdLocalidad);
                        Proyecto.P_ClavePrivada  = null;
                        ViewBag.IdTecnologia     = Proyecto.P_IdTecnologia;
                        ViewBag.RFCRepresentante = Usuario.U_RFCRepresentanteAsociado;
                        return(View("Insertar", Proyecto));
                    }
                }
                else
                {
                    TempData["notice"]    = Validacion;
                    Session["TipoAlerta"] = "Error";
                    CargarListasDesplegables(Proyecto.P_CodigoPostal, Proyecto.P_IdEntidadFederativa, Proyecto.P_IdMunicipio, Proyecto.P_IdLocalidad);
                    Proyecto.P_ClavePrivada = "";
                    List <CatPreguntas> ListaPreguntas = LogicaProyecto.L_SeleccionarPreguntas(Proyecto.P_IdTecnologia);
                    ViewBag.ListaPreguntas   = new SelectList(ListaPreguntas, "IdPregunta", "Pregunta");
                    ViewBag.IdTecnologia     = Proyecto.P_IdTecnologia;
                    ViewBag.RFCRepresentante = Usuario.U_RFCRepresentanteAsociado;
                    CargarListasDesplegables(Proyecto.P_CodigoPostal, Proyecto.P_IdEntidadFederativa, Proyecto.P_IdMunicipio, Proyecto.P_IdLocalidad);
                    Proyecto.P_ClavePrivada = null;
                    return(View("Insertar", Proyecto));
                }
            }
            catch (Exception ex)
            {
                Proyecto.P_ClavePrivada = null;
                Session["TipoAlerta"]   = "Error";
                MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto");

                switch (IdEstatusProyecto)
                {
                case "NO CAPTURADO":
                    TempData["notice"] = "El proyecto no ha sido registrado en ENREL.";
                    MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto: Proyecto registrado en la BD de ENREL, pero no se envió al BPM.");
                    List <CatPreguntas> ListaPreguntas = LogicaProyecto.L_SeleccionarPreguntas(Proyecto.P_IdTecnologia);
                    ViewBag.ListaPreguntas = new SelectList(ListaPreguntas, "IdPregunta", "Pregunta");
                    CargarListasDesplegables(Proyecto.P_CodigoPostal, Proyecto.P_IdEntidadFederativa, Proyecto.P_IdMunicipio, Proyecto.P_IdLocalidad);
                    Proyecto.P_ClavePrivada  = "";
                    ViewBag.RFCRepresentante = Usuario.U_RFCRepresentanteAsociado;
                    ViewBag.IdTecnologia     = Proyecto.P_IdTecnologia;
                    return(View("Insertar", Proyecto));

                case "CAPTURADO": TempData["notice"] = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación.";
                    MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto: Proyecto registrado en la BD de ENREL, pero no se envió al BPM");
                    return(RedirectToAction("Index"));

                case "ENVIADOBPM": TempData["notice"] = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación.";
                    MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto: Proyecto registrado en la BD de ENREL, pero no se registró en GOBMX..");
                    return(RedirectToAction("Index"));

                case "ENVIADOGOBMX": TempData["notice"] = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación.";
                    MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto: Proyecto registrado en la BD de ENREL, pero no se ha registrado el estatus INICIADO.");
                    return(RedirectToAction("Index"));

                default: TempData["notice"] = "Registro del proyecto pendiente, espere unos minutos y vuelva a consultar la aplicación.";
                    MetodoGeneral.RegistroDeError(ex.Message, "Proyectos: Insertar Proyecto: Error general.");
                    return(RedirectToAction("Index"));
                }
            }
        }
        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"));
                }
            }
        }