Ir para conteúdo
  • Cadastre-se

dev botao

Desconto por data 2,3 e 4 no Bradesco


allanbrrj
Ver Solução Respondido por Victor H. Gonzales - Panda,
  • Este tópico foi criado há 911 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde a todos.

Sou iniciante neste projeto, ainda não estou familiarizado com o ambiente.

Estou tentando gerar o arquivo remessa para o Bradesco ("cobBradesco").

Porém na linha de registro de transações 2, onde deveriam vir os descontos por data, está sendo gerado com "0".

Já informei as propriedade "TipoDesconto" e "TipoDesconto2" como "tdValorFixoAteDataInformada" no TACBrTitulo e nada.

Utilizei  tanto layout 240 como 400 e nada.

Olhando o fontes no "ACBrBancoBradesco.pas" percebi que a transação tipo "2" não é especifico da carteira vem por herança "TACBrBancoClass.MontaInstrucoesCNAB400" que não está implementada.

e o TACBrBancoBradesco.GerarRegistroTransacao240 também não vem informando os descontos por data.

Esses descontos por data ainda não foram implementados? Ou estou informando as propriedades erradas ou tem alguma outra?

Caso elas não estejam implementadas estou olhando nos arquivos corretos? Caso eu altere como posso deixar essa contribuição parar o projeto ACBR?

 

Link para o comentário
Compartilhar em outros sites

  • 9 meses depois ...

Boa noite, segue a solução para o problema. Já testei e foi homologado pelo banco.

Caso seja interessante, favor adicionar no trunc2 do projeto.

 

2 units sofrerão modificações ACBrBancoBradesco.pas e ACBrBoleto.pas

ACBrBancoBradesco.pas

function MontaInstrucoesCNAB400(const ACBrTitulo :TACBrTitulo; const nRegistro: Integer ): String; override;

function TACBrBancoBradesco.MontaInstrucoesCNAB400(
  const ACBrTitulo: TACBrTitulo; const nRegistro: Integer): String;
var
  lNossoNumero, lDigNossoNumero: String;
begin
  Result := '';
  ValidaNossoNumeroResponsavel(lNossoNumero, lDigNossoNumero, ACBrTitulo);

  with ACBrTitulo, ACBrBoleto do
  begin

     {Primeira instrução vai no registro 1}
     if Mensagem.Count <= 1 then
     begin
        Result := '';
        Exit;
     end;
     Result := '2'               +                                         // IDENTIFICAÇÃO DO LAYOUT PARA O REGISTRO
               Copy(PadRight(TiraAcentos(Mensagem[1]), 80, ' '), 1, 80);                // CONTEÚDO DA 1ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO

     if Mensagem.Count >= 3 then
        Result := Result +
                  Copy(PadRight(TiraAcentos(Mensagem[2]), 80, ' '), 1, 80)              // CONTEÚDO DA 2ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
     else
        Result := Result + PadRight('', 80, ' ');                          // CONTEÚDO DO RESTANTE DAS LINHAS

     if Mensagem.Count >= 4 then
        Result := Result +
                  Copy(PadRight(TiraAcentos(Mensagem[3]), 80, ' '), 1, 80)              // CONTEÚDO DA 3ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
     else
        Result := Result + PadRight('', 80, ' ');                          // CONTEÚDO DO RESTANTE DAS LINHAS

     if Mensagem.Count >= 5 then
        Result := Result +
                  Copy(PadRight(TiraAcentos(Mensagem[4]), 80, ' '), 1, 80)              // CONTEÚDO DA 4ª LINHA DE IMPRESSÃO DA ÁREA "INSTRUÇÕES” DO BOLETO
     else
        Result := Result + PadRight('', 80, ' ');                          // CONTEÚDO DO RESTANTE DAS LINHAS


     Result := Result                                              +
               IfThen(DataDesconto2 < EncodeDate(2000,01,01),PadLeft('', 6,  '0'),
                         FormatDateTime( 'ddmmyy', DataDesconto2)) +       // 322 a 327 - Data limite para concessão de Desconto 2
               IntToStrZero( round( ValorDesconto2 * 100 ), 13)    +       // 328 a 340 - Valor do Desconto 2
               IfThen(DataDesconto3 < EncodeDate(2000,01,01),PadLeft('', 6,  '0'),
                         FormatDateTime( 'ddmmyy', DataDesconto3)) +       // 341 a 346 - Data limite para concessão de Desconto 3
               IntToStrZero( round( ValorDesconto3 * 100 ), 13)    +       // 347 a 359 - Valor do Desconto 3
               space(7)                                            +       // 360 a 366 - Reserva
               IntToStrZero(StrToIntDef(trim(Carteira), 0), 3)                         +
               IntToStrZero(StrToIntDef(OnlyNumber(ACBrBoleto.Cedente.Agencia), 0), 5) +
               IntToStrZero(StrToIntDef(OnlyNumber(ACBrBoleto.Cedente.Conta)  , 0), 7) +
               Cedente.ContaDigito                                                     +
               lNossoNumero + lDigNossoNumero                                          +
               IntToStrZero( nRegistro + 1, 6);                            // Nº SEQÜENCIAL DO REGISTRO NO ARQUIVO
  end;

end;

function TACBrBancoBradesco.GerarRegistroTransacao240(ACBrTitulo: TACBrTitulo): String;
var
  ATipoOcorrencia,
  ATipoBoleto,
  ADataMoraJuros,
  ACodigoMoraJuros,
  ACodigoDesconto: String;
  ADataDesconto,
  ACodigoMulta,
  ADataMulta,
  ATipoAceite,
  AEspecieDoc: String;

  Fsequencia:Integer;
  FdigitoNossoNumero: String;
  FcodCarteira: String;
  ACodProtesto: String;
  ListTransacao: TStringList;

begin
  Fsequencia     := 3 * ACBrTitulo.ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo);

  //Caracteristica Título
  FcodCarteira := DefineCaracTitulo(ACBrTitulo);

  //Digito Nosso Número
  FdigitoNossoNumero := CalcularDigitoVerificador(ACBrTitulo);

  {Código para Protesto}
  ACodProtesto := DefineTipoDiasProtesto(ACBrTitulo);

  {Tipo de Ocorrencia}
  ATipoOcorrencia := TipoOcorrenciaToCodRemessa(ACBrTitulo.OcorrenciaOriginal.Tipo);

  {Aceite do Titulo }
  ATipoAceite := DefineAceite(ACBrTitulo);

  {Especie Documento}
  AEspecieDoc := DefineEspecieDoc(ACBrTitulo);

  {Responsavel Emissão}
  ATipoBoleto := DefineResponsEmissao;

  {Código Mora}
  ACodigoMoraJuros := DefineCodigoMoraJuros(ACBrTitulo);

  {Data Mora}
  ADataMoraJuros := DefineDataMoraJuros(ACBrTitulo);

  {Código Desconto}
  ACodigoDesconto := DefineCodigoDesconto(ACBrTitulo);

  {Data Desconto}
  ADataDesconto := DefineDataDesconto(ACBrTitulo);

  {Código Multa}
  ACodigoMulta := DefineCodigoMulta(ACBrTitulo);

  {Data Multa}
  ADataMulta := DefineDataMulta(ACBrTitulo);

  ListTransacao:= TStringList.Create;
  try

    with ACBrTitulo do
    begin
      {REGISTRO P}
      ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3)    + //1 a 3 - Código do banco
        '0001'                                               + //4 a 7 - Lote de serviço
        '3'                                                  + //8 - Tipo do registro: Registro detalhe
        IntToStrZero(Fsequencia+1,5)                         + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
        'P'                                                  + //14 - Código do segmento do registro detalhe
        ' '                                                  + //15 - Uso exclusivo FEBRABAN/CNAB: Branco
        ATipoOcorrencia                                      + //Código de Movimento Remessa 16 17 2 - Num *C004
        PadLeft(OnlyNumber(ACBrTitulo.ACBrBoleto.Cedente.Agencia), 5, '0') + //18 a 22 - Agência mantenedora da conta
        PadRight(ACBrBoleto.Cedente.AgenciaDigito, 1 , '0')  + //23 -Dígito verificador da agência
        PadLeft(ACBrBoleto.Cedente.conta, 12, '0')           + //24 a 35 - Número da Conta Corrente
        Padleft(ACBrBoleto.Cedente.ContaDigito, 1 , '0')     + //36 a 36 Dígito Verificador da Conta Alfa *G011
        ' '                                                  + //Retornaram que deve gravar vazio .. contrario ao layout
        //PadLeft(Copy(Fconta,Length(Fconta) ,1 ),1, ' ')    + //37-37Dígito Verificador da Ag/Conta 37 37 1 - Alfa *G012
        PadLeft(ACBrTitulo.Carteira, 3, '0')                 + //38-40 Identificação do Produto 38 40 3 Num *G069
        PadLeft('0', 5, '0')                                 + //Zeros 41 45 5 Num *G069
        PadLeft(NossoNumero, 11, '0')                        + //Nosso Número 46 56 11 Num *G069
        PadLeft(FdigitoNossoNumero,1,'0')                    + //Digito do nosso Número 57 57 1 Num *G069
        PadLeft(FcodCarteira,1,'0' )                         + //Código da Carteira 58 58 1 - Num *C006
        '1'                                                  + //Forma de Cadastr. do Título no Banco 59 59 1 - Num *C007   1-cobrança Registrada
        '1'                                                  + //Tipo de Documento 60 60 1 - Alfa C008    -1-Tradicional
        ATipoBoleto                                          + //Identificação da Emissão do Bloqueto 61 61 1 - Num *C009
        ATipoBoleto                                          +//Identificação da Distribuição 62 62 1 - Alfa C010  -Quem emite que distribua...
        PadRight(NumeroDocumento, 15, ' ')                   + //Número do Documento de Cobrança 63 77 15 - Alfa *C011
        FormatDateTime('ddmmyyyy', Vencimento)               + //Data de Vencimento do Título 78 85 8 - Num *C012
        IntToStrZero( round( ValorDocumento * 100), 15)      + //Valor Nominal do Título 86 100 13 2 Num *G070
        Padleft('0', 5, '0')                                 + //Agência Encarregada da Cobrança 101 105 5 - Num *C014
        '0'                                                  + //Dígito Verificador da Agência 106 106 1 - Alfa *G009
        PadRight(AEspecieDoc, 2)                             + //Espécie do Título 107 108 2 - Num *C015
        ATipoAceite                                          + //Identific. de Título Aceito/Não Aceito 109 109 1 - Alfa C016
        FormatDateTime('ddmmyyyy', DataDocumento)            + //Data da Emissão do Título 110 117 8 - Num G071
        ACodigoMoraJuros                                     + //Código do Juros de Mora 118 118 1 - Num *C018  '1' = Valor por Dia'2' = Taxa Mensal '3' = Isento
        ADataMoraJuros                                       + //Data do Juros de Mora 119 126 8 - Num *C019
        IfThen(ValorMoraJuros > 0, IntToStrZero(round(ValorMoraJuros * 100), 15),PadRight('', 15, '0')) + //juros de Mora por Dia/Taxa 127 141 13 2 Num C020
        ACodigoDesconto                                      + //Código do Desconto 1 142 142 1 - Num *C021
        ADataDesconto                                        + //Data do Desconto 1 143 150 8 - Num C022
        IfThen(ValorDesconto > 0, IntToStrZero(
        round(ValorDesconto * 100), 15),PadRight('', 15, '0'))
                                                             + //Valor/Percentual a ser Concedido 151 165 13 2 Num C023
        IntToStrZero( round(ValorIOF * 100), 15)             + //Valor do IOF a ser Recolhido 166 180 13 2 Num C024
        IntToStrZero( round(ValorAbatimento * 100), 15)      + //Valor do Abatimento 181 195 13 2 Num G045

        PadRight(IfThen(SeuNumero <> '',SeuNumero,NumeroDocumento), 25, ' ')                + //Identificação do Título na Empresa 196 220 25 - Alfa G072

        IfThen((DataProtesto <> 0) and (DiasDeProtesto > 0), ACodProtesto, '3')            + //Código para Protesto 221 221 1 - Num C026

        IfThen((DataProtesto <> 0) and (DiasDeProtesto > 0),
                        PadLeft(IntToStr(DiasDeProtesto), 2, '0'), '00')                   + //Número de Dias para Protesto 222 223 2 - Num C027

        IfThen((DataBaixa <> 0) and (DataBaixa > Vencimento), '1', '2')                    + //Código para Baixa/Devolução 224 224 1 - Num C028

        IfThen((DataBaixa <> 0) and (DataBaixa > Vencimento),PadLeft(IntToStr(DaysBetween(DataBaixa, Vencimento)), 3, '0'), '000') + //Número de Dias para Baixa/Devolução 225 227 3 - Alfa C029
        '09'                                                + //Código da Moeda 228 229 2 - Num *G065   '09' = Real
        PadRight('', 10 , '0')                              + //Nº do Contrato da Operação de Créd. 230 239 10 - Num C030
        ' ');                                                 //240 - Uso exclusivo FEBRABAN/CNAB

      {SEGMENTO Q}
      ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3) + //Código do Banco na Compensação 1 3 3 - Num G001
        '0001'                                              + //Lote Lote de Serviço 4 7 4 - Num *G002
        '3'                                                 + //Tipo de Registro 8 8 1 - Num ‘3’ *G003
        IntToStrZero(Fsequencia+ 2 ,5)                      + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
        'Q'                                                 + //Cód. Segmento do Registro Detalhe 14 14 1 - Alfa ‘Q’ *G039
        ' '                                                 + //Uso Exclusivo FEBRABAN/CNAB 15 15 1 - Alfa Brancos G004
        ATipoOcorrencia                                     + //Código de Movimento Remessa 16 17 2 - Num *C004

        {Dados do sacado}
        IfThen(Sacado.Pessoa = pJuridica,'2','1')           + //Tipo Tipo de Inscrição 18 18 1 - Num *G005
        PadLeft(OnlyNumber(Sacado.CNPJCPF), 15, '0')        + //Número Número de Inscrição 19 33 15 - Num *G006
        PadRight(Sacado.NomeSacado, 40, ' ')                + //Nome 34 73 40 - Alfa G013
        PadRight(Sacado.Logradouro + ' ' + Sacado.Numero +' ' + Sacado.Complemento , 40, ' ') + //Endereço 74 113 40 - Alfa G032
        PadRight(Sacado.Bairro, 15, ' ')                    + //Bairro 114 128 15 - Alfa G032
        PadLeft(copy(OnlyNumber(ACBrTitulo.Sacado.CEP),0,5), 5, '0')                     + //CEP 129 133 5 - Num G034
        PadRight(copy(OnlyNumber(ACBrTitulo.Sacado.CEP),length(OnlyNumber(ACBrTitulo.Sacado.CEP))-2,3), 3, ' ')       + //Sufixo do CEP 134 136 3 - Num G035
        PadRight(Sacado.Cidade, 15, ' ')                    + // Cidade 137 151 15 - Alfa G033
        PadRight(Sacado.UF, 2, ' ')                         + //Unidade da Federação 152 153 2 - Alfa G036
        {Dados do sacador/avalista}
        '0'                                                 + // 154 a 154 - Tipo de Inscrição 154 154 1 - Num *G005
        PadRight('', 15, '0')                               + // Número de Inscrição 155 169 15 - Num *G006
        PadRight('', 40, ' ')                               + // Nome do Pagadorr/Avalista 170 209 40 - Alfa G013
        PadRight('0', 3, '0')                               + // Cód. Bco. Corresp. na Compensação 210 212 3 - Num *C031
        PadRight('',20, ' ')                                + // Nosso Nº no Banco Correspondente 213 232 20 - Alfa *C032
        PadRight('', 8, ' '));                                 // FEBRABAN/CNAB 233 240 8 - Alfa Brancos G004

    {SEGMENTO R OPCIONAL }
      ListTransacao.Add(IntToStrZero(ACBrBanco.Numero, 3)    + //Código do Banco na Compensação 1 3 3 - Num G001
        '0001'                                               + //Lote de Serviço 4 7 4 - Num *G002
        '3'                                                  + //Tipo de Registro 8 8 1 - Num ‘3’ *G003
        IntToStrZero(Fsequencia+ 3 ,5)                       + //Nº Sequencial do Registro no Lote 9 13 5 - Num *G038
        'R'                                                  + //Cód. Segmento do Registro Detalhe 14 14 1 - Alfa ‘R’ *G039
        ' '                                                  + //CNAB Uso Exclusivo FEBRABAN/CNAB 15 15 1 - Alfa Brancos G004
        ATipoOcorrencia                                      + //Código de Movimento Remessa 16 17 2 - Num *C004
                TipoDescontoToString(TipoDesconto2)                  + //Código do Desconto 2 18 18 1 - Num *C021
        IfThen(TipoDesconto2<>tdNaoConcederDesconto,
          IfThen(DataDesconto2 < EncodeDate(2000,01,01),
          PadLeft('',8,'0'),
          FormatDateTime( 'ddmmyyyy', DataDesconto2)),
        PadLeft('',8,'0'))                                   + //Data do Desconto 2 19 26 8 - Num C022
        IfThen(TipoDesconto2<>tdNaoConcederDesconto,
          IfThen(ValorDesconto2>0,
            IntToStrZero(round(ValorDesconto2 * 100), 15),
            PadLeft('',15,'0')))                            + //Valor/Percentual a ser Concedido 27 41 13 2 Num C023
        TipoDescontoToString(TipoDesconto3)                  + //Código do Desconto 3 42 42 1 - Num *C021
        IfThen(TipoDesconto3<>tdNaoConcederDesconto,
          IfThen(DataDesconto3 < EncodeDate(2000,01,01),
          PadLeft('', 8, '0'),
          FormatDateTime( 'ddmmyyyy', DataDesconto3)),
        PadLeft('',8,'0'))                                   + //Data do Desconto 3 43 50 8 - Num C022
        IfThen(TipoDesconto3<>tdNaoConcederDesconto,
          IfThen(ValorDesconto3>0,
            IntToStrZero(round(ValorDesconto3 * 100), 15),
            PadLeft('',15,'0')))                             + //Valor/Percentual a Ser Concedido 51 65 13 2 Num C023
        ADataMulta                                           + //Data da Multa 67 74 8 - Num G074
        IfThen(PercentualMulta > 0,
          IntToStrZero(round(PercentualMulta * 100), 15),
        PadRight('', 15, '0'))                               + //Multa Valor/Percentual a Ser Aplicado 75 89 13 2 Num G075
        PadRight('', 10, ' ')                                + //Informação ao Pagador Informação ao Pagador 90 99 10 - Alfa *C036
        PadRight('', 40, ' ')                                + //Informação 3 Mensagem 3 100 139 40 - Alfa *C037
        PadRight('', 40, ' ')                                + //Mensagem 4 140 179 40 - Alfa *C037
        PadRight('', 20, ' ')                                + //CNAB Uso Exclusivo FEBRABAN/CNAB 180 199 20 - Alfa Brancos G004
        PadLeft('', 8, '0')                                  +//Cód. Ocor. do Pagador 200 207 8 - Num *C038
        PadLeft('', 3, '0')                                  +//Cód. do Banco na Conta do Débito 208 210 3 - Num G001
        PadLeft('', 5, '0')                                  +//Código da Agência do Débito 211 215 5 - Num *G008
        PadLeft('', 1, ' ')                                  +//Dígito Verificador da Agência 216 216 1 - Alfa *G009
        PadLeft('', 12, '0')                                 +//Corrente para Débito 217 228 12 - Num *G010
        PadLeft('', 1, ' ')                                  +//Dígito Verificador da Conta 229 229 1 - Alfa *G011
        PadLeft('', 1, ' ')                                  +//DV Dígito Verificador Ag/Conta 230 230 1 - Alfa *G012
        PadLeft('', 1, '3')                                  +//Ident. da Emissão do Aviso Déb. Aviso para Débito Automático 231 231 1 - Num *C039
        PadLeft('',9, ' '));                                  //CNAB Uso Exclusivo FEBRABAN/CNAB 232 240 9 - Alfa Brancos G004

    end;
    Result := RemoverQuebraLinhaFinal(ListTransacao.Text);
  finally
    ListTransacao.Free;
  end;
end;

 

ACBrBoleto.pas

Na classe

TACBrTitulo adicionar o field:

fTipoDesconto3     : TACBrTipoDesconto;

Depois adicionar a propety

property TipoDesconto3      : TACBrTipoDesconto read fTipoDesconto3 write fTipoDesconto3;

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Administradores

Obrigado pela contribuição, em breve será validada para possível inclusão ao svn

TK-2571

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Consultores

Boa noite,

Obrigado pela contribuição.

poderia verificar com essas Units se está integro ?

 

Obrigado

ACBrBancoBradesco.pas ACBrBoleto.pas

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution

Por favor atualize seus fontes, pelo SVN do ACBr... 

Já subimos para o nosso repositório de fontes, modificações que podem corrigir algum dos itens referentes a esse tópico...

Por favor atualize seus fontes, faça testes, e se possível comente em uma nova resposta, se o problema foi resolvido...

Dúvidas, sobre o uso do SVN ?  Clique aqui e veja um vídeo

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 911 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...