validar dv de conta de bancos

09/09/2004

0

gostaria saber se alguem tem alguma função pra validar o dv da agencia e conta dos bancos.... bb, bradesco, bec, caixa... etc!


Guibas

Guibas

Responder

Posts

09/09/2004

Motta

Tenho de alguns



Caso vc ou alguém arrume o algoritmo de outros peço que me repasse.

{Valida dv de Conta Corrente dos bancos
 Forma de usar
 Declarar o uso desta unit.
 Declara uma variável do Tipo TDvBancoDados.
 Informer neste record Banco,Agencia e Conta Corrente.
 Chamar a Função ValidaDvBanco passando a variável como parametro
 Retorna uma variavel do tipo TDvBancoOcorrencia
 aBancoSemRotina - Não temos a rotina de cálculo deste banco
 aDvInvalido - dv calculado não bateu com o informado
 aDvValido - dv válido
 aErroRotina -- qq outro erro na rotina
  Motta }
 --
 unit uDvBancos;

interface

Uses sysutils , Classes;

type TDvBancoOcorrencia = (aBancoSemRotina,aDvInvalido,aDvValido,aErroRotina);

type TDvBancoDados = Record
   Banco: integer;
   Agencia: integer;
   ContaCorrente: string;
end;

function ValidaDvBanco(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;

implementation

function ValidaDvBanco(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  // Alinhamento //
  function FillCharAlgn(Alignment: TAlignment; Value: String;
    MaxLength: Integer; Character: Char): String;
  begin
    if Length(Value) > MaxLength then
      Result := Copy(Value,1,MaxLength)
    else
      Result := Value;
    while Length(Result) < MaxLength do
    begin
      case Alignment of
        taLeftJustify:    Result := Result + Character;
        taRightJustify:   Result := Character + Result;
        taCenter:         Result := Character + Result + Character;
      else ;
      end;
    if Length(Result) > MaxLength then
      Result:= Copy(Result,1,MaxLength);
    end;
  end;

  {Cada banco tem sua própria subrotina de cálculo}
  //=================================================================
  function BBrasil(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´23456789´;
  begin
    // agencia o digito pode ser alfa !!??
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´X´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBanerj(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto,parc: integer;
  const sPesos = ´212121212´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,6,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      parc := (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
      if parc >= 10 then
        parc := StrToInt(Copy(IntToStr(parc),1,1)) +
                StrToInt(Copy(IntToStr(parc),2,1));
      soma:= (soma + parc);
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBanespa(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´37913179137´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,9,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + ((StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1))) mod 10));
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBandeirantes(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,parc,resto: integer;
  const sPesos = ´21212121212121´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,10,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      parc := (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
      if parc >= 10 then
        parc := StrToInt(Copy(IntToStr(parc),1,1)) +
                StrToInt(Copy(IntToStr(parc),2,1));
      soma:= (soma + parc);
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBoavista(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´371371371371´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,10,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1))));
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBradesco(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´23456789´;
  begin
    // agencia o digito pode ser alfa !!??
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´P´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BReal(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´234567´;
  begin
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta))  Downto 2 do  // o dv é na frente
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,1,1) = dv then  // o dv é na frente
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BEconomico(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´234567892´;
  begin
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´A´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BItau(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,parc,resto: integer;
  const sPesos = ´2121212121´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,6,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      parc := (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
      if parc >= 10 then
        parc := StrToInt(Copy(IntToStr(parc),1,1)) +
                StrToInt(Copy(IntToStr(parc),2,1));
      soma:= (soma + parc);
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BUnibanco(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,parc,resto: integer;
  const sPesos = ´2121212121´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,7,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      parc := (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
      if parc >= 10 then
        parc := StrToInt(Copy(IntToStr(parc),1,1)) +
                StrToInt(Copy(IntToStr(parc),2,1));
      soma:= (soma + parc);
    end;
    resto:= soma mod 10;
    dv:= IntToStr(10 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BCitibank(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´2345678´;
  begin
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´0´;
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBoston(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´42857428´;
  begin
    sConta:= DadosBancarios.ContaCorrente;
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-2)  Downto 1 do  //dv duplo
    begin
      Inc(j);
      soma:= (soma + StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1)));
    end;
    resto:= soma mod 11;
    if (11 - resto) < 10 then
      dv:= ´0´ + IntToStr(11 - resto)
    else
      dv:= IntToStr(11 - resto);
    if Copy(sConta,(Length(sConta)-1),2) = dv then  //dv duplo
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

  //=================================================================
  function BBBVA(DadosBancarios: TDvBancoDados):TDvBancoOcorrencia;
  var sConta,dv: string;
      i,j,soma,resto: integer;
  const sPesos = ´2345672345672´;
  begin
    sConta:= IntToStr(DadosBancarios.Agencia) +
             FillCharAlgn(taRightJustify,DadosBancarios.ContaCorrente,10,´0´);
    j:=0;
    soma:=0;
    for i:=(Length(sConta)-1)  Downto 1 do
    begin
      Inc(j);
      soma:= (soma + (StrToInt(Copy(sConta,i,1)) * StrToInt(Copy(sPesos,j,1))));
    end;
    resto:= soma mod 11;
    dv:= IntToStr(11 - resto);
    if dv = ´10´ then
      dv:= ´A´; // contas antigas anterior ao Altamira(esta era a definição original)
    if Copy(sConta,Length(sConta),1) = dv then
      Result:= aDvValido
    else
      Result:= aDvInvalido;
  end;

//==========> Inicio da rotina principal
begin
  try
    {Chama rotina conforme o número do banco}
    case DadosBancarios.Banco of
      001: Result:=BBrasil(DadosBancarios);
      029: Result:=BBanerj(DadosBancarios);
      033: Result:=BBanespa(DadosBancarios);
      230: Result:=BBandeirantes(DadosBancarios);
      231: Result:=BBoavista(DadosBancarios);
      237: Result:=BBradesco(DadosBancarios);
      275: Result:=BReal(DadosBancarios);
      334: Result:=BEconomico(DadosBancarios);
      341: Result:=BItau(DadosBancarios);
      409: Result:=BUnibanco(DadosBancarios);
      477: Result:=BCitibank(DadosBancarios);
      479: Result:=BBoston(DadosBancarios);
      641: Result:=BBBVA(DadosBancarios);
    else
      Result:=aBancoSemRotina; // Não temos a rotina
    end;
  except
    Result:=aErroRotina; // Erro qualquer
  end;
end;

end.




Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar