<?php

class Sinistro2_Model_Processos extends Agro_Db_Table_Abstract {
    const ID_STATUS_ABERTO_REGULACAO = 31;
    const ID_STATUS_ABERTO_LIQUIDACAO = 32;
    const ID_STATUS_ABERTO_SEM_EMPRESA = 200;

	protected $_rowClass = 'Sinistro2_Model_Row_Processo';
	protected $_schema = 'sinistro';
	protected $_name = 'processos';
	protected $_view = 'v_processo_sinistro';
	protected $_primary = 'id';
	public $_order = array('dt_alteracao_processo desc', 'dt_criacao_processo desc');


	public function getData($where=false) {
		$select = $this->select();

		$User = Zend_Auth::getInstance()->getIdentity();

		if($User->tp_usuario == "V" || $User->tp_usuario == "M"){
			$this->_view = "v_processo_sinistro_vistoriador";
		}

		if ($this->_view) {
			$select->setIntegrityCheck(false);
			$select->from("{$this->_schema}.{$this->_view}");
		}

		if ($this->_order) {
			$select->order($this->_order);
		}

		$this->getWhere($select, $where);

		return $select;
	}

	public function abreProcessoSemEmpresa(array $data){
		try {
			$Row = $this->getRow($data['id']);

			$Row->id_proposta = $data['id_proposta'];
			$Row->id_status   = $data['id_status'];

			return $Row->save();

		} catch (Exception $e) {
			return false;
		}

	}

	public function getCoberturasProcessoByProposta($idProposta) {
		$data = array();
		if ($idProposta) {
			$select = "
				select
					c.id,
					c.ds_nome_cobertura,
					pdc.fl_vistoria_preliminar,
					pdc.fl_vistoria_final,
					pdc.fl_exibir_regulacao_perdas,
					pdc.id_tipo_liquidacao,
					tl.fl_liquidacao_avulsa,
					tl.fl_liquidacao_manual,
					pe.id_empresa as id_empresa_processo,
					av.fl_dispensa_preliminar

				from
					/*tabela que tem o id_proposta*/
					sinistro.avisos as av inner join

					/*busca a empresa do processo*/
					sinistro.processos as pro on pro.id_proposta = av.id_proposta inner join
					sinistro.processos_empresas as pe on pe.id_processo = pro.id and pe.fl_ativo = true inner join

					/*busca as coberturas da proposta*/
					seguro.propostas_coberturas as pc on pc.id_proposta = av.id_proposta inner join
					produto.coberturas as c on c.id = pc.id_cobertura left join

					/*filtra pelos eventos das coberturas*/
					sinistro.avisos_eventos as ae on ae.id_aviso = av.id left join
					produto.coberturas_eventos as ce on ce.id_evento = ae.id_evento and ce.id_cobertura = c.id inner join

					/*filtra por produto*/
					seguro.propostas pr on pr.id = av.id_proposta inner join
					seguro.propostas_endosso pre on pre.id_proposta = pr.id and pre.fl_proposta_vigente = true inner join
					produto.produtos pd on pd.id = pr.id_produto inner join
					produto.produtos_coberturas pdc on pdc.id_cobertura = c.id and pdc.id_produto = pr.id_produto left outer join
					sinistro.tipo_liquidacao tl on tl.id = pdc.id_tipo_liquidacao

				where
					pre.id_endosso in (select id_endosso from seguro.propostas where id in ($idProposta)) and
					pdc.fl_cobertura_dependente = false and
					c.fl_ativo = true
				group by
					c.id,
					c.ds_nome_cobertura,
					pdc.fl_vistoria_preliminar,
					pdc.fl_vistoria_final,
					pdc.fl_exibir_regulacao_perdas,
					pdc.id_tipo_liquidacao,
					tl.fl_liquidacao_avulsa,
					tl.fl_liquidacao_manual,
					pe.id_empresa,
					av.fl_dispensa_preliminar
				order by
					c.id
			";

			$data = $this->_db->fetchAll($select);
		}
		return $data;
	}

	public function getDadosVistoriasPreliminares($idProposta, $idEmpresa = null) {

		$User = Zend_Auth::getInstance()->getIdentity();

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pc'=>'sinistro.processos'), null);
		$select->join(array('vpc'=>'sinistro.vistorias_processos'), 'vpc.id_processo = pc.id', 'id_vistoria');
		$select->join(array('vc'=>'sistema.vistorias_coberturas'), 'vc.id_vistoria = vpc.id_vistoria', 'id_cobertura');
		$select->join(array('co'=>'produto.coberturas'), 'co.id = vc.id_cobertura', 'ds_nome_cobertura');
		$select->join(array('v'=>'sistema.vistorias'), 'v.id = vpc.id_vistoria', "to_char(v.dt_inicio, 'DD/MM/YYYY') as dt_inicio_vistoria");
		$select->join(array('vag'=>'sistema.vistorias_agendamentos'), 'vag.id_vistoria = vpc.id_vistoria', null);
		$select->join(array('ag'=>'sistema.agendamentos'), 'ag.id = vag.id_agendamento', array(
			"to_char(ag.dt_agendamento, 'DD/MM/YYYY') as dt_agendamento",
			new Zend_Db_Expr("
	            case
	                when ag.ds_turno = 'M' then 'Manhã'
	                when ag.ds_turno = 'T' then 'Tarde'
	                when ag.ds_turno = 'N' then 'Noite'
	            end as ds_turno_agendamento
			"),
            "ag.id as id_agendamento"
		));
		$select->join(array('tv'=>'sistema.tipos_vistoria'), "tv.id = v.id_tipo and tv.ds_chave_tipos_vistoria = 'PRELIMINAR'", null);
		$select->join(array('vlp'=>'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = vpc.id_vistoria', 'id_laudo_preliminar');
		$select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', array('lp.id_status', 'ds_nome_laudo_fisico', 'fl_evento_nao_constatado'));
		$select->join(array('ve'=>'sistema.vistorias_empresas'), 've.id_vistoria = vpc.id_vistoria', null);
		$select->join(array('e'=>'sistema.empresas'), 'e.id = ve.id_empresa', 'e.ds_nome_fantasia');
		$select->join(array('s'=>'sistema.status'), 's.id = lp.id_status', 's.ds_chave as ds_chave_status');
		$select->where('pc.id_proposta = ?', $idProposta);

		if($User->tp_usuario <> 'F'){
			$select->where('e.id = ?', $User->id_empresa);
		}

		$select->order('v.dt_inicio');

		return $this->getAdapter()->fetchAll($select);
	}

	public function getDadosVistoriasFinais($idProposta, $idCobertura, $idEmpresa = null) {

		$User = Zend_Auth::getInstance()->getIdentity();

		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pc'=>'sinistro.processos'), null);
		$select->join(array('vpc'=>'sinistro.vistorias_processos'), 'vpc.id_processo = pc.id', 'id_vistoria');
		$select->join(array('vc'=>'sistema.vistorias_coberturas'), 'vc.id_vistoria = vpc.id_vistoria', 'id_cobertura');
		$select->join(array('co'=>'produto.coberturas'), 'co.id = vc.id_cobertura', 'ds_nome_cobertura');
		$select->join(array('v'=>'sistema.vistorias'), 'v.id = vpc.id_vistoria', array("fl_vistoria_valida", "id_vistoria_reavaliada", "to_char(v.dt_inicio, 'DD/MM/YYYY') as dt_inicio_vistoria"));
		$select->join(array('vag'=>'sistema.vistorias_agendamentos'), 'vag.id_vistoria = vpc.id_vistoria', null);
		$select->join(array('ag'=>'sistema.agendamentos'), 'ag.id = vag.id_agendamento', array(
			"to_char(ag.dt_agendamento, 'DD/MM/YYYY') as dt_agendamento",
			new Zend_Db_Expr("
	            case
	                when ag.ds_turno = 'M' then 'Manhã'
	                when ag.ds_turno = 'T' then 'Tarde'
	                when ag.ds_turno = 'N' then 'Noite'
	            end as ds_turno_agendamento
			"),
            "ag.id as id_agendamento"
		));
		$select->join(array('tv'=>'sistema.tipos_vistoria'), "tv.id = v.id_tipo and tv.ds_chave_tipos_vistoria = 'FINAL'", null);
		$select->join(array('vlf'=>'sistema.vistorias_laudos_finais'), 'vlf.id_vistoria = vpc.id_vistoria', 'id_laudo_final');
		$select->join(array('lf'=>'sinistro.laudos_finais'), 'lf.id = vlf.id_laudo_final', array('lf.id_status', 'lf.ds_nome_laudo_fisico', 'lf.dt_vistoria'));
		$select->join(array('ve'=>'sistema.vistorias_empresas'), 've.id_vistoria = vpc.id_vistoria', null);
		$select->join(array('e'=>'sistema.empresas'), 'e.id = ve.id_empresa', array('e.ds_nome_fantasia','e.id as id_empresa'));
		$select->join(array('s'=>'sistema.status'), 's.id = lf.id_status', 's.ds_chave as ds_chave_status');
		$select->where('pc.id_proposta = ?', $idProposta);

		if($User->tp_usuario <> 'F'){
			$select->where('e.id = ?', $User->id_empresa);
		}

		$select->order('v.dt_inicio');

		return $this->getAdapter()->fetchAll($select);

    }

    public function getEmpresaVistoriadora($idProcesso) {
    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('pe'=>'sinistro.processos_empresas'), false);
    	$select->join(array('e'=>'sistema.empresas'),'e.id = pe.id_empresa', array('id','ds_nome_fantasia'));
    	$select->where('pe.id_processo = ?', $idProcesso);
    	$select->where('pe.fl_ativo = ?', true);

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

    public function getEmpresaProcesso($idProposta, array $status = []){
    	$select = $this->select()->setIntegrityCheck(false);

    	$select->from(array('p'=>'sinistro.processos'), false);
    	$select->join(array('pe'=>'sinistro.processos_empresas'), 'pe.id_processo = p.id', false);
    	$select->join(array('e'=>'sistema.empresas'),'e.id = pe.id_empresa', array('id','ds_nome_fantasia'));
    	$select->join(array('pre'=>'seguro.propostas_endosso'),'p.id_proposta = pre.id_proposta', false);
    	$select->join(array('pr'=>'seguro.propostas'),'pr.id_endosso = pre.id_endosso', ['id_proposta_mae']);
    	$select->where('pr.id = ?', $idProposta);
    	$select->where('e.fl_ativo = ?', true);
    	$select->where('pe.fl_ativo = ?', true);

    	if (!empty($status)) {
    	    $select->where("p.id_status in(" . implode(', ', $status) . ")");
        }

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

    public function getProponenteProcesso($idProcesso){
    	$select = $this->select()->setIntegrityCheck(false);

    	$select->from(array('p'=>'sinistro.processos'), false);
    	$select->join(array('pr'=>'seguro.propostas'), 'pr.id = p.id_proposta', false);
    	$select->join(array('pp'=>'seguro.propostas_proponentes'),'pp.id_proposta = pr.id', array('cpf_cnpj'));
    	$select->where('p.id = ?', $idProcesso);

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

    public function getAvisosProcesso($idProposta) {
        $select = $this->select()->setIntegrityCheck(false);

        $select->from(array('a'=>'sinistro.avisos'), array('id as id_aviso',"to_char(a.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro","to_char(a.dt_aceitacao, 'DD/MM/YYYY') as dt_aceitacao"));
        $select->join(array('st' => 'sistema.status'), "st.id = a.id_status and (st.ds_chave = 'ACEITO' or st.ds_chave = 'FECHADO')",false);
        $select->where('a.id_proposta = ?', $idProposta);
        $select->where('a.fl_ativo = ?', true);
        $select->order('a.dt_criacao desc');

        return $this->_db->fetchAll($select);
    }

    public function getAvisosResumo($idProposta) {
    	$select = $this->select()->setIntegrityCheck(false);

    	$select->from(array('a'=>'sinistro.avisos'), array('id as id_aviso', "to_char(a.dt_criacao, 'DD/MM/YYYY') as dt_envio", "to_char(a.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro", "to_char(a.dt_aceitacao, 'DD/MM/YYYY') as dt_aceitacao"));
    	$select->join(array('st' => 'sistema.status'), "st.id = a.id_status", 'ds_chave');
    	$select->join(array('u' => 'sistema.usuarios'), "u.id = a.id_usuario_criacao", 'ds_nome_usuario');
    	$select->where('a.id_proposta = ?', $idProposta);
    	$select->where('a.fl_ativo = ?', true);
    	$select->order('a.dt_criacao desc');

    	return $this->_db->fetchAll($select);
    }

    public function getIdProcessoSeguradora($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p'=>'sinistro.processos'), 'id_processo_seguradora');
        $select->where('p.id = ?', $idProcesso);

        return $this->_db->fetchOne($select);
    }

	public function getIdProcessoByProposta($idProposta){
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('a'=>'sinistro.processos'), 'id');
        $select->where('a.id_proposta = ?', $idProposta);
        
        return $this->_db->fetchOne($select);
	}

    public function getProcessoByAviso($idAviso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('sp'=>'sinistro.processos'), array('id as id_processo'));
		$select->join(array('pr' => 'seguro.propostas'), "pr.id = sp.id_proposta", false);
        $select->join(array('av' => 'sinistro.avisos'), "av.id_proposta = pr.id", false);
        $select->where('av.id = ?', $idAviso);

        return $this->_db->fetchOne($select);
    }

    public function getChaveStatus($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('sp'=>'sinistro.processos'), null);
        $select->join(array('st' => 'sistema.status'), "st.id = sp.id_status", 'st.ds_chave');
        $select->where('sp.id = ?', $idProcesso);

        return $this->_db->fetchOne($select);
    }

    public function getSafraProcesso($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('sp'=>'sinistro.processos'), null);
        $select->join(array('pr' => 'seguro.propostas'), "pr.id = sp.id_proposta", null);
        $select->join(array('pd' => 'produto.produtos'), "pd.id = pr.id_produto", "id_safra");
        $select->where('sp.id = ?', $idProcesso);

        return $this->_db->fetchOne($select);
    }

    public function getDataRevisaoArquivos($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('sp'=>'sinistro.processos'), 'dt_revisao_arquivos');
        $select->where('sp.id = ?', $idProcesso);

        return $this->_db->fetchOne($select);
    }

    public function getAvisosByProcesso($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);

        $select->from(array('a'=>'sinistro.avisos'), 'count(p.id) as total');
        $select->join(array('st' => 'sistema.status'), "st.id = a.id_status and (st.ds_chave = 'ACEITO')",false);
        $select->join(array('p' => 'sinistro.processos'), 'p.id_proposta = a.id_proposta', false);
        $select->where('p.id = ?', $idProcesso);
        $select->where('a.fl_ativo = ?', true);

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

    public function getPropostaByProcesso($idProcesso, $fl_ativo = true) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'sinistro.processos'), 'id_proposta');
        $select->where('p.id = ?', $idProcesso);
		$select->where('p.fl_ativo = ?', !$fl_ativo ? 'f' : 't');

        $Row = $this->_db->fetchRow($select);
        return $Row['id_proposta'];
    }

    public function getPropostaMaeByProcesso($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'sinistro.processos'), false);
        $select->join(array('pr'=>'seguro.propostas'), 'pr.id = p.id_proposta', 'pr.id_proposta_mae');
        $select->where('p.id = ?', $idProcesso);
        $select->where('p.fl_ativo = ?', true);
        
        $Row = $this->_db->fetchRow($select);
        return $Row['id_proposta_mae'];
    }

    /*
    * Verifica se já existe algum laudo digitado
    * tanto Preliminar quanto Final
    */
    public function verificaLaudos($idProposta) {

        $laudo_preliminar = $this->select()->setIntegrityCheck(false);
        $laudo_preliminar->from(array('lp'=>'sinistro.laudos_preliminares'), array('count(lp.id) as qtd_laudo','lp.id_processo'));
        $laudo_preliminar->where('lp.fl_ativo = true');
        $laudo_preliminar->group('lp.id_processo');

        $laudo_final = $this->select()->setIntegrityCheck(false);
        $laudo_final->from(array('lf'=>'sinistro.laudos_finais'), array('count(lf.id) as qtd_laudo','lf.id_processo'));
        $laudo_final->where('lf.fl_ativo = true');
        $laudo_final->group('lf.id_processo');

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pc'=>'sinistro.processos'), 'pc.id');
        
        $select->join(array('pr' => 'seguro.propostas'), 'pr.id = pc.id_proposta', null);
        $select->join(array('pe' => 'seguro.propostas_endosso'), 'pe.id_proposta = pr.id and pe.fl_proposta_vigente = true', null);
        
        $select->joinleft(array('lp' => $laudo_preliminar), 'lp.id_processo = pc.id', 'lp.qtd_laudo as preliminar');
        $select->joinleft(array('lf' => $laudo_final), 'lf.id_processo = pc.id', 'lf.qtd_laudo as final');
        $select->where('pc.fl_ativo = true');
        $select->where('pr.id_endosso = (select id_endosso from seguro.propostas where id='.$idProposta.')');

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

	public function getIdentificadorSeguradora(int $idProposta) {
		
		$select = $this->select()->setIntegrityCheck(false)
			->from(array('av' => 'sinistro.avisos'), false)
			->join(array('at' => 'sinistro.avisos_transmissao_seguradora'), 'at.id_aviso = av.id', 'min(cd_identificador_seguradora) as cd_identificador_seguradora')
			->where('av.id_proposta = ?', $idProposta);

		$result = $this->_db->fetchRow($select);

		return $result['cd_identificador_seguradora'];
	}

	public function criarCodigoBarras($idProcesso)
	{
		if (!file_exists("resources/imagens/barcode/".$idProcesso."-PROC.gif")){
			$barcodeOptions  = array('text' => $idProcesso, 'barHeight' => 25);
			$renderer = Zend_Barcode::factory('code128', 'image', $barcodeOptions);
			$handle = $renderer->draw();
			$filename = 'resources/imagens/barcode/'.$idProcesso.'-PROC.gif';
			imagegif($handle,$filename);
		}
	}

    /**
     * @param int|null $idProcesso
     * @param int|null $idAvisoEncerramento
     * @return mixed
     * @throws Exception
     */
    public function getDataBasePagamento(?int $idProcesso = null, ?int $idAvisoEncerramento = null)
    {
        if (empty($idProcesso) && empty($idAvisoEncerramento)) {
            throw new Exception('É necessário informar o ID do Processo ou o ID do Aviso de Encerramento.');
        }

        $sqlArquivosBeneficiarios = "SELECT to_char(MAX(sba.dt_criacao), 'YYYY-MM-DD') as maior_data_arquivos_beneficiario ";
        $sqlArquivosBeneficiarios .= "      , spb.id_proposta as id_proposta ";
        $sqlArquivosBeneficiarios .= "      , sb.cpf_cnpj ";
        $sqlArquivosBeneficiarios .= " FROM seguro.propostas_beneficiarios spb ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.beneficiarios sb ON sb.cpf_cnpj = spb.nr_cpf_cnpj ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN sistema.status ss ON ss.id = sb.id_status_arquivos ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.propostas sprop ON sprop.id = spb.id_proposta ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN sinistro.processos sproc ON sproc.id_proposta = sprop.id ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN produto.produtos pp ON pp.id = sprop.id_produto ";
        $sqlArquivosBeneficiarios .= "      INNER JOIN seguro.beneficiarios_arquivos sba ON sba.id_beneficiario = sb.id ";
        $sqlArquivosBeneficiarios .= "WHERE sb.id_status_arquivos = " . Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA;
        $sqlArquivosBeneficiarios .= "  AND sba.fl_vigencia_atual is true ";
        $sqlArquivosBeneficiarios .= " GROUP BY spb.id_proposta, sb.cpf_cnpj ";

        $sqlArquivosSegurado = "SELECT to_char(max(pa.dt_criacao), 'YYYY-MM-DD') as maior_data_arquivos_segurado ";
        $sqlArquivosSegurado .= "      , p.id as id_processo ";
        $sqlArquivosSegurado .= " FROM sinistro.processos_arquivos AS pa ";
        $sqlArquivosSegurado .= "      INNER JOIN sinistro.processos AS p ON p.id = pa.id_processo ";
        $sqlArquivosSegurado .= "      INNER JOIN seguro.propostas AS pr ON pr.id = p.id_proposta ";
        $sqlArquivosSegurado .= "      INNER JOIN seguro.propostas_endosso AS pe ON pe.id_proposta = pr.id ";
        $sqlArquivosSegurado .= "WHERE (pa.fl_del = false) ";
        $sqlArquivosSegurado .= "  AND (pa.fl_ativo = true) ";
        $sqlArquivosSegurado .= "  AND (pe.fl_proposta_vigente = true) ";
        $sqlArquivosSegurado .= "  AND pa.id_tipo_arquivo not in (18, 20) ";
        $sqlArquivosSegurado .= "  AND p.id_status_arquivos = " .  Seguro_Model_Beneficiarios::ID_STATUS_ARQUIVOS_ANALISE_CONCLUIDA;
        $sqlArquivosSegurado .= " GROUP BY p.id ";

        $campos = [
            'sp.id_proposta as id_proposta',
            'sae.id as id_aviso_encerramento',
            "to_char(sae.dt_criacao, 'YYYY-MM-DD') as data_aviso_encerramento",
            'data_arquivos_beneficiario.maior_data_arquivos_beneficiario',
            'data_arquivos_segurado.maior_data_arquivos_segurado',
            'sb.id as id_beneficiario',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sp' => "sinistro.processos"], $campos);
        $select->join(['sae' => 'sinistro.avisos_encerramento'], 'sae.id_proposta = sp.id_proposta', false);
        $select->join(['data_arquivos_segurado' => new Zend_Db_Expr("({$sqlArquivosSegurado})")], 'data_arquivos_segurado.id_processo = sp.id', false);
        $select->joinLeft(['spdp' => 'sinistro.avisos_encerramento_data_base'], 'spdp.id_aviso_encerramento = sae.id', false);
        $select->joinLeft(['spb' => 'seguro.propostas_beneficiarios'], 'spb.id_proposta = sp.id_proposta AND spb.fl_del is false', false);
        $select->joinLeft(['sb' => 'seguro.beneficiarios'], 'sb.cpf_cnpj = spb.nr_cpf_cnpj', false);
        $select->joinLeft(['data_arquivos_beneficiario' => new Zend_Db_Expr("({$sqlArquivosBeneficiarios})")], 'data_arquivos_beneficiario.id_proposta = sp.id_proposta AND data_arquivos_beneficiario.cpf_cnpj = sb.cpf_cnpj', false);
		$select->joinLeft(['cr'=>'sinistro.cronometro_regulacao'], 'cr.id_aviso_encerramento = sae.id', false);
        if (!empty($idProcesso)) {
            $select->where('sp.id = ?', $idProcesso);
        }

        if (!empty($idAvisoEncerramento)) {
            $select->where('sae.id = ?', $idAvisoEncerramento);
        }

        $select->where('spdp.id is null');
        $select->where('cr.id IS NULL');
		$select->order('sp.id_proposta desc');

        return $this->fetchAll($select)->toArray();
    }

	/**
	 * Retorna se o processo pertence atualmente a empresa do usuário logado.
	 * 
	 * @param int $idProcesso
	 * @return bool
	 */
	public function isProcessoEmpresaAtiva(int $idProcesso): bool
	{
		$User = Zend_Auth::getInstance()->getIdentity();
		if ($User->id_empresa == Sistema_Model_Empresas::AGROBRASIL || $User->id_empresa == Sistema_Model_Empresas::ESSOR_SEGUROS) {
			$isProcessoEmpresaAtiva = true;
		} else {
			$isProcessoEmpresaAtiva = false;
			$select = $this->getData("id = {$idProcesso} AND id_empresa = {$User->id_empresa} AND fl_processo_empresa_ativa is true");
			$processoEmpresa = $this->fetchAll($select);

			if (!empty($processoEmpresa[0])) {
				$isProcessoEmpresaAtiva = true;
			}
		}

		return $isProcessoEmpresaAtiva;
	}

    public function getIdProcessoPropostaVigenteByProposta(int $idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sp' => 'sinistro.processos'], 'id')
            ->join(
                ['spe' => 'seguro.propostas_endosso'],
                'spe.id_proposta = sp.id_proposta AND spe.fl_proposta_vigente',
                false
            )
            ->join(['spe2' => 'seguro.propostas_endosso'], 'spe2.id_endosso = spe.id_endosso', false)
            ->where('spe2.id_proposta = ?', $idProposta);

        return $this->_db->fetchOne($select);
    }

	public function isDocumentacaoSeguradoValida($idProposta)
	{
    	$sql = "SELECT 1
            FROM sinistro.processos_arquivos AS pa
            INNER JOIN sinistro.processos AS p ON p.id = pa.id_processo
            INNER JOIN seguro.propostas AS pr ON pr.id = p.id_proposta
            INNER JOIN seguro.propostas_endosso AS pe ON pe.id_proposta = pr.id
            WHERE pr.id = :idProposta
              AND pa.fl_del = false
              AND pa.fl_ativo = true
              AND pe.fl_proposta_vigente = true
              AND p.id_status_arquivos IN (106, 108)
            LIMIT 1";

    	$rs = $this->_db->fetchOne($sql, ['idProposta' => $idProposta]);
    	return $rs !== false;
	}

	public function isDocumentacaoBeneficiariosValida($idProposta){
		$modelBeneficiarios = new Seguro_Model_Beneficiarios();
		return $modelBeneficiarios->isDocumentacaoValida($idProposta);
	}

	public function todosDocumentosSeguradoAnalisados(int $idProposta)
	{
		$select = $this->select()
			->setIntegrityCheck(false)
			->from(['p' => 'sinistro.processos'], ['id'])
			->join(['pa' => 'sinistro.processos_arquivos'], 'pa.id_processo = p.id', false)
			->join(['pr' => 'seguro.propostas'], 'pr.id = p.id_proposta', false)
			->join(['pe' => 'seguro.propostas_endosso'], 'pe.id_proposta = pr.id', false)
			->where('pr.id = ?', $idProposta)
			->where('pa.fl_del IS FALSE')
			->where('pa.fl_ativo IS TRUE')
			->where('pe.fl_proposta_vigente IS TRUE')
			->where('p.id_status_arquivos = 108');
		
    	return !empty($this->_db->fetchOne($select));
	}
}
