Browse Source

Merge branch 'master' into p35

pull/59/head
mandala21 7 years ago
parent
commit
7be5f065c3
  1. 3
      pynfe/entidades/base.py
  2. 24
      pynfe/entidades/notafiscal.py
  3. 7
      pynfe/processamento/comunicacao.py
  4. 32
      pynfe/processamento/serializacao.py
  5. 5
      pynfe/utils/webservices.py

3
pynfe/entidades/base.py

@ -16,6 +16,9 @@ class Entidade(object):
self._fonte_dados.adicionar_objeto(self)
def __str__(self):
return self.__class__.__name__
def __repr__(self):
return '<%s %s>'%(self.__class__.__name__, str(self))

24
pynfe/entidades/notafiscal.py

@ -355,6 +355,7 @@ class NotaFiscal(Entidade):
self.duplicatas = []
self.observacoes_contribuinte = []
self.processos_referenciados = []
self.responsavel_tecnico = []
super(NotaFiscal, self).__init__(*args, **kwargs)
@ -386,7 +387,6 @@ class NotaFiscal(Entidade):
self.totais_icms_pis += obj.pis_valor
self.totais_icms_cofins += obj.cofins_valor
self.totais_icms_outras_despesas_acessorias += obj.outras_despesas_acessorias
self.totais_icms_total_nota += obj.valor_total_bruto
# - Valor Total do FCP (Fundo de Combate à Pobreza)
self.totais_fcp += obj.fcp_valor
self.totais_fcp_destino += obj.fcp_destino_valor
@ -396,6 +396,12 @@ class NotaFiscal(Entidade):
self.totais_icms_inter_remetente += obj.icms_inter_remetente_valor
## TODO calcular impostos aproximados
#self.totais_tributos_aproximado += obj.tributos
self.totais_icms_total_nota += obj.valor_total_bruto - obj.desconto + \
obj.icms_desonerado + obj.icms_st_valor + \
obj.total_frete + obj.total_seguro + \
obj.outras_despesas_acessorias + obj.ipi_valor_ipi
return obj
def adicionar_transporte_volume(self, **kwargs):
@ -417,11 +423,17 @@ class NotaFiscal(Entidade):
return obj
def adicionar_processo_referenciado(self, **kwargs):
u"""Adiciona uma instancia de Processo Referenciado"""
"""Adiciona uma instancia de Processo Referenciado"""
obj = NotaFiscalProcessoReferenciado(**kwargs)
self.processos_referenciados.append(obj)
return obj
def adicionar_responsavel_tecnico(self, **kwargs):
""" Adiciona uma instancia de Responsavel Tecnico """
obj = NotaFiscalResponsavelTecnico(**kwargs)
self.responsavel_tecnico.append(obj)
return obj
def _codigo_numerico_aleatorio(self):
self.codigo_numerico_aleatorio = str(random.randint(0, 99999999)).zfill(8)
return self.codigo_numerico_aleatorio
@ -1003,3 +1015,11 @@ class NotaFiscalServico(Entidade):
def __str__(self):
return ' '.join([str(self.identificador)])
class NotaFiscalResponsavelTecnico(Entidade):
# NT 2018/003
cnpj = str()
contato = str()
email = str()
fone = str()
csrt = str()

7
pynfe/processamento/comunicacao.py

@ -82,7 +82,12 @@ class ComunicacaoSefaz(Comunicacao):
if ind_sinc == 1:
try:
# Protocolo com envio OK
inf_prot = prot[0][0] # root protNFe
try:
inf_prot = prot[0][0] # root protNFe
except IndexError:
# Estados como GO vem com a tag header
inf_prot = prot[1][0]
lote_status = inf_prot.xpath("ns:retEnviNFe/ns:cStat", namespaces=ns)[0].text
# Lote processado
if lote_status == '104':

32
pynfe/processamento/serializacao.py

@ -236,6 +236,10 @@ class SerializacaoXML(Serializacao):
etree.SubElement(prod, 'uTrib').text = produto_servico.unidade_tributavel
etree.SubElement(prod, 'qTrib').text = str(produto_servico.quantidade_tributavel)
etree.SubElement(prod, 'vUnTrib').text = '{:.4f}'.format(produto_servico.valor_unitario_tributavel or 0)
if produto_servico.desconto:
etree.SubElement(prod, 'vDesc').text = '{:.2f}'.format(produto_servico.desconto)
""" Indica se valor do Item (vProd) entra no valor total da NF-e (vProd)
0=Valor do item (vProd) não compõe o valor total da NF-e
1=Valor do item (vProd) compõe o valor total da NF-e (vProd) (v2.0)
@ -349,7 +353,7 @@ class SerializacaoXML(Serializacao):
elif produto_servico.pis_modalidade == '03':
pis_item = etree.SubElement(pis, 'PISQtde')
etree.SubElement(pis_item, 'CST').text = produto_servico.pis_modalidade
etree.SubElement(pis_item, 'qBCProd').text = produto_servico.quantidade_comercial
etree.SubElement(pis_item, 'qBCProd').text = '{:.4f}'.format(produto_servico.quantidade_comercial)
etree.SubElement(pis_item, 'vAliqProd').text = produto_servico.pis_aliquota_percentual
etree.SubElement(pis_item, 'vPIS').text = '{:.2f}'.format(produto_servico.pis_valor_base_calculo or 0)
else:
@ -358,7 +362,7 @@ class SerializacaoXML(Serializacao):
etree.SubElement(pis_item, 'vBC').text = '{:.2f}'.format(produto_servico.pis_valor_base_calculo or 0)
etree.SubElement(pis_item, 'pPIS').text = '{:.2f}'.format(produto_servico.pis_aliquota_percentual or 0)
if produto_servico.pis_modalidade is not '99':
etree.SubElement(pis_item, 'qBCProd').text = produto_servico.quantidade_comercial
etree.SubElement(pis_item, 'qBCProd').text = '{:.4f}'.format(produto_servico.quantidade_comercial)
etree.SubElement(pis_item, 'vAliqProd').text = produto_servico.pis_aliquota_percentual
etree.SubElement(pis_item, 'vPIS').text = '{:.2f}'.format(produto_servico.pis_valor_base_calculo or 0)
@ -385,9 +389,9 @@ class SerializacaoXML(Serializacao):
elif produto_servico.cofins_modalidade == '03':
cofins_item = etree.SubElement(cofins, 'COFINSQtde')
etree.SubElement(cofins_item, 'CST').text = produto_servico.cofins_modalidade
etree.SubElement(cofins_item, 'qBCProd').text = produto_servico.quantidade_comercial
etree.SubElement(cofins_item, 'vAliqProd').text = produto_servico.cofins_aliquota_percentual
etree.SubElement(cofins_item, 'vCOFINS').text = produto_servico.cofins_valor
etree.SubElement(cofins_item, 'qBCProd').text = '{:.4f}'.format(produto_servico.quantidade_comercial)
etree.SubElement(cofins_item, 'vAliqProd').text = '{:.4f}'.format(produto_servico.cofins_aliquota_percentual)
etree.SubElement(cofins_item, 'vCOFINS').text = '{:.2f}'.format(produto_servico.cofins_valor)
else:
cofins_item = etree.SubElement(cofins, 'COFINSOutr')
etree.SubElement(cofins_item, 'CST').text = produto_servico.cofins_modalidade
@ -410,6 +414,18 @@ class SerializacaoXML(Serializacao):
else:
return raiz
def _serializar_responsavel_tecnico(self, responsavel_tecnico, tag_raiz='infRespTec', retorna_string=True):
raiz = etree.Element(tag_raiz)
etree.SubElement(raiz, 'CNPJ').text = responsavel_tecnico.cnpj
etree.SubElement(raiz, 'xContato').text = responsavel_tecnico.contato
etree.SubElement(raiz, 'email').text = responsavel_tecnico.email
etree.SubElement(raiz, 'fone').text = responsavel_tecnico.fone
if retorna_string:
return etree.tostring(raiz, encoding="unicode", pretty_print=True)
else:
return raiz
def _serializar_nota_fiscal(self, nota_fiscal, tag_raiz='infNFe', retorna_string=True):
raiz = etree.Element(tag_raiz, versao=self._versao)
@ -636,6 +652,12 @@ class SerializacaoXML(Serializacao):
if nota_fiscal.informacoes_complementares_interesse_contribuinte:
etree.SubElement(info_ad, 'infCpl').text = nota_fiscal.informacoes_complementares_interesse_contribuinte
# Responsavel Tecnico NT2018/003
if nota_fiscal.responsavel_tecnico:
raiz.append(self._serializar_responsavel_tecnico(
nota_fiscal.responsavel_tecnico[0], retorna_string=False))
if retorna_string:
return etree.tostring(raiz, encoding="unicode", pretty_print=True)
else:

5
pynfe/utils/webservices.py

@ -263,8 +263,9 @@ NFCE = {
'EVENTOS': 'sefaz.go.gov.br/nfe/services/NFeRecepcaoEvento4?wsdl',
'QR': 'sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe?',
'CADASTRO': 'sefaz.go.gov.br/nfe/services/CadConsultaCadastro4?wsdl',
'HTTPS': 'http://nfe.',
'HOMOLOGACAO': 'http://homolog.'
'HTTPS': 'https://nfe.',
'HOMOLOGACAO': 'https://homolog.',
'URL': 'sefaz.go.gov.br/nfeweb/sites/nfce/danfeNFCe'
},
'DF': {
'QR': 'http://www.fazenda.df.gov.br/nfce/qrcode?',

Loading…
Cancel
Save