validar dv de conta de bancos

09/09/2004

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


Guibas

Respostas

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 Citar