Esempio n. 1
0
        public void SortearProximaLista(Action <string> updateStatus, Action <int> updateProgress, Action <string> logText, int?sementePersonalizada = null)
        {
            updateStatus("Iniciando sorteio...");

            Lista proximaLista = CarregarProximaLista();

            if (proximaLista == null)
            {
                throw new Exception("Não existem listas disponíveis para sorteio.");
            }

            double quantidadeAtual = 0;
            double quantidadeTotal = Math.Min(proximaLista.Quantidade, (int)proximaLista.CandidatosDisponiveis);

            string fonteSemente = "PERSONALIZADA";
            int    semente      = (sementePersonalizada == null) ? ObterSemente(ref fonteSemente) : (int)sementePersonalizada;

            ExecuteNonQuery(
                "UPDATE LISTA SET SORTEADA = 1, SEMENTE_SORTEIO = @SEMENTE_SORTEIO, FONTE_SEMENTE = @FONTE_SEMENTE WHERE ID_LISTA = @ID_LISTA",
                new SqlCeParameter("SEMENTE_SORTEIO", semente),
                new SqlCeParameter("FONTE_SEMENTE", fonteSemente),
                new SqlCeParameter("ID_LISTA", proximaLista.IdLista)
                );
            Random random = new Random(semente);

            string       queryGrupoSorteio   = @"
                SELECT TOP(1) CANDIDATO_LISTA.CLASSIFICACAO AS CLASSIFICACAO, COUNT(*) AS QUANTIDADE
                FROM CANDIDATO_LISTA INNER JOIN CANDIDATO ON CANDIDATO_LISTA.ID_CANDIDATO = CANDIDATO.ID_CANDIDATO
                WHERE CANDIDATO_LISTA.ID_LISTA = @ID_LISTA AND CANDIDATO_LISTA.DATA_CONTEMPLACAO IS NULL AND CANDIDATO.CONTEMPLADO = 0
                GROUP BY CANDIDATO_LISTA.CLASSIFICACAO
                ORDER BY CANDIDATO_LISTA.CLASSIFICACAO
            ";
            SqlCeCommand commandGrupoSorteio = CreateCommand(queryGrupoSorteio);

            commandGrupoSorteio.Parameters.AddWithValue("ID_LISTA", proximaLista.IdLista);
            commandGrupoSorteio.Prepare();

            string       queryCandidatosGrupo   = @"
                SELECT CANDIDATO_LISTA.SEQUENCIA, CANDIDATO.ID_CANDIDATO, CANDIDATO.CPF, CANDIDATO.NOME
                FROM CANDIDATO_LISTA INNER JOIN CANDIDATO ON CANDIDATO_LISTA.ID_CANDIDATO = CANDIDATO.ID_CANDIDATO
                WHERE CANDIDATO_LISTA.ID_LISTA = @ID_LISTA AND CANDIDATO_LISTA.DATA_CONTEMPLACAO IS NULL AND CANDIDATO.CONTEMPLADO = 0 AND CANDIDATO_LISTA.CLASSIFICACAO = @CLASSIFICACAO
                ORDER BY CANDIDATO_LISTA.SEQUENCIA
            ";
            SqlCeCommand commandCandidatosGrupo = CreateCommand(queryCandidatosGrupo);

            commandCandidatosGrupo.Parameters.AddWithValue("ID_LISTA", proximaLista.IdLista);
            commandCandidatosGrupo.Parameters.AddWithValue("CLASSIFICACAO", -1);
            commandCandidatosGrupo.Prepare();

            GrupoSorteio grupoSorteio = null;

            for (int i = 1; i <= proximaLista.Quantidade; i++)
            {
                if (grupoSorteio == null || grupoSorteio.Quantidade < 1)
                {
                    updateStatus("Carregando próximo grupo de sorteio.");
                    using (SqlCeResultSet resultSet = commandGrupoSorteio.ExecuteResultSet(ResultSetOptions.None)) {
                        if (resultSet.Read())
                        {
                            grupoSorteio = new GrupoSorteio {
                                Classificacao = resultSet.GetInt32(resultSet.GetOrdinal("CLASSIFICACAO")),
                                Quantidade    = resultSet.GetInt32(resultSet.GetOrdinal("QUANTIDADE"))
                            };
                        }
                        else
                        {
                            grupoSorteio = null;
                        }
                    }
                    if (grupoSorteio != null)
                    {
                        commandCandidatosGrupo.Parameters["CLASSIFICACAO"].Value = grupoSorteio.Classificacao;
                        using (SqlCeResultSet resultSet = commandCandidatosGrupo.ExecuteResultSet(ResultSetOptions.None)) {
                            while (resultSet.Read())
                            {
                                CandidatoGrupo candidato = new CandidatoGrupo {
                                    Sequencia   = resultSet.GetInt32(resultSet.GetOrdinal("SEQUENCIA")),
                                    IdCandidato = resultSet.GetInt32(resultSet.GetOrdinal("ID_CANDIDATO")),
                                    Cpf         = resultSet.GetDecimal(resultSet.GetOrdinal("CPF")),
                                    Nome        = resultSet.GetString(resultSet.GetOrdinal("NOME"))
                                };
                                grupoSorteio.Candidatos.Add(candidato.Sequencia, candidato);
                            }
                        }
                    }
                }

                if (grupoSorteio == null)
                {
                    break;
                }
                else
                {
                    updateStatus($"Sorteando entre o grupo de classificação \"{grupoSorteio.Classificacao}\": {quantidadeTotal - quantidadeAtual} vagas restantes.");
                }

                int            indiceSorteado    = (grupoSorteio.Quantidade == 1) ? 0 : random.Next(0, grupoSorteio.Quantidade);
                CandidatoGrupo candidatoSorteado = grupoSorteio.Candidatos.Skip(indiceSorteado).Take(1).First().Value;
                grupoSorteio.Candidatos.Remove(candidatoSorteado.Sequencia);

                ExecuteNonQuery(
                    "UPDATE CANDIDATO SET CONTEMPLADO = 1 WHERE ID_CANDIDATO = @ID_CANDIDATO",
                    new SqlCeParameter("ID_CANDIDATO", candidatoSorteado.IdCandidato)
                    );

                ExecuteNonQuery(
                    @"
                        UPDATE CANDIDATO_LISTA
                        SET SEQUENCIA_CONTEMPLACAO = @SEQUENCIA_CONTEMPLACAO, DATA_CONTEMPLACAO = @DATA_CONTEMPLACAO
                        WHERE ID_CANDIDATO = @ID_CANDIDATO AND ID_LISTA = @ID_LISTA
                    ",
                    new SqlCeParameter("SEQUENCIA_CONTEMPLACAO", i),
                    new SqlCeParameter("DATA_CONTEMPLACAO", DateTime.Now),
                    new SqlCeParameter("ID_CANDIDATO", candidatoSorteado.IdCandidato),
                    new SqlCeParameter("ID_LISTA", proximaLista.IdLista)
                    );

                grupoSorteio.Quantidade--;
                quantidadeAtual++;

                updateProgress((int)((quantidadeAtual / quantidadeTotal) * 100));
                logText(string.Format("{0:0000} - {1:000'.'000'.'000-00} - {2}", i, candidatoSorteado.Cpf, candidatoSorteado.Nome.ToUpper()));
            }

            updateStatus("Sorteio da lista finalizado!");
        }
Esempio n. 2
0
        private void ClassificarListaSorteio(int idUltimaLista, string tipoOrdenacao)
        {
            List <CandidatoGrupo> candidatosLista = new List <CandidatoGrupo>();

            using (SqlCeCommand command = CreateCommand("SELECT * FROM CANDIDATO_LISTA INNER JOIN CANDIDATO ON CANDIDATO_LISTA.ID_CANDIDATO = CANDIDATO.ID_CANDIDATO WHERE CANDIDATO_LISTA.ID_LISTA = @ID_LISTA")) {
                command.Parameters.AddWithValue("ID_LISTA", idUltimaLista);
                using (SqlCeResultSet resultSet = command.ExecuteResultSet(ResultSetOptions.None)) {
                    while (resultSet.Read())
                    {
                        candidatosLista.Add(new CandidatoGrupo {
                            IdCandidato         = resultSet.GetInt32(resultSet.GetOrdinal("ID_CANDIDATO")),
                            Cpf                 = resultSet.GetDecimal(resultSet.GetOrdinal("CPF")),
                            Nome                = resultSet.GetString(resultSet.GetOrdinal("NOME")).ToUpper().TrimEnd(),
                            QuantidadeCriterios = resultSet.GetInt32(resultSet.GetOrdinal("QUANTIDADE_CRITERIOS"))
                        });
                    }
                }
            }

            CandidatoGrupo[] candidatosOrdenados;

            if (tipoOrdenacao == "SIMPLES")
            {
                candidatosOrdenados = candidatosLista
                                      .OrderByDescending(c => c.QuantidadeCriterios)
                                      .ThenBy(c => c.Nome)
                                      .ThenByDescending(c => c.Cpf)
                                      .ToArray();
            }

            else if (tipoOrdenacao == "COMPOSTO")
            {
                candidatosOrdenados = candidatosLista
                                      .OrderByDescending(c => c.QuantidadeCriteriosComposta)
                                      .ThenBy(c => c.Nome)
                                      .ThenByDescending(c => c.Cpf)
                                      .ToArray();
            }

            else
            {
                candidatosOrdenados = candidatosLista
                                      .OrderBy(c => c.Nome)
                                      .ThenByDescending(c => c.Cpf)
                                      .ToArray();
            }

            CandidatoGrupo candidatoAnterior = null;
            int            sequencia         = 1;
            int            classificacao     = 1;

            SqlCeCommand updateCommand = CreateCommand(
                "UPDATE CANDIDATO_LISTA SET SEQUENCIA = @SEQUENCIA, CLASSIFICACAO = @CLASSIFICACAO WHERE ID_LISTA = @ID_LISTA AND ID_CANDIDATO = @ID_CANDIDATO",
                new SqlCeParameter("SEQUENCIA", -1),
                new SqlCeParameter("CLASSIFICACAO", -1),
                new SqlCeParameter("ID_LISTA", idUltimaLista),
                new SqlCeParameter("ID_CANDIDATO", -1)
                );

            updateCommand.Prepare();

            foreach (CandidatoGrupo candidato in candidatosOrdenados)
            {
                if (candidatoAnterior != null)
                {
                    if (tipoOrdenacao == "SIMPLES" && candidato.QuantidadeCriterios != candidatoAnterior.QuantidadeCriterios)
                    {
                        classificacao++;
                    }
                    else if (tipoOrdenacao == "COMPOSTO" && candidato.QuantidadeCriteriosComposta != candidatoAnterior.QuantidadeCriteriosComposta)
                    {
                        classificacao++;
                    }
                }

                updateCommand.Parameters["SEQUENCIA"].Value     = sequencia;
                updateCommand.Parameters["CLASSIFICACAO"].Value = classificacao;
                updateCommand.Parameters["ID_CANDIDATO"].Value  = candidato.IdCandidato;
                updateCommand.ExecuteNonQuery();

                sequencia++;
                candidatoAnterior = candidato;
            }
        }