public List<ReportRow> getComentariosProprio()
        {
            SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.Text;
            command.CommandText = "select * from Rep_v2_getComentariosProprio(" + _avaliado.PessoaID.ToString() + "," + _Projecto.ProjectoID.ToString() + "," + _proprio.PessoaID.ToString() + ") order by famindex, compindex";

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataSet();

            conn.Open();
            da.Fill(ds);
            conn.Close();

            List<ReportRow> result = new List<ReportRow>();
            String currCompetencia = "";
            ReportRow rrw = new ReportRow(2);
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                if (currCompetencia != Convert.ToString(dr["publicName"]))
                {
                    rrw = new ReportRow(2);
                    rrw.dados[0] = "BREAK";
                    result.Add(rrw);
                    currCompetencia = Convert.ToString(dr["publicName"]);
                    rrw = new ReportRow(2);
                    rrw.dados[0] = currCompetencia;
                    result.Add(rrw);
                }

                rrw = new ReportRow(2);
                rrw.dados[0] = "";
                rrw.dados[1] = Convert.ToString(dr["valor"]);

                result.Add(rrw);
            }

            return result;
        }
        public List<ReportRow> getGAP(String Grupo)
        {
            SortedList<float, MediasCompetencia> listaOrdenada = new SortedList<float, MediasCompetencia>();
            float soma = 0;
            float dummy;

            foreach (MediasCompetencia media in mediasCompetencias)
            {
                dummy = 0.0000000000F;

                if (listaOrdenada.Keys.Contains(media.diffItem[Grupo]))
                    while (listaOrdenada.Keys.Contains(media.diffItem[Grupo] + dummy))
                        dummy += 0.000001F;

                listaOrdenada.Add(media.diffItem[Grupo] + dummy, media);

                soma += media.diffItem[Grupo];
            }

            if (soma == 0) // não tem Todos // NÃO PODE ACONTECER
                return null;

            List<ReportRow> result = new List<ReportRow>();
            ReportRow row;
            float tempValue;

            for (int i = listaOrdenada.Count - 1; i >= 0; i--)
            {
                row = new ReportRow(4);
                row.dados[0] = competenciasLongo[listaOrdenada.Values[i].compID];

                tempValue = listaOrdenada.Values[i].mItem[ReportGroupCodes[0]];
                row.dados[1] = tempValue.ToString("0.00");

                tempValue = listaOrdenada.Values[i].mItem[Grupo];
                row.dados[2] = tempValue.ToString("0.00");

                tempValue = listaOrdenada.Values[i].diffItem[Grupo];

                if (tempValue > 0.5)
                    row.dados[3] = "F0F1";
                else if (tempValue < -0.5)
                    row.dados[3] = "F0F2";
                else
                    row.dados[3] = "F0F3";

                listaOrdenada.Values[i].setaT = row.dados[3];

                result.Add(row);
            }

            return result;
        }
        public List<ReportRow> getAvaliacaoDerailersExtendedOne2One(int competenciaID)
        {
            SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "Rep_v2_MediaGrupoNotadorDerailerOne2One";
            command.Parameters.AddWithValue("avaliadoID", _avaliado.PessoaID);
            command.Parameters.AddWithValue("competenciaID", competenciaID);
            command.Parameters.AddWithValue("projectoID", _Projecto.ProjectoID);
            command.Parameters.AddWithValue("proprioID", _proprio.PessoaID);

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataSet();

            conn.Open();
            da.Fill(ds);
            conn.Close();

            List<ReportRow> result = new List<ReportRow>();

            ReportRow rrw = new ReportRow(11);
            rrw.dados[0] = "Comp Crit";
            rrw.dados[1] = "S";
            rrw.dados[2] = "B";
            rrw.dados[3] = "P";
            rrw.dados[4] = "C";
            rrw.dados[5] = "O";
            rrw.dados[6] = "mS";
            rrw.dados[7] = "mB";
            rrw.dados[8] = "mP";
            rrw.dados[9] = "mC";
            rrw.dados[10] = "mO";

            result.Add(rrw);

            float val;
            String pergunta;
            int id;
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                id = Convert.ToInt32(dr["id"]);
                pergunta = perguntas[id];
                rrw = new ReportRow(11);
                //rrw.dados[0] = Convert.IsDBNull(dr["Name"]) ? "" : Convert.ToString(dr["Name"]);
                rrw.dados[0] = pergunta;
                val = Convert.IsDBNull(dr["S"]) ? -1 : (float)Convert.ToDouble(dr["S"]) == 0 ? -1 : (float)Convert.ToDouble(dr["S"]);
                rrw.dados[1] = val < 0 ? "*" : val >= 5.0 ? "+" : val < 4 ? "-" : "0";
                rrw.dados[6] = val.ToString("0.00");

                if (!Convert.IsDBNull(dr["B"]))
                {
                    val = Convert.IsDBNull(dr["B"]) ? -1 : (float)Convert.ToDouble(dr["B"]) == 0 ? -1 : (float)Convert.ToDouble(dr["B"]);
                    rrw.dados[2] = val < 0 ? "*" : val >= 5.0 ? "+" : val < 4 ? "-" : "0";
                    rrw.dados[7] = val.ToString("0.00");
                }
                else if (!Convert.IsDBNull(dr["P"]))
                {
                    val = Convert.IsDBNull(dr["P"]) ? -1 : (float)Convert.ToDouble(dr["P"]) == 0 ? -1 : (float)Convert.ToDouble(dr["P"]);
                    rrw.dados[2] = val < 0 ? "*" : val >= 5.0 ? "+" : val < 4 ? "-" : "0";
                    rrw.dados[7] = val.ToString("0.00");
                }
                else if (!Convert.IsDBNull(dr["C"]))
                {
                    val = Convert.IsDBNull(dr["C"]) ? -1 : (float)Convert.ToDouble(dr["C"]) == 0 ? -1 : (float)Convert.ToDouble(dr["C"]);
                    rrw.dados[2] = val < 0 ? "*" : val >= 5.0 ? "+" : val < 4 ? "-" : "0";
                    rrw.dados[7] = val.ToString("0.00");
                }
                else if (!Convert.IsDBNull(dr["O"]))
                {
                    val = Convert.IsDBNull(dr["O"]) ? -1 : (float)Convert.ToDouble(dr["O"]) == 0 ? -1 : (float)Convert.ToDouble(dr["O"]);
                    rrw.dados[2] = val < 0 ? "*" : val >= 5.0 ? "+" : val < 4 ? "-" : "0";
                    rrw.dados[7] = val.ToString("0.00");
                }

                rrw.dados[10] = val.ToString("0.00");
                result.Add(rrw);
            }
            return result;
        }
        public List<ReportRow> DB_getDADOS_GRAFICO(int competenciaID)
        {
            // procura a competência

            MediasCompetencia currMedia = null;
            List<ReportRow> result = new List<ReportRow>();
            ReportRow row;
            float tempValue;

            currMedia = getMediasCompetencia(competenciaID);

            foreach (MediasCompetencia media in mediasCompetencias)
            {
                if (media.compID == competenciaID)
                {
                    currMedia = media;
                    break;
                }
            }

            if (currMedia == null) return null;

            if (numOutros >= 3)
            {
                row = new ReportRow(2);
                row.dados[0] = "Outros";
                tempValue = currMedia.mO;
                row.dados[1] = tempValue.ToString("0.00");
                result.Add(row);
            }
            else
            {
                row = new ReportRow(2);
                row.dados[0] = "Outros (Ocultado)";
                tempValue = 0;
                row.dados[1] = tempValue.ToString("0.00");
                result.Add(row);
            }

            row = new ReportRow(2);
            row.dados[0] = "Pares";
            tempValue = currMedia.mP;
            row.dados[1] = tempValue.ToString("0.00");
            result.Add(row);

            row = new ReportRow(2);
            row.dados[0] = "Colab. Directos";
            tempValue = currMedia.mC;
            row.dados[1] = tempValue.ToString("0.00");
            result.Add(row);

            row = new ReportRow(2);
            row.dados[0] = "Chefia";
            tempValue = currMedia.mB;
            row.dados[1] = tempValue.ToString("0.00");
            result.Add(row);

            row = new ReportRow(2);
            row.dados[0] = "Todos";
            tempValue = currMedia.mT;
            row.dados[1] = tempValue.ToString("0.00");
            result.Add(row);

            row = new ReportRow(2);
            row.dados[0] = "Próprio";
            tempValue = currMedia.mS;
            row.dados[1] = tempValue.ToString("0.00");
            result.Add(row);

            return result;
        }
        //passado para o calculation standard
        public List<ReportRow> getAvaliacaoComportamentosCriticos(int competenciaID)
        {
            SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "Rep_v2_MediaGrupoNotadorComportamento";
            command.Parameters.AddWithValue("avaliadoID", _pessoaID);
            command.Parameters.AddWithValue("competenciaID", competenciaID);
            command.Parameters.AddWithValue("projectoID", _Projecto.ProjectoID);

            String OsGrupos = "";

            foreach (String s in this._Projecto.GroupsCodes)
            {
                OsGrupos += s + ",";
            }
            OsGrupos = OsGrupos.Substring(0, OsGrupos.Length - 1);

            command.Parameters.AddWithValue("Grupos", OsGrupos);
            command.Parameters.AddWithValue("Self", this._Projecto.GroupsCodes[0]);

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataSet();

            conn.Open();
            da.Fill(ds);
            conn.Close();

            List<ReportRow> result = new List<ReportRow>();

            ReportRow rrw = new ReportRow(this._Projecto.GroupsCodes.Length + 1);
            rrw.dados[0] = "Comp Crit";
            int i = 1;
            foreach (String s in this._Projecto.GroupsCodes)
            {
                rrw.dados[i++] = s;
            }
            result.Add(rrw);

            float val;
            String pergunta;
            int id;
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                id = Convert.ToInt32(dr["id"]);
                pergunta = perguntas[id];
                rrw = new ReportRow(this._Projecto.GroupsCodes.Length + 1);
                //rrw.dados[0] = Convert.IsDBNull(dr["Name"]) ? "" : Convert.ToString(dr["Name"]);
                rrw.dados[0] = pergunta;
                i = 1;
                foreach (String s in this._Projecto.GroupsCodes)
                {
                    val = Convert.IsDBNull(dr[s]) ? -1 : (float)Convert.ToDouble(dr[s]) == 0 ? -1 : (float)Convert.ToDouble(dr[s]);
                    rrw.dados[i++] = val < 0 ? "*" : val >= 5.0F ? "+" : val <= 3.0F ? "-" : "0";
                }
                result.Add(rrw);
            }
            return result;
        }
        public List<ReportRow> getAvaliacaoComportamentosCriticos_FracosFortes(int competenciaID)
        {
            SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "Rep_v2_Res_PercenContValCompCriticos";
            command.Parameters.AddWithValue("avaliadoID", _pessoaID);
            command.Parameters.AddWithValue("competenciaID", competenciaID);
            command.Parameters.AddWithValue("projectoID", _Projecto.ProjectoID);

            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataSet();

            conn.Open();
            da.Fill(ds);
            conn.Close();

            List<ReportRow> result = new List<ReportRow>();
            ReportRow rrw;
            String pergunta;
            float p0, p1, p2, p3, p4, p5, p6, fracos, fortes;
            int id;

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                rrw = new ReportRow(4);
                id = Convert.ToInt32(dr["perguntaID"]);
                pergunta = perguntas[id];
                rrw.dados[0] = pergunta;

                p0 = Convert.IsDBNull(dr["p0"]) ? -1 : (float)Convert.ToDouble(dr["p0"]);
                p1 = Convert.IsDBNull(dr["p1"]) ? -1 : (float)Convert.ToDouble(dr["p1"]);
                p2 = Convert.IsDBNull(dr["p2"]) ? -1 : (float)Convert.ToDouble(dr["p2"]);
                p3 = Convert.IsDBNull(dr["p3"]) ? -1 : (float)Convert.ToDouble(dr["p3"]);
                p4 = Convert.IsDBNull(dr["p4"]) ? -1 : (float)Convert.ToDouble(dr["p4"]);
                p5 = Convert.IsDBNull(dr["p5"]) ? -1 : (float)Convert.ToDouble(dr["p5"]);
                p6 = Convert.IsDBNull(dr["p6"]) ? -1 : (float)Convert.ToDouble(dr["p6"]);

                rrw.dados[1] = "";
                rrw.dados[2] = "";
                rrw.dados[3] = "";

                fracos = p1 + p2 + p3;
                fortes = p5 + p6;

                if (fracos <= 0.3 && fracos > 0.06)
                    rrw.dados[1] = "A";
                if (fracos > 0.3 && fracos <= 0.6)
                    rrw.dados[1] = "B";
                if (fracos > 0.6)
                    rrw.dados[1] = "C";

                if (fortes >= 0.70)
                {
                    rrw.dados[2] = "D";
                }

                rrw.dados[3] = (p0 * 100).ToString("0.00");

                result.Add(rrw);
            }

            return result;
        }
        internal List<ReportRow> getPerguntasAbertas()
        {
            _proprio = Pessoa.getPessoa(_pessoaID, "JC");
            SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.Text;
            command.CommandText = "select * from Rep_v2_getPerguntasAbertas(" + _pessoaID.ToString() + "," + _Projecto.ProjectoID.ToString() + ")";
            // TODO - Falta fazer este SP
            SqlDataAdapter da = new SqlDataAdapter(command);
            DataSet ds = new DataSet();

            conn.Open();
            da.Fill(ds);
            conn.Close();

            List<ReportRow> result = new List<ReportRow>();
            String currCompetencia = "";
            ReportRow rrw = new ReportRow(2);
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                if (currCompetencia != Convert.ToString(dr["TextoPergunta"]))
                {
                    rrw = new ReportRow(2);
                    rrw.dados[0] = "BREAK";
                    result.Add(rrw);
                    currCompetencia = Convert.ToString(dr["TextoPergunta"]);
                    rrw = new ReportRow(2);
                    rrw.dados[0] = DBHelper.ParseTextProprio(currCompetencia, _proprio, false);
                    result.Add(rrw);
                }

                rrw = new ReportRow(2);
                rrw.dados[0] = "";
                rrw.dados[1] = Convert.ToString(dr["valor"]);

                result.Add(rrw);
            }

            return result;
        }
        public List<ReportRow> DB_getGAP_GRAFICO_TODOS()
        {
            // ordenar a lista por ordem de GAP

            SortedList<float, MediasCompetencia> listaOrdenada = new SortedList<float, MediasCompetencia>();
            float soma = 0;
            float dummy;
            foreach (MediasCompetencia media in mediasCompetencias)
            {
                dummy = 0.0000000000F;

                if (listaOrdenada.Keys.Contains(media.diffT))
                    while (listaOrdenada.Keys.Contains(media.diffT + dummy))
                        dummy += 0.0000000001F;

                listaOrdenada.Add(media.diffT + dummy, media);

                soma += media.mT;
            }

            if (soma == 0) // não tem Todos // NÃO PODE ACONTECER
                return null;

            List<ReportRow> result = new List<ReportRow>();
            ReportRow row;
            float tempValue;

            for (int i = listaOrdenada.Count - 1; i >= 0; i--)
            {
                row = new ReportRow(4);
                row.dados[0] = competenciasLongo[listaOrdenada.Values[i].compID];
                tempValue = listaOrdenada.Values[i].mS;
                row.dados[1] = tempValue.ToString("0.00");
                tempValue = listaOrdenada.Values[i].mT;
                row.dados[2] = tempValue.ToString("0.00");
                tempValue = listaOrdenada.Values[i].diffT;
                row.dados[3] = tempValue.ToString("0.00");
                result.Add(row);
            }

            return result;
        }
        public List<ReportRow> getRankingGAP(String one, String two)
        {
            SortedList<float, MediasCompetencia> listaOrdenada = new SortedList<float, MediasCompetencia>();
            List<ReportRow> listaOne = null;
            List<ReportRow> listaTwo = null;
            float soma = 0;
            float dummy;
            float mediaOne = 0;
            float mediaTwo = 0;
            float mediaDiff;

            switch (one)
            {
                case "S":
                    listaOne = getRankingSELF();
                    break;
                case "B":
                    listaOne = getRankingBOSS();
                    break;
                case "C":
                    listaOne = getRankingCOLABORA();
                    break;
                case "O":
                    listaOne = getRankingOUTROS();
                    break;
                case "P":
                    listaOne = getRankingPARES();
                    break;
                case "T":
                    listaOne = getRankingTODOS();
                    break;
            }

            switch (two)
            {
                case "S":
                    listaTwo = getRankingSELF();
                    break;
                case "B":
                    listaTwo = getRankingBOSS();
                    break;
                case "C":
                    listaTwo = getRankingCOLABORA();
                    break;
                case "O":
                    listaTwo = getRankingOUTROS();
                    break;
                case "P":
                    listaTwo = getRankingPARES();
                    break;
                case "T":
                    listaTwo = getRankingTODOS();
                    break;
            }

            foreach (MediasCompetencia media in mediasCompetencias)
            {
                switch (one)
                {
                    case "S":
                        mediaOne = media.mS;
                        break;
                    case "B":
                        mediaOne = media.mB;
                        break;
                    case "C":
                        mediaOne = media.mC;
                        break;
                    case "O":
                        mediaOne = media.mO;
                        break;
                    case "P":
                        mediaOne = media.mP;
                        break;
                    case "T":
                        mediaOne = media.mT;
                        break;
                }

                switch (two)
                {
                    case "S":
                        mediaTwo = media.mS;
                        break;
                    case "B":
                        mediaTwo = media.mB;
                        break;
                    case "C":
                        mediaTwo = media.mC;
                        break;
                    case "O":
                        mediaTwo = media.mO;
                        break;
                    case "P":
                        mediaTwo = media.mP;
                        break;
                    case "T":
                        mediaTwo = media.mT;
                        break;
                }

                mediaDiff = mediaOne - mediaTwo;

                dummy = 0.0000000000F;

                if (listaOrdenada.Keys.Contains(mediaDiff))
                    while (listaOrdenada.Keys.Contains(mediaDiff + dummy))
                        dummy += 0.000001F;

                listaOrdenada.Add(mediaDiff + dummy, media);

                soma += mediaDiff;
            }

            if (soma == 0) // não tem Todos // NÃO PODE ACONTECER
                return null;

            List<ReportRow> result = new List<ReportRow>();
            ReportRow row;
            float tempValue;
            String[] resp;
            int ordem = 1;
            int count = 1;
            float currMedia = 1000;

            for (int i = listaOrdenada.Count - 1; i >= 0; i--)
            {
                if (currMedia != listaOrdenada.Values[i].mT)
                    ordem = count;
                row = new ReportRow(7);
                row.dados[0] = competenciasLongo[listaOrdenada.Values[i].compID];
                resp = getRanking(listaOne, row.dados[0]).Split(';');

                row.dados[1] = resp[0];
                row.dados[2] = resp[1];

                resp = getRanking(listaTwo, row.dados[0]).Split(';');

                row.dados[3] = resp[0];
                row.dados[4] = resp[1];

                row.dados[5] = (int.Parse(row.dados[2]) - int.Parse(row.dados[4])).ToString();

                row.dados[6] = listaOrdenada.Keys[i].ToString("0.00");

                result.Add(row);
                currMedia = listaOrdenada.Values[i].mT;
                count++;
            }

            return result;
        }
        public List<ReportRow> getRankingTODOS()
        {
            SortedList<float, MediasCompetencia> listaOrdenada = new SortedList<float, MediasCompetencia>();
            float soma = 0;
            float dummy;
            foreach (MediasCompetencia media in mediasCompetencias)
            {
                dummy = 0.0000000000F;

                if (listaOrdenada.Keys.Contains(media.mT))
                    while (listaOrdenada.Keys.Contains(media.mT + dummy))
                        dummy += 0.0000000001F;

                listaOrdenada.Add(media.mT + dummy, media);

                soma += media.mT;
            }

            if (soma == 0) // não tem Todos // NÃO PODE ACONTECER
                return null;

            List<ReportRow> result = new List<ReportRow>();
            ReportRow row;
            float tempValue;
            int ordem = 1;
            int count = 1;
            float currMedia = 1000;

            for (int i = listaOrdenada.Count - 1; i >= 0; i--)
            {
                if (currMedia != listaOrdenada.Values[i].mT)
                    ordem = count;
                row = new ReportRow(3);
                row.dados[0] = competenciasLongo[listaOrdenada.Values[i].compID];

                tempValue = listaOrdenada.Values[i].mT;
                row.dados[1] = tempValue.ToString("0.00");

                tempValue = ordem;
                row.dados[2] = tempValue.ToString("0");

                listaOrdenada.Values[i].rankT = ordem;

                result.Add(row);
                currMedia = listaOrdenada.Values[i].mT;
                count++;
            }

            return result;
        }
    public List<ReportRow> getAvaliacaoComportamentosCriticos_FracosFortes_3Fatores(int competenciaID)
    {
        SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "Rep_v2_Res_PercenContValCompCriticos";
        command.Parameters.AddWithValue("avaliadoID", _pessoaID);
        command.Parameters.AddWithValue("competenciaID", competenciaID);
        command.Parameters.AddWithValue("projectoID", _Projecto.ProjectoID);

        SqlDataAdapter da = new SqlDataAdapter(command);
        DataSet ds = new DataSet();

        conn.Open();
        da.Fill(ds);
        conn.Close();

        List<ReportRow> result = new List<ReportRow>();
        ReportRow rrw;
        String pergunta;
        float altos = 0, medios = 0, baixo = 0;
        float[] p;
        int id;
        int zero;

        String[] Valores;

        String StrEscala = _Projecto.getCurrentConfig("SCALE");

        if (StrEscala == "")
        {
            Valores = _Modelo.Scale.Split('|');
            //Escalas = _Modelo.ScaleDesc.Split('|');
        }
        else
        {
            String[] Escalas = StrEscala.Split('«');
            Valores = Escalas[0].Split('|');
            //Descricoes = Escalas[1].Split('|');
        }

        // o primeiro valor pode ser o NR, ou não
        int.TryParse(Valores[0], out zero);
        Valores[0] = zero.ToString();

        p = new float[Valores.Count()];

        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            altos = 0;
            // medios = 0;
            baixo = 0;

            rrw = new ReportRow(4);
            id = Convert.ToInt32(dr["perguntaID"]);
            pergunta = perguntas[id];
            rrw.dados[0] = pergunta;

            for (int i = 0; i < Valores.Count(); i++)
            {
                try
                {
                    p[i] = Convert.IsDBNull(dr["p" + i.ToString()]) ? -1 : (float)Convert.ToDouble(dr["p" + i.ToString()]);
                }
                catch
                {
                    p[i] = 0;
                }
            }

            rrw.dados[1] = "";
            rrw.dados[2] = "";
            rrw.dados[3] = "";

            for (int i = 1; i < Valores.Count(); i++)
            {
                if (i <= 3) // verificar se é o 1,2,3
                    baixo += p[i];
                else if (i >= 4) // verificar se é o 4,5
                    altos += p[i];

            }

            if (baixo >= 0.5)
                rrw.dados[1] = "C";   //VERMELHO
            if (baixo > 0.25 && baixo < 0.50)
                rrw.dados[1] = "B";   //AMARELO
            if (altos >= 0.75)
                rrw.dados[1] = "A";

            rrw.dados[3] = (p[0] * 100).ToString("0.00");

            result.Add(rrw);
        }

        return result;
    }
    public List<ReportRow> getAvaliacaoComportamentosCriticos_FracosFortes(int competenciaID)
    {
        SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "Rep_v2_Res_PercenContValCompCriticos";
        command.Parameters.AddWithValue("avaliadoID", _pessoaID);
        command.Parameters.AddWithValue("competenciaID", competenciaID);
        command.Parameters.AddWithValue("projectoID", _Projecto.ProjectoID);

        SqlDataAdapter da = new SqlDataAdapter(command);
        DataSet ds = new DataSet();

        conn.Open();
        da.Fill(ds);
        conn.Close();

        List<ReportRow> result = new List<ReportRow>();
        ReportRow rrw;
        String pergunta;
        float fracos = 0, fortes = 0;
        float[] p;
        int id;
        int zero;

        String[] Valores;

        String StrEscala = _Projecto.getCurrentConfig("SCALE");

        if (StrEscala == "")
        {
            Valores = _Modelo.Scale.Split('|');
            //Escalas = _Modelo.ScaleDesc.Split('|');
        }
        else
        {
            String[] Escalas = StrEscala.Split('«');
            Valores = Escalas[0].Split('|');
            //Descricoes = Escalas[1].Split('|');
        }

        // o primeiro valor pode ser o NR, ou não
        int.TryParse(Valores[0], out zero);
        Valores[0] = zero.ToString();

        p = new float[Valores.Count()];

        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            fracos = 0;
            fortes = 0;
            rrw = new ReportRow(4);
            id = Convert.ToInt32(dr["perguntaID"]);
            pergunta = perguntas[id];
            rrw.dados[0] = pergunta;

            for (int i = 0; i < Valores.Count(); i++)
            {
                try
                {
                    p[i] = Convert.IsDBNull(dr["p" + i.ToString()]) ? -1 : (float)Convert.ToDouble(dr["p" + i.ToString()]);
                }
                catch
                {
                    p[i] = 0;
                }
            }

            rrw.dados[1] = "";
            rrw.dados[2] = "";
            rrw.dados[3] = "";

            for (int i = 1; i < Valores.Count(); i++)
            {
                if (i <= VALOR_ESCALA_CUT_BAIXO)
                    fracos += p[i];
                else if (i >= VALOR_ESCALA_CUT_ALTO)
                    fortes += p[i];
            }

            /* Exem+plo escala de 6 */
            /*  DIST_BAD = 0.06F;
                DIST_MED_BOTTOM = 0.3F;
                DIST_MED_TOP = 0.6F;
                DIST_GOOD_BOTTOM = 0.7F;
             */

            if (fracos <= DIST_MED_BOTTOM /*0.3*/ && fracos > DIST_BAD /*0.06*/)
                rrw.dados[1] = "A";
            if (fracos > DIST_MED_BOTTOM /*0.3*/ && fracos <= DIST_MED_TOP /*0.6*/)
                rrw.dados[1] = "B";
            if (fracos > DIST_MED_TOP /*0.6*/)
                rrw.dados[1] = "C";

            if (fortes >= DIST_GOOD_BOTTOM  /*0.70 */)
            {
                rrw.dados[2] = "D";
            }

            rrw.dados[3] = (p[0] * 100).ToString("0.00");

            result.Add(rrw);
        }

        return result;
    }
    public List<ReportRow> DB_getDADOS_GRAFICO_SKILL(int competenciaID)
    {
        // procura a competência

        MediasCompetencia currMedia = null;
        List<ReportRow> result = new List<ReportRow>();
        ReportRow row;
        float tempValue;

        currMedia = getMediasCompetencia(competenciaID);

        foreach (MediasCompetencia media in mediasCompetencias)
        {
            if (media.compID == competenciaID)
            {
                currMedia = media;
                break;
            }
        }

        if (currMedia == null) return null;

        // Primeiro é o self grupo 0
        // depois o total
        // depois o grupo 1 a 4
        // como é um gráfico deste tipo tem de entrar ao contrário
        // as descrições têm de ser a longas

        List<String> keys = new List<string>();
        keys.Add(ReportGroupCodes[0]);
        keys.Add("T");

        for (int i = 1; i < ReportGroupCodes.Count(); i++)
            if (!keys.Contains(ReportGroupCodes[i]))
                keys.Add(ReportGroupCodes[i]);

        foreach (String s in keys)
        {
            if (s == ReportGroupCodes[0])
            {
                row = new ReportRow(2);
                row.dados[0] = currMedia.Description[s];
                tempValue = currMedia.mItem[s];
                row.dados[1] = tempValue.ToString("0.00");
                result.Add(row);
            }
            else if (countItem[s] != 0)
            {
                row = new ReportRow(2);
                row.dados[0] = currMedia.Description[s];
                tempValue = currMedia.mItem[s];
                row.dados[1] = tempValue.ToString("0.00");
                result.Add(row);
            }
        }

        // o nome da competência para colocar no titulo do gráfico
        row = new ReportRow(2);
        row.dados[0] = competenciasLongo[competenciaID];
        row.dados[1] = "";
        result.Add(row);

        return result;
    }
    public List<ReportRow> getRankingGROUP(String group)
    {
        SortedList<float, MediasCompetencia> listaOrdenada = new SortedList<float, MediasCompetencia>();
        float soma = 0;
        float dummy;
        foreach (MediasCompetencia media in mediasCompetencias)
        {
            dummy = 0.0000000000F;

            if (listaOrdenada.Keys.Contains(media.mItem[group]))
                while (listaOrdenada.Keys.Contains(media.mItem[group] + dummy))
                    dummy += 0.00000001F;

            listaOrdenada.Add(media.mItem[group] + dummy, media);

            soma += media.mItem[group];
        }

        if (soma == 0)
            return null;

        List<ReportRow> result = new List<ReportRow>();
        ReportRow row;
        float tempValue;
        int ordem = 1;
        int count = 1;
        float currMedia = 1000;

        for (int i = listaOrdenada.Count - 1; i >= 0; i--)
        {
            if (currMedia != listaOrdenada.Values[i].mItem[group])
                ordem = count;
            row = new ReportRow(3);
            row.dados[0] = competenciasLongo[listaOrdenada.Values[i].compID];

            tempValue = listaOrdenada.Values[i].mItem[group]; // .mB; média deste grupo
            row.dados[1] = tempValue.ToString("0.00");

            tempValue = ordem;                                  // a ordem em que ficou
            row.dados[2] = tempValue.ToString("0");

            listaOrdenada.Values[i].rankItem.Add(group, ordem); // rankB = ordem; guardo a ordem para uso futuro

            result.Add(row);
            currMedia = listaOrdenada.Values[i].mItem[group];
            count++;
        }

        return result;
    }
    public List<ReportRow> getComentarios(String langCode, String qualidade)
    {
        SqlConnection conn = new SqlConnection(DBHelper.ConnectionString);
        SqlCommand command = new SqlCommand();
        command.Connection = conn;
        command.CommandType = CommandType.Text;
        command.CommandText = "select * from Rep_v2_getComentariosGroup(" + _pessoaID.ToString() + "," + _Projecto.ProjectoID.ToString() + ",'" + qualidade + "') order by famindex, compindex";

        SqlDataAdapter da = new SqlDataAdapter(command);
        DataSet ds = new DataSet();

        conn.Open();
        da.Fill(ds);
        conn.Close();

        List<ReportRow> result = new List<ReportRow>();
        int currCompetencia = -1;
        ReportRow rrw = new ReportRow(2);
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            if (currCompetencia != Convert.ToInt32(dr["ID_Competencia"]))
            {
                rrw = new ReportRow(2);
                rrw.dados[0] = "BREAK";
                result.Add(rrw);
                currCompetencia = Convert.ToInt32(dr["ID_Competencia"]);
                rrw = new ReportRow(2);
                rrw.dados[0] = currCompetencia.ToString();
                result.Add(rrw);
            }

            rrw = new ReportRow(2);
            rrw.dados[0] = "";
            rrw.dados[1] = Convert.ToString(dr["valor"]);

            result.Add(rrw);
        }

        return result;
    }