def inutilizar_nota(self, cnpj, serie, numero, justificativa, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza a inutilização do número de uma nota fiscal @param cnpj:cnpj do emitente @param serie: serie da nfe @param numero: número da nota que deseja inutilizar @param justificativa: justificativa da inutilização @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False p.tipo_contingencia = tipo_contingencia p.caminho = u'' processo = p.inutilizar_nota(cnpj=cnpj, serie=serie, numero_inicial=numero, justificativa=justificativa) processo.envio.xml processo.resposta.xml processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.infInut.cStat.valor, 'status_motivo': processo.resposta.infInut.xMotivo.valor, 'reason': processo.resposta.reason} return vals
def processar_nfe(self, xml_nfe, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param xml_nfe:xml da nfe (string) @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com a chave_nfe, protocolo, envio, numero_lote, resposta, status_resposta,status_motivo e reason. """ p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao = versao p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = True p.tipo_contingencia = tipo_contingencia p.caminho = u'' if versao == '3.10': n = NFe_310() else: n = NFe_200() n.infNFe.xml = xml_nfe for processo in p.processar_notas([n]): processo.envio.xml processo.resposta.xml processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'chave_nfe': n.chave, 'xml_pre_validado': n.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'reason': processo.resposta.reason } try: if processo.resposta.infProt.nProt.valor == '': vals['protocolo'] = processo.resposta.protNFe.infProt.nProt.valor except: pass for nome, proc in p.processos.iteritems(): for arquivo in proc[1]: if arquivo[0] == 'numero_lote': vals['numero_lote'] = arquivo[1] if arquivo[0] == 'numero_protocolo': vals['protocolo'] = arquivo[1] vals['resposta'] = proc[1][1][1] if arquivo[0] == 'status_resp': vals['status_resposta'] = arquivo[1][0] vals['status_motivo'] = arquivo[1][1] return vals
def efetuar_manifesto(self, cnpj, tipo_evento, chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ Realiza o manifesto do destinatário @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado #Provisoriamente apontado para um estado que usa o webservice de ambiente nacional, pois em MG ainda não existe suporte ao Manifesto do Destinatário ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False processo = p.consultar_manifesto_destinatario(cnpj, tipo_evento=tipo_evento, chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.processo_evento_nfe.xml, 'status_resposta': processo.resposta.infEvento.cStat.valor, 'status_motivo': processo.resposta.infEvento.xMotivo.valor, 'reason': processo.resposta.reason} if processo.resposta.infEvento.cStat.valor == '135': vals['protocolo'] = processo.resposta.infEvento.nProt.valor return vals
def consultar_nfe(self,chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False processo, arquivos = p.consultar_nota(chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'reason': processo.resposta.reason, 'arquivos':arquivos} return vals
def consultar_cadastro(self, cpf_cnpj, inscricao_estadual, uf, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado if uf in ('AC', 'RN', 'PB', 'SC', 'AC', 'AL', 'AP', 'DF', 'PB', 'RJ', 'RN', 'RO', 'RR', 'SC', 'SE', 'TO'): SVRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'svp-ws.sefazvirtual.rs.gov.br' if uf == 'RS': UFRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'sef.sefaz.rs.gov.br' p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False processo = p.consultar_cadastro_contribuinte(cpf_cnpj=cpf_cnpj, inscricao_estadual=inscricao_estadual, uf=uf, ambiente=ambiente) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.infCons.cStat.valor, 'status_motivo': processo.resposta.infCons.xMotivo.valor, 'reason': processo.resposta.reason} return vals
def cancelar_nota(self, cnpj, chave, protocolo, justificativa, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza o cancelamento da nfe. @param chave:chave da nfe @param protocolo: protocolo do processamento da nfe @param justificativa: justificativa do cancelamento @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.tipo_contingencia = tipo_contingencia p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False processo = p.cancelar_nota(cnpj, chave_nfe=chave, numero_protocolo=protocolo, justificativa=justificativa) processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.processo_cancelamento_nfe.xml, 'status_resposta': processo.resposta.infEvento.cStat.valor, 'status_motivo': processo.resposta.infEvento.xMotivo.valor, 'reason': processo.resposta.reason} if processo.resposta.infEvento.cStat.valor == '135': vals['protocolo'] = processo.resposta.infEvento.nProt.valor return vals
def processar_lote(self, lista_xml_nfe, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param lista_xml_nfe:lista nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao=versao p.tipo_contingencia = tipo_contingencia p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False p.caminho = u'' if versao == '3.10': n = NFe_310() else: n = NFe_200() lista = [] if lista_xml_nfe: for x in lista_xml_nfe: n.infNFe.xml = x lista.append(n) for processo in p.processar_notas(lista): processo.envio.xml processo.resposta.xml processo.resposta.reason return {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'reason': processo.resposta.reason}
def download_xml(self, cnpj, lista_chaves, cert, key, ambiente_nacional=True, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza a consulta do manifesto do destinatário @param lista_chaves: lista de até 10 chaves @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ if len(lista_chaves)>10: raise ValueError(u'Maximo de 10 Chaves de Acesso por lote.') p = ProcessadorNFe() p.versao = versao p.estado = estado if ambiente_nacional: ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia = tipo_contingencia p.salvar_arquivos = False processo = p.download_nfe_xml(cnpj, ambiente, lista_chaves=lista_chaves) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'proc_xml':processo.resposta.original, #'status_resposta': processo.resposta.retNFe.cStat.valor, #'status_motivo': processo.resposta.retNFe.xMotivo.valor, 'reason': processo.resposta.reason} for i,ret in enumerate(processo.resposta.retNFe): vals['status_resp_nota_' + str(i)] = ret.cStat.valor vals['status_motivo_nota_' + str(i)] = ret.xMotivo.valor return vals
def consultar_nfe_destinatario(self, cnpj, indnfe, indemi, cert, key, nsu='0', versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ Realiza a consulta do manifesto do destinatário @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado #Provisoriamente apontado para um estado que usa o webservice de ambiente nacional, pois em MG ainda não existe suporte ao Manifesto do Destinatário ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False processo = p.consultar_notas_destinatario(cnpj=cnpj, indnfe=indnfe, indemi=indemi, nsu=nsu) resp = processo.resposta lista_notas = [] if resp.cStat.valor == '138':#Documento localizado para o destinatário for resp in resp.ret: if resp.resNFe.xml: dict_resnfe = { 'NSU': resp.resNFe.NSU.valor, 'chNFe': resp.resNFe.chNFe.valor, 'CNPJ': resp.resNFe.CNPJ.valor, 'CPF': resp.resNFe.CPF.valor, 'xNome': resp.resNFe.xNome.valor, 'IE': resp.resNFe.IE.valor, 'dEmi': resp.resNFe.dEmi.valor, 'tpNF': resp.resNFe.tpNF.valor, 'vNF': resp.resNFe.vNF.valor, 'digVal': resp.resNFe.digVal.valor, 'dhRecbto': resp.resNFe.dhRecbto.valor, 'cSitNFe': resp.resNFe.cSitNFe.valor, 'cSitConf': resp.resNFe.cSitConf.valor } lista_notas.append({'resNFe': dict_resnfe}) if resp.resCanc.xml: dict_rescanc = { 'NSU': resp.resCanc.NSU.valor, 'chNFe': resp.resCanc.chNFe.valor, 'CNPJ': resp.resCanc.CNPJ.valor, 'CPF': resp.resCanc.CPF.valor, 'xNome': resp.resCanc.xNome.valor, 'IE': resp.resCanc.IE.valor, 'dEmi': resp.resCanc.dEmi.valor, 'tpNF': resp.resCanc.tpNF.valor, 'vNF': resp.resCanc.vNF.valor, 'digVal': resp.resCanc.digVal.valor, 'dhRecbto': resp.resCanc.dhRecbto.valor, 'cSitNFe': resp.resCanc.cSitNFe.valor, 'cSitConf': resp.resCanc.cSitConf.valor } lista_notas.append({'resCanc': dict_rescanc}) if resp.resCCe.xml: dict_rescce = { 'NSU': resp.resCCe.NSU.valor, 'chNFe': resp.resCCe.chNFe.valor, 'dhEvento': resp.resCCe.dhEvento.valor, 'tpEvento': resp.resCCe.tpEvento.valor, 'nSeqEvento': resp.resCCe.nSeqEvento.valor, 'descEvento': resp.resCCe.descEvento.valor, 'xCorrecao': resp.resCCe.xCorrecao.valor, 'tpNF': resp.resCCe.tpNF.valor, 'dhRecbto': resp.resCCe.dhRecbto.valor } lista_notas.append({'resCCe': dict_rescce}) vals = {'envio':processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'lista_notas': lista_notas, 'reason': processo.resposta.reason} return vals
def inutilizar_faixa_numeracao(self,cnpj,serie,numero_inicial,numero_final,justificativa,cert,key,versao=u'2.00',ambiente=2,estado=u'MG',scan=False): """ Realiza a inutilização de faixa de numeração de nota fiscal @param cnpj:cnpj do emitente @param serie: série da nfe @param numero_inicial: faixa inicial da nota que deseja inutilizar @param numero_final: faixa final da nota que deseja inutilizar @param justificativa: justificativa da inutilização @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao= u'2.00' p.estado= u'MG' p.ambiente= 2 p.certificado.cert_str=cert p.certificado.key_str=key p.salvar_arquivos=False p.contingencia_SCAN=scan p.caminho = u'' processo = p.inutilizar_nota(cnpj=cnpj,serie=serie,numero_inicial=numero_inicial,numero_final=numero_final,justificativa=justificativa) processo.envio.xml processo.resposta.xml processo.resposta.reason return {'envio':processo.envio.xml,'resposta':processo.resposta.xml,'reason':processo.resposta.reason}
def consultar_servidor(self,cert,key,versao=u'2.00',ambiente=2,estado=u'MG',scan=False): """ Este método verifica se o servidor está em operação @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará a consulta do servidor, @param scan: habilita a contigência SCAN. @return: Dicionário com o status,envio,resposta e reason. """ p = ProcessadorNFe() p.ambiente=ambiente p.estado=estado p.versao=versao p.certificado.cert_str=cert p.certificado.key_str=key p.salvar_arquivos=False p.contingencia_SCAN=scan p.caminho = u'' processo = p.consultar_servico() status=processo.resposta.cStat.valor processo.envio.xml processo.resposta.xml processo.resposta.reason return{'status':status,'envio':processo.envio.xml,'resposta':processo.resposta.xml,'reason':processo.resposta.reason}
def processar_nfe(self, xml_nfe, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param xml_nfe:xml da nfe (string) @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com a chave_nfe, protocolo, envio, numero_lote, resposta, status_resposta,status_motivo e reason. """ p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao = versao p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = True p.tipo_contingencia = tipo_contingencia p.caminho = u'' if versao == '3.10': n = NFe_310() else: n = NFe_200() n.infNFe.xml = xml_nfe for processo in p.processar_notas([n]): processo.envio.xml processo.resposta.xml processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'chave_nfe': n.chave, 'xml_pre_validado': n.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'reason': processo.resposta.reason } try: if processo.resposta.infProt.nProt.valor == '': vals['protocolo'] = processo.resposta.protNFe.infProt.nProt.valor except: pass for nome, proc in p.processos.iteritems(): for arquivo in proc[1]: if arquivo[0] == 'numero_lote': vals['numero_lote'] = arquivo[1] if arquivo[0] == 'numero_protocolo': vals['protocolo'] = arquivo[1] vals['resposta'] = proc[1][1][1] if arquivo[0] == 'status_resp': vals['status_resposta'] = arquivo[1][0] vals['status_motivo'] = arquivo[1][1] return vals
def inutilizar_faixa_numeracao(self, cnpj, serie, numero_inicial, numero_final, justificativa, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza a inutilização de faixa de numeração de nota fiscal @param cnpj:cnpj do emitente @param serie: série da nfe @param numero_inicial: faixa inicial da nota que deseja inutilizar @param numero_final: faixa final da nota que deseja inutilizar @param justificativa: justificativa da inutilização @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False p.tipo_contingencia = tipo_contingencia p.caminho = u'' processo = p.inutilizar_nota(cnpj=cnpj, serie=serie, numero_inicial=numero_inicial, numero_final=numero_final, justificativa=justificativa) processo.envio.xml processo.resposta.xml processo.resposta.reason vals = { 'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.infInut.cStat.valor, 'status_motivo': processo.resposta.infInut.xMotivo.valor, 'reason': processo.resposta.reason } if processo.resposta.infInut.cStat.valor == '102': vals['protocolo'] = processo.resposta.infInut.nProt.valor return vals
def consultar_cadastro(self, cpf_cnpj, inscricao_estadual, uf, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado if uf in ('AC', 'RN', 'PB', 'SC', 'AC', 'AL', 'AP', 'DF', 'PB', 'RJ', 'RN', 'RO', 'RR', 'SC', 'SE', 'TO'): SVRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'svp-ws.sefazvirtual.rs.gov.br' if uf == 'RS': UFRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'sef.sefaz.rs.gov.br' p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia = tipo_contingencia p.salvar_arquivos = False processo = p.consultar_cadastro_contribuinte(cpf_cnpj=cpf_cnpj, inscricao_estadual=inscricao_estadual, uf=uf, ambiente=ambiente) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.infCons.cStat.valor, 'status_motivo': processo.resposta.infCons.xMotivo.valor, 'reason': processo.resposta.reason} return vals
def download_xml(self, cnpj, chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza a consulta do manifesto do destinatário @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia = tipo_contingencia p.salvar_arquivos = False processo = p.download_nfe_xml(cnpj, ambiente, chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'proc_xml':processo.resposta.original, 'status_resposta': processo.resposta.retNFe.cStat.valor, 'status_motivo': processo.resposta.retNFe.xMotivo.valor, 'reason': processo.resposta.reason} return vals
def efetuar_manifesto(self, cnpj, tipo_evento, chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza o manifesto do destinatário @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado #Provisoriamente apontado para um estado que usa o webservice de ambiente nacional, # pois em MG ainda não existe suporte ao Manifesto do Destinatário ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia = tipo_contingencia p.salvar_arquivos = False processo = p.consultar_manifesto_destinatario(cnpj, tipo_evento=tipo_evento, chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.processo_evento_nfe.xml, 'status_resposta': processo.resposta.infEvento.cStat.valor, 'status_motivo': processo.resposta.infEvento.xMotivo.valor, 'reason': processo.resposta.reason} if processo.resposta.infEvento.cStat.valor == '135': vals['protocolo'] = processo.resposta.infEvento.nProt.valor return vals
def consultar_nfe(self,chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia=tipo_contingencia p.salvar_arquivos = False processo, arquivos = p.consultar_nota(chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'reason': processo.resposta.reason, 'arquivos':arquivos} return vals
def processar_nfe(self,xml_nfe,cert,key,versao=u'2.00',ambiente=2,estado=u'MG',scan=False): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param xml_nfe:xml da nfe (string) @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com a chave_nfe, protocolo, envio,resposta e reason. """ p = ProcessadorNFe() p.ambiente=ambiente p.estado=estado p.certificado.cert_str=cert p.certificado.key_str=key p.salvar_arquivos=False p.contingencia_SCAN=scan p.caminho = u'' n = NFe_200() n.infNFe.xml=xml_nfe for processo in p.processar_notas([n]): processo.envio.xml processo.resposta.xml processo.resposta.reason return {'envio':processo.envio.xml, 'resposta':processo.resposta.xml, 'chave_nfe':n.chave, 'protocolo':processo.resposta.protNFe.infProt.nProt.valor, 'reason':processo.resposta.reason }
def emitir_carta_correcao(self, chave, cnpj, texto_correcao, cert, key, sequencia=None, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False p.tipo_contingencia = tipo_contingencia processo = p.corrigir_nota(chave_nfe=chave, cnpj=cnpj, texto_correcao=texto_correcao, ambiente=ambiente,sequencia=sequencia) processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.processo_correcao_nfe.xml, 'status_resposta': processo.resposta.infEvento.cStat.valor, 'status_motivo': processo.resposta.infEvento.xMotivo.valor, 'reason': processo.resposta.reason} if processo.resposta.infEvento.cStat.valor == '135': vals['protocolo'] = processo.resposta.infEvento.nProt.valor return vals
def cancelar_nota(self,chave,protocolo,justificativa,cert,key,versao=u'2.00',ambiente=2,estado=u'MG',scan=False): """ Realiza o cancelamento da nfe. @param chave:chave da nfe @param protocolo: protocolo do processamento da nfe @param justificativa: justificativa do cancelamento @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao=versao p.estado=estado p.ambiente=ambiente p.certificado.cert_str=cert p.certificado.key_str=key processo = p.cancelar_nota(chave_nfe=chave,numero_protocolo=protocolo,justificativa=justificativa) p.salvar_arquivos=False p.contingencia_SCAN=scan processo.envio.xml processo.resposta.xml processo.resposta.reason return {'envio':processo.envio.xml,'resposta':processo.resposta.xml,'reason':processo.resposta.reason}
def emitir_carta_correcao(self, chave, cnpj, texto_correcao, cert, key, sequencia=None,versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False p.contingencia_SCAN = scan processo = p.corrigir_nota(chave_nfe=chave, cnpj=cnpj, texto_correcao=texto_correcao, ambiente=ambiente,sequencia=sequencia) processo.resposta.reason vals = {'envio': processo.envio.xml, 'resposta': processo.processo_correcao_nfe.xml, 'status_resposta': processo.resposta.infEvento.cStat.valor, 'status_motivo': processo.resposta.infEvento.xMotivo.valor, 'reason': processo.resposta.reason} if processo.resposta.infEvento.cStat.valor == '135': vals['protocolo'] = processo.resposta.infEvento.nProt.valor return vals
def download_xml(self, cnpj, chave, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', scan=False): """ Realiza a consulta do manifesto do destinatário @param chave:chave da nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param scan: habilita a contigência SCAN. @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia_SCAN = scan p.salvar_arquivos = False processo = p.download_nfe_xml(cnpj, ambiente, chave_nfe=chave) vals = {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'proc_xml':processo.resposta.original, 'status_resposta': processo.resposta.retNFe.cStat.valor, 'status_motivo': processo.resposta.retNFe.xMotivo.valor, 'reason': processo.resposta.reason} return vals
def processar_lote(self, lista_xml_nfe, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param lista_xml_nfe:lista nfe @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao = versao p.tipo_contingencia = tipo_contingencia p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = False p.caminho = u'' if versao == '3.10': n = NFe_310() else: n = NFe_200() lista = [] if lista_xml_nfe: for x in lista_xml_nfe: n.infNFe.xml = x lista.append(n) for processo in p.processar_notas(lista): processo.envio.xml processo.resposta.xml processo.resposta.reason return { 'envio': processo.envio.xml, 'resposta': processo.resposta.xml, 'reason': processo.resposta.reason }
def consultar_nfe_destinatario(self, cnpj, indnfe, indemi, cert, key, nsu='0', versao=u'2.00', ambiente=2, estado=u'MG', tipo_contingencia=False): """ Realiza a consulta do manifesto do destinatário @param cert: string do certificado digital A1, @param key: chave privada do certificado digital, @param versao: versão da nfe, @param ambiente: ambiente da consulta, pode ser 1 para o ambiente de produção e 2 para homologação, @param estado: estado em que realizará o processamento, @param tipo_contingencia: habilita a contigência . @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado #Provisoriamente apontado para um estado que usa o webservice de ambiente nacional, pois em MG ainda # não existe suporte ao Manifesto do Destinatário ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.tipo_contingencia = tipo_contingencia p.salvar_arquivos = False processo = p.consultar_notas_destinatario(cnpj=cnpj, indnfe=indnfe, indemi=indemi, nsu=nsu) resp = processo.resposta lista_notas = [] if resp.cStat.valor == '138':#Documento localizado para o destinatário for resp in resp.ret: if resp.resNFe.xml: dict_resnfe = { 'NSU': resp.resNFe.NSU.valor, 'chNFe': resp.resNFe.chNFe.valor, 'CNPJ': resp.resNFe.CNPJ.valor, 'CPF': resp.resNFe.CPF.valor, 'xNome': resp.resNFe.xNome.valor, 'IE': resp.resNFe.IE.valor, 'dEmi': resp.resNFe.dEmi.valor, 'tpNF': resp.resNFe.tpNF.valor, 'vNF': resp.resNFe.vNF.valor, 'digVal': resp.resNFe.digVal.valor, 'dhRecbto': resp.resNFe.dhRecbto.valor, 'cSitNFe': resp.resNFe.cSitNFe.valor, 'cSitConf': resp.resNFe.cSitConf.valor } lista_notas.append({'resNFe': dict_resnfe}) if resp.resCanc.xml: dict_rescanc = { 'NSU': resp.resCanc.NSU.valor, 'chNFe': resp.resCanc.chNFe.valor, 'CNPJ': resp.resCanc.CNPJ.valor, 'CPF': resp.resCanc.CPF.valor, 'xNome': resp.resCanc.xNome.valor, 'IE': resp.resCanc.IE.valor, 'dEmi': resp.resCanc.dEmi.valor, 'tpNF': resp.resCanc.tpNF.valor, 'vNF': resp.resCanc.vNF.valor, 'digVal': resp.resCanc.digVal.valor, 'dhRecbto': resp.resCanc.dhRecbto.valor, 'cSitNFe': resp.resCanc.cSitNFe.valor, 'cSitConf': resp.resCanc.cSitConf.valor } lista_notas.append({'resCanc': dict_rescanc}) if resp.resCCe.xml: dict_rescce = { 'NSU': resp.resCCe.NSU.valor, 'chNFe': resp.resCCe.chNFe.valor, 'dhEvento': resp.resCCe.dhEvento.valor, 'tpEvento': resp.resCCe.tpEvento.valor, 'nSeqEvento': resp.resCCe.nSeqEvento.valor, 'descEvento': resp.resCCe.descEvento.valor, 'xCorrecao': resp.resCCe.xCorrecao.valor, 'tpNF': resp.resCCe.tpNF.valor, 'dhRecbto': resp.resCCe.dhRecbto.valor } lista_notas.append({'resCCe': dict_rescce}) vals = {'envio':processo.envio.xml, 'resposta': processo.resposta.xml, 'status_resposta': processo.resposta.cStat.valor, 'status_motivo': processo.resposta.xMotivo.valor, 'lista_notas': lista_notas, 'reason': processo.resposta.reason} return vals