<?php

class Sinistro2_Model_AvisosSinistro extends Agro_Db_Table_Abstract {
    const ID_STATUS_SA_ACEITO = 28;
    const ID_STATUS_SA_CANCELADO = 168;
    const ID_STATUS_SA_FECHADO = 30;
    const ID_STATUS_SA_PENDENTE = 27;
    const ID_STATUS_SA_RECUSADO = 29;

	protected $_rowClass = 'Sinistro2_Model_Row_AvisoSinistro';
	protected $_schema = 'sinistro';
	protected $_name = 'avisos';
	protected $_view = 'v_avisos';
	protected $_primary = 'id';
	public $_order = 'dt_criacao desc';

	public $_columnExcel = array(
		'id' => 'Aviso',
    	'id_proposta' => 'Proposta',
    	'nr_apolice' => 'Apólice',
    	'id_processo' => 'Processo',
    	'id_processo_seguradora' => 'Seguradora',
    	'ds_nome_proponente' => 'Segurado',
    	'dt_criacao' => 'Dt. Entrada',
    	'dt_sinistro' => 'Dt. Sinistro',
    	'ds_nome_produto' => 'Produto',
    	'ds_nome_municipio' => 'Município',
    	'ds_sigla' => 'UF',
	    'ds_status' => 'Status',
		'ds_nome_usuario' => 'Usuário'
	);

	public function loadAvisoSinistro($idAviso) {
		$data = array();
		if($idAviso) {
			$data = $this->getAvisoSinistro($idAviso);

			$AvisoEvento       = new Sinistro2_Model_AvisosEventos();
			$listAvisosEventos = $AvisoEvento->getAvisosEventos($idAviso);
			$data['eventos']   = $listAvisosEventos;
			
			$AvisoPessoasContato = new Sinistro2_Model_AvisosPessoasContato();
			$listPessoasContato = $AvisoPessoasContato->getPessoasContato($idAviso);
			$data['pessoas_contato']  = $listPessoasContato;

			$data['ds_motivo_recusa'] = $this->getAvisoRecusa($idAviso);
		}
		return $data;
	}

	public function getIdsAvisosQuedaParreiralReplantio(int $idProposta, int $idLiquidacao): array {
		$rs = $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(array('sa' => 'sinistro.avisos'), 'id')
				->join(array('sp' => 'seguro.propostas'), 'sp.id = sa.id_proposta', false)
				->join(array('spc' => 'sinistro.processos'), 'spc.id_proposta = sa.id_proposta', false)
				->join(array('sl' => 'sinistro.liquidacoes'), 'sl.id_processo = spc.id', false)
				->where('sa.id_proposta = ?', $idProposta)
				->where('sl.id = ?', $idLiquidacao)
				->where('sa.id_status <>'. Sistema_Model_Status::AVISO_CANCELADO)
				->where('sa.id_status <>'. Sistema_Model_Status::AVISO_RECUSADO)
				->where('sa.fl_ocorrencia_queda_parreiral IS TRUE OR sa.fl_ocorrencia_replantio IS TRUE')
				->group('sa.id')
		);
		
		$result = [];
		
		if ($rs->count() > 0) {
			$result = array_column($rs->toArray(), 'id');
		}
		
		return $result;
	}

	public function desvincularVistorias(int $id): void
	{
		$user = Zend_Auth::getInstance()->getIdentity();

		$rs = $this->fetchAll(
			$this
				->select()
				->setIntegrityCheck(false)
				->from(array('sva' => 'sinistro.vistorias_avisos'), array('id_aviso', 'id_vistoria'))
				->where('sva.id_aviso = ?', $id)
		)->toArray();
		
		foreach ($rs as $row) {
			$this->_db->query("
				INSERT INTO log.log_sinistro_processo (id_usuario_criacao, ds_log) 
					VALUES ({$user->id}, 'Aviso {$row['id_aviso']} foi desvinculado da vistoria {$row['id_vistoria']}')
			");	
		}

		$a = $this->_db->query("DELETE FROM sinistro.vistorias_avisos WHERE id_aviso = {$id}");
	}

	public function getAvisoSinistro($idAviso) {
		$avisoFields = array(
			'a.dt_criacao', 'a.id as id_aviso', 'a.id_proposta', 'a.dt_sinistro',
			'a.ds_pessoa_contato', 'a.ds_telefone_contato', 'a.ds_observacoes', 'a.id_status',
			'a.fl_ocorrencia_queda_parreiral', 'a.fl_ocorrencia_replantio', 'a.id_status',
			'a.fl_dispensa_preliminar', 'a.fl_ocorrencia_replantio'
		);

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.avisos'), $avisoFields);
		$select->join(array('sis' => 'sumario.itens_segurados'),'sis.id_proposta = a.id_proposta', array('vl_lmga'));
		$select->joinLeft(array('f' => 'sistema.funcionarios'),'a.id_usuario_criacao = f.id_usuario','f.ds_nome_funcionario');
		$select->joinLeft(array('e' => 'sistema.empresas'),'f.id_empresa = e.id','e.ds_nome_fantasia');
		$select->joinLeft(array('c' => 'sistema.corretores'),'c.id_usuario = a.id_usuario_criacao','c.ds_nome_fantasia as ds_nome_corretor');
		$select->join(array('u' => 'sistema.usuarios'),'a.id_usuario_criacao = u.id','u.ds_nome_usuario');
		$select->joinLeft(array('pvp' => 'seguro.propostas_vistorias_previas'),'pvp.id_proposta = a.id_proposta','pvp.id as id_proposta_vistoria');
		$select->join(array('s' => 'sistema.status'),'s.id = a.id_status', array('cd_status', 'ds_status', 'ds_chave as ds_chave_status'));
		$select->joinLeft(array('ar' => 'sinistro.avisos_recusas'), 'ar.id_aviso = a.id', null);
		$select->joinLeft(array('trs' => 'atendimento.tipo_recusa_sinistro'),'trs.id = ar.id_tipo_recusa', 'ds_tipo_recusa');
		$select->joinLeft(array('alms' => 'sinistro.avisos_log_mudanca_status'),'alms.id_aviso = a.id and alms.id_status_novo=168', 'ds_motivo');
		$select->where($this->getAdapter()->quoteInto('a.id = ?',$idAviso));
		$select->order('pvp.id asc');
		
		return $this->fetchRow($select)->toArray();
	}

	public function getAvisoRecusa($idAviso) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('sinistro.avisos_recusas'), 'ds_motivo_recusa');
		$select->where('id_aviso = ?', $idAviso);

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

	public function relacionarAvisoEvento($id, $idEvento){
		$AvisoEvento = new Sinistro2_Model_AvisosEventos();
		$data = array();

		$data['id_aviso'] = $id;
		$data['id_evento'] = $idEvento;

		$AvisoEvento->insert($data);
	}
	
	public function relacionarPessoasContato($id, $pessoa_contato){
	    $AvisoPessoaContato = new Sinistro2_Model_AvisosPessoasContato();
	    $data = array();
	    
	    $data['id_aviso'] = $id;
	    $data['ds_nome'] = $pessoa_contato['ds_nome'];
	    $data['ds_telefone'] = $pessoa_contato['ds_telefone'];
	    
	    $AvisoPessoaContato->save($data);
	}

	public function getDadosEmailAviso($idAviso){
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.avisos'),array('id','a.dt_criacao',"to_char(a.dt_sinistro,'DD/MM/YYYY HH24:MI:SS') as dt_sinistro"));
		$select->join(array('pc' => 'seguro.propostas_corretores'),'pc.id_proposta = a.id_proposta',false);
		$select->join(array('c' => 'sistema.corretores'),'c.id_usuario = pc.id_usuario',array('ds_email as ds_email_corretor','ds_nome_fantasia as ds_nome_corretor'));
		$select->join(array('p' => 'seguro.propostas'),'a.id_proposta = p.id',array('nr_apolice','id_proposta_mae','id as id_proposta'));
		$select->join(array('pp' => 'seguro.propostas_proponentes'),'p.id = pp.id_proposta','ds_nome_proponente');
		$select->join(array('po' => 'seguro.propostas_propriedades'),'p.id = po.id_proposta');
		$select->join(array('m' => 'sistema.municipios'),'m.id = po.id_municipio', 'ds_nome_municipio');
		$select->join(array('uf' => 'sistema.estados'),'uf.id = m.id_estado', 'ds_sigla');
		$select->join(array('pd' => 'produto.produtos'),'p.id_produto = pd.id','ds_nome_produto');
		$select->join(array('ppg' => 'produto.produtos_geral'), 'ppg.id = pd.id_produto_geral', false);
		$select->join(array('pcu' => 'produto.culturas'), 'pcu.id = ppg.id_cultura', 'ds_nome_cultura');
		$select->joinLeft(array('pr' => 'sinistro.processos'),'p.id = pr.id_proposta','pr.id as id_processo');
		$select->joinLeft(array('pre' => 'sinistro.processos_empresas'),'pre.id_processo = pr.id and pre.fl_ativo = true',false);
		$select->joinLeft(array('e' => 'sistema.empresas'),'e.id = pre.id_empresa',array('e.ds_nome_fantasia as ds_nome_vistoriadora','e.ds_email as ds_email_vistoriadora'));
		$select->joinLeft(array('ar' => 'sinistro.avisos_recusas'),'a.id = ar.id_aviso  and ar.fl_ativo = true','ds_motivo_recusa');
		$select->join(array('ae' => 'sinistro.avisos_eventos'),'ae.id_aviso = a.id', false);
		$select->join(array('ev' => 'produto.eventos'),'ae.id_evento = ev.id ', 'ds_nome_evento');
		$select->where($this->getAdapter()->quoteInto('a.id = ?',$idAviso));

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

	public function getAvisosByCobertura($idCobertura, $idProposta, $tpVistoria, $flAllAvisos = true) {
		$data = array();
		if($idCobertura && $idProposta) {
			$select = "
                select
                    a.id,
                    to_char(a.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro,
                    to_char(a.dt_sinistro, 'HH24:MI') as hr_sinistro
                from
                    sinistro.avisos a,
                    sistema.status st,
                    sinistro.avisos_eventos ae,
                    produto.coberturas_eventos ce
                where
                    a.id_proposta = $idProposta and
                    st.id = a.id_status and
                    st.ds_chave = 'ACEITO' and
                    ae.id_aviso = a.id and
                    ce.id_evento = ae.id_evento and
                    ce.id_cobertura = $idCobertura";

            if (!$flAllAvisos) {
                $select .= "
                    and
                    a.id not in (
                        select
                            a.id
                        from
                            sinistro.avisos a,
                            sinistro.vistorias_avisos va,
                            sistema.vistorias v,
                            sistema.vistorias_coberturas vc,
                            sistema.tipos_vistoria tv
                        where
                            a.id_proposta = $idProposta and
                            va.id_aviso = a.id and
                            v.id = va.id_vistoria and
                            vc.id_vistoria = v.id and
                            vc.id_cobertura = $idCobertura and
                            tv.id = v.id_tipo and
                            tv.ds_chave_tipos_vistoria = '$tpVistoria'
                    )";
            }

            $select .= "
                group by
                    a.id,
                    dt_sinistro,
                    hr_sinistro
            ";

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

		return $data;
	}

	public function getAvisosByVistoriaCobertura($idProposta, $idCobertura, $idVistoria) {
		$data = array();
		if($idProposta && $idCobertura && $idVistoria){
			$select = "
				select
					av.id,
                    to_char(av.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro,
                    to_char(av.dt_sinistro, 'HH24:MI') as hr_sinistro,
                    true as checked
				from
					sinistro.avisos	av
					inner join
					   sinistro.vistorias_avisos va on
					       va.id_aviso = av.id
					inner join
					   sistema.vistorias_coberturas vc on
					       vc.id_vistoria = va.id_vistoria
				where
					vc.id_cobertura = $idCobertura and
					av.id_proposta  = $idProposta and
					va.id_vistoria  = $idVistoria
				group by
					av.id,
                    dt_sinistro,
                    hr_sinistro
			";

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

	public function getAvisosByLaudoPreliminar($idLaudoPreliminar){
		$data = array();
		if($idLaudoPreliminar){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('av' => 'sinistro.avisos'),'av.id');
			$select->join(array('va' => 'sinistro.vistorias_avisos'),'av.id = va.id_aviso',false);
			$select->join(array('vl' => 'sistema.vistorias_laudos_preliminares'),'va.id_vistoria = vl.id_vistoria');

			if(is_array($idLaudoPreliminar)){
				if(count($idLaudoPreliminar) > 0){
					$select->where('vl.id_laudo_preliminar in (' . implode(',',$idLaudoPreliminar) . ')');
					$data = $this->_db->fetchCol($select);

				}
			}else{
				$select->where($this->getAdapter()->quoteInto('vl.id_laudo_preliminar = ?',$idLaudoPreliminar));
				$data = $this->_db->fetchCol($select);
			}
		}
		return $data;
	}

	public function getVistoriaByAvisos($idAviso){
		$data = array();
		if($idAviso){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('av' => 'sinistro.avisos'), false);
			$select->join(array('va' => 'sinistro.vistorias_avisos'),'av.id = va.id_aviso', 'va.id_vistoria');

			if(is_array($idAviso)){
				if(count($idAviso) > 0){
					$select->where('va.id_aviso in (' . implode(',', $idAviso) . ')');
					$data = $this->_db->fetchCol($select);

				}
			}else{
				$select->where($this->getAdapter()->quoteInto('va.id_aviso = ?', $idAviso));
				$data = $this->_db->fetchCol($select);
			}
		}
		return $data;
	}

	public function getAvisosByVistoria($idVistoria){
		$data = array();
		if($idVistoria){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('av' => 'sinistro.avisos'), false);
			$select->join(array('va' => 'sinistro.vistorias_avisos'),'av.id = va.id_aviso', 'va.id_aviso');

			if(is_array($idVistoria)){
				if(count($idVistoria) > 0){
					$select->where('va.id_vistoria in (' . implode(',', $idVistoria) . ')');
					$data = $this->_db->fetchCol($select);

				}
			}else{
				$select->where($this->getAdapter()->quoteInto('va.id_vistoria = ?', $idVistoria));
				$data = $this->_db->fetchCol($select);
			}
		}

		return $data;
	}

	public function getAvisosForAgendamentoVistFinal($idCobertura,$idProposta){
		$data = array();

		if($idCobertura && $idProposta){

			$fields = array(
				'av.id as id_aviso',
				'to_char(av.dt_sinistro, \'DD/MM/YYYY\') as dt_sinistro',
				'to_char(av.dt_sinistro, \'HH24:MI\') as hr_sinistro'
			);
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('av' => 'sinistro.avisos'),$fields);
			$select->join(array('ae' => 'sinistro.avisos_eventos'),'av.id = ae.id_aviso', false);
			$select->join(array('s' => 'sistema.status'),'s.id = av.id_status', false);
			$select->join(array('ce' => 'produto.coberturas_eventos'),'ce.id_evento = ae.id_evento', false);
			$select->where('ce.id_cobertura = ?', $idCobertura);
			$select->where('av.id_proposta = ?', $idProposta);
			$select->where("s.ds_chave = 'ACEITO'");
			$select->group(array('av.id', 'dt_sinistro', 'hr_sinistro'));

			$data = $this->fetchAll($select)->toArray();

		}
		return $data;
	}

	public function getVistoriasByLaudoPreliminar($idLaudoPreliminar) {
		$data = array();
		if($idLaudoPreliminar){
			$select = "
				select
					v.id as id_vistoria,
					to_char(v.dt_inicio, 'DD/MM/YYYY') as dt_inicio,
					to_char(v.dt_fim, 'DD/MM/YYYY') as dt_fim
				from
					sinistro.avisos	as av join
					sinistro.vistorias_avisos as va on av.id = va.id_aviso join
					sistema.vistorias_coberturas as vc on va.id_vistoria = vc.id_vistoria join
					sistema.vistorias_laudos_preliminares as vlp on vlp.id_vistoria = vc.id_vistoria join
					sistema.vistorias as v on v.id = vlp.id_vistoria join
					sistema.tipos_vistoria tv on tv.id = v.id_tipo
				where
					tv.ds_chave_tipos_vistoria = 'PRELIMINAR' and
					av.fl_ativo     = true
			";
			if(is_array($idLaudoPreliminar)){
				$select .= " and vlp.id_laudo_preliminar in (" . implode(",", $idLaudoPreliminar) . ") ";
			}else{
				$select .= " and vlp.id_laudo_preliminar = ". $idLaudoPreliminar;
			}

			$select .= "
				group by
					v.id,
					dt_inicio,
					dt_fim
			";

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

	public function getCoberturasByAviso($idProposta, $idAviso) {

		$data = array();
		if($idProposta && $idAviso){
			$select = "
				select
					c.id as id_cobertura,
					c.ds_nome_cobertura,

					pdc.fl_vistoria_preliminar,
					pdc.fl_vistoria_previa

				from
					/*tabela que tem o id_proposta*/
					sinistro.avisos as av 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 inner join

					/*filtra pelos eventos das coberturas*/
					sinistro.avisos_eventos as ae on ae.id_aviso = av.id inner 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
					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
				where
					av.id_proposta = $idProposta and
					av.id = $idAviso and
					pdc.fl_cobertura_dependente = false and
					c.fl_ativo = true
				order by
					pdc.fl_vistoria_preliminar,
					c.ds_nome_cobertura
			";

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

		return $data;
	}

	public function getAvisosByCoberturaVistoriaPreliminar($idProposta, $idCobertura, $dtVistoria = null) {
		$data = array();
		if($idCobertura && $idProposta){
			$select = "
				select
					av.id as id_aviso,
					to_char(av.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro,
					to_char(av.dt_sinistro, 'HH24:MI') as hr_sinistro,
					va.id_vistoria
				from
					sinistro.avisos	as av left join
					sinistro.vistorias_avisos as va on av.id = va.id_aviso left join
					sistema.vistorias as v on v.id = va.id_vistoria left join
					sistema.tipos_vistoria as tv on tv.id = v.id_tipo
				where
					av.id in(
						select
							ae.id_aviso
						from
							sinistro.avisos_eventos ae inner join
							produto.coberturas_eventos ce on ce.id_evento = ae.id_evento
						where
							ce.id_cobertura = $idCobertura
					) and
					av.id_proposta  = $idProposta and
					av.id_status = 28 and
					av.fl_ativo     = true and
					(tv.ds_chave_tipos_vistoria is null or tv.ds_chave_tipos_vistoria = 'PRELIMINAR')
			";

			if($dtVistoria){
				$select .= ' and av.dt_sinistro < '.$dtVistoria;
			}

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

	public function getAvisosByCoberturasSemVistPreliminar($idProposta, $idCobertura) {
		$data = array();
		if($idCobertura && $idProposta){
			$select = "
				select
					av.id as id_aviso,
					to_char(av.dt_sinistro, 'DD/MM/YYYY') as dt_sinistro,
					to_char(av.dt_sinistro, 'HH24:MI') as hr_sinistro,
					va.id_vistoria
				from
					sinistro.avisos	as av left join
					sinistro.vistorias_avisos as va on av.id = va.id_aviso left join
					sistema.vistorias as v on v.id = va.id_vistoria left join
					sistema.tipos_vistoria as tv on tv.id = v.id_tipo
				where
					av.id in(
						select
							ae.id_aviso
						from
							sinistro.avisos_eventos ae inner join
							produto.coberturas_eventos ce on ce.id_evento = ae.id_evento
						where
							ce.id_cobertura = $idCobertura
					) and
					av.id_proposta  = $idProposta and
					av.id_status = 28 and
					av.fl_ativo     = true and
					(tv.ds_chave_tipos_vistoria is null or tv.ds_chave_tipos_vistoria = 'FINAL')
			";

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

	public function getDtSinistroAvisos($idProposta){

		$result = '';
		if ($idProposta) {
			$select = $this->select();
			$select->setIntegrityCheck(false);

			$select->from(array('a' => 'sinistro.avisos'), 'to_char(a.dt_sinistro, \'dd/MM/yyyy\') as dt_sinistro');

			$select->where('a.id_proposta = ?', $idProposta);
			$select->group('dt_sinistro');

			$rs = $this->fetchAll($select);

			if ($rs) {
				$result = $rs->toArray();
			}
		}

		return $result;
	}

	public function getAvisosByProposta($idProposta, $dsChave=false, $replantio=null){
		$data = array();

		if($idProposta){
			$select = $this->select();
			$select->setIntegrityCheck(false);

			$select->from(array('av' => 'sinistro.avisos'), array('id', "to_char(av.dt_sinistro, 'dd/MM/yyyy HH24:MI') as dt_sinistro", "case when s.ds_chave='RECUSADO' then to_char(av.dt_alteracao, 'dd/MM/yyyy HH24:MI') else to_char(dt_aceitacao, 'dd/MM/yyyy HH24:MI') end as dt_aceitacao", "to_char(av.dt_criacao, 'dd/MM/yyyy HH24:MI') as dt_envio", "fl_dispensa_preliminar", "fl_ocorrencia_queda_parreiral", "fl_ocorrencia_replantio", "fl_dias_carencia", "fl_dias_alerta_aviso", "fl_dias_cancelamento"));
			$select->join(array('s' => 'sistema.status'),'s.id = av.id_status', 's.ds_status as ds_status');
			$select->join(array('u' => 'sistema.usuarios'),'u.id = av.id_usuario_criacao', 'ds_nome_usuario as ds_nome_usuario_envio');
			$select->join(array('ae' => 'sinistro.avisos_eventos'), 'av.id = ae.id_aviso', false);
			$select->join(array('pe' => 'produto.eventos'), 'pe.id = ae.id_evento', 'ds_nome_evento');
			$select->joinLeft(array('u2' => new Zend_Db_Expr(
				'(SELECT DISTINCT alms.id_aviso, su.ds_nome_usuario 
				    FROM sinistro.avisos_log_mudanca_status alms
					JOIN sistema.usuarios su
					  ON alms.id_usuario_criacao = su.id
			 	   WHERE alms.id_status_novo = 28)'
			)),'u2.id_aviso = av.id', 'ds_nome_usuario as ds_nome_usuario_aceite');
			$select->joinLeft(array('ar' => 'sinistro.avisos_recusas'), 'av.id = ar.id_aviso', 'ds_motivo_recusa');
			$select->joinLeft(['u3' => 'sistema.usuarios'], 'u3.id = ar.id_usuario_criacao', 'ds_nome_usuario as ds_nome_usuario_recusa');
			$select->joinLeft(['u4' => new Zend_Db_Expr(
				'(SELECT alms.id_aviso, alms.dt_criacao, su.ds_nome_usuario
		      		FROM sinistro.avisos_log_mudanca_status alms
		      		JOIN sistema.usuarios su
		        	  ON alms.id_usuario_criacao = su.id
		     	   WHERE alms.id_status_novo = 168)'
			)], 'u4.id_aviso = av.id', ['ds_nome_usuario as ds_nome_usuario_cancelamento', "to_char(u4.dt_criacao, 'dd/MM/yyyy HH24:MI') as dt_cancelamento"]);
			$select->joinLeft(array('trs' => 'atendimento.tipo_recusa_sinistro'), 'ar.id_tipo_recusa = trs.id', ["to_char(ar.dt_criacao, 'dd/MM/yyyy HH24:MI') as dt_recusa",'ds_tipo_recusa']);
			$select->where('seguro.id_proposta_mae(av.id_proposta) = seguro.id_proposta_mae('.$idProposta.')');
			if($dsChave){
				$select->where('s.ds_chave = ?', $dsChave);
			}
			if (!is_null($replantio)) {
				$select->where('av.fl_ocorrencia_replantio = ?', $replantio);
			}

			$select->order('av.id');
			
			$rs = $this->fetchAll($select);
			if ($rs) {
				$data = $rs->toArray();
			}
		}

		return $data;
	}

    public function getAvisosByPropostaDataAviso($idProposta, $idAviso, $dtAviso){
        $data = array();

        if($idProposta){
            $select = $this->select();
            $select->setIntegrityCheck(false);

            $select->from(array('av' => 'sinistro.avisos'), array('id', "to_char(av.dt_sinistro, 'dd/MM/yyyy HH24:MI') as dt_sinistro", "to_char(dt_aceitacao, 'dd/MM/yyyy HH24:MI') as dt_aceitacao", "to_char(av.dt_criacao, 'dd/MM/yyyy HH24:MI') as dt_envio"));
            $select->join(array('s' => 'sistema.status'),'s.id = av.id_status', array('s.ds_status'));
            $select->where('av.id_proposta = ?',$idProposta);
            $select->where('av.id <> ?',$idAviso);
            $select->where("to_char(dt_sinistro, 'YYYY-MM-DD') = ?",$dtAviso);
            $rs = $this->fetchAll($select);
            if ($rs) {
                $data = $rs->toArray();
            }
        }

        return $data;
    }

    public function getVistoriadoraByCpfCnpjSeguradoSafra($cpf_cnpj, $idSafra) {

        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('pp' => 'seguro.propostas_proponentes'), null);
        $select->join(array('pr' => 'seguro.propostas'),'pr.id = pp.id_proposta and pr.fl_ativo = true', null);
        $select->join(array('po' => 'seguro.proponentes'),'po.cpf_cnpj = pp.cpf_cnpj', null);
        $select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
        $select->join(array('p' => 'sinistro.processos'), 'p.id_proposta = pp.id_proposta and p.fl_ativo = true', null);
        $select->join(array('pe' => 'sinistro.processos_empresas'), 'pe.id_processo = p.id and pe.fl_ativo = true', null);
        $select->join(array('e' => 'sistema.empresas'), 'e.id = pe.id_empresa and e.fl_ativo = true', array('e.id','e.ds_nome_fantasia'));
        $select->where('pp.cpf_cnpj = ?', $cpf_cnpj);
        $select->where('pd.id_safra = ?', $idSafra);
        $Row = $this->fetchRow($select);

        if($Row) {
            return $Row;
        } else {
            return false;
        }

    }

    public function getMunicipiosAvisos($where) {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from($this->_schema.'.'.$this->_view,array('id_municipio','ds_nome_municipio'));

		if (is_array($where)) {
			foreach ($where as $clause) {
				if (is_array($clause)) {
					$field = $clause['field'];
					$operator = $clause['operator'];
					$value = $clause['value'];

					if (is_numeric($value)) {
						$select->where("$field $operator ?", $value);
					} else {
						$select->where("normalize($field) $operator normalize(?)", $value);
					}


				} else {
					$select->where($clause, '');
				}
			}
		} elseif ($where != '') {
			$select->where($where);
		}
        $select->group(array('id_municipio','ds_nome_municipio'));
        $select->order('ds_nome_municipio');

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

    public function getEstadosAvisos($where) {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from($this->_schema.'.'.$this->_view,array('id_estado','ds_sigla'));

        if (is_array($where)) {
            foreach ($where as $clause) {
                if (is_array($clause)) {
                    $field = $clause['field'];
                    $operator = $clause['operator'];
                    $value = $clause['value'];

                    if (is_numeric($value)) {
                        $select->where("$field $operator ?", $value);
                    } else {
                        $select->where("normalize($field) $operator normalize(?)", $value);
                    }

                } else {
                    $select->where($clause, '');
                }
            }
        } elseif ($where != '') {
            $select->where($where);
        }
        $select->group(array('id_estado','ds_sigla'));
        $select->order('ds_sigla');

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

	public function getEmpresaPrevia($idProposta) {
        $select = $this->select()->setIntegrityCheck(false);
		$select->from(array('pvp' => 'seguro.propostas_vistorias_previas'), null);
		$select->join(array('ve' => 'sistema.vistorias_empresas'), 've.id_vistoria = pvp.id_vistoria', null);
		$select->join(array('e' => 'sistema.empresas'), 'e.id = ve.id_empresa', 'ds_nome_fantasia');
		$select->where('pvp.id_proposta = ?', $idProposta);
		$select->where('pvp.fl_ativo = true');

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

	public function hasAvisoSinistroAnteriorByIdProposta($idProposta, $dtSinistro) {
        $select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.avisos'), 'id');
		$select->where('a.id_proposta = ?', $idProposta);
		$select->where('a.dt_sinistro > ?', $dtSinistro);
		$select->where('a.id_status != ?', Agro_Util::status("CANCELADO", "SA"));

		if ($this->_db->fetchOne($select)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Busca o aviso mais antigo cadastrado.
	 * Usado inicialmente para travar agendamentos com data anterior a do aviso.
	 *
	 * @param $params
	 */
	public function buscaDataAceitacaoAvisoMaisAntigo($params){
		$sql = "select to_char(min(a.dt_aceitacao),'dd/mm/yyyy') from sinistro.avisos a where	a.id_proposta = {$params["id_proposta"]}";
		return $this->_db->fetchOne($sql);
	}

	public function getIdPropostaByIdAviso($id_aviso){
		$Aviso = $this->find($id_aviso)->current();
		$propostas = $Aviso->id_proposta;

		return $propostas;
	}

	public function getIdPropostaMaeByIdAviso($id_aviso){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.v_avisos'), array('id_proposta_mae','id_proposta'));
		$select->where('a.id = ?', $id_aviso);

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

	public function checkDispensaPreliminar($idAviso){
	    $select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.avisos'), 'fl_dispensa_preliminar');
		$select->where('a.id = ?', $idAviso);

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

	}

	public function checkAndCancelProcesso($idProposta){
	    $select = $this->select()->setIntegrityCheck(false);
	    $select->from(array('a' => 'sinistro.avisos'), 'id');
		$select->where('a.id_proposta = ?', $idProposta);
		$select->where('a.id_status in (27,28)');

		$avisos = $this->fetchAll($select);

		if(count($avisos) == 1){
			return true;
		}

		return false;
	}


	public function setAvisoVisto($idAviso){
		$this->_db->update('sinistro.avisos', array('fl_novo' => 0), "id = {$idAviso}");
	}

	public function getData($where=false) {
		$User = Zend_Auth::getInstance()->getIdentity();

		$select = $this->select();

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

		if ($User->tp_usuario == 'V' || $User->tp_usuario == 'M') {
			$select->where('id_empresa_processo_sinistro = ?', $User->id_empresa);
			$select->where('id_processo is not null');
			//solicitação #2434
			$select->where('id_status not in (168,29)');
		}

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

		//$select->group(array('ds_nome_usuario_responsavel', 'ds_nome_cliente', 'fl_ativo', 'fl_del', 'id', 'dt_criacao', 'dt_sinistro', 'id_proposta', 'dt_vigencia', 'nr_apolice',  'id_processo', 'id_processo_seguradora', 'ds_nome_proponente', 'cpf_cnpj', 'id_produto', 'ds_nome_produto', 'ds_nome_usuario',  'id_corretor',  'id_usuario_corretor', 'ds_nome_corretor', 'id_safra', 'id_status', 'ds_nome_municipio', 'ds_sigla',  'id_estado', 'id_municipio', 'ds_endereco', 'ds_status', 'id_endosso', 'fl_pasta_aberta', 'id_usuario_proposta_corretor', 'vl_lmga',  'ds_eventos', 'ds_empresa_previa', 'ds_empresa_cpf_segurado'));
		$this->getWhere($select, $where);

		return $select;
	}

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

	public function checkAvisoByEndosso($idEndosso) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('a' => 'sinistro.avisos'), 'count(a.id) as count');
		$select->join(array('pe' => 'seguro.propostas_endosso'), 'a.id_proposta = pe.id_proposta', null);
		$select->join(array('s' => 'sistema.status'), 'a.id_status = s.id', null);
		$select->where('pe.id_endosso = ?', $idEndosso);
		$select->where("s.ds_chave IN ('PENDENTE', 'ACEITO')");

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

	public function checkEncaminhamentoEmpresaByProcesso($idProcesso,$idEmpresa) {
		$select = $this->select()->setIntegrityCheck(false)
			->from('sinistro.processos_empresas', 'count(id_processo) as count')
			->where('id_processo = ?', $idProcesso)
			->where('id_empresa <> ?', $idEmpresa)
			->where('fl_ativo = true')
			->where('fl_del = false');
		
		return $this->_db->fetchOne($select);
	}


	public function countNewAvisos() {
		$sql = "
				  select
				        se.ds_sigla,
						 pc.ds_nome_cultura,
						 pev.ds_nome_evento,
				         count(sa.id) as total
				    from sinistro.avisos sa
				    join seguro.propostas sp
				      on sa.id_proposta = sp.id
				    join produto.produtos pp
				      on sp.id_produto = pp.id
				    join produto.produtos_geral ppg
				      on pp.id_produto_geral = ppg.id
				    join produto.culturas pc
				      on ppg.id_cultura = pc.id
				    join seguro.propostas_propriedades spp
				      on sp.id = spp.id_proposta
				    join sistema.municipios sm
				      on spp.id_municipio = sm.id
				    join sistema.estados se
				      on sm.id_estado = se.id
				    join sinistro.avisos_eventos sae
				      on sae.id_aviso = sa.id
				    join produto.eventos pev
				      on pev.id = sae.id_evento
				   where sa.fl_novo is true
				     and TO_CHAR(sa.dt_criacao, 'DD/MM/YYYY') = TO_CHAR(now(), 'DD/MM/YYYY')
				group by se.ds_sigla,
						 pc.ds_nome_cultura,
						 pev.ds_nome_evento
				having count(sa.id) >= 10
				order by se.ds_sigla, pc.ds_nome_cultura, total desc
        ";

		$data = $this->_db->fetchAll($sql);

		return $data;
	}

	public function getPropostaCoberturas($idProposta) {
        if (!$idProposta) {
            throw new Exception('Identificador da Proposta inválida!');
        }

		$sql = "
            select pr.id as id_proposta
                 , proc.fl_vistoria_previa as necessita_vistoria_previa
                 , proc.fl_cobertura_principal as principal
              from seguro.propostas pr
                inner join seguro.propostas_coberturas prpc on prpc.id_proposta = pr.id
                inner join produto.produtos_coberturas proc on prpc.id_cobertura = proc.id_cobertura and proc.id_produto = pr.id_produto
             where pr.id = $idProposta
               and proc.fl_vistoria_previa = true
               and pr.fl_ativo = true
               and prpc.fl_ativo = true
               and proc.fl_ativo = true";

        $data = $this->_db->fetchAll($sql);

		return $data;
	}
	
	public function getAvisoReserva($idAviso) {
	    $select = $this->select()->setIntegrityCheck(false);
	    
	    $select->from(array('a'=>'sinistro.avisos_transmissao_seguradora'), '*');
	    $select->join(array('s' => 'sinistro.avisos'), 's.id = a.id_aviso', 'id_proposta');
	    $select->join(array('pr' => 'seguro.propostas'), 'pr.id = s.id_proposta');
	    //$select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_cobertura = a.id_cobertura and pc.id_produto = pr.id_produto', 'cd_cobertura_seguradora');
	    $select->where('a.id_aviso     = ?', $idAviso);
	    
	    return $this->_db->fetchRow($select);
	}

    public function listGerenciaAvisos($filter = array(), $ordenacao = 'pp.id_proposta_mae desc, a.id desc')
    {
        $sql = "SELECT DISTINCT a.id
                     , a.dt_criacao
                     , a.dt_sinistro
                     , pp.id AS id_proposta
                     , (to_char(seguro.dt_vigencia_inicio_original(pp.id)::timestamp with time zone, 'DD/MM/YYYY'::text) || ' - '::text) || to_char(pp.dt_vigencia_fim::timestamp with time zone, 'DD/MM/YYYY'::text) AS dt_vigencia
                     , pppr.ds_nome_proponente
                     , pd.ds_nome_produto
                     , a.id_status
                     , mun.ds_nome_municipio
                     , est.ds_sigla
                     , sis.vl_lmga
                     , pe.ds_nome_evento AS ds_eventos
                     , empvist.ds_nome_fantasia AS ds_empresa_previa
                     , CASE
                            WHEN a.id_status = 27 THEN
                                CASE 
                                    WHEN empproc.ds_nome_fantasia IS NOT NULL
                                        THEN empproc.ds_nome_fantasia::character varying
                                    ELSE
                                        sinistro.busca_empresa_cnpj(pd.id_safra, pppr.cpf_cnpj::text, pdg.tp_epoca_cultivo::text)
                                END
                            ELSE NULL::character varying
                       END AS ds_empresa_cpf_segurado
                     , a.fl_novo
                     , v_nr_endosso.nr_endosso as nr_endosso
                     , pp.id_proposta_mae
                     , CASE
                            WHEN btrim(v_tem_parcela_vencida.id_endosso::character varying::text) <> ''::text OR v_tem_parcela_vencida.id_endosso IS NOT NULL THEN
                                TRUE
                            ELSE
                                FALSE
                       END AS vencida
                     , empvist.id AS id_status_previa
                     , empvist.ds_status AS ds_status_vistoria_previa
                     , a.fl_dias_carencia
                     , a.fl_dias_alerta_aviso
                     , a.fl_dias_cancelamento
                     , ppo.fl_restricao
                     , coalesce(total_avisos.avisos_aceitos, 0) as avisos_aceitos
                     , a.fl_ocorrencia_queda_parreiral
                     , a.fl_ocorrencia_replantio
                     , coberturas_adicionais.coberturas as coberturas_adicionais
                  FROM sinistro.avisos a
                  JOIN seguro.propostas pp ON pp.id = a.id_proposta
                  JOIN seguro.propostas_endosso spe ON spe.id_endosso = pp.id_endosso
                  JOIN sumario.itens_segurados sis ON sis.id_proposta = pp.id
                  JOIN seguro.propostas_endosso pend ON pend.id_proposta = pp.id
                  JOIN seguro.propostas_propriedades ppr ON ppr.id_proposta = pp.id
                  JOIN seguro.propostas_corretores spc ON spc.id_proposta = pp.id
                  JOIN sistema.municipios mun ON mun.id = ppr.id_municipio
                  JOIN sistema.estados est ON est.id = mun.id_estado
                  JOIN seguro.propostas_proponentes pppr ON pppr.id_proposta = pp.id
                  JOIN seguro.proponentes ppo ON ppo.cpf_cnpj::text = pppr.cpf_cnpj::text
                  JOIN produto.produtos pd ON pd.id = pp.id_produto
                  JOIN produto.produtos_geral pdg ON pdg.id = pd.id_produto_geral
                  JOIN sinistro.avisos_eventos sae ON sae.id_aviso = a.id
                  JOIN produto.eventos pe ON pe.id = sae.id_evento
                  LEFT JOIN (SELECT sa.id as id_aviso,  string_agg(spc.id_cobertura::text, ',') as coberturas
                          FROM sinistro.avisos sa
                               INNER JOIN seguro.propostas_coberturas spc on spc.id_proposta = sa.id_proposta
                         WHERE spc.fl_principal is false
                         GROUP BY sa.id) as coberturas_adicionais ON coberturas_adicionais.id_aviso = a.id
             LEFT JOIN sinistro.processos pc ON pc.id_proposta = pp.id
             LEFT JOIN sinistro.processos_empresas ppe ON ppe.id_processo = pc.id AND ppe.fl_ativo = true
             LEFT JOIN (   SELECT empr.ds_nome_fantasia
                                , pvp.id_proposta
                                , pe_1.id_endosso
                                , ss.id
                                , ss.ds_status
                             FROM seguro.propostas_endosso pe_1
                             JOIN seguro.propostas_vistorias_previas pvp ON pe_1.id_proposta = pvp.id_proposta
                             JOIN (   SELECT v.id_proposta
                                           , max(v.id) AS id
                                        FROM seguro.propostas_vistorias_previas v
                                    GROUP BY v.id_proposta
                                  ) pvpp ON pvp.id = pvpp.id
                             JOIN sistema.vistorias_empresas ve ON pvp.id_vistoria = ve.id_vistoria
                             JOIN sistema.empresas empr ON ve.id_empresa = empr.id
                             JOIN sistema.status ss ON ss.id = pvp.id_status_analise
                         GROUP BY empr.ds_nome_fantasia, pvp.id_proposta, ss.id, pe_1.id_endosso, ss.ds_status
                       ) empvist ON empvist.id_endosso = spe.id_endosso
             LEFT JOIN sistema.empresas empproc ON empproc.id = ppe.id_empresa
             LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = pp.id_endosso
             LEFT JOIN (
                         SELECT propostas.id_endosso
                           FROM seguro.propostas
                           JOIN (   SELECT propostas_parcelas.id_proposta
                                         , propostas_parcelas.dt_vencimento
                                         , propostas_parcelas.vl_segurado
                                         , proposta_boletos.fl_pago
                                      FROM seguro.propostas propostas_1
                                      JOIN seguro.propostas_endosso propostas_endosso_1
                                        ON propostas_endosso_1.id_endosso = propostas_1.id_endosso
                                      JOIN seguro.propostas_parcelas
                                        ON propostas_parcelas.id_proposta = propostas_1.id
                                 LEFT JOIN seguro.proposta_boletos
                                        ON proposta_boletos.id_proposta = propostas_endosso_1.id_proposta
                                       AND proposta_boletos.id_proposta = propostas_parcelas.id_proposta
                                       AND proposta_boletos.nr_parcela  = propostas_parcelas.nr_parcela
                                     WHERE propostas_parcelas.fl_pago = FALSE
                                ) propostas_boletos ON propostas_boletos.id_proposta = propostas.id
                           JOIN seguro.propostas_endosso ON propostas_endosso.id_endosso = propostas.id_endosso AND propostas_endosso.fl_proposta_vigente = TRUE
                          WHERE propostas_boletos.vl_segurado > 0::numeric
                            AND propostas_boletos.dt_vencimento < to_char(now(), 'YYYY-mm-dd'::text)::date
                       ) AS v_tem_parcela_vencida
                    ON v_tem_parcela_vencida.id_endosso = pend.id_endosso
             LEFT JOIN (
                         SELECT count(*) as avisos_aceitos, id_proposta
                           FROM sinistro.avisos av2
                          WHERE av2.id_status = " . self::ID_STATUS_SA_ACEITO . "
                          GROUP BY id_proposta
                       ) as total_avisos ON total_avisos.id_proposta = a.id_proposta";

        $where = [];
        foreach ($filter as $clause) {
            $field = $clause['field'];
            $operator = $clause['operator'];
            $value = $clause['value'];

            if ($operator == 'in') {
                $where[] = "$field $operator $value";
            } else {
                if (strpos($field, 'fl_ativo')) {
                    $where[] = "$field is $value";
                } elseif (is_numeric($value)) {
                    $where[] = "$field $operator {$value}";
                } else {
                    if ($field != 'fl_ativo' && $field != 'fl_ressegurador' && strpos($field, 'fl_') === false) {
                        $where[] = "normalize($field) $operator normalize({$value})";
                    } else {
                        $where[] = "$field $operator {$value}";
                    }
                }
            }
        }
		if(!empty($where)){
			$sql .= " WHERE " . implode(" AND ", $where);
		}
       
        $sql .= " ORDER BY {$ordenacao}";

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

    public function listGerenciaPastas($filter = array())
    {
        $sql = "SELECT a.id
                       , pp.id AS id_proposta
                       , pc.id AS id_processo
                       , pppr.ds_nome_proponente
                       , pc.fl_pasta_aberta
                       , v_nr_endosso.nr_endosso
                       , pp.id_proposta_mae
                       , a.fl_novo
                  FROM sinistro.avisos a
                       INNER JOIN seguro.propostas pp ON pp.id = a.id_proposta
                       INNER JOIN sinistro.processos pc ON pc.id_proposta = pp.id
                       INNER JOIN seguro.propostas_proponentes pppr ON pppr.id_proposta = pp.id
                       INNER JOIN produto.produtos pd ON pd.id = pp.id_produto
                       LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = pp.id_endosso";

        $where = [];
	
        foreach ($filter as $clause) {
			
            $field = $clause['field'];
			
            $operator = $clause['operator'];
            $value = $clause['value'];

            if ($operator == 'in') {
                $where[] = "$field $operator $value";
            } else {
                if (strpos($field, 'fl_ativo')) {
                    $where[] = "$field is $value";
                } elseif (is_numeric($value)) {
                    $where[] = "$field $operator {$value}";
                } else {
                    if ($field != 'fl_ativo' && $field != 'fl_ressegurador' && strpos($field, 'fl_') === false) {
                        $where[] = "normalize($field) $operator normalize({$value})";
                    } else {
                        $where[] = "$field $operator {$value}";
                    }
                }
            }
        }

		if(!empty($where)){
			$sql .= " WHERE " . implode(" AND ", $where);
		}
        
        $sql .= " ORDER BY a.id desc";
	
        return $this->_db->fetchAll($sql);
    }

    public function getAvisosResumoDiario(DateTimeImmutable $dateTimeImmutable)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['a' => "{$this->_schema}.{$this->_name}"], 'count(*) as total');
        $select->join(['prop' => 'seguro.propostas'], 'prop.id = a.id_proposta', false);
        $select->join(['prod' => 'produto.produtos'], 'prod.id = prop.id_produto', 'ds_nome_produto as produto');
        $select->join(['pg' => 'produto.produtos_geral'], 'pg.id = prod.id_produto_geral', false);
        $select->join(['c' => 'produto.culturas'], 'c.id = pg.id_cultura', 'ds_nome_cultura as cultura');
        $select->join(['ae' => 'sinistro.avisos_eventos'], 'ae.id_aviso = a.id', false);
        $select->join(['e' => 'produto.eventos'], 'e.id = ae.id_evento', 'ds_nome_evento as evento');
        $select->join(['pp' => 'seguro.propostas_proponentes'], 'pp.id_proposta = prop.id', false);
        $select->join(['m' => 'sistema.municipios'], 'm.id = pp.id_municipio', false);
        $select->join(['est' => 'sistema.estados'], 'est.id = m.id_estado', 'ds_sigla as uf');
        $select->where("to_char(a.dt_sinistro, 'yyyy-MM-dd') = ?", $dateTimeImmutable->format('Y-m-d'));
        $select->group(['uf', 'cultura', 'produto', 'evento']);
        $select->order('total desc');

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

    public function getAvisosEndossos(int $idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['p1' => 'seguro.propostas'], false);
        $select->join(['p2' => 'seguro.propostas'], 'p2.id_proposta_mae = p1.id_proposta_mae', false);
        $select->join(['a' => "{$this->_schema}.{$this->_name}"], 'a.id_proposta = p2.id', ['a.id as id_aviso, a.id_status as id_status_aviso']);
        $select->where("p1.id = {$idProposta}");

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

    public function getAvisosSemVistoriaByProposta(int $idProposta)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['a' => "{$this->_schema}.{$this->_name}"], ['id', 'id_status', 'fl_dispensa_preliminar']);
        $select->joinLeft(['va' => 'sinistro.vistorias_avisos'], 'va.id_aviso = a.id', false);
        $select->where("a.id_proposta = {$idProposta}");
        $select->where("va.id_vistoria is null");

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

	/**
	 * Verifica se há aviso de sinistro aceito, pendente ou recusado para o ID de origem da proposta renovada
	 * 
	 * @param int $idPropostaRenovada
	 * @return boolean
	 */
    public function hasAvisoSinistroByPropostaRenovada(int $idPropostaRenovada) : bool
	{
		$select = $this->select()->setIntegrityCheck(false);
        $select->from(['a' => "{$this->_schema}.{$this->_name}"], 'a.id');
		$select->where('a.id_proposta = ?', $idPropostaRenovada);
		$select->where("a.id_status in (" . self::ID_STATUS_SA_ACEITO . ", " . self::ID_STATUS_SA_PENDENTE . ", " . self::ID_STATUS_SA_RECUSADO . ")");
		$select->limit(1);
		
		return !empty($this->_db->fetchOne($select));
    }

	public function getDadosAvisoProposta(array $campos, array $where): ?Zend_Db_Table_Row_Abstract
	{
		$campos = !empty($campos) ? $campos : ['sa.*'];
		$select = $this->select()
			->setIntegrityCheck(false)
			->from(['sa' => "{$this->_schema}.{$this->_name}"], $campos)
			->join(['sp' => 'seguro.propostas'], 'sp.id = sa.id_proposta', false)
			->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sp.id', false)
			->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false)
			->join(['sae' => 'sinistro.avisos_eventos'], 'sae.id_aviso = sa.id', false)
			->join(['pe' => 'produto.eventos'], 'pe.id = sae.id_evento', false)
			->join(['saes' => 'sinistro.aviso_email_segurado'], 'saes.id_aviso = sa.id', false)
			->join(['spc' => 'seguro.propostas_corretores'], 'spc.id_proposta = sp.id', false)
			->join(['sc' => 'sistema.corretores'], 'sc.id_usuario = spc.id_usuario', false);

		foreach ($where as $condicao) {
			$select->where($condicao);
		}

		if (empty($where)) {
			$select->limit(1);
		}

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

	public function getDadosAvisoPropostaRecusada(array $campos, array $where): ?Zend_Db_Table_Row_Abstract
	{
		$campos = !empty($campos) ? $campos : ['sa.*'];
		$select = $this->select()
			->setIntegrityCheck(false)
			->from(['sa' => "{$this->_schema}.{$this->_name}"], $campos)
			->join(['sp' => 'seguro.propostas'], 'sp.id = sa.id_proposta', false)
			->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sp.id', false)
			->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false)
			->join(['sae' => 'sinistro.avisos_eventos'], 'sae.id_aviso = sa.id', false)
			->join(['pe' => 'produto.eventos'], 'pe.id = sae.id_evento', false)
			->join(['saes' => 'sinistro.aviso_email_segurado'], 'saes.id_aviso = sa.id', false)
			->join(['spc' => 'seguro.propostas_corretores'], 'spc.id_proposta = sp.id', false)
			->join(['sc' => 'sistema.corretores'], 'sc.id_usuario = spc.id_usuario', false)
			->join(['sar' => 'sinistro.avisos_recusas'], 'sar.id_aviso = sa.id', false)
			->join(['atrs' => 'atendimento.tipo_recusa_sinistro'], 'atrs.id = sar.id_tipo_recusa', false)
			->join(['su' => 'sistema.usuarios'], 'su.id = sar.id_usuario_criacao', false);

		foreach ($where as $condicao) {
			$select->where($condicao);
		}

		if (empty($where)) {
			$select->limit(1);
		}

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

}