quarta-feira, 13 de abril de 2011

Validando Número do Título Eleitoral


Veja nesta dica como incrementar seu sistema acrescentando a validação do número eleitoral, com uma simples função desenvolvida baseando-se no Resolução do TSE.

Para entender como funciona o esquema de validação do título de eleitor devemos primeiro dar uma olhada na Resolução, de Nº 20.132 do dia 19/03/1998. Vejamos o que diz o artigo de número 10:

    Art. 10 - Os Tribunais Regionais Eleitorais farão distribuir, observada a seqüência numérica fornecida pela Secretaria de Informática, às Zonas Eleitorais da respectiva Circunscrição, séries de números de inscrição eleitoral, a serem utilizados na forma deste artigo.
    Parágrafo único - O número de inscrição compor-se-á de até 12 (doze) algarismos, por Unidade da Federação, assim discriminados:
    a) os 8 (oito) primeiros algarismos serão seqüenciados, desprezando-se, na emissão, os zeros à esquerda;
    b) os 2 (dois) algarismos seguintes serão representativos da Unidade da Federação de origem da inscrição, conforme códigos constantes da seguinte tabela:
    01 - São Paulo
    02 - Minas Gerais
    03 - Rio de Janeiro
    04 - Rio Grande do Sul
    05 - Bahia
    06 - Paraná
    07 - Ceará
    08 - Pernambuco
    09 - Santa Catarina
    10 - Goiás
    11 - Maranhão
    12 - Paraíba
    13 - Pará
    14 - Espírito Santo
    15 - Piauí
    16 - Rio Grande do Norte
    17 - Alagoas
    18 - Mato Grosso
    19 - Mato Grosso do Sul
    20 - Distrito Federal
    21 - Sergipe
    22 - Amazonas
    23 - Rondônia
    24 - Acre
    25 - Amapá
    26 - Roraima
    27 - Tocantins
    28 - Exterior (ZZ)
    c) os 2 (dois) últimos algarismos constituirão dígitos verificadores, determinados com base no módulo 11 (onze), sendo o primeiro calculado sobre o número seqüencial e o último sobre o código da Unidade da Federação seguido do primeiro dígito verificador.

Resumindo: Os dígitos verificadores são calculados em duas etapas. Na primeira, calcula-se o módulo 11 sobre os 8 primeiros dígitos. Os estados de SP e MG possuem títulos com 13 dígitos, sendo assim, nestes casos devemos considerar os 9 primeiros algarismos. Na segunda etapa calculamos o módulo 11 sobre o código da UF + o primeiro dígito verificador.

Vejamos agora a função implementada:

function TForm2.valida_titulo(numero: String): Boolean;
var
  intInd1,intInd2,intLimite    : Integer;
  intSoma,intDigito            : Integer;
  strDVc,strSequencial         : String;
  strUF,strDV1,strDV2          : String;
begin
  numero := Trim(numero);
  while (Length(numero) < 13) do  numero := '0' + numero;
  intInd1 := 0; intInd2 := 0; strDVc := '';
  strSequencial := Copy(numero,1,9);
  strUF  := Copy(numero,10,2);
  strDV1 := Copy(numero,12,1);
  strDV2 := Copy(numero,13,1);
  {Verifca se a UF estiver entre os código possíveis, de 1(SP) até 28(ZZ-Exterior)}
  if ((StrToInt(strUF) >  0) and (StrToInt(strUF) < 29)) then
  begin
   intLimite := 9;
   {Loop para calcular os 2 dígitos verificadores}
   for intInd1 := 1 to 2 do
   begin
     intSoma := 0;
     {Calcula a soma para submeter ao módulo 11}
     for intInd2 := 1 to intLimite do
     begin
      intSoma := intSoma + StrToInt(Copy(strSequencial,intInd2,1)) * (intLimite + 2 - intInd2);
     end;
     {Pega o resto da dívisão, o módulo, por 11}
     intDigito := intSoma mod 11;
     { Se a UF for SP ou MG}
     if  (StrToInt(strUF) in [1,2]) then
     begin
       if (intDigito = 1) then  intDigito := 0
       else if (intDigito = 0) then intDigito := 1
       else intDigito := 11 - intDigito;
     end
     { Outros UF e Exterior}
     else begin
       if ((intDigito = 1) or (intDigito = 0)) then intDigito := 0
       else intDigito := 11 - intDigito;
     end;
     {Atribui à variavel strDVc o dígito calculado}
     strDVc := strDVc + IntToStr(intDigito);
     {Muda o valor de intLimite para o cáculo do segundo dígito}
     intLimite:= 3;
     {O cálculo do segundo dígito será sobre o código da UF + primeiro dígito verificador}
     strSequencial:= strUF + IntToStr(intDigito);
   end;
  end;

  result := (strDV1+strDV2 = strDVc);
end;

Para usá-la é bastante simples. Adicione ao seu form um Edit e um Button. No evento onClick deste Button, faça:

procedure TForm2.Button1Click(Sender: TObject);
begin
  if valida_titulo(Edit1.Text) then
    MessageDlg('Título Válido', mtInformation, [mbOk], 0)
  else
    MessageDlg('Título Inválido', mtWarning, [mbOk], 0);
end;

Pronto! Agora basta rodar o aplicativo, informar um número qualquer de título eleitoral que você verá a mensagem "Título Válido", a menos que o número informado esteja incorreto! :-)

Nenhum comentário:

Postar um comentário