Ejemplo n.º 1
0
        /// <summary>
        /// Ejecutar evento
        /// </summary>
        /// <param name="Wf">Objeto de WF</param>
        /// <param name="Evento">Evento a ejecutar</param>
        /// <param name="DevolverHandler">Devuelve un handler ?</param>
        /// <returns></returns>
        public static string EjecutarEvento(CedEntidades.WF Wf, CedEntidades.Evento Evento, bool DevolverHandler)
        {
            Cedeira.SV.db db = new Cedeira.SV.db(Wf.Sesion);
            List<CedEntidades.Evento> eventosPosibles = Wf.EventosPosibles.FindAll(delegate(CedEntidades.Evento e){return e.Id == Evento.Id;});
            List<CedEntidades.EsqSegEvenPos> esquemaSegEventosPosibles = LeerEsquemaSegEventosPosibles(Wf).FindAll(delegate(CedEntidades.EsqSegEvenPos e) { return e.Evento.Id == Evento.Id; });
            CedEntidades.EsqSegEvenPos esquemaSegEventosPosiblesUsado = new CedEntidades.EsqSegEvenPos();
            List<CedEntidades.GrupoXUsuario> gruposXUsuario = new List<CedEntidades.GrupoXUsuario>();
            switch (IntervencionPermitida(Wf, Evento, ref eventosPosibles, ref esquemaSegEventosPosibles, ref esquemaSegEventosPosiblesUsado, ref gruposXUsuario))
            {
                case "EventoInvalido":
                    throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.EventoInvalido();
                case "EventoSinSeg":
                    throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.EventoSinSeg();
                case "UsuarioNoCumpleSeg":
                    throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.UsuarioNoCumpleSeg();
                case "CXO":
                    throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.CXO();
                default:
                    break;
            }
            if (Evento.IdEstadoHst.IdEstado.Equals(string.Empty))
            {
                throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.EstadoHstNoDefinido();
            }
            if (Evento.IdEstadoDsd.IdEstado.Equals(string.Empty))
            {
                // Evento inicial (alta de operacion)
                if (!(esquemaSegEventosPosibles.Count == 1 && esquemaSegEventosPosiblesUsado.CantInterv == 1))
                {
                    // (los eventos iniciales no pueden tener varias intervenciones)
                    throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.EstadoHstInvalido();
                }
                else
                {
                    Wf.IdEstado = Evento.IdEstadoHst.IdEstado;
                    Wf.DescrEstado = Evento.IdEstadoHst.DescrEstado;
                    if (!DevolverHandler)
                    {
						Wf.IdOp = db.WF_Op_ins(Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Wf.DescrOp, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel);
                        return String.Empty;
                    }
                    else
                    {
						return db.WF_Op_insHandler(Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Wf.DescrOp, Evento.Id, Wf.Sesion.Usuario.IdUsuario.ToString(), Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel);
                    }
                }
            }
            else
            {
                // Chequeo si esta es la ultima intervencion (que posibilita el cambio de estado)
                if (esquemaSegEventosPosibles.Count == 1 && esquemaSegEventosPosiblesUsado.CantInterv == 1)
                {
                    // Cambio el estado
                    switch (Evento.IdEstadoHst.IdEstado)
                    {
                        case ("<EstadoAnt>"):
                            // Estado virtual
                            for (int i = Wf.Log.Count - 1; i >= 0; i--)
                            {
                                if (Wf.Log[i].Estado != Wf.IdEstado)
                                {
                                    Wf.IdCircuito = Wf.Log[i].Circuito.IdCircuito;
                                    Wf.IdEstado = Wf.Log[i].Estado;
                                    //Revisar que la decripcion del estado sea el campo comentario de Wf.log[i]
                                    Wf.DescrEstado = Wf.Log[i].Comentario;
                                    if (!DevolverHandler)
                                    {
										db.WF_Op_upd(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                                        return String.Empty;
                                    }
                                    else
                                    {
										return db.WF_Op_updHandler(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                                    }
                                }
                            }
                            throw new Microsoft.ApplicationBlocks.ExceptionManagement.WF.EstadoVirtualMalConfigurado();
                        case ("<ElMismo>"):
                            List<CedEntidades.Estado> listaEstados = IdEstadoCombo(Wf.Sesion);
                            CedEntidades.Estado estado = listaEstados.Find((delegate(CedEntidades.Estado e) { return e.DescrEstado == Wf.Log[Wf.Log.Count - 1].Estado; }));
                            string idEstado = "";
                            if (estado != null)
                            {
                                idEstado = estado.IdEstado;
                            }
                            Wf.IdEstado = idEstado;
                            if (!DevolverHandler)
                            {
                                db.WF_Op_upd(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                                return String.Empty;
                            }
                            else
                            {
                                return db.WF_Op_updHandler(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                            } 
                        default:
                            // Estado determinado
                            Wf.IdEstado = Evento.IdEstadoHst.IdEstado;
                            Wf.DescrEstado = Evento.IdEstadoHst.DescrEstado;
                            if (!DevolverHandler)
                            {
								db.WF_Op_upd(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                                return String.Empty;
                            }
                            else
                            {
								return db.WF_Op_updHandler(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                            }
                    }
                }
                else
                {
                    // Registro intervencion sin cambiar el estado, pero
                    // actualizo WF_Op por si cambio el Circuito o el NivSeg
                    if (!DevolverHandler)
                    {
						db.WF_Op_upd(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                        return String.Empty;
                    }
                    else
                    {
						return db.WF_Op_updHandler(Wf.IdOp, Wf.IdFlow, Wf.IdCircuito, Wf.IdNivSeg, Wf.IdEstado, Evento.Id, Wf.Sesion.Usuario.IdUsuario, Evento.Comentario, gruposXUsuario[0].Id, gruposXUsuario[0].Supervisor, gruposXUsuario[0].SupervisorNivel, Wf.UltActualiz);
                    }
                }
            }
        }