def arquivos_reprocessar(request, hash):
    import os
    db_slug = 'default'
    try:
        usuario_id = request.user.id
        dict_hash = get_hash_url( hash )
        arquivos_id = int(dict_hash['id'])
        for_print = int(dict_hash['print'])
    except:
        usuario_id = False
        return redirect('login')
    usuario = get_object_or_404(Usuarios.objects.using( db_slug ), excluido = False, id = usuario_id)
    pagina = ConfigPaginas.objects.using( db_slug ).get(excluido = False, endereco='arquivos')
    permissao = ConfigPermissoes.objects.using( db_slug ).get(excluido = False, config_paginas=pagina, config_perfis=usuario.config_perfis)

    dict_permissoes = json_to_dict(usuario.config_perfis.permissoes)
    paginas_permitidas_lista = usuario.config_perfis.paginas_permitidas
    modulos_permitidos_lista = usuario.config_perfis.modulos_permitidos

    arquivos = get_object_or_404(Arquivos.objects.using( db_slug ), excluido = False, id = arquivos_id)
    from emensageriapro.settings import BASE_DIR
    from emensageriapro.mensageiro.functions.funcoes_importacao import importar_arquivo
    import os
    texto = ''
    if not os.path.isfile(BASE_DIR + '/' + arquivos.arquivo):
        texto = ler_arquivo(arquivos.arquivo)
        return redirect('arquivos', hash=request.session['retorno_hash'])
    a = arquivos.arquivo.split('/')
    b = a[len(a)-1].split('.')
    transmissor_id = int(b[0])
    if 'eSocial' in texto:
        if 'WsEnviarLoteEventos' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_envioLoteEventos
            read_envioLoteEventos(arquivos.arquivo, transmissor_id)
        elif 'WsConsultarLoteEventos' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_consultaLoteEventos
            read_consultaLoteEventos(arquivos.arquivo, transmissor_id)
        messages.success(request, 'Arquivo processado com sucesso!')
    elif 'Reinf' in texto:
        if 'RecepcaoLoteReinf' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_envioLoteEventos
            read_envioLoteEventos(arquivos.arquivo, transmissor_id)
        elif 'ConsultasReinf' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_consultaLoteEventos
            read_consultaLoteEventos(arquivos.arquivo, transmissor_id)
        messages.success(request, 'Arquivo processado com sucesso!')
    else:
        messages.error(request,
                       'Não foi possível reprocessar o arquivo!')
    return redirect('arquivos', hash=request.session['retorno_hash'])
Exemplo n.º 2
0
def arquivos_reprocessar(request, pk):

    import os
    from emensageriapro.settings import BASE_DIR

    arquivos = get_object_or_404(Arquivos, id=pk)

    texto = ''

    if not os.path.isfile(BASE_DIR + '/' + arquivos.arquivo):

        # texto = ler_arquivo(arquivos.arquivo)
        return redirect('mapa_importacoes', tab='master')

    a = arquivos.arquivo.split('/')
    b = a[len(a) - 1].split('.')
    transmissor_id = int(b[0])

    if 'eSocial' in texto:

        if 'WsEnviarLoteEventos' in arquivos.arquivo:

            from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_envioLoteEventos
            read_envioLoteEventos(arquivos.arquivo, transmissor_id)

        elif 'WsConsultarLoteEventos' in arquivos.arquivo:

            from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_consultaLoteEventos
            read_consultaLoteEventos(arquivos.arquivo, transmissor_id)

        messages.success(request, 'Arquivo processado com sucesso!')

    elif 'Reinf' in texto:

        if 'RecepcaoLoteReinf' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_envioLoteEventos
            read_envioLoteEventos(arquivos.arquivo, transmissor_id)

        elif 'ConsultasReinf' in arquivos.arquivo:
            from emensageriapro.mensageiro.functions.funcoes_efdreinf_comunicacao import read_consultaLoteEventos
            read_consultaLoteEventos(arquivos.arquivo, transmissor_id)

        messages.success(request, 'Arquivo processado com sucesso!')

    else:

        messages.error(request, 'Não foi possível reprocessar o arquivo!')

    return redirect('mapa_importacoes', tab='master')
Exemplo n.º 3
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!'
        )
Exemplo n.º 4
0
def send_xml(request, transmissor_id, service):
    from emensageriapro.settings import BASE_DIR
    from datetime import datetime
    data_atual = str(datetime.now()).replace(':', '-').replace(' ',
                                                               '-').replace(
                                                                   '.', '-')

    import os
    from emensageriapro.settings import FORCE_PRODUCAO_RESTRITA, TP_AMB, CA_CERT_PEM_FILE, CERT_HOST, CERT_PASS, CERT_PEM_FILE, KEY_PEM_FILE
    CERT_HOST = BASE_DIR + '/' + CERT_HOST

    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"
    dados = {}
    name = get_transmissor_name(transmissor_id)
    transmissor_dados = {}

    tle = TransmissorLoteEsocial.objects.using('default').\
                get(id=transmissor_id)

    # tra = executar_sql("""
    #     SELECT te.empregador_tpinsc, te.empregador_nrinsc,
    #                t.transmissor_tpinsc, t.transmissor_nrinsc,
    #                t.esocial_lote_min, t.esocial_lote_max,
    #                t.esocial_timeout, t.esocial_certificado, t.esocial_senha
    #           FROM public.transmissor_lote_esocial te
    #           JOIN public.transmissores t ON t.id = te.transmissor_id
    #          WHERE te.id=%s;
    # """ % transmissor_id, True)

    transmissor_dados['empregador_tpinsc'] = tle.empregador_tpinsc
    transmissor_dados['empregador_nrinsc'] = tle.empregador_nrinsc
    transmissor_dados[
        'transmissor_tpinsc'] = tle.transmissor.transmissor_tpinsc
    transmissor_dados[
        'transmissor_nrinsc'] = tle.transmissor.transmissor_nrinsc
    transmissor_dados['esocial_lote_min'] = tle.transmissor.esocial_lote_min
    transmissor_dados['esocial_lote_max'] = tle.transmissor.esocial_lote_max
    transmissor_dados['esocial_timeout'] = tle.transmissor.esocial_timeout
    # transmissor_dados['esocial_certificado'] = BASE_DIR + 'uploads/' + tle.transmissor.esocial_certificado
    # transmissor_dados['esocial_senha'] = tle.transmissor.esocial_senha

    cert_pem_file = BASE_DIR + '/' + CERT_PEM_FILE
    key_pem_file = BASE_DIR + '/' + KEY_PEM_FILE

    if not os.path.isfile(cert_pem_file):
        create_pem_files(CERT_HOST, CERT_PASS, cert_pem_file, key_pem_file)

    dados['transmissor_id'] = transmissor_id
    dados['header'] = 'arquivos/Comunicacao/%s/header/%s_%s.xml' % (
        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.xml' % (
            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'] = cert_pem_file
    dados[
        'cacert'] = '%s/certificados/webservicesproducaorestritaesocialgovbr.crt' % BASE_DIR
    dados['key'] = key_pem_file
    dados['action'] = ACTION
    dados['timeout'] = transmissor_dados['esocial_timeout']

    quant_eventos_validados =  TransmissorEventosEsocial.objects.using('default'). \
                                    filter(transmissor_lote_esocial_id=transmissor_id,
                                           status=4).count()

    # qt_ev_validados = executar_sql("""
    # SELECT count(*) FROM transmissor_eventos_esocial
    #  WHERE transmissor_lote_esocial_id=%s AND status=4""" % transmissor_id, True)
    # quant_eventos_validados = qt_ev_validados[0][0]

    if quant_eventos_validados or service == 'WsConsultarLoteEventos':

        quant_eventos = TransmissorEventosEsocial.objects.using('default'). \
                    filter(transmissor_lote_esocial_id=transmissor_id,
                           status=4).count()

        # qt_ev = executar_sql("""
        # SELECT count(*) FROM transmissor_eventos_esocial
        #  WHERE transmissor_lote_esocial_id=%s""" % transmissor_id, True)
        # quant_eventos = qt_ev[0][0]

        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)

            command = '''curl --connect-timeout %(timeout)s
                              --cert %(cert)s
                              --key %(key)s
                              --cacert %(cacert)s
                              -H "Content-Type: text/xml;charset=UTF-8" 
                              -H "SOAPAction:%(action)s" 
                              --dump-header %(header_completo)s
                              --output %(response_completo)s 
                              -d@%(request_completo)s 
                              %(url)s''' % dados

            command = command.replace('\n', '')
            for n in range(10):
                command = command.replace('  ', ' ')

            os.system(command)

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

            if service == 'WsEnviarLoteEventos':
                from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_envioLoteEventos
                read_envioLoteEventos(dados['response'], transmissor_id)
                messages.success(request, 'Lote enviado com sucesso!')

            elif service == 'WsConsultarLoteEventos':
                from emensageriapro.mensageiro.functions.funcoes_esocial_comunicacao import read_consultaLoteEventos
                messages.success(request, 'Lote consultado com sucesso!')
                read_consultaLoteEventos(dados['response'], transmissor_id)

            gravar_nome_arquivo(dados['header'], 0)
            gravar_nome_arquivo(dados['request'], 0)
            gravar_nome_arquivo(dados['response'], 0)

            if 'HTTP/1.1 200 OK' not in ler_arquivo(dados['header']):
                messages.warning(
                    request,
                    'Retorno do servidor: ' + ler_arquivo(dados['header']))

            if service == 'WsEnviarLoteEventos':
                TransmissorLoteEsocial.objects.using('default').filter(
                    id=transmissor_id).update(status=7)
                # alterar_status_transmissor(transmissor_id, 7)

            elif service == 'WsConsultarLoteEventos':
                TransmissorLoteEsocial.objects.using('default').filter(
                    id=transmissor_id).update(status=9)
                # alterar_status_transmissor(transmissor_id, 9)

        elif (quant_eventos < transmissor_dados['esocial_lote_min'] and \
                    service == 'WsEnviarLoteEventos'):
            messages.error(request,
                           'Lote com quantidade inferior a mínima permitida!')
            TransmissorLoteEsocial.objects.using('default').filter(
                id=transmissor_id).update(status=0)
            #alterar_status_transmissor(transmissor_id, 0)

        elif (quant_eventos > transmissor_dados['esocial_lote_max'] and \
                  service == 'WsEnviarLoteEventos'):
            messages.error(
                request,
                'Lote com quantidade de eventos superior a máxima permitida!')
            TransmissorLoteEsocial.objects.using('default').filter(
                id=transmissor_id).update(status=0)
            #alterar_status_transmissor(transmissor_id, 0)

        else:
            messages.error(request, 'Erro ao enviar o lote!')

            if service == 'WsEnviarLoteEventos':
                TransmissorLoteEsocial.objects.using('default').filter(
                    id=transmissor_id).update(status=5)
                # alterar_status_transmissor(transmissor_id, 5)

            elif service == 'WsConsultarLoteEventos':
                TransmissorLoteEsocial.objects.using('default').filter(
                    id=transmissor_id).update(status=8)
                # alterar_status_transmissor(transmissor_id, 8)

    else:
        messages.error(request,
                       'Não possuem eventos validados para envio neste lote!')

    atualizar_status_esocial()