Diogo Loff Postado 18 Fevereiro Postado 18 Fevereiro Olá! Conforme sabemos em teoria se tudo fosse nacional nossa vida estaria mais facil, bom mas como não é assim, esta semana eu tirei tempo para ajustar os provedores que estavam com problemas no meu sistema, e uma das coisas que me chamou atenção ainda é a falta de uniformização dos DANFSe. Meus clientes atualmente usam Nacional, Betha, IPM e Sigcorp. Quando vi que o da Betha o provedor estava retornando em base64 o Danfse, eu pensei porque não seria possivel fazer nos outros?, mesmo que eles não disponibilizem, então venho trabalhando em uma solução usando por base o que já tem implementado no ACBr para pegar o Danfse quando é Nacional, e apliquei a mesma ideia ao IPM e Sigcorp, e acredito que pode ser aplicado a qualquer outro. Segue solução para avaliação. Aquivos Alterados ACBrUtil.FilesIO --> Criado função semelhante a StringIsPDF, porem voltada a Stream, "StreamIsPDF". ACBrNFSeXWebserviceBase --> Ajustado rotina que envia a requisição para que se o retorno for um PDF, não seja feito tratamento como Binario para String, e sim de Binario para Base64, isto é necessário pois a rotina original apesar de funcionar, vira "Loteria", acontece que dependendo dos dados que vem no PDF, o mesmo pode ficar mal formado e causar erro. Isto explica a modificação ta unit ACBrUtil.FilesIO. ACBrNFSeXProviderBase --> Ajustei rotina SalvarPDFNfse, testando se o mesmo esta em base64 para ai salvar o PDF integro conforme veio em ACBrNFSeXWebserviceBase ou se não executa a rotina antiga, pois não sei em que mais locais poderia impactar o modo antigo. IPM.Provider SigCorp.Provider Nestas duas implementei as rotinas que vem das classes base function ObterDANFSE(const ACabecalho, AMSG: string): string; override; procedure PrepararObterDANFSE(Response: TNFSeObterDANFSEResponse); override; procedure TratarRetornoObterDANFSE(Response: TNFSeObterDANFSEResponse); override; Também fiz uma pequena alteração no CriarServiceClient de cada provider, para entender quando é a solicitação do DANFSE. ACBrNFSeXServicos.ini Adicionei os endereços para obter os DANFSE [4211207] Nome=Morro da Fumaca UF=SC Provedor=IPM Versao=1.01 ProRecepcionar=https://morrodafumaca.atende.net/?pg=rest&service=WNERestServiceNFSe HomRecepcionar=https://morrodafumaca.atende.net/?pg=rest&service=WNERestServiceNFSe ProObterDANFSE=https://adn.nfse.gov.br HomObterDANFSE=https://adn.nfse.gov.br [4204202] Nome=Chapeco UF=SC Provedor=SigCorp Versao=2.04 ProRecepcionar=https://chapeco.meumunicipio.online/abrasf/ws HomRecepcionar=https://testechapeco.meumunicipio.online/abrasf/ws ProNameSpace=https://abrasfchapeco.meumunicipio.online/ws HomNameSpace=https://testechapecoabrasf.meumunicipio.online/ws ProObterDANFSE=https://adn.nfse.gov.br HomObterDANFSE=https://adn.nfse.gov.br No caso especifico dos provedores citados implementei para Versão 1.01 do IPM e 2.04 do SigCorp. Se for implmentar para outros provedores, é basicamente fazer o mesmo que foi feito nos dois providers citados. Foram feitos inumeros testes em PRODUÇÃO no dia de hoje com IPM em Morro da Fumaça/SC e SigCorp em Chapecó. Inclusive no provider do SigCorp corrigi também o cancelamento, que não estava correto. Tudo isto foi feito com fontes atualizados de 16/02/2026. ACBrUtil.FilesIO.pas ACBrNFSeXWebserviceBase.pas ACBrNFSeXProviderBase.pas IPM.Provider.pas SigCorp.Provider.pas ACBrNFSeXServicos.ini 1
Consultores Alexandre de Paula Postado 18 Fevereiro Consultores Postado 18 Fevereiro Bom dia! Criada a tarefa ACBR-9002 para avaliação. Obrigado pela contribuição. 1 Alexandre de Paula Gerente de Projetos Ajude o Projeto ACBr crescer - Assine o Clube PRO (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil
Consultores Italo Giurizzato Junior Postado 2 Março Consultores Postado 2 Março Boa tarde @Diogo Loff, Foi implementado o DANFSE em Fortes Report para o Padrão Nacional, veja: Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / Araraquara-SP Araraquara - A era dos Trólebus
Consultores Italo Giurizzato Junior Postado 6 Março Consultores Postado 6 Março Bom dia @Diogo Loff, Mandei para o SVN algumas alterações que você fez e eu fiz mais algumas. Favor fazer uma cópia das units que você alterou e atualize os fontes e faça novos testes. A alteração a respeito do retorno que é um PDF, mais precisamente o ObterDANFSE que retorna o PDF não compreendi muito bem, sendo assim ela não foi enviada para o SVN. Estou conversando com a Equipe ACBr para entender melhor a sua alteração com relação ao retorno ser um PDF e codificar em base 64. Italo Giurizzato Junior Ajude o Projeto ACBr crescer - Assine o SAC Analista de Sistemas / Araraquara-SP Araraquara - A era dos Trólebus
Diogo Loff Postado 7 Março Autor Postado 7 Março Oi @Italo Giurizzato Junior obrigado pelo retorno, então estas duas semanas estou em outro projeto na empresa, inicio do mês de abril vou atualizar os fontes, e te digo como ficou. Mas assim a opção de usar impressão por DANFSE acho que vocês deveriam abolir e passar só usar o do nacional direto, pois ai sempre se garante estar fiel como esta lá, já que baixa o pdf, mas mesmo assim vou ver como ficou e te reporto inicio de abril. 10 horas atrás, Italo Giurizzato Junior disse: A alteração a respeito do retorno que é um PDF, mais precisamente o ObterDANFSE que retorna o PDF não compreendi muito bem, sendo assim ela não foi enviada para o SVN. Sobre isto até eu hehe, como disse já em alguns posts eu não domino a base do ACBR, fiz a coisa para atender meu negócio, o que posso dizer é que todos os clientes meus estão sem problemas usando da forma que deixei, baixando o PDF, mas talvez tenha forma melhor de fazer, se eu dominasse um pouco mais a base da construção do ACBr, mas creio que vocês vão conseguir entender e talvez fazer algo melhorado e mais genérico. 10 horas atrás, Italo Giurizzato Junior disse: Estou conversando com a Equipe ACBr para entender melhor a sua alteração com relação ao retorno ser um PDF e codificar em base 64. Então porque eu converti para base64 se ele vem em PDF, meio que não faz sentido. É que a rotina padrão do ACBr ali que retona isto esta trazendo o binário do PDF em string, se eu vou levando para frente ele como veio, por algum motivo começam dar erros de codificação de pagina, tipo aqueles problemas de encoding, então a forma que achei de resolver isto foi, transformar ele para uma string base64 pois desta forma ele fica protegido e lá onde trata eu salvo para PDF no diretório do provedor. Outra questão que poderia ser era não ter nada disto e no ato que já vem o retorno do webserver e ser PDF já salvar ele e retornar o path, mas não consegui fazer assim, pois como citei no paragrafo acima, desconheço a base do ABCr, e não sei como naquele momento ali identificar o provedor para digamos pegar o path da pasta poder salvar e retornar o path do arquivo. Então esta é a explicação.
Diogo Loff Postado 10 Abril Autor Postado 10 Abril Oi Italo, hoje que tirei para atualizar o ACBr, já conferi e estou enviando a versão para testes.
Diogo Loff Postado 10 Abril Autor Postado 10 Abril (editado) @Italo Giurizzato Junior eu baixei aqui a atualização, e o resgate do PDF esta OK, mas não esta tratando corretamente nas rotinas. Fiz ajuste aqui. ACBrNFSeXProviderBase.pas Rotina procedure TACBrNFSeXProvider.ObterDANFSE; Aqui o ArquivoRetorno sempre vem vazio, pois pela lógica interna do ACBR aqui só retorna valor ser for um XML, JSON ou TXT ObterDANFSEResponse.ArquivoRetorno := AService.ObterDANFSE(ConfigMsgDados.DadosCabecalho, ObterDANFSEResponse.ArquivoEnvio); Logo em baixo é jogado o PDF para EnvelopeRetorno ObterDANFSEResponse.EnvelopeRetorno := AService.Retorno; Porem isto não é usado pra nada pelo que vi, acontece que em TratarRetornoObterDANFSE(ObterDANFSEResponse); que é chamado no final, o tratamento é todo em cima de ObterDANFSEResponse.ArquivoRetorno que esta vazio, o que fiz aqui, logo que atribui em EnvelopeRetorno coloquei um IF. if (Trim(ObterDANFSEResponse.ArquivoRetorno) = '') then ObterDANFSEResponse.ArquivoRetorno := AService.Retorno; Assim as rotinas subsequentes funcionam. Outro problema que peguei por acaso, se tentar resgatar um PDF de um nota fora do mês atual na rotina que monta o path e salva procedure TACBrNFSeXProvider.SalvarPDFNfse(const aNome: string; a data é passada 0, então ele pega mês/ano atual. Ali fiz meio que uma gambiarra pois não sei se é usado para outras coisas, coloquei uma condição se o nome do arquivo é a chave do nacional (meio de forma heuristica sem muito critério), ele pega o mês e ano da chave para jogar o PDF na pasta certa. Vi que você não aplicou aquelá lógica de trabalhar tudo com BASE64, mas esta funcionando, vamos ver se não da erros de encoding, aqui nos testes não tive nenhum. Segunda já vou liberar para os clientes a versão, então os ajustes que to sugerindo aqui já vão para produção e estão funcionais. Da forma original esta quase lá, mas não esta funcionando. A também coloquei mais um tratamento em ObterDANFSE para ver o erro 502 Bad Gateway The server returned an invalid or incomplete response, tem dado este erro as vezes na consulta. ACBrNFSeXProviderBase.pas Editado 10 Abril por Diogo Loff Esqueci do Anexo
Diogo Loff Postado 13 Abril Autor Postado 13 Abril Esqueci de setar False em ObterDANFSEResponse.Sucesso nos tratamentos de erros que coloquei ali. if (Trim(ObterDANFSEResponse.ArquivoRetorno) = '') then begin ObterDANFSEResponse.Sucesso := False; raise Exception.Create('Retorno vazio do serviço de obter DANFSE'); end; if (Pos('<html', LowerCase(ObterDANFSEResponse.ArquivoRetorno)) > 0) and (Pos('bad gateway', LowerCase(ObterDANFSEResponse.ArquivoRetorno)) > 0) then begin ObterDANFSEResponse.Sucesso := False; raise Exception.Create('Erro no serviço de obter DANFSE: resposta inválida (HTML recebido)'); end;
Diogo Loff Postado 15 Junho Autor Postado 15 Junho Ola, atualizei os fontes hoje 15/06/2026 e esta solução tive que implementar novamente, pois o problema persiste.
Recommended Posts
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 contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora