Ir para conteúdo
  • Cadastre-se

Wagner Freitas

Membros
  • Total de ítens

    14
  • Registro em

  • Última visita

Posts postados por Wagner Freitas

  1. Bom dia!

    Estou implementando o boleto da CEF e percebi que no arquivo ACBrBoleto, o método LeRetorno contém um teste que lança uma exceção se o código remessa/retorno for diferente de '2'.

    procedure TACBrBoleto.LerRetorno(AStream: TStream);
    ...
    case Length(SlRetorno.Strings[0]) of
            240 :
              begin
                if  (Copy(SlRetorno.Strings[0],143,1) <> '2') then
                  Raise Exception.Create( ACBrStr( NomeArq + sLineBreak +
                    'Não é um arquivo de Retorno de cobrança com layout CNAB240') );
    ...

    Porém existem outros casos que podem ser tratados e por conta desse teste eu não consigo tratá-los na unit ACBrBancoCaixa.

    boletoCaixa_CodigoRemessaRetorno.JPG.37eac9f5d2451bb6d2d899f2753b1587.JPG

    Não seria melhor transferir esse teste para dentro das units de cada banco? Pois dessa forma cada banco poderia implementar o tratamento para estes outros casos.  

    Att.

  2. Olá sorrilha!

    De acordo com o Manual_Leiaute_CNAB240_SIGCB temos:

    G079 - Número Remessa / Retorno 
    Número adotado e controlado pelo responsável pela geração magnética dos dados contidos no arquivo 
    para identificar a sequência de envio ou devolução do arquivo entre o Beneficiário e o Banco Beneficiário. 
    Obs.: o número informado deve ser sequencial crescente (anterior + 1)

    Ou seja, este número é gerado pela sua aplicação. Se você envia uma remessa com numero N, o banco só aceita que a próxima remessa seja maior do que N.

  3. Bom dia!

    No arquivo ACBrBoleto.pas, o método fBancoClass.CodOcorrenciaToTipo(CodOcorrencia) deveria se chamar fBancoClass.CodOcorrenciaToTipoRetorno(CodOcorrencia), pois não retorna os tipos de ocorrência de remessa. Como não existe nenhum método que retorne o tipo de remessa criei este outro método fBancoClass.CodOcorrenciaToTipoRemessa(CodOcorrencia) para suprir a necessidade que tenho na minha aplicação de saber o TipoRemessa a partir do CodOcorrencia. 

    Já que eu criei o método fBancoClass.CodOcorrenciaToTipoRemessa(CodOcorrencia) no arquivo ACBRBoleto.pas, o adicionei no lugar do case do arquivo ACBrBancoCaixa.pas, pois o método criado retorna o mesmo resultado do case.

    Espero ter respondido sua pergunta.

    Att.

  4. Em 26/03/2017 at 17:58, herculanojs disse:

    Implementei tratamento para o MVG6 da Toledo bem como fiz algumas melhorias no componente.

    Em cada ponto que tratava uma balança, tinha-se que ficar passando um arquivo Tstring para poder gerar o arquivo correspondente. Criei uma classe para que possa ser tratado qualquer tipo de registro para a balança. Assim bata no leiaute da balança criar o arquivo que se deseja, bem como definir o nome para o mesmo. Todas as demais funções existentes para geração dos arquivos, continuam operacionais mesmo com as mudanças. Efetuei os ajustes em cada geração de balança. Não tratei nenhuma propriedade nova para os leiautes que já existiam.

    ACBrCargaBal.pas

    Gostaria de saber se as alterações do herculanojs já foram ou estão sendo analisadas.

  5. Segue abaixo as alterações realizadas nos arquivos ACBrBoleto.pas e ACBrBancoCaixa.pas citadas no primeiro post.

    Atualizei os arquivos e descrevi abaixo minhas alterações. 

     

    {Arquivo ACBrBoleto.pas}
    ==========================================================================================

    {Metodo Antigo - No arquivo ACBrBancoCaixa.pas o metodo "CodOcorrenciaToTipo" retorna apenas "TipoRetorno" e não "TipoRemessa"}
    function TACBrBanco.CodOcorrenciaToTipoRemessa(const CodOcorrencia: Integer ) : TACBrTipoOcorrencia;
    begin
       Result:= fBancoClass.CodOcorrenciaToTipo(CodOcorrencia);  <<<< antigo
    end;

    {Metodo Alterado - Criei um metodo que retorna apenas os "TipoRemessa"}
    function TACBrBanco.CodOcorrenciaToTipoRemessa(const CodOcorrencia: Integer ) : TACBrTipoOcorrencia;
    begin
       Result:= fBancoClass.CodOcorrenciaToTipoRemessa(CodOcorrencia); <<<< novo
    end;

    {Metodo Adicionado}
    function TACBrBanco.TipoOcorrenciaToCodRemessa(const TipoOcorrencia: TACBrTipoOcorrencia ) : String;
    begin
       Result:= fBancoClass.TipoOcorrenciaToCodRemessa(TipoOcorrencia);
    end;

    {Metodo Adicionado}
    function TACBrBancoClass.TipoOcorrenciaToCodRemessa(const TipoOcorrencia : TACBrTipoOcorrencia
      ) : String ;
    begin
      Result := '01';
    end ;


    {Arquivo ACBrBancoCaixa.pas}
    ==========================================================================================

    {Metodo Adicionado}
    function TACBrCaixaEconomica.CodOcorrenciaToTipoRemessa(
      const CodOcorrencia: Integer): TACBrTipoOcorrencia;
    begin
      case CodOcorrencia of
        02: Result :=     toRemessaBaixar;
        04: Result :=     toRemessaConcederAbatimento;
        05: Result :=     toRemessaCancelarAbatimento;
        06: Result :=     toRemessaAlterarVencimento;
        07: Result :=     toRemessaConcederDesconto;
        08: Result :=     toRemessaCancelarDesconto;
        09: Result :=     toRemessaProtestar;
        10: Result :=     toRemessaCancelarInstrucaoProtestoBaixa;
        11: Result :=     toRemessaCancelarInstrucaoProtesto;
        13: Result :=     toRemessaDispensarJuros;
        31: Result :=     toRemessaAlterarNomeEnderecoSacado;
      else
        Result := toRemessaRegistrar;
      end;
    end;

    {Metodo Adicionado}
    function TACBrCaixaEconomica.TipoOcorrenciaToCodRemessa(const TipoOcorrencia: TACBrTipoOcorrencia): string;
    begin
      case TipoOcorrencia of
        toRemessaBaixar                        : Result := '02';
        toRemessaConcederAbatimento            : Result := '04';
        toRemessaCancelarAbatimento            : Result := '05';
        toRemessaAlterarVencimento             : Result := '06';
        toRemessaConcederDesconto              : Result := '07';
        toRemessaCancelarDesconto              : Result := '08';
        toRemessaProtestar                     : Result := '09';
        toRemessaCancelarInstrucaoProtestoBaixa: Result := '10';
        toRemessaCancelarInstrucaoProtesto     : Result := '11';
        toRemessaDispensarJuros                : Result := '13';
        toRemessaAlterarNomeEnderecoSacado     : Result := '31';
      else
        Result := '01';
      end;
    end;

     

    {Criei o metodo "TipoOcorrenciaToCodRemessa" com o conteudo do case}

    {Metodo Antigo}
    function TACBrCaixaEconomica.GerarRegistroTransacao240(ACBrTitulo : TACBrTitulo): String;
    begin
        ...
          case OcorrenciaOriginal.Tipo of
            toRemessaBaixar                        : ATipoOcorrencia := '02';
            toRemessaConcederAbatimento            : ATipoOcorrencia := '04';
            toRemessaCancelarAbatimento            : ATipoOcorrencia := '05';
            toRemessaAlterarVencimento             : ATipoOcorrencia := '06';
            toRemessaConcederDesconto              : ATipoOcorrencia := '07';
            toRemessaCancelarDesconto              : ATipoOcorrencia := '08';
            toRemessaProtestar                     : ATipoOcorrencia := '09';
            toRemessaCancelarInstrucaoProtestoBaixa: ATipoOcorrencia := '10';
            toRemessaCancelarInstrucaoProtesto     : ATipoOcorrencia := '11';
            toRemessaDispensarJuros                : ATipoOcorrencia := '13';
            toRemessaAlterarNomeEnderecoSacado     : ATipoOcorrencia := '31';
          else
            ATipoOcorrencia := '01';
          end;
          ...
    end;

    {Metodo Alterado}
    function TACBrCaixaEconomica.GerarRegistroTransacao240(ACBrTitulo : TACBrTitulo): String;
    begin
        ...

        ATipoOcorrencia := TipoOcorrenciaToCodRemessa(OcorrenciaOriginal.Tipo);
        ...
    end;

     

     

    Tá aí minha contribuição. Espero ter ajudado!

    Desde já agradeço a oportunidade!

    ACBrBoleto.pas

    ACBrBancoCaixa.pas

    • Curtir 1
  6. 29 minutos atrás, Wagner Freitas disse:

    Bom dia!

    Verifiquei que ao montar o arquivo remessa da Caixa Econômica federal, estão inserindo a DataMoraJuros no lugar da DataMulta. Isso obriga que a cobrança da Multa seja cobrada sempre a partir da mesma data que o juros de mora ao dia. Se eu não estiver errado, essas datas são independentes, por isso fiz as alterações necessárias para corrigir este problema.

    Segue em anexo os arquivos alterados.

    ACBrBancoCaixa.pas

    ACBrBoleto.pas

    Faltou alterar a mensagem do boleto. Favou trocar os arquivos anteriores por estes abaixo.

    ACBrBoleto.pas

    ACBrBancoCaixa.pas

    • Curtir 1
  7. Bom dia!

    Verifiquei que ao montar o arquivo remessa da Caixa Econômica federal, estão inserindo a DataMoraJuros no lugar da DataMulta. Isso obriga que a cobrança da Multa seja cobrada sempre a partir da mesma data que o juros de mora ao dia. Se eu não estiver errado, essas datas são independentes, por isso fiz as alterações necessárias para corrigir este problema.

    Segue em anexo os arquivos alterados.

    ACBrBancoCaixa.pas

    ACBrBoleto.pas

    • Curtir 1
  8. Estou compartilhando uma alteração que fiz no processamento do retorno PRÉ-CRÍTICA para ser enviado ao SVN.

    Fiz o seguinte:

    Quando recebo um arquivo de retorno PRÉ-CRÍTICA da CEF e tento processá-lo, o ACBrBoleto me retorna a seguinte mensagem: "ACBrBanco.ACBrBoleto.NomeArqRetorno +'não é um arquivo de retorno do '+ Nome". 

    O que eu fiz foi analisar o arquivo PRÉ-CRÍTICA e retornar uma mensagem mais específica quanto às informações contidas nesse arquivo. O arquivo PRÉ-CRÍTICA retorna na posição 143 os seguintes status:

    3 - Arquivo PRÉ-CRITICA PROCESSADO;

    5 - Arquivo PRÉ-CRITICA REJEITADO;

    5 - Arquivo PRÉ-CRITICA REJEITADO - W (posição 14) - Mostra qual o motivo da rejeição (no caso mostra o código que contém a descrição do motivo da rejeição que está contido no manual CNAB240 da caixa).

    Criei também um método para retornar o TACBrTipoOcorrencia passando o codOcorrencia.

    DÚVIDA:  Por enquanto, trabalho apenas com a Caixa Econômica federal e estou na dúvida se alteração que fiz poderia servir para qualquer banco, dessa forma eu poderia transferir o tratamento que fiz no arquivo específico da CEF (ACBrBancoCaixa) para o arquivo Geral (ACBrBoleto).

    Att.

    Wagner Freitas

     

    ACBrBancoCaixa.pas

    ACBrBoleto.pas

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