diff --git a/pynfe/entidades/notafiscal.py b/pynfe/entidades/notafiscal.py index f51d03b..351165b 100644 --- a/pynfe/entidades/notafiscal.py +++ b/pynfe/entidades/notafiscal.py @@ -402,8 +402,6 @@ class NotaFiscal(Entidade): 'tpEmis': str(self.forma_emissao), '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"%{ 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), diff --git a/pynfe/processamento/comunicacao.py b/pynfe/processamento/comunicacao.py index fd82342..31e55c0 100644 --- a/pynfe/processamento/comunicacao.py +++ b/pynfe/processamento/comunicacao.py @@ -27,10 +27,9 @@ class ComunicacaoSefaz(Comunicacao): _versao = VERSAO_PADRAO _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 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, 'indSinc').text = str(1) # 0 para assincrono, 1 para sincrono 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('<', '<').replace('>', '>').replace('\'', '"').replace('\n', '') + #return self._post(url, xml, self._post_header()) + def cancelar(self, nota_fiscal): pass @@ -57,7 +61,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'cUF').text = CODIGOS_ESTADOS[self.uf.upper()] 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 if self.uf.upper() == 'PR': xml = self._construir_xml_status_pr(cabecalho=self._cabecalho_soap(), dados=dados, url=url) @@ -125,15 +129,15 @@ class ComunicacaoSefaz(Comunicacao): return retorno - def _get_url(self, tipo, consulta): + def _get_url(self, modelo, consulta): if self._ambiente == 1: ambiente = 'https://' else: ambiente = 'https://homologacao.' - if tipo == 'nfe': + if modelo == 'nfe': # nfe Ex: https://nfe.fazenda.pr.gov.br/nfe/NFeStatusServico3 url = ambiente + NFE[self.uf.upper()][consulta] - elif tipo == 'nfce': + elif modelo == 'nfce': # nfce Ex: https://homologacao.nfce.fazenda.pr.gov.br/nfce/NFeStatusServico3 url = ambiente + NFCE[self.uf.upper()][consulta] else: @@ -148,7 +152,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(raiz, 'cUF').text = str(41) 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): """Mota o XML para o envio via SOAP""" @@ -163,7 +167,7 @@ class ComunicacaoSefaz(Comunicacao): etree.SubElement(met, 'nfeCabecMsg').text = cabecalho 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): 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) etree.SubElement(raiz, '{%s}Header'%NAMESPACE_SOAP).text = cabecalho 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): u"""Retorna um dicionário com os atributos para o cabeçalho da requisição HTTP""" diff --git a/pynfe/processamento/serializacao.py b/pynfe/processamento/serializacao.py index 4046092..7228e62 100644 --- a/pynfe/processamento/serializacao.py +++ b/pynfe/processamento/serializacao.py @@ -169,7 +169,7 @@ class SerializacaoXML(Serializacao): else: 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) # Produto @@ -199,19 +199,21 @@ class SerializacaoXML(Serializacao): etree.SubElement(icms_item, 'pICMS').text = str(produto_servico.icms_aliquota) 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: return etree.tostring(raiz, pretty_print=True) @@ -294,7 +296,7 @@ class SerializacaoXML(Serializacao): # Itens 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) raiz.append(det)