<?php

class Sistema_Model_Agendamentos extends Agro_Db_Table_Abstract {
    const DS_CHAVE_STATUS_AGUARDANDO_DATA = 'AGUARDANDO_DATA';

	protected $_schema = 'sistema';
	protected $_name = 'agendamentos';
	protected $_primary = 'id';
	public $_order = 'dt_agendamento';

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

		if($data['ds_turno']) {
			$Row->ds_turno = $data['ds_turno'];
		}

		if ($data['dt_agendamento']) {
			$Row->dt_agendamento = Agro_Util::formatDate($data['dt_agendamento'], Zend_Date::W3C);
			$Row->id_status = $this->getIdStatus('AGENDADO');
		} else {
			$Row->id_status = $data['id_status'];
		}

		if($data['id_tipo']){
			$Row->id_tipo_vistoria = $data['id_tipo'];
		}

		if(in_array($data['id_tipo'], [Sistema_Model_TipoVistoria::PRELIMINAR, Sistema_Model_TipoVistoria::FINAL]) && $data['id_vistoria']) {
		    //Cancela as vistorias ligadas ao Agendamento, caso o Agendamento tenha seu status alterado para "AGENDAMENTO_CANCELADO"
		    if ($data['id_status'] === Sistema_Model_Status::AGENDAMENTO_AGENDAMENTO_CANCELADO) {
                //Cancela Preliminar
                if($data['id_tipo'] == Sistema_Model_TipoVistoria::PRELIMINAR) {
                    $Model_LP = new Sinistro2_Model_LaudosPreliminares();
                    $id_laudo_preliminar = $Model_LP->getIdLaudoPreliminarByVistoria($data['id_vistoria']);

                    if($id_laudo_preliminar){
                        $Model_LP->save(
                          array(
                            'id_laudo_preliminar' => $id_laudo_preliminar,
                            'id_vistoria'         => $data['id_vistoria'],
                            'id_cobertura'        => $data['id_cobertura'],
                            'id_processo'         => $data['id_processo'],
                            'id_status'           => Sistema_Model_Status::LAUDOS_PRELIMINARES_CANCELADO
                          )
                        );
                    }
                }

                //Cancela Final
                if($data['id_tipo'] == Sistema_Model_TipoVistoria::FINAL) {
                    $Model_LF       = new Sinistro2_Model_LaudosFinais();
                    $id_laudo_final = $Model_LF->getIdLaudoFinalByVistoria($data['id_vistoria']);

                    if($id_laudo_final){
                        $Model_LF->save(
                          array(
                            'id_laudo_final' => $id_laudo_final,
                            'id_vistoria'    => $data['id_vistoria'],
                            'id_processo'    => $data['id_processo'],
                            'id_cobertura'   => $data['id_cobertura'],
                            'id_status'      => Sistema_Model_Status::LF_CANCELADO
                          )
                        );
                    }

                }

                //Apaga o relacionamento da vistoria cancelada com os avisos de sinistro
                $Model_VA = new Sinistro2_Model_VistoriasAvisos();
                $Model_VA->delete($data['id_vistoria']);
            }

            if ($data['id_status'] === Sistema_Model_Status::AGENDAMENTO_AGUARDANDO_DATA) {
                if($data['id_tipo'] == Sistema_Model_TipoVistoria::PRELIMINAR) {
                    $Model_LP = new Sinistro2_Model_LaudosPreliminares();
                    $rowLaudoPreliminar = $Model_LP->getLaudoPreliminarByVistoria($data['id_vistoria']);

                    if(!empty($rowLaudoPreliminar) && $rowLaudoPreliminar['id_status'] === Sistema_Model_Status::LAUDOS_PRELIMINARES_CANCELADO) {
                        $Model_LP->save(
                          array(
                            'id_laudo_preliminar' => $rowLaudoPreliminar['id'],
                            'id_vistoria'         => $data['id_vistoria'],
                            'id_cobertura'        => $data['id_cobertura'],
                            'id_processo'         => $data['id_processo'],
                            'id_status'           => Sistema_Model_Status::LAUDOS_PRELIMINARES_PENDENTE_LAUDO_PRELIMINAR
                          )
                        );

                        $Row->id_status = Sistema_Model_Status::AGENDAMENTO_AGENDADO;
                    }
                }
            }
		}

		return $Row->save();
	}

	public function getAgendamento($idVistoria){
		if ($idVistoria) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('ag'=>'sistema.agendamentos'),array('id as id_agendamento','ds_turno as ds_turno_agendamento', 'ds_turno', "to_char(ag.dt_agendamento, 'dd/MM/yyyy') as dt_agendamento"));
			$select->join(array('va'=>'sistema.vistorias_agendamentos'),'ag.id = va.id_agendamento','va.id_vistoria');
			$select->where($this->getAdapter()->quoteInto('va.id_vistoria = ?',$idVistoria));
			$select->where('ag.fl_ativo = true');

			if($this->fetchRow($select)){
				return $this->fetchRow($select)->toArray();
			}else{
				return false;
			}
		} else {
			return false;
		}
	}

	public function getAgendamentoVistoriadores($idVistoria){
		if ($idVistoria) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('ag'=>'sistema.agendamentos'), false);
			$select->join(array('va'=>'sistema.vistorias_agendamentos'),'ag.id = va.id_agendamento', false);
			$select->join(array('af'=>'sistema.agendamentos_funcionarios'),'af.id_agendamento = va.id_agendamento', 'af.id_funcionario');
			$select->join(array('ve'=>'sistema.vistorias_empresas'),'ve.id_vistoria = va.id_vistoria', 've.id_empresa');
			$select->join(array('f' =>'sistema.funcionarios'),'f.id = af.id_funcionario', 'ds_nome_funcionario');
			$select->where($this->getAdapter()->quoteInto('va.id_vistoria = ?',$idVistoria));
			$select->where('ag.fl_ativo = true');

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

		}else{
			return false;
		}

	}

	public function getIdAgendamento($idVistoria){
		if ($idVistoria) {
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('ag'=>'sistema.agendamentos'),'id as id_agendamento');
			$select->join(array('va'=>'sistema.vistorias_agendamentos'),'ag.id = va.id_agendamento');
			$select->where('va.id_vistoria = ?',$idVistoria);

			if($this->fetchRow($select)){
				return $this->fetchRow($select)->toArray();
			}else{
				return false;
			}
		} else {
			return false;
		}
	}

	public function verificaOpcoesAgendamento($idAviso) {
		$select =  "
				select
					c.id as id_cobertura,
					c.ds_nome_cobertura,
					pdc.fl_vistoria_preliminar,
					pdc.fl_vistoria_final,
	                av.fl_ocorrencia_replantio
				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
					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 and pdc.fl_exibir_regulacao_perdas = true
				where
					pdc.fl_cobertura_dependente = false and
					av.id = $idAviso and
                    
                    /* exclui a cura do agendamento automático - solicitação  */
                    pdc.id_cobertura <> 9 and
                
					CASE WHEN av.fl_ocorrencia_replantio = TRUE 
						 THEN c.ds_chave_cobertura ilike '%REPLANTIO%'
						 WHEN av.fl_ocorrencia_replantio = FALSE OR av.fl_ocorrencia_replantio IS NULL THEN
							  c.ds_chave_cobertura NOT like '%REPLANTIO%'
					END and

					CASE WHEN av.fl_ocorrencia_queda_parreiral = FALSE OR av.fl_ocorrencia_queda_parreiral IS NULL THEN
							  c.ds_chave_cobertura NOT like '%QUEDA_PARREIRAL%'
						 ELSE TRUE
					END
				group by
					c.id,
					c.ds_nome_cobertura,
					pdc.fl_vistoria_preliminar,
					pdc.fl_vistoria_final,
	                av.fl_ocorrencia_replantio
                order by
	               case when av.fl_ocorrencia_replantio=false then c.ds_nome_cobertura end asc ,
	               case when av.fl_ocorrencia_replantio=true then c.ds_nome_cobertura end desc,
	               case when av.fl_ocorrencia_replantio is null then c.ds_nome_cobertura end
		";
		
		return $this->_db->fetchAll($select);

	}

	public function getAgendamentosProcessoSinistro($id_processo){
		$User = Zend_Auth::getInstance()->getIdentity();

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('ag'=>'sistema.agendamentos'), array('id as id_agendamento', 'id_tipo_vistoria', 'ds_turno as ds_turno_agendamento', "to_char(ag.dt_agendamento, 'dd/MM/yyyy') as dt_agendamento"));
		$select->join(array('va'=>'sistema.vistorias_agendamentos'), 'ag.id = va.id_agendamento', 'va.id_vistoria');
		$select->join(array('vp'=>'sinistro.vistorias_processos'), 'vp.id_vistoria = va.id_vistoria', null);
		$select->joinLeft(array('tv'=>'sistema.tipos_vistoria'), 'tv.id = ag.id_tipo_vistoria', 'ds_chave_tipos_vistoria');
		$select->joinLeft(array('st'=>'sistema.status'), 'st.id = ag.id_status', array('ds_chave as ds_status','ds_status as ds_status_agendamento'));
		$select->join(array('vc'=>'sistema.vistorias_coberturas'), 'vc.id_vistoria = va.id_vistoria', 'id_cobertura');
		$select->join(array('co'=>'produto.coberturas'), 'co.id = vc.id_cobertura', 'ds_nome_cobertura');
		$select->joinLeft(array('v'=>'sistema.vistorias'), 'v.id = vc.id_vistoria', 'id_tagh');
		$select->joinLeft(array('ve'=>'sistema.vistorias_empresas'), 'v.id = ve.id_vistoria', false);
		$select->joinLeft(array('e'=>'sistema.empresas'), 'e.id = ve.id_empresa', false);
		$select->joinLeft(array('vlf'=>'sistema.vistorias_laudos_finais'), 'vlf.id_vistoria = v.id', 'id_laudo_final');
		$select->joinLeft(array('lf'=>'sinistro.laudos_finais'), 'lf.id = vlf.id_laudo_final', array('lf.id_status'));
		$select->joinLeft(array('st2'=>'sistema.status'), 'st2.id = lf.id_status', array('ds_chave as ds_chave_status_vistoria_final'));
		$select->joinLeft(array('vlp'=>'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = v.id', 'id_laudo_preliminar');
		$select->joinLeft(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', array('lp.id_status'));
		$select->joinLeft(array('st3'=>'sistema.status'), 'st3.id = lp.id_status', array('ds_chave as ds_chave_status_vistoria_preliminar'));
		$select->where($this->getAdapter()->quoteInto('vp.id_processo = ?', $id_processo));
		$select->where('ag.fl_ativo = true');
		$select->order(array('ag.id'));

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

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

	public function getAgendamentoAberto($id_processo, $id_cobertura, $id_tipo_vistoria){
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('ag'=>'sistema.agendamentos'), 'id as id_agendamento');
		$select->join(array('va'=>'sistema.vistorias_agendamentos'), 'ag.id = va.id_agendamento', null);
		$select->join(array('vp'=>'sinistro.vistorias_processos'), 'vp.id_vistoria = va.id_vistoria', null);
		$select->joinLeft(array('tv'=>'sistema.tipos_vistoria'), 'tv.id = ag.id_tipo_vistoria', null);
		$select->joinLeft(array('st'=>'sistema.status'), 'st.id = ag.id_status', null);
		$select->join(array('vc'=>'sistema.vistorias_coberturas'), 'vc.id_vistoria = va.id_vistoria', null);
		//$select->join(array('co'=>'sistema.status'), 'co.id = vc.id_cobertura', null);
		
		if($id_tipo_vistoria == '3'){
    		$select->joinLeft(array('vlf'=>'sistema.vistorias_laudos_finais'), 'vlf.id_vistoria = va.id_vistoria', null);
    		$select->joinLeft(array('lf'=>'sinistro.laudos_finais'), 'lf.id = vlf.id_laudo_final', null);
    		$select->joinLeft(array('st2'=>'sistema.status'), 'st2.id = lf.id_status', null);
		}

		if($id_tipo_vistoria == '2'){
    		$select->joinLeft(array('vlp'=>'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = va.id_vistoria', null);
    		$select->joinLeft(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', null);
    		$select->joinLeft(array('st3'=>'sistema.status'), 'st3.id = lp.id_status', null);
		}
		
		$select->where($this->getAdapter()->quoteInto('vp.id_processo = ?', $id_processo));
		  
		if($id_tipo_vistoria == '2'){
		  //$select->where($this->getAdapter()->quoteInto("(st.ds_chave = 'AGUARDANDO_DATA')OR (st.ds_chave = 'AGENDADO' and ag.dt_agendamento > now() and st3.ds_chave='PENDENTE_LAUDO_PRELIMINAR')"));
		  $select->where($this->getAdapter()->quoteInto("(st.ds_chave = 'AGUARDANDO_DATA')OR (st.ds_chave = 'AGENDADO' and ag.dt_agendamento > now())", null), null);
		}
		if($id_tipo_vistoria == '3'){
		    $select->where($this->getAdapter()->quoteInto("(st.ds_chave = 'AGUARDANDO_DATA') OR (st.ds_chave = 'AGENDADO' and ag.dt_agendamento > now() and st2.ds_chave='PENDENTE_LAUDO_FINAL')", null), null);
		}
		$select->where($this->getAdapter()->quoteInto('vc.id_cobertura = ?', $id_cobertura));
		$select->where($this->getAdapter()->quoteInto('ag.id_tipo_vistoria = ?', $id_tipo_vistoria));
		$select->where('ag.fl_ativo = true');
		$select->order('ag.dt_criacao desc');
		$select->limit(1);
		//echo "<pre>"; die($select);
		return $this->_db->fetchOne($select);
	}

	public function abreAgendamento($data, $idAviso=''){

		$Model_Status                = new Sistema_Model_Status();
		$Model_Vistorias             = new Sistema_Model_Vistorias();
		$Model_VistoriasAgendamentos = new Sistema_Model_VistoriasAgendamentos();
		$Model_VistoriasCoberturas   = new Sistema_Model_VistoriasCoberturas();
		$Model_VistoriasEmpresas     = new Sistema_Model_VistoriasEmpresas();
		$Model_TiposVistoria         = new Sistema_Model_TipoVistoria();
		$Model_VistoriasProcessos    = new Sinistro2_Model_VistoriasProcessos();
		$Model_ProcessosEmpresas     = new Sinistro2_Model_ProcessosEmpresas();
		$Model_Avisos                = new Sinistro2_Model_AvisosSinistro();
		
		switch ($data['ds_tipo']){
			case 'PRELIMINAR':
			case 'FINAL':
				$data['id_tipo'] = $Model_TiposVistoria->getIdbyChave($data['ds_tipo']);

				/**
				 * Verifica se já não há agendamento em status 'AGUARDANDO_DATA'
				 * para o tipo de vistoria e cobertura em questão
				 *
				 * Se já existe, não cria um novo agendamento
				 */
				$id_agendamento = $this->getAgendamentoAberto($data['id_processo'], $data['id_cobertura'], $data['id_tipo']);

				if(!$id_agendamento || $data['id_vistoria']){
					//Cria uma nova Vistoria
					//Se for um Agendamento para Nova Avaliação, seta a nova Vistoria com o Id da Vistoria Reavaliada
					if($data['id_vistoria']){
						$id_vistoria = $Model_Vistorias->save(array('id_tipo' => $data['id_tipo'], 'id_vistoria_reavaliada' => $data['id_vistoria']));
					} else {
						$id_vistoria = $Model_Vistorias->save(array('id_tipo' => $data['id_tipo']));
					}

					// Cria relacionamento entre vistoria e cobertura
					$Model_VistoriasCoberturas->save(array('id_vistoria' => $id_vistoria, 'id_cobertura' => $data['id_cobertura']));

					// Salva dados do agendamento
					$id_agendamento = $this->save(array('id_tipo' => $data['id_tipo'], 'id_status' => $this->getIdStatus('AGUARDANDO_DATA')));

					// Cria relacionamento entre vistoria e agendamento
					$Model_VistoriasAgendamentos->save(array('id_vistoria' => $id_vistoria, 'id_agendamento' => $id_agendamento));

					// Cria relacionamento entre vistoria e processo
					$Model_VistoriasProcessos->save(array('id_vistoria' => $id_vistoria, 'id_processo' => $data['id_processo']));

					// Cria relacionamento entre vistoria e empresa vistoriadora
					$id_empresa = $Model_ProcessosEmpresas->getEmpresaByProcesso($data['id_processo']);
					$Model_VistoriasEmpresas->save(array('id_vistoria' => $id_vistoria, 'id_empresa' => $id_empresa));
					
				} else if($id_agendamento && $data['ds_tipo'] == 'FINAL') {
				    
				    //Vincula o aviso de Sinistro Aceito a um agendamento ja existente (AGENDADO) 
				    //e que não possui vistoria realizada (PENDENTE_LAUDO_FINAL)
				    $statusVistoriaFinal = $this->buscaStatusVistoriaAgendamento($id_agendamento);
				    if($statusVistoriaFinal['ds_chave'] == 'PENDENTE_LAUDO_FINAL'){
				        $VistoriasAvisos = new Sinistro2_Model_VistoriasAvisos();
				        $VistoriasAvisos->save(array('id_aviso' => $idAviso, 'id_vistoria' => $statusVistoriaFinal['id_vistoria']));
				    }
				    
				}
			break;

			case 'PREVIA':
			break;
		}


		return $id_vistoria;
	}

	public function buscaUltimoAgendamento($idProcesso, $dtAgendamento, $idAgendamento, $idTipoVistoria, $idCobertura) {
		$select = "
					SELECT
						to_char(max(a.dt_agendamento), 'dd/mm/yyyy')
					FROM
						sistema.agendamentos a
						INNER JOIN sistema.vistorias_agendamentos va on va.id_agendamento = a.id
						INNER JOIN sinistro.vistorias_processos vp on vp.id_vistoria = va.id_vistoria
						INNER JOIN sistema.vistorias_coberturas vc on vc.id_vistoria = va.id_vistoria
					WHERE
						vp.id_processo = {$idProcesso} and
						a.id <> {$idAgendamento} and
						a.id_status <> {$this->getIdStatus('AGENDAMENTO_CANCELADO')} and
						a.id_tipo_vistoria = {$idTipoVistoria} and
						vc.id_cobertura = {$idCobertura} and
						a.dt_agendamento < '".$dtAgendamento."'";

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

	public function buscaUltimoAgendamentoPreliminar($idProcesso, $idCobertura, $cancelamentoDispensaPreliminar = false) {
	    $status = [
          Sistema_Model_Status::AGENDAMENTO_AGENDADO,
          Sistema_Model_Status::AGENDAMENTO_AGUARDANDO_DATA,
          Sistema_Model_Status::AGENDAMENTO_AGENDAMENTO_CANCELADO
        ];

	    if ($cancelamentoDispensaPreliminar) {
            $status = [Sistema_Model_Status::AGENDAMENTO_AGENDAMENTO_CANCELADO];
        }

		$select = "
					SELECT
						a.id,
						va.id_vistoria,
						a.id_status
					FROM
						sistema.agendamentos a
						INNER JOIN sistema.vistorias_agendamentos va on va.id_agendamento = a.id
						INNER JOIN sinistro.vistorias_processos vp on vp.id_vistoria = va.id_vistoria
						INNER JOIN sistema.vistorias_coberturas vc on vc.id_vistoria = va.id_vistoria
					WHERE
						vp.id_processo = {$idProcesso} and
						a.id_status in(" . implode(', ', $status) . ") and
						a.id_tipo_vistoria = 2 and
						vc.id_cobertura = {$idCobertura}
					ORDER BY a.id desc";

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

	public function buscaUltimoAgendamentoFinal($idProcesso, $idCobertura, $stStatus) {
		$select = "
		SELECT
			a.id
		FROM
			sistema.agendamentos a
			INNER JOIN sistema.vistorias_agendamentos va on va.id_agendamento = a.id
			INNER JOIN sinistro.vistorias_processos vp on vp.id_vistoria = va.id_vistoria
			INNER JOIN sistema.vistorias_coberturas vc on vc.id_vistoria = va.id_vistoria
		WHERE
			vp.id_processo = {$idProcesso} and
			a.id_status = {$this->getIdStatus($stStatus)} and
			a.id_tipo_vistoria = 3 and
			vc.id_cobertura = {$idCobertura}";

		return $this->_db->fetchOne($select);
	}
	
	public function buscaStatusVistoriaAgendamento($idAgendamento, $tp_vistoria='') {
	    $select = "
		SELECT
			st.ds_chave, va.id_vistoria
		FROM
			sistema.agendamentos a
			INNER JOIN sistema.vistorias_agendamentos va on va.id_agendamento = a.id
			INNER JOIN sinistro.vistorias_processos vp on vp.id_vistoria = va.id_vistoria
			INNER JOIN sistema.vistorias_coberturas vc on vc.id_vistoria = va.id_vistoria
            INNER JOIN sistema.vistorias_laudos_finais vlf on vlf.id_vistoria = va.id_vistoria
            INNER JOIN sinistro.laudos_finais lf on lf.id = vlf.id_laudo_final
            INNER JOIN sistema.status st on st.id = lf.id_status
		WHERE
			a.id = {$idAgendamento}";
	    
	    return $this->_db->fetchRow($select);
	}

	public function verifyNovoAgendamentoPreliminar($idCobertura, $idProposta) {
	    $select =  "
            select
                count(a.id) as num_avisos_disponiveis
            from
                sinistro.avisos a,
                sistema.status st,
                sinistro.avisos_eventos ae,
                produto.coberturas_eventos ce
            where
                a.id_proposta = $idProposta and
                a.fl_ativo = true 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 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.ds_chave_tipos_vistoria = 'PRELIMINAR'
            )
	    ";

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

    }

    public function verifyNovoAgendamentoFinal($idCobertura, $idProposta, $flVistoriaPreliminar) {

    	$Model = new Sinistro2_Model_AvisosSinistro();
    	$Avisos = $Model->fetchAll("id_proposta=$idProposta");

        if ($flVistoriaPreliminar) {

        	foreach ($Avisos as $aviso){
        		if ($aviso->fl_dispensa_preliminar){
        			return true;
        		}
        	}

        	// Caso a cobertura possua necessidade de vistoria preliminar, verifica se algum laudo de vistoria preliminar já foi inserido
        	$select = $this->select()->setIntegrityCheck(false);
        	$select->from(array('v'=>'sistema.vistorias'), 'count(v.id) as nr_vistorias');
        	$select->join(array('tv'=>'sistema.tipos_vistoria'), "tv.id = v.id_tipo and tv.ds_chave_tipos_vistoria = 'PRELIMINAR'", null);
        	$select->join(array('p'=>'sinistro.processos'), 'p.id_proposta = '.$idProposta, null);
        	$select->join(array('vp'=>'sinistro.vistorias_processos'), 'vp.id_vistoria = v.id and vp.id_processo = p.id', null);
        	$select->join(array('vc'=>'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id and vc.id_cobertura = '.$idCobertura, null);
            $select->join(array('vlp'=>'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = v.id', null);
			$select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', null);

			$select->where('lp.fl_evento_nao_constatado = false');

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

        } else {

            $select =  "
                select
                    count(a.id) as num_avisos_disponiveis
                from
                    sinistro.avisos a,
                    sistema.status st,
                    sinistro.avisos_eventos ae,
                    produto.coberturas_eventos ce
                where
                    a.id_proposta = $idProposta and
                    a.fl_ativo = true 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 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 = 'FINAL'
                    )
            ";

            $avisos_disponiveis = $this->_db->fetchOne($select);

            //#1583 - Adicionada verificação para avisos com Queda de Parreiral,
            //para habilitar agendamento e digitação do laudo de Queda mesmo sem o evento Ventos Fortes
            foreach ($Avisos as $aviso){
            	$RowAviso = $Model->getRow($aviso->id);
            	if($RowAviso->fl_ocorrencia_queda_parreiral === true){
            		$avisos_disponiveis++;
            	}
            }

			if ($avisos_disponiveis > 0) {
				return true;
			} else {
				return false;
			}
		}
	}

    public function getVistoriasDisponiveisFinalComPreliminar($idCobertura, $idProposta){
        $data = '';

        if($idCobertura && $idProposta){
            $select =  "
                select
                	v.id,
                	to_char(v.dt_inicio, 'dd/MM/yyyy') as dt_vistoria
                from
                	sistema.vistorias v,
                	sistema.tipos_vistoria tv,
                	sistema.vistorias_coberturas vc,
                	sinistro.vistorias_avisos va,
                	sinistro.avisos a,
                	sistema.vistorias_laudos_preliminares vlp,
                	sinistro.laudos_preliminares lp
                where
                	v.fl_ativo = true and
                	v.fl_del = false and
                	tv.id = v.id_tipo and
                	tv.ds_chave_tipos_vistoria = 'PRELIMINAR' and
                	vc.id_vistoria = v.id and
                	vc.id_cobertura = $idCobertura and
                	va.id_vistoria = v.id and
                	a.id = va.id_aviso and
                	a.id_proposta = $idProposta and
                	vlp.id_vistoria = v.id and
                	lp.id = vlp.id_laudo_preliminar and
                	lp.fl_ativo = true and
                	lp.fl_del = false and
                	lp.fl_evento_nao_constatado = false
                group by
                	v.id,
                	v.dt_inicio
            ";
			return $this->_db->fetchAll($select);

		}
		return $data;
	}

    public function getVistoriasPrelimFinalComPreliminarByVistoria($idCobertura, $idProposta, $idVistoria){
        $data = '';

        if($idCobertura && $idProposta){

            $select =  "
                select
                	v.id,
                	to_char(v.dt_inicio, 'dd/MM/yyyy') as dt_vistoria,
                	true as checked
                from
                	sistema.vistorias v,
                	sistema.tipos_vistoria tv,
                	sistema.vistorias_coberturas vc,
                	sinistro.vistorias_avisos va,
                	sinistro.avisos a,
                	sistema.vistorias_laudos_preliminares vlp,
                	sinistro.laudos_preliminares lp
                where
                	v.fl_ativo = true and
                	v.fl_del = false and
                	tv.id = v.id_tipo and
                	tv.ds_chave_tipos_vistoria = 'PRELIMINAR' and
                	vc.id_vistoria = v.id and
                	vc.id_cobertura = $idCobertura and
                	va.id_vistoria = v.id and
                	a.id = va.id_aviso and
                	a.id_proposta = $idProposta and
                	vlp.id_vistoria = v.id and
                	lp.id = vlp.id_laudo_preliminar and
                	lp.fl_ativo = true and
                	lp.fl_del = false and
                	a.id in (
                		select
                			a.id
                		from
                			sistema.vistorias v,
                			sinistro.vistorias_avisos va,
                			sinistro.avisos a
                		where
        					v.id = $idVistoria and
                			v.fl_ativo = true and
                			v.fl_del = false and
                			va.id_vistoria = v.id and
                			a.id = va.id_aviso
                	)
                group by
                	v.id,
                	v.dt_inicio
            ";

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

		}
		return $data;
	}

    public function getNumAvisosDisponiveisFinalSemPreliminar($idCobertura, $idProposta) {
        $data = '';

        if($idCobertura && $idProposta){

            $select =  "
                select
                    count(a.id) as num_avisos_disponiveis
                from
                    sinistro.avisos a,
                    sistema.status st,
                    sinistro.avisos_eventos ae,
                    produto.coberturas_eventos ce
                where
                    a.id_proposta = $idProposta and
                    a.fl_ativo = true 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 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 = 'FINAL'
                )
            ";
            return $this->_db->fetchOne($select);

        }
        return $data;
    }

	public function getNumAvisosDisponiveisAgVistPreliminar($idCobertura,$idProposta){
		$data = '';
		if($idCobertura && $idProposta){
			$select = "
				select
					count(lpis.id_item_segurado)
				from
					sinistro.laudos_preliminares as lp join
					sinistro.laudos_preliminares_itens_segurados as lpis on lpis.id_laudo_preliminar = lp.id join
					sistema.vistorias_laudos_preliminares as vlp on vlp.id_laudo_preliminar = lp.id join
					sistema.vistorias_coberturas as vc on vc.id_vistoria = vlp.id_vistoria join
					sinistro.vistorias_avisos as va on va.id_vistoria = vc.id_vistoria join
					sinistro.avisos as a on a.id = va.id_aviso
				where
					a.id_proposta = $idProposta and
					vc.id_cobertura = $idCobertura and
					lpis.id_item_segurado not in (
						select
							lfis.id_item_segurado
						from
							sinistro.avisos a inner join
							sinistro.vistorias_avisos va on va.id_aviso = a.id inner join
							sistema.vistorias_coberturas vc on vc.id_vistoria = va.id_vistoria inner join
							sistema.vistorias_laudos_finais vlf on vlf.id_vistoria = va.id_vistoria inner join
							sinistro.laudos_finais lf on lf.id = vlf.id_laudo_final inner join
							sinistro.laudos_finais_itens_segurados lfis on lfis.id_laudo_final = lf.id
						where
							a.id_proposta = $idProposta and
							vc.id_cobertura = $idCobertura
						group by lfis.id_item_segurado
					)
			";
			$data = $this->_db->fetchOne($select);
		}
		return $data;
	}

	public function getAgendamentoByVistoria($idVistoria){
		$data = array();

		if($idVistoria){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('va'=>'sistema.vistorias_agendamentos'), ['id_vistoria']);
			$select->join(array('ag'=>'sistema.agendamentos'),'ag.id = va.id_agendamento', array('ag.id', 'ag.ds_turno', 'to_char(ag.dt_agendamento, \'DD/MM/YYYY\') as dt_agendamento', 'id_tipo_vistoria', 'id_status'));
			$select->where($this->getAdapter()->quoteInto('va.id_vistoria = ?',$idVistoria));
			$select->where('ag.fl_ativo = true');
			$data = $this->fetchRow($select)->toArray();
		}

		return $data;
	}

	public function checkPreliminarPendente($idCobertura, $idProcesso){
		$data = array();

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('vc'=>'sistema.vistorias_coberturas'), 'id_vistoria');
		$select->join(array('vp'=>'sinistro.vistorias_processos'), 'vp.id_vistoria = vc.id_vistoria', false);
		$select->join(array('va'=>'sistema.vistorias_agendamentos'), 'va.id_vistoria = vc.id_vistoria', false);
		$select->join(array('ag'=>'sistema.agendamentos'), 'ag.id = va.id_agendamento', false);
		$select->join(array('st'=>'sistema.status'), 'st.id = ag.id_status', false);
		$select->where($this->getAdapter()->quoteInto('vp.id_processo = ?', $idProcesso));
		$select->where($this->getAdapter()->quoteInto('vc.id_cobertura = ?', $idCobertura));
		$select->where($this->getAdapter()->quoteInto('ag.id_tipo_vistoria = 2', null));
		$select->where('st.ds_chave = \'AGUARDANDO_DATA\'');

		if (count($this->fetchRow($select))){
			return false;
		}

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p'=>'sinistro.processos'), false);
		$select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id_processo = p.id', false);
		$select->join(array('s'=>'sistema.status'), 'lp.id_status = s.id', 'ds_chave');
		$select->where($this->getAdapter()->quoteInto('p.id = ?', $idProcesso));
		$select->where($this->getAdapter()->quoteInto('lp.id_cobertura = ?', $idCobertura));
		$select->where('s.ds_chave = \'PENDENTE_LAUDO_PRELIMINAR\'');

		if (count($this->fetchRow($select))){
			return false;
		}
/*
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('p'=>'sinistro.processos'), false);
		$select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id_processo = p.id', 'lp.fl_evento_nao_constatado');
		$select->join(array('s'=>'sistema.status'), 'lp.id_status = s.id', false);
		$select->where($this->getAdapter()->quoteInto('p.id = ?', $idProcesso));
		$select->where($this->getAdapter()->quoteInto('lp.id_cobertura = ?', $idCobertura));
		$select->where('s.ds_chave != ?' , 'PENDENTE_LAUDO_PRELIMINAR');
		//$select->where('s.ds_chave != ?' , 'CANCELADO');
		$select->where('s.ds_chave != ?' , 'CANCELADO_CULPA_SEGURADO');
		$select->order('lp.dt_criacao desc');
		$select->limit(1);

		$fl_evento_nao_constatado = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($select);

		if ($fl_evento_nao_constatado){
			return false;
		}
*/
		return true;
	}


	public function getNumVistoriasFinaisDisponiveis($idCobertura, $idProposta){
		$data = '';

		if($idCobertura && $idProposta){
			$select = "
				select
					count(va.id_vistoria) as num_vistorias_disponiveis
				from
					sinistro.avisos av inner join
					sinistro.vistorias_avisos va on av.id = va.id_aviso inner join
					sinistro.avisos_eventos ae on av.id = ae.id_aviso inner join
					produto.coberturas_eventos ce on ae.id_evento = ce.id_evento inner join
					sistema.vistorias_coberturas vc on vc.id_cobertura = ce.id_cobertura and vc.id_vistoria = va.id_vistoria inner join
					sistema.vistorias_laudos_finais vlf on vlf.id_vistoria = vc.id_vistoria inner join
					sistema.vistorias v on v.id = vc.id_vistoria inner join
					sistema.tipos_vistoria tp on tp.id = v.id_tipo
				where
					vc.id_cobertura = $idCobertura and
					av.id_proposta = $idProposta and
					av.fl_ativo = true and
					tp.ds_chave_tipos_vistoria = 'FINAL'
			";
			$data = $this->_db->fetchOne($select);
		}

		return $data;
	}

	public function delete($idAgendamento) {
		$select = "	delete from	{$this->_schema}.{$this->_name} where id = $idAgendamento";
		$this->_db->query($select);
	}

	public function deleteDataAgendamento($idAgendamento){

		$this->_db->query("UPDATE sistema.agendamentos SET dt_agendamento = null, ds_turno = null WHERE id = ".$idAgendamento);

	}

	public function getStatus($idAgendamento) {
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('sa' => 'sistema.agendamentos'), false);
		$select->join(array('ss' => 'sistema.status'), 'sa.id_status = ss.id', 'ds_chave');
		$select->where('sa.id = ?', $idAgendamento);

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

}
