<?php

class Sinistro_Model_Row_Processo extends Agro_Db_Table_Row_Abstract {

	// Retorna um ROW da proposta relacionada ao processo
	public function proposta() {
		$Propostas = new Seguro_Model_Propostas();
		return $Propostas->get($this->id_proposta);
	}

	public function proponente() {
		$PropostasProponentes = new Seguro_Model_PropostasProponentes();
		return $PropostasProponentes->get($this->id_proposta);
	}

	// Retorna o Laudo Final referente ao processo
	public function laudo($tipo) {
		switch ($tipo) {
			case 'preliminar':
				$Laudo = new Sinistro_Model_LaudosPreliminares();
				return $Laudo->fetchRow("id_processo = ".$this->id);

			case 'final':
				$Laudo = new Sinistro_Model_LaudosFinais();
				return $Laudo->fetchRow("id_processo = ".$this->id);

			default: return false;
		}
	}

	// Retorna os itens segurados
	public function itens_segurados(array $fields=null) {
		if ($fields == null) $fields = 'id';

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('i' => 'seguro.itens_segurados'), $fields);
		$Select->where('id_proposta = ?', $this->id_proposta);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	// retorna a empresa do processo
	public function empresa($returnRow=false) {
		if ($returnRow) {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pe' => 'sinistro.processos_empresas'), null);
			$Select->join(array('e' => 'sistema.empresas'), 'pe.id_empresa = e.id');
			$Select->where("pe.id_processo = ?", $this->id);
			$Select->where("pe.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);

		} else {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pe' => 'sinistro.processos_empresas'), null);
			$Select->join(array('e' => 'sistema.empresas'), 'pe.id_empresa = e.id', 'id');
			$Select->where("pe.id_processo = ?", $this->id);
			$Select->where("pe.fl_ativo = true");

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		}
	}

	// Retorna um ROW da proposta relacionada ao processo
	public function arquivos() {

		$User = Zend_Auth::getInstance()->getIdentity();

		$Processo = new Sinistro_Model_Processos();
		$Proponente = $Processo->getProponenteProcesso($this->id);

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pa'=>'sinistro.processos_arquivos'), '*');
		$select->join(array('ta'=>'sistema.tipo_arquivo_processo'), 'pa.id_tipo_arquivo = ta.id', array('ds_tipo_arquivo','ds_chave_tipo_arquivo'));
		$select->join(array('p'=>'sinistro.processos'),'p.id = pa.id_processo',false);
		$select->join(array('pp'=>'seguro.propostas_proponentes'),'pp.id_proposta = p.id_proposta',false);
		$select->join(array('pr'=>'seguro.propostas'),'pr.id = p.id_proposta',false);
		$select->join(array('pe'=>'seguro.propostas_endosso'),'pe.id_proposta = pr.id',false);
		
		$select->where('pe.fl_proposta_vigente = true');
		$select->where('pa.fl_del = false');
		$select->where('pa.fl_ativo = true');

		$select->where('pp.cpf_cnpj = ?', $Proponente['cpf_cnpj']);
		if ($User->tp_usuario == 'C') {
		    $select->where("ta.ds_chave_tipo_arquivo != 'LIQUIDACAO'");
		}

		$select->order(array('p.id desc', 'pa.dt_criacao', 'ta.ds_tipo_arquivo'));

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);
	}

	// Retorna um ROW da proposta relacionada ao processo
	public function arquivos_observacoes() {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('po' => 'sinistro.processos_observacoes_arquivos'), array('po.ds_observacao_arquivos',"to_char(po.dt_criacao, 'DD/MM/YYYY') as dt_entrada"));
		$select->join(array('f'  => 'sistema.funcionarios'),'f.id_usuario = po.id_usuario_criacao','f.ds_nome_funcionario');
		$select->where("po.id_processo = ?", $this->id);
		$select->where("po.fl_ativo = true");
		$select->order(array('po.dt_criacao desc'));

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($select);
	}

	// Retorna a area das unidades seguradas
	public function area() {
		$Propostas = new Seguro_Model_Propostas();
		$Row = $Propostas->find($this->id_proposta)->current();

		return $Row->area();
	}

	// Retorna os avisos do processo
	public function avisos() {
		$Aviso = new Sinistro_Model_AvisosSinistro();
		return $Aviso->getAvisosByProposta($this->id_proposta, 'ACEITO');
	}

	// Retorna as observacoes do processo
	public function observacoes() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('po' => 'sinistro.processos_observacoes'), array('po.ds_observacao',"to_char(po.dt_criacao, 'DD/MM/YYYY') as dt_entrada"));
		$Select->join(array('f'  => 'sistema.funcionarios'),'f.id_usuario = po.id_usuario_criacao','f.ds_nome_funcionario');
		$Select->where("po.id_processo = ?", $this->id);
		$Select->where("po.fl_ativo = true");
		$Select->order('po.dt_criacao desc');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	// Retorna as coberturas do processo
	public function coberturas() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('av' => 'sinistro.avisos'), array());
		$Select->join(array('pro' => 'sinistro.processos'), 'pro.id_proposta = av.id_proposta', null);
		$Select->join(array('pe' => 'sinistro.processos_empresas'), 'pe.id_processo = pro.id and pe.fl_ativo = true', array('id_empresa'));
		$Select->join(array('pc' => 'seguro.propostas_coberturas'), 'pc.id_proposta = av.id_proposta', null);
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = pc.id_cobertura', array('id as id_cobertura', 'ds_nome_cobertura'));
		$Select->join(array('ae' => 'sinistro.avisos_eventos'), 'ae.id_aviso = av.id', null);
		$Select->join(array('ce' => 'produto.coberturas_eventos'), 'ce.id_evento = ae.id_evento and ce.id_cobertura = c.id', null);
		$Select->join(array('pr' => 'seguro.propostas'), 'pr.id = av.id_proposta', null);
		$Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
		$Select->join(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_cobertura = c.id and pdc.id_produto = pr.id_produto', array('fl_vistoria_preliminar', 'fl_vistoria_final', 'id_tipo_liquidacao'));
		//$Select->where('pdc.fl_vistoria_preliminar is true OR pdc.fl_vistoria_final is true');
		$Select->where('pdc.fl_cobertura_dependente = false');
		$Select->where('av.id_proposta = ?', $this->id_proposta);
		$Select->where('c.fl_ativo = true');
		$Select->group(array('c.id', 'c.ds_nome_cobertura', 'pdc.fl_vistoria_preliminar', 'pdc.fl_vistoria_final', 'pdc.id_tipo_liquidacao', 'pe.id_empresa'));
		$Select->order(array('c.ds_nome_cobertura'));

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	// Retorna as coberturas com liquidacao cadastrada
	public function coberturasComLiquidacao() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('pro' => 'sinistro.processos'), array());
		$Select->join(array('pe' => 'sinistro.processos_empresas'), 'pe.id_processo = pro.id and pe.fl_ativo = true', array('id_empresa'));
		$Select->join(array('pc' => 'seguro.propostas_coberturas'), 'pc.id_proposta = pro.id_proposta', null);
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = pc.id_cobertura', array('id as id_cobertura', 'ds_nome_cobertura'));
		$Select->join(array('pr' => 'seguro.propostas'), 'pr.id = pro.id_proposta', null);
		$Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
		$Select->join(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_cobertura = c.id and pdc.id_produto = pr.id_produto', array('fl_vistoria_preliminar', 'fl_vistoria_final', 'id_tipo_liquidacao', 'fl_cobertura_principal'));
		$Select->joinLeft(array('l' => 'sinistro.liquidacoes'), 'l.id_processo = pro.id', false);
		$Select->joinLeft(array('lisc' => 'sinistro.liquidacoes_itens_segurados_coberturas'), 'lisc.id_liquidacao = l.id and lisc.id_cobertura = c.id', false);
		$Select->where('pdc.fl_cobertura_dependente = false');
		$Select->where('pro.id_proposta = ?', $this->id_proposta);
		$Select->where('c.fl_ativo = true');
		$Select->group(array('c.id', 'c.ds_nome_cobertura', 'pdc.fl_vistoria_preliminar', 'pdc.fl_vistoria_final', 'pdc.id_tipo_liquidacao', 'pe.id_empresa', 'fl_cobertura_principal'));
		$Select->order(array('c.ds_nome_cobertura'));
	
		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}	
	
	// Retorna a quantidade de reembolsos de uma cobertura
	public function reembolsos() {
		$TipoLiquidacao = new Sinistro_Model_TipoLiquidacao();

		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('av' => 'sinistro.avisos'), null);
		$Select->join(array('pro' => 'sinistro.processos'), 'pro.id_proposta = av.id_proposta', null);
		$Select->join(array('pe' => 'sinistro.processos_empresas'), 'pe.id_processo = pro.id and pe.fl_ativo = true', null);
		$Select->join(array('pc' => 'seguro.propostas_coberturas'), 'pc.id_proposta = av.id_proposta', null);
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = pc.id_cobertura', null);
		$Select->join(array('ae' => 'sinistro.avisos_eventos'), 'ae.id_aviso = av.id', null);
		$Select->join(array('ce' => 'produto.coberturas_eventos'), 'ce.id_evento = ae.id_evento and ce.id_cobertura = c.id', null);
		$Select->join(array('pr' => 'seguro.propostas'), 'pr.id = av.id_proposta', null);
		$Select->join(array('pd' => 'produto.produtos'), 'pd.id = pr.id_produto', null);
		$Select->join(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_cobertura = c.id and pdc.id_produto = pr.id_produto', array('count(id_tipo_liquidacao)'));
		$Select->where('pdc.fl_vistoria_preliminar is true OR pdc.fl_vistoria_final is true');
		$Select->where('pdc.id_tipo_liquidacao = ?', $TipoLiquidacao->getByKey("LIQ04"));
		$Select->where('av.id_proposta = ?', $this->id_proposta);
		$Select->where('pdc.fl_cobertura_dependente = false');
		$Select->where('c.fl_ativo = true');

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function vistoriasPreliminares($idCobertura, $idEmpresa=null) {
		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array('a' => 'sinistro.avisos'), null);
		$Select->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_aviso = a.id', null);
		$Select->join(array('v' => 'sistema.vistorias'), 'v.id = va.id_vistoria and v.fl_ativo = true and v.fl_del = false', array('id as id_vistoria', 'dt_inicio as dt_inicio_vistoria'));
		$Select->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id', 'id_cobertura');
		$Select->join(array('tv' => 'sistema.tipos_vistoria'), 'tv.id = v.id_tipo', null);
		$Select->join(array('vag' => 'sistema.vistorias_agendamentos'), 'vag.id_vistoria = v.id', null);
		$Select->join(array('ag' => 'sistema.agendamentos'), 'ag.id = vag.id_agendamento', array('id as id_agendamento', 'dt_agendamento', 'ds_turno'));
		$Select->join(array('ve' => 'sistema.vistorias_empresas'), 've.id_vistoria = v.id', null);
		$Select->joinLeft(array('e' => 'sistema.empresas'), 've.id_empresa = e.id', 'ds_nome_fantasia');
		$Select->joinLeft(array('vlp' => 'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = v.id', null);
		$Select->joinLeft(array('lp' => 'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', 'id as id_laudo_preliminar');
		$Select->joinLeft(array('s' => 'sistema.status'), 'lp.id_status = s.id', array('ds_chave as status'));
		$Select->where("tv.ds_chave_tipos_vistoria = 'PRELIMINAR'");
		$Select->where("a.id_proposta = ?", $this->id_proposta);
		$Select->where("vc.id_cobertura = ?", $idCobertura);

		if ($idEmpresa) {
			$Select->where("e.id = ?", $idEmpresa);
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function vistoriasFinais($idCobertura, $idEmpresa=null) {
		$Select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$Select->from(array('a' => 'sinistro.avisos'), null);
		$Select->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_aviso = a.id', null);
		$Select->join(array('v' => 'sistema.vistorias'), 'v.id = va.id_vistoria', array('dt_inicio as dt_inicio_vistoria'));
		$Select->joinLeft(array('vlf' => 'sistema.vistorias_laudos_finais'), 'vlf.id_vistoria = v.id', null);
		$Select->joinLeft(array('lf' => 'sinistro.laudos_finais'), 'lf.id = vlf.id_laudo_final', array('id as id_laudo_final'));
		$Select->joinLeft(array('s' => 'sistema.status'), 'lf.id_status = s.id', array('ds_chave as status'));
		$Select->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id', array('id_vistoria'));
		$Select->join(array('tv' => 'sistema.tipos_vistoria'), 'tv.id = v.id_tipo', null);
		$Select->join(array('c' => 'produto.coberturas'), 'c.id = vc.id_cobertura', array('id as id_cobertura'));
		$Select->join(array('vag' => 'sistema.vistorias_agendamentos'), 'vag.id_vistoria = v.id', null);
		$Select->join(array('ag' => 'sistema.agendamentos'), 'ag.id = vag.id_agendamento', array('id as id_agendamento', 'dt_agendamento', 'ds_turno'));
		$Select->join(array('ve' => 'sistema.vistorias_empresas'), 've.id_vistoria = v.id', null);
		$Select->join(array('e' => 'sistema.empresas'), 've.id_empresa = e.id', array('ds_nome_fantasia'));
		$Select->join(array('lfis' => new Zend_Db_Expr("(SELECT id_laudo_final, to_char(max(dt_vistoria),'DD/MM/YYYY') AS dt_inicio_vistoria FROM sinistro.laudos_finais_itens_segurados GROUP BY id_laudo_final)")), 'lfis.id_laudo_final = lf.id', 'dt_inicio_vistoria');
		$Select->where('tv.ds_chave_tipos_vistoria = ?', 'FINAL');
		$Select->where('a.id_proposta = ?', $this->id_proposta);
		$Select->where('vc.id_cobertura = ?', $idCobertura);
		$Select->group(array('c.id', 'vc.id_vistoria', 'ag.id', 'ag.dt_agendamento', 'ag.ds_turno', 'lf.id', 'v.dt_inicio', 'e.ds_nome_fantasia', 's.ds_chave', 'lfis.dt_inicio_vistoria'));

		if ($idEmpresa) {
			$Select->where("e.id = ?", $idEmpresa);
		}

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function encerramentosProposta() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from(array('sinistro.avisos_encerramento'), 'count(*)');
		$Select->where('id_proposta = ?', $this->id_proposta);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
	}

	public function iniciosColheita() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from('sinistro.avisos_inicio', array('id', 'dt_inicio_colheita', 'dt_criacao'));
		$Select->where('id_proposta = ?', $this->id_proposta);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function encerramentosColheita() {
		$Select = $this->select()->setIntegrityCheck(false);
		$Select->from('sinistro.avisos_encerramento', array('id', 'dt_encerramento_colheita', 'dt_criacao'));
		$Select->where('id_proposta = ?', $this->id_proposta);

		return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
	}

	public function avisosDisponiveisPreliminar($idCobertura) {
		$Agendamento = new Sistema_Model_Agendamentos();

		return $Agendamento->getNumAvisosDisponiveisPreliminar($idCobertura, $this->id_proposta);
	}

	public function avisosDisponiveisFinal($idCobertura, $vistoriaPreliminar) {
		$Agendamento = new Sistema_Model_Agendamentos();

		if ($vistoriaPreliminar) {
	    	return $Agendamento->getNumAvisosDisponiveisFinalComPreliminar($idCobertura, $this->id_proposta);
	    } else {
	    	return $Agendamento->getNumAvisosDisponiveisFinalSemPreliminar($idCobertura, $this->id_proposta);
	    }
	}

	public function criaLaudoFinal($idCobertura, $idVistoria) {
		$VistoriaLaudosFinais = new Sistema_Model_VistoriasLaudosFinais();
		$LaudosFinais = new Sinistro_Model_LaudosFinais();

		try {
			Agro_Db_Table_Abstract::getDefaultAdapter()->beginTransaction();

			$idLaudoFinal = $LaudosFinais->save(array(
				'id_status' => $LaudosFinais->getIdStatus("NAO_DIGITADO", "LF"),
				'id_cobertura' => $idCobertura,
				'id_processo' => $this->id
			));

			$VistoriaLaudosFinais->save(array(
				'id_laudo_final' => $idLaudoFinal,
				'id_vistoria' => $idVistoria
			));

			Agro_Db_Table_Abstract::getDefaultAdapter()->commit();
			return $idLaudoFinal;
		} catch (Exception $e) {
			Agro_Db_Table_Abstract::getDefaultAdapter()->rollBack();
			return false;

		}
	}

	public function busca_vistorias_disponiveis($values) {
		try {
			$fl_vistoria_preliminar = $this->fl_vistoria_preliminar($values['id_cobertura']);
			$sqlVistoria = null;

			if ($fl_vistoria_preliminar) {
				$notIn = $this->select()->setIntegrityCheck(false);
				$notIn->from(array('v' => 'sistema.vistorias'), null);
				$notIn->join(array('tv' => 'sistema.tipos_vistoria'), 'tv.id = v.id_tipo', null);
				$notIn->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id', null);
				$notIn->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_vistoria = v.id', null);
				$notIn->join(array('a' => 'sinistro.avisos'), 'a.id = va.id_aviso', 'id');
				$notIn->where('tv.ds_chave_tipos_vistoria = ?', 'FINAL');
				$notIn->where('vc.id_cobertura = ?', $values['id_cobertura']);
				$notIn->where('a.id_proposta = ?', $this->id_proposta);
				$notIn->where('v.fl_ativo = true');
				$notIn->where('v.fl_del = false');

				// Busca os avisos
				$sqlAviso = $this->select()->setIntegrityCheck(false);
				$sqlAviso->from(array('v' => 'sistema.vistorias'), array('id', 'dt_inicio as dt_sinistro', 'is_false() as checked'));
				$sqlAviso->join(array('tv' => 'sistema.tipos_vistoria'), 'tv.id = v.id_tipo', null);
				$sqlAviso->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id', null);
				$sqlAviso->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_vistoria = v.id', null);
				$sqlAviso->join(array('a' => 'sinistro.avisos'), 'a.id = va.id_aviso', null);
				$sqlAviso->join(array('vlp' => 'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = v.id', null);
				$sqlAviso->join(array('lp' => 'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', null);
				$sqlAviso->where('tv.ds_chave_tipos_vistoria = ?', 'PRELIMINAR');
				$sqlAviso->where('lp.fl_evento_nao_constatado = false');
				$sqlAviso->where('vc.id_cobertura = ?', $values['id_cobertura']);
				$sqlAviso->where('a.id_proposta = ?', $this->id_proposta);
				$sqlAviso->where('a.id not in (?)', $notIn);
				$sqlAviso->where('lp.fl_ativo = true');
				$sqlAviso->where('v.fl_ativo = true');
				$sqlAviso->where('v.fl_del = false');
				$sqlAviso->where('lp.fl_del = false');
				$sqlAviso->group(array('v.id', 'v.dt_inicio'));

				if ($values['id_vistoria']) {
					$notIn = $this->select()->setIntegrityCheck(false);
					$notIn->from(array('v' => 'sistema.vistorias'), null);
					$notIn->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_vistoria = v.id', null);
					$notIn->join(array('a' => 'sinistro.avisos'), 'a.id = va.id_aviso', 'id');
					$notIn->where('v.id = ?', $values['id_vistoria']);
					$notIn->where('v.fl_ativo = true');
					$notIn->where('v.fl_del = false');

					$sqlVistoria = $this->select()->setIntegrityCheck(false);
					$sqlVistoria->from(array('v' => 'sistema.vistorias'), array('id', 'dt_inicio as dt_sinistro', 'is_true() as checked'));
					$sqlVistoria->join(array('tv' => 'sistema.tipos_vistoria'), 'tv.id = v.id_tipo', null);
					$sqlVistoria->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = v.id', null);
					$sqlVistoria->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_vistoria = v.id', null);
					$sqlVistoria->join(array('a'   => 'sinistro.avisos'), 'a.id = va.id_aviso', null);
					$sqlVistoria->join(array('vlp' => 'sistema.vistorias_laudos_preliminares'), 'vlp.id_vistoria = v.id', null);
					$sqlVistoria->join(array('lp'   => 'sinistro.laudos_preliminares'), 'lp.id = vlp.id_laudo_preliminar', null);
					$sqlVistoria->where('tv.ds_chave_tipos_vistoria = ?', 'PRELIMINAR');
					$sqlVistoria->where('a.id_proposta = ?', $this->id_proposta);
					$sqlVistoria->where('vc.id_cobertura = ?', $values['id_cobertura']);
					$sqlVistoria->where('a.id in (?)', $notIn);
					$sqlVistoria->where('lp.fl_ativo = true');
					$sqlVistoria->where('v.fl_ativo = true');
					$sqlVistoria->where('lp.fl_del = false');
					$sqlVistoria->where('v.fl_del = false');
					$sqlVistoria->group(array('v.id', 'v.dt_inicio'));
				}

				// Verifica se existe os dois selects e faz um union deles
				if ($sqlVistoria && $sqlAviso) {
					$Select = $this->select()->setIntegrityCheck(false)->union(array($sqlAviso, $sqlVistoria));
					return  Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				} else {
					return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($sqlAviso);
				}
			} else {
				$sqlAviso = $this->select()->setIntegrityCheck(false)->distinct(true);
				$sqlAviso->from(array('a' => 'sinistro.avisos'), array('id', 'dt_sinistro', 'is_false() as checked'));
				$sqlAviso->join(array('st' => 'sistema.status'), 'st.id = a.id_status', null);
				$sqlAviso->join(array('ae' => 'sinistro.avisos_eventos'), 'ae.id_aviso = a.id', null);
				$sqlAviso->join(array('ce' => 'produto.coberturas_eventos'), 'ce.id_evento = ae.id_evento', null);
				$sqlAviso->where('a.id_proposta = ?', $this->id_proposta);
				$sqlAviso->where('ce.id_cobertura = ?', $values['id_cobertura']);
				$sqlAviso->where('st.ds_chave = ?', 'ACEITO');
				$sqlAviso->group(array('a.id', 'a.dt_sinistro'));

				if ($values['id_vistoria']) {
					$sqlVistoria = $this->select()->setIntegrityCheck(false)->distinct(true);
					$sqlVistoria->from(array('a'  => 'sinistro.avisos'), array('id', 'dt_sinistro', 'is_true() as checked'));
					$sqlVistoria->join(array('va' => 'sinistro.vistorias_avisos'), 'va.id_aviso = a.id', null);
					$sqlVistoria->join(array('vc' => 'sistema.vistorias_coberturas'), 'vc.id_vistoria = va.id_vistoria', null);
					$sqlVistoria->where('vc.id_cobertura = ?', $values['id_cobertura']);
					$sqlVistoria->where('va.id_vistoria = ?', $values['id_vistoria']);
					$sqlVistoria->where('a.id_proposta  = ?', $this->id_proposta);
					$sqlVistoria->group(array('a.id','dt_sinistro'));
				}

				// Verifica se existe os dois selects e faz um union deles
				if ($sqlVistoria && $sqlAviso) {
					$Select = $this->select()->setIntegrityCheck(false)->union(array($sqlAviso, $sqlVistoria));
					return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($Select);
				} else {
					return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchAll($sqlAviso);
				}
			}
		} catch (Exception $e) {
			die($e);
		}
	}

	public function fl_vistoria_preliminar($idCobertura) {
		try {
			$Select = $this->select()->setIntegrityCheck(false);
			$Select->from(array('pc' => 'sinistro.processos'), null);
			$Select->join(array('pp' => 'seguro.propostas'), 'pc.id_proposta = pp.id', null);
			$Select->join(array('pd' => 'produto.produtos'), 'pp.id_produto = pd.id', null);
			$Select->join(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_produto = pd.id', 'fl_vistoria_preliminar');
			$Select->join(array('sf' => 'produto.safras'), 'pd.id_safra = sf.id', null);
			$Select->join(array('plf' => 'produto.produtos_coberturas_laudo_final'), 'plf.id_produto = pd.id', null);
			$Select->where('pdc.id_cobertura = ?', $idCobertura);
			$Select->where('pc.id = ?', $this->id);

			return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne($Select);
		} catch (Exception $e) {
			die($e->getMessage());
		}
	}

	public function questionarios(){
		$Model = new Produto_Model_Atributos();
    	return $Model->getGrupoAtributoSinistro('QUESTIONARIO_SINISTRO');
	}

    public function respostas($chave='') {
    	if ($chave == '') {
	    	$Model = new Sinistro_Model_ProcessosQuestionarios();
	    	return $Model->getRespostas($this->id);
    	} else {
    		$Model = new Sinistro_Model_ProcessosQuestionarios();
	    	return $Model->getResposta($this->id, $chave);
    	}
    }

    public function atributos($tipo='', $chave='') {
    	$Model = new Produto_Model_Atributogrupos();
    	$Atributos = $Model->getAtributosProposta($this, $tipo, '');

    	if (is_array($Atributos)) {
    		$att = array();
    		foreach ($Atributos as $Atributo) {
    			$att[$Atributo['ds_chave_rn']] = $Atributo['ds_valor'];
    		}
    	}

    	if ($chave) {
    		return $att[$chave];
    	}

    	return $att;
    }

	/**
	 * Libera cadastro de encerramento de colheita de acordo com as seguintes regras:
	 * - Se a cobertura principal tiver laudo preliminar só é liberado após o cadastro deste.
	 * - Não havendo laudo preliminar o cadastro de encerramento é liberado
	 */
	public function permitirEncerramentoColheita(){
		$permitir = true;

		$ModelProposta = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		$Proposta = $ModelProposta->find($this->id_proposta)->current();

		$CoberturaPrincipal = $ModelProdutoCobertura->getCoberturaPrincipal($Proposta->id_produto);

		if ($CoberturaPrincipal->fl_vistoria_preliminar){

			if (count($this->vistoriasPreliminares($Proposta->coberturaPrincipal())) <= 0){
				$permitir = false;
			}

		}

		return $permitir;
	}

	public function possuiVistoriaPreliminar(){
		$permitir = false;

		$ModelProposta = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		$Proposta = $ModelProposta->find($this->id_proposta)->current();

		$CoberturaPrincipal = $ModelProdutoCobertura->getCoberturaPrincipal($Proposta->id_produto);

		if ($CoberturaPrincipal->fl_vistoria_preliminar){

			$permitir = true;

		}

		return $permitir;
	}

	public function liquidacoes(){
		$ModelLiquidacoes = new Sinistro_Model_Liquidacoes();
		$ModelLiquidacoesISC = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();
		$ModelLiquidacoesISCLF = new Sinistro_Model_LiquidacoesItensSeguradosCoberturasLF();
		$ModelLiquidacoesPrevPagto = new Nobre_Model_LiquidacoesPrevisaoPagamento();

		$ModelProposta = new Seguro_Model_Propostas();
		$ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

		$User = new Sistema_Model_Usuarios();
		$Status = new Sistema_Model_Status();
		$TipoLiquidacao = new Sinistro_Model_TipoLiquidacao();
		$Cobertura = new Produto_Model_Coberturas();

		$Proposta = $ModelProposta->find($this->id_proposta)->current();

		$CoberturaPrincipal = $ModelProdutoCobertura->getCoberturaPrincipal($Proposta->id_produto);

		$result = array();

		$Liquidacoes = $ModelLiquidacoes->fetchAll("id_processo = {$this->id}");

		foreach ($Liquidacoes as $liquidacao){
			$parcial["liquidou_cobertura_principal"] = false;

			$parcial = array(
				"id_liquidacao" 				=> $liquidacao->id,
				"tp_liquidacao" 				=> $liquidacao->tp_liquidacao,
				"id_status"						=> $liquidacao->id_status,
				"status"						=> $Status->getNameById($liquidacao->id_status),
				"ds_arquivo_liquidacao_manual"	=> $liquidacao->ds_arquivo_liquidacao_manual,
				"id_tipo_liquidacao"			=> $liquidacao->id_tipo_liquidacao,
				"tipo_liquidacao"				=> ($liquidacao->id_tipo_liquidacao ? $TipoLiquidacao->getNameById($liquidacao->id_tipo_liquidacao) : "Não informado") ,
				"ds_observacao"					=> $liquidacao->ds_observacao,
				"dt_criacao"					=> $liquidacao->dt_criacao,
				"id_usuario_criacao"			=> $liquidacao->id_usuario_criacao,
				"usuario_criacao"				=> $User->getNameById($liquidacao->id_usuario_criacao)
			);

			$parcial["liquidacoes_itens_segurados_coberturas"] = array();

			$parcial["total_prejuizo"] = 0.0;
			$parcial["total_franquia"] = 0.0;
			$parcial["total_indenizacao"] = 0.0;
			$parcial["id_coberturas"] = array();
			$parcial["coberturas"] = array();

			$LiquidacoesISC = $ModelLiquidacoesISC->fetchAll("id_liquidacao={$liquidacao->id}", "dt_criacao");
			foreach ($LiquidacoesISC as $isc){
				$parcaialISC = array(
					"id_liquidacao_item_segurado_cobertura" => $isc->id,
					"id_item_segurado"						=> $isc->id_item_segurado,
					"id_cobertura"							=> $isc->id_cobertura,
					"cobertura"								=> $Cobertura->getNameById($isc->id_cobertura),
					"cobertura_principal"					=> ($isc->id_cobertura == $CoberturaPrincipal->id ? true : false),
					"vl_percent_franquia"					=> $isc->vl_percent_franquia,
					"vl_franquia"							=> $isc->vl_franquia,
					"vl_indenizacao"						=> $isc->vl_indenizacao,
					"vl_prejuizo_total"						=> $isc->vl_prejuizo_total
				);

				if ($isc->id_cobertura == $CoberturaPrincipal->id){
					$parcial["liquidou_cobertura_principal"] = true;
				}

				if(!in_array($isc->id_cobertura, $parcial["id_coberturas"])){
					$parcial["id_coberturas"][] = $isc->id_cobertura;
					$parcial["coberturas"][] = $Cobertura->getNameById($isc->id_cobertura);
				}

				$parcial["total_prejuizo"] += $isc->vl_prejuizo_total;
				$parcial["total_franquia"] += $isc->vl_franquia;
				$parcial["total_indenizacao"] += $isc->vl_indenizacao;

				$parcaialISC["liquidacoes_itens_segurados_coberturas_lf"] = array();

				$LiquidacoesISCLF = $ModelLiquidacoesISCLF->fetchAll("id_liquidacoes_itens_segurados_coberturas={$isc->id}");
				foreach ($LiquidacoesISCLF as $isclf){
					$parcaialISC["liquidacoes_itens_segurados_coberturas_lf"][] = array(
						"id_liquidacao_item_segurado_cobertura_lf"	=> $isclf->id,
						"id_laudo_final_item_segurado"				=> $isclf->id_laudo_final_item_segurado,
						"vl_prejuizo"								=> $isclf->vl_prejuizo,
						"vl_percent_dano"							=> $isclf->vl_percent_dano
					);
				}

				$parcial["liquidacoes_itens_segurados_coberturas"][] = $parcaialISC;
			}

			$parcial["liquidacoes_previsao_pagamento"] = array();

			$LiquidacoesPrevPagto = $ModelLiquidacoesPrevPagto->fetchAll("id_liquidacao={$liquidacao->id}", "dt_criacao");

			$isLiqParcial = false;
			foreach ($LiquidacoesPrevPagto as $pg){
				$parcial["liquidacoes_previsao_pagamento"][] = array(
					"id_liquidacoe_previsao_pagamento" 	=> $pg->id,
					"dt_pagamento"						=> $pd->dt_pagamento,
					"vl_pagamento"						=> $pg->vl_pagamento,
					"dt_confirmacao_pagamento"			=> $pg->dt_confirmacao_pagamento,
					"fl_subvencao_descontada"			=> $pg->fl_subvencao_descontada,
					"dt_criacao"						=> $pg->dt_criacao,
					"id_usuario_criacao"				=> $pg->id_usuario_criacao,
					"usuario_criacao"					=> $User->getNameById($pg->id_usuario_criacao),
					"dt_alteracao"						=> $pg->dt_alteracao,
					"id_usuario_alteracao"				=> $pg->id_usuario_alteracao,
					"usuario_alteracao"					=> $User->getNameById($pg->id_usuario_alteracao),

				);

				$isLiqParcial = $pg->fl_subvencao_descontada;
			}

			$parcial["parcial_ou_final"] = ($isLiqParcial ? "Parcial" : "Final");
			$result[] = $parcial;
		}
		return $result;
	}

	/*
	======================================================================================================
	=                       O QUE VEM A SEGUIR FAZ SENTIDO. ACIMA, REVISAR TUDO!                         =
	======================================================================================================
	*/
	public function avisosSinistro(){
		$select = $this->select()->setIntegrityCheck(false);

        $select->from(array("a"=>"sinistro.avisos"));
        $select->joinInner(array("st" => "sistema.status"), "st.id = a.id_status and (st.ds_chave = 'ACEITO' or st.ds_chave = 'FECHADO')", array("ds_status"));
        $select->joinInner(array("u" => "sistema.usuarios"), "u.id = a.id_usuario_criacao", array("ds_nome_usuario"));

        $select->where("a.id_proposta = $this->id_proposta");
        $select->where("a.fl_ativo = true");
        $select->order("a.dt_criacao desc");

        return Zend_Db_Table::getDefaultAdapter()->fetchAll($select);
	}

	public function agendamentosVistorias(){
		$select = $this->select()->setIntegrityCheck(false);

		$select->from(array('ag' => 'sistema.agendamentos'));
        $select->joinInner(array('vag' => 'sistema.vistorias_agendamentos'), "vag.id_agendamento = ag.id", false);
        $select->joinInner(array('vp' => 'sinistro.vistorias_processos'), "vag.id_vistoria = vp.id_vistoria", false);
        $select->joinInner(array('f' => 'sistema.funcionarios'), "f.id_usuario = ag.id_usuario_criacao", array("ds_nome_funcionario"));
        $select->joinInner(array('e' => 'sistema.empresas'), "e.id = f.id_empresa", array("ds_nome_fantasia"));
        $select->joinInner(array('u' => 'sistema.usuarios'), "u.id = ag.id_usuario_criacao", array("ds_nome_usuario"));
        $select->where("vp.id_processo=$this->id");

        $select->order("ag.dt_criacao desc");

        return Zend_Db_Table::getDefaultAdapter()->fetchAll($select);
	}

	public function existePreliminarDispensada(){
		$Model = new Sinistro_Model_AvisosSinistro();

        $Avisos = $Model->fetchAll("id_proposta=$this->id_proposta");

        foreach ($Avisos as $aviso){
        	if ($aviso->fl_dispensa_preliminar){
        		return true;
        	}
        }

        return false;
	}

	public function responsavelPasta(){
		$Model = new Sistema_Model_Funcionarios();
		return $Model->fetchRow("id_usuario = $this->id_responsavel_abertura_pasta");
	}

	public function responsavelLiquidacao(){
		$Model = new Sistema_Model_Funcionarios();
		return ($this->id_usuario_responsavel_liquidacao ? $Model->fetchRow("id_usuario = $this->id_usuario_responsavel_liquidacao") : false);
	}
}
