/*        protected void ASPxGridView1_StartRowEditing(object sender, DevExpress.Web.Data.ASPxStartRowEditingEventArgs e)
        {
            string idUndFunc = e.EditingKeyValue.ToString();
            UnidadeFuncional undFunc = new UnidadeFuncional();
            undFunc = UndFuncionalCtrl.getUndFuncByID(idUndFunc);
            ((ASPxGridView)sender).JSProperties["cptxtID"] = idUndFunc;
            ((ASPxGridView)sender).JSProperties["cptxtUndFun"] = undFunc.unidFuncNome;
            ((ASPxGridView)sender).JSProperties["cpCodUndOrc"] = undFunc.UndOrc.Org.orgCodigo.ToString() + undFunc.UndOrc.undCodigo.ToString();
            ((ASPxGridView)sender).JSProperties["cpUndOrcText"] = undFunc.UndOrc.undNome;
            ((ASPxGridView)sender).JSProperties["cptxtSigla"] = undFunc.unidFuncSigla;
            ((ASPxGridView)sender).JSProperties["cptxtDataInicio"] = undFunc.unidFuncDataInicio.Year.ToString() + "," + (undFunc.unidFuncDataInicio.Month).ToString() + "," + undFunc.unidFuncDataInicio.Day.ToString();
            ((ASPxGridView)sender).JSProperties["cptxtDataFim"] = undFunc.unidFuncDataFim.Year.ToString() + "," + (undFunc.unidFuncDataFim.Month).ToString() + "," + undFunc.unidFuncDataFim.Day.ToString();
            ((ASPxGridView)sender).JSProperties["cptxtOP"] = "update";
            e.Cancel = true;
        }
        */
        protected void btnIncluir_Click(object sender, EventArgs e)
        {
            UnidadeFuncional undFunc = new UnidadeFuncional();

            if (Request.QueryString["id"] != null) {
                txtID.Text = Request.QueryString["id"].ToString();
            }
            if (!string.IsNullOrEmpty(txtID.Text))
            {
                undFunc.ID = int.Parse(txtID.Text);
            }
            undFunc.unidFuncNome = txtUnidadeFuncional.Value.ToString();
            undFunc.unidFuncDataInicio = DateTime.Parse(ASPxDateEdit1.Value.ToString());
            if (string.IsNullOrEmpty(ASPxDateEdit2.Text))
            {
                ASPxDateEdit2.Text = "01/01/0001";
            }
            undFunc.unidFuncDataFim = DateTime.Parse(ASPxDateEdit2.Value.ToString());
            undFunc.UndOrc.undCodigo = ASPxComboBox1.Value.ToString().Substring(2, 2);
            undFunc.UndOrc.Org.orgCodigo = ASPxComboBox1.Value.ToString().Substring(0, 2);
            undFunc.unidFuncSigla = txtSigla.Value.ToString();
            string op = txtOP.Text;

            if (Request.QueryString["op"].ToString() == "new")
            {
                op = "insert";
            }
            else
            {
                op = "update";
            }

            UndFuncionalCtrl.Persistir(undFunc, op);
            Response.Redirect("../Views/CRUDUndFunc.aspx");
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack && !IsCallback)
            {
                if (Request.QueryString["op"].ToString() == "edt")
                {
                    string idUndFunc = Request.QueryString["id"].ToString();
                    UnidadeFuncional undFunc = new UnidadeFuncional();
                    UndFuncionalCtrl controleUndFuncional = new UndFuncionalCtrl();
                    undFunc = controleUndFuncional.getUndFuncByID(idUndFunc);

                    //ASPxTextBox tb = new ASPxTextBox();
                    //tb.ID = "txtUnidadeFuncional";
                    //tb.Value = "Emerson";

                    ASPxComboBox1.Value = undFunc.UndOrc.Org.orgCodigo.ToString() + undFunc.UndOrc.undCodigo.ToString();
                    txtUnidadeFuncional.Value = undFunc.unidFuncNome;
                    txtSigla.Value = undFunc.unidFuncSigla;
                    ASPxDateEdit1.Value = undFunc.unidFuncDataInicio;
                    ASPxDateEdit2.Value = undFunc.unidFuncDataFim;
                }
            }
        }
        public UnidadeFuncional getUndFuncByID(string _undFunc)
        {
            FbConnection conn = Persist.GetConn.getConn();
            conn.Open();

            UnidadeFuncional undFunc = new UnidadeFuncional();
            string sql = "select * from webunidadefuncional uf join unidadeorcamentaria uo on uo.undcodigo = uf.unidorccod and uo.undcodorgao = uf.unidorcorg "+
                            "where UNIDFUNCID = " + _undFunc;
            FbCommand comando = new FbCommand(sql, conn);

            FirebirdSql.Data.FirebirdClient.FbDataReader DR = comando.ExecuteReader();
            while (DR.Read()) {
                undFunc.unidFuncNome = DR["UNIDFUNCNOME"].ToString();
                undFunc.UndOrc.undCodigo = DR["UNIDORCCOD"].ToString();
                undFunc.UndOrc.Org.orgCodigo = DR["UNIDORCORG"].ToString();
                undFunc.unidFuncDataInicio =DateTime.Parse(DR["UNIDFUNCDATAINICIO"].ToString());
                undFunc.ID = (int)DR["UNIDFUNCID"];
                if (!string.IsNullOrEmpty(DR["UNIDFUNCDATAFIM"].ToString()))
                {
                    undFunc.unidFuncDataFim = DateTime.Parse(DR["UNIDFUNCDATAFIM"].ToString());
                }
                undFunc.unidFuncSigla = DR["UNIDFUNCSIGLA"].ToString();
                undFunc.UndOrc.undNome = DR["UNDNOME"].ToString();
                if (!string.IsNullOrEmpty(DR["UNIDFUNCPERMITEENVIOPESSOA"].ToString()))
                {
                    undFunc.permiteenviopessoa = DR["UNIDFUNCPERMITEENVIOPESSOA"].ToString();
                }
                else {
                    undFunc.permiteenviopessoa = "0";
                }
            }
            DR.Close();
            comando.Dispose();
            conn.Close();
            //conn.Dispose();
            return undFunc;
        }
        public static string Persistir(UnidadeFuncional undFunc, string op)
        {
            string sql = "";
            string retorno = "";
            if (op.Equals("insert"))
            {
                AcessoDados.AcessoDados.abrirConn();
                string sqlGen = "select gen_id(GEN_WEBUNIDADEFUNCIONAL_ID,1) from rdb$database";
                FirebirdSql.Data.FirebirdClient.FbDataReader drGen = AcessoDados.AcessoDados.DataReader(sqlGen);
                while (drGen.Read())
                {
                    undFunc.ID = int.Parse(drGen["GEN_ID"].ToString());
                }
                drGen.Close();
                AcessoDados.AcessoDados.fecharConn();

                string sqlEx = "Select UNIDFUNCNOME, UNIDFUNCSIGLA " +
                                "FROM WEBUNIDADEFUNCIONAL " +
                                "WHERE " +
                                "(UNIDORCCOD = '" + undFunc.UndOrc.undCodigo + "' AND UNIDORCORG = '" + undFunc.UndOrc.Org.orgCodigo + "') AND (UNIDFUNCNOME = '" + undFunc.unidFuncNome + "' OR UNIDFUNCSIGLA = '" + undFunc.unidFuncSigla + "')";
                AcessoDados.AcessoDados.abrirConn();
                FirebirdSql.Data.FirebirdClient.FbDataReader DR = AcessoDados.AcessoDados.DataReader(sqlEx);
                int cont = 0;
                while(DR.Read()){
                    cont++;
                }
                DR.Close();
                AcessoDados.AcessoDados.fecharConn();
                if (cont == 0)
                {

                    if (undFunc.unidFuncDataFim.Equals("01/01/0001"))
                    {
                        sql = "Insert into WEBUNIDADEFUNCIONAL(UNIDFUNCID,UNIDFUNCNOME,UNIDORCCOD,UNIDORCORG,UNIDFUNCDATAINICIO,UNIDFUNCSIGLA)" +
                            "VALUES" +
                            "(" + undFunc.ID + ",'" + undFunc.unidFuncNome + "','" + undFunc.UndOrc.undCodigo + "','" + undFunc.UndOrc.Org.orgCodigo + "','" + undFunc.unidFuncDataInicio.ToShortDateString().Replace("/", ".") + "','" + undFunc.unidFuncSigla + "')";
                    }
                    else
                    {
                        sql = "Insert into WEBUNIDADEFUNCIONAL(UNIDFUNCID,UNIDFUNCNOME,UNIDORCCOD,UNIDORCORG,UNIDFUNCDATAINICIO,UNIDFUNCDATAFIM,UNIDFUNCSIGLA)" +
                            "VALUES" +
                            "(" + undFunc.ID + ",'" + undFunc.unidFuncNome + "','" + undFunc.UndOrc.undCodigo + "','" + undFunc.UndOrc.Org.orgCodigo + "','" + undFunc.unidFuncDataInicio.ToShortDateString().Replace("/", ".") + "','" + undFunc.unidFuncDataFim.ToShortDateString().Replace("/", ".") + "','" + undFunc.unidFuncSigla + "')";

                    }
                    retorno = AcessoDados.AcessoDados.executar(sql);
                }
            }
            else {
                if (undFunc.unidFuncDataFim.Equals(DateTime.Parse("01/01/0001 00:00:00")))
                {
                    sql = "Update WEBUNIDADEFUNCIONAL set " +
                                    "UNIDFUNCNOME='" + undFunc.unidFuncNome + "'," +
                                    "UNIDORCCOD = '" + undFunc.UndOrc.undCodigo + "'," +
                                    "UNIDORCORG = '" + undFunc.UndOrc.Org.orgCodigo + "'," +
                                    "UNIDFUNCDATAINICIO = '" + undFunc.unidFuncDataInicio.ToShortDateString().Replace("/", ".") + "'," +
                                    "UNIDFUNCDATAFIM = null,"+
                                    "UNIDFUNCSIGLA = '" + undFunc.unidFuncSigla + "' " +
                                    "where UNIDFUNCID = " + undFunc.ID;
                }
                else {
                    sql = "Update WEBUNIDADEFUNCIONAL set " +
                                    "UNIDFUNCNOME='" + undFunc.unidFuncNome + "'," +
                                    "UNIDORCCOD = '" + undFunc.UndOrc.undCodigo + "'," +
                                    "UNIDORCORG = '" + undFunc.UndOrc.Org.orgCodigo + "'," +
                                    "UNIDFUNCDATAINICIO = '" + undFunc.unidFuncDataInicio.ToShortDateString().Replace("/", ".") + "'," +
                                    "UNIDFUNCDATAFIM = '" + undFunc.unidFuncDataFim.ToShortDateString().Replace("/", ".") + "'," +
                                    "UNIDFUNCSIGLA = '" + undFunc.unidFuncSigla + "' " +
                                    "where UNIDFUNCID = " + undFunc.ID;
                }
                retorno = AcessoDados.AcessoDados.executar(sql);
            }
            return retorno;
        }
        public System.Data.DataTable getProximaUnidadeFuncionalByFluxoNova(string processoID, string idAssunto, string situacaoID, string undOrcID)
        {
            SituacaoCtrl controleSituacao = new SituacaoCtrl();
            Assunto controleAssunto = new Assunto();
            TramiteCtrl controleTramite = new TramiteCtrl();
            FluxoAssuntoCtrl controleFluxoAssunto = new FluxoAssuntoCtrl();

            string fluxoAtual = controleFluxoAssunto.getFluxoAtual(processoID);

            string unidCod = undOrcID.ToString().Substring(2, 2);
            string unidORG = undOrcID.ToString().Substring(0, 2);

            Situacao situacao = new Situacao();
            List<string> UnidadesFuncionais = new List<string>();

            string ordenacao = "";
            string sqlAssunto = "select * from webassunto where id = " + idAssunto; //Verifica se Assunto tem fluxo definido

            FbConnection conn = Persist.GetConn.getConn();
            conn.Open();
            FbCommand cmdAssunto = new FbCommand(sqlAssunto, conn);

            FirebirdSql.Data.FirebirdClient.FbDataReader drAssunto = cmdAssunto.ExecuteReader();
            while (drAssunto.Read())
            {
                ordenacao = drAssunto["EXIGEORDENACAO"].ToString();
            }
            drAssunto.Close();
            drAssunto.Dispose();
            cmdAssunto.Dispose();

            if (!ordenacao.Equals("1")) //Se não tem fluxo definido...
            {
                string sqlUND = "Select * from webunidadefuncional where unidorccod = " + unidCod + "  unidorcorg = " + unidORG;

                FbCommand cmdUND = new FbCommand(sqlUND, conn);

                FirebirdSql.Data.FirebirdClient.FbDataReader drUND = cmdUND.ExecuteReader();
                while (drUND.Read())
                {
                    UnidadesFuncionais.Add(drUND["UNIDFUNCID"].ToString());
                }
                drUND.Close();
                drUND.Dispose();
                cmdUND.Dispose();
            }
            else//Se tem fluxo definido...
            {
                if (controleSituacao.ehFinalDeFluxo(situacaoID)) //Se Situação selecionada indicar fim de fluxo
                {
                    UndFuncionalCtrl controleUndFuncional = new UndFuncionalCtrl();
                    string undFunc = controleUndFuncional.getUnidadeFuncionalArquivo();
                    UnidadesFuncionais.Add(undFunc);
                }
                else
                {
                    if (controleSituacao.TramiteTemSituacaoDeExcessao(controleTramite.RetornaUltimoTramite(processoID).ToString())) //Se o tramite indica um Fluxo que não seja natural (volta à um passo a frente)
                    {
                        string FlagSituacaoVolta = "";
                        string sqlExcVolta = "Select FLAG_SITUACAO_VOLTA from WEBTRAMITE WHERE ID =  " + controleTramite.RetornaUltimoTramite(processoID).ToString();

                        FbCommand cmdExcVolta = new FbCommand(sqlExcVolta, conn);

                        FirebirdSql.Data.FirebirdClient.FbDataReader drEX = cmdExcVolta.ExecuteReader();
                        while (drEX.Read())
                        {
                            FlagSituacaoVolta = drEX["FLAG_SITUACAO_VOLTA"].ToString();
                        }
                        drEX.Close();
                        drEX.Dispose();
                        cmdExcVolta.Dispose();

                        string sqlExc = "select * from unidadeorcamentaria uo " +
                                        "join webunidadefuncional uf on uf.unidorccod = uo.undcodigo and uf.unidorcorg = uo.undcodorgao " +
                                        "join webfluxoassunto fa on fa.idundfuncional = uf.unidfuncid " +
                                        "where fa.fluxoID = " + FlagSituacaoVolta + " and fa.idassunto = " + idAssunto;

                        FbCommand cmdExc = new FbCommand(sqlExc, conn);

                        FirebirdSql.Data.FirebirdClient.FbDataReader dr = cmdExc.ExecuteReader();

                        while (dr.Read())
                        {
                            UnidadesFuncionais.Add(dr["UNIDFUNCID"].ToString());
                        }
                        dr.Close();
                        dr.Dispose();
                        cmdExc.Dispose();

                    }
                    else
                    {
                        object situacaoRetorno = null;
                        object flagOrigem = null;

                        string sqlSituacao = "Select * from WEBSITUACAOPROCESSO WHERE ID = " + situacaoID; //Verifica situacao do processo selecionada pelo usuario

                        FbConnection connSit = Persist.GetConn.getConn();
                        FbCommand cmdSituacao = new FbCommand(sqlSituacao, connSit);
                        connSit.Open();
                        FirebirdSql.Data.FirebirdClient.FbDataReader drSituacao = cmdSituacao.ExecuteReader();
                        while (drSituacao.Read())
                        {
                            situacaoRetorno = drSituacao["FLUXOID"];
                            flagOrigem = drSituacao["FLAGORIGEM"];
                        }
                        connSit.Close();
                        drSituacao.Close();
                        drSituacao.Dispose();
                        cmdSituacao.Dispose();

                        if (!string.IsNullOrEmpty(flagOrigem.ToString()))
                        {
                            if (string.IsNullOrEmpty(situacaoRetorno.ToString()))
                            {
                                object unidFuncional = null;
                                string sql = "select first 1 idundfuncorigem from webtramite where idprocesso = " + processoID + "ORDER BY ID ASC";

                                FbCommand cmd = new FbCommand(sql, conn);

                                FirebirdSql.Data.FirebirdClient.FbDataReader dr = cmd.ExecuteReader();
                                while (dr.Read())
                                {
                                    unidFuncional = dr["IDUNDFUNCORIGEM"];
                                    UnidadesFuncionais.Add(dr["IDUNDFUNCORIGEM"].ToString());

                                }
                                dr.Close();
                                dr.Dispose();
                                cmd.Dispose();
                            }
                            else {//ALTERACAO 04062014
                                object unidFuncional = null;
                                string sql = "select (CASE WHEN IDUNDFUNCIONAL IS NULL THEN (select first 1 idundfuncorigem from webtramite where idprocesso = " + processoID + " ORDER BY ID ASC)"+
                                            " ELSE IDUNDFUNCIONAL END) IDUNDFUNCIONAL from webfluxoassunto WHERE FLUXOID = " + situacaoRetorno;
                                FbCommand cmd = new FbCommand(sql, conn);

                                FirebirdSql.Data.FirebirdClient.FbDataReader dr = cmd.ExecuteReader();
                                while (dr.Read())
                                {
                                    unidFuncional = dr["IDUNDFUNCIONAL"];
                                    UnidadesFuncionais.Add(dr["IDUNDFUNCIONAL"].ToString());

                                }
                                dr.Close();
                                dr.Dispose();
                                cmd.Dispose();
                            }
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(situacaoRetorno.ToString()))// Se não tem parametro de retorno definido -> Segue Fluxo normal
                            {
                                object unidFuncional = null;

                                string sqlFluxo = "select fluxoID, ordem," +
                                                    "(CASE WHEN idundfuncional IS NULL then (select first 1 TRA.idundfuncorigem from webtramite TRA where idprocesso = " + processoID + " order by id ASC) " +
                                                    "    ELSE " +
                                                    "        (select IDUNDFUNCIONAL from web_fluxo_filhos flf1 join webfluxoassunto flx1 on flx1.fluxoid = flf1.id_fluxo_filho " +
                                                    "            where flf1.id_fluxo_filho = flf.id_fluxo_filho and flf1.id_fluxo_pai = flf.id_fluxo_pai) END) UNDFUNC " +
                                                    "from web_fluxo_filhos flf join webfluxoassunto flx on flf.id_fluxo_filho = flx.fluxoid " +
                                                    "where flf.id_fluxo_pai = ( select first 1 FluxoID from webtramite tra where tra.idprocesso = " + processoID + " order by ID desc)";
                                //CORREÇÃO 21/03/2014
                                FbConnection connFlx = Persist.GetConn.getConn();
                                FbCommand cmd = new FbCommand(sqlFluxo, connFlx);
                                connFlx.Open();
                                FirebirdSql.Data.FirebirdClient.FbDataReader drFluxo = cmd.ExecuteReader();
                                while (drFluxo.Read())
                                {
                                    unidFuncional = drFluxo["UNDFUNC"];
                                    UnidadesFuncionais.Add(drFluxo["UNDFUNC"].ToString());

                                }
                                connFlx.Close();
                                drFluxo.Close();
                                drFluxo.Dispose();
                                cmd.Dispose();
                            }
                            else //Se a situacao selecionada tem paramtro de retorno definido -> Buscar a Unidade Funcional referente ao fluxo definido como retorno na situacao
                            {
                                object unidFuncional = null;

                                string sqlRetorno = "Select " +
                                                    "CASE WHEN IDUNDFUNCIONAL IS NULL THEN " +
                                                    "    (SELECT FIRST 1 TRA.idundfuncorigem FROM WEBTRAMITE TRA WHERE IDPROCESSO = " + processoID + ") " +
                                                    "    ELSE IDUNDFUNCIONAL end IDUNDFUNC " +
                                                    "from WEBFLUXOASSUNTO where FLUXOID = " + situacaoRetorno.ToString();
                                FbCommand cmd = new FbCommand(sqlRetorno, conn);

                                FirebirdSql.Data.FirebirdClient.FbDataReader drRet = cmd.ExecuteReader();
                                while (drRet.Read())
                                {
                                    unidFuncional = drRet["IDUNDFUNC"].ToString();
                                    UnidadesFuncionais.Add(drRet["IDUNDFUNC"].ToString());

                                }

                                drRet.Close();
                                drRet.Dispose();
                                cmd.Dispose();
                            }
                        }
                    }
                }
                conn.Close();
            }

            System.Data.DataTable table = new System.Data.DataTable();
            table.Columns.Add("UNIDFUNCID", typeof(string));
            table.Columns.Add("UNIDFUNCNOME", typeof(string));

            foreach (string UndFunc in UnidadesFuncionais)
            {
                UnidadeFuncional undFunc = new UnidadeFuncional();
                undFunc = getUndFuncByID(UndFunc);
                System.Data.DataRow[] drow = table.Select("UNIDFUNCID =" + undFunc.ID);
                table.Rows.Add(undFunc.ID, undFunc.unidFuncNome);
            }

            conn.Close();
            //conn.Dispose();

            controleSituacao = null;
            controleAssunto = null;
            controleTramite = null;
            controleFluxoAssunto = null;
            situacao = null;

            return table;
        }