def assinar_efdreinf(request, xml, transmissor_id): from lxml import etree from emensageriapro.settings import BASE_DIR from signxml import XMLSigner, methods from emensageriapro.mensageiro.functions.funcoes import get_identidade_evento, create_pem_files, ler_arquivo if transmissor_id: tra = TransmissorLoteEfdreinf.objects. \ get(id=transmissor_id) if tra.transmissor: if tra.transmissor.certificado: cert_host = '%s/certificado/%s' % ( BASE_DIR, tra.transmissor.certificado.certificado) cert_pass = tra.transmissor.certificado.senha cert_pem_file = '/certificado/cert_%s.pem' % tra.transmissor.certificado.id key_pem_file = '/certificado/key_%s.pem' % tra.transmissor.certificado.id create_pem_files(cert_host, cert_pass, cert_pem_file, key_pem_file) cert_str = ler_arquivo(cert_pem_file) key_str = ler_arquivo(key_pem_file) root = etree.fromstring(xml) identidade = get_identidade_evento(xml) signed_root = XMLSigner( method=methods.enveloped, signature_algorithm=u'rsa-sha256', digest_algorithm=u'sha256', c14n_algorithm= u'http://www.w3.org/TR/2001/REC-xml-c14n-20010315').sign( root, reference_uri='#' + identidade, key=key_str, cert=cert_str) return etree.tostring(signed_root) else: messages.error( request, '''O certificado não está configurado, configure pelo menos um transmissor para o respectivo empregador!''' ) else: messages.error(request, '''O transmissor não está configurado!''') return xml
def send_xml(request, transmissor_id, service): import os from datetime import datetime from emensageriapro.settings import BASE_DIR from emensageriapro.mensageiro.functions.funcoes import get_transmissor_name, \ ler_arquivo, create_pem_files, send, gravar_nome_arquivo, create_folders TP_AMB = config.ESOCIAL_TP_AMB CA_CERT_PEM_FILE = config.ESOCIAL_CA_CERT_PEM_FILE create_folders() data_atual = str(datetime.now()).replace(':', '-').replace(' ', '-').replace( '.', '-') if TP_AMB == '1': # Produção if service == 'WsEnviarLoteEventos': URL_WS = "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/enviarloteeventos/WsEnviarLoteEventos.svc" ACTION = "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/v1_1_0/ServicoEnviarLoteEventos/EnviarLoteEventos" elif service == 'WsConsultarLoteEventos': URL_WS = "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/consultarloteeventos/WsConsultarLoteEventos.svc" ACTION = "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0/ServicoConsultarLoteEventos/ConsultarLoteEventos" elif TP_AMB == '2': # Produção-Restrita if service == 'WsEnviarLoteEventos': URL_WS = "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/enviarloteeventos/WsEnviarLoteEventos.svc" ACTION = "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/v1_1_0/ServicoEnviarLoteEventos/EnviarLoteEventos" elif service == 'WsConsultarLoteEventos': URL_WS = "https://webservices.producaorestrita.esocial.gov.br/servicos/empregador/consultarloteeventos/WsConsultarLoteEventos.svc" ACTION = "http://www.esocial.gov.br/servicos/empregador/lote/eventos/envio/consulta/retornoProcessamento/v1_1_0/ServicoConsultarLoteEventos/ConsultarLoteEventos" tle = TransmissorLoteEsocial.objects. \ get(id=transmissor_id) if tle.transmissor: if tle.transmissor.certificado: cert_host = '%s/certificado/%s' % ( BASE_DIR, tle.transmissor.certificado.certificado) cert_pass = tle.transmissor.certificado.senha cert_pem_file = '/certificado/cert_%s.pem' % tle.transmissor.certificado.id key_pem_file = '/certificado/key_%s.pem' % tle.transmissor.certificado.id create_pem_files(cert_host, cert_pass, cert_pem_file, key_pem_file) else: messages.error( request, 'O certificado não está configurado ou não possuem eventos validados para envio neste lote!' ) return None else: messages.error(request, 'O Transmissor não está configurado!') return None transmissor_dados = {} transmissor_dados['empregador_tpinsc'] = tle.empregador_tpinsc transmissor_dados['empregador_nrinsc'] = retirar_pontuacao_cpf_cnpj( tle.empregador_nrinsc) transmissor_dados[ 'transmissor_tpinsc'] = tle.transmissor.transmissor_tpinsc transmissor_dados['transmissor_nrinsc'] = retirar_pontuacao_cpf_cnpj( tle.transmissor.transmissor_nrinsc) transmissor_dados['esocial_lote_min'] = config.ESOCIAL_LOTE_MIN transmissor_dados['esocial_lote_max'] = config.ESOCIAL_LOTE_MAX transmissor_dados['esocial_timeout'] = int(config.ESOCIAL_TIMEOUT) name = get_transmissor_name(transmissor_id) dados = {} dados['transmissor_id'] = transmissor_id dados['header'] = '/arquivos/Comunicacao/%s/header/%s_%s.txt' % ( service, name, data_atual) dados['request'] = '/arquivos/Comunicacao/%s/request/%s_%s.xml' % ( service, name, data_atual) dados['response'] = '/arquivos/Comunicacao/%s/response/%s_%s.xml' % ( service, name, data_atual) dados[ 'header_completo'] = '%s/arquivos/Comunicacao/%s/header/%s_%s.txt' % ( BASE_DIR, service, name, data_atual) dados[ 'request_completo'] = '%s/arquivos/Comunicacao/%s/request/%s_%s.xml' % ( BASE_DIR, service, name, data_atual) dados[ 'response_completo'] = '%s/arquivos/Comunicacao/%s/response/%s_%s.xml' % ( BASE_DIR, service, name, data_atual) dados['service'] = service dados['url'] = URL_WS dados['cert'] = BASE_DIR + cert_pem_file dados['cacert'] = BASE_DIR + CA_CERT_PEM_FILE dados['key'] = BASE_DIR + key_pem_file dados['action'] = ACTION dados['timeout'] = transmissor_dados['esocial_timeout'] quant_eventos = TransmissorEventosEsocial.objects. \ filter(transmissor_lote_esocial_id=transmissor_id, status=STATUS_EVENTO_AGUARD_ENVIO).count() if tle.transmissor.certificado and (quant_eventos or service == 'WsConsultarLoteEventos'): if (quant_eventos >= transmissor_dados['esocial_lote_min'] and \ quant_eventos <= transmissor_dados['esocial_lote_max'] and \ service == 'WsEnviarLoteEventos') or service == 'WsConsultarLoteEventos': create_request(dados, transmissor_dados) send(dados) gravar_nome_arquivo(dados['header'], 0) gravar_nome_arquivo(dados['request'], 0) gravar_nome_arquivo(dados['response'], 0) if not os.path.isfile(BASE_DIR + dados['response']): messages.error( request, '''O servidor demorou mais que o esperado para efetuar a conexão! Caso necessário solicite ao administrador do sistema para que aumente o tempo do Timeout. Timeout atual %(timeout)s''' % dados) return None elif 'HTTP/1.1 200 OK' not in ler_arquivo(dados['header']): messages.warning( request, 'Retorno do servidor: ' + ler_arquivo(dados['header'])) elif service == 'WsEnviarLoteEventos': from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_envioLoteEventos, definir_status_evento read_envioLoteEventos(dados['response'], transmissor_id) TransmissorLoteEsocial.objects.filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_ENVIADO, data_hora_envio=datetime.now()) definir_status_evento(transmissor_id) messages.success(request, 'Lote enviado com sucesso!') elif service == 'WsConsultarLoteEventos': from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_consultaLoteEventos, definir_status_evento read_consultaLoteEventos(dados['response'], transmissor_id) TransmissorLoteEsocial.objects.filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CONSULTADO, data_hora_consulta=datetime.now()) definir_status_evento(transmissor_id) messages.success(request, 'Lote consultado com sucesso!') elif (quant_eventos < transmissor_dados['esocial_lote_min'] and service == 'WsEnviarLoteEventos'): messages.error(request, 'Lote com quantidade inferior a mínima permitida!') elif (quant_eventos > transmissor_dados['esocial_lote_max'] and service == 'WsEnviarLoteEventos'): messages.error( request, 'Lote com quantidade de eventos superior a máxima permitida!') else: if service == 'WsEnviarLoteEventos': TransmissorLoteEsocial.objects.filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_ENVIADO_ERRO) messages.error(request, 'Erro ao enviar o lote!') elif service == 'WsConsultarLoteEventos': TransmissorLoteEsocial.objects.filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CONSULTADO_ERRO) messages.error(request, 'Erro ao consultar o lote!') else: messages.error( request, 'O certificado não está configurado ou não possuem eventos validados para envio neste lote!' )
def send_xml(request, transmissor_id, service): import os from datetime import datetime from emensageriapro.settings import BASE_DIR from emensageriapro.mensageiro.functions.funcoes import ler_arquivo, \ get_transmissor_name, create_pem_files, send, gravar_nome_arquivo, create_folders CA_CERT_PEM_FILE = config.EFDREINF_CA_CERT_PEM_FILE TP_AMB = config.EFDREINF_TP_AMB create_folders() data_atual = str(datetime.now()).replace(':', '-').replace(' ', '-').replace( '.', '-') if TP_AMB == '1': # Produção if service == 'RecepcaoLoteReinf': URL = "https://reinf.receita.fazenda.gov.br/WsREINF/RecepcaoLoteReinf.svc" ACTION = "http://sped.fazenda.gov.br/RecepcaoLoteReinf/ReceberLoteEventos" elif service == 'ConsultasReinf': URL = "https://reinf.receita.fazenda.gov.br/WsReinfConsultas/ConsultasReinf.svc" ACTION = "http://sped.fazenda.gov.br/ConsultasReinf/ConsultaInformacoesConsolidadas" elif TP_AMB == '2': # Produção-Restrita if service == 'RecepcaoLoteReinf': URL = "https://preprodefdreinf.receita.fazenda.gov.br/wsreinf/RecepcaoLoteReinf.svc" ACTION = "http://sped.fazenda.gov.br/RecepcaoLoteReinf/ReceberLoteEventos" elif service == 'ConsultasReinf': URL = "https://preprodefdreinf.receita.fazenda.gov.br/WsReinfConsultas/ConsultasReinf.svc" ACTION = "http://sped.fazenda.gov.br/ConsultasReinf/ConsultaInformacoesConsolidadas" tra = TransmissorLoteEfdreinf.objects.\ get(id=transmissor_id) if tra.transmissor: if tra.transmissor.certificado: cert_host = '%s/certificado/%s' % ( BASE_DIR, tra.transmissor.certificado.certificado) cert_pass = tra.transmissor.certificado.senha cert_pem_file = '/certificado/cert_%s.pem' % tra.transmissor.certificado.id key_pem_file = '/certificado/key_%s.pem' % tra.transmissor.certificado.id create_pem_files(cert_host, cert_pass, cert_pem_file, key_pem_file) else: messages.error( request, 'O certificado não está configurado ou não possuem eventos validados para envio neste lote!' ) return None else: messages.error(request, 'O Transmissor não está configurado!') return None dados = {} dados['contribuinte_tpinsc'] = tra.contribuinte_tpinsc dados['contribuinte_nrinsc'] = retirar_pontuacao_cpf_cnpj( tra.contribuinte_nrinsc) dados['transmissor_id'] = transmissor_id dados['efdreinf_lote_min'] = config.EFDREINF_LOTE_MIN dados['efdreinf_lote_max'] = config.EFDREINF_LOTE_MIN dados['efdreinf_timeout'] = int(config.EFDREINF_TIMEOUT) name = get_transmissor_name(transmissor_id) dados['transmissor_id'] = transmissor_id dados['header'] = '/arquivos/Comunicacao/%s/header/%s_%s.txt' % ( service, name, data_atual) dados['request'] = '/arquivos/Comunicacao/%s/request/%s_%s.xml' % ( service, name, data_atual) dados['response'] = '/arquivos/Comunicacao/%s/response/%s_%s.xml' % ( service, name, data_atual) dados[ 'header_completo'] = '%s/arquivos/Comunicacao/%s/header/%s_%s.txt' % ( BASE_DIR, service, name, data_atual) dados[ 'request_completo'] = '%s/arquivos/Comunicacao/%s/request/%s_%s.xml' % ( BASE_DIR, service, name, data_atual) dados[ 'response_completo'] = '%s/arquivos/Comunicacao/%s/response/%s_%s.xml' % ( BASE_DIR, service, name, data_atual) dados['service'] = service dados['url'] = URL dados['cert'] = BASE_DIR + cert_pem_file dados['cacert'] = BASE_DIR + CA_CERT_PEM_FILE dados['key'] = BASE_DIR + key_pem_file dados['action'] = ACTION dados['timeout'] = dados['efdreinf_timeout'] quant_eventos = TransmissorEventosEfdreinf.objects. \ filter(transmissor_lote_efdreinf_id=transmissor_id, status=STATUS_EVENTO_AGUARD_ENVIO).count() if tra.transmissor.certificado and (quant_eventos or service == 'ConsultasReinf'): if (quant_eventos >= dados['efdreinf_lote_min'] and \ quant_eventos <= dados['efdreinf_lote_max'] and \ service == 'RecepcaoLoteReinf') or service == 'ConsultasReinf': create_request(dados) send(dados) gravar_nome_arquivo(dados['header'], 0) gravar_nome_arquivo(dados['request'], 0) gravar_nome_arquivo(dados['response'], 0) if not os.path.isfile(BASE_DIR + dados['response']): messages.error( request, '''O servidor demorou mais que o esperado para efetuar a conexão! Caso necessário solicite ao administrador do sistema para que aumente o tempo do Timeout. Timeout atual %(timeout)s''' % dados) return None elif 'HTTP/1.1 200 OK' not in ler_arquivo(dados['header']): messages.warning( request, 'Retorno do servidor: ' + ler_arquivo(dados['header'])) elif service == 'RecepcaoLoteReinf': from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_envioLoteEventos, definir_status_evento read_envioLoteEventos(request, dados['response'], transmissor_id) messages.success(request, 'Lote enviado com sucesso!') TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_ENVIADO, data_hora_envio=datetime.now()) definir_status_evento(transmissor_id) elif service == 'ConsultasReinf': from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_consultaLoteEventos, definir_status_evento read_consultaLoteEventos(request, dados['response'], transmissor_id) messages.success(request, 'Lote consultado com sucesso!') TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CONSULTADO, data_hora_consulta=datetime.now()) definir_status_evento(transmissor_id) elif quant_eventos < dados[ 'efdreinf_lote_min'] and service == 'RecepcaoLoteReinf': messages.error(request, 'Lote com quantidade inferior a mínima permitida!') TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CADASTRADO) elif quant_eventos > dados[ 'efdreinf_lote_max'] and service == 'RecepcaoLoteReinf': messages.error( request, 'Lote com quantidade de eventos superior a máxima permitida!') TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CADASTRADO) else: messages.error(request, 'Erro ao enviar o lote!') if service == 'RecepcaoLoteReinf': TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_ENVIADO_ERRO) elif service == 'ConsultasReinf': TransmissorLoteEfdreinf.objects.\ filter(id=transmissor_id).\ update(status=TRANSMISSOR_STATUS_CONSULTADO_ERRO) else: messages.error( request, 'O certificado não está configurado ou não possuem eventos validados para envio neste lote!' )