Executando verificação de segurança...
4

Criar uma URNA de votação em uma linguagem pouco conhecida com requisitos para rodar muito limitado é possível?

Isso é possível? Você conhece a linguagem de scripts para windows chamada AUTOIT?

Pois é eu tinha um problema de criar uma urna para votação especificamente para eleição anual da CIPA (Comissão interna de Prevenção de Acidentes), porém precisava funcionar em um notebook velho com windows 7 32bits que tinha apenas 2Gb de memória RAM 80Gb de HD e não podia ter conexão com internet porque várias unidades (UPAs, Postos de Saúde e Hospitais) não disponham de wifi ou ponto de rede que pudesse ser utilizado.

Desse problema surgiu esse meu projeto que disponibilizo o github https://danielgianni.github.io/urnaCIPA/

Mas como foi tudo construído de forma a utilizar mínimos recursos e usando uma linguagem tão pouco conhecida, fiz um detalhamento do projeto afim de que pudesse ser utilizado mesmo por quem não tem conhecimento de programação e principalmente que pudesse ser adaptado para outros tipos de votação. Inclusive esse projeto já tem uma falha que é permitir com um pouco de conhecimento inferir a ordem de votação olhando os registros nas tabelas. Há explicação de como corrigir mas não foi implementada.

Vou compartilhar abaixo com vocês esse detalhamento e em breve volto para indicar uma nova versão que meu amigo está desenvolvendo agora em Python que usa 1 notebook com windows 10, 1 monitor adicionar para ser o display da urna e um teclado numérico USB para servir de entrada de dados da votação.

Funcionalidades do urnaCIPA

  • Isolamento: não depende de internet e rede para funcionar.
  • Portabilidade: pode ser executado diretamente em um pendrive.
  • Flexibilidade: não precisa de instalação, funciona diretamente clicando no executável.
  • Simplicidade: utiliza apenas 3 telas.
  • Compatível com Windows a partir do Windows 7 32 bits.
  • Utiliza softwares 100% gratuitos;
  • Possui licença MIT (gratuita e sem restrições modificação ou comercialização).;
  • Permite importar base de dados de ELEITORES e CANDIDATOS através de arquivos CSV (separados por vírgulas).
  • Relatório de totalização de votos automaticamente para impressão após encerramento da eleição.
  • Arquivo texto de configuração simplificado: Ano da Eleição, Nome da Empresa, Senha de Início de votação e Senha de Término da Votação.
  • Banco de Dados SQLite sem necessidade de instalação de gerenciadores de banco de dados ou configurações complexas.

Requisitos

  • Windows 7 32 bits ou superior (não foi testado no Windows XP).
  • 32mb de memória ram.
  • 4mb de espaço em disco.
  • Processador compatível com Windows 7 32 bits.

Explicação do conceito

Problema a ser solucionado

Desenvolver um sistema que permita eleitores votar em candidatos na Eleição da CIPA de uma empresa qualquer e que forneça de forma automática ao término da votação ge emitir um relatório totalizador da contagem de votos de forma decrescente.

Abordagem escolhida

  • Utilizar um banco de dados que dispense configurações complexas mas que permita utilizar comandos SQL.
  • Permitir a importação de relação de candidatos e eleitores em formato de arquivo texto (CSV - separado por vírgulas) para o banco de dados, evitando manipulação dessas informações durante a votação.
  • Gerar automaticamente um relatório totalizador com a contagem de votos de cada candidato em ordem decrescente após finalização da eleição.
  • Pesquisar dados dos eleitores pelo CPF.
  • Pesquisar dados dos candidatos pelo número de 2 digitos de cada candidato.
  • Utilizar no máximo de 3 telas:
    • Uma tela para digitação de um código de início e término das votações.
    • Uma tela com estatística da votação em tempo real e com pesquisa dos dados do eleitor por CPF com botão para autorizar o eleitor votar.
    • Uma tela onde o eleitor digita o número de dois dígitos do candidato, visualiza os dados do candidato e confirma o voto clicando em um botão.
  • Permitir fácil configuração e utilização.

Pontos a serem alcançados

  • Eliminar uso de sons e imagens para otimizar o desempenho do sistema consumindo assim o mínimo de recursos de hardware possível.
  • Manter as instruções na tela o mais simples possível considerando legibilidade e clareza das informações.

Pontos a serem respeitados

  • Um eleitor possui um CPF único com 11 dígitos numéricos.
  • Um candidato possui um Número Único com 2 dígitos numéricos.
  • Senha de início e término da votação deve ser numérica com 4 digitos.
  • Um eleitor pode votar um única vez e deverá ser excluído do banco de dados.
    • Na versão inicial 1.0 optou-se por registrar em uma tabela no banco de dados o número de matrícula de cada eleitor que votou para fins de auditoria interna no banco de dados se necessário, antes da exclusão do eleitor da tabela de eleitores após o mesmo já ter votado em um candidato. Não foi implementada interface de consulta dessa tabela.
  • Um cadidato pode não ser votado ou votado por um ou mais eleitores.
  • Haverá uma tabela no banco de dados para registrar cada voto individualmente.
  • Não poderá ser liberada votação para um CPF que não tenha sido importado para o banco de dados ou que já tenha votado.
  • Não poderá ser considerado voto para o número de um candidato que não tiver sido importado para o banco de dados.

Tecnologias utilizadas

Estrutura dos Dados dos Arquivos Texto

Arquivo Texto de Eleitores

eleitores.csv

Nome,Codigo,CPF,Cargo,Departamento
ACACIA ALVES,666666,123.051.218/01,Auxiliar Técnico,Empresa de Teste Matriz
ACALANDRA CORREIA,777777,939.211.748/12,Caixa,Empresa de Teste Matriz
ADRIANA ALVES,888888,111.198.108/22,Gerente,Empresa de Teste Filial

Formato UTF-8 sem BOM

Arquivo Texto de Candidatos

candidatos.csv

Numero,Matricula,Nome,Funcao,Unidade
01,111111,José Pedro,Porteiro,Empresa de Teste Matriz
02,222222,Gisele Souza,Auxiliar Administrativo,Empresa de Teste Filial
03,333333,Patrícia Maria,Gerente,Empresa de Teste Matriz

Formato UTF-8 sem BOM

Arquivo Texto de Configuração

configuracao.ini

[Urna]
Banco de Dados da Urna        = cipa2020.db3
Senha para Iniciar Eleicao    = 9898
Senha para Terminar Eleicao   = 2121
Nome da Empresa               = Empresa de Teste
Ano da CIPA                   = 2020

Formato ANSI

Arquivos internos de apoio

eleitores.sql

drop table eleitores;
.separator ","
.import eleitores.csv eleitores

Formato UTF-8 sem BOM

candidatos.sql

drop table candidatos;
.separator ","
.import candidatos.csv candidatos

Formato UTF-8 sem BOM

votacao.sql

drop table votacao;
CREATE TABLE votacao (
    id     INTEGER  PRIMARY KEY
                    UNIQUE
                    NOT NULL,
    numero CHAR (2) NOT NULL
);

Formato UTF-8 sem BOM

votaram.sql

drop table votaram;
CREATE TABLE votaram (
    id     INTEGER  PRIMARY KEY
                    UNIQUE
                    NOT NULL,
    matricula TEXT NOT NULL
                    UNIQUE
);

Formato UTF-8 sem BOM

criaBanco.bat

@echo off

if "%1"=="" goto ops

sqlite3.exe %1 < candidatos.sql
sqlite3.exe %1 < eleitores.sql
sqlite3.exe %1 < votacao.sql
sqlite3.exe %1 < votaram.sql

goto fim

:ops

echo digite criaBanco.bat nomeBanco.db3

:fim

echo arquivos importados...

Formato UTF-8 sem BOM

Para criar o banco de dados na pasta urnaCIPA abra um prompt de comando do MS-DOS ou um prompt do powershell e digite criaBanco.bat cipa2020.db3

tela1.kxf tela2.kxf tela3.kxf

Esses arquivos são os arquivos utilizados pelo KODA para carregar cada tela para edição visual da interface gráfica.

Estrutura do Banco de Dados

cipa2020.db3

tabela candidatos

ColunaTipoExplicação Não faz parte do banco de dados
NumeroTEXTnúmero do candidato que o eleitor irá digitar para votar com 2 dígitos
MatriculaTEXTnúmero de matrícula do candidato no departamento pessoal
NomeTEXTnome completo do candidato
FuncaoTEXTCargo ou função do candidato na empresa
UnidadeTEXTSetor ou unidade da empresa

tabela eleitores

ColunaTipoExplicação Não faz parte do banco de dados
NomeTEXTnome completo do eleitor
CodigoTEXTnúmero de matrícula do eleitor no departamento pessoal
CPFTEXTCPF do eleitor pode ser no formato 999.999.999/99
CargoTEXTCargo ou função do eleitor na empresa
DepartamentoTEXTDepartamento ou unidade do eleitor

tabela eleitores

ColunaTipoExplicação Não faz parte do banco de dados
idINTEGERautoincremento da tabela
PRIMARY KEYchave primária
UNIQUEúnico
NOT NULLnão nulo
numeroCHAR(2)número do candidato votado com 2 dígitos
NOT NULLnão nulo

tabela votaram

ColunaTipoExplicação Não faz parte do banco de dados
idINTEGERautoincremento
PRIMARY KEYchave primária
UNIQUEúnico
NOT NULLnão nulo
matriculaTEXTnúmero de matrícula no departamento pessoal do eleitor que já votos
NOT NULLnão nulo
UNIQUEúnico

Nota de esclarecimento sobre problema na modelagem do banco de dados

A modelagem do banco de dados utilizando esse formato, facilitou a programação da lógica da votação e contagem de votos, porém gera um problema de segurança da anonimização do votos uma vez que é possível com cruzamento de dados internos no banco de dados se exportados, verificar qual o eleitor votou em cada candidato.

Uma solução para essa questão é a mudança da lógica da inserção do votos, ao invés de ter o voto depositado individualmente na tabela votacao, deveria haver na tabela candidatos, um campo votos, onde a cada voto seria feita a pesquisa SQL pelo número do candidato, lido o valor do campo votos, somado 1 voto e atualizado o campo da tabela candidatos. Com isso não seria necessário ter a tabela votacao e ainda poderia ser mantida para critério de log e auditoria a tabela votaram.

Fluxo de funcionamento

    graph TD
    A[Executa urnaCIPA] --> B[Digitou código válido de início ou término de votação?]
    B --> |sim| C[Código de terminar votação?]
    B --> |não| B
    B --> |sim| D[Código de iniciar votação?]

    C -->|sim| F[Excluir eleitores do banco de dados]
    C -->|não| B
 
    D -->|sim| E[Tela pesquisa de eleitor]
    D -->|não| B
 
    E --> J[Mostrar contagens de votos, eleitores e candidatos]

    F --> G[Fazer contagem de dados]
    G --> H[Abrir navegador e exibir Relatório]
    H --> I[Fechar urnaCIPA]

    J --> L[Consultar CPF eleitor]
    L -->|erro| L
    L --> M[Mostrar dados eleitor]
    M --> N[Liberar votação]
    N --> O[Tela pesquisar candidato]

    O --> P[Consultar número candidato]    
    P -->|erro| P
    P -->|ok| Q[Mostrar dados candidato]

    Q --> R[Votar no candidato]   
    R --> S[Excluir eleitor da tabela eleitores]
    S --> T[Inserir matrícula do eleitor na tabela votaram]
    T --> U[Inserir número do candidato na tabela votacao]
    U -->|finalizado| E

Orientações Finais

Verifique sempre os comentários no código-fonte para esclarecer dúvidas, o desenho da interface gráfica é feito no KODA depois copia-se e cola o código gerado pelo KODA dentro do arquivo do script AutoIt.

2

@filipedeschamps o objetivo aqui maior não é apresentar meu projeto mas validar a part visual porque também utiliza as marcações de markdown do github.

1
1

Daniel muito obrigado por trazer seu projeto aqui e se certificar que o Markdown funcionou, e que massa que funcionou tudo 😍

Mais para frente eu quero escrever alguns posts aqui explicando os fluxos internos do TabNews e que vão usar bastante o Mermaid 👍

1