Emissão de nota

312 views
Skip to first unread message

Alex Sandro Garzao

unread,
Jan 3, 2017, 8:59:56 AM1/3/17
to py...@googlegroups.com
Oi pessoal,

Eu postei na Python Brasil, mas sugeriram que eu postasse aqui. Mais
apropriado aqui, obviamente :-D

Junior, eu copiei e colei a resposta do SEFAZ como sugerido (razão
social), mas continua gerando o mesmo erro.

Do exemplo original da PyNFE, o que eu alterei foi isto:

certificado = "10483338_out.pfx"
senha = '9999'
uf = 'rs'
homologacao = True

# emitente
emitente = Emitente(
razao_social='NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL',
nome_fantasia='J. M. ROCHA',
cnpj='87431508000122', # cnpj apenas numeros
codigo_de_regime_tributario='3', # 1 para simples nacional ou 3 para normal
inscricao_estadual='1590046886', # numero de IE da empresa
inscricao_municipal='',
cnae_fiscal='', # cnae apenas numeros
endereco_logradouro='RS 040 KM 11',
endereco_numero='11181',
endereco_bairro='CENTRO',
endereco_municipio='VIAMAO',
endereco_uf='RS',
endereco_cep='94430000',
endereco_pais=CODIGO_BRASIL
)

...

A resposta é esta:

<?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>43</cUF>
<versaoDados>3.10</versaoDados>
</nfeCabecMsg>
</soap:Header>
<soap:Body>
<nfeAutorizacaoLoteResult
xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao">
<retEnviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10">
<tpAmb>2</tpAmb>
<verAplic>RS201612282331</verAplic>
<cStat>104</cStat>
<xMotivo>Lote processado</xMotivo>
<cUF>43</cUF>
<dhRecbto>2017-01-03T11:55:51-02:00</dhRecbto>
<protNFe versao="3.10">
<infProt>
<tpAmb>2</tpAmb>
<verAplic>RS201612282331</verAplic>
<chNFe>43170187431508000122550000000164661845806701</chNFe>
<dhRecbto>2017-01-03T11:55:51-02:00</dhRecbto>
<digVal>yUv611UmKsW/HnyFfGcbqGYbklQ=</digVal>
<cStat>598</cStat>
<xMotivo>Rejeicao: NF-e emitida em ambiente de homologacao
com Razao Social diferente de NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO
- SEM VALOR FISCAL</xMotivo>
</infProt>
</protNFe>
</retEnviNFe>
</nfeAutorizacaoLoteResult>
</soap:Body>
</soap:Envelope>



Aceito sugestões :-)

Abraços! E agradeço pelo help!
--
Atenciosamente,

------------------------------------------------------------------
Alex Sandro Garzão
E-mail: alexg...@gmail.com
Fone: (51) 98165 0486
LinkedIn: http://br.linkedin.com/in/alexgarzao/
------------------------------------------------------------------

Junior Tada

unread,
Jan 3, 2017, 9:33:18 AM1/3/17
to PyNFe
Coloca: NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL
no nome fantasia tb

Alex Sandro Garzao

unread,
Jan 3, 2017, 10:06:55 AM1/3/17
to py...@googlegroups.com
Testei. Deu o mesmo erro...


2017-01-03 12:33 GMT-02:00 Junior Tada <junio...@gmail.com>:
> Coloca: NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL
> no nome fantasia tb
>
> --
> Você recebeu essa mensagem porque está inscrito no grupo "PyNFe" dos Grupos
> do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
> um e-mail para pynfe+un...@googlegroups.com.
> Para mais opções, acesse https://groups.google.com/d/optout.

Junior Tada

unread,
Jan 3, 2017, 1:33:38 PM1/3/17
to PyNFe
Alex, acabei de testar, vc precisa informar NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL tanto no emissor como no CLIENTE.
Vou corrigir isto na documentação.

Alex Sandro Garzao

unread,
Jan 3, 2017, 3:03:19 PM1/3/17
to py...@googlegroups.com
Oi Junior,

Na mosca! Era isso mesmo! Valeu!!!!

Alex Sandro Garzao

unread,
Jan 3, 2017, 4:41:05 PM1/3/17
to py...@googlegroups.com
Oi pessoal,

Eu estou com outra dúvida, que é mais relacionada a tributação do que
com a PyNFE. Mas, se alguém tiver alguma dica, eu agradeço. Já busquei
no google e no site do SEFAZ, mas não consegui evoluir muito.

Quando eu tento emitir uma nota, agora o motivo da rejeição é outro:

<cStat>591</cStat>
<xMotivo>Rejeicao: Informado CSOSN para emissor que nao eh do Simples
Nacional (CRT diferente de 1)</xMotivo>

Eu entendi o motivo, li no google, etc e tal, mas eu devo ter
esquecido algo no meu teste. O emitente não faz parte do simples
nacional, como dito acima. O produto que estou adicionando é este:

codigo='000328', # id do produto
descricao='Produto teste',
ncm='10063021',
#cest='0100100', # NT2015/003
cfop='5101',
unidade_comercial='FD',
quantidade_comercial=Decimal('12'), # 12 unidades
valor_unitario_comercial=Decimal('9.75'), # preço unitário
valor_total_bruto=Decimal('117.00'), # preço total
unidade_tributavel='FD',
quantidade_tributavel=Decimal('12'),
valor_unitario_tributavel=Decimal('9.75'),
ind_total=1,
icms_modalidade='102',
icms_origem=0,
icms_csosn='400',
pis_modalidade='06',
cofins_modalidade='06',
valor_tributos_aprox='21.06'

Pelo que li, csosn=400 indica "Não tributada pelo Simples Nacional"
[1], que é bem o meu caso.

Alguém teria alguma dica? Ou saberia informar os dados de um produto
qualquer que seja válido, só para este teste funcionar em homologação?

Abraços!

[1] http://www.flexdocs.com.br/guianfe/gerarnfe.detalhe.imp.icms.csosn.html

Junior Tada

unread,
Jan 4, 2017, 8:44:33 AM1/4/17
to PyNFe
Alex, vamos por partes:

Primeiro, se vc está desenvolvendo um sistema fiscal, leia os manuais do portal NF-e, principalmente o manual de orientação de preenchimento e
o manual de orientação ao contribuinte. Eu falo isso pq para a receita, os dados informados na NF-e são de responsabilidade 1-do proprietário da empresa; 
2-do contador responsável; 3-do programador responsável pelo sistema. O PyNFe é apenas uma interface de comunicação com a receita, os dados informados serão sempre da sua responsabilidade. Para a SEFAZ, emitir NF-e com informações incorretas por falta de conhecimento, não te exime da responsabilidade e de uma possível punição. 
A SEFAZ pode multar por cada NF-e emitida com valores incorretos, fora isso a empresa ainda pode ser multada por sonegação fiscal caso esteja enviado produtos fora da devida classificação (por exemplo, uma classificação com aliquota de imposto menor do que deveria).
Então fique alerta pq existe muito informação errada na internet, não se baseie apenas em informações de fóruns ou blogs, procure a documentação ou legislação que rege sobre a informação que vc precisa.
Não use informação sobre "dados de um produto qualquer que seja válido, só para este teste funcionar em homologação?". 
A fase de homologação é importante justamente para vc informar dados reais sobre produtos e verificar junto a SEFAZ e o contador responsável pela empresa se o preenchimento está correto, se as informações estão com valores adequados.
Antes do seu sistema emitir notas de produção, sua empresa ou empresa onde trabalha vai precisar fazer um registro do software para ser um autorizador de NF-e junto a SEFAZ e será necessário "autorizar" a utilização desse software para cada empresa cliente que possuir.
Estou de falando isso como um amigo para te deixar ciente das responsabilidades de desenvolver um sistema fiscal.

Agora sobre o erro informado:
vc está informado icms_modalidade=102 e icms_csosn=400
Só para vc entender:
icms_modalidade=
ICMS_TIPOS_TRIBUTACAO = (
    ('00', 'ICMS 00 - Tributada integralmente'),
    ('10', 'ICMS 10 - Tributada com cobranca do ICMS por substituicao tributaria'),
    ('20', 'ICMS 20 - Com reducao da base de calculo'),
    ('30', 'ICMS 30 - Isenta ou nao tributada e com cobranca do ICMS por substituicao tributaria'),
    ('40', 'ICMS 40 - Isenta'),
    ('41', 'ICMS 41 - Nao tributada'),
    ('50', 'ICMS 50 - Suspensao'),
    ('51', 'ICMS 51 - Diferimento'),
    ('60', 'ICMS 60 - Cobrado anteriormente por substituicao tributaria'),
    ('70', 'ICMS 70 - Com reducao da base de calculo e cobranca do ICMS por substituicao tributaria'),
    ('90', 'ICMS 90 - Outras'),
    ('101', 'ICMS 101 - Tributação ICMS pelo Simples Nacional, CSOSN=101'),
    ('102', 'ICMS 102 - Tributação ICMS pelo Simples Nacional, CSOSN=102, 103, 300 ou 400'),
    ('201', 'ICMS 201 - Tributação ICMS pelo Simples Nacional, CSOSN=201'),
    ('202', 'ICMS 202 - Tributação ICMS pelo Simples Nacional, CSOSN=202 ou 203'),
    ('500', 'ICMS 500 - Tributação ICMS pelo Simples Nacional, CSOSN=500'),
    ('900', 'ICMS 900 - Tributação ICMS pelo Simples Nacional, CSOSN=900'),
    ('ST', 'ICMS ST - Grupo de informação do ICMS ST devido para a UF de destino, nas operações interestaduais de produtos que tiveram retenção antecipada de ICMS por ST na UF do remetente. Repasse via Substituto Tributário.')

Então, se a empresa é simples e a modalidade se encaixa em 101, 102, 103, 300 ou 400 vc pode ter cson..
icms_csosn= (Código de Situação da Operação – Simples Nacional)
101- Tributada pelo Simples Nacional com permissão de crédito. (v.2.0)
102- Tributada pelo Simples Nacional sem permissão de crédito. 
103 – Isenção do ICMS no Simples Nacional para faixa de receita bruta. 
300 – Imune. 
400 – Não tributada pelo Simples Nacional (v.2.0)

Mas, para cada tipo de modalidade existe um grupo de tags específica para icms, no manual de integração do contribuinte pg 128 existe 12 grupos de modalidades.
Como vc mencionou que a empresa não é simples, então ela entra em algum desses grupos e não possui csosn e sim cst.
Geralmente empresas que não são do simples nacional são industrias, se for este o caso vc ainda tem o grupo de pis, cofins e ipi que são da tributação simples e tem seus grupos específicos, que também possuem milhares de combinações possíveis para serialização do xml.
O PyNFe provavelmente não tem a serialização completa ou atualizada se a modalidade/regime de tributação for muito específica, portanto para eu poder te ajudar para modificar a serialização, preciso de mais informações completas sobre o emitente e o tipo de produto que será adicionado na nota.
A forma mais fácil e rápida é pegar algum xml de NF-e autorizada que a empresa já possui. Caso vc não tenha, ou não tenha acesso a isso, será preciso entrar em contato com o contador responsável para verificar essas informações. 
De uma olhada no PyNFe utils flags, mas ele está desatualizado:
Serialização do icms a partir da pg 128:
Documentação da NF-e

Por favor, esclareça melhor o tipo de sistema que está desenvolvendo, informações do tipo de empresa cliente e tipo do produto para que eu possa te ajudar da melhor forma possível.

Junior Tada

Tada Software

Alex Sandro Garzao

unread,
Jan 4, 2017, 9:08:09 AM1/4/17
to py...@googlegroups.com
Olá Junior,

Antes de tudo, agradeço (e muito) por sua ajuda :-)

Eu entendi o ponto sobre tributos, etc e tal, e tenho ciência de que
tudo que for emitido errado vai gerar multa e muito stress :-)

Bom, deixa eu explicar melhor o que eu quero fazer. Eu estou
desenvolvendo um sistema para recuperar notas perdidas.

No SEFAZ de SP consta a seguinte nota na pergunta 13:
https://www.fazenda.sp.gov.br/nfe/perguntas_frequentes/respostas_III.asp


"13. Como recuperar os arquivos XML´s ds NF-es autorizadas? (Nova!)

O correto é exportar a nota autorizada em XML e armazenar pelo prazo
decadencial em local seguro.

Se não exportou em XML ou não guardou em local seguro, pode tentar
recuperar o arquivo XML da NF-e junto ao seu destinatário, caso tenha
enviado o arquivo ao destinatário da nota, ou pode tentar recuperar a
nota digitando os dados constantes na consulta no site.

Para obter a chave de acesso da nota autorizada transmita a nota da
mesma série e número da que necessita a chave de acesso, o arquivo XML
ou o DANFE, que receberá como retorno o código do erro 539 e a chave
de acesso da nota autorizada. Somente os campos referentes ao
emitente, série e número da nota devem ser preenchidos corretamente,
pois o objetivo desta transmissão é apenas obter a chave de acesso da
nota autorizada..."


Em outro site comentam que esta funcionalidade para recuperar a chave
da nota funciona em outros SEFAZs também.

Enfim, o sistema que estou desenvolvendo não vai emitir nota, mas sim
recuperar notas perdidas. Neste caso, os clientes vão fornecer o
certificado para que eu consiga recuperar as notas.

Então, o teste que eu quero fazer, em homologação, vai emitir uma nota
completa, com produto, tributação, enfim, uma nota válida. Na
sequência eu tento emitir a mesma nota (mesma série e número), com os
dados do emitente, mas sem dados de produtos, tributação, etc e tal,
para ver se o SEFAZ me retorna o código 539 e a chave da nota emitida.
De posse da chave, com o certificado do cliente, eu consigo baixar o
xml completo.

Peço desculpas por não ter deixado claro antes.

Abraços!

Junior Tada

unread,
Jan 4, 2017, 10:09:38 AM1/4/17
to PyNFe
Alex, então é muito mais simples do que eu imaginava.
Neste caso, basta vc "pular" a etapa de serialização.
Pegue um xml autorizado qualquer da empresa, utilize o lxml (ou qualquer outra lib de manipulação de xml) para alterar id (não sei se será necessário), serie, nNF (numero), dhEmi e 'limpar' os dados da assinatura para assinar novamente.
Ex:
# carrega o xml já modificado
# deve estar no formato igual ao arquivo testes.xml dentro da pasta do PyNFe, sem espaços e sem quebra de linha
<NFe>
  <infNfe>
    <ide>
       ...
  </inNfe>
  <Signature>
   ...
  </Signature>
</NFe>

 xml = etree.fromstring(string_xml_modificado)
# assinatura
a1 = AssinaturaA1(certificado, senha)
xml = a1.assinar(nfe)

# envio
con = ComunicacaoSefaz(uf, certificado, senha, homologacao)
envio = con.autorizacao(modelo='nfe', nota_fiscal=xml)

Dessa forma vc irá conseguir o erro 539 para conseguir da Chave da nfe e protocolo de autorização.

Ps: no arquivo PyNFe/entidades/notafiscal.py tem a classe NotaFiscal que possui o @property indentificador_unico caso seja necessário vc escrever o código para reconstruir o id, mas acredito que não seja necessário para obter o erro 539.

Alex Sandro Garzao

unread,
Jan 6, 2017, 8:17:37 AM1/6/17
to py...@googlegroups.com
Oi Junior,

Eu fiz o seguinte teste: http://pastebin.com/85VXiBdC

Quando eu executo, ocorre o seguinte erro:

/////
Traceback (most recent call last):
File "/Users/alexgarzao/Projects/recuperar_nfe/.env/lib/python3.3/site-packages/pynfe/processamento/assinatura.py",
line 38, in assinar
ref = etree.SubElement(siginfo, 'Reference',
URI='#'+xml.findall('infNFe')[0].attrib['Id'])
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "recupera_chave_nfe.py", line 29, in <module>
xml = a1.assinar(nfe)
File "/Users/alexgarzao/Projects/recuperar_nfe/.env/lib/python3.3/site-packages/pynfe/processamento/assinatura.py",
line 66, in assinar
raise e
File "/Users/alexgarzao/Projects/recuperar_nfe/.env/lib/python3.3/site-packages/pynfe/processamento/assinatura.py",
line 42, in assinar
ref = etree.SubElement(siginfo, 'Reference',
URI='#'+xml.findall('infEvento')[0].attrib['Id'])
IndexError: list index out of range
//////

O findall, executado durante a assinatura, não encontra o "infNFe".
Como o José sugeriu na python-brasil, o problema deve ser com
namespaces, tanto que se o findall tivesse o namespace, funcionaria.
Algo como:

xml.findall('.//{http://www.portalfiscal.inf.br/nfe}infNFe')

Enfim. Eu não estou conseguindo passar o objeto xml como a PyNFE
espera. Eu devo estar carregando o xml de forma errada.

Você teria alguma sugestão?

Abraços!

Junior Tada

unread,
Jan 6, 2017, 12:05:10 PM1/6/17
to PyNFe
Alex a tag <infNFe> não possui namespace, quem possui namespace é a tag <nfeProc> e <NFe>.
Se vc não mandar o xml com a estrutura correta a SEFAZ rejeita o xml, por isso ele deve estar no formato que eu te falei, 
da uma olhada no arquivo testes.xml, dentro da pasta do PyNFe. Aquele é o formato do arquivo (com as tags) que é preciso ter antes de assinar.
O erro em encontrar a tag <infNFe> é pq seu arquivo está com a estrutura errada.
Pegue um xml autorizado (nfeProc) edite e deixe igual ao arquivo testes.xml, só assim vc irá conseguir assinar, transmitir e não receber erros de formação de xml pela SEFAZ.

Caso vc não tenha familiaridade com o lxml, pode usar, como eu falei, qualquer outra lib de manipulação de xml, no final, basta carregar o xml em um objeto lxml para ser passado para a def assinar.

Junior Tada

unread,
Jan 6, 2017, 12:22:43 PM1/6/17
to PyNFe
Outra coisa, como o seu xml não precisa ter a estrutura completa, vc tb não precisa seguir o método assinar completo.
Basta vc fazer um override do método assinar. Mas vc precisa ter certeza que o seu xml está com a estrutura correta.
Quem faz a assinatura do arquivo é o xmlsec1. O método assinar do PyNFe apenas cria as tags que são necessárias para o xmlsec1 assinar.
Ex:

# Escreve no arquivo depois de remover caracteres especiais e parse string
            with open('testes.xml', 'w') as arquivo:
                arquivo.write(remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False)))

            subprocess.check_call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'testes.xml'])
            xml = etree.parse('funfa.xml').getroot()

            return xml

Com o xml assinado vc pode utilizar a comunicação.autorizar(modelo='nfe', nota_fiscal=xml_assinado)

Alex Sandro Garzao

unread,
Jan 6, 2017, 1:31:19 PM1/6/17
to py...@googlegroups.com
Oi Junior,

Eu procurei ainda ontem e não achei o "teste*xml" na PyNFE.

O que eu fiz no teste foi pegar o conteúdo do XML, remover as seções
que não deviam estar lá para o meu teste (destinatário, produtos,
tributos, ...), e coloquei em uma variável. Vi agora que eu tinha
tirado a seção nfeProc no outro exemplo. Agora o exemplo está assim:

string_xml_modificado="""<nfeProc
xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10"><NFe
xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe
Id="NFe43161287431508000122550000000165481106581272"
versao="3.10"><ide><cUF>43</cUF><cNF>10658127</cNF><natOp>5.101 -
Venda de produ&#xE7;&#xE3;o do
estabeleciment</natOp><indPag>1</indPag><mod>55</mod><serie>0</serie><nNF>16548</nNF><dhEmi>2016-12-21T07:04:17-02:00</dhEmi><dhSaiEnt>2016-12-22T08:00:00-02:00</dhSaiEnt><tpNF>1</tpNF><idDest>1</idDest><cMunFG>4323002</cMunFG><tpImp>1</tpImp><tpEmis>1</tpEmis><cDV>2</cDV><tpAmb>1</tpAmb><finNFe>1</finNFe><indFinal>0</indFinal><indPres>1</indPres><procEmi>0</procEmi><verProc>3.0.0.7</verProc></ide><emit><CNPJ>87431508000122</CNPJ><xNome>J.
M. ROCHA &amp; CIA LTDA</xNome><xFant>J. M.
ROCHA</xFant><enderEmit><xLgr>RS 040 KM
11</xLgr><nro>11181</nro><xBairro>CENTRO</xBairro><cMun>4323002</cMun><xMun>VIAMAO</xMun><UF>RS</UF><CEP>94430000</CEP><cPais>1058</cPais><xPais>BRASIL</xPais><fone>5134851301</fone></enderEmit><IE>1590046886</IE><CRT>3</CRT></emit></infNFe></NFe></nfeProc>"""

Depois carreguo o xml com

nfe = etree.fromstring(string_xml_modificado)

E tento assinar assim:
a1 = AssinaturaA1(certificado, senha)
xml = a1.assinar(nfe)

Mas acaba gerando a mesma exception...

Abraços!

Junior Tada

unread,
Jan 6, 2017, 3:03:19 PM1/6/17
to PyNFe
Não, vc precisa tirar o nfeProc. O xml deve iniciar em <NFe>...</NFe>.
Para vc ver um xml antes de assinar, serializa uma nota qualquer, só para vc ver a estrutura.
Ex:

emitente...
cliente..
produto..

# serialização
serializador = SerializacaoXML(_fonte_dados, homologacao=homologacao)
nfe = serializador.exportar(retorna_string=True)

print(nfe)
Reply all
Reply to author
Forward
0 new messages