<?php

class Sistema_Model_Vistorias extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Sistema_Model_Row_Vistoria';
	protected $_schema = 'sistema';
	protected $_name = 'vistorias';
	protected $_primary = 'id';

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

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

		if ($data['dt_inicio']) {
			$Row->dt_inicio = Agro_Util::formatDate($data['dt_inicio'], Zend_Date::W3C);
		}

		if ($data['dt_fim']) {
			$Row->dt_fim = Agro_Util::formatDate($data['dt_fim'], Zend_Date::W3C);
		}

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

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

		return $Row->save();
	}

	public function getAvisosByVistoria($idVistoria) {
		$data = array();
		if($idVistoria){
			$sql ='SELECT
							*
				   FROM
							sinistro.fn_avisos_vistoria('.$idVistoria.')
					    AS (id integer,
						    dt_sinistro text,
						    dt_aceitacao text,
						    dt_criacao text,
						    id_proposta integer,
						    ds_eventos text)';

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

	/**
	 * Busca os dados que irão aparecer na seleção de laudos preliminares
	 * na janela de agendamento de vistoria final
	 *
	 * @param int | array int $idLaudoPreliminar
	 * @return array int
	 */
	public function getDadosAgVistoriaFinalLaudosPreliminares($idLaudoPreliminar){
		$data = array();
		if($idLaudoPreliminar){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id');
			$select->joinLeft(array('vl'=>'sistema.vistorias_laudos_preliminares'),'lp.id = vl.id_laudo_preliminar',false);
			$select->joinLeft(array('vi'=>'sistema.vistorias'),'vl.id_vistoria = vi.id','to_char(vi.dt_inicio,\'dd/mm/yyyy\') as dt_inicio');

			if(is_array($idLaudoPreliminar)){
				if(count($idLaudoPreliminar) > 0){
					$where = 'lp.id IN (' . implode(',',$idLaudoPreliminar) . ')';
					$select->where($where);
					$select->order('vi.dt_inicio desc');
					$data = $this->fetchAll($select)->toArray();
				}
			} else {
				$where = $this->getAdapter()->quoteInto('lp.id = ?',$idLaudoPreliminar);
				$select->where($where);
				$select->order('vi.dt_inicio desc');
				$data = $this->fetchAll($select)->toArray();
			}
		}
		return $data;
	}


	public function isNovaAvaliacao($idVistoria) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('sistema.vistorias'), 'coalesce(id_vistoria_reavaliada,0)');
		$select->where('id = ?', $idVistoria);

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

		if ($result == 0) {
			return false;
		} else {
			return true;
		}
	}

	public function getIdTipoVistoria($dsChaveTiposVistoria) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('sistema.tipos_vistoria'), 'id');
		$select->where('ds_chave_tipos_vistoria = ?', $dsChaveTiposVistoria);

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

	public function getDtSinistro($id_vistoria){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array("a"=>"sinistro.avisos"), array("a.dt_sinistro"));
		$select->joinInner(array("va"=>"sinistro.vistorias_avisos"), "va.id_aviso = a.id", false);
		$select->where("va.id_vistoria=$id_vistoria");

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

    // busca data de encaminhamento conforme id da proposta
    public function getDtEncaminhamentoByProposta($id_proposta, $id_proposta_vistoria) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array("pvp"=>"seguro.propostas_vistorias_previas"),null);
        $select->join(array("sv"=>"sistema.vistorias"),"sv.id = pvp.id_vistoria",null);
        $select->join(array("sve"=>"sistema.vistorias_empresas"),"sve.id_vistoria = sv.id", "to_char(sve.dt_criacao,'dd/mm/yyyy') as dt_encaminhamento");
        $select->where("pvp.id_proposta=$id_proposta");
        $select->where("pvp.id=$id_proposta_vistoria");

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

	public function getSelectDadosGerarRelatorio(array $filtros, bool $isPrevia, array $idsVistorias = []): Zend_Db_Select
	{
		$idSafra = (new Produto_Model_Safras())->getSafraAtual('id');
		$idSafra -=2;

		$filtros['isPrevia'] = $isPrevia;

		if (!$isPrevia) {
			$subqueryFuncionarioFinal = $this->select()
				->setIntegrityCheck(false)
				->from(['slff' => 'sinistro.laudos_finais_funcionarios'], 'id_laudo_final')
				->join(
					['sf' => 'sistema.funcionarios'],
					'sf.id = slff.id_funcionario',
					"STRING_AGG(CAST(ds_nome_funcionario AS VARCHAR), ', ') AS perito, STRING_AGG(CAST(sf.id AS VARCHAR), ', ') AS ids_funcionarios"
				)
				->group('slff.id_laudo_final');

			$subqueryFuncionarioPreliminar = $this->select()
				->setIntegrityCheck(false)
				->from(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'id_laudo_preliminar')
				->join(['svf' => 'sistema.vistorias_funcionarios'], 'svf.id_vistoria = svlp.id_vistoria', false)
				->join(
					['sf' => 'sistema.funcionarios'],
					'sf.id = svf.id_funcionario',
					"STRING_AGG(CAST(ds_nome_funcionario AS VARCHAR), ', ') AS perito, STRING_AGG(CAST(sf.id AS VARCHAR), ', ') AS ids_funcionarios"
				)
				->group('svlp.id_laudo_preliminar');

			$subqueryFiltroFuncionarioFinal = $subqueryFiltroFuncionarioPreliminar =null;
			if (!empty($filtros['id_funcionario'])) {
				$subqueryFiltroFuncionarioFinal = $this->select()
					->setIntegrityCheck(false)
					->from(['slff' => 'sinistro.laudos_finais_funcionarios'], 'id_laudo_final')
					->where('id_funcionario = ?', $filtros['id_funcionario'])
					->group('id_laudo_final');

				$subqueryFiltroFuncionarioPreliminar = $this->select()
					->setIntegrityCheck(false)
					->from(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'id_laudo_preliminar')
					->join(['svf' => 'sistema.vistorias_funcionarios'], 'svf.id_vistoria = svlp.id_vistoria', false)
					->where('id_funcionario = ?', $filtros['id_funcionario'])
					->group('id_laudo_preliminar');

				$subqueryFuncionarioFinal->join(
					['filtro' => $subqueryFiltroFuncionarioFinal],
					'filtro.id_laudo_final = slff.id_laudo_final',
					false
				);
				
				$subqueryFuncionarioPreliminar->join(
					['filtro' => $subqueryFiltroFuncionarioPreliminar],
					'filtro.id_laudo_preliminar = svlp.id_laudo_preliminar',
					false
				);
			}
			
			$selectFinal = $this->select()
				->setIntegrityCheck(false)
				->from(['sv' => 'sistema.vistorias'], "sv.id as id_vistoria, 'Final' as tp_vistoria")
				->join(['svlf' => 'sistema.vistorias_laudos_finais'], 'svlf.id_vistoria = sv.id', false)
				->join(
					['slf' => 'sinistro.laudos_finais'],
					'slf.id = svlf.id_laudo_final',
					'dt_vistoria, ds_variedades, ds_itens_segurados, vl_area_vistoriada, id_cobertura, fl_evento_nao_constatado as evento_nao_constatado'
				)
				->join(['sf' => $subqueryFuncionarioFinal], 'sf.id_laudo_final = slf.id', 'perito, ids_funcionarios')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slf.id_processo', 'id as id_processo')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sproc.id_proposta', 'id as id_proposta, id_proposta_mae')
				->join(['send' => 'seguro.propostas_endosso'], 'send.id_proposta = sprop.id', false)
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->join(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->join(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->joinLeft(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = sv.id', false)
				->where('prod.id_safra >= ?', $idSafra)
				->where('sproc.id_status <> 5')
				->where('slf.id_status = 110 OR slf.id_status = 205 OR slf.id_status = 300')
				->where('send.fl_proposta_vigente IS TRUE')
				->where('scrv.id_vistoria IS NULL');
			
			$selectFinal = $this->setObjetoSelectFiltros($selectFinal, $filtros);
			
			$selectPreliminar = $this->select()
				->setIntegrityCheck(false)
				->from(['sv' => 'sistema.vistorias'], "sv.id as id_vistoria, 'Preliminar' as tp_vistoria")
				->join(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'svlp.id_vistoria = sv.id', false)
				->join(
					['slp' => 'sinistro.laudos_preliminares'],
					'slp.id = svlp.id_laudo_preliminar',
					'dt_vistoria, ds_variedades, ds_itens_segurados, vl_area_vistoriada, id_cobertura, fl_evento_nao_constatado as evento_nao_constatado'
				)
				->join(['sf' => $subqueryFuncionarioPreliminar], 'sf.id_laudo_preliminar = slp.id', 'perito, ids_funcionarios')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slp.id_processo', 'id as id_processo')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sproc.id_proposta', 'id as id_proposta, id_proposta_mae')
				->join(['send' => 'seguro.propostas_endosso'], 'send.id_proposta = sprop.id', false)
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->join(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->join(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->joinLeft(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = sv.id', false)
				->where('prod.id_safra >= ?', $idSafra)
				->where('sproc.id_status <> 5')
				->where('slp.id_status = 76 OR slp.id_status = 204 OR slp.id_status = 226')
				->where('send.fl_proposta_vigente IS TRUE')
				->where('scrv.id_vistoria IS NULL');

			if (!empty($idsVistorias)) {
				$selectFinal->where('sv.id IN (?)', $idsVistorias);
				$selectPreliminar->where('sv.id IN (?)', $idsVistorias);
			}

			$selectPreliminar = $this->setObjetoSelectFiltros($selectPreliminar, $filtros);
			
			$select = $this->select()->union([$selectFinal, $selectPreliminar]);
			
			$select->order('dt_vistoria DESC, id_proposta DESC, perito, id_vistoria DESC');
		} else {
			$subqueryFuncionarioPrevia = $this->select()
					->setIntegrityCheck(false)
					->from(['spvp' => 'seguro.propostas_vistorias_previas'], 'id as id_previa')
					->joinLeft(['sva' => 'sistema.vistorias_agendamentos'], 'sva.id_vistoria = spvp.id_vistoria', false)
					->joinLeft(['saf' => 'sistema.agendamentos_funcionarios'], 'saf.id_agendamento = sva.id_agendamento', false)
					->join(
						['sf' => 'sistema.funcionarios'],
						'sf.id = saf.id_funcionario',
						"STRING_AGG(CAST(ds_nome_funcionario AS VARCHAR), ', ') AS perito, STRING_AGG(CAST(sf.id AS VARCHAR), ', ') AS ids_funcionarios"
					)
					->group('spvp.id');

			if (!empty($filtros['id_funcionario'])) {
				$subqueryFiltroFuncionarioPrevia = $this->select()
					->setIntegrityCheck(false)
					->from(['spvp' => 'seguro.propostas_vistorias_previas'], 'id as id_previa')
					->joinLeft(['sva' => 'sistema.vistorias_agendamentos'], 'sva.id_vistoria = spvp.id_vistoria', false)
					->joinLeft(['saf' => 'sistema.agendamentos_funcionarios'], 'saf.id_agendamento = sva.id_agendamento', false)
					->where('id_funcionario = ?', $filtros['id_funcionario'])
					->group('id_previa');

				$subqueryFuncionarioPrevia->join(
					['filtro' => $subqueryFiltroFuncionarioPrevia],
					'filtro.id_previa = spvp.id',
					false
				);
			}

			$select = $this->select()
				->setIntegrityCheck(false)
				->from(['sv' => 'sistema.vistorias'], "sv.id as id_vistoria, 'Prévia' as tp_vistoria")
				->join(['spvp' => 'seguro.propostas_vistorias_previas'],'spvp.id_vistoria = sv.id','id_proposta, dt_laudo as dt_vistoria')
				->join(
					['spc' => 'seguro.propostas_coberturas'],
					'spc.id_proposta = spvp.id_proposta AND spc.fl_principal IS TRUE',
					'id_cobertura'
				)
				->join(['pcob' => 'produto.coberturas'], 'pcob.id = spc.id_cobertura', false)
				
				->join(['sf' => $subqueryFuncionarioPrevia], 'sf.id_previa = spvp.id', 'sf.perito, sf.ids_funcionarios')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = spvp.id_proposta', 'id_proposta_mae')
				->joinLeft(['sproc' => 'sinistro.processos'], 'sproc.id_proposta = sprop.id', 'id as id_processo')
				->join(['spp' => 'seguro.propostas_proponentes'], 'spp.id_proposta = sprop.id', 'ds_nome_proponente')
				->join(['sve' => 'sistema.vistorias_empresas'], 'sve.id_vistoria = sv.id', false)
				->join(['se' => 'sistema.empresas'], 'se.id = sve.id_empresa', 'ds_nome_fantasia')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sprop.id', false)
				->joinLeft(['sm' => 'sistema.municipios'], 'sm.id = spprop.id_municipio', 'ds_nome_municipio')
				->joinLeft(['suf' => 'sistema.estados'], 'suf.id = sm.id_estado', 'ds_sigla, id_estado')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 'id_produto_geral')
				->join(['ps' => 'produto.safras'], 'ps.id = prod.id_safra', 'ds_chave as ds_safra')
				->join(['prodg' => 'produto.produtos_geral'], 'prodg.id = prod.id_produto_geral', 'id_tipo_produto')
				->join(['pc' => 'produto.culturas'], 'pc.id = prodg.id_cultura', 'ds_nome_cultura, pc.id as id_cultura')
				->joinLeft(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = sv.id', false)
				->where('prod.id_safra >= ?', $idSafra)
				->where('spvp.fl_transmitido IS TRUE AND spvp.fl_nova_vistoria_custo_perito IS FALSE')
				->where('scrv.id_vistoria IS NULL')
				->order('dt_vistoria DESC, sv.id DESC');

			$select = $this->setObjetoSelectFiltros($select, $filtros);
			
			if (!empty($idsVistorias)) {
				$select->where('sv.id IN (?)', $idsVistorias);
			}
		}
	
		return $select;
	}

	private function setObjetoSelectFiltros(Zend_Db_Select $selectObject, array $filtros): Zend_Db_Select
	{
		$selectObject->where('prod.id_seguradora = 181');
		$nomeCampoData = '';

		$usuario = Zend_Auth::getInstance()->getIdentity();
		
		// Caso seja um vistoriador, ele poder ver apenas vistorias da sua empresa
		if ($usuario->tp_usuario != Sistema_Model_Usuarios::TIPO_USUARIO_FUNCIONARIO) {
			$filtros['id_empresa'] = (new Sistema_Model_Empresas())->getIdEmpresaByIdUsuario($usuario->id);
		}
		
		if (!empty($filtros['tipo_grupo_produto'])) {
			switch($filtros['tipo_grupo_produto']){
				//hortifruti preliminar/final
				case '1':
				case '2':
					$selectObject->where('id_tipo_produto = 1');
					break;
				//graos preliminar/final
				case '3':
				case '4':
					$selectObject->where('id_tipo_produto IN (2, 3)');
					break;
			}
		}

		if ($filtros['isPrevia']) {
			$nomeCampoData = 'dt_laudo';
		} else {
			$nomeCampoData = 'dt_vistoria';
		}

		if (!empty($filtros['dt_vistoria_ini'])) {
			$aux = explode('/', $filtros['dt_vistoria_ini']);
			$dataVistoriaIni = "{$aux[2]}-{$aux[1]}-{$aux[0]} 00:00:00";

			$selectObject->where("{$nomeCampoData} >= '{$dataVistoriaIni}'");
		}

		if (!empty($filtros['dt_vistoria_fim'])) {
			$aux = explode('/', $filtros['dt_vistoria_fim']);
			$dataVistoriaFim = "{$aux[2]}-{$aux[1]}-{$aux[0]} 23:59:59";

			$selectObject->where("{$nomeCampoData} <= '{$dataVistoriaFim}'");
		}

		if (!empty($filtros['id_cultura'])) {
			$selectObject->where('id_cultura = ?', (int) $filtros['id_cultura']);
		}

		if (!empty($filtros['id_estado'])) {
			$selectObject->where('suf.id = ?', (int) $filtros['id_estado']);
		}

		if (!empty($filtros['id_empresa'])) {
			$selectObject->where('se.id = ?', (int) $filtros['id_empresa']);
		}

		if (!empty($filtros['id_municipio'])) {
			$selectObject->where('sm.id = ?', (int) $filtros['id_municipio']);
		}
		
		return $selectObject;
	}

	public function getIdsPropostasDatasVistorias(array $idsVistorias, bool $isPrevia): array
	{
		if (!$isPrevia) {
			$selectLaudoFinal = $this->select()
				->setIntegrityCheck(false)
				->from(['sv' => 'sistema.vistorias'], false)
				->join(['svlf' => 'sistema.vistorias_laudos_finais'], 'svlf.id_vistoria = sv.id', 'id_vistoria')
				->join(['slf' => 'sinistro.laudos_finais'], 'slf.id = svlf.id_laudo_final', 'dt_vistoria AS dt_vistoria')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slf.id_processo', 'id_proposta')
				->where('sv.id IN (?)', $idsVistorias);

			$selectLaudoPreliminar = $this->select()
				->setIntegrityCheck(false)
				->from(['sv' => 'sistema.vistorias'], false)
				->join(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'svlp.id_vistoria = sv.id', 'id_vistoria')
				->join(['slp' => 'sinistro.laudos_preliminares'], 'slp.id = svlp.id_laudo_preliminar', 'dt_vistoria AS dt_vistoria')
				->join(['sproc' => 'sinistro.processos'], 'sproc.id = slp.id_processo', 'id_proposta')
				->where('sv.id IN (?)', $idsVistorias);

			$select = $this->select()->union([$selectLaudoFinal, $selectLaudoPreliminar], Zend_Db_Select::SQL_UNION);
		} else {
			$select = $this->select()
				->setIntegrityCheck(false)
				->from(['spvp' => 'seguro.propostas_vistorias_previas'], 'id_vistoria, id_proposta, dt_laudo as dt_vistoria')
				->where('spvp.id_vistoria IN (?)', $idsVistorias);
		}

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

	public function getPrimeirasVistoriasRealizadasNoDiaPorFuncionario(array $idsVistorias, bool $isPrevia)
	{
		if (!$isPrevia) {
			$sql = '
				(
					WITH PrimeiraVistoriaFinalDoDia AS (
						SELECT
							id_funcionario,
							dt_vistoria,
							id_vistoria,
							sm.id_estado,
							ROW_NUMBER() OVER (PARTITION BY id_funcionario, dt_vistoria::DATE ORDER BY dt_vistoria, id_vistoria) AS rn
						FROM
							sistema.vistorias AS sv
							INNER JOIN sistema.vistorias_laudos_finais AS svlf ON svlf.id_vistoria = sv.id
							INNER JOIN sinistro.laudos_finais AS slf ON slf.id = svlf.id_laudo_final
							INNER JOIN sinistro.processos sp ON sp.id = slf.id_processo
							INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id_proposta
							INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
							INNER JOIN sinistro.laudos_finais_funcionarios AS slff ON slff.id_laudo_final = slf.id
						WHERE
							sv.id IN('. implode(',', $idsVistorias) .')
					)
					SELECT
						id_funcionario,
						dt_vistoria,
						id_vistoria,
						id_estado
					FROM
						PrimeiraVistoriaFinalDoDia
					where rn = 1
				)
				UNION
			 	(
					WITH PrimeiraVistoriaPreliminarDoDia AS (
						SELECT
							id_funcionario,
							dt_vistoria,
							svlp.id_vistoria,
							sm.id_estado,
							ROW_NUMBER() OVER (PARTITION BY id_funcionario, dt_vistoria::DATE ORDER BY dt_vistoria, svlp.id_vistoria) AS rn
						FROM
							sistema.vistorias AS sv
							INNER JOIN sistema.vistorias_laudos_preliminares AS svlp ON svlp.id_vistoria = sv.id
							INNER JOIN sinistro.laudos_preliminares AS slp ON slp.id = svlp.id_laudo_preliminar
							INNER JOIN sinistro.processos sp ON sp.id = slp.id_processo
							INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id_proposta
							INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
							INNER JOIN sistema.vistorias_funcionarios svf ON svf.id_vistoria = svlp.id_vistoria
						WHERE
							sv.id IN('. implode(',', $idsVistorias) .')
					)
					SELECT
						id_funcionario,
						dt_vistoria,
						id_vistoria,
						id_estado
					FROM
						PrimeiraVistoriaPreliminarDoDia
					where rn = 1
				);
			';
			
		} else {
			$sql = '
				WITH PrimeiraVistoriaPreviaDoDia AS (
					SELECT
						id_funcionario,
						dt_laudo AS dt_vistoria,
						spvp.id_vistoria,
						sm.id_estado,
						ROW_NUMBER() OVER (PARTITION BY id_funcionario, dt_laudo::DATE ORDER BY dt_laudo, spvp.id_vistoria) AS rn
					FROM
						seguro.propostas_vistorias_previas AS spvp
						INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = spvp.id_proposta
						INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
						INNER JOIN sistema.vistorias_agendamentos AS sva ON sva.id_vistoria = spvp.id_vistoria
						INNER JOIN sistema.agendamentos_funcionarios AS saf ON saf.id_agendamento = sva.id_agendamento
					WHERE
						spvp.id_vistoria IN('. implode(',', $idsVistorias) .')
				)
				SELECT
					id_funcionario,
					dt_vistoria,
					id_vistoria,
					id_estado
				FROM
					PrimeiraVistoriaPreviaDoDia
				where rn = 1
			';
		}
		
		return $this->_db->fetchAll($sql);
	}

	public function getDadosPorIdsVistorias(array $idsVistorias, bool $isPrevia)
	{
		$strIdsVistorias = implode(',', $idsVistorias);

		if (!$isPrevia) {
			$sql = "
				(
					SELECT
						sv.id as id_vistoria,
						dt_vistoria,
						STRING_AGG(slff.id_funcionario::text, ', ') AS ids_funcionarios,
						sp.id_proposta,
						propostas.id_proposta_mae,
						sm.id_estado
					FROM
						sistema.vistorias sv
					INNER JOIN sistema.vistorias_laudos_finais AS svlf ON svlf.id_vistoria = sv.id
					INNER JOIN sinistro.laudos_finais AS slf ON slf.id = svlf.id_laudo_final
					INNER JOIN sinistro.processos sp ON sp.id = slf.id_processo
					INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id_proposta
					INNER JOIN seguro.propostas ON propostas.id = spp.id_proposta
					INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
					INNER JOIN sinistro.laudos_finais_funcionarios AS slff ON slff.id_laudo_final = slf.id
					WHERE
						sv.id IN ({$strIdsVistorias})
					GROUP BY
						sp.id_proposta, propostas.id_proposta_mae, sv.id, id_estado, dt_vistoria
				)
				UNION
				(
					SELECT
						sv.id as id_vistoria,
						dt_vistoria,
						STRING_AGG(id_funcionario::text, ', ') AS ids_funcionarios,
						sp.id_proposta,
						propostas.id_proposta_mae,
						sm.id_estado
					FROM
						sistema.vistorias AS sv
						INNER JOIN sistema.vistorias_laudos_preliminares AS svlp ON svlp.id_vistoria = sv.id
						INNER JOIN sinistro.laudos_preliminares AS slp ON slp.id = svlp.id_laudo_preliminar
						INNER JOIN sinistro.processos sp ON sp.id = slp.id_processo
						INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = sp.id_proposta
						INNER JOIN seguro.propostas ON propostas.id = spp.id_proposta
						INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
						INNER JOIN sistema.vistorias_funcionarios svf ON svf.id_vistoria = svlp.id_vistoria
					WHERE
						sv.id IN ({$strIdsVistorias})
					GROUP BY sp.id_proposta, propostas.id_proposta_mae, sv.id, id_estado, dt_vistoria
				)
			";
		} else {
			$sql = "
				SELECT
					spvp.id_vistoria,
					STRING_AGG(saf.id_funcionario::text, ', ') AS ids_funcionarios,
					spvp.id_proposta,
					propostas.id_proposta_mae,
					dt_laudo AS dt_vistoria,
					sm.id_estado
				FROM
					seguro.propostas_vistorias_previas AS spvp
					INNER JOIN seguro.propostas_propriedades spp ON spp.id_proposta = spvp.id_proposta
					INNER JOIN seguro.propostas ON propostas.id = spp.id_proposta
					INNER JOIN sistema.municipios sm ON sm.id = spp.id_municipio
					INNER JOIN sistema.vistorias_agendamentos AS sva ON sva.id_vistoria = spvp.id_vistoria
					INNER JOIN sistema.agendamentos_funcionarios AS saf ON saf.id_agendamento = sva.id_agendamento
				WHERE
					spvp.id_vistoria IN({$strIdsVistorias})
				GROUP BY spvp.id_proposta, propostas.id_proposta_mae, spvp.id_vistoria, sm.id_estado, dt_vistoria
			";
		}
		
		return $this->_db->fetchAll($sql);
	}
}
