def create_request(dados, transmissor_dados): from emensageriapro.mensageiro.functions.funcoes import salvar_arquivo_esocial, ler_arquivo if dados['service'] == 'WsEnviarLoteEventos': xml = u'' eventos = TransmissorEventosEsocial.objects.\ filter(transmissor_lote_esocial_id=dados['transmissor_id'], status=STATUS_EVENTO_AGUARD_ENVIO).all() dados_evento = {} for e in eventos: dados_evento['evento'] = e.evento dados_evento['id'] = e.id dados_evento['identidade'] = e.identidade dados_evento['grupo'] = e.grupo dados_evento['tabela'] = e.tabela dados_evento[ 'empregador_tpinsc'] = e.transmissor_lote_esocial.empregador_tpinsc dados_evento['empregador_nrinsc'] = retirar_pontuacao_cpf_cnpj( e.transmissor_lote_esocial.empregador_nrinsc) dados_evento[ 'transmissor_tpinsc'] = e.transmissor_lote_esocial.transmissor.transmissor_tpinsc dados_evento['transmissor_nrinsc'] = retirar_pontuacao_cpf_cnpj( e.transmissor_lote_esocial.transmissor.transmissor_nrinsc) xml += '<evento Id="%s">' % e.identidade xml += ler_arquivo( '/arquivos/Eventos/%(tabela)s/%(identidade)s.xml' % dados_evento) xml += '</evento>' base_request = REQUEST_ENVIA_LOTE % dados_evento elif dados['service'] == 'WsConsultarLoteEventos': a = TransmissorLoteEsocial.objects.\ get(id=dados['transmissor_id']) xml = BASE_XML_CONSULTA_LOTE % a.protocolo base_request = REQUEST_CONSULTA_LOTE % transmissor_dados text = base_request.replace( '<!--You may enter ANY elements at this point-->', xml) salvar_arquivo_esocial(dados['request'], text, 0)
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 save(self, **kwargs): from emensageriapro.mensageiro.functions.funcoes import retirar_pontuacao_cpf_cnpj self.transmissor_nrinsc = retirar_pontuacao_cpf_cnpj( self.transmissor_nrinsc) self.nrinsc = retirar_pontuacao_cpf_cnpj(self.nrinsc) super(TransmissorLote, self).save(**kwargs)
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!' )