Ir para conteúdo
  • Cadastre-se

dev botao

Sugestão e ajustes boleto via webservice caixa


Ver Solução Respondido por José M. S. Junior,
  • Este tópico foi criado há 1193 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa tarde!

Estou colocando em produção o boleto via webservice da Caixa e encontrei algumas situações que descrevo abaixo com algumas propostas de alteração ou adaptação no código do acbr.

1) campo/tag xml 'IDENTIFICACAO_EMPRESA': entendo que neste campo deverá ser preenchido com o valor usado pela empresa(software) para identificar unicamente o boleto. Este campo é equivalente ao campo 'Seu Numero' no arquivo remessa. Acho que este campo está sendo confundido com o campo NumeroDocumento. Diante disso proponho as seguintes alterações:

   a) Linha 413 do arquivo ACBrBoletoW_Caixa.pas:

        Trocar o campo NumeroDocumento para SeuNumero

        Criar a constante DSC_SEU_NUMERO (isso eu não fiz no arquivo anexado)

   b) Linha 167 do arquivo ACBrBoletoRet_Caixa.pas

        Trocar o campo NumeroDocumento para SeuNumero

2) o campo ESPECIEDOC é preenchido originalmente por letras (vide a geração do arquivo remessa que converte letras para números) que identificam o seu conteúdo: DM=Duplicata mercantil/ OU=outros/ etc. Ocorre que a unit do webservice está informando diretamente o campo que gera erro. Proposta: na unit ACBrBoletoW_Caixa.pas na procedure TBoletoW_Caixa.GerarTitulo utilizar a conversão exatamente como é feito no arquivo remessa. Trecho do código:

//mantendo padronização de preenchimento do campo EspecieDoc entre
      //as funcionalides de REMESSA e REGISTRO ON-LINE.
      //o campo EspecieDoc é preenchido com letras e nas respectivas funções de
      //REMESSA ou de REGISTRO ele é convertido para código
      if AnsiSameText(EspecieDoc, 'CH') then
        AEspecieDoc := '01'
      else if AnsiSameText(EspecieDoc, 'DM') then
        AEspecieDoc := '02'

      ...
      else
        AEspecieDoc := '99';

      Gerador.wGrupo('TITULO');
      Gerador.wCampo(tcStr, '#02', 'NOSSO_NUMERO    ', 17, 17, 1, '14' + ACBrUtil.PadLeft(NossoNumero, 15, '0'), DSC_NOSSO_NUMERO);
      Gerador.wCampo(tcStr, '#03', 'NUMERO_DOCUMENTO', 11, 11, 1, NumeroDocumento, DSC_NUMERO_DOCUMENTO);
      Gerador.wCampo(tcDat, '#04', 'DATA_VENCIMENTO ', 10, 10, 1, Vencimento, DSC_DATA_VENCIMENTO);
      Gerador.wCampo(tcDe2, '#05', 'VALOR           ', 01, 15, 1, ValorDocumento, DSC_VALOR_DOCUMENTO);
      Gerador.wCampo(tcStr, '#06', 'TIPO_ESPECIE    ', 02, 02, 1, AEspecieDoc, DSC_TIPO_ESPECIE);

3) 'string de autenticacao': o campo NossoNumero faz parta da string de autenticação do boleto e deve iniciar obrigatoriamente com o número 14. Minha sugestão é que esse número inicial 14 seja adicionado opcionalmente caso o nosso número esteja incompleto. Trecho do código da unit ACBrBoletoW_Caixa.pas, function TBoletoW_Caixa.GerarAutenticacao

var
  sAutenticacao, sNossoNumero: string;
begin
  if length(NossoNumero) = 17 then
    sNossoNumero := NossoNumero
  else //adicionar o prefixo 14 no nosso número
    sNossoNumero := '14' + ACBrUtil.PadLeft(NossoNumero, 15, '0');
 

4) geração do HASH da autenticação:  sou usuário do Delphi XE6 e nesta versão o cálculo do HASH existente na função TBoletoW_Caixa.GerarAutenticacao não funciona. Recorri ao fórum do ACBR onde encontrei uma função que resolveria o problema mas ocorre que a função faz uso da units System.NetEncoding.pas e System.Hash.pas, ausentes no Delphi XE6. Para resolver o problema copiei estas units de um Delphi mais novo, ajustei as linhas que citavam algunas constantes e pronto. Ficou resolvido, conforme conta na função TBoletoW_Caixa.GerarAutenticacao. Tive de incluir as citadas units na 'uses' ficando assim:

uses
  Classes, SysUtils, ACBrBoletoWS, pcnConversao, pcnGerador, ACBrBoletoConversao,
  NetEncoding, Hash;
 

É isso. Desculpe se me enganei em algum conceito mas minha intenção é de ajudar. Não sou muito experiente em Delphi para fazer um código mais elaborado. Abaixo anexei os arquivos que modifiquei e que trouxe do Delphi 10.1.

Atc,

Marcelo.

ACBrBoletoW_Caixa.pas ACBrBoletoRet_Caixa.pas System.NetEncoding.pas System.Hash.pas

Postado

Olá José Jr, obrigado pelo retorno. Segue mais uma sugestão para ser analisada na geração do XML webservice boleto caixa.

Existe a TAG POS_VENCIMENTO onde deve-se informar o que deverá ser feito após o vencimento: protestar ou devolver o título. Na programação existente está sendo utilizado o campo 'DiasDeProtesto' para preencher a tag 'NUMERO_DIAS'. Acho que não deveria utilizar este campo para situação em que não haja protesto, pois gera inconsistência de informação na hora de imprimir o boleto. No webservice vai informação de baixa e no boleto aparece informação de protesto mesmo não havendo protesto. Segue abaixo o código original e a minha sugestão, que entendo ser mais acertada.

//Versão original
procedure TBoletoW_Caixa.GerarPos_Vencimento;
begin
  if Assigned(Titulos) then
    with Titulos do
    begin
      Gerador.wGrupo('POS_VENCIMENTO');
      if (integer(CodigoNegativacao) in [1,2]) then
        Gerador.wCampo(tcStr, '#14', 'ACAO       ', 01, 20, 1, 'PROTESTAR', DSC_CODIGO_NEGATIVACAO)
      else
        Gerador.wCampo(tcStr, '#14', 'ACAO       ', 01, 20, 1, 'DEVOLVER', DSC_CODIGO_NEGATIVACAO);

      Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, DiasDeProtesto, DSC_DIAS_PROTESTO);
      Gerador.wGrupo('/POS_VENCIMENTO');
    end;

end;

//versão proposta para resolver o problema
procedure TBoletoW_Caixa.GerarPos_Vencimento;
var
  ADiasBaixaDevolucao: integer;
begin
  if Assigned(Titulos) then
    with Titulos do
    begin
      Gerador.wGrupo('POS_VENCIMENTO');
      if (integer(CodigoNegativacao) in [1,2]) then
      begin
        Gerador.wCampo(tcStr, '#14', 'ACAO       ', 01, 20, 1, 'PROTESTAR', DSC_CODIGO_NEGATIVACAO);
        Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, DiasDeProtesto, DSC_DIAS_PROTESTO);
      end
      else
      begin
        if DataBaixa > Vencimento then
          ADiasBaixaDevolucao := Trunc(DataBaixa) - Trunc(Vencimento)
        else
          aDiasBaixaDevolucao := 0;
        Gerador.wCampo(tcStr, '#14', 'ACAO       ', 01, 20, 1, 'DEVOLVER', DSC_CODIGO_NEGATIVACAO);
        Gerador.wCampo(tcInt, '#15', 'NUMERO_DIAS', 03, 03, 1, ADiasBaixaDevolucao, DSC_DIAS_PROTESTO);
      end;
      Gerador.wGrupo('/POS_VENCIMENTO');
    end;
end;
 

Atenciosamente,

Marcelo.

  • Administradores
Postado

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

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 !!

  • 3 meses depois ...
  • Administradores
Postado

Boa tarde,
Pelo que estou observando em nosso backlog, a segunda contribuição não foi validada ainda..estou subindo aqui para ser verificado melhor..

Att.

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 !!

  • 5 semanas depois ...
  • Moderadores
  • Solution
Postado

Boa tarde

As contribuições já estão disponíveis no SVN, com exceção da função de gerar o hash, pois a mesma não funcionaria em Delphi com versões mais antiga e Lazarus, por isso estamos utilizando a solução do próprio ACBr. 

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Este tópico foi criado há 1193 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.