Browse Source

Merge branch 'master3' into issue_inutilizacao_nfe

pull/143/head
Danimar Ribeiro 8 years ago
committed by GitHub
parent
commit
d852999065
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      pytrustnfe/nfe/danfe.py
  2. 13
      pytrustnfe/nfse/mga/__init__.py
  3. 19
      pytrustnfe/nfse/mga/assinatura.py
  4. 4
      pytrustnfe/nfse/mga/templates/CancelarNfse.xml
  5. 8
      pytrustnfe/nfse/mga/templates/GerarNfse.xml
  6. 40
      pytrustnfe/nfse/mga/templates/Rps.xml
  7. 2
      setup.py

4
pytrustnfe/nfe/danfe.py

@ -323,7 +323,7 @@ class danfe(object):
P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN)
w, h = P.wrap(55 * mm, 40 * mm) w, h = P.wrap(55 * mm, 40 * mm)
P.drawOn(self.canvas, (self.nLeft + 30) * mm, P.drawOn(self.canvas, (self.nLeft + 30) * mm,
(self.height - self.nlin - ((5*h + 12)/12)) * mm)
(self.height - self.nlin - ((4.3*h + 12)/12)) * mm)
if self.logo: if self.logo:
img = get_image(self.logo, width=2 * cm) img = get_image(self.logo, width=2 * cm)
@ -347,7 +347,7 @@ class danfe(object):
P = Paragraph(cEnd, styleN) P = Paragraph(cEnd, styleN)
w, h = P.wrap(55 * mm, 30 * mm) w, h = P.wrap(55 * mm, 30 * mm)
P.drawOn(self.canvas, (self.nLeft + 30) * mm, P.drawOn(self.canvas, (self.nLeft + 30) * mm,
(self.height - self.nlin - 31) * mm)
(self.height - self.nlin - 33) * mm)
# Homologação # Homologação
if tagtext(oNode=elem_ide, cTag='tpAmb') == '2': if tagtext(oNode=elem_ide, cTag='tpAmb') == '2':

13
pytrustnfe/nfse/mga/__init__.py

@ -2,7 +2,6 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import os import os
from lxml import etree
from requests import Session from requests import Session
from zeep import Client from zeep import Client
from zeep.transports import Transport from zeep.transports import Transport
@ -19,27 +18,22 @@ def _render(certificado, method, **kwargs):
reference = '' reference = ''
if method == 'GerarNfse': if method == 'GerarNfse':
reference = 'rps:%s' % kwargs['rps']['numero'] reference = 'rps:%s' % kwargs['rps']['numero']
ref_lote = 'lote%s' % kwargs['rps']['numero_lote']
elif method == 'CancelarNfse': elif method == 'CancelarNfse':
reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse']
signer = Assinatura(certificado.pfx, certificado.password) signer = Assinatura(certificado.pfx, certificado.password)
xml_send = signer.assina_xml(xml_send, reference) xml_send = signer.assina_xml(xml_send, reference)
xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote)
return xml_send.encode('utf-8') return xml_send.encode('utf-8')
def _send(certificado, method, **kwargs): def _send(certificado, method, **kwargs):
base_url = '' base_url = ''
if kwargs['ambiente'] == 'producao': if kwargs['ambiente'] == 'producao':
base_url = 'https://isse.maringa.gov.br/ws/?wsdl'
base_url = 'https://isse.maringa.pr.gov.br/ws/?wsdl'
else: else:
base_url = 'https://isseteste.maringa.gov.br/ws/?wsdl'
base_url = 'https://isseteste.maringa.pr.gov.br/ws/?wsdl'
xml_send = kwargs["xml"].decode('utf-8') xml_send = kwargs["xml"].decode('utf-8')
xml_cabecalho = '<?xml version="1.0" encoding="UTF-8"?>\
<cabecalho xmlns="http://www.abrasf.org.br/nfse.xsd" versao="1.00">\
<versaoDados>1.00</versaoDados></cabecalho>'
cert, key = extract_cert_and_key_from_pfx( cert, key = extract_cert_and_key_from_pfx(
certificado.pfx, certificado.password) certificado.pfx, certificado.password)
@ -51,8 +45,7 @@ def _send(certificado, method, **kwargs):
transport = Transport(session=session) transport = Transport(session=session)
client = Client(base_url, transport=transport) client = Client(base_url, transport=transport)
response = client.service[method](xml_cabecalho, xml_send)
response = client.service[method](xml_send)
response, obj = sanitize_response(response.encode('utf-8')) response, obj = sanitize_response(response.encode('utf-8'))
return { return {

19
pytrustnfe/nfse/mga/assinatura.py

@ -22,23 +22,24 @@ class Assinatura(object):
element.text = None element.text = None
signer = XMLSigner( signer = XMLSigner(
method=signxml.methods.enveloped, signature_algorithm="rsa-sha1",
digest_algorithm='sha1',
c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
method=signxml.methods.enveloped, signature_algorithm=u"rsa-sha1",
digest_algorithm=u'sha1',
c14n_algorithm=u'http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
ns = {} ns = {}
ns[None] = signer.namespaces['ds'] ns[None] = signer.namespaces['ds']
signer.namespaces = ns signer.namespaces = ns
element_to_be_signed = xml_element.getchildren()[0].getchildren()[0]
ref_uri = ('#%s' % reference) if reference else None
signed_root = signer.sign( signed_root = signer.sign(
xml_element, key=key.encode(), cert=cert.encode(),
reference_uri=ref_uri)
element_to_be_signed, key=key.encode(), cert=cert.encode())
if reference: if reference:
element_signed = signed_root.find(".//*[@Id='%s']" % reference) element_signed = signed_root.find(".//*[@Id='%s']" % reference)
signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent()
signature = signed_root.find(
".//{http://www.w3.org/2000/09/xmldsig#}Signature")
if element_signed is not None and signature is not None: if element_signed is not None and signature is not None:
parent = element_signed.getparent()
parent = xml_element.getchildren()[0]
parent.append(signature) parent.append(signature)
return etree.tostring(signed_root, encoding=str)
return etree.tostring(xml_element, encoding=str)

4
pytrustnfe/nfse/mga/templates/CancelarNfse.xml

@ -1,9 +1,11 @@
<CancelarNfseEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd"> <CancelarNfseEnvio xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
<Pedido xmlns="http://www.abrasf.org.br/nfse.xsd">
<Pedido>
<InfPedidoCancelamento Id="pedidoCancelamento_{{ cancelamento.numero_nfse }}"> <InfPedidoCancelamento Id="pedidoCancelamento_{{ cancelamento.numero_nfse }}">
<IdentificacaoNfse> <IdentificacaoNfse>
<Numero>{{ cancelamento.numero_nfse }}</Numero> <Numero>{{ cancelamento.numero_nfse }}</Numero>
<CpfCnpj>
<Cnpj>{{ cancelamento.cnpj_prestador }}</Cnpj> <Cnpj>{{ cancelamento.cnpj_prestador }}</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipal> <InscricaoMunicipal>{{ cancelamento.inscricao_municipal }}</InscricaoMunicipal>
<CodigoMunicipio>{{ cancelamento.cidade }}</CodigoMunicipio> <CodigoMunicipio>{{ cancelamento.cidade }}</CodigoMunicipio>
</IdentificacaoNfse> </IdentificacaoNfse>

8
pytrustnfe/nfse/mga/templates/GerarNfse.xml

@ -1,11 +1,3 @@
<GerarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"> <GerarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">
<LoteRps Id="lote{{ rps.numero_lote }}" versao="1.00">
<NumeroLote>{{ rps.numero_lote }}</NumeroLote>
<Cnpj>{{ rps.prestador.cnpj }}</Cnpj>
<InscricaoMunicipal>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipal>
<QuantidadeRps>1</QuantidadeRps>
<ListaRps xmlns="http://www.abrasf.org.br/nfse.xsd">
{% include 'Rps.xml' %} {% include 'Rps.xml' %}
</ListaRps>
</LoteRps>
</GerarNfseEnvio> </GerarNfseEnvio>

40
pytrustnfe/nfse/mga/templates/Rps.xml

@ -1,21 +1,15 @@
<Rps> <Rps>
<InfRps xmlns="http://www.abrasf.org.br/nfse.xsd" Id="rps:{{ rps.numero }}">
<InfDeclaracaoPrestacaoServico>
<Rps Id="rps:{{ rps.numero }}">
<IdentificacaoRps> <IdentificacaoRps>
<Numero>{{ rps.numero }}</Numero> <Numero>{{ rps.numero }}</Numero>
<Serie>{{ rps.serie }}</Serie> <Serie>{{ rps.serie }}</Serie>
<Tipo>{{ rps.tipo_rps }}</Tipo> <Tipo>{{ rps.tipo_rps }}</Tipo>
</IdentificacaoRps> </IdentificacaoRps>
<DataEmissao>{{ rps.data_emissao }}</DataEmissao> <DataEmissao>{{ rps.data_emissao }}</DataEmissao>
<NaturezaOperacao>{{ rps.natureza_operacao }}</NaturezaOperacao>
<RegimeEspecialTributacao>{{ rps.regime_tributacao }}</RegimeEspecialTributacao>
<OptanteSimplesNacional>{{ rps.optante_simples }}</OptanteSimplesNacional>
<IncentivadorCultural>{{ rps.incentivador_cultural }}</IncentivadorCultural>
<Status>{{ rps.status }}</Status> <Status>{{ rps.status }}</Status>
<RpsSubstituido>
<Numero>{{ rps.numero_substituido }}</Numero>
<Serie>{{ rps.serie_substituido }}</Serie>
<Tipo>{{ rps.tipo_substituido }}</Tipo>
</RpsSubstituido>
</Rps>
<Competencia>{{ rps.data_emissao }}</Competencia>
<Servico> <Servico>
<Valores> <Valores>
<ValorServicos>{{ rps.valor_servico }}</ValorServicos> <ValorServicos>{{ rps.valor_servico }}</ValorServicos>
@ -25,24 +19,25 @@
<ValorInss>{{ rps.valor_inss }}</ValorInss> <ValorInss>{{ rps.valor_inss }}</ValorInss>
<ValorIr>{{ rps.valor_ir }}</ValorIr> <ValorIr>{{ rps.valor_ir }}</ValorIr>
<ValorCsll>{{ rps.valor_csll }}</ValorCsll> <ValorCsll>{{ rps.valor_csll }}</ValorCsll>
<IssRetido>{{ rps.iss_retido }}</IssRetido>
<ValorIss>{{ rps.valor_iss }}</ValorIss>
<ValorIssRetido>{{ rps.valor_iss_retido }}</ValorIssRetido>
<OutrasRetencoes>{{ rps.outras_retencoes }}</OutrasRetencoes> <OutrasRetencoes>{{ rps.outras_retencoes }}</OutrasRetencoes>
<BaseCalculo>{{ rps.base_calculo }}</BaseCalculo>
<ValorIss>{{ rps.valor_iss }}</ValorIss>
<Aliquota>{{ rps.aliquota_issqn }}</Aliquota> <Aliquota>{{ rps.aliquota_issqn }}</Aliquota>
<ValorLiquidoNfse>{{ rps.valor_liquido_nfse }}</ValorLiquidoNfse>
<DescontoIncondicionado>{{ rps.desconto_incondicionado }}</DescontoIncondicionado> <DescontoIncondicionado>{{ rps.desconto_incondicionado }}</DescontoIncondicionado>
<DescontoCondicionado>{{ rps.desconto_condicionado }}</DescontoCondicionado> <DescontoCondicionado>{{ rps.desconto_condicionado }}</DescontoCondicionado>
</Valores> </Valores>
<IssRetido>{{ rps.iss_retido }}</IssRetido>
<ItemListaServico>{{ rps.codigo_servico }}</ItemListaServico> <ItemListaServico>{{ rps.codigo_servico }}</ItemListaServico>
<CodigoCnae>{{ rps.cnae_servico }}</CodigoCnae> <CodigoCnae>{{ rps.cnae_servico }}</CodigoCnae>
<CodigoTributacaoMunicipio>{{ rps.codigo_tributacao_municipio }}</CodigoTributacaoMunicipio> <CodigoTributacaoMunicipio>{{ rps.codigo_tributacao_municipio }}</CodigoTributacaoMunicipio>
<Discriminacao>{{ rps.descricao }}</Discriminacao> <Discriminacao>{{ rps.descricao }}</Discriminacao>
<CodigoMunicipio>{{ rps.codigo_municipio }}</CodigoMunicipio> <CodigoMunicipio>{{ rps.codigo_municipio }}</CodigoMunicipio>
<CodigoPais>{{ rps.codigo_pais }}</CodigoPais>
<ExigibilidadeISS>{{ rps.exigibilidade_iss}}</ExigibilidadeISS>
</Servico> </Servico>
<Prestador> <Prestador>
<CpfCnpj>
<Cnpj>{{ rps.prestador.cnpj }}</Cnpj> <Cnpj>{{ rps.prestador.cnpj }}</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipal> <InscricaoMunicipal>{{ rps.prestador.inscricao_municipal }}</InscricaoMunicipal>
</Prestador> </Prestador>
<Tomador> <Tomador>
@ -65,6 +60,7 @@
<Bairro>{{ rps.tomador.bairro }}</Bairro> <Bairro>{{ rps.tomador.bairro }}</Bairro>
<CodigoMunicipio>{{ rps.tomador.cidade }}</CodigoMunicipio> <CodigoMunicipio>{{ rps.tomador.cidade }}</CodigoMunicipio>
<Uf>{{ rps.tomador.uf }}</Uf> <Uf>{{ rps.tomador.uf }}</Uf>
<CodigoPais>{{ rps.tomador.codigo_pais }}</CodigoPais>
<Cep>{{ rps.tomador.cep }}</Cep> <Cep>{{ rps.tomador.cep }}</Cep>
</Endereco> </Endereco>
<Contato> <Contato>
@ -72,20 +68,14 @@
<Email>{{ rps.tomador.email }}</Email> <Email>{{ rps.tomador.email }}</Email>
</Contato> </Contato>
</Tomador> </Tomador>
{% if rps.intermediario is defined -%}
<IntermediarioServico>
<RazaoSocial>{{ rps.intermediario.razao_social }}</RazaoSocial>
<CpfCnpj>
<Cnpj>{{ rps.intermediario.cnpj }}</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>{{ rps.intermediario.inscricao_municipal }}</InscricaoMunicipal>
</IntermediarioServico>
{% endif %}
{% if rps.construcao_civil is defined -%} {% if rps.construcao_civil is defined -%}
<ContrucaoCivil> <ContrucaoCivil>
<CodigoObra>{{ rps.construcao_civil.codigo_obra }}</CodigoObra> <CodigoObra>{{ rps.construcao_civil.codigo_obra }}</CodigoObra>
<Art>{{ rps.construcao_civil.art }}</Art> <Art>{{ rps.construcao_civil.art }}</Art>
</ContrucaoCivil> </ContrucaoCivil>
{% endif %} {% endif %}
</InfRps>
<RegimeEspecialTributacao>{{ rps.regime_tributacao }}</RegimeEspecialTributacao>
<OptanteSimplesNacional>{{ rps.optante_simples }}</OptanteSimplesNacional>
<IncentivoFiscal>{{ rps.incentivador_cultural }}</IncentivoFiscal>
</InfDeclaracaoPrestacaoServico>
</Rps> </Rps>

2
setup.py

@ -2,7 +2,7 @@
from setuptools import setup, find_packages from setuptools import setup, find_packages
VERSION = "0.9.24"
VERSION = "0.9.26"
setup( setup(

Loading…
Cancel
Save