<?php

class Seguro_Model_PropostasDevolucoes extends Agro_Db_Table_Abstract {
	protected $_schema = 'seguro';
	protected $_name = 'propostas_devolucoes';
	protected $_primary = 'id';
	public $_order = ['pp.ds_nome_proponente', 'pr.id_proposta_mae desc', 'nr_endosso'];

    public $_columnExcel = array(
		'id_proposta_mae' => 'Doc.',
		'nr_apolice' => 'Apólice',
		'nr_endosso' => 'Endosso',
		'cd_status_proposta' => 'Status',
        'ds_nome_proponente' => 'Segurado',
        'ds_nome_usuario' => 'Digitador',
        'status_devolucao' => 'Status da Devolução',
        'vl_previsto' => 'Valor Previsto (R$)',
        'dt_programada' => 'Data Programada'
	);
    
    public function save(array $dados) :? int 
    {
        $Row = $this->getRow($dados['id']);

        $Row->id_proposta = $dados['id_proposta'];
        $Row->id_informacao_bancaria = $dados['id_informacao_bancaria'];
        $Row->id_proponente = $dados['id_proponente'];
        $Row->id_beneficiario = $dados['id_beneficiario'];
        $Row->id_forma_pagamento = $dados['id_forma_pagamento'];
        $Row->dt_programada = $dados['dt_programada'];
        $Row->fl_conta_conjunta = ($dados['fl_conta_conjunta'] === true) ? 't' : 'f';
       
        return $Row->save();
    }

    public function getData($where = [])
    {
        $whereFixo = "
            (
                seguro.nr_endosso(pr.id, pr.id_endosso) = 0
                AND pr.id_status = ". Seguro_Model_Propostas::ID_STATUS_PROPOSTA_CANCELADA . "
                AND EXISTS(SELECT DISTINCT 1 FROM seguro.v_propostas_boletos vpb WHERE vpb.id_proposta = pr.id AND (vpb.fl_pago ilike 'Sim' OR vpb.fl_liberar_devolucao IS true))
            )
            OR
            (
                seguro.nr_endosso(pr.id, pr.id_endosso) > 0
                AND pr.id_status IN(". Seguro_Model_Propostas::ID_STATUS_APOLICE_EMITIDA .", ". Seguro_Model_Propostas::ID_STATUS_ENDOSSO_CANCELADO .", ". Seguro_Model_Propostas::ID_STATUS_APOLICE_CANCELADA .")
                AND EXISTS(SELECT 1 FROM seguro.propostas_endosso_opcoes peo WHERE peo.id_proposta = pr.id AND peo.id_endosso_opcao = 2)
                AND EXISTS(SELECT DISTINCT 1 FROM seguro.propostas_parcelas spp WHERE spp.id_proposta = pr.id AND vl_segurado < 0)
            )
        ";

        $caseValorPrevisto = "CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) = 0 
        THEN ( 
            SELECT SUM(vl_segurado) FROM seguro.v_propostas_boletos pb WHERE pb.id_proposta = pd.id_proposta AND (pb.fl_pago ILIKE 'Sim' OR pb.fl_liberar_devolucao IS true)) 
        WHEN seguro.nr_endosso(pr.id, pr.id_endosso) > 0 THEN ( 
            SELECT pp.vl_segurado * -1
            FROM seguro.propostas_parcelas pp
            WHERE pp.id_proposta = pd.id_proposta
            ORDER BY pp.nr_parcela ASC   
            LIMIT 1) ELSE 0 
        END AS vl_previsto";
   
        $casePossuiAnexo = "
            CASE WHEN (EXISTS(SELECT 1 FROM seguro.propostas_devolucoes_arquivos pda WHERE pda.id_proposta_devolucao = pd.id and pda.fl_ativo is true)) 
                    THEN 1
                ELSE 0
            END AS possui_documento_anexado
        ";

        $select = $this->select()->setIntegrityCheck(false);

        // Necessário quando for gerar excel pelo filtro
        $isFuncionarioAgroLogado = (Sistema_Model_Usuarios::usuarioLogadoFuncionarioAgro()) ? 'TRUE' : 'FALSE';

		$select->from(array('pd' => 'seguro.propostas_devolucoes'), ['id', 'id_proposta', $caseValorPrevisto, 'dt_programada', $casePossuiAnexo]);
        $select->join(array('pds' => 'seguro.propostas_devolucoes_status'), 'pds.id_proposta_devolucao = pd.id AND pds.fl_ativo is true', ['id_status', 'ds_observacao', 'fl_observacao_automatica']);
        $select->join(array('spd' => 'sistema.status'), 'spd.id = pds.id_status', ['ds_status as ds_status_devolucao', 'cd_status as cd_status_devolucao', 'ds_chave as ds_chave_devolucao']);
        $select->join(array('pr' => 'seguro.propostas'), 'pr.id = pd.id_proposta', ['id_proposta_mae', 'nr_apolice', 'seguro.nr_endosso(pr.id, pr.id_endosso) as nr_endosso']);
        $select->join(array('sus' => 'sistema.usuarios'), 'sus.id = pr.id_usuario_criacao', 'ds_nome_usuario');
        $select->join(
            array('spr' => 'sistema.status'),
            'spr.id = pr.id_status',
            [
                'ds_status as ds_status_proposta',
                'cd_status as cd_status_proposta',
                "
                    CASE WHEN {$isFuncionarioAgroLogado} = TRUE
                        THEN (spr.cd_status || ' - ' || spr.ds_status)
                    ELSE (spd.cd_status || ' - ' || spd.ds_status)
                    END status_devolucao
                "
            ]
        
        );
        $select->join(array('pe' => 'seguro.propostas_endosso'), 'pe.id_proposta = pr.id', null);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pr.id', ['ds_nome_proponente', 'cpf_cnpj']);
        $select->join(array('pc' => 'seguro.propostas_corretores'), 'pc.id_proposta = pr.id', null);
        $select->join(array('prod' => 'produto.produtos'), 'prod.id = pr.id_produto', null);
        $select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = prod.id_produto_geral', null);
        $select->join(array('ss' => 'sistema.status'), 'ss.id = pr.id_status', ['ds_chave as ds_chave_proposta']);
        $select->joinLeft(array('c' => 'sistema.corretores'), 'c.id_usuario = pc.id_usuario', ['ds_nome_corretor']);
        $select->joinLeft(array('pre' => 'sistema.prepostos'), 'pre.id_usuario = pr.id_usuario_criacao', ['ds_nome_preposto']);
        $select->joinLeft(array('ib' => 'sistema.informacoes_bancarias'), 'ib.id = pd.id_informacao_bancaria', null);
        $select->joinLeft(array('prop' => 'seguro.proponentes'), 'prop.id = pd.id_proponente', null);
        $select->joinLeft(array('b' => 'seguro.beneficiarios'), 'b.id = pd.id_beneficiario', null);
        $select->where($whereFixo);

        if (!empty($where)) {
            $select->where(implode(" AND ", $where));
        }

        $select->order($this->_order);
       
        return $select;
    }

    /**
     * Retorna dados de devolução pelo id da proposta informado
     *
     * @param int $idProposta
     * @return object
     */
    public function getByProposta(int $idProposta) : object
    {
        $select = $this->select()->setIntegrityCheck(false)
            ->from(array('pd' => 'seguro.propostas_devolucoes'), '*')
            ->where('id_proposta = ?', $idProposta);
            
        return $this->fetchRow($select);
    }

    /**
     * Retorna os dados das informações bancárias pelo ID da devolução
     * 
     * @param int $id
     * @return object| null
     */
    public function getInformacaoBancaria(int $id): ?object
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pd' => 'seguro.propostas_devolucoes'), ['id_forma_pagamento', 'id_proposta', 'fl_conta_conjunta', 'id_beneficiario', 'id_proponente', 'id_informacao_bancaria']);
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pd.id_proposta', ['ds_nome_proponente', 'cpf_cnpj']);
        $select->joinLeft(array('ib' => 'sistema.informacoes_bancarias'), 'ib.id = pd.id_informacao_bancaria', '*');
        $select->where('pd.id = ?', $id);

        return $this->fetchRow($select);
    }

    /**
     * Busca os favorecidos(segurado e beneficiarios) da proposta vinculado ao ID da devolução.
     * 
     * @param int $id
     * @return array
     */
    public function getComboAFavorDe(int $id): array
    {
        $options = [];
        $possuiBeneficiarioFavorecido = false;

        $selectBeneficiarios = $this->select()->setIntegrityCheck(false);
        $selectBeneficiarios->from(array('pd' => 'seguro.propostas_devolucoes'), null);
        $selectBeneficiarios->join(array('pb' => 'seguro.propostas_beneficiarios'), 'pb.id_proposta = pd.id_proposta', ['ds_nome_beneficiarios as nome', 'nr_cpf_cnpj as cpf_cnpj', 'fl_favorecido_autorizacao_credito']);
        $selectBeneficiarios->join(array('b' => 'seguro.beneficiarios'), 'b.cpf_cnpj = pb.nr_cpf_cnpj', ['id']);
        $selectBeneficiarios->where('pd.id = ?', $id);
        $rsBeneficiarios = $this->fetchAll($selectBeneficiarios);

        foreach ($rsBeneficiarios as $beneficiario) {

            if ($beneficiario['fl_favorecido_autorizacao_credito']) {
                $possuiBeneficiarioFavorecido = true;
            }

            $options[] = (object) [
                'nome' => strtoupper($beneficiario['nome']),
                'cpf_cnpj' => $beneficiario['cpf_cnpj'],
                'id' => $beneficiario['id'],
                'tp_favorecido' => 'B',
                'fl_favorecido_autorizacao_credito' => $beneficiario['fl_favorecido_autorizacao_credito']
            ];
        }

        $selectProponente = $this->select()->setIntegrityCheck(false);
        $selectProponente->from(array('pd' => 'seguro.propostas_devolucoes'), null);
        $selectProponente->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pd.id_proposta', ['ds_nome_proponente as nome', 'cpf_cnpj']);
        $selectProponente->join(array('p' => 'seguro.proponentes'), 'p.cpf_cnpj = pp.cpf_cnpj', ['id']);
        $selectProponente->where('pd.id = ?', $id);
        $rsProponente = $this->fetchRow($selectProponente);
        $options[] = (object) [
            'nome' => $rsProponente['nome'],
            'cpf_cnpj' => $rsProponente['cpf_cnpj'],
            'id' => $rsProponente['id'],
            'tp_favorecido' => 'P',
            'fl_favorecido_autorizacao_credito' => (!$possuiBeneficiarioFavorecido) ? true : false
        ];

        return $options;
    }

    /**
     * Retorna os dados para preenchimento do termo de pagamento do beneficiário pelo id da devolução informado.
     * 
     * @param int $id
     * @return object
     */
    public function getDadosTermoBeneficiario(int $id):? object
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pd' => 'seguro.propostas_devolucoes'), ['id as id_proposta_devolucao', 'fl_conta_conjunta']);
        $select->join(
            array('pr' => 'seguro.propostas'),
            'pr.id = pd.id_proposta',
            [
                "regexp_replace(seguro.id_proposta_mae_completo(pr.id), '[-.]', '', 'g') || ' (' || pr.id || ')' as id_proposta",
                "seguro.id_proposta_mae_completo(pr.id) as id_proposta_completo",
                "nr_apolice"
            ]
        );
        $select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pr.id', ['ds_nome_proponente as nome_proponente']);
        $select->join(array('b' => 'seguro.beneficiarios'), 'b.id = pd.id_beneficiario', ['ds_nome_beneficiario as nome_beneficiario', 'cpf_cnpj as cpf_cnpj_beneficiario']);
        $select->join(array('ib' => 'sistema.informacoes_bancarias'), 'ib.id = pd.id_informacao_bancaria', ['ds_agencia', 'nu_digito_agencia', 'ds_conta', 'nu_digito_conta', 'ds_tipo_conta']);
        $select->join(array('bancos' => 'sistema.bancos'), 'bancos.id = ib.id_banco', ['ds_nome_banco', 'nr_banco']);
        $select->where('pd.id = ?', $id);

        return $this->fetchRow($select);
    }

    public function getDevolucoesByIdsProposta(string $idsProposta)
    {
        $query = $this
            ->select()
            ->setIntegrityCheck(false)
            ->from(['pd' => 'seguro.propostas_devolucoes'])
            ->where("pd.id_proposta IN ({$idsProposta})");
        
        return $this->fetchAll($query);
    }

    /**
     * Método utulizado na transmissão de endosso e no cancelamento da proposta.
     * Preenche as tabelas de devoluções de acordo com as informações da proposta informada por parâmetro.
     * 
     * @param int $idProposta
     * @return int
     */
    public function primeiraInclusao(int $idProposta): int
    {
        $modelStatus                    = new Sistema_Model_Status();
        $modelPropostasDevolucoesStatus = new Seguro_Model_PropostasDevolucoesStatus();

        $dados                          = [];
        $dados['id_proposta']           = $idProposta;

        $dadosPrimeiraInclusao = $this->getDadosPrimeiraInclusao($idProposta);

        if (!empty($dadosPrimeiraInclusao['id_informacao_bancaria']) && empty($dadosPrimeiraInclusao['id_informacao_bancaria_beneficiario'])) {
            $dadosInformacoesBancarias                      = [];
            $dadosInformacoesBancarias['id_banco']          = $dadosPrimeiraInclusao['id_banco'];
            $dadosInformacoesBancarias['ds_agencia']        = $dadosPrimeiraInclusao['ds_agencia'];
            $dadosInformacoesBancarias['ds_conta']          = $dadosPrimeiraInclusao['ds_conta'];
            $dadosInformacoesBancarias['ds_tipo_conta']     = $dadosPrimeiraInclusao['ds_tipo_conta'];
            $dadosInformacoesBancarias['nu_digito_agencia'] = $dadosPrimeiraInclusao['nu_digito_agencia'];
            $dadosInformacoesBancarias['nu_digito_conta']   = $dadosPrimeiraInclusao['nu_digito_conta'];

            $modelInformacoesBancarias                      = new Sistema_Model_InformacoesBancarias();
            $rowInformacoesBancarias                        = $modelInformacoesBancarias->save($dadosInformacoesBancarias);

            if (!$rowInformacoesBancarias) {
                throw new Exception("Erro ao incluir as informações bancárias da devolução da proposta {$idProposta}.");
            }
            
            $dados['id_informacao_bancaria'] = $rowInformacoesBancarias->id;

            $idFormaPagamento = Sistema_Model_FormasPagamento::ID_STATUS_DOC_TED;

            if ($dadosPrimeiraInclusao['ds_tipo_conta'] == 'O') {
                $idFormaPagamento = Sistema_Model_FormasPagamento::ID_STATUS_ORDEM_PAGAMENTO;
            }
            
            $dados['id_forma_pagamento'] = $idFormaPagamento;
        }elseif(!empty($dadosPrimeiraInclusao['id_informacao_bancaria_beneficiario'])){
            //buscar dados do beneficiario com a id da informação bancaria
            $InformacoesBancarias = (new Sistema_Model_InformacoesBancarias())->getInformacoesBancariasById($dadosPrimeiraInclusao['id_informacao_bancaria_beneficiario'], 'B');
            $dadosInformacoesBancarias                      = [];
            $dadosInformacoesBancarias['id_banco']          = $InformacoesBancarias['id_banco'];
            $dadosInformacoesBancarias['ds_agencia']        = $InformacoesBancarias['ds_agencia'];
            $dadosInformacoesBancarias['ds_conta']          = $InformacoesBancarias['ds_conta'];
            $dadosInformacoesBancarias['ds_tipo_conta']     = $InformacoesBancarias['ds_tipo_conta'];
            $dadosInformacoesBancarias['nu_digito_agencia'] = $InformacoesBancarias['digito_agencia'];
            $dadosInformacoesBancarias['nu_digito_conta']   = $InformacoesBancarias['digito_conta'];
            
            $modelInformacoesBancarias                      = new Sistema_Model_InformacoesBancarias();
            $rowInformacoesBancarias                        = $modelInformacoesBancarias->save($dadosInformacoesBancarias);

            
            if (!$rowInformacoesBancarias) {
                throw new Exception("Erro ao incluir as informações bancárias da devolução da proposta {$idProposta}.");
            }

            $dados['id_informacao_bancaria'] = $rowInformacoesBancarias->id;

            $idFormaPagamento = Sistema_Model_FormasPagamento::ID_STATUS_DOC_TED;

            if ($dadosPrimeiraInclusao['ds_tipo_conta'] == 'O') {
                $idFormaPagamento = Sistema_Model_FormasPagamento::ID_STATUS_ORDEM_PAGAMENTO;
            }
            $dados['id_forma_pagamento'] = $idFormaPagamento;

        }

        if (
            $dadosPrimeiraInclusao['id_status'] == Sistema_Model_Status::ID_PROPOSTA_CANCELADA
            && $dadosPrimeiraInclusao['id_motivo_cancelamento'] == Atendimento_Model_TipoCancelamento::MOTIVO_CANCELADA_A_PEDIDO_CORRETOR_SEGURADO
        ) {
            $nrEndosso = Agro_Db_Table_Row_Proposta::busca_nr_endosso($idProposta, (int) $dadosPrimeiraInclusao['id_endosso']);

            if ($nrEndosso == 0) {
                $dados['id_proponente'] = $dadosPrimeiraInclusao['id_proponente'];
                $dados['id_beneficiario'] = null;
            }
        } else {
            $dados['id_proponente'] = (empty($dadosPrimeiraInclusao['id_beneficiario'])) ? $dadosPrimeiraInclusao['id_proponente'] : null;
            $dados['id_beneficiario'] = $dadosPrimeiraInclusao['id_beneficiario'];
        }

        $dados['fl_conta_conjunta'] = ($dadosPrimeiraInclusao['fl_conta_conjunta'] == 't') ? true : false;

        $idPropostasDevolucoes = $this->save($dados);

        if (!$idPropostasDevolucoes) {
            throw new Exception("Erro ao incluir a devolução da proposta {$idProposta}.");
        }
        
        $dadosPropostasDevolucoesStatus = [];
        $dadosPropostasDevolucoesStatus['id_proposta_devolucao'] = $idPropostasDevolucoes;
        $dadosPropostasDevolucoesStatus['fl_observacao_automatica'] = 1;
        
        if (!empty($dados['id_beneficiario'])) {
            
            $dadosPropostasDevolucoesStatus['id_status'] = $modelStatus->getId('AGUARDANDO_TERMO', 'DEVOLUCAO_PREMIO');
        } else if ($dados['id_informacao_bancaria']) {
            $dadosPropostasDevolucoesStatus['id_status'] = $modelStatus->getId('EM_PROCESSAMENTO_DADOS_BANCARIOS', 'DEVOLUCAO_PREMIO');
        } else {
            $dadosPropostasDevolucoesStatus['id_status'] = $modelStatus->getId('EM_FILA_AGENDAMENTO', 'DEVOLUCAO_PREMIO');
        }

        $rowPropostasDevolucoesStatus = $modelPropostasDevolucoesStatus->save($dadosPropostasDevolucoesStatus);
  
        if (!$rowPropostasDevolucoesStatus) {
            throw new Exception("Erro ao incluir o status inicial da devolução da proposta {$idProposta}.");
        }

        return $idPropostasDevolucoes;
    }

    /**
     * Busca as informações bancárias da proposta mãe, o valor previsto, o id do proponente e o id do beneficiário favorecido caso haja.
     * 
     * @param int $idProposta
     * @return object
     */
    public function getDadosPrimeiraInclusao(int $idProposta): object
    {
        $proposta = (new Seguro_Model_Propostas())->get($idProposta);
        $beneficiarios = $proposta->beneficiarios();
        
        foreach($beneficiarios as $beneficiario){
            $id_beneficiario = $beneficiario['id_beneficiario'];
        }
        $vlPrevisto = "
            CASE WHEN seguro.nr_endosso(pr.id, pr.id_endosso) = 0 
                    THEN (SELECT sum(vl_segurado) FROM seguro.propostas_parcelas pp WHERE pp.id_proposta = pr.id AND (fl_pago IS true OR fl_liberar_devolucao IS true))
                ELSE
                    (SELECT sum(vl_segurado) * -1 FROM seguro.propostas_parcelas pp WHERE pp.id_proposta = pr.id)
            END as vl_previsto 
        ";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['pr' => 'seguro.propostas'], ['id as id_proposta', $vlPrevisto, 'id_status', 'id_endosso']);
        $select->join(['pp' => 'seguro.propostas_proponentes'], "pp.id_proposta = pr.id", null);
        $select->join(['p' => 'seguro.proponentes'], "p.cpf_cnpj = pp.cpf_cnpj", ['id as id_proponente']);
        $select->joinLeft(['spc' => 'seguro.propostas_cancelamento'], 'spc.id_proposta = pr.id', 'id_motivo_cancelamento');
        $select->joinLeft(['ibp' => 'seguro.informacoes_bancarias_propostas'], "ibp.id_proposta = pr.id_proposta_mae", ['fl_conta_conjunta']);
        $select->joinLeft(['ib' => 'sistema.informacoes_bancarias'], "ib.id = ibp.id_informacoes_bancarias", ['id as id_informacao_bancaria', 'id_banco', 'ds_agencia', 'ds_conta', 'ds_tipo_conta', 'nu_digito_agencia', 'nu_digito_conta']);
        $select->joinLeft(['pb' => 'seguro.propostas_beneficiarios'], 'pb.id_proposta = pr.id AND pb.fl_favorecido_autorizacao_credito is true', 'id as id_proposta_beneficiario');
        $select->joinLeft(['b' => 'seguro.beneficiarios'], 'b.cpf_cnpj = pb.nr_cpf_cnpj', 'id as id_beneficiario');
        $select->joinLeft(['ibb'=> 'seguro.informacoes_bancarias_beneficiarios'], 'ibb.id_beneficiario = b.id', 'id_informacoes_bancarias as id_informacao_bancaria_beneficiario');
        $select->where('pr.id = ?', $idProposta);
        return $this->fetchRow($select);
    }

    public function getInformacoesBancariasByIdBeneficiario(int $id_beneficiario, $tipo)
    {
      
        if($tipo == 'B'){
            $rowInformacoesBancariasBeneficiario = (new Seguro_Model_InformacoesBancariasBeneficiarios())->fetchAll(["id_beneficiario = {$id_beneficiario}"])->current()->toArray();
            
            $id_informacoes_bancarias = $rowInformacoesBancariasBeneficiario['id_informacoes_bancarias'];
            $modelInformacoesBancarias = new Sistema_Model_InformacoesBancarias();

            $rs = $modelInformacoesBancarias->getInformacoesBancariasById($id_informacoes_bancarias);
        }else{ //tipo P
       
            $informacoesBancariasProponentes = (new Seguro_Model_InformacoesBancariasPropostas())
            ->getInformacoesBancariasProponentesByProposta($this->view->proposta->id);
        
        }

        if (empty($rowBeneficiario)) {
            return null;
        }

        $informacoesBancarias = (new Sistema_Model_InformacoesBancarias())->find($rowBeneficiario['id_informacoes_bancarias'])->current()->toArray();
        $informacoesBancarias['id_informacoes_bancarias_beneficiarios'] = $rowBeneficiario['id'];
        $informacoesBancarias['id_forma_pagamento'] = $rowBeneficiario['id_forma_pagamento'];

        return $informacoesBancarias;
    }

    public function getStatusVigenteDevolucao(int $idDevolucao)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->where("id_proposta_devolucao = ?", $idDevolucao);
        $select->where("pds.fl_ativo = ?", "true");
		$select->from(array('pds' => 'seguro.propostas_devolucoes_status'), ['id', 'id_status','fl_ativo', 'id_proposta_devolucao']);
        $select->join(['st' => 'sistema.status'], 'pds.id_status = st.id', 'ds_chave');
        return $this->fetchRow($select);
    }

    public function getInfoEmailByIds(array $idsPropostasDevolucoes)
    {
        $select = $this->select()
            ->setIntegrityCheck(false)
            ->from(
                ['sp' => 'seguro.propostas'],
                [
                    'id as id_proposta', 'seguro.nr_endosso(sp.id, sp.id_endosso) as nr_endosso', 'id_usuario_criacao as id_usuario_criacao_proposta',
                    'cast(ppg.id_ramo as varchar) || \'.\' ||
					cast(pp.id_seguradora as varchar) || \'.\' ||
					cast(sp.id_produto as varchar) || \'.\' ||
					cast(sp.id_proposta_mae as varchar) || \'-\' ||
					cast(sp.nr_digito_verificador as varchar)
					as nr_proposta',
                ]
            )
            ->join(['spc' => 'seguro.propostas_corretores'], 'spc.id_proposta = sp.id', false)
            ->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false)
            ->join(['ppg' => 'produto.produtos_geral'], 'ppg.id = pp.id_produto_geral', false)
            ->join(['sc' => 'sistema.corretores'], 'sc.id_usuario = spc.id_usuario', 'ds_email as ds_email_corretor')
            ->join(['spd' => 'seguro.propostas_devolucoes'], 'spd.id_proposta = sp.id', false)
            ->join(['spds' => 'seguro.propostas_devolucoes_status'], 'spds.id_proposta_devolucao = spd.id', 'ds_observacao')
            ->where('spd.id IN(?)', $idsPropostasDevolucoes)
            ->where('spds.fl_ativo IS TRUE');
        
        return $this->fetchAll($select);
    }
}
