Browse Source

problema de encoding no parse xml

pull/1/head
Junior Tada 11 years ago
parent
commit
325a1d8c5e
  1. 2
      pynfe/entidades/notafiscal.py
  2. 30
      pynfe/processamento/comunicacao.py
  3. 32
      pynfe/processamento/serializacao.py

2
pynfe/entidades/notafiscal.py

@ -402,8 +402,6 @@ class NotaFiscal(Entidade):
'tpEmis': str(self.forma_emissao), 'tpEmis': str(self.forma_emissao),
'cNF': self._codigo_numerico_aleatorio(), 'cNF': self._codigo_numerico_aleatorio(),
} }
print (self.codigo_numerico_aleatorio)
print (key)
return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s"%{ return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s"%{
'uf': CODIGOS_ESTADOS[self.uf], 'uf': CODIGOS_ESTADOS[self.uf],
'ano': self.data_emissao.strftime('%y'), 'ano': self.data_emissao.strftime('%y'),

30
pynfe/processamento/comunicacao.py

@ -27,10 +27,9 @@ class ComunicacaoSefaz(Comunicacao):
_versao = VERSAO_PADRAO _versao = VERSAO_PADRAO
_assinatura = AssinaturaA1 _assinatura = AssinaturaA1
def autorizacao(self, nota_fiscal):
# tipo de nota, nfce ou nfe para pegar url correta
tipo = 'nfce' if nota_fiscal.modelo == 65 else 'nfe'
url = self._get_url(tipo=tipo, consulta='AUTORIZACAO')
def autorizacao(self, modelo, nota_fiscal):
# url do serviço
url = self._get_url(modelo=modelo, consulta='AUTORIZACAO')
# Monta XML do corpo da requisição # Monta XML do corpo da requisição
raiz = etree.Element('enviNFe') raiz = etree.Element('enviNFe')
@ -38,7 +37,12 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(raiz, 'idLote').text = str(1) # numero autoincremental gerado pelo sistema etree.SubElement(raiz, 'idLote').text = str(1) # numero autoincremental gerado pelo sistema
etree.SubElement(raiz, 'indSinc').text = str(1) # 0 para assincrono, 1 para sincrono etree.SubElement(raiz, 'indSinc').text = str(1) # 0 para assincrono, 1 para sincrono
etree.SubElement(raiz, 'NFe').text = nota_fiscal # conjunto de nfe tramistidas (max 50) etree.SubElement(raiz, 'NFe').text = nota_fiscal # conjunto de nfe tramistidas (max 50)
dados = etree.tostring(raiz, encoding="UTF-8")
# Monta XML para envio da requisição
xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url)
return str(xml, 'utf-8').replace('&lt;', '<').replace('&gt;', '>').replace('\'', '"').replace('\n', '')
#return self._post(url, xml, self._post_header())
def cancelar(self, nota_fiscal): def cancelar(self, nota_fiscal):
pass pass
@ -57,7 +61,7 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente)
etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()]
etree.SubElement(raiz, 'xServ').text = 'STATUS' etree.SubElement(raiz, 'xServ').text = 'STATUS'
dados = etree.tostring(raiz, encoding='UTF-8')
dados = etree.tostring(raiz, encoding="UTF-8")
# Monta XML para envio da requisição # Monta XML para envio da requisição
if self.uf.upper() == 'PR': if self.uf.upper() == 'PR':
xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url)
@ -125,15 +129,15 @@ class ComunicacaoSefaz(Comunicacao):
return retorno return retorno
def _get_url(self, tipo, consulta):
def _get_url(self, modelo, consulta):
if self._ambiente == 1: if self._ambiente == 1:
ambiente = 'https://' ambiente = 'https://'
else: else:
ambiente = 'https://homologacao.' ambiente = 'https://homologacao.'
if tipo == 'nfe':
if modelo == 'nfe':
# nfe Ex: https://nfe.fazenda.pr.gov.br/nfe/NFeStatusServico3 # nfe Ex: https://nfe.fazenda.pr.gov.br/nfe/NFeStatusServico3
url = ambiente + NFE[self.uf.upper()][consulta] url = ambiente + NFE[self.uf.upper()][consulta]
elif tipo == 'nfce':
elif modelo == 'nfce':
# nfce Ex: https://homologacao.nfce.fazenda.pr.gov.br/nfce/NFeStatusServico3 # nfce Ex: https://homologacao.nfce.fazenda.pr.gov.br/nfce/NFeStatusServico3
url = ambiente + NFCE[self.uf.upper()][consulta] url = ambiente + NFCE[self.uf.upper()][consulta]
else: else:
@ -148,7 +152,7 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(raiz, 'cUF').text = str(41) etree.SubElement(raiz, 'cUF').text = str(41)
etree.SubElement(raiz, 'versaoDados').text = VERSAO_PADRAO etree.SubElement(raiz, 'versaoDados').text = VERSAO_PADRAO
return etree.tostring(raiz, encoding='UTF-8')
return etree.tostring(raiz, encoding="UTF-8")
def _construir_xml_soap(self, cabecalho, metodo, tag_metodo, dados): def _construir_xml_soap(self, cabecalho, metodo, tag_metodo, dados):
"""Mota o XML para o envio via SOAP""" """Mota o XML para o envio via SOAP"""
@ -163,7 +167,7 @@ class ComunicacaoSefaz(Comunicacao):
etree.SubElement(met, 'nfeCabecMsg').text = cabecalho etree.SubElement(met, 'nfeCabecMsg').text = cabecalho
etree.SubElement(met, 'nfeDadosMsg').text = dados etree.SubElement(met, 'nfeDadosMsg').text = dados
return etree.tostring(raiz, encoding='utf-8', xml_declaration=True)
return etree.tostring(raiz, encoding="UTF-8", xml_declaration=True)
def _construir_xml_status_pr(self, cabecalho, dados, url): def _construir_xml_status_pr(self, cabecalho, dados, url):
u"""Mota o XML para o envio via SOAP""" u"""Mota o XML para o envio via SOAP"""
@ -171,9 +175,9 @@ class ComunicacaoSefaz(Comunicacao):
raiz = etree.Element('{%s}Envelope'%NAMESPACE_SOAP, nsmap={'soap': NAMESPACE_SOAP}, xmlns=url) raiz = etree.Element('{%s}Envelope'%NAMESPACE_SOAP, nsmap={'soap': NAMESPACE_SOAP}, xmlns=url)
etree.SubElement(raiz, '{%s}Header'%NAMESPACE_SOAP).text = cabecalho etree.SubElement(raiz, '{%s}Header'%NAMESPACE_SOAP).text = cabecalho
body = etree.SubElement(raiz, '{%s}Body'%NAMESPACE_SOAP) body = etree.SubElement(raiz, '{%s}Body'%NAMESPACE_SOAP)
etree.SubElement(body, 'nfeDadosMsg').text = dados
etree.SubElement(body, 'nfeDadosMsg').text = str(dados)
return etree.tostring(raiz, encoding='UTF-8', xml_declaration=True)
return etree.tostring(raiz, encoding="UTF-8", xml_declaration=True)
def _post_header(self): def _post_header(self):
u"""Retorna um dicionário com os atributos para o cabeçalho da requisição HTTP""" u"""Retorna um dicionário com os atributos para o cabeçalho da requisição HTTP"""

32
pynfe/processamento/serializacao.py

@ -169,7 +169,7 @@ class SerializacaoXML(Serializacao):
else: else:
return raiz return raiz
def _serializar_produto_servico(self, produto_servico, tag_raiz='det', retorna_string=True):
def _serializar_produto_servico(self, produto_servico, modelo, tag_raiz='det', retorna_string=True):
raiz = etree.Element(tag_raiz) raiz = etree.Element(tag_raiz)
# Produto # Produto
@ -199,19 +199,21 @@ class SerializacaoXML(Serializacao):
etree.SubElement(icms_item, 'pICMS').text = str(produto_servico.icms_aliquota) etree.SubElement(icms_item, 'pICMS').text = str(produto_servico.icms_aliquota)
etree.SubElement(icms_item, 'vICMS').text = str(produto_servico.icms_valor) etree.SubElement(icms_item, 'vICMS').text = str(produto_servico.icms_valor)
pis = etree.SubElement(imposto, 'PIS')
pis_item = etree.SubElement(pis, 'PISAliq')
etree.SubElement(pis_item, 'CST').text = str(produto_servico.pis_situacao_tributaria)
etree.SubElement(pis_item, 'vBC').text = str(produto_servico.pis_valor_base_calculo)
etree.SubElement(pis_item, 'pPIS').text = str(produto_servico.pis_aliquota_percentual)
etree.SubElement(pis_item, 'vPIS').text = str(produto_servico.pis_valor)
cofins = etree.SubElement(imposto, 'COFINS')
cofins_item = etree.SubElement(cofins, 'COFINSAliq')
etree.SubElement(cofins_item, 'CST').text = str(produto_servico.cofins_situacao_tributaria)
etree.SubElement(cofins_item, 'vBC').text = str(produto_servico.cofins_valor_base_calculo)
etree.SubElement(cofins_item, 'pCOFINS').text = str(produto_servico.cofins_aliquota_percentual)
etree.SubElement(cofins_item, 'vCOFINS').text = str(produto_servico.cofins_valor)
# apenas nfe
if modelo == 55:
pis = etree.SubElement(imposto, 'PIS')
pis_item = etree.SubElement(pis, 'PISAliq')
etree.SubElement(pis_item, 'CST').text = str(produto_servico.pis_situacao_tributaria)
etree.SubElement(pis_item, 'vBC').text = str(produto_servico.pis_valor_base_calculo)
etree.SubElement(pis_item, 'pPIS').text = str(produto_servico.pis_aliquota_percentual)
etree.SubElement(pis_item, 'vPIS').text = str(produto_servico.pis_valor)
cofins = etree.SubElement(imposto, 'COFINS')
cofins_item = etree.SubElement(cofins, 'COFINSAliq')
etree.SubElement(cofins_item, 'CST').text = str(produto_servico.cofins_situacao_tributaria)
etree.SubElement(cofins_item, 'vBC').text = str(produto_servico.cofins_valor_base_calculo)
etree.SubElement(cofins_item, 'pCOFINS').text = str(produto_servico.cofins_aliquota_percentual)
etree.SubElement(cofins_item, 'vCOFINS').text = str(produto_servico.cofins_valor)
if retorna_string: if retorna_string:
return etree.tostring(raiz, pretty_print=True) return etree.tostring(raiz, pretty_print=True)
@ -294,7 +296,7 @@ class SerializacaoXML(Serializacao):
# Itens # Itens
for num, item in enumerate(nota_fiscal.produtos_e_servicos): for num, item in enumerate(nota_fiscal.produtos_e_servicos):
det = self._serializar_produto_servico(item, retorna_string=False)
det = self._serializar_produto_servico(item, modelo=nota_fiscal.modelo, retorna_string=False)
det.attrib['nItem'] = str(num+1) det.attrib['nItem'] = str(num+1)
raiz.append(det) raiz.append(det)

Loading…
Cancel
Save