Example #1
0
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
Example #2
0
def read_consultaLoteEventos(request, arquivo, transmissor_lote_efdreinf_id):

    from emensageriapro.efdreinf.views.r9011_evttotalcontrib_importar import read_r9011_evttotalcontrib_obj
    from emensageriapro.mensageiro.functions.funcoes import ler_arquivo
    import untangle

    xml = ler_arquivo(arquivo).replace("s:", "")

    doc = untangle.parse(xml)

    child = doc.Envelope.Body.ConsultaInformacoesConsolidadasResponse.ConsultaInformacoesConsolidadasResult

    lote = {}
    lote['transmissor_lote_efdreinf_id'] = transmissor_lote_efdreinf_id

    if 'evtTotalContrib' in dir(child.Reinf):

        dados = read_r9011_evttotalcontrib_obj(request, child, 9)
        evento_identidade = dados['identidade_evento']

        evento_dados = executar_sql(
            """
            SELECT id, evento, identidade, tabela
              FROM public.vw_transmissor_eventos_efdreinf WHERE identidade='%s';
        """ % evento_identidade, True)

        if evento_dados:
            executar_sql(
                "UPDATE public.%s SET retornos_evttotalcontrib_id=%s WHERE id=%s;"
                % (evento_dados[0][3], dados['id'], evento_dados[0][0]), False)
Example #3
0
def create_request(dados):

    from emensageriapro.mensageiro.functions.funcoes import ler_arquivo, salvar_arquivo_efdreinf

    if dados['service'] == 'RecepcaoLoteReinf':

        xml_temp = ''
        eventos = TransmissorEventosEfdreinf.objects. \
            filter(transmissor_lote_efdreinf_id=dados['transmissor_id'],
                   status=STATUS_EVENTO_AGUARD_ENVIO).all()

        for e in eventos:
            dados_evento = e.__dict__
            xml_temp += '<evento id="%(identidade)s">' % dados_evento
            xml_temp += ler_arquivo(
                '/arquivos/Eventos/%(tabela)s/%(identidade)s.xml' %
                dados_evento)
            xml_temp += '</evento>'

        text = REQUEST_RECEBER_LOTE_EVENTOS_EFDREINF.replace(
            '<!--You may enter ANY elements at this point-->', xml_temp)

    elif dados['service'] == 'ConsultasReinf':
        a = TransmissorLoteEfdreinf.objects. \
            get(id=dados['transmissor_id'])

        text = REQUEST_CONSULTA_INFORMACOES_CONSOLIDADES_EFDREINF % a.__dict__

    salvar_arquivo_efdreinf(dados['request'], text, 0)
Example #4
0
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)
Example #5
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!'
        )
Example #6
0
def read_envioLoteEventos(request, arquivo, transmissor_lote_efdreinf_id):

    from emensageriapro.mensageiro.functions.funcoes import ler_arquivo
    from emensageriapro.mensageiro.models import TransmissorLoteEfdreinfOcorrencias, TransmissorLoteEfdreinf
    import untangle

    xml = ler_arquivo(arquivo).replace("s:", "")
    doc = untangle.parse(xml)
    child = doc.Envelope.Body.ReceberLoteEventosResponse.ReceberLoteEventosResult.Reinf.retornoLoteEventos

    lote = {}

    if 'IdTransmissor' in dir(child.ideTransmissor):
        lote[
            'identidade_transmissor'] = child.ideTransmissor.IdTransmissor.cdata
    if 'cdStatus' in dir(child.status):
        lote['codigo_status'] = child.status.cdStatus.cdata
    if 'descRetorno' in dir(child.status):
        lote['retorno_descricao'] = child.status.descRetorno.cdata

    TransmissorLoteEfdreinf.objects. \
        filter(id=transmissor_lote_efdreinf_id).update(**lote)

    TransmissorLoteEfdreinfOcorrencias.objects.\
        filter(transmissor_lote_efdreinf_id=transmissor_lote_efdreinf_id).delete()

    if 'dadosRegistroOcorrenciaLote' in dir(child.status):

        for ocorrencia in child.status.dadosRegistroOcorrenciaLote.ocorrencias:

            lote_ocorrencias = {}
            lote_ocorrencias['localizacao'] = '-'

            if 'tipo' in dir(ocorrencia):
                lote_ocorrencias['tipo'] = ocorrencia.tipo.cdata

            if 'localizacaoErroAviso' in dir(ocorrencia):
                lote_ocorrencias[
                    'localizacao'] = ocorrencia.localizacaoErroAviso.cdata

            if 'codigo' in dir(ocorrencia):
                lote_ocorrencias['resposta_codigo'] = ocorrencia.codigo.cdata

            if 'descricao' in dir(ocorrencia):
                lote_ocorrencias['descricao'] = ocorrencia.descricao.cdata

            lote_ocorrencias[
                'transmissor_lote_efdreinf_id'] = transmissor_lote_efdreinf_id

            obj = TransmissorLoteEfdreinfOcorrencias(**lote_ocorrencias)
            obj.save(using='default')

    if 'retornoEventos' in dir(child):

        eventos_retorno = [
            's5001evtBasesTrab',
            's5002evtIrrfBenef',
            's5003evtBasesFGTS',
            's5011evtCS',
            's5012evtIrrf',
            's5013evtFGTS',
        ]

        for evento in child.retornoEventos.evento:

            if 'evtTotal' in dir(evento.Reinf):

                from emensageriapro.efdreinf.views.r9001_evttotal_importar import read_r9001_evttotal_obj
                from emensageriapro.efdreinf.models import r9001evtTotal

                dados = read_r9001_evttotal_obj(request, evento,
                                                STATUS_EVENTO_PROCESSADO)

                retornos_evttotal = r9001evtTotal.objects. \
                    get(id=dados['id'])

                from django.apps import apps

                app_models = apps.get_app_config('efdreinf').get_models()

                for model in app_models:

                    if retornos_evttotal.cdretorno == '1' and model._meta.object_name not in EVENTOS_RETORNO:

                        model.objects.filter(
                            identidade=evento['id'],
                            transmissor_lote_efdreinf_id=transmissor_lote_efdreinf_id). \
                            update(status=STATUS_EVENTO_ENVIADO_ERRO,
                                   ocorrencias=get_ocorrencias('r9001', retornos_evttotal.id),
                                   retornos_r9001_id=retornos_evttotal.id,
                                   transmissor_lote_efdreinf_id=None,
                                   transmissor_lote_efdreinf_error=transmissor_lote_efdreinf_id)

                    elif retornos_evttotal.cdretorno == '0' and model._meta.object_name not in EVENTOS_RETORNO:

                        model.objects.filter(
                            identidade=evento['id'],
                            transmissor_lote_efdreinf_id=transmissor_lote_efdreinf_id). \
                            update(status=STATUS_EVENTO_ENVIADO,
                                   ocorrencias=get_ocorrencias('r9001', retornos_evttotal.id),
                                   retornos_r9001_id=retornos_evttotal.id,
                                   transmissor_lote_efdreinf_error_id=None)

                return retornos_evttotal

            if 'evtTotalContrib' in dir(evento.Reinf):

                from emensageriapro.efdreinf.views.r9011_evttotalcontrib_importar import read_r9011_evttotalcontrib_obj
                from emensageriapro.efdreinf.models import r9011evtTotalContrib

                dados = read_r9011_evttotalcontrib_obj(
                    request, evento, STATUS_EVENTO_PROCESSADO)

                retornos_evttotalcontrib = r9011evtTotalContrib.objects.get(
                    id=dados['id'])

                from django.apps import apps

                app_models = apps.get_app_config('efdreinf').get_models()

                for model in app_models:

                    if retornos_evttotalcontrib.cdretorno == '1' and model._meta.object_name not in EVENTOS_RETORNO:

                        model.objects.filter(
                            identidade=evento['id'],
                            transmissor_lote_efdreinf_id=transmissor_lote_efdreinf_id). \
                            update(status=STATUS_EVENTO_ENVIADO_ERRO,
                                   ocorrencias=get_ocorrencias('r9011', retornos_evttotalcontrib.id),
                                   retornos_r9011_id=retornos_evttotalcontrib.id,
                                   transmissor_lote_efdreinf_id=None
                                   )

                    elif retornos_evttotalcontrib.cdretorno == '0' and model._meta.object_name not in EVENTOS_RETORNO:

                        model.objects.filter(
                            identidade=evento['id'],
                            transmissor_lote_esocial_id=transmissor_lote_efdreinf_id). \
                            update(status=STATUS_EVENTO_PROCESSADO,
                                   ocorrencias=get_ocorrencias('r9011', retornos_evttotalcontrib.id),
                                   retornos_r9011_id=retornos_evttotalcontrib.id
                                   )

                return retornos_evttotalcontrib
Example #7
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 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!'
        )