TadaSoftware / PyNFe

Projeto de biblioteca para fazer interface com o webservice de Nota Fiscal eletrônica para Python, disponível sob LGPL.
http://groups.google.com/group/pynfe
Other
425 stars 173 forks source link

Serviço Paralisado #18

Closed Iazzetta closed 7 years ago

Iazzetta commented 7 years ago

Boa tarde, Estou tendo problemas para consultar as notas a partir do meu CNPJ. Ele sempre me retorna uma mensagem de Serviço Paralisado.

Segue o XML que ele retorna:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <nfeConsultaNFDestResult xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsultaDest">
      <retConsNFeDest xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
        <tpAmb>1</tpAmb>
        <verAplic>1.1.1</verAplic>
        <cStat>109</cStat>
        <xMotivo>Servico paralisado sem previsao</xMotivo>
        <dhResp>2017-08-03T16:55:47</dhResp>
      </retConsNFeDest>
    </nfeConsultaNFDestResult>
  </soap:Body>
</soap:Envelope>

Fora que também fica dando um erro de SSL. Eu importei o certificado em minha maquina, será que preciso importar e fazer os testes apenas no servidor onde eu tenho um certificado SSL instalado?

...connectionpool.py:791: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)

Codigo que estou usando para consultar:

from pynfe.processamento.comunicacao import ComunicacaoSefaz

certificado = "certificado.pfx"
senha = 'XXXXX'
uf = 'SP'
homologacao = False

con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
xml = con.consulta_notas_cnpj(cnpj='99999999999999', nsu=0)
print (xml.text)

Obrigado.

juniortada commented 7 years ago

Boa tarde @Iazzetta, esse webservice foi desativado dia 31/05/2017 de acordo com a NT 2014/002. Já o erro de SSL, na verdade é só um warning, a versão 4.0 da NF-e vai substituir o protocolo SSL pelo TLS.

Iazzetta commented 7 years ago

Então como posso consultar notas fiscais? Pois emiti uma nota fiscal e no site não consta. Todos os metodos do webservice de nota fiscal foram desativados ou apenas este de consultar? Tem alguma alternativa? Obrigado.

juniortada commented 7 years ago

Apenas este, mas acho que vc está se confundindo. Para consultar uma nota fiscal EMITIDA vc precisa utilizar o método Consulta Nota, ex:

con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
envio = con.consulta_nota('nfe', '99999999999999999999999999999999999999999999') # nfe ou nfce
print (envio.text)

link da documentação: https://github.com/leotada/PyNFe/wiki/Consulta-Nota

Iazzetta commented 7 years ago

Entao, eu consegui gerar uma nota "APARENTEMENTE". O que aparece na resposta é:

<nfeAutorizacaoLoteResult xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao">
      <retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
        <tpAmb>1</tpAmb>
        <verAplic>SP_NFE_PL_XXXX</verAplic>
        <cStat>103</cStat>
        <xMotivo>Lote recebido com sucesso</xMotivo>
        <cUF>35</cUF>
        <dhRecbto>2017-08-07T11:44:59-03:00</dhRecbto>
        <infRec>
          <nRec>XXXXXXXXXXXXXXXX</nRec>
          <tMed>1</tMed>
        </infRec>
      </retEnviNFe>
    </nfeAutorizacaoLoteResult>

Porem, quando eu pego o numero da NOTA que eu recebo no funfa.xml , e tento consultar dessa forma:

from pynfe.processamento.comunicacao import ComunicacaoSefaz

certificado = "certificado.pfx"
senha = 'XXXXXX'
uf = 'sp'
homologacao = False

con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
envio = con.consulta_nota('nfe', 'NFeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
print (envio.text)

Ele me devolve:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2">
      <cUF>35</cUF>
      <versaoDados>3.10</versaoDados>
    </nfeCabecMsg>
  </soap:Header>
  <soap:Body>
    <nfeConsultaNF2Result xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2">
      <retConsSitNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
        <tpAmb>1</tpAmb>
        <verAplic>SP_NFE_PL_XXXX</verAplic>
        <cStat>215</cStat>
        <xMotivo>Rejeição: Falha no schema XML</xMotivo>
        <cUF>35</cUF>
        <dhRecbto>0001-01-01T00:00:00+00:00</dhRecbto>
        <chNFe>NFeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</chNFe>
      </retConsSitNFe>
    </nfeConsultaNF2Result>
  </soap:Body>
</soap:Envelope>

Ta complicado emitir nota e testar.. Quando acesso o site da nota do milhão e tento consultar as notas nao aparece nada também...

Iazzetta commented 7 years ago

Entao acho que entendi o que fiz de errado, eu estou enviando NFEXXXXX colocando "NFe" e na verdade teria que ser apenas o numero. Porem mesmo fazendo isso, em ambiente de homologacao OU NAO, ele me retorna:

Rejeição: NF-e não consta na base de dados da SEFAZ

Iazzetta commented 7 years ago

Notei também que quando aparece a mensagem de Lote Enviado com sucesso ele esta printando o ELSE do envio. Ou seja, ele não emitiu. Mesmo em ambiente de Homologação. Ele esta caindo no Else:

#em caso de sucesso o retorno será o xml autorizado 
print(envio[0])
if envio[0] == 0:
    print ("success: %s" % envio[1].text)
#em caso de erro o retorno será o xml de resposta da SEFAZ
else:
    print ("fail: %s" % envio[1].text)
juniortada commented 7 years ago

Vamos por partes: A emissão pode ser feita de modo síncrono ou assíncrono, depende da UF. No caso vc está enviado por lote, que pode conter uma ou mais NF-e. O fato de o lote ter sido recebido com sucesso, não quer dizer que a nota ou as notas enviadas nesse lote terem sido autorizadas ou não. Uma nota só estará disponível para consulta caso ela tenha sido autorizada. Se não existe uma nota com a chave informada, logo ela não foi autorizada. Para saber informações do lote enviado, vc pode utilizar o método, mas deve aguardar 15 segundos:

consulta_recibo('nfe','numero_do_recibo')

Sobre a consulta, sim deve ser apenas os números sem esse 'NFE' no início, conforme está na documentação na wiki. Antes de emitir uma NF-e, faça um teste antes do xml gerado no validador da SEFAZ RS, as respostas do webservice são muito vagas, é comum o preenchimento errado do xml na fase de homologação. Fazer isto é mais produtivo do que ficar consultado o recibo do lote. Para fazer isso, execute:

# assinatura
a1 = AssinaturaA1(certificado, senha)
xml = a1.assinar(nfe, retorna_string="True")
print(xml)

Cole o resultado neste site e verifique os erros: https://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx

Após isso, quando o seu xml estiver correto, remova o retorna_string e faça o envio/comunicação da NF-e.

Wiki completa do PyNFe https://github.com/leotada/PyNFe/wiki

Iazzetta commented 7 years ago

Estou tentando o consulta recibo de uma NFe que eu tentei emitir:

con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
envio = con.consulta_recibo('nfe', 'XXXXXXxxxxxxxxx') # nfe ou nfce
print (envio.text)

Ele me retorna:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetAutorizacao">
      <cUF>35</cUF>
      <versaoDados>3.10</versaoDados>
    </nfeCabecMsg>
  </soap:Header>
  <soap:Body>
    <nfeRetAutorizacaoLoteResult xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetAutorizacao">
      <retConsReciNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
        <tpAmb>1</tpAmb>
        <verAplic>SP_NFE_PL_008i2</verAplic>
        <nRec>XXXXXXxxxxxxxxx</nRec>
        <cStat>225</cStat>
        <xMotivo>Rejeição: Falha no Schema XML do lote de NFe</xMotivo>
        <cUF>35</cUF>
        <dhRecbto>2017-08-07T13:43:39-03:00</dhRecbto>
      </retConsReciNFe>
    </nfeRetAutorizacaoLoteResult>
  </soap:Body>
</soap:Envelope>

Eu nao faco questao de emitir em lote ou uma de cada vez (ate seria melhor uma de cada vez e em tempo real). O problema e que de nenhuma forma eu consigo. Esse "lote recebido" que eles me retornam e o print do ELSE, que acredito ser um ERRO como diz nos comentarios que voces fizeram. Eu estava tentando emitir um NFSE para ver se era esse o problema de eu estar emitindo NFE e nao NFSE, porem ele diz que meu CNPJ nao consta no municipio. Ta uma loucura cara haha... da uma luz ai.. abs obrigado pela ajuda

OBS.: Vi que nao tem um retorna_string=True para o consulta recibo... Porque pelo que vi na mensagem ai tem algum problema... O recibo que estou colocando é esse aqui que retorna da mensagem de lote enviado com sucesso:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao">
      <cUF>35</cUF>
      <versaoDados>3.10</versaoDados>
    </nfeCabecMsg>
  </soap:Header>
  <soap:Body>
    <nfeAutorizacaoLoteResult xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao">
      <retEnviNFe versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
        <tpAmb>1</tpAmb>
        <verAplic>SP_NFE_PL_008i2</verAplic>
        <cStat>103</cStat>
        <xMotivo>Lote recebido com sucesso</xMotivo>
        <cUF>35</cUF>
        <dhRecbto>2017-08-07T13:43:09-03:00</dhRecbto>
        <infRec>
          <nRec>ESSE_RECIBO_AQUI</nRec>
          <tMed>1</tMed>
        </infRec>
      </retEnviNFe>
    </nfeAutorizacaoLoteResult>
  </soap:Body>
</soap:Envelope>

Fiz um teste aqui de NFe imprimindo o xml e fazendo o teste. Apareceu esses 2 resultados. Sobre o certificado nao entendi, o primeiro erro fala de um campo IE.. Não sei se tem algo relacionado, mas no caso o dono do CNPJ disse para nao mencionar a Inscricao estadual para emitir nota. Esse campo e obrigatorio? Digo, necessario?

The 'http://www.portalfiscal.inf.br/nfe:IE' element is invalid - The value '' is invalid according to its datatype 'http://www.portalfiscal.inf.br/nfe:TIe' - The Pattern constraint failed. Caminho: NFe[1]/infNFe/emit/IE/

The element 'X509Data' in namespace 'http://www.w3.org/2000/09/xmldsig#' has invalid child element 'X509Certificate' in namespace 'http://www.w3.org/2000/09/xmldsig#'. Caminho: NFe[1]/Signature/KeyInfo/X509Data/X509Certificate/

juniortada commented 7 years ago

Primeiro, NÃO é um erro no else como vc diz. A SEFAZ de SP não aceita envio de apenas uma nota, portanto o PyNFe no seu caso, vai sempre enviar por lote, mesmo que seja apenas uma nota. Como eu mencionei, isto depende da SEFAZ que vc emite. Segundo, IE é OBRIGATÓRIO. Caso o emissor não possua uma IE, ele deve constar como ISENTO no cadastro com a SEFAZ e deve ser informado ie='ISENTO' no preenchimento da NF-e. Por fim a sua consulta do lote tem uma mensagem clara, falha no schema xml da NF-e enviada. Repito a mensagem anterior, antes de emitir a nota, verifique ela no validador da SEFAZ RS, seu xml ainda possui erros de preenchimento. O método consulta recibo não tem o argumento retorna_string, somente serialização de xml e assinatura, para fins de debug do seu xml em sistemas de homologação. Consulta recibo é um método que já executa a comunicação com a SEFAZ. Recomendo que vc leia o manual de orientação do contribuinte para compreender melhor como funciona a emissão de NF-e e os webservices disponíveis. https://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=URCYvjVMIzI=

juniortada commented 7 years ago

Outra coisa, para emitir NF-e, NFC-e ou NFS-e é preciso solicitar junto a SEFAZ estadual ou município, autorização tanto da empresa de software como do próprio emitente. No caso da NF-e, como ela já é obrigatória desde 2009, provavelmente o CNPJ já está cadastrado na SEFAZ como emissor de NF-e. Caso seja um CNPJ novo, deve ser solicitado a autorização junto ao contador responsável pela empresa. No caso de NFS-e, como é muito específico, provavelmente o CNPJ não está registrado junto ao município como um emissor de NFS-e, sendo impossível testar o envio, mesmo em homologação. Da mesma forma, deve ser solicitado pelo contador responsável pela empresa, a autorização de emissão de NFS-e junto a SEFAZ do município. A emissão de NFS-e ainda é bastante limitado no PyNFe, suportando poucas cidades.

Iazzetta commented 7 years ago

Quando falei ERRO quis dizer que a condição retornou uma mensagem de envio de lote com sucesso porem não autorizou. Saquei, essa do IE eu não estava ciente... De repente é esse o problema... Sobre o validador eu ja conhecia e estava usando. Fiz os testes hoje com um scriptzinho pra emitir em lote e rolou. Dei uma pesquisada e também falam de um problema com IM..

Sim saquei, provavelmente é isso ai da autorização. Estou emitindo de São Paulo, vou verificar amanhã com o contador se ja foi solicitado a autorização. Abs valeu

juniortada commented 7 years ago

IM também depende da SEFAZ, aqui no Paraná IE, IM e CNAE são obrigatórios. Depois que o xml estiver correto, verifique também a assinatura, é comum casos de assinatura errada por gerar ou exportar o certificado digital em formato incorreto.