Array
(
)

validar dv de conta de bancos

Guibas
   - 09 set 2004

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


Motta
   - 09 set 2004

Tenho de alguns



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

#Código


{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.