def gerar_xml(self, xml_nfe, cert, key, versao=u'3.10', consumidor=False, ambiente=2, estado=u'MG', salvar_arquivos=True, numero_lote=None, caminho=u''): p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao = versao p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = salvar_arquivos p.caminho = caminho if numero_lote is None: numero_lote = datetime.now().strftime('%Y%m%d%H%M%S') if versao == '3.10': n = NFe_310() else: n = NFe_200() n.infNFe.xml = xml_nfe n.auto_preencher_campos(ambiente=ambiente, estado=estado) if consumidor: n.preencher_campos_nfce() else: n.preencher_campos_nfe() processo = p.gerar_xml([n], numero_lote=numero_lote) return processo
def download_notas(self, cnpj, lista_chaves, cert, key, ambiente_nacional=True, versao=u'2.00', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ Realiza download de NFe para uma determinada chave de acesso, para NF-e confirmada pelo destinatario. @param lista_chaves: lista de até 10 chaves @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 p.caminho = caminho if ambiente_nacional: if versao == '3.10': #ESTADO_WS3[estado] = SVAN3 ESTADO_WS3[estado] = AN else: #ESTADO_WS[estado] = SVAN ESTADO_WS[estado] = AN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia = contingencia p.salvar_arquivos = salvar_arquivos processo = p.download_nfes(cnpj, ambiente, lista_chaves=lista_chaves) return processo
def inutilizar_faixa_numeracao(self, cnpj, serie, numero_inicial, numero_final, justificativa, cert, key, nfce=False, versao=u'2.00', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ 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 nfce: True se inutilizando numeração de NFC-e @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 = salvar_arquivos p.contingencia = contingencia p.caminho = caminho p.nfce = nfce 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 processo
def consultar_nfe_destinatario(self, cnpj, indnfe, indemi, cert, key, nsu='0', versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ Realiza a consulta do manifesto do destinatário @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.caminho = caminho #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 if versao == '3.10': ESTADO_WS3[estado] = AN else: ESTADO_WS[estado] = AN #ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia = contingencia p.salvar_arquivos = salvar_arquivos processo = p.consultar_notas_destinatario(cnpj=cnpj, indnfe=indnfe, indemi=indemi, nsu=nsu) return processo
def consultar_servidor(self, cert, key, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ 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 contingencia : habilita a contigência. @param salvar_arquivos: salvar ou nao os arquivos XML gerados. @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 = salvar_arquivos p.contingencia = contingencia p.caminho = caminho processo = p.consultar_servico() processo.envio.xml processo.resposta.xml processo.resposta.reason return processo
def enviar_lote_evento(self, lista_eventos, tipo, cert, key, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, numero_lote=None, salvar_arquivos=True, ambiente_nacional=False, caminho=u''): """ Envia um lote de eventos (cancelamento, correcao, manifestacao ou epec) @param lista_eventos: lista com eventos (todos os eventos devem ser do mesmo tipo) """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.caminho = caminho p.ambiente = ambiente p.contingencia = contingencia p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = salvar_arquivos for ev in lista_eventos: ev.infEvento.tpAmb.valor = ambiente if ambiente_nacional: ev.infEvento.cOrgao.valor = UF_CODIGO['NACIONAL'] else: ev.infEvento.cOrgao.valor = UF_CODIGO[estado] ev.infEvento.CNPJ.valor = ev.infEvento.CNPJ.valor or ev.infEvento.chNFe.valor[6:20] # Extrai o CNPJ da própria chave da NF-e ev.infEvento.dhEvento.valor = ev.infEvento.dhEvento.valor or datetime.now() processo = p.enviar_lote_evento(tipo_evento=tipo, lista_eventos=lista_eventos, numero_lote=numero_lote) return processo
def efetuar_manifesto(self, cnpj, tipo_manifesto, chave, cert, key, ambiente_nacional=True, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, justificativa=None, salvar_arquivos=True, caminho=u''): """ Realiza o manifesto do destinatário @param tipo_manifesto: Confirmação da Operação, Desconhecimento da Operação, Operação Não Realizada ou Ciência da Emissão @param ambiente_nacional: usa o webservice do ambiente nacional (Recomendado manter True) @param justificativa: justificativa porque a operação não foi realizada, este campo deve ser informado somente no evento de Operação não Realizada. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.caminho = caminho if ambiente_nacional: if versao == '3.10': ESTADO_WS3[estado] = SVAN3 else: ESTADO_WS[estado] = SVAN p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia = contingencia p.salvar_arquivos = salvar_arquivos processo = p.efetuar_manifesto_destinatario(cnpj=cnpj, tipo_manifesto=tipo_manifesto, chave_nfe=chave, justificativa=justificativa, ambiente_nacional=ambiente_nacional) return processo
def cancelar_nota(self, chave, protocolo, justificativa, cert, key, data=None, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, numero_lote=None, caminho=u''): """ Realiza o cancelamento da nfe. @param chave:chave da nfe @param protocolo: protocolo do processamento da nfe @param justificativa: justificativa do cancelamento @param numero_lote: usuario pode definir o numero do lote, caso contrario sera a ANO+MES+DIA+HORA+MIN+SEG @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.contingencia = contingencia p.caminho = caminho p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = salvar_arquivos processo = p.cancelar_nota(chave_nfe=chave, numero_protocolo=protocolo, justificativa=justificativa, data=data, numero_lote=numero_lote) processo.resposta.reason return processo
def consultar_recibo(self, numero_recibo, cert, key, versao=u'2.00', ambiente=2, estado=u'MG', salvar_arquivos=True, n_tentativas=2, caminho=u''): """ Este método retorna o resultado do processamento do lote enviado. @param numero_recibo: numero do recibo do lote enviado. @param n_tentativas: numero de tentativas de envio. @return: Dicionário com o 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 = salvar_arquivos p.caminho = caminho tentativa = 0 processo = p.consultar_recibo(ambiente=ambiente, numero_recibo=numero_recibo) while processo.resposta.cStat.valor == '105' and tentativa < n_tentativas: processo = p.consultar_recibo(ambiente=ambiente, numero_recibo=numero_recibo) tentativa += 1 #return {'envio': processo.envio.xml, 'resposta': processo.resposta.xml, # 'reason': processo.resposta.reason} return processo
def processar_lote(self, lista_xml_nfe, cert, key, versao=u'3.10', consumidor=False, ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, n_consultas_recibo=2, consultar_servico=True, numero_lote=None, caminho=u''): """ Este método realiza o processamento de validação, assinatura e transmissão da nfe. @param lista_xml_nfe:lista nfe(strings ou objetos NFe) @param consumidor: True caso NFC-e @param consultar_servico: consulta o status do webservice antes de enviar @param n_consultas_recibo: numero de tentativas de consultar o recibo @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.ambiente = ambiente p.estado = estado p.versao=versao p.contingencia = contingencia p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = salvar_arquivos p.caminho = caminho p.numero_tentativas_consulta_recibo = n_consultas_recibo p.verificar_status_servico = consultar_servico if numero_lote is None: numero_lote = datetime.now().strftime('%Y%m%d%H%M%S') if isinstance(lista_xml_nfe[0], basestring) and lista_xml_nfe: lista_nfe = [] for x in lista_xml_nfe: if versao == '3.10': n = NFe_310() else: n = NFe_200() n.infNFe.xml = x n.auto_preencher_campos(ambiente=ambiente, estado=estado, contingencia=contingencia, consumidor=consumidor) if consumidor: n.preencher_campos_nfce() else: n.preencher_campos_nfe() lista_nfe.append(n) else: lista_nfe = lista_xml_nfe for processo in p.processar_notas(lista_nfe, numero_lote=numero_lote): processo.envio.xml processo.resposta.xml processo.resposta.reason processos = {} processos['numero_lote'] = numero_lote processos['lote'] = processo processos['notas'] = [] for nome, proc in p.processos.items(): processos['notas'].append(proc) return processos
def consultar_cadastro(self, cert, key, cpf_cnpj=None, inscricao_estadual=None, versao=u'2.00', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ Consulta cadastro do contribuinte @param cpf_cnpj: CPF ou CNPJ do contribuinte @param inscricao_estadual: IE do contribuinte @return: Dicionário com o envio,resposta e reason. """ if cpf_cnpj is None and inscricao_estadual is None: raise ValueError("Deve-se informar o CNPJ ou CPF ou IE.") p = ProcessadorNFe() p.versao = versao p.estado = estado p.caminho = caminho if estado in ('AC', 'AL', 'AP', 'DF', 'ES', 'PB', 'RJ', 'RN', 'RO', 'RR', 'SC', 'SE', 'TO'): #SVRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'svp-ws.sefazvirtual.rs.gov.br' if versao == '3.10': SVRS3[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'cad.svrs.rs.gov.br' else: SVRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'cad.svrs.rs.gov.br' if estado == 'RS': #UFRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'sef.sefaz.rs.gov.br' if versao == '3.10': UFRS3[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'cad.sefazrs.rs.gov.br' else: UFRS[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'cad.sefazrs.rs.gov.br' if estado == 'MA': if versao == '3.10': SVAN3[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'sistemas.sefaz.ma.gov.br' SVAN3[NFE_AMBIENTE_PRODUCAO][WS_NFE_CONSULTA_CADASTRO] = u'wscadastro/CadConsultaCadastro2' else: SVAN[NFE_AMBIENTE_PRODUCAO][u'servidor'] = u'sistemas.sefaz.ma.gov.br' SVAN[NFE_AMBIENTE_PRODUCAO][WS_NFE_CONSULTA_CADASTRO] = u'wscadastro/CadConsultaCadastro2' p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia = contingencia p.salvar_arquivos = salvar_arquivos processo = p.consultar_cadastro_contribuinte(cpf_cnpj=cpf_cnpj, inscricao_estadual=inscricao_estadual, ambiente=ambiente) return processo
def consultar_nfe(self, chave, cert, key, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ Consultar a situaçao da NF-e @param chave:chave da nfe @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.caminho = caminho p.ambiente = ambiente p.certificado.cert_str = cert p.certificado.key_str = key p.contingencia=contingencia p.salvar_arquivos = salvar_arquivos processo = p.consultar_nota(chave_nfe=chave) return processo
def emitir_carta_correcao(self, chave, texto_correcao, cert, key, sequencia=None, data=None, numero_lote=None, versao=u'3.10', ambiente=2, estado=u'MG', contingencia=False, salvar_arquivos=True, caminho=u''): """ @param chave:chave da nfe @param texto_correcao: correção a ser considerada, texto livre @return: Dicionário com o envio,resposta e reason. """ p = ProcessadorNFe() p.versao = versao p.estado = estado p.ambiente = ambiente p.caminho = caminho p.certificado.cert_str = cert p.certificado.key_str = key p.salvar_arquivos = salvar_arquivos p.contingencia = contingencia processo = p.corrigir_nota(chave_nfe=chave, texto_correcao=texto_correcao, ambiente=ambiente,sequencia=sequencia, data=data, numero_lote=numero_lote) processo.resposta.reason return processo