O Componente NFS-e Nacional da Tecnospeed contém uma biblioteca contendo todos os métodos necessários para emitir a Nota Fiscal de Serviço eletrônica.
É a escolha ideal para quem pode consumir OCX e prefere manter todo o processo de mensageria da NFS-e dentro do próprio ambiente. Para utilizar o Componente em seu software, basta instanciá-lo em seu projeto, implementar chamadas para cada um dos métodos e configurá-los de acordo com sua necessidade.
Neste artigo você terá todas as informações para conseguir fazer o download da nova versão do componente e implementar todos os novos métodos para emitir e imprimir uma nota fiscal de serviço de forma absurdamente simples seguindo os seguintes passos.
- Instalando o Componente NFSe Nacional
- Configurando as propriedades NFSe Nacional
- AtualizarArquivos
- Consultar Cidades Conveniadas
- Entendendo o fluxo ideal de emissão da NFSe Nacional
- Gerando o arquivo de integração
- Enviar
- Enviar Manifestação
- Consultar NFSe
- Consultar Eventos
- Cancelar NFSe
- Exportar para PDF
- Imprimir
- Visualizar vencimento do Certificado
- Substituir
- Consultar Distribuição DFe
- Tratar Retorno Consulta DFe
- Descompactar Xml Zip
Instalando o Componente NFSe Nacional
Primeiramente, se você não possuí um Token de acesso é necessário realizar um cadastro no Tecno Account da Tecnospeed TI no link: https://conta.tecnospeed.com.br/
Caso você já possua um cadastro no TecnoAccount e um token, você irá utilizar este mesmo token, não sendo necessário um novo cadastro.
Clique em Criar uma conta e preencha os dados do formulário
Com a conta criada faça o login e pegue o seu Token
Esse Token será utilizado no método ConfigurarSoftwareHouse do componente, a baixo veremos como usar.
Se preparando para começar
Além do Componente NFS-e, você também precisará de um CNPJ com Inscrição Municipal, um certificado digital deste CNPJ. Com isso reunido, você poderá seguir este passo a passo detalhado:
Realizando o download
Download pelo portal do cliente
Após aprovação do pedido de adesão, em até 24 horas úteis, nossa equipe financeira irá realizar o faturamento e disponibilizar o Componente NFS-e Nacional para download na Central do Cliente. Você pode acessar a Central do Cliente com os dados de acesso que você preencheu no formulário de registro.
Com o Componente já disponível, na aba lateral Download, clique no botão Baixar. Caso o download não inicie, desabilite o bloqueador de pop-ups do seu navegador.
Download como versão Trial
Para fazer o download da versão Trial, é necessário acessar os repositórios da TecnoSpeed no GITHub através do link a baixo, e fazer o download de uma release, como na imagem a seguir.
Existem dois instaladores disponíveis para download na Central do Cliente: O Setup NFSe TecnoAccount e o Setup NFSe TecnoAccount Dependencias. O primeiro deve ser instalado no ambiente de desenvolvimento e o segundo no ambiente onde o sistema for ser executado.
No ambiente de desenvolvimento
No ambiente de desenvolvimento, nós devemos instalar a versão TecnoAccount, pois ela é a biblioteca completa, com todos os métodos e arquivos que o componente possui. Para instalá-la, basta executar o instalador e seguir as instruções na tela.
No ambiente do cliente
No ambiente onde o sistema for ser executado, devemos instalar a versão Dependencias, que é a versão Full reduzida, com apenas as DLLs necessárias para o componente funcionar. Para instalá-la, existem algumas opções: é possível simplesmente executar o instalador, como na versão Full, executar o instalador em modo silencioso, ou incluir as DLLs no seu próprio instalador.
Além das DLLs, é necessário que o componente tenha acesso às pastas de Esquemas, Templates, Scripts, aos arquivos com o endereço dos servidores e ao nfseLocaisNacional. Estas pastas e arquivos são criados no diretório de instalação da versão TecnoAccount (TecnoSpeed/NFSe Nacional/Arquivos). É necessário colocá-los no ambiente do cliente e configurar apenas uma única propriedade chamada "Arquivos".
Executando o instalador
Esta é a forma padrão de instalação. Basta executar o instalador e seguir as instruções na tela.
Executando o instalador em modo silencioso
Para evitar que o usuário precise realizar alguma interação, é possível incorporar um comando na sua aplicação ou instalador. Existem dois comandos disponíveis: Silent e VerySilent. O comando Silent irá exibir a interface de instalação, mas não permitirá que o usuário interaja com o instalador. Por outro lado, o comando VerySilent não exibirá nenhuma interface ao usuário, a instalação será executada em segundo plano.
Incluindo os arquivos no próprio instalador
O instalador das dependências apenas adiciona as DLLs onde ele é instalado. Para não utilizar o instalador, é possível incorporar as DLLs ao próprio instalador. Basta copiar ou registrar na pasta System32 ou SysWOW64 , caso o sistema seja 64 bits, e na pasta SysWOW64 para a versão de 32 bits do Windows.
DLLs que devem ser registradas:
- NFSeNacionalX.dll
- NFSeDataSetX.dll
- NFSeRESTX.dll
- NFSeSignerX.dll
- NFSeConverterX.ocx
- msxml6.dll
- midas.dll
- stdvcl40.dll
DLLs que devem ser apenas copiadas:
- ssleay32.dll
- libeay32.dll
- msxml6r.dll
- NFSeImpressaoRBUnicode.dll (Delphi XE ou superior)
- NFSeImpressaoRB.dll (Delphi inferior ou XE ou outras linguagens de programação)
Configurando as propriedades NFSe Nacional
As configurações do Componente NFSe Nacional podem ser configuradas utilizando um arquivo de configuração (.ini) ou através do código fonte.
Cada propriedade indica uma configuração. Por exemplo, a propriedade "Ambiente" determina para qual servidor o Componente irá enviar a nota (o de homologação ou de produção). Estas configurações estão divididas em dois tipos: as propriedades gerais do componente e as propriedades de e-mail.
Configurando pelo código fonte
É possível preencher as propriedades através do código fonte do sistema. Basta informar os valores desejados para cada uma delas. Você encontra uma lista completa de funções e exemplos de preenchimento das propriedades na seção propriedades do componente.
var
NFSe : TspdNFSeNacional;
begin
NFSe := TspdNFSeNacional.Create(nil);
NFSe.ConfigurarSoftwareHouse('CNPJ da Software House','Token gerado em TecnoAccount');
Exemplo do preenchimento de propriedades pelo código fonte:
Configurando pelo arquivo .ini
Também é possível preencher as propriedades através de um arquivo de configuração (.ini). Basta informar os valores desejados para cada uma delas e passar o diretório deste arquivo como parâmetro no método LoadConfig. Você encontra uma lista completa de funções e exemplos de preenchimento das propriedades na seção propriedades do componente.
Mesmo configurando o componente pelo arquivo .ini, o método configurarSoftwareHouse sempre deverá ser configurado após instanciar o componente da forma demonstrada abaixo.
var
NFSe : TspdNFSeNacional;
begin
NFSe := TspdNFSeNacional.Create(nil);
NFSe.ConfigurarSoftwareHouse('CNPJ da Software House','Token gerado em TecnoAccount');
NFSe.LoadConfig();
[NFSE] CIDADE=CIDADEUF Arquivos=C:\Program Files\TecnoSpeed\NFSe Nacional\Arquivos DiretorioLog=Log\ [MAIL] |
Atualizar Arquivos
O método AtualizarArquivos tem a funcionalidade de atualizar os arquivos referentes ao município em que o componente NFSe está configurado, que são eles: templates, esquemas, scripts, nfseLocaisNacional.ini layout de impressão e brasões.
Esses arquivos são cruciais para o funcionando do componente, com esse método é possível atualizar as cidades que estão conveniadas ao sistema da NFSe Nacional, sem que seja necessário atualizar a versão do componente.
Exemplo:
begin
NFSe.AtualizarArquivos;
...
end;
Delphi
C#
Visual Basic 6
PHP
Consultar Municípios Conveniados
O método ConsultarMunicipiosConveniados retorna um XML contendo as informações sobre as cidades homologadas pela TecnoSpeed até o momento, nesse XML existem informações como:
- Se o município está homologado no componente NFSe Nacional.
- Os convênios que a cidade possui.
Exemplo do XML:
<BONFIMRR>
<Homologado>True</Homologado>
<Convenios>
<EmissorNacional>True</EmissorNacional>
<AmbienteNacional>True</AmbienteNacional>
<MAN>False</MAN>
<AproveitametoDeCreditos>False</AproveitametoDeCreditos>
</Convenios>
</BONFIMRR>
Esse método é muito útil caso você queira saber algumas informações importantes sobre o município que desejar sem que seja preciso entrar em contato com a consultoria técnica da TecnoSpeed.
Exemplo:
var
_xml : String;
begin
_xml := NFSe.ConsultarCidadesHomologadas;
...
end;
Entendendo o fluxo ideal de emissão da NFSe Nacional
Segue abaixo o fluxograma com a rotina de autorização de uma NFS-e:
Inicialmente, precisamos configurar o componente NFSe Nacional. Feito isso, podemos chamar o método Enviar informando o Tx2 como parâmetro do método, nessa estapa o componente se encarregara de gerar o xml, assinar e enviar de forma automática.
Feito o envia, precisamos verificar qual a situação do Lote através da propriedade instância da NFSe Nacional, Exemplo: NFSe.RetornoWS.Items[i].Status.
A partir desse momento, podem existir 2 possíveis casos de Status, são eles:
SUCESSO:
A nota foi autorizada no WebService da prefeitura e não é necessário realizar nenhuma consulta.
ERRO:
A nota foi Rejeitada pelo WebService da prefeitura, é necessário aplicar as correções descritas no parâmetro Motivo, Exemplo: NFSe.RetornoWS.Items[i].Motivo e chamar o método Enviar novamente.
Falaremos mais sobre o objeto RetornoWS nos próximos tópicos.
Gerando o arquivo de integração
Para gerar este arquivo de integração, é necessário preencher os campos relacionados ao Lote / DPS de acordo com as informações necessárias para a emissão da NFSe. Para informar estes dados, é necessário seguir a Documentação do Arquivo de Integração TX2 do padrão nacional.
Após gerar o arquivo de integração (Tx2), ele já pode ser submetido ao método Enviar.
Método Enviar (aTx2)
O método Enviar se encarrega de Gerar o Xml, assinar e enviar de forma automática.
Exemplo:
NFSe.Enviar(const aTx2 : String) : String;
Parâmetros
Argumento | Tipo | Detalhes |
aTx2 | String | Tx2 padrão nacional a ser enviado |
Retorno
- O retorno estará na propriedade RetornoWS do NFSe, Exemplo NFSe.RetornoWS.
- O NFSe.RetornoWS terá um contador de iterações podendo ter 1 ou muitas posições dependendo da quantidade de DPS enviados no tx2.
- NFSe.RetornoWS.Items[0..N]
- O NFSe.RetornoWS.Items[0..N] terá os seguintes campos de cada nota:
- NFSe.RetornoWS.Items[0..N]
- O NFSe.RetornoWS terá um contador de iterações podendo ter 1 ou muitas posições dependendo da quantidade de DPS enviados no tx2.
- A instância NFSe conta com duas funções de retorno, a função RetornoJson e RetornoCSV onde cada uma contém seus respectivos tipos de retorno.
Existem 2 possíveis situações para o Status:
SUCESSO:
- Status: SUCESSO
- Protocolo:
- CNPJ: 99999999999999
- Inscricao Municipal: 999999
- Serie do DPS: 1
- Número do DPS: 164
- Número da NFS-e: 86
- Data de Emissão: 2020-03-25T00:00:00-03:00
- Código de Verificação: XXXX-YYYYY
- Situação: AUTORIZADA
- Data De Cancelamento: 2020-03-25T16:56:05.941-03:00
- Chave de Cancelamento: 86
- Tipo: 1
- Motivo:
- XML: <XmlCompletoDaNotaAutorizada>
- Data de Autorização: 2020-03-25
Nesse caso, não é necessário realizar nenhuma consulta pois a nota já está autorizada e as suas informações podem ser acessadas através da NFSe.RetornoWS.Items[0..n].NomeDaPropriedade
ERRO:
- Status: ERRO
- Motivo: BTH03-Lote de DPS já enviado. (Favor verificar se o lote já não foi enviado anteriormente, ou se a numeração do lote foi incrementada.)
A nota foi rejeitada com o Motivo descrito na propriedade NFSE.RetornoWS.Items[0].Motivo;
Abaixo temos um exemplo de retorno da função NFSe.RetornoJson:
{
"resposta":[
{
"status" : "SUCESSO",
"motivo" : "",
"cnpj" : "99999999999999",
"inscMunicipal" : "999999",
"numeroDps" : "6",
"serieDps" : "900",
"numeroNFSe" : "15",
"dataEmissaoNFSe" : "2022-09-22T12:28:29",
"chaveAcessoNFSe" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"situacao" : "AUTORIZADA",
"dataAutorizacao" : "2022-09-22T12:28:29",
"dataCancelamento" : "",
"chaveCancelamento" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"xmlImpressao" : "XML da NFSe"
}
]
}
Abaixo temos um exemplo de retorno da função NFSe.RetornoCSV:
SUCESSO;;99999999999999;12346;900;6;15;2022-09-22T12:28:29;2022-09-22T12:28:29;00000000000000000000000000000000000000000000000000;AUTORIZADA;;00000000000000000000000000000000000000000000000000;<NFSe versao="1.00" xmlns="http://www.sped.fazenda.gov.br/nfse"><infNFSe Id="NFS00000000000000000000000000000000000000000000000000"><xLocEmi>Bonfim</xLocEmi><xLocPrestacao>Bonfim</xLocPrestacao><nNFSe>15</nNFSe><cLocIncid>1400159</cLocIncid><xLocIncid>Bonfim</xLocIncid><xTribNac>Análise e desenvolvimento de sistemas.</xTribNac><verAplic>Testes_0.1.0</verAplic><ambGer>2</ambGer><tpEmis>1</tpEmis><procEmi>1</procEmi><cStat>100</cStat><dhProc>2022-09-22T12:28:29-03:00</dhProc><nDFSe>001</nDFSe><emit><CNPJ>99999999999999</CNPJ><IM>123456</IM><xNome>Emitente</xNome><enderNac><xLgr>RUA A</xLgr><nro>10</nro><xBairro>CENTRO</xBairro><cMun>1400159</cMun><UF>RR</UF><CEP>69380000</CEP></enderNac></emit><valores><vBC>1.00</vBC><vTotalRet>0.00</vTotalRet><vLiq>1.00</vLiq></valores><DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00"><infDPS Id="DPS000000000000000000000000000000000000000000"><tpAmb>2</tpAmb><dhEmi>2022-09-22T10:36:00-03:00</dhEmi><verAplic>Testes_0.1.0</verAplic><serie>900</serie><nDPS>6</nDPS><dCompet>2022-09-22</dCompet><tpEmit>1</tpEmit><cLocEmi>1400159</cLocEmi><prest><CNPJ>88888888888888</CNPJ><IM>56789</IM><regTrib><opSimpNac>1</opSimpNac><regEspTrib>1</regEspTrib></regTrib></prest><serv><locPrest><cLocPrestacao>1400159</cLocPrestacao></locPrest><cServ><cTribNac>010101</cTribNac><xDescServ>Teste Emissao Web</xDescServ></cServ></serv><valores><vServPrest><vServ>1.00</vServ></vServPrest><trib><tribMun><tribISSQN>1</tribISSQN><tpRetISSQN>1</tpRetISSQN></tribMun><totTrib><pTotTrib><pTotTribFed>1</pTotTribFed><pTotTribEst>1</pTotTribEst><pTotTribMun>1</pTotTribMun></pTotTrib></totTrib></trib></valores></infDPS></DPS></infNFSe></NFSe>;;
Exemplos
Delphi
var
i: Integer;
begin
NFSe.Enviar("Conteúdo do aTx2");
mmTipado.Clear;
for i := 0 to NFSe.RetornoWS.Count - 1 do
begin
if NFSe.RetornoWS.Items[i].Status = 'ERRO' then
begin
mmTipado.Lines.Add('Status: ERRO');
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
end
else
begin
mmTipado.Lines.Add('Status: ' + NFSe.RetornoWS.Items[i].Status);
mmTipado.Lines.Add('CNPJ: ' + NFSe.RetornoWS.Items[i].CNPJ);
mmTipado.Lines.Add('Inscricao Municipal: ' + NFSe.RetornoWS.Items[i].InscricaoMunicipal);
mmTipado.Lines.Add('Serie do DPS: ' + NFSe.RetornoWS.Items[i].SerieDps);
mmTipado.Lines.Add('Número do DPS: ' + NFSe.RetornoWS.Items[i].NumeroDps);
mmTipado.Lines.Add('Número da NFS-e: ' + NFSe.RetornoWS.Items[i].NumeroNFSe);
mmTipado.Lines.Add('Data de Emissão: ' + NFSe.RetornoWS.Items[i].DataEmissaoNFSe);
mmTipado.Lines.Add('Chave Acesso NFSe: ' + NFSe.RetornoWS.Items[i].ChaveAcessoNFSe);
mmTipado.Lines.Add('Situação: ' + NFSe.RetornoWS.Items[i].Situacao);
mmTipado.Lines.Add('Data De Cancelamento: ' + NFSe.RetornoWS.Items[i].DataCancelamento);
mmTipado.Lines.Add('Chave de Cancelamento: ' + NFSe.RetornoWS.Items[i].ChaveCancelamento);
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
mmTipado.Lines.Add('XML: ' + NFSe.RetornoWS.Items[i].XmlImpressao);
mmTipado.Lines.Add('Data de Autorização: ' + NFSe.RetornoWS.Items[i].DataAutorizacao);
mmTipado.Lines.Add('');
mmTipado.Lines.Add('================================================');
mmTipado.Lines.Add('');
end;
end;
mmJson.Lines.Add(NFSe.RetornoJson);
mCSV.Lines.Add(NFSe.RetornoCSV);
end;
C#
NFSe.Enviar("Conteúdo do aTx2");
Visual Basic
NFSe.Enviar "Conteúdo do aTx2"
PHP
$NFSe -> Enviar("Conteúdo do aTx2");
Enviar Manifestação
O método EnviarManifestacao tem a funcionalidade de declarar uma confirmação ou rejeição do Prestador, Tomador ou Intermediário do serviço relacionado a nota fiscal.
Exemplo:
begin
mmXML.Text := NFSe.EnviarManifestacao("Tipo Manifestacao", "Chave Acesso NFSe", "Codigo Rejeicao", "Motivo Rejeicao");
...
end;
Parâmetros
Argumento | Tipo | Detalhes |
aTipoManifestacao | Integer | Tipos possíveis: 1 e 2 - Manifestação do Prestador 3 e 4 - Manifestação do Tomador 5 e 6 - Manifestação do Intermediário Sendo eles: 1, 3 e 5 - Manifestações de Confirmação 2, 4 e 6 - Manifestações de Rejeição |
aChaveAcesso | String | Chave Acesso da NFSe cuja nota deseja realizar o envio da manifestação |
aCodigoMotivo | String |
Código Motivo de Rejeição da NFS-e: 1 - NFS-e em duplicidade; |
aDescricaoMotivo | String | Descrição do motivo de Rejeição. Preencher somente quando o código for "9 - Outros" |
Delphi
C#
Visual Basic 6
PHP
Consultar NFSe
ConsultarNFSe(aChaveAcessoNFSe)
Realiza a consulta necessária para obter a nota com base nos parâmetros de entrada.
Caso desejar chamar o método de consulta mesmo assim, aconselhamos que todos os parâmetros do método Consultar sejam preenchidos, pois dessa forma, o componente se encarregará de realizar a consulta da melhor maneira possível.
Obs.: Nessa consulta a nota sempre estará com situação AUTORIZADA. Para verificar se a NFSe está com situação CANCELADA ou SUBSTITUIDA será necessário realizar a consulta de Eventos.
Exemplo:
ConsultarNFSe(const aChaveAcessoNFSe: string): String;
Parâmetros
Argumento | Tipo | Detalhes |
aChaveAcessoNFSe | String | Chave Acesso da NFSe cuja nota deseja consultar |
Retorno
O retorno estará na propriedade RetornoWS do NFSe, Exemplo NFSe.RetornoWS.
- O NFSe.RetornoWS terá um contador de interações podendo ter 1 ou muitas posições dependendo da quantidade de DPS enviados no tx2.
- NFSe.RetornoWS.Items[0..N]
- O NFSe.RetornoWS.Items[0..N] terá os seguintes campos de cada nota:
- NFSe.RetornoWS.Items[0..N]
- A instância NFSe conta com duas funções de retorno, a função RetornoJson e RetornoCSV onde cada uma contém seus respectivos tipos de retorno.
Existem 2 possíveis situações para o Status:
SUCESSO:
- Status: SUCESSO
- Protocolo:
- CNPJ: 99999999999999
- Inscricao Municipal: 999999
- Serie do DPS: 1
- Número do DPS: 164
- Número da NFS-e: 86
- Data de Emissão: 2020-03-25T00:00:00-03:00
- Código de Verificação: XXXX-YYYYY
- Situação: AUTORIZADA
- Data De Cancelamento: 2020-03-25T16:56:05.941-03:00
- Chave de Cancelamento: 86|86_164_1_1
- Tipo: 1
- Motivo:
- XML: <XmlCompletoDaNotaAutorizada>
- Data de Autorização: 2020-03-25
Nesse caso, não é necessário realizar nenhuma consulta pois a nota já está autorizada e as suas informações podem ser acessadas através da NFSe.RetornoWS.Items[0..n].NomeDaPropriedade
ERRO:
- Status: ERRO
- Motivo: E4004-Chave de acesso não encontrada. ()
A nota foi rejeitada com o Motivo descrito na propriedade NFSE.RetornoWS.Items[0].Motivo;
Abaixo temos um exemplo de retorno da função NFSe.RetornoJson:
{
"resposta":[
{
"status" : "SUCESSO",
"motivo" : "",
"cnpj" : "99999999999999",
"inscMunicipal" : "999999",
"numeroDps" : "6",
"serieDps" : "900",
"numeroNFSe" : "15",
"dataEmissaoNFSe" : "2022-09-22T12:28:29",
"chaveAcessoNFSe" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"situacao" : "AUTORIZADA",
"dataAutorizacao" : "2022-09-22T12:28:29",
"dataCancelamento" : "",
"chaveCancelamento" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"xmlImpressao" : "XML da NFSe"
}
]
}
Abaixo temos um exemplo de retorno da função NFSe.RetornoCSV:
SUCESSO;;99999999999999;12346;900;6;15;2022-09-22T12:28:29;2022-09-22T12:28:29;00000000000000000000000000000000000000000000000000;AUTORIZADA;;00000000000000000000000000000000000000000000000000;<NFSe versao="1.00" xmlns="http://www.sped.fazenda.gov.br/nfse"><infNFSe Id="NFS00000000000000000000000000000000000000000000000000"><xLocEmi>Bonfim</xLocEmi><xLocPrestacao>Bonfim</xLocPrestacao><nNFSe>15</nNFSe><cLocIncid>1400159</cLocIncid><xLocIncid>Bonfim</xLocIncid><xTribNac>Análise e desenvolvimento de sistemas.</xTribNac><verAplic>Testes_0.1.0</verAplic><ambGer>2</ambGer><tpEmis>1</tpEmis><procEmi>1</procEmi><cStat>100</cStat><dhProc>2022-09-22T12:28:29-03:00</dhProc><nDFSe>001</nDFSe><emit><CNPJ>99999999999999</CNPJ><IM>123456</IM><xNome>Emitente</xNome><enderNac><xLgr>RUA A</xLgr><nro>10</nro><xBairro>CENTRO</xBairro><cMun>1400159</cMun><UF>RR</UF><CEP>69380000</CEP></enderNac></emit><valores><vBC>1.00</vBC><vTotalRet>0.00</vTotalRet><vLiq>1.00</vLiq></valores><DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00"><infDPS Id="DPS000000000000000000000000000000000000000000"><tpAmb>2</tpAmb><dhEmi>2022-09-22T10:36:00-03:00</dhEmi><verAplic>Testes_0.1.0</verAplic><serie>900</serie><nDPS>6</nDPS><dCompet>2022-09-22</dCompet><tpEmit>1</tpEmit><cLocEmi>1400159</cLocEmi><prest><CNPJ>88888888888888</CNPJ><IM>56789</IM><regTrib><opSimpNac>1</opSimpNac><regEspTrib>1</regEspTrib></regTrib></prest><serv><locPrest><cLocPrestacao>1400159</cLocPrestacao></locPrest><cServ><cTribNac>010101</cTribNac><xDescServ>Teste Emissao Web</xDescServ></cServ></serv><valores><vServPrest><vServ>1.00</vServ></vServPrest><trib><tribMun><tribISSQN>1</tribISSQN><tpRetISSQN>1</tpRetISSQN></tribMun><totTrib><pTotTrib><pTotTribFed>1</pTotTribFed><pTotTribEst>1</pTotTribEst><pTotTribMun>1</pTotTribMun></pTotTrib></totTrib></trib></valores></infDPS></DPS></infNFSe></NFSe>;;
Exemplos
Delphi
var
i: Integer;
begin
mmTipado.Clear;
for i := 0 to NFSe.RetornoWS.Count - 1 do
begin
if NFSe.RetornoWS.Items[i].Status = 'ERRO' then
begin
mmTipado.Lines.Add('Status: ERRO');
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
end
else
begin
mmTipado.Lines.Add('Status: ' + NFSe.RetornoWS.Items[i].Status);
mmTipado.Lines.Add('CNPJ: ' + NFSe.RetornoWS.Items[i].CNPJ);
mmTipado.Lines.Add('Inscricao Municipal: ' + NFSe.RetornoWS.Items[i].InscricaoMunicipal);
mmTipado.Lines.Add('Serie do DPS: ' + NFSe.RetornoWS.Items[i].SerieDps);
mmTipado.Lines.Add('Número do DPS: ' + NFSe.RetornoWS.Items[i].NumeroDps);
mmTipado.Lines.Add('Número da NFS-e: ' + NFSe.RetornoWS.Items[i].NumeroNFSe);
mmTipado.Lines.Add('Data de Emissão: ' + NFSe.RetornoWS.Items[i].DataEmissaoNFSe);
mmTipado.Lines.Add('Chave Acesso NFSe: ' + NFSe.RetornoWS.Items[i].ChaveAcessoNFSe);
mmTipado.Lines.Add('Situação: ' + NFSe.RetornoWS.Items[i].Situacao);
mmTipado.Lines.Add('Data De Cancelamento: ' + NFSe.RetornoWS.Items[i].DataCancelamento);
mmTipado.Lines.Add('Chave de Cancelamento: ' + NFSe.RetornoWS.Items[i].ChaveCancelamento);
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
mmTipado.Lines.Add('XML: ' + NFSe.RetornoWS.Items[i].XmlImpressao);
mmTipado.Lines.Add('Data de Autorização: ' + NFSe.RetornoWS.Items[i].DataAutorizacao);
mmTipado.Lines.Add('');
mmTipado.Lines.Add('================================================');
mmTipado.Lines.Add('');
end;
end;
mmJson.Lines.Add(NFSe.RetornoJson);
mCSV.Lines.Add(NFSe.RetornoCSV);
end;
C#
retorno = NFSe.ConsultarNFSe("Chave Acesso da NFSe");
Visual Basic 6
retorno = NFSe.ConsultarNFSe"Chave Acesso da NFSe"
PHP
$retorno = $NFSe->ConsultarNFSe("Chave Acesso da NFSe");
Consultar Eventos
ConsultarEventosNFSe(aChaveAcessoNFSe)
Realiza a consulta de eventos obter os eventos vinculados a nota. Somente com essa consulta é possível verificar se a nota está com situação CANCELADA ou SUBSTITUIDA.
Exemplo:
ConsultarEventosNFSe(const aChaveAcessoNFSe: string): String;
Parâmetros
Argumento | Tipo | Detalhes |
aChaveAcessoNFSe | String | Chave Acesso da NFSe cuja eventos da nota deseja consultar |
Retorno
O retorno estará na propriedade RetornoWS do NFSe, Exemplo NFSe.RetornoWS.
- O NFSe.RetornoWS terá um contador de interações podendo ter 1 ou muitas posições dependendo da quantidade de DPS enviados no tx2.
- NFSe.RetornoWS.Items[0..N]
- O NFSe.RetornoWS.Items[0..N] terá os seguintes campos de cada nota:
- NFSe.RetornoWS.Items[0..N]
- A instância NFSe conta com duas funções de retorno, a função RetornoJson e RetornoCSV onde cada uma contém seus respectivos tipos de retorno.
Existem 2 possíveis situações para o Status:
SUCESSO:
- Status: SUCESSO
- Protocolo:
- CNPJ: 99999999999999
- Inscricao Municipal: 999999
- Serie do DPS: 1
- Número do DPS: 164
- Número da NFS-e: 86
- Data de Emissão: 2020-03-25T00:00:00-03:00
- Código de Verificação: XXXX-YYYYY
- Situação: CANCELADA
- Data De Cancelamento: 2020-03-25T16:56:05.941-03:00
- Chave de Cancelamento: 86|86_164_1_1
- Tipo: 1
- Motivo:
- XML: <XmlCompletoDaNotaAutorizada>
- Data de Autorização: 2020-03-25
Nesse caso, não é necessário realizar nenhuma consulta pois a nota já está autorizada e as suas informações podem ser acessadas através da NFSe.RetornoWS.Items[0..n].NomeDaPropriedade
ERRO:
- Status: ERRO
- Motivo: E4004-Chave de acesso não encontrada. ()
A nota foi rejeitada com o Motivo descrito na propriedade NFSE.RetornoWS.Items[0].Motivo;
Abaixo temos um exemplo de retorno da função NFSe.RetornoJson:
{
"resposta":[
{
"status" : "SUCESSO",
"motivo" : "",
"cnpj" : "99999999999999",
"inscMunicipal" : "999999",
"numeroDps" : "6",
"serieDps" : "900",
"numeroNFSe" : "15",
"dataEmissaoNFSe" : "2022-09-22T12:28:29",
"chaveAcessoNFSe" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"situacao" : "CANCELADA",
"dataAutorizacao" : "2022-09-22T12:28:29",
"dataCancelamento" : "",
"chaveCancelamento" : "XXXXXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYY",
"xmlImpressao" : "XML da NFSe"
}
]
}
Abaixo temos um exemplo de retorno da função NFSe.RetornoCSV:
SUCESSO;;99999999999999;12346;900;6;15;2022-09-22T12:28:29;2022-09-22T12:28:29;00000000000000000000000000000000000000000000000000;CANCELADA;;00000000000000000000000000000000000000000000000000;<NFSe versao="1.00" xmlns="http://www.sped.fazenda.gov.br/nfse"><infNFSe Id="NFS00000000000000000000000000000000000000000000000000"><xLocEmi>Bonfim</xLocEmi><xLocPrestacao>Bonfim</xLocPrestacao><nNFSe>15</nNFSe><cLocIncid>1400159</cLocIncid><xLocIncid>Bonfim</xLocIncid><xTribNac>Análise e desenvolvimento de sistemas.</xTribNac><verAplic>Testes_0.1.0</verAplic><ambGer>2</ambGer><tpEmis>1</tpEmis><procEmi>1</procEmi><cStat>100</cStat><dhProc>2022-09-22T12:28:29-03:00</dhProc><nDFSe>001</nDFSe><emit><CNPJ>99999999999999</CNPJ><IM>123456</IM><xNome>Emitente</xNome><enderNac><xLgr>RUA A</xLgr><nro>10</nro><xBairro>CENTRO</xBairro><cMun>1400159</cMun><UF>RR</UF><CEP>69380000</CEP></enderNac></emit><valores><vBC>1.00</vBC><vTotalRet>0.00</vTotalRet><vLiq>1.00</vLiq></valores><DPS xmlns="http://www.sped.fazenda.gov.br/nfse" versao="1.00"><infDPS Id="DPS000000000000000000000000000000000000000000"><tpAmb>2</tpAmb><dhEmi>2022-09-22T10:36:00-03:00</dhEmi><verAplic>Testes_0.1.0</verAplic><serie>900</serie><nDPS>6</nDPS><dCompet>2022-09-22</dCompet><tpEmit>1</tpEmit><cLocEmi>1400159</cLocEmi><prest><CNPJ>88888888888888</CNPJ><IM>56789</IM><regTrib><opSimpNac>1</opSimpNac><regEspTrib>1</regEspTrib></regTrib></prest><serv><locPrest><cLocPrestacao>1400159</cLocPrestacao></locPrest><cServ><cTribNac>010101</cTribNac><xDescServ>Teste Emissao Web</xDescServ></cServ></serv><valores><vServPrest><vServ>1.00</vServ></vServPrest><trib><tribMun><tribISSQN>1</tribISSQN><tpRetISSQN>1</tpRetISSQN></tribMun><totTrib><pTotTrib><pTotTribFed>1</pTotTribFed><pTotTribEst>1</pTotTribEst><pTotTribMun>1</pTotTribMun></pTotTrib></totTrib></trib></valores></infDPS></DPS></infNFSe></NFSe>;;
Exemplos
Delphi
var
i: Integer;
begin
mmTipado.Clear;
for i := 0 to NFSe.RetornoWS.Count - 1 do
begin
if NFSe.RetornoWS.Items[i].Status = 'ERRO' then
begin
mmTipado.Lines.Add('Status: ERRO');
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
end
else
begin
mmTipado.Lines.Add('Status: ' + NFSe.RetornoWS.Items[i].Status);
mmTipado.Lines.Add('CNPJ: ' + NFSe.RetornoWS.Items[i].CNPJ);
mmTipado.Lines.Add('Inscricao Municipal: ' + NFSe.RetornoWS.Items[i].InscricaoMunicipal);
mmTipado.Lines.Add('Serie do DPS: ' + NFSe.RetornoWS.Items[i].SerieDps);
mmTipado.Lines.Add('Número do DPS: ' + NFSe.RetornoWS.Items[i].NumeroDps);
mmTipado.Lines.Add('Número da NFS-e: ' + NFSe.RetornoWS.Items[i].NumeroNFSe);
mmTipado.Lines.Add('Data de Emissão: ' + NFSe.RetornoWS.Items[i].DataEmissaoNFSe);
mmTipado.Lines.Add('Chave Acesso NFSe: ' + NFSe.RetornoWS.Items[i].ChaveAcessoNFSe);
mmTipado.Lines.Add('Situação: ' + NFSe.RetornoWS.Items[i].Situacao);
mmTipado.Lines.Add('Data De Cancelamento: ' + NFSe.RetornoWS.Items[i].DataCancelamento);
mmTipado.Lines.Add('Chave de Cancelamento: ' + NFSe.RetornoWS.Items[i].ChaveCancelamento);
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
mmTipado.Lines.Add('XML: ' + NFSe.RetornoWS.Items[i].XmlImpressao);
mmTipado.Lines.Add('Data de Autorização: ' + NFSe.RetornoWS.Items[i].DataAutorizacao);
mmTipado.Lines.Add('');
mmTipado.Lines.Add('================================================');
mmTipado.Lines.Add('');
end;
end;
mmJson.Lines.Add(NFSe.RetornoJson);
mCSV.Lines.Add(NFSe.RetornoCSV);
end;
C#
retorno = NFSe.ConsultarEventosNFSe("Chave Acesso da NFSe");
Visual Basic 6
retorno = NFSe.ConsultarEventosNFSe"Chave Acesso da NFSe"
PHP
$retorno = $NFSe->ConsultarEventosNFSe("Chave Acesso da NFSe");
Cancelar NFSe
Cancela uma NFSe e automaticamente realiza a consulta da nota cancelada. Nesse caso não é necessário chamar o método Consultar para obter a nota cancelada.
Utilize o campo "Chave de Cancelamento: XXXXXXXXXXXXXXXXXXXXXXXX" obtido no retorno do método Enviar ou Consultar para realizar o cancelamento.
Exemplo:
NFSe.CancelarNFSe(NFSe.RetornoWS.Items[i].ChaveCancelamento);
Parâmetros
Argumento | Tipo | Detalhes |
aChaveCancelamento | String | Chave contendo informações para identificar uma nota |
Retorno
- O retorno estará na propriedade RetornoWS do NFSe, Exemplo: NFSe.RetornoWS.
- O NFSe.RetornoWS terá um contador de interações, no caso do Cancelar, terá apenas 1 posição.
- O NFSe.RetornoWS.Items[0] terá os seguintes campos de cada nota.
- O NFSe.RetornoWS terá um contador de interações, no caso do Cancelar, terá apenas 1 posição.
- A instância NFSe conta com duas funções de retorno, a função RetornoJson e RetornoCSV onde cada uma contém seus respectivos tipos de retorno.
Existem 2 possíveis situações para o Status:
SUCESSO:
- Status: SUCESSO
- Data De Cancelamento: 2020-03-25T16:56:05.941-03:00
Nesse caso, o município ao qual o componente está configurado, não possuí o método Consultar previsto pela prefeitura.
ERRO:
- Status: ERRO
Motivo: E0819-O pedido de registro de evento não pode ser validado pois a NFS-e indicada não existe no Ambiente de Dados Nacional NFS-e. ()
O cancelamento da nota foi rejeitada com o Motivo descrito na propriedade NFSE.RetornoWS.Items[0].Motivo;
Abaixo temos um exemplo de retorno da função NFSe.RetornoJson:
{
"resposta":[
{
"status" : "SUCESSO",
"motivo" : "",
"cnpj" : "",
"inscMunicipal" : "",
"numeroDps" : "",
"serieDps" : "",
"numeroNFSe" : "",
"dataEmissaoNFSe" : "",
"chaveAcessoNFSe" : "",
"situacao" : "",
"dataAutorizacao" : "",
"dataCancelamento" : "2022-09-22T12:28:29",
"chaveCancelamento" : "",
"xmlImpressao" : ""
}
]
}
Abaixo temos um exemplo de retorno da função NFSe.RetornoCSV:
SUCESSO;;;;;;;;;;;2022-09-22T12:28:29;;;;
Exemplos
Delphi
var
i: Integer;
begin
NFSe.CancelarNFSe(aChaveCancelamento);
mmTipado.Clear;
for i := 0 to NFSe.RetornoWS.Count - 1 do
begin
if NFSe.RetornoWS.Items[i].Status = 'ERRO' then
begin
mmTipado.Lines.Add('Status: ERRO');
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
end
else
begin
mmTipado.Lines.Add('Status: ' + NFSe.RetornoWS.Items[i].Status);
mmTipado.Lines.Add('CNPJ: ' + NFSe.RetornoWS.Items[i].CNPJ);
mmTipado.Lines.Add('Inscricao Municipal: ' + NFSe.RetornoWS.Items[i].InscricaoMunicipal);
mmTipado.Lines.Add('Serie do DPS: ' + NFSe.RetornoWS.Items[i].SerieDps);
mmTipado.Lines.Add('Número do DPS: ' + NFSe.RetornoWS.Items[i].NumeroDps);
mmTipado.Lines.Add('Número da NFS-e: ' + NFSe.RetornoWS.Items[i].NumeroNFSe);
mmTipado.Lines.Add('Data de Emissão: ' + NFSe.RetornoWS.Items[i].DataEmissaoNFSe);
mmTipado.Lines.Add('Chave Acesso NFSe: ' + NFSe.RetornoWS.Items[i].ChaveAcessoNFSe);
mmTipado.Lines.Add('Situação: ' + NFSe.RetornoWS.Items[i].Situacao);
mmTipado.Lines.Add('Data De Cancelamento: ' + NFSe.RetornoWS.Items[i].DataCancelamento);
mmTipado.Lines.Add('Chave de Cancelamento: ' + NFSe.RetornoWS.Items[i].ChaveCancelamento);
mmTipado.Lines.Add('Motivo: ' + NFSe.RetornoWS.Items[i].Motivo);
mmTipado.Lines.Add('XML: ' + NFSe.RetornoWS.Items[i].XmlImpressao);
mmTipado.Lines.Add('Data de Autorização: ' + NFSe.RetornoWS.Items[i].DataAutorizacao);
mmTipado.Lines.Add('');
mmTipado.Lines.Add('================================================');
mmTipado.Lines.Add('');
end;
end;
mmJson.Lines.Add(NFSe.RetornoJson);
mCSV.Lines.Add(NFSe.RetornoCSV);
end;
C#
retorno = NFSe.CancelarNFSe("Chave da NFS-e");
Visual Basic 6
retorno = NFSe.CancelarNFSe"Chave da NFS-e"
PHP
$retorno = $NFSe->CancelarNFSe("Chave da NFS-e");
Exportar para PDF
Através desse método é possível exportar um PDF de NFSe ou DPS com os campos customizados.
No caso do componente nacional, é preciso ter configurado um certificado válido para imprimir a nota.
Exemplo:
ExportarImpressaoParaPDF(const aXmlNFSe, aXmlDPS: XMLString; const aCamposCustomizados: string=''; const aDiretorioDestinoPDF: string);
Parâmetros
Argumento | Tipo | Detalhes |
aXmlNFSe | String | Utilize esse parâmetro apenas para gerar um PDF com a impressão da NFSe, Caso quiser gerar um DPS, não informe esse campo. |
aXmlDPS | String | Utilize esse parâmetro para gerar um PDF com a impressão de DPS. |
aCamposCustomizados | String | Informe nesse parâmetro o arquivo Tx2 ou o caminho do arquivo Tx2, utilizado no envio da nota, o componente irá extrair os campos customizados contidos no Tx2 e preencher o DataSet de impressão automaticamente. |
aDiretorioDestinoPDF |
String |
Caminho onde o PDF será gerado, ex: C:\NFSe\minha-nfse.pdf |
Retorno
Esse método não possui retorno, ele é utilizado apenas para realizar a exportação de um PDF.
Exemplos
Exemplo de impressão de NFSe
-
ExportarImpressaoParaPDF('Xml da NFSe', 'XML do DPS', 'Meu arquivoTx2', 'C:\NFSe\minha-nfse.pdf');
- Para alguns municípios, é necessário informar o XML do DPS no parâmetro aXmlDPS para que todos os campos da nota sejam impressos corretamente, por esse motivo, aconselhamos que seja informado o xml de DPS juntamente com o de NFSe.
Exemplo de impressão de DPS
-
ExportarImpressaoParaPDF('', 'XML do DPS', 'Meu arquivoTx2', 'C:\NFSe\minha-nfse.pdf');
- É necessário que o primeiro parâmetro do método esteja vazio para imprimir um DPS.
Delphi
NFSe.ExportarImpressaoParaPDF('XML da NFSe', 'XML do DPS', 'Campos customizados utilizando o TX2', 'Caminho completo para salvar o PDF.');
C#
NFSe.ExportarImpressaoParaPDF("XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2", "Caminho completo para salvar o PDF.");
Visual Basic 6
NFSe.ExportarImpressaoParaPDF "XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2, "Caminho completo para salvar o PDF.""
PHP
$NFSe->ExportarImpressaoParaPDF ("XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2", "Caminho completo para salvar o PDF.");
Imprimir Nota
Através desse método é possível imprimir uma NFSe ou DPS com os campos customizados.
Parâmetros
Argumento | Tipo | Detalhes |
aXmlNFSe | String | Utilize este parâmetro apenas para gerar um PDF com a impressão da NFSe, Caso quiser gerar um DPS, não informe esse campo. |
aXmlDPS | String | Utilize este parâmetro para gerar um PDF com a impressão de DPS. |
aCamposCustomizados | String | Informe nesse parâmetro o arquivo Tx2 ou o caminho do arquivo Tx2 utilizado no envio da nota, o componente irá extrair os campos customizados contidos no Tx2 e preencher o DataSet de impressão automaticamente. |
aNomeImpressora | String | Utilize este parâmetro para informar o nome da impressora. |
Retorno
Esse método não possui retorno, ele é utilizado apenas para realizar a impressão.
Exemplos
Exemplo de impressão de NFSe:
-
Imprimir('Xml da NFSe', 'XML do DPS', 'Meu arquivoTx2', 'Nome impressora');
- Para alguns municípios, é necessário informar o XML do DPSno parâmetro aXmlDPS para que todos os campos da nota sejam impressos corretamente, por esse motivo, aconselhamos que seja informado o xml de DPS juntamente com o de NFSe.
Exemplo de impressão de DPS:
-
Imprimir('', 'XML do DPS', 'Meu arquivoTx2', 'Nome impressora');
- É necessário que o primeiro parâmetro do método esteja vazio para imprimir um DPS.
Delphi
NFSe.Imprimir('XML da NFSe', 'XML do DPS', 'Campos customizados utilizando o TX2', 'Nome impressora');
C#
NFSe.Imprimir("XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2", "Nome impressora");
Visual Basic 6
NFSe.Imprimir"XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2", "Nome impressora"
PHP
$NFSe->Imprimir("XML da NFSe", "XML do DPS", "Campos customizados utilizando o TX2", "Nome impressora");
- As impressoras devem estar instaladas e sendo reconhecidas pelo Windows.
Comentários
0 comentário
Por favor, entre para comentar.