Ejemplo n.º 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
Ejemplo n.º 2
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!'
        )
Ejemplo 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 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!'
        )