Ir para conteúdo
  • Cadastre-se

allanbrrj

Membros
  • Total de ítens

    9
  • Registro em

  • Última visita

Posts postados por allanbrrj

  1. Boa noite o último post deu erro não consegui completar.

    O arquivo na integra, o original não poderei colocar, vou anexar um com os dados modificados, cnpj, conta etc.

    Especificamente este cliente só usa 1 desconto por data, no processo de homologação foi apenas 1 data.

    Mas tenho outros clientes com 2 e 3 datas, já homologados, com o mesmo código acima em produção.

     

    CB000056.REM

    • Curtir 1
  2. Boa tarde a todos.

    Recentemente vi esse post.

    Dizendo que está com problema no remessa, eles estão rejeitando informando que é necessário vir com espaços ao invés de 0.

    Passei pelo mesmo problema, ao tentar homologar mais um cliente. Porém já tenho outros clientes pleno funcionamento.

    Informo que fiz as alterações com os espaços mas o boleto foi igualmente rejeitado. E levei a contestação junto ao suporte, informando essa divergência. 

    E hoje tive o ok, o arquivo remessa foi homologado, com os "0".

    Aproveitei e implementei os descontos por data. Segue em anexo caso seja interessante para o projeto

    ACBrBancoSantander.pas

  3. Boa noite a todos.

    Reparem que APENAS no layout de 400 posições o número documento tem apenas 10 posições, porém esse número não muda ao usar o layout de 400 posições.

    O valor alimentado vem padrão da classe TACBrBancoClass 15 posições.

    Essa informação (layout 400 tem apenas 10 posições) pode ser confirmada no manual do Bradesco e também na classe TACBrBancoBradesco  método TACBrBancoBradesco.GerarRegistroTransacao400

    Linha 446  "PadRight( NumeroDocumento,  10)  +  // 111 a 120 - Numero Documento"

    Vejam ele pega apenas 10 posições do NumeroDocumento.

    Fiz uma pequena modificação no create  da classe TACBrBancoBradesco 

    Adicionei no final do create

       if AOwner.ACBrBoleto.LayoutRemessa=c400 then
        fpTamanhoNumeroDocumento := 10;

    Caso seja interessante, favor adicionar no trunc2 do projeto.

    ACBrBancoBradesco.pas

  4. 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
  5. 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?

     

×
×
  • 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.