const database = require('../config/database')
const response = require("../constants/response");
const pagination = require("../constants/pagination");
const logger = require('../services/loggerService');
const {pagamentosFilteres} = require("../helpers/filterResponseSQL")
const paginationRecords = require("../helpers/paginationRecords")

module.exports.getPagamentos = async function(pagina, limite, total_registros, entidade, montante, tarifa, referencia, periodo, log_transacao, terminal, nib, hora_transacao, data_transacao, req) {
     
    try{

        logger("SERVIDOR:getPagamentos").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id") 
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora_transacao}%`)
        .whereLike("data_movimento",`%${data_transacao}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')

        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentos").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")   
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora_transacao}%`)
        .whereLike("data_movimento",`%${data_transacao}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc')
        
        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora_transacao = hora_transacao
        registros.data_transacao = data_transacao

        delete registros.count

        logger("SERVIDOR:getPagamentos").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros,
          url: req.originalUrl
        });
            
        return rs

    
    } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentos").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}


module.exports.getPagamentosId = async function(id_pagamento) {
     
     try{

        logger("SERVIDOR:getPagamentosId").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .where({id_pagamento})
        .orderBy('id_pagamento','desc')
        
        const [filtered] = pagamentosFilteres(pagamentos)

        logger("SERVIDOR:getPagamentosId").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered || {});            
        return rs      
      
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosId").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosReferencia = async function(referencia, pagina, limite, total_registros, entidade, montante, tarifa, periodo, log_transacao, terminal, nib, hora) {
     
     try{

        logger("SERVIDOR:getPagamentosReferencia").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .where({referencia_do_servico: referencia})
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')
      
        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentosReferencia").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .where({referencia_do_servico: referencia})
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc') 
      
        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora = hora

        delete registros.count

        logger("SERVIDOR:getPagamentosReferencia").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
     
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosReferencia").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosEntidadeReferencia = async function(numero_entidade, referencia, pagina, limite, total_registros, montante, tarifa, periodo, log_transacao, terminal, nib, hora) {
     
     try{

        logger("SERVIDOR:getPagamentosEntidadeReferencia").debug("Á carregar dados")
        const verifivarPagamentoTempoReal = await database('configuracoes').where({cliente_entidade: numero_entidade})        

        if(((verifivarPagamentoTempoReal[0]?.servico_pagamento_por_sector == "false") && (verifivarPagamentoTempoReal[0]?.servico_gpo == "false"))){
          logger("SERVIDOR:getPagamentosEntidadeReferencia").info("Serviço de pagamento por sector inactivo")
          const rs = response("erro", 423, "Serviço de pagamento por sector inactivo");
          return rs
        }

        logger("SERVIDOR:getPagamentosEntidadeReferencia").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .where({numero_entidade})
        .andWhere({referencia_do_servico: referencia})
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')
      
        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentosEntidadeReferencia").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .where({numero_entidade})
        .andWhere({referencia_do_servico: referencia})
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc') 
      
        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = numero_entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora = hora

        delete registros.count

        logger("SERVIDOR:getPagamentosEntidadeReferencia").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
     
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosEntidadeReferencia").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosEntidadeGrupoAfiliados = async function(numero_entidade, grupo_identificacao, pagina, limite, total_registros, montante, tarifa, referencia, periodo, log_transacao, terminal, nib, hora) {
     
     try{

        logger("SERVIDOR:getPagamentosEntidadeGrupoAfiliados").debug("Á carregar dados")
        const verifivarPagamentoTempoReal = await database('configuracoes').where({cliente_entidade: numero_entidade})        

        if(((verifivarPagamentoTempoReal[0]?.servico_pagamento_por_sector == "false") && (verifivarPagamentoTempoReal[0]?.servico_gpo == "false"))){
          logger("SERVIDOR:getPagamentosEntidadeGrupoAfiliados").info("Serviço de pagamento por sector inactivo")
          const rs = response("erro", 423, "Serviço de pagamento por sector inactivo");
          return rs
        }

        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("afiliados","afiliados.id_afiliado","=","referencias.gerado_por_afiliado")
        .join("identificacao_afiliados","identificacao_afiliados.id_identificacao_afiliados","=","afiliados.grupo_identificacao")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .where({numero_entidade})
        .andWhere({grupo_identificacao})
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')

        const {registros} = paginationRecords(pagamentos, pagina, limite)

        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("afiliados","afiliados.id_afiliado","=","referencias.gerado_por_afiliado")
        .join("identificacao_afiliados","identificacao_afiliados.id_identificacao_afiliados","=","afiliados.grupo_identificacao")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .where({numero_entidade})
        .andWhere({grupo_identificacao})
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc')
      
      
        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = numero_entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora = hora

        delete registros.count

        logger("SERVIDOR:getPagamentosEntidadeGrupoAfiliados").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
     
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosEntidadeGrupoAfiliados").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosEntidade = async function(numero_entidade, pagina, limite, total_registros, montante, tarifa, referencia, periodo, log_transacao, terminal, nib, hora_transacao, data_transacao, req) {
     
     try{

        logger("SERVIDOR:getPagamentosEntidade").debug("Á carregar dados de configuração")
        const verifivarPagamentoTempoReal = await database('configuracoes').where({cliente_entidade: numero_entidade})        

        if(((verifivarPagamentoTempoReal[0]?.servico_pagamento_por_sector == "false") && (verifivarPagamentoTempoReal[0]?.servico_gpo == "false"))){
          logger("SERVIDOR:getPagamentosEntidade").info("Serviço de pagamento por sector inactivo")
          const rs = response("erro", 423, "Serviço de pagamento por sector inactivo");
          return rs
        }

        logger("SERVIDOR:getPagamentosEntidade").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora_transacao}%`)
        .whereLike("data_movimento",`%${data_transacao}%`)
        .where({numero_entidade})
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')    
      
        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentosEntidade").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora_transacao}%`)
        .whereLike("data_movimento",`%${data_transacao}%`)
        .where({numero_entidade})
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc')
      
        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = numero_entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora_transacao = hora_transacao
        registros.data_transacao = data_transacao

        delete registros.count

        logger("SERVIDOR:getPagamentosEntidade").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
      
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosEntidade").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosPeriodo = async function(periodo, pagina, limite, total_registros, entidade, montante, tarifa, referencia, log_transacao, terminal, nib, hora) {
     
  try{

      logger("SERVIDOR:getPagamentosPeriodo").debug("Á carregar dados")
      const pagamentos = await database('pagamentos')
      .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
      .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
      .join("tipo_produto","tipo_produto.id_tipo_produto","=","referencias.tipo_de_registro")    
      .whereLike("montante_da_operacao",`%${montante}%`)
      .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
      .whereLike("referencia_do_servico",`%${referencia}%`)
      .whereLike("numero_Log_EGR",`%${log_transacao}%`)
      .whereLike("tipo_de_Terminal",`%${terminal}%`)
      .whereLike("nib",`%${nib}%`)
      .whereLike("hora_do_movimento",`%${hora}%`)
      .whereLike("numero_entidade",`%${entidade}%`)
      .where({Identificacao_Log_EGR:periodo})
      .limit(total_registros || pagination.total_limite)
      .orderBy('id_pagamento','desc')  
              
      const {registros} = paginationRecords(pagamentos, pagina, limite)

      logger("SERVIDOR:getPagamentosPeriodo").debug("Á carregar dados com limite")
      const pagamentosLimite = await database('pagamentos')
      .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
      .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
      .join("tipo_produto","tipo_produto.id_tipo_produto","=","referencias.tipo_de_registro")    
      .whereLike("montante_da_operacao",`%${montante}%`)
      .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
      .whereLike("referencia_do_servico",`%${referencia}%`)
      .whereLike("numero_Log_EGR",`%${log_transacao}%`)
      .whereLike("tipo_de_Terminal",`%${terminal}%`)
      .whereLike("nib",`%${nib}%`)
      .whereLike("hora_do_movimento",`%${hora}%`)
      .whereLike("numero_entidade",`%${entidade}%`)
      .where({Identificacao_Log_EGR:periodo})
      .limit(registros.limite)
      .offset(registros.count)
      .orderBy('id_pagamento','desc')
      
      const filtered = pagamentosFilteres(pagamentosLimite)
      registros.total_apresentados = pagamentosLimite.length
      registros.entidade = entidade
      registros.periodo = periodo
      registros.montante = montante
      registros.tarifa = tarifa
      registros.referencia = referencia
      registros.log_transacao = log_transacao
      registros.terminal = terminal
      registros.nib = nib
      registros.hora = hora

      logger("SERVIDOR:getPagamentosPeriodo").info("Respondeu a requisição")
      const rs = response("sucesso", 200, filtered, "json",
      {
        registros
      });
          
      return rs 
   
  } catch (error) {
      console.error(error.message)
      logger("SERVIDOR:getPagamentosPeriodo").error("Erro a buscar os dados "+error.message)
      const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
      return rs
 }
 
}

module.exports.getPagamentosEntidadePeriodo = async function(numero_entidade, periodo, pagina, limite, total_registros, montante, tarifa, referencia, log_transacao, terminal, nib, hora) {
     
  try{

      logger("SERVIDOR:getPagamentosEntidadePeriodo").debug("Á carregar dados da configuração")
      const verifivarPagamentoTempoReal = await database('configuracoes').where({cliente_entidade: numero_entidade})        

      if(((verifivarPagamentoTempoReal[0]?.servico_pagamento_por_sector == "false") && (verifivarPagamentoTempoReal[0]?.servico_gpo == "false"))){
        logger("SERVIDOR:getPagamentosEntidadePeriodo").info("Serviço de pagamento por sector inactivo")
        const rs = response("erro", 423, "Serviço de pagamento por sector inactivo");
        return rs
      }

      logger("SERVIDOR:getPagamentosEntidadePeriodo").debug("Á carregar dados")
      const pagamentos = await database('pagamentos')
      .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
      .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
      .join("tipo_produto","tipo_produto.id_tipo_produto","=","referencias.tipo_de_registro")    
      .whereLike("montante_da_operacao",`%${montante}%`)
      .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
      .whereLike("referencia_do_servico",`%${referencia}%`)
      .whereLike("numero_Log_EGR",`%${log_transacao}%`)
      .whereLike("tipo_de_Terminal",`%${terminal}%`)
      .whereLike("nib",`%${nib}%`)
      .whereLike("hora_do_movimento",`%${hora}%`)
      .where({numero_entidade})
      .andWhere({Identificacao_Log_EGR:periodo})
      .limit(total_registros || pagination.total_limite)
      .orderBy('id_pagamento','desc')  
              
      const {registros} = paginationRecords(pagamentos, pagina, limite)

      logger("SERVIDOR:getPagamentosEntidadePeriodo").debug("Á carregar dados com limite")
      const pagamentosLimite = await database('pagamentos')
      .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
      .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
      .join("tipo_produto","tipo_produto.id_tipo_produto","=","referencias.tipo_de_registro")    
      .whereLike("montante_da_operacao",`%${montante}%`)
      .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
      .whereLike("referencia_do_servico",`%${referencia}%`)
      .whereLike("numero_Log_EGR",`%${log_transacao}%`)
      .whereLike("tipo_de_Terminal",`%${terminal}%`)
      .whereLike("nib",`%${nib}%`)
      .whereLike("hora_do_movimento",`%${hora}%`)
      .where({numero_entidade})
      .andWhere({Identificacao_Log_EGR:periodo})
      .limit(registros.limite)
      .offset(registros.count)
      .orderBy('id_pagamento','desc')
      
      const filtered = pagamentosFilteres(pagamentosLimite)
      registros.total_apresentados = pagamentosLimite.length
      registros.entidade = numero_entidade
      registros.periodo = periodo
      registros.montante = montante
      registros.tarifa = tarifa
      registros.referencia = referencia
      registros.log_transacao = log_transacao
      registros.terminal = terminal
      registros.nib = nib
      registros.hora = hora

      logger("SERVIDOR:getPagamentosEntidadePeriodo").info("Respondendo a requisição")
      const rs = response("sucesso", 200, filtered, "json",
      {
        registros
      });
          
      return rs 
   
  } catch (error) {
      console.error(error.message)
      logger("SERVIDOR:getPagamentosEntidadePeriodo").error("Erro a buscar os dados "+error.message)
      const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
      return rs
 }
 
}

module.exports.getPagamentosEntidadeDias = async function(numero_entidade, dia_inicio, dia_final, pagina, limite, total_registros, montante, tarifa, referencia,  periodo, log_transacao, terminal, nib, hora) {
     
     try{

        logger("SERVIDOR:getPagamentosEntidadeDias").debug("Á carregar dados da configuração")
        const verifivarPagamentoTempoReal = await database('configuracoes').where({cliente_entidade: numero_entidade})        

        if(((verifivarPagamentoTempoReal[0]?.servico_pagamento_por_sector == "false") && (verifivarPagamentoTempoReal[0]?.servico_gpo == "false"))){
          logger("SERVIDOR:getPagamentosEntidadeDias").info("Serviço de pagamento por sector inactivo")
          const rs = response("erro", 423, "Serviço de pagamento por sector inactivo");
          return rs
        }

        logger("SERVIDOR:getPagamentosEntidadeDias").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereBetween("data_movimento",[dia_inicio, dia_final])
        .andWhere({numero_entidade})
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')          
        
        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentosEntidadeDias").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereBetween("data_do_processamento",[dia_inicio, dia_final])
        .andWhere({numero_entidade})
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc')

        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.entidade = numero_entidade
        registros.dia_inicio = dia_inicio
        registros.dia_final = dia_final
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora = hora
  
        logger("SERVIDOR:getPagamentosEntidadeDias").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
        
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosEntidadeDias").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}

module.exports.getPagamentosDias = async function(dia_inicio, dia_final, pagina, limite, total_registros, entidade, montante, tarifa, referencia,  periodo, log_transacao, terminal, nib, hora) {
     
     try{
      
        logger("SERVIDOR:getPagamentosEntidadeDias").debug("Á carregar dados")
        const pagamentos = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .whereBetween("data_movimento",[dia_inicio, dia_final])
        .limit(total_registros || pagination.total_limite)
        .orderBy('id_pagamento','desc')          
        
        const {registros} = paginationRecords(pagamentos, pagina, limite)

        logger("SERVIDOR:getPagamentosEntidadeDias").debug("Á carregar dados com limite")
        const pagamentosLimite = await database('pagamentos')
        .join("referencias","referencias.num_referencia","=","pagamentos.referencia_do_servico")
        .join("produtos_clientes","produtos_clientes.id_produto","=","referencias.indicador_produto_id")
        .whereLike("montante_da_operacao",`%${montante}%`)
        .whereLike("tarifa_aplicada_a_operacao",`%${tarifa}%`)
        .whereLike("referencia_do_servico",`%${referencia}%`)
        .whereLike("Identificacao_Log_EGR",`%${periodo}%`)
        .whereLike("numero_Log_EGR",`%${log_transacao}%`)
        .whereLike("tipo_de_Terminal",`%${terminal}%`)
        .whereLike("nib",`%${nib}%`)
        .whereLike("hora_do_movimento",`%${hora}%`)
        .whereLike("numero_entidade",`%${entidade}%`)
        .whereBetween("data_do_processamento",[dia_inicio, dia_final])
        .limit(registros.limite)
        .offset(registros.count)
        .orderBy('id_pagamento','desc')

        const filtered = pagamentosFilteres(pagamentosLimite)
        registros.total_apresentados = pagamentosLimite.length
        registros.dia_inicio = dia_inicio
        registros.dia_final = dia_final
        registros.entidade = entidade
        registros.periodo = periodo
        registros.montante = montante
        registros.tarifa = tarifa
        registros.referencia = referencia
        registros.log_transacao = log_transacao
        registros.terminal = terminal
        registros.nib = nib
        registros.hora = hora

        logger("SERVIDOR:getPagamentosEntidadeDias").info("Respondendo a requisição")
        const rs = response("sucesso", 200, filtered, "json",
        {
          registros
        });
            
        return rs
        
      
     } catch (error) {
        console.error(error.message)
        logger("SERVIDOR:getPagamentosEntidadeReferencia").error("Erro a buscar os dados "+error.message)
        const rs = response("erro", 400, 'Algo aconteceu. Tente de novo');
        return rs
    }
    
}
