unit CNAB240_BB;

interface
  function MontaCodBarra_BB(vencimento:TDate; valor:real;numDuplicata : string): string;
  function MontaCodigoBarrasBrasil_7Posicoes_BB(vencimento:TDate; valor:real; numDuplicata : string): string;
  function MontaCodigoBarrasBrasil_6Posicoes_BB(vencimento:TDate; valor:real; numDuplicata : string): string;
  function MontaLinhaDigitavel_BB(CodBarra : string; vencimento : TDate; valor :real) : string;
  function MontaNossoNumero240_BB(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;

implementation
uses Rotinas,SysUtils,DataModulo;
var
  codbarra : string;
  banco,
  moeda,
  agencia ,
  dv_agencia,
  Conta,
  dv_conta,
  fatorVencimento,
  dv_nosso_Numero,
  convenio,
  dvCodBarra,
  carteira,
  valorSTR,
  nome_cedente,
  nossonumero : string;

function MontaCodBarra_BB(vencimento:TDate; valor:real; numDuplicata : string): string;

begin
{telefone suporte BB 0800729-0500
Minas Brasil
Agência 0372-7
Banco 001
Conta 34807-4
Convênio 1922179
Carteira 17
Variação 19

Jalice
Agência: 3329-4
Banco: 001
Conta: 54964-9
Convênio: 829129
Contrato: 14706675
Carteira: 18
Variação: 19

Irmãos Azevedo
Agência: 0372-7
Banco: 001
Conta: 90967-x
Convênio: 2881280
Cod_Cedente: 90967
Carteira: 17
Variação: 19

}

  if Dados.qryDadosBancarios.FieldByName('BANCO').AsString = '001' then
  begin
    if Length(Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString) = 7 then Result:=MontaCodigoBarrasBrasil_7Posicoes_BB(vencimento, valor, numDuplicata);
    if Length(Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString) = 6 then Result:=MontaCodigoBarrasBrasil_6Posicoes_BB(vencimento, valor, numDuplicata);
  end
  else
  begin

   //================= Monta o codigo de barras do boleto ==============
   banco       := Dados.qryDadosBancarios.FieldByName('BANCO').AsString ;
   agencia     := Dados.qryDadosBancarios.FieldByName('AGENCIA').AsString;
   Conta       := Dados.qryDadosBancarios.FieldByName('CONTA').AsString;
   Conta       := ZeroEsquerda(conta,8);
   moeda       := '9';
   convenio    := Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString;
   carteira    := Dados.qryDadosBancarios.FieldByName('CARTEIRA').AsString;
   nossonumero := convenio+ZeroEsquerda(numDuplicata,10);
   fatorVencimento := CalcularFatorVencimento(vencimento);
   valorSTR := FloatToStr(valor*100);
   valorSTR := ZeroEsquerda(valorSTR,10);
   codbarra    := banco + moeda + fatorVencimento + valorSTR + '000000' +nossonumero + carteira;
   dvCodBarra  := Modulo11(codbarra);

   //================= se o digoto for igual a 0, 1, 10 ou 11, considere DV = 1  =============
   if (dvCodBarra = '0')or (dvCodBarra = '1')or (dvCodBarra = '10') or (dvCodBarra = '11') then
      dvCodBarra := '1';

   codbarra    := banco + moeda + dvCodBarra + fatorVencimento + valorSTR + nossonumero + agencia + Conta + carteira;
   Result := codbarra;
   {
    01 a 03	03	9(3)	Código do Banco na Câmara de Compensação = '001'
    04 a 04	01	9(1)	Código da Moeda = '9'
    05 a 05	01	9(1)	DV do Código de Barras
    06 a 09	04	9(04)	Fator de Vencimento
    10 a 19	10	9(08) V(2)	Valor
    20 a 30	03	9(11)	Nosso-Número, sem DV
    31 a 34	08	9(4)	Número da Agência de Relacionamento, sem DV
    35 a 42	07	9(8)	Conta Corrente de Relacionamento, sem DV
    43 a 44	05	9(2)	Tipo de Carteira/Modalidade de Cobrança
   }
  end;
end;

function MontaCodigoBarrasBrasil_7Posicoes_BB(vencimento:TDate; valor:real; numDuplicata : string): string;
begin
   //================= Monta o codigo de barras do boleto contrato com 7 posições==============
   banco            := Dados.qryDadosBancarios.FieldByName('BANCO').AsString;
   moeda            := '9';
   convenio         := Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString;
   carteira         := Dados.qryDadosBancarios.FieldByName('CARTEIRA').AsString;
   agencia          := Dados.qryDadosBancarios.FieldByName('AGENCIA').AsString;
   conta            := ZeroEsquerda(Dados.qryDadosBancarios.FieldByName('CONTA').AsString,8);
   nossonumero      := convenio+ZeroEsquerda(numDuplicata,10);
   fatorVencimento  := CalcularFatorVencimento(vencimento);
   valorSTR         := FloatToStr(valor*100);
   valorSTR         := ZeroEsquerda(valorSTR,10);
   codbarra         := banco + moeda + fatorVencimento + valorSTR + '000000'+ nossonumero + carteira;
   dvCodBarra       := Modulo11(codbarra);

   //================= se o digoto for igual a 0, 1, 10 ou 11, considere DV = 1  =============
   if (dvCodBarra = '0')or (dvCodBarra = '1')or (dvCodBarra = '10') or (dvCodBarra = '11') then
      dvCodBarra := '1';

   codbarra    := banco + moeda + dvCodBarra + fatorVencimento + valorSTR + '000000'+ nossonumero + carteira;
   Result := codbarra;

   {Conforme email cso.bh do dia 02/09/2010
   -   Campo nosso número: quando possui 17 posições não é necessário o DV. Portanto, poderá excluí-lo.
   dv_nosso_Numero:=Modulo11_BBrasil(nossonumero);
   nossonumero:=nossonumero+'-'+dv_nosso_Numero;
   }

   {
    FORMATO DO CÓDIGO DE BARRAS PARA CONVÊNIOS ACIMA DE 1.000.000
    Posição Tamanho Picture Conteúdo
    01 a 03 03 9(3) Código do Banco na Câmara de Compensação = ‘001’
    04 a 04 01 9(1) Código da Moeda = '9'
    05 a 05 01 9(1) DV do Código de Barras (Anexo 10)
    06 a 09 04 9(04) Fator de Vencimento (Anexo 8)
    10 a 19 10 9(08) V(2) Valor
    20 a 25 06 9(6) Zeros
    26 a 42 17 9(17) Nosso-Número, sem o DV
    26 a 32 9(7) Número do Convênio fornecido pelo Banco (CCCCCCC)
    33 a 42 9(10) Complemento do Nosso-Número, sem DV (NNNNNNNNNN)
    43 a 44 02 9(2) Tipo de Carteira/Modalidade de Cobrança
   }
end;

function MontaCodigoBarrasBrasil_6Posicoes_BB(vencimento:TDate; valor:real; numDuplicata : string): string;
begin
   //================= Monta o codigo de barras do boleto contrato com 6 posições==============
   banco            := Dados.qryDadosBancarios.FieldByName('BANCO').AsString;
   moeda            := '9';
   convenio         := Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString;
   carteira         := Dados.qryDadosBancarios.FieldByName('CARTEIRA').AsString;
   agencia          := Dados.qryDadosBancarios.FieldByName('AGENCIA').AsString;
   conta            := ZeroEsquerda(Dados.qryDadosBancarios.FieldByName('CONTA').AsString,8);
   nossonumero      := convenio+ZeroEsquerda(numDuplicata,5);
   fatorVencimento  := CalcularFatorVencimento(vencimento);
   valorSTR         := FloatToStr(valor*100);
   valorSTR         := ZeroEsquerda(valorSTR,10);
   codbarra         := banco + moeda + fatorVencimento + valorSTR + nossonumero + agencia+  conta + carteira;
   dvCodBarra       := Modulo11(codbarra);

   //================= se o digoto for igual a 0, 1, 10 ou 11, considere DV = 1  =============
   if (dvCodBarra = '0')or (dvCodBarra = '1')or (dvCodBarra = '10') or (dvCodBarra = '11') then
      dvCodBarra := '1';

   codbarra    := banco + moeda + dvCodBarra + fatorVencimento + valorSTR + nossonumero + agencia+  conta + carteira;
   Result := codbarra;

   dv_nosso_Numero:=Modulo11_BBrasil(nossonumero);
   nossonumero:=nossonumero+'-'+dv_nosso_Numero;
   {
    FORMATO DO CÓDIGO DE BARRAS PARA CONVÊNIOS 7 posições Banco do Brasil
    01 a 03 03 9(3) Código do Banco na Câmara de Compensação = '001'
    04 a 04 01 9(1) Código da Moeda = '9'
    05 a 05 01 9(1) DV do Código de Barras (Anexo 10)
    06 a 09 04 9(04) Fator de Vencimento (Anexo 8)
    10 a 19 10 9(08) V(2) Valor
    20 a 25 06 9(6) Zeros
    26 a 42 17 9(17) Nosso-Número, sem o DV
    26 a 32 9(7) Número do Convênio fornecido pelo Banco (CCCCCCC)
    33 a 42 9(10) Complemento do Nosso-Número, sem DV (NNNNNNNNNN)
    43 a 44 02 9(2) Tipo de Carteira/Modalidade de Cobrança
   }
end;

function MontaLinhaDigitavel_BB(CodBarra : string; vencimento : TDate; valor :real) : string;
var campo1,
    campo2,
    campo3,
    campo4,
    campo5 : string;

    posicao01_04,
    posicao20_24,
    posicao25_34,
    posicao35_44 :string;


begin
//================= Monta a linha digitavel do boleto  ==============
   posicao01_04 := copy(CodBarra,1,4);
   posicao20_24 := copy(CodBarra,20,5);
   posicao25_34 := copy(CodBarra,25,10);
   posicao35_44 := copy(CodBarra,35,10);

   campo1 := posicao01_04 + posicao20_24;
   campo1 := campo1 + Modulo10(campo1);

   campo2 := posicao25_34;
   campo2 := campo2 + Modulo10(campo2);

   campo3 := posicao35_44;
   campo3 := campo3 + Modulo10(campo3);

   campo4 := copy(CodBarra,5,1);

   campo5 := copy(CodBarra,6,14);


   campo1 := Copy(campo1,1,5) + '.' + Copy(campo1,6,5);
   campo2 := Copy(campo2,1,5) + '.' + Copy(campo2,6,6);
   campo3 := Copy(campo3,1,5) + '.' + Copy(campo3,6,6);
   Result := campo1 + '  ' + campo2 + '  ' + campo3 +'  ' + campo4 +'  '+ campo5 ;

end;

function MontaNossoNumero240_BB(Agencia,NumeroCedente,NumDuplicata, Carteira:string ) : string;
begin
    { ============
            o nosso numero estava sendo impresso errado..
            diferente da geracao do codigo de barras.
            Deve ser iniciar pelo Numero do convenio e nao pelo codigo do cedente
            ::: Daniel azevedo 2018/08/27 :::
     ===============}

    NumeroCedente := Dados.qryDadosBancarios.FieldByName('CONVENIO').AsString;

    if Length(NumeroCedente) = 7 then
    begin
      result := NumeroCedente+ZeroEsquerda(NumDuplicata,10);
    end
    else
    if Length(NumeroCedente) = 6 then
    begin
      result := NumeroCedente+ZeroEsquerda(NumDuplicata,5);
    end
    else
     result := NumeroCedente+ZeroEsquerda(NumDuplicata,10);
end;

end.


