コード例 #1
0
ファイル: assinatura.py プロジェクト: joselobinho/PyNFe
    def assinar(self, xml, retorna_string=False):
        # busca tag que tem id(reference_uri), logo nao importa se tem namespace
        reference = xml.find(".//*[@Id]").attrib['Id']
        #print('Referencia: ',reference)
        # retira acentos
        xml_str = remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False))
        xml = etree.fromstring(xml_str)

        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')

        ns = {None: signer.namespaces['ds']}
        signer.namespaces = ns
        #print('Chave......: ',self.key)
        #print('*',200)
        #print('Certificado: ',self.cert)
        ref_uri = ('#%s' % reference) if reference else None
        signed_root = signer.sign(
            xml, key=self.key, cert=self.cert, reference_uri=ref_uri)

        ns = {'ns': NAMESPACE_SIG}
        # coloca o certificado na tag X509Data/X509Certificate
        tagX509Data = signed_root.find('.//ns:X509Data', namespaces=ns)
        etree.SubElement(tagX509Data, 'X509Certificate').text = self.cert
        #print('Assinatura: ',etree.tostring(signed_root, encoding="unicode", pretty_print=False) )
        if retorna_string:
            return etree.tostring(signed_root, encoding="unicode", pretty_print=False)
        else:
            return signed_root
コード例 #2
0
ファイル: assinatura.py プロジェクト: adrianobalani/PyNFe
    def assinarLote(self, xml, retorna_string=True):
        "Assina nfse e lote"
        try:
            xml = self.assinarNfse(xml, retorna_string=False)
            xpath = './/ns1:LoteRps'
            tag = 'LoteRps'
            # define namespaces, pega do proprio xml
            namespaces = xml.nsmap
            # No raiz do XML de saida
            raiz = etree.Element('Signature', xmlns='http://www.w3.org/2000/09/xmldsig#')
            siginfo = etree.SubElement(raiz, 'SignedInfo')
            etree.SubElement(siginfo, 'CanonicalizationMethod', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(siginfo, 'SignatureMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1')
            # Tenta achar a tag
            ref = etree.SubElement(siginfo, 'Reference', URI='#' +
                                   xml.xpath(xpath, namespaces=namespaces)[0].attrib['Id'])
            trans = etree.SubElement(ref, 'Transforms')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/2000/09/xmldsig#enveloped-signature')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(ref, 'DigestMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#sha1')
            etree.SubElement(ref, 'DigestValue')
            etree.SubElement(raiz, 'SignatureValue')
            keyinfo = etree.SubElement(raiz, 'KeyInfo')
            etree.SubElement(keyinfo, 'X509Data')

            # posiciona tag Signature antes do LoteRps para assinar
            base = xml.xpath(xpath+'/..', namespaces=namespaces)[0]
            base.insert(0, raiz)

            # Escreve no arquivo depois de remover caracteres especiais
            with open('nfse.xml', 'w') as arquivo:
                texto = remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False))
                arquivo.write(texto)
            # assina lote
            subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado,
                             '--pwd', self.senha, '--crypto', 'openssl', '--output',
                             'nfse.xml', '--id-attr:Id', tag, 'nfse.xml'])

            # Reposiciona tag Signature apos LoteRps
            xml = etree.fromstring(open('nfse.xml', 'r').read())
            namespaces = xml.nsmap
            sig = xml.find('{http://www.w3.org/2000/09/xmldsig#}Signature')
            sig.getparent().remove(sig)
            xml.append(sig)

            if retorna_string:
                return etree.tostring(xml, encoding="unicode", pretty_print=False)
            else:
                return xml
        except Exception as e:
            raise e
コード例 #3
0
ファイル: serializacao.py プロジェクト: YACOWS/PyNFe
    def _serializar_emitente(self, emitente, tag_raiz='emit', retorna_string=True):
        raiz = etree.Element(tag_raiz)

        # Dados do emitente
        etree.SubElement(raiz, 'CNPJ').text = so_numeros(emitente.cnpj)
        etree.SubElement(raiz, 'xNome').text = emitente.razao_social
        etree.SubElement(raiz, 'xFant').text = emitente.nome_fantasia
        etree.SubElement(raiz, 'IE').text = emitente.inscricao_estadual

        # Endereço
        endereco = etree.SubElement(raiz, 'enderEmit')
        etree.SubElement(endereco, 'xLgr').text = emitente.endereco_logradouro
        etree.SubElement(endereco, 'nro').text = emitente.endereco_numero
        etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento
        etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro
        etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio(
            emitente.endereco_municipio, emitente.endereco_uf)
        etree.SubElement(endereco, 'xMun').text = emitente.endereco_municipio
        etree.SubElement(endereco, 'UF').text = emitente.endereco_uf
        etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep)
        etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais
        etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(emitente.endereco_pais)
        etree.SubElement(endereco, 'fone').text = emitente.endereco_telefone

        if retorna_string:
            return etree.tostring(raiz, pretty_print=True)
        else:
            return raiz
コード例 #4
0
ファイル: serializacao.py プロジェクト: arilsonsantos/PyNFe
    def _serializar_evento(self, evento, tag_raiz="evento", retorna_string=False):

        # timezone Brasília -03:00
        tz = time.strftime("%z")
        tz = "{}:{}".format(tz[:-2], tz[-2:])
        # import ipdb
        # ipdb.set_trace()
        raiz = etree.Element(tag_raiz, versao="1.00", xmlns=NAMESPACE_NFE)
        e = etree.SubElement(raiz, "infEvento", Id=evento.identificador)
        etree.SubElement(e, "cOrgao").text = CODIGOS_ESTADOS[evento.uf.upper()]
        etree.SubElement(e, "tpAmb").text = str(self._ambiente)
        etree.SubElement(e, "CNPJ").text = evento.cnpj  # Empresas somente terão CNPJ
        # etree.SubElement(e, 'CPF').text = ''
        etree.SubElement(e, "chNFe").text = evento.chave
        etree.SubElement(e, "dhEvento").text = evento.data_emissao.strftime("%Y-%m-%dT%H:%M:%S") + tz
        etree.SubElement(e, "tpEvento").text = evento.tp_evento
        etree.SubElement(e, "nSeqEvento").text = str(evento.n_seq_evento)
        etree.SubElement(e, "verEvento").text = "1.00"
        det = etree.SubElement(e, "detEvento", versao="1.00")
        etree.SubElement(det, "descEvento").text = evento.descricao
        etree.SubElement(det, "nProt").text = evento.protocolo
        etree.SubElement(det, "xJust").text = evento.justificativa

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #5
0
        def _serializar_permissoes(tag_raiz='Permissoes', retorna_string=True):
            raiz = etree.Element(tag_raiz)

            # Permissões referente ao módulo NFC-e
            p_nfce = etree.SubElement(raiz, 'PermissaoNFCe')
            etree.SubElement(p_nfce, 'Visualizar').text = "S"
            etree.SubElement(p_nfce, 'Baixar').text = "S"

            # Permissões gerais da aplicação
            p_geral = etree.SubElement(raiz, 'PermissoesGerais')
            etree.SubElement(p_geral, 'ImportarDocumentos').text = "N"
            etree.SubElement(p_geral, 'AlterarDadosDoUsuario').text = "S"
            etree.SubElement(p_geral, 'AlterarDadosDaEmpresa').text = "N"
            etree.SubElement(p_geral, 'AlterarMarcasDaEmpresa').text = "N"
            etree.SubElement(p_geral, 'AlterarCertificadosDaEmpresa').text = "S"
            etree.SubElement(p_geral, 'AlterarConfiguracoesParametros').text = "N"
            etree.SubElement(p_geral, 'CadastrarEmpresas').text = "N"
            etree.SubElement(p_geral, 'AlterarCaixasDeEmail').text = "S"
            etree.SubElement(p_geral, 'AlterarPermissoesDeUsuario').text = "S"
            etree.SubElement(p_geral, 'AdicionarNovosUsuarios').text = "S"
            etree.SubElement(p_geral, 'VisualizarChaveAcesso').text = "N"
            etree.SubElement(p_geral, 'VisualizarAcoesDeUsuarios').text = "S"
            etree.SubElement(p_geral, 'VisualizarQuantidadesEmitidas').text = "S"
            etree.SubElement(p_geral, 'VisualizarLicencas').text = "S"
            etree.SubElement(p_geral, 'ConfiguracaoSenha').text = "N"
            etree.SubElement(p_geral, 'GerarRelatorios').text = "S"
            etree.SubElement(p_geral, 'InutilizarDocumentos').text = "S"
            etree.SubElement(p_geral, 'FerramentasIntegracao').text = "N"

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=True)
            else:
                return raiz
コード例 #6
0
    def _serializar_evento(self, evento, tag_raiz='EnvioEvento', retorna_string=True):

        raiz = etree.Element(tag_raiz)

        etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe'
        etree.SubElement(raiz, 'Versao').text = self._versao

        # timezone Brasília -03:00
        tz = time.strftime("%z")

        event = etree.SubElement(raiz, 'Evento')
        etree.SubElement(event, 'NtfCnpjEmissor').text = so_numeros(evento.cnpj)
        etree.SubElement(event, 'NtfNumero').text = evento.numero
        etree.SubElement(event, 'NtfSerie').text = evento.serie
        etree.SubElement(event, 'tpAmb').text = str(self._ambiente)

        eve_info = etree.SubElement(event, 'EveInf')
        etree.SubElement(eve_info, 'EveDh').text = evento.data_emissao.strftime(
            '%Y-%m-%dT%H:%M:%S')
        etree.SubElement(eve_info, 'EveFusoHorario').text = "{}:{}".format(
            tz[:-2], tz[-2:])
        etree.SubElement(eve_info, 'EveTp').text = evento.tp_evento
        etree.SubElement(eve_info, 'EvenSeq').text = str(evento.n_seq_evento)

        eve_det = etree.SubElement(eve_info, 'Evedet')
        etree.SubElement(eve_det, 'EveDesc').text = evento.descricao
        etree.SubElement(eve_det, 'EvenProt').text = evento.protocolo
        etree.SubElement(eve_det, 'EvexJust').text = evento.justificativa

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #7
0
ファイル: assinatura.py プロジェクト: danielgoncalves/PyNFe
    def _antes_de_assinar_ou_verificar(self, raiz):
        # Converte etree para string
        xml = etree.tostring(raiz, xml_declaration=True, encoding='utf-8')

        # Ativa funções criptográficas
        self._ativar_funcoes_criptograficas()

        # Colocamos o texto no avaliador XML FIXME: descobrir forma de evitar o uso do libxml2 neste processo
        doc_xml = libxml2.parseMemory(xml, len(xml))
    
        # Cria o contexto para manipulação do XML via sintaxe XPATH
        ctxt = doc_xml.xpathNewContext()
        ctxt.xpathRegisterNs(u'sig', NAMESPACE_SIG)
    
        # Separa o nó da assinatura
        noh_assinatura = ctxt.xpathEval(u'//*/sig:Signature')[0]
    
        # Buscamos a chave no arquivo do certificado
        chave = xmlsec.cryptoAppKeyLoad(
                filename=str(self.certificado.caminho_arquivo),
                format=xmlsec.KeyDataFormatPkcs12,
                pwd=str(self.senha),
                pwdCallback=None,
                pwdCallbackCtx=None,
                )
    
        # Cria a variável de chamada (callable) da função de assinatura
        assinador = xmlsec.DSigCtx()
    
        # Atribui a chave ao assinador
        assinador.signKey = chave

        return doc_xml, ctxt, noh_assinatura, assinador
コード例 #8
0
    def exportar(self, destino=None, retorna_string=False, limpar=True, **kwargs):
        """Gera o(s) arquivo(s) de Consulta Nota Fiscal eletronica
            no padrao oficial da migrate, invocity
        @param destino -
        @param retorna_string - Retorna uma string para debug.
        @param limpar - Limpa a fonte de dados para não gerar xml com dados duplicados.
        """
        try:
            # Carrega lista de Notas Fiscais
            consultas = self._fonte_dados.obter_lista(_classe=ConsultaPuloNumeracao,
                                                      **kwargs)

            for consulta in consultas:
                raiz = self._serializar_pulo(consulta, retorna_string=False)

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=False)
            else:
                return raiz
        except:
            raise

        finally:
            if limpar:
                self._fonte_dados.limpar_dados()
コード例 #9
0
ファイル: serializacao.py プロジェクト: cesarbruschetta/PyNFe
    def _serializar_evento(self, evento, tag_raiz='evento', retorna_string=False):

        # timezone Brasília -03:00
        tz = time.strftime("%z")
        tz = "{}:{}".format(tz[:-2], tz[-2:])
        raiz = etree.Element(tag_raiz, versao='1.00', xmlns=NAMESPACE_NFE)
        e = etree.SubElement(raiz, 'infEvento', Id=evento.identificador)
        etree.SubElement(e, 'cOrgao').text = CODIGOS_ESTADOS[evento.uf.upper()]
        etree.SubElement(e, 'tpAmb').text = str(self._ambiente)
        etree.SubElement(e, 'CNPJ').text = evento.cnpj # Empresas somente terão CNPJ
        #etree.SubElement(evento, 'CPF').text = ''
        etree.SubElement(e, 'chNFe').text = evento.chave
        etree.SubElement(e, 'dhEvento').text = evento.data_emissao.strftime('%Y-%m-%dT%H:%M:%S') + tz
        etree.SubElement(e, 'tpEvento').text = evento.tp_evento
        etree.SubElement(e, 'nSeqEvento').text = str(evento.n_seq_evento)
        etree.SubElement(e, 'verEvento').text = '1.00'
        det = etree.SubElement(e, 'detEvento', versao='1.00')
        etree.SubElement(det, 'descEvento').text = evento.descricao
        etree.SubElement(det, 'nProt').text = evento.protocolo
        etree.SubElement(det, 'xJust').text = evento.justificativa

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #10
0
    def exportar(self, destino=None, retorna_string=False, limpar=True, **kwargs):
        """Gera o(s) arquivo(s) de Nota Fiscal eletronica no padrao oficial da SEFAZ
        e Receita Federal, para ser(em) enviado(s) para o webservice ou para ser(em)
        armazenado(s) em cache local.
        @param destino -
        @param retorna_string - Retorna uma string para debug.
        @param limpar - Limpa a fonte de dados para não gerar xml com dados duplicados.
        """
        try:
            # Carrega lista de Notas Fiscais
            notas_fiscais = self._fonte_dados.obter_lista(_classe=NotaFiscal, **kwargs)

            for nf in notas_fiscais:
                raiz = self._serializar_nota_fiscal(nf, retorna_string=False)

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=False)
            else:
                return raiz
        except Exception:
            raise

        finally:
            if limpar:
                self._fonte_dados.limpar_dados()
コード例 #11
0
    def _serializar_consulta(self, consulta, tag_raiz='Consulta', retorna_string=True):

        raiz = etree.Element(tag_raiz)

        etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe'
        etree.SubElement(raiz, 'Versao').text = self._versao
        etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente)
        etree.SubElement(raiz, 'CnpjEmpresa').text = so_numeros(consulta.cnpj)
        etree.SubElement(raiz, 'CnpjEmissor').text = so_numeros(consulta.cnpj)

        if consulta.numero_inicial:
            etree.SubElement(raiz, 'NumeroInicial').text = str(consulta.numero_inicial)
        if consulta.numero_final:
            etree.SubElement(raiz, 'NumeroFinal').text = str(consulta.numero_final)
        etree.SubElement(raiz, 'Serie').text = str(consulta.serie)

        if consulta.chave_acesso:
            etree.SubElement(raiz, 'ChaveAcesso').text = str(consulta.chave_acesso)

        if consulta.data_inicial and consulta.data_final:
            etree.SubElement(
                raiz, 'DataEmissaoInicial').text = consulta.data_inicial.strftime("%Y-%m-%d")
            etree.SubElement(
                raiz, 'DataEmissaoFinal').text = consulta.data_final.strftime("%Y-%m-%d")

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #12
0
ファイル: comunicacao.py プロジェクト: IvanSingular/PyNFe
    def _cabecalho_soap(self):
        u"""Monta o XML do cabeçalho da requisição SOAP"""

        raiz = etree.Element('cabecMsg', xmlns=NAMESPACE_NFE, versao="1.02")
        etree.SubElement(raiz, 'versaoDados').text = self._versao

        return etree.tostring(raiz, encoding='utf-8', xml_declaration=True)
コード例 #13
0
ファイル: serializacao.py プロジェクト: danielgoncalves/PyNFe
    def _serializar_cliente(self, cliente, tag_raiz='dest', retorna_string=True):
        raiz = etree.Element(tag_raiz)

        # Dados do cliente
        etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros(cliente.numero_documento)
        etree.SubElement(raiz, 'xNome').text = cliente.razao_social
        etree.SubElement(raiz, 'IE').text = cliente.inscricao_estadual

        # Endereço
        endereco = etree.SubElement(raiz, 'enderDest')
        etree.SubElement(endereco, 'xLgr').text = cliente.endereco_logradouro
        etree.SubElement(endereco, 'nro').text = cliente.endereco_numero
        etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento
        etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro
        etree.SubElement(endereco, 'cMun').text = cliente.endereco_municipio
        etree.SubElement(endereco, 'xMun').text = obter_municipio_por_codigo(
                cliente.endereco_municipio, cliente.endereco_uf,
                )
        etree.SubElement(endereco, 'UF').text = cliente.endereco_uf
        etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep)
        etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais
        etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(cliente.endereco_pais)
        etree.SubElement(endereco, 'fone').text = cliente.endereco_telefone

        if retorna_string:
            return etree.tostring(raiz, pretty_print=True)
        else:
            return raiz
コード例 #14
0
ファイル: serializacao.py プロジェクト: arilsonsantos/PyNFe
    def exportar(self, destino=None, retorna_string=False, limpar=True, **kwargs):
        """Gera o(s) arquivo(s) de Nota Fiscal eletronica no padrao oficial da SEFAZ
        e Receita Federal, para ser(em) enviado(s) para o webservice ou para ser(em)
        armazenado(s) em cache local.
        @param destino -
        @param retorna_string - Retorna uma string para debug.
        @param limpar - Limpa a fonte de dados para não gerar xml com dados duplicados.
        """
        try:
            # No raiz do XML de saida
            raiz = etree.Element("NFe", xmlns=NAMESPACE_NFE)

            # Carrega lista de Notas Fiscais
            notas_fiscais = self._fonte_dados.obter_lista(_classe=NotaFiscal, **kwargs)

            for nf in notas_fiscais:
                raiz.append(self._serializar_nota_fiscal(nf, retorna_string=False))
                # Grupo de informaçoes suplementares NT2015.002
                # Somente para NFC-e
                # if nf.modelo == 65:
                #     info = etree.Element('infNFeSupl')
                #     etree.SubElement(info, 'qrCode').text = ''
                #     raiz.append(info)

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=False)
            else:
                return raiz
        except Exception as e:
            raise e
        finally:
            if limpar:
                self._fonte_dados.limpar_dados()
コード例 #15
0
        def _serializar_parametros_nfce(tag_raiz='NFCe', retorna_string=True):

            def _serializar_contingencia(tag_raiz='OrdemContingencia',
                                         retorna_string=True):
                raiz = etree.Element(tag_raiz)

                orderm = etree.SubElement(raiz, 'OrdemContingenciaItem')
                etree.SubElement(orderm, 'OrdemContingenciaNFCe').text = '0'

                if retorna_string:
                    return etree.tostring(raiz, encoding="unicode", pretty_print=True)
                else:
                    return raiz

            # Parâmetros referente ao módulo NFC-e
            raiz = etree.Element(tag_raiz)
            etree.SubElement(
                raiz, 'InutilizarAutomaticamenteDocumentosRejeitados').text = 'N'
            etree.SubElement(raiz, 'InutilizarPulosNumeracao').text = 'N'
            etree.SubElement(raiz, 'FormaRetornoPDFIntegracao').text = '3'
            etree.SubElement(raiz, 'FormaRetornoXMLIntegracao').text = '3'
            etree.SubElement(raiz, 'UltimoNSU').text = '000000000000000'
            etree.SubElement(raiz, 'IDTokenCscSEFAZ').text = empresa.token
            etree.SubElement(raiz, 'CscSEFAZ').text = empresa.csc
            etree.SubElement(raiz, 'PossuiLeituraX').text = 'S'
            etree.SubElement(raiz, 'PossuiGeracaoRelatorios').text = 'S'

            raiz.append(_serializar_contingencia(retorna_string=False))

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=True)
            else:
                return raiz
コード例 #16
0
    def exportar(self, destino=None, retorna_string=False, limpar=True, **kwargs):
        """Gera o(s) arquivo(s) de Cancelamento Nota Fiscal eletronica
            no padrao oficial da migrate, invocity
        @param destino -
        @param retorna_string - Retorna uma string para debug.
        @param limpar - Limpa a fonte de dados para não gerar xml com dados duplicados.
        """
        try:
            # Carrega lista de Notas Fiscais
            eventos = self._fonte_dados.obter_lista(_classe=EventoCancelarNotaMigrate,
                                                    **kwargs)

            for evento in eventos:
                raiz = self._serializar_evento(evento, retorna_string=False)

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=False)
            else:
                return raiz
        except Exception as e:
            raise e

        finally:
            if limpar:
                self._fonte_dados.limpar_dados()
コード例 #17
0
ファイル: serializacao.py プロジェクト: infabinho/PyNFe
    def _serializar_emitente(self, emitente, tag_raiz="emit", retorna_string=True):
        raiz = etree.Element(tag_raiz)

        # Dados do emitente
        etree.SubElement(raiz, "CNPJ").text = so_numeros(emitente.cnpj)
        etree.SubElement(raiz, "xNome").text = emitente.razao_social
        etree.SubElement(raiz, "xFant").text = emitente.nome_fantasia
        etree.SubElement(raiz, "IE").text = emitente.inscricao_estadual

        # Endereço
        endereco = etree.SubElement(raiz, "enderEmit")
        etree.SubElement(endereco, "xLgr").text = emitente.endereco_logradouro
        etree.SubElement(endereco, "nro").text = emitente.endereco_numero
        etree.SubElement(endereco, "xCpl").text = emitente.endereco_complemento
        etree.SubElement(endereco, "xBairro").text = emitente.endereco_bairro
        etree.SubElement(endereco, "cMun").text = emitente.endereco_municipio
        etree.SubElement(endereco, "xMun").text = obter_municipio_por_codigo(
            emitente.endereco_municipio, emitente.endereco_uf
        )
        etree.SubElement(endereco, "UF").text = emitente.endereco_uf
        etree.SubElement(endereco, "CEP").text = so_numeros(emitente.endereco_cep)
        etree.SubElement(endereco, "cPais").text = emitente.endereco_pais
        etree.SubElement(endereco, "xPais").text = obter_pais_por_codigo(emitente.endereco_pais)
        etree.SubElement(endereco, "fone").text = emitente.endereco_telefone

        if retorna_string:
            return etree.tostring(raiz, pretty_print=True)
        else:
            return raiz
コード例 #18
0
    def _serializar_parametros(self, empresa, tag_raiz='Parametros', retorna_string=True):

        def _serializar_parametros_nfce(tag_raiz='NFCe', retorna_string=True):

            def _serializar_contingencia(tag_raiz='OrdemContingencia',
                                         retorna_string=True):
                raiz = etree.Element(tag_raiz)

                orderm = etree.SubElement(raiz, 'OrdemContingenciaItem')
                etree.SubElement(orderm, 'OrdemContingenciaNFCe').text = '0'

                if retorna_string:
                    return etree.tostring(raiz, encoding="unicode", pretty_print=True)
                else:
                    return raiz

            # Parâmetros referente ao módulo NFC-e
            raiz = etree.Element(tag_raiz)
            etree.SubElement(
                raiz, 'InutilizarAutomaticamenteDocumentosRejeitados').text = 'N'
            etree.SubElement(raiz, 'InutilizarPulosNumeracao').text = 'N'
            etree.SubElement(raiz, 'FormaRetornoPDFIntegracao').text = '3'
            etree.SubElement(raiz, 'FormaRetornoXMLIntegracao').text = '3'
            etree.SubElement(raiz, 'UltimoNSU').text = '000000000000000'
            etree.SubElement(raiz, 'IDTokenCscSEFAZ').text = empresa.token
            etree.SubElement(raiz, 'CscSEFAZ').text = empresa.csc
            etree.SubElement(raiz, 'PossuiLeituraX').text = 'S'
            etree.SubElement(raiz, 'PossuiGeracaoRelatorios').text = 'S'

            raiz.append(_serializar_contingencia(retorna_string=False))

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=True)
            else:
                return raiz

        raiz = etree.Element(tag_raiz)
        etree.SubElement(raiz, 'OrientDANFE').text = '1'
        etree.SubElement(raiz, 'InfCplVerso').text = 'N'
        etree.SubElement(raiz, 'DhImpressao').text = 'S'
        etree.SubElement(raiz, 'ImpTributos').text = '3'
        etree.SubElement(raiz, 'DescICMS').text = 'N'
        etree.SubElement(raiz, 'EnviarPDFEmail').text = 'N'
        etree.SubElement(raiz, 'EnviarXMLEmail').text = 'N'
        etree.SubElement(raiz, 'ReaprovDocsRejeitados').text = 'N'
        etree.SubElement(raiz, 'InutPulosNumeracao').text = 'N'
        etree.SubElement(raiz, 'IdTokenNFCe').text = empresa.token
        etree.SubElement(raiz, 'CSCNFCe').text = empresa.csc

        # NFC-e
        raiz.append(_serializar_parametros_nfce(retorna_string=False))

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #19
0
    def nfeInutilizacaoNF(self, raiz):
        data_hora = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')

        ret = etree.Element('retInutNFe')
        etree.SubElement(ret, 'versao').text = '1.00' # FIXME

        xml_dados = raiz.getroot().getchildren()[0].getchildren()[0].getchildren()[1].text

        xml = etree.tostring(ret, encoding='utf-8', xml_declaration=True)
        self.write(xml)
コード例 #20
0
ファイル: comunicacao.py プロジェクト: leotada/PyNFe
 def autorizacao(self, nota):
     # url do serviço
     url = self._get_url()
     if self.autorizador == 'BETHA':
         # xml
         xml = etree.tostring(nota, encoding='unicode', pretty_print=False)
         # comunica via wsdl
         return self._post(url, xml, 'gerar')
     else:
         raise Exception('Este método só esta implementado no autorizador betha.')
コード例 #21
0
ファイル: serializacao.py プロジェクト: rogerlista/PyNFe
    def _serializar_url_qrcode(self, nota_fiscal, tag_raiz='infNFeSupl', retorna_string=True):
        raiz = etree.Element(tag_raiz)

        data = base64.b16encode(nota_fiscal.data_emissao.isoformat()).decode()
        digest = base64.b16encode(digest).decode()

        try:
            cpf = nota_fiscal.emitente.numero_documento
        except:
            cpf = None

        if cpf is None:
            url = 'chNFe={}&nVersao={}&tpAmb={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
                   nota_fiscal.nota_fiscal.identificador_unico.replace('NFe', ''),
                   VERSAO_QRCODE,
                   self._ambiente,
                   data.lower(),
                   nota_fiscal.valor_total_nota,
                   nota_fiscal.valor_icms,
                   digest.lower(),
                   nota_fiscal.emitente.token)
        else:
            url = 'chNFe={}&nVersao={}&tpAmb={}&cDest={}&dhEmi={}&vNF={}&vICMS={}&digVal={}&cIdToken={}'.format(
                   nota_fiscal.nota_fiscal.identificador_unico.replace('NFe', ''),
                   VERSAO_QRCODE,
                   self._ambiente,
                   cpf,
                   data.lower(),
                   nota_fiscal.totais_icms_total_nota,
                   nota_fiscal.totais_icms_total,
                   digest.lower(),
                   nota_fiscal.emitente.token)

        url_hash = hashlib.sha1(url.encode()+nota_fiscal.emitente.csc.encode()).digest()
        url_hash = base64.b16encode(url_hash).decode()

        url = url + '&cHashQRCode=' + url_hash.upper()

        if nota_fiscal.uf.upper() == 'PR':
            url_qrcode = NFCE[nota_fiscal.uf.upper()]['QR'] + url
        else:
            if self._homologacao:
                url_qrcode = NFCE[nota_fiscal.uf.upper()]['HOMOLOGACAO'] +\
                    NFCE[nota_fiscal.uf.upper()]['QR'] + url
            else:
                url_qrcode = NFCE[nota_fiscal.uf.upper()]['HTTPS'] +\
                    NFCE[nota_fiscal.uf.upper()]['QR'] + url

        print url_qrcode
        etree.SubElement(raiz, 'qrCode').text = "<![CDATA[%s]]>" % (url_qrcode)

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #22
0
            def _serializar_contingencia(tag_raiz='OrdemContingencia',
                                         retorna_string=True):
                raiz = etree.Element(tag_raiz)

                orderm = etree.SubElement(raiz, 'OrdemContingenciaItem')
                etree.SubElement(orderm, 'OrdemContingenciaNFCe').text = '0'

                if retorna_string:
                    return etree.tostring(raiz, encoding="unicode", pretty_print=True)
                else:
                    return raiz
コード例 #23
0
ファイル: assinatura.py プロジェクト: adrianobalani/PyNFe
    def assinarNfse(self, xml, retorna_string=True):
        "Assina NFS-e"
        try:
            # define variaveis de acordo com autorizador
            if self.autorizador == 'ginfes':
                xpath = './/ns2:InfRps'
                tag = 'InfRps'
            elif self.autorizador == 'betha':
                xpath = './/ns1:InfDeclaracaoPrestacaoServico'
                tag = 'InfDeclaracaoPrestacaoServico'
            else:
                raise Exception('Autorizador não encontrado!')

            xml = etree.fromstring(xml)
            # define namespaces, pega do proprio xml
            namespaces = xml.nsmap
            # No raiz do XML de saida
            raiz = etree.Element('Signature', xmlns='http://www.w3.org/2000/09/xmldsig#')
            siginfo = etree.SubElement(raiz, 'SignedInfo')
            etree.SubElement(siginfo, 'CanonicalizationMethod', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(siginfo, 'SignatureMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1')
            # Tenta achar a tag
            ref = etree.SubElement(siginfo, 'Reference', URI='#' +
                                   xml.xpath(xpath, namespaces=namespaces)[0].attrib['Id'])
            trans = etree.SubElement(ref, 'Transforms')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/2000/09/xmldsig#enveloped-signature')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(ref, 'DigestMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#sha1')
            etree.SubElement(ref, 'DigestValue')
            etree.SubElement(raiz, 'SignatureValue')
            keyinfo = etree.SubElement(raiz, 'KeyInfo')
            etree.SubElement(keyinfo, 'X509Data')

            rps = xml.xpath(xpath+'/..', namespaces=namespaces)[0]
            rps.append(raiz)

            # Escreve no arquivo depois de remover caracteres especiais e parse string
            with open('nfse.xml', 'w') as arquivo:
                texto = remover_acentos(etree.tostring(xml, encoding="unicode", pretty_print=False))
                # se for tag do Betha
                if tag == 'InfDeclaracaoPrestacaoServico':
                    texto = texto.replace('ns1:', '').replace(':ns1', '')
                arquivo.write(texto)

            subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado,
                             '--pwd', self.senha, '--crypto', 'openssl', '--output',
                             'nfse.xml', '--id-attr:Id', tag, 'nfse.xml'])

            if retorna_string:
                return open('nfse.xml', 'r').read()
            else:
                return etree.parse('nfse.xml').getroot()
        except Exception as e:
            raise e
コード例 #24
0
    def _serializar_certificado(self, empresa, tag_raiz='Certificado',
                                retorna_string=True):
        raiz = etree.Element(tag_raiz)

        etree.SubElement(raiz, 'ArquivoPFX').text = empresa.certificado_pfx
        etree.SubElement(raiz, 'Senha').text = empresa.senha_certificado

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #25
0
    def _serializar_usuario(self, usuario, tag_raiz='Usuarios', retorna_string=True):

        def _serializar_permissoes(tag_raiz='Permissoes', retorna_string=True):
            raiz = etree.Element(tag_raiz)

            # Permissões referente ao módulo NFC-e
            p_nfce = etree.SubElement(raiz, 'PermissaoNFCe')
            etree.SubElement(p_nfce, 'Visualizar').text = "S"
            etree.SubElement(p_nfce, 'Baixar').text = "S"

            # Permissões gerais da aplicação
            p_geral = etree.SubElement(raiz, 'PermissoesGerais')
            etree.SubElement(p_geral, 'ImportarDocumentos').text = "N"
            etree.SubElement(p_geral, 'AlterarDadosDoUsuario').text = "S"
            etree.SubElement(p_geral, 'AlterarDadosDaEmpresa').text = "N"
            etree.SubElement(p_geral, 'AlterarMarcasDaEmpresa').text = "N"
            etree.SubElement(p_geral, 'AlterarCertificadosDaEmpresa').text = "S"
            etree.SubElement(p_geral, 'AlterarConfiguracoesParametros').text = "N"
            etree.SubElement(p_geral, 'CadastrarEmpresas').text = "N"
            etree.SubElement(p_geral, 'AlterarCaixasDeEmail').text = "S"
            etree.SubElement(p_geral, 'AlterarPermissoesDeUsuario').text = "S"
            etree.SubElement(p_geral, 'AdicionarNovosUsuarios').text = "S"
            etree.SubElement(p_geral, 'VisualizarChaveAcesso').text = "N"
            etree.SubElement(p_geral, 'VisualizarAcoesDeUsuarios').text = "S"
            etree.SubElement(p_geral, 'VisualizarQuantidadesEmitidas').text = "S"
            etree.SubElement(p_geral, 'VisualizarLicencas').text = "S"
            etree.SubElement(p_geral, 'ConfiguracaoSenha').text = "N"
            etree.SubElement(p_geral, 'GerarRelatorios').text = "S"
            etree.SubElement(p_geral, 'InutilizarDocumentos').text = "S"
            etree.SubElement(p_geral, 'FerramentasIntegracao').text = "N"

            if retorna_string:
                return etree.tostring(raiz, encoding="unicode", pretty_print=True)
            else:
                return raiz

        raiz = etree.Element(tag_raiz)

        # Dados do usuario
        item = etree.SubElement(raiz, 'UsuariosItem')
        etree.SubElement(item, 'UsrNome').text = usuario.user_root_nome
        etree.SubElement(item, 'UsrEmail').text = usuario.user_root_email
        etree.SubElement(item, 'UsrSenha').text = usuario.user_root_senha
        # 1 - Gerente; 2 - Digitador; 3 - Nenhum
        etree.SubElement(item, 'GrupoUsuario').text = '3'

        # Permissoes
        item.append(_serializar_permissoes(retorna_string=False))

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #26
0
ファイル: assinatura.py プロジェクト: adrianobalani/PyNFe
    def assinarCancelar(self, xml, retorna_string=True):
        """ Método que assina o xml para cancelamento de NFS-e """
        try:
            if self.autorizador == 'ginfes':
                xpath = 'CancelarNfseEnvio'
                tag = 'CancelarNfseEnvio'
                namespaces = {'ns1': 'http://www.ginfes.com.br/servico_cancelar_nfse_envio', 'ns2':'http://www.ginfes.com.br/tipos'}
            elif self.autorizador == 'betha':
                xpath = '/CancelarNfseEnvio/ns1:Pedido'
                tag = 'InfPedidoCancelamento'
                namespaces = {'ns1': 'http://www.betha.com.br/e-nota-contribuinte-ws'}
            else:
                raise Exception('Autorizador não encontrado!')

            xml = etree.fromstring(xml)
            # No raiz do XML de saida
            raiz = etree.Element('Signature', xmlns='http://www.w3.org/2000/09/xmldsig#')
            siginfo = etree.SubElement(raiz, 'SignedInfo')
            etree.SubElement(siginfo, 'CanonicalizationMethod', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(siginfo, 'SignatureMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1')
            # Tenta achar a tag informada no xpath
            if tag == 'InfPedidoCancelamento':
                ref = etree.SubElement(siginfo, 'Reference', URI='#'+xml.xpath('.//ns1:'+tag, namespaces=namespaces)[0].attrib['Id'])
            # ginfes não tem id no cancelamento v2
            else:
                ref = etree.SubElement(siginfo, 'Reference', URI='')
            trans = etree.SubElement(ref, 'Transforms')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/2000/09/xmldsig#enveloped-signature')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(ref, 'DigestMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#sha1')
            etree.SubElement(ref, 'DigestValue')
            etree.SubElement(raiz, 'SignatureValue')
            keyinfo = etree.SubElement(raiz, 'KeyInfo')
            etree.SubElement(keyinfo, 'X509Data')

            if tag == 'InfPedidoCancelamento':
                xml = xml.xpath(xpath, namespaces=namespaces)[0]
            # ginfes só possui a tag root
            else:
               xml.append(raiz)

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

            subprocess.call(['xmlsec1', '--sign', '--pkcs12', self.certificado, '--pwd', self.senha, '--crypto', 'openssl', '--output', 'funfa.xml', '--id-attr:Id', tag, 'nfse.xml'])

            if retorna_string:
                return open('funfa.xml', 'r').read()
            else:
                return etree.parse('funfa.xml').getroot()
        except Exception as e:
            raise e
コード例 #27
0
    def _serializar_licenciamento(self, empresa, tag_raiz='Licenciamento',
                                  retorna_string=True):
        raiz = etree.Element(tag_raiz)

        item = etree.SubElement(raiz, 'LicenciamentoItem')
        etree.SubElement(item, 'Modulo').text = 'NFCe'
        etree.SubElement(item, 'Modelo').text = '2'

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #28
0
    def _serializar_empresa(self, empresa, tag_raiz='CadastroEmpresa',
                            retorna_string=True):
        raiz = etree.Element(tag_raiz)

        # Dados do empresa
        etree.SubElement(raiz, 'EmpCNPJ').text = so_numeros(empresa.cnpj)
        etree.SubElement(raiz, 'EmpRazSocial').text = empresa.razao_social
        etree.SubElement(raiz, 'EmpNomFantasia').text = empresa.nome_fantasia
        etree.SubElement(raiz, 'EmpApelido').text = empresa.apelido
        etree.SubElement(raiz, 'EmpIE').text = empresa.inscricao_estadual

        # Inscricao Municipal
        if empresa.inscricao_municipal:
            etree.SubElement(raiz, 'EmpIM').text = so_numeros(empresa.inscricao_municipal)

        # Endereço
        etree.SubElement(raiz, 'EmpEndereco').text = empresa.endereco_logradouro
        etree.SubElement(raiz, 'EmpNumero').text = empresa.endereco_numero
        if empresa.endereco_complemento:
            etree.SubElement(raiz, 'EmpComplemento').text = empresa.endereco_complemento
        etree.SubElement(raiz, 'EmpBairro').text = empresa.endereco_bairro
        etree.SubElement(raiz, 'MunCodigo').text = obter_codigo_por_municipio(
            empresa.endereco_municipio, empresa.endereco_uf)
        etree.SubElement(raiz, 'EmpCEP').text = so_numeros(empresa.endereco_cep)

        if empresa.endereco_telefone:
            etree.SubElement(raiz, 'EmpTelefone').text = empresa.endereco_telefone

        etree.SubElement(raiz, 'EmpCNAE').text = empresa.cnae_fiscal
        etree.SubElement(raiz, 'EmpCRT').text = empresa.codigo_de_regime_tributario
        etree.SubElement(raiz, 'EmpIEST').text = ''
        etree.SubElement(raiz, 'EmpMarca').text = ''
        etree.SubElement(raiz, 'EmpMarcaExtensao').text = ''
        etree.SubElement(raiz, 'EmpEmail').text = empresa.email
        etree.SubElement(raiz, 'EmpTpoEndereco').text = empresa.tipo_endereco

        # Certificado
        raiz.append(self._serializar_certificado(empresa, retorna_string=False))

        # Usuarios
        raiz.append(self._serializar_usuario(empresa, retorna_string=False))

        # Parametros
        raiz.append(self._serializar_parametros(empresa, retorna_string=False))

        # Licenciamento
        raiz.append(self._serializar_licenciamento(empresa, retorna_string=False))

        if retorna_string:
            return etree.tostring(raiz, encoding="unicode", pretty_print=True)
        else:
            return raiz
コード例 #29
0
ファイル: assinatura.py プロジェクト: adrianobalani/PyNFe
    def _assinar(self, xml, tag, retorna_string=True):
        """ Método para assinar xml de NFS-e com tags sem ID
            Consulta de Lote e Consulta por RPS
            @param tag - raiz do xml que será assinado
        """
        try:
            xml = etree.fromstring(xml)
            # No raiz do XML de saida
            raiz = etree.Element('Signature', xmlns='http://www.w3.org/2000/09/xmldsig#')
            siginfo = etree.SubElement(raiz, 'SignedInfo')
            etree.SubElement(siginfo, 'CanonicalizationMethod', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(siginfo, 'SignatureMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1')
            # Consulta nao tem id
            ref = etree.SubElement(siginfo, 'Reference', URI='')

            trans = etree.SubElement(ref, 'Transforms')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/2000/09/xmldsig#enveloped-signature')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(ref, 'DigestMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#sha1')
            etree.SubElement(ref, 'DigestValue')
            etree.SubElement(raiz, 'SignatureValue')
            keyinfo = etree.SubElement(raiz, 'KeyInfo')
            etree.SubElement(keyinfo, 'X509Data')

            xml.append(raiz)

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

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

            if retorna_string:
                return etree.tostring(xml, encoding="unicode", pretty_print=False).replace('\n','')
            else:
                return xml
        except Exception as e:
            raise e
コード例 #30
0
ファイル: assinatura.py プロジェクト: adrianobalani/PyNFe
    def assinar(self, xml, retorna_string=False):
        try:
            # No raiz do XML de saida
            tag = 'infNFe'  # tag que será assinada
            raiz = etree.Element('Signature', xmlns='http://www.w3.org/2000/09/xmldsig#')
            siginfo = etree.SubElement(raiz, 'SignedInfo')
            etree.SubElement(siginfo, 'CanonicalizationMethod', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(siginfo, 'SignatureMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#rsa-sha1')
            # Tenta achar a tag infNFe
            try:
                ref = etree.SubElement(siginfo, 'Reference', URI='#'+xml.findall('infNFe')[0].attrib['Id'])
            # Caso nao tenha a tag infNFe, procura a tag infEvento
            except IndexError:
                tag = 'infEvento'
                ref = etree.SubElement(siginfo, 'Reference', URI='#'+xml.findall('infEvento')[0].attrib['Id'])
            trans = etree.SubElement(ref, 'Transforms')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/2000/09/xmldsig#enveloped-signature')
            etree.SubElement(trans, 'Transform', Algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315')
            etree.SubElement(ref, 'DigestMethod', Algorithm='http://www.w3.org/2000/09/xmldsig#sha1')
            etree.SubElement(ref, 'DigestValue')
            etree.SubElement(raiz, 'SignatureValue')
            keyinfo = etree.SubElement(raiz, 'KeyInfo')
            etree.SubElement(keyinfo, 'X509Data')

            xml.append(raiz)

            # 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.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()

            if retorna_string:
                return etree.tostring(xml, encoding="unicode", pretty_print=False)
            else:
                return xml
        except Exception as e:
            raise e