Olá, desenvolvedor!
Este artigo foi feito com a intenção de ajudar os clientes que já usam o componente NFse V1 e estão migrando para a V2. Como nesta nova versão tivemos algumas alterações em métodos e propriedades, vimos a necessidade de criar um material para auxiliar.
* Link para a documentação de utilização da NFSe V2
Índice:
- Propriedades do componente;
- Método Atualizar Arquivos;
- Método de Envio;
- Método de Consulta;
- Método de Imprimir e Visualizar;
- Método de Exportar para PDF;
- Método Consultar Cidades Homologadas;
- Retorno em JSON;
1. Propriedades do novo componente:
Algumas propriedades do componente foram retiradas e outras mudaram. A título de exemplo, agora não temos mais as propriedades:
- DiretorioEsquemas
- DiretorioTemplates
- DiretorioScripts
- ArquivoServidoresHom
- ArquivoServidoresProd
- ArquivoLocais
Estas propriedades foram resumidas à propriedade: Arquivos.
Importante também citar a nova propriedade ParametrosExtras, que antes era passada no ultimo parâmetro dos métodos como dados auxiliares. Nela informarmos o Login e senha do cliente no portal da prefeitura, caso necessário.
2. Método AtualizarArquivos:
Uma das questões melhoradas na V2 do componente, foi a questão de Atualizar as cidades que sofrerem reajustes ou uma cidade que foi rehomologada pois mudou de padrão.
Antes o componente deveria ser atualizado sempre, agora, na maioria dos casos, basta um método para atualizar estes arquivos e deixar tudo funcional.
Como ele funciona: sempre que a cidade for usada pela primeira vez ou sofrer alteração, o método deve ser acionado e este irá buscar em nosso servidor os arquivos atualizados e fazer o download destes na pasta configurada na propriedade Arquivos.
É possível configurar a propriedade ModoAtualizarArquivos para que os arquivos de todas cidades/padrões sejam atualizados. Isso elimina a necessidade de executar o método AtualizarArquivos cada vez que uma nova cidade é configurada.
Boas práticas para uma utilização efetiva do AtualizarArquivos:
- Não é recomendada a utilização de outros métodos durante a execução do AtualizarArquivos, pois este método remove e substitui rapidamente arquivos de configurações do componente que são cruciais para execução de outros métodos, se durante a execução do AtualizarArquivos, outro método for chamado, podem ocorrer exceptions de arquivos não encontrados.
-
Não implementar este método vinculado ao fluxo de emissão de notas, pois o download de arquivos pode levar alguns segundos para ser feito de acordo com vários fatores, como internet e permissões de firewall do servidor onde o componente é utilizado.
-
Executá-lo em uma rotina automatizada que o chama apenas uma vez ao dia ou semana em horários sem emissão.
-
Criar um controle para que outros métodos não sejam chamados durante a execução do AtualizarArquivos, principalmente em sistemas com várias instâncias, pois em uma única instância, o sistema geralmente fica bloqueado durante a execução do método e não há concorrência.
-
Implementar o método separadamente, para que o método também possa ser chamado em casos mais críticos onde uma prefeitura teve alguma mudança repentina que impactou na emissão das notas (exemplo, uma cidade com grande volume de emissão, como São Paulo, passou a retornar o XML da NFS-e com layout de XML e os arquivos precisam ser atualizados para que os novos templates sejam baixados e as emissões retornem ao normal).
- Link Método AtualizarArquivos
3. Método de Enviar Nota:
Agora no componente V2 o método de envio ficou simplificado. Antes era necessário Gerar o xml, assinar e enviar no modo Síncrono ou Assíncrono.
No método atual, precisamos apenas montar o Tx2 e informar para o método de envio, este irá assinar e enviar pela via que é aceita por aquela cidade (Assíncrono ou Síncrono).
Vale também falar sobre as propriedades UltimoLogEnvio e UltimoLogResposta que armazenam o caminho dos últimos xmls enviados e recebidos respectivamente. Com isso podemos ler estes arquivos e capturar o conteúdo desses xmls em tempo de execução para, por exemplo, armazenar em um banco de dados.
Para quem utilizava a montagem do XML via dataset, no vídeo abaixo eu dou mais detalhes de como montar o Tx2 em tempo de execução, que é como se fossemos criar um arquivo .txt em tempo de execução.
- Link para o dicionário do Tx2
- Link Propriedades de Log (OCX)
Como era:
ConverterEnvioNFSe(const aTX2Envio: string; aParams: string): XMLString
Enviar(const aXML : XMLString; const aParams : string) : TspdProtocoloNFSe;
EnviarSincrono(const aXML : XMLString; const aParams : string) : XMLString;
* Também não é mais necessário os métodos de converter/tratar o retorno para cada tipo de envio, verificar item 8
Como ficou:
NFSe.ParametrosExtras := aParams;
NFSe.Enviar(const aTx2 : String) : String;
4. Método de Consulta:
No componenet NFSe V1 tínhamos 3 métodos de consulta: Consultar por Lote, Consultar pela NFSe e Consultar pelos dados do RPS. Agora temos apenas o método Consultar.
Este único método poderá receber as informações de Lote, RPS ou NFSe. Com isso o método irá selecionar o melhor dado para fazer a consulta da nota naquela cidade e obter o xml.
Como era:
ConsultarLote(const aProtocolo : string; const aParams : string='') : XMLString;
ConsultarNFSePorRPS(const aNumeroRPS, aSerieRPS, aTipoRPS : string; aParams : string) : XMLString;
ConsultarNota(const aNumeroNota : string; const aParams : string='') : XMLString;
Como ficou:
NFSe.ParametrosExtras := aParams;
NFSe.Consultar(const aNumeroNFse: string=''; aNumeroRPS: string=''; aSerie: string=''; aTipo: string=''; aProtocolo: string=''): String;
5. Método de Imprimir e Visualizar:
Os métodos de impressão da nota do componente têm uma novidade muito bem vinda para quem trabalha com os campos customizados, que são os campos que não retornam no xml da prefeitura e podemos incluir na impressão.
Antes era necessário passar isso via código, agora isso é feito via Tx2.
Como era:
ImprimirDocumento(const aXML: XMLString = ''; const aArquivoRtm : string = ''; const aNomeImpressora : String = '');
* Como era para incluir campos customizados:
(ProxyNFSe.ComponenteNFSe.ColecaoAtiva.Name = 'FissLex') then
begin
with ProxyNFSe.ComponenteNFSe.Impressao do
begin
First;
while not Eof do
begin
Editar;
Campo('OutrasInformacoesCliente').AsString := 'TESTE TESTE';
Salvar;
Next;
end;
Como ficou:
Imprimir('Xml da NFSe', 'XML do RPS', 'Meu arquivoTx2', 'Nome impressora');
* No parâmetro 'Meu ArquivoTx2' você vai informar um Tx2 que contenha os campos customizados desejados para aquela cidade que podem ser conferidos em nossa Documentação os disponíveis
6. Método de Exportar para PDF:
Algumas cidades não retornam o xml completo da NFSe, ao invés disso é informado um link no xml para o download do PDF da nota, por exemplo como <LinkNFSe></LinkNFSe>
Por conta disso, era usado o método de Obter Link de impressão da NFSe. Na nova versão, isso está encapsulado no método de ExportarPDF, se ele identificar que há o link no Xml ele irá fazer o download por ele.
Além dessa novidade acima, o método segue sem mais alterações.
ExportarImpressaoParaPDF(const aXmlNFSe, aXmlRPs: XMLString; const aCamposCustomizados: string=''; const aDiretorioDestinoPDF: string);
7. Método Consultar cidades homologadas:
Foi implentada uma função simples na NFSeV2 para listar as cidades que estão compatíveis e homologadas no componente:
Como é:
var
_xml : String;
begin
_xml := NFSe.ConsultarCidadesHomologadas;
...
...
end;
Exemplo do retorno:
<MARINGAPR>
<Padrao>MARINGA</Padrao>
<ConsultarNotasTomada>True</ConsultarNotasTomada>
<TipoComunicacao>Soap</TipoComunicacao>
<CodigoIBGE>4115200</CodigoIBGE>
<Multiservicos>False</Multiservicos>
<Certificado>True</Certificado>
<Login>False</Login>
<Senha>False</Senha>
</MARINGAPR>
- Link para o método de Consultar cidades
8. Retorno e tratamento em JSON, antigo ConverterX:
Nos método usados pelo componentes são gerados retornos em JSON de informações da prefeitura que já são tratadas pelo componente. Com isso temos as seguintes funções em nossa demonstração para ajudar a obter este retorno:
getRetornoV2Tipado;
getRetornoV2Json;
Como fica o retorno de um Envio pela NFse V2:
{
"resposta":[
{
"status" : "SUCESSO",
"motivo" : "",
"protocolo" : "",
"cnpj" : "99999999999999",
"inscMunicipal" : "9999",
"numeroRps" : "195",
"serieRps" : "1",
"tipo" : "1",
"numeroNFSe" : "93",
"dataEmissaoNFSe" : "2020-04-15T00:00:00-03:00",
"codVerificacao" : "XXXXXYYYYYY",
"situacao" : "AUTORIZADA",
"dataAutorizacao" : "2020-04-15",
"dataCancelamento" : "2020-04-15T16:12:54.059-03:00",
"chaveCancelamento" : "93|93_195_1_1",
"xmlImpressao" : "XML da NFSe"
}
]
}
* Note que já tempos a chave de cancelamento tratada de acordo com a exigência daquela prefeitura.
Comentários
0 comentário
Por favor, entre para comentar.