<?php

declare(strict_types=1);

class Sinistro2_Model_VistoriadorDespesa extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
	protected $_name = 'vistoriador_despesa';
	protected $_primary = 'id';
	public $_columnExcel = array(
		'id' => 'Cód',
		'id_proposta' => 'Proposta',
		'ds_nome_fantasia' => 'Empresa',
		'ds_nome_funcionario' => 'Vistoriador',
		'estado' => 'Estados / UFs',
		'ds_parametro_tipo_despesa' => 'Tipo Despesa',
        'vl_despesa' => 'Valor',
        'dt_despesa' => 'Data',
		'ds_justificativa' => 'Justificativa',
	);

	public function save(array $data): Zend_Db_Table_Row
	{
		$row = empty($data['id']) ? $this->createRow() : $this->find($data['id'])->current();

		$row->dt_despesa = $data['dt_despesa'];
		$row->vl_despesa = $data['vl_despesa'];
		$row->ds_justificativa = $data['ds_justificativa'] ?? '';
		$row->id_parametro_tipo_despesa = $data['id_parametro_tipo_despesa'];
		$row->id_funcionario = $data['id_funcionario'];
		$row->id_estado = $data['id_estado'];
		$row->id_proposta = $data['id_proposta'];

		$id = $row->save();

		if (!$id) {
			throw new Exception('Erro ao lançar despesa do vistoriador.');
		}

		return $row;
	}

	public function getDespesasPorPropostaFuncionarioSemVinculoVistoria(array $idsPropostas, array $idsFuncionarios): array
	{
		$rs = $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(
					['svd' =>'sinistro.vistoriador_despesa'],
					'id, id_estado, id_parametro_tipo_despesa, id_funcionario, dt_despesa, vl_despesa, id_proposta'
				)
				->join(['sptd' => 'sinistro.parametro_tipo_despesa'], 'sptd.id = svd.id_parametro_tipo_despesa', false)
				->join(['std' => 'sinistro.tipo_despesa'], 'std.id = sptd.id_tipo_despesa', 'id as id_tipo_despesa')
				->where('id_funcionario IN (?)', $idsFuncionarios)
				->where('id_proposta IN (?)', $idsPropostas)
				->where('id_vistoria IS NULL')
		);

		if ($rs->count() > 0) {
			return $rs->toArray();
		}

		return [];
	}

	public function getDespesasPorIds(array $ids): array
	{
		if (empty($ids)) {
			return[];
		}

		$rs = $this->fetchAll(
			$this->select()
				->setIntegrityCheck(false)
				->from(
					['svd' =>'sinistro.vistoriador_despesa'],
					'id, id_parametro_tipo_despesa, id_funcionario, dt_despesa, vl_despesa, id_proposta'
				)
				->join(['sptd' => 'sinistro.parametro_tipo_despesa'], 'sptd.id = svd.id_parametro_tipo_despesa', false)
				->join(['std' => 'sinistro.tipo_despesa'], 'std.id = sptd.id_tipo_despesa', 'id as id_tipo_despesa')
				->where('svd.id IN (?)', $ids)
		);

		if ($rs->count() > 0) {
			return $rs->toArray();
		}

		return [];
	}

	public function vinculaVistorias(array $mapIdVistoriaIdVistoriadorDespesa): void
	{
		foreach ($mapIdVistoriaIdVistoriadorDespesa as $idVistoria => $despesas) {
			foreach ($despesas as $despesa) {
				$this->_db->query("UPDATE sinistro.vistoriador_despesa SET id_vistoria = {$idVistoria} WHERE id = {$despesa};");
			}
		}
	}

	public function getUltimaDespesaLancadaVistoriador(int $idFuncionario): ?Zend_Db_Table_Row
	{
		return $this->fetchRow(
			$this->select()
				->where('id_funcionario = ?', $idFuncionario)
				->order('dt_criacao DESC')
				->limit(1)
		);
	}


	public function ultrapassouLimitesDespesas(Sinistro2_Model_VistoriadorDespesaDTO $vistoriadorDespesaDTO): int
	{
		$parametroTipoDespesa = (new Sinistro2_Model_ParametroTipoDespesa())
			->find($vistoriadorDespesaDTO->getIdParametroTipoDespesa())
			->current();

		$q = $this->select()
			->setIntegrityCheck(false)
			->from(['svd' => 'sinistro.vistoriador_despesa'], 'sum(vl_despesa) as vl_total')
			->join(['sptd' => 'sinistro.parametro_tipo_despesa'], 'sptd.id = svd.id_parametro_tipo_despesa', false)
			->join(['std' => 'sinistro.tipo_despesa'], 'std.id = sptd.id_tipo_despesa', false)
			->where('svd.id_funcionario = ?', $vistoriadorDespesaDTO->getIdFuncionario())
			->where('svd.id_parametro_tipo_despesa = ?', $vistoriadorDespesaDTO->getIdParametroTipoDespesa())
			->where("svd.dt_despesa = ?", $vistoriadorDespesaDTO->getDataDespesa()->format('Y-m-d'))
			->where('svd.id_vistoria IS NULL');

		if (!empty($vistoriadorDespesaDTO->getId())) {
			$q->where('svd.id <> ?', $vistoriadorDespesaDTO->getId());
		}
		
		$row = $this->fetchRow($q);

		$totalDespesaAtual = !empty($row) ? $row['vl_total'] : 0;
		$totalValorDespesa = $vistoriadorDespesaDTO->getValorDespesa() + $totalDespesaAtual; 
		
		if (!empty($parametroTipoDespesa['vl_minimo']) && $totalValorDespesa < $parametroTipoDespesa['vl_minimo']) {
			return -1;
		} elseif (!empty($parametroTipoDespesa['vl_maximo']) && $totalValorDespesa > $parametroTipoDespesa['vl_maximo']) {
			return 1;
		}

		return 0;
	}

	public function getDespesasPeritos(int $idProposta, array $idsPeritos, int $idEstado): array
	{
		$subqueryArquivos = $this->select()
			->setIntegrityCheck(false)
			->from('sinistro.vistoriador_despesa_arquivo', 'id_vistoriador_despesa, COUNT(id) AS numero_arquivos')
			->group('id_vistoriador_despesa');

		$q = $this->select()
			->setIntegrityCheck(false)
			->from(
				['svd' => 'sinistro.vistoriador_despesa'],
				'id as id_vistoriador_despesa, id_funcionario, id_parametro_tipo_despesa, vl_despesa, dt_despesa, id_proposta'
			)
			->joinLeft(['subArquivo' => $subqueryArquivos], 'subArquivo.id_vistoriador_despesa = svd.id', 'numero_arquivos')
			->join(['se' => 'sistema.estados'], 'se.id = svd.id_estado', 'se.id as id_estado, ds_sigla')
			->join(['sptd' => 'sinistro.parametro_tipo_despesa'], 'sptd.id = svd.id_parametro_tipo_despesa', 'ds_parametro_tipo_despesa')
			->join(
				['std' => 'sinistro.tipo_despesa'],
				'std.id = sptd.id_tipo_despesa',
				'std.id as id_tipo_despesa, ds_tipo_despesa, ds_unidade'
			)
			->join(['sf' => 'sistema.funcionarios'], 'sf.id = svd.id_funcionario', 'ds_nome_funcionario')
			->where('svd.id_proposta = ?', $idProposta)
			->where('svd.id_vistoria IS NULL')
			->where('id_funcionario IN(?)', $idsPeritos)
			->where('se.id = ?', $idEstado);
				
		return $this->fetchAll($q)->toArray();
	}

	public function getVistoria(int $idVistoria, string $tipoVistoria): Zend_Db_Table_Rowset
	{
		return $this->fetchAll($this->getQueryObjectVistoriasByTipo($tipoVistoria)->where('sv.id = ?', $idVistoria));
	}

	public function getVistoriasByDataPeritos(
		int $idProposta,
		DateTime $dateTime,
		array $idsPeritos,
		string $tipoVistoria,
		int $idEstado
	): Zend_Db_Table_Rowset {
		$nomeColunaData = 'dt_laudo';
		if ($tipoVistoria == 'Preliminar' || $tipoVistoria == 'Final') {
			$nomeColunaData = 'dt_vistoria';
		}

		return $this->fetchAll(
			$this->getQueryObjectVistoriasByTipo($tipoVistoria)
				->where('spprop.id_proposta = ?', $idProposta)
				->where('id_funcionario IN(?)', $idsPeritos)
				->where("{$nomeColunaData}::date = ?", $dateTime->format('Y-m-d'))
				->where('suf.id = ?', $idEstado)
				->order("{$nomeColunaData} ASC, sv.id ASC")
		);
	}

	private function getQueryObjectVistoriasByTipo(string $tipoVistoria): Zend_Db_Table_Select
	{
		$q = $this->select()
			->setIntegrityCheck(false)
			->from(['sv' => 'sistema.vistorias'], 'id as id_vistoria')
			->joinLeft(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = sv.id', false)
			->where('scrv.id_vistoria IS NULL');

		if ($tipoVistoria == 'Preliminar') {
			$q
				->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'
				)
				->join(['sp' => 'sinistro.processos'], 'sp.id = slp.id_processo', 'sp.id_proposta')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sp.id_proposta', 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(
					['svf' => 'sistema.vistorias_funcionarios'],
					'svf.id_vistoria = sv.id',
					'id_funcionario'
				);
		} elseif ($tipoVistoria == 'Final') {
			$q
				->join(['svlf' => 'sistema.vistorias_laudos_finais'], 'svlf.id_vistoria = sv.id', 'sv.id')
				->join(['slf' => 'sinistro.laudos_finais'], 'slf.id = svlf.id_laudo_final', 'dt_vistoria')
				->join(['sp' => 'sinistro.processos'], 'sp.id = slf.id_processo', 'sp.id_proposta')
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sp.id_proposta', 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(
					['slff' => 'sinistro.laudos_finais_funcionarios'],
					'slff.id_laudo_final = svlf.id_laudo_final',
					'id_funcionario'
				);
		} else {
			$q
				->join(
					['spvp' => 'seguro.propostas_vistorias_previas'],
					'spvp.id_vistoria = sv.id',
					'dt_laudo as dt_vistoria'
				)
				->join(
					['spprop' => 'seguro.propostas_propriedades'],
					'spprop.id_proposta = spvp.id_proposta',
					'spprop.id_proposta'
				)
				->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(
					['sva' => 'sistema.vistorias_agendamentos'],
					'sva.id_vistoria = sv.id',
					false
				)
				->join(
					['saf' => 'sistema.agendamentos_funcionarios'],
					'saf.id_agendamento = sva.id_agendamento',
					'id_funcionario'
				);
		}
		
		return $q;
	}

	public function getVistoriasByPeritosIgnoraData(
		int $idProposta,
		array $idsPeritos,
		DateTime $dateTime,
		int $idEstado,
		bool $isPrevia
	): Zend_Db_Table_Rowset {
		$idSafra = (new Produto_Model_Safras())->getSafraAtual('id');
		$idSafra -=2;

		$q = $this->select()
			->setIntegrityCheck(false)
			->from(['sv' => 'sistema.vistorias'], 'id as id_vistoria')
			->joinLeft(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = sv.id', false)
			->where('scrv.id_vistoria IS NULL');

		if (!$isPrevia) {
			$q1 = clone $q;
			$q2 = clone $q;

			$q1
				->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'
				)
				->join(['sp' => 'sinistro.processos'], 'sp.id = slp.id_processo', 'sp.id_proposta')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sp.id_proposta', false)
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', false)
				->join(['spe' => 'seguro.propostas_endosso'], 'spe.id_proposta = sprop.id', false)
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sp.id_proposta', 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(
					['svf' => 'sistema.vistorias_funcionarios'],
					'svf.id_vistoria = sv.id',
					'id_funcionario'
				)
				->where('sp.id_proposta = ?', $idProposta)
				->where('prod.id_safra >= ?', $idSafra)
				->where('suf.id = ?', $idEstado)
				->where('slp.dt_vistoria::date <> ?', $dateTime->format('Y-m-d'))
				->where('spe.fl_proposta_vigente IS TRUE')
				->where('sp.id_status <> 5')
				->where('slp.id_status = 76 OR slp.id_status = 204')
				->where('svf.id_funcionario IN (?)', $idsPeritos);

			$q2
				->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')
				->join(['sp' => 'sinistro.processos'], 'sp.id = slf.id_processo', 'sp.id_proposta')
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = sp.id_proposta', false)
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', false)
				->join(['spe' => 'seguro.propostas_endosso'], 'spe.id_proposta = sprop.id', false)
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = sp.id_proposta', 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(
					['slff' => 'sinistro.laudos_finais_funcionarios'],
					'slff.id_laudo_final = svlf.id_laudo_final',
					'id_funcionario'
				)
				->where('sp.id_proposta = ?', $idProposta)
				->where('prod.id_safra >= ?', $idSafra)
				->where('spe.fl_proposta_vigente IS TRUE')
				->where('sp.id_status <> 5')
				->where('slf.id_status = 110 OR slf.id_status = 205')
				->where('suf.id = ?', $idEstado)
				->where('slf.dt_vistoria::date <> ?', $dateTime->format('Y-m-d'))
				->where('slff.id_funcionario IN (?)', $idsPeritos);

				$q = $this->select()->union([$q1, $q2], Zend_Db_Select::SQL_UNION);
		} else {
			$q
				->join(
					['spvp' => 'seguro.propostas_vistorias_previas'],
					'spvp.id_vistoria = sv.id',
					'dt_laudo as dt_vistoria'
				)
				->join(['spprop' => 'seguro.propostas_propriedades'], 'spprop.id_proposta = spvp.id_proposta', false)
				->join(['sprop' => 'seguro.propostas'], 'sprop.id = spvp.id_proposta', 'sprop.id as id_proposta')
				->join(['prod' => 'produto.produtos'], 'prod.id = sprop.id_produto', 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(
					['sva' => 'sistema.vistorias_agendamentos'],
					'sva.id_vistoria = sv.id',
					false
				)
				->join(
					['saf' => 'sistema.agendamentos_funcionarios'],
					'saf.id_agendamento = sva.id_agendamento',
					'id_funcionario'
				)
				->where('sprop.id = ?', $idProposta)
				->where('prod.id_safra >= ?', $idSafra)
				->where('spvp.fl_transmitido IS TRUE AND spvp.fl_nova_vistoria_custo_perito IS FALSE')
				->where('suf.id = ?', $idEstado)
				->where('spvp.dt_laudo::date <> ?', $dateTime->format('Y-m-d'))
				->where('saf.id_funcionario IN (?)', $idsPeritos);
		}
		
		return $this->fetchAll($q);
	}

	public function fetchAllPaginator($where, $pageNumber = false, $itemCountPerPage = 10, $paginator = '')
    {
        $q = $this->select()
            ->setIntegrityCheck(false)
			->from(
				['svd' => 'sinistro.vistoriador_despesa'],
				'
				svd.id, dt_despesa, vl_despesa, ds_justificativa, id_proposta,
				CASE WHEN svd.dt_alteracao IS NOT NULL THEN svd.dt_alteracao ELSE svd.dt_criacao END AS dt_lancamento
				'
			)
            ->join(
				['sptd' => 'sinistro.parametro_tipo_despesa'],
				'sptd.id = svd.id_parametro_tipo_despesa',
				'ds_parametro_tipo_despesa, vl_despesa'
			)
			->join(
				['std' => 'sinistro.tipo_despesa'],
				'std.id = sptd.id_tipo_despesa',
				'id as id_tipo_despesa, ds_tipo_despesa, ds_unidade'
			)
			->join(['sp' => 'seguro.propostas'], 'sp.id = svd.id_proposta', 'id_proposta_mae')
            ->join(['se' => 'sistema.estados'], 'se.id = svd.id_estado', 'ds_sigla as estado')
			->join(['sf' => 'sistema.funcionarios'], 'sf.id = svd.id_funcionario', 'ds_nome_funcionario')
			->join(['emp' => 'sistema.empresas'], 'emp.id = sf.id_empresa', 'ds_nome_fantasia')
			->where('svd.id_vistoria IS NULL')
			->order('sf.ds_nome_funcionario, svd.dt_despesa');
		
        $this->getWhere($q, $where);
		
        return $this->getPaginator($q, $pageNumber, $itemCountPerPage, $paginator);
    }

	/**
	 * Busca vistorias cujas datas batem com as datas de lançamento de despesa + $dias a somar
	 */
	public function getVistoriasDespesas(array $ids, bool $isPrevia)
	{
		$idSafra = (new Produto_Model_Safras())->getSafraAtual('id');
		$idSafra -=2;

		$idsVistoriadoresDespesas = implode(', ', $ids);
		
		if (!$isPrevia) {
			$queryTabelaTemporaria = "
				CREATE TEMP TABLE TempVistoriasDespesas AS
					SELECT
							svd.id AS id_vistoriador_despesa,
							dt_vistoria,
							sv.id AS id_vistoria,
							svd.id_funcionario,
							EXTRACT(EPOCH FROM svd.dt_despesa) AS epoch_despesa,
    						EXTRACT(EPOCH FROM slp.dt_vistoria) AS epoch_vistoria
						FROM
							sistema.vistorias AS sv
							INNER JOIN sistema.vistorias_laudos_preliminares AS svlp ON svlp.id_vistoria = sv.id
							LEFT JOIN sinistro.cobranca_relatorio_vistorias scrv ON scrv.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 sprop ON sprop.id = sp.id_proposta
							INNER JOIN produto.produtos prod ON prod.id = sprop.id_produto
							INNER JOIN seguro.propostas_endosso spe ON spe.id_proposta = sprop.id
							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
							INNER JOIN sinistro.vistoriador_despesa svd
								ON svd.id_proposta = sprop.id
									AND svd.id_funcionario = svf.id_funcionario
									AND svd.id_estado = sm.id_estado
									AND svd.id_vistoria IS NULL
						WHERE
							svd.id IN ({$idsVistoriadoresDespesas})
							AND prod.id_safra >= {$idSafra}
							AND scrv.id_vistoria IS NUll
							AND spe.fl_proposta_vigente IS TRUE
							AND sp.id_status <> 5
							AND (slp.id_status = 76 OR slp.id_status = 204)

					UNION

					SELECT
						svd.id AS id_vistoriador_despesa,
						dt_vistoria,
						sv.id AS id_vistoria,
						svd.id_funcionario,
						EXTRACT(EPOCH FROM svd.dt_despesa) AS epoch_despesa,
    					EXTRACT(EPOCH FROM slf.dt_vistoria) AS epoch_vistoria
					FROM
						sistema.vistorias AS sv
						INNER JOIN sistema.vistorias_laudos_finais AS svlf ON svlf.id_vistoria = sv.id
						LEFT JOIN sinistro.cobranca_relatorio_vistorias scrv ON scrv.id_vistoria = sv.id 
						INNER JOIN sinistro.laudos_finais AS slf ON slf.id = svlf.id_laudo_final
						INNER JOIN sinistro.laudos_finais_funcionarios AS slff ON slff.id_laudo_final = slf.id
						INNER JOIN sinistro.processos sp ON sp.id = slf.id_processo
						INNER JOIN seguro.propostas sprop ON sprop.id = sp.id_proposta
						INNER JOIN produto.produtos prod ON prod.id = sprop.id_produto
						INNER JOIN seguro.propostas_endosso spe ON spe.id_proposta = sprop.id
						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.vistoriador_despesa svd
							ON svd.id_proposta = sprop.id
								AND svd.id_funcionario = slff.id_funcionario
								AND svd.id_estado = sm.id_estado
								AND svd.id_vistoria IS NULL
					WHERE
						svd.id IN ({$idsVistoriadoresDespesas})
						AND prod.id_safra >= {$idSafra}
						AND scrv.id_vistoria IS NUll
						AND spe.fl_proposta_vigente IS TRUE
						AND sp.id_status <> 5
						AND (slf.id_status = 110 OR slf.id_status = 205);
			";

			Agro_Db_Table_Abstract::getDefaultAdapter()->query($queryTabelaTemporaria);

			$query = '
				WITH VistoriasDespesas AS (
					SELECT
						id_vistoriador_despesa,
						dt_vistoria,
						id_vistoria,
						id_funcionario,
						ROW_NUMBER() OVER (
							PARTITION BY id_funcionario, id_vistoriador_despesa
							ORDER BY ABS(epoch_despesa - epoch_vistoria)
						) AS rn
					FROM
						TempVistoriasDespesas
				)
				SELECT
					id_vistoriador_despesa,
					dt_vistoria,
					id_vistoria,
					id_funcionario
				FROM
					VistoriasDespesas
				WHERE
					rn = 1
				ORDER BY
					dt_vistoria ASC
			';
		} else {
			$query = "
				WITH VistoriasDespesas AS (
					SELECT
						svd.id AS id_vistoriador_despesa,
						dt_laudo as dt_vistoria,
						spvp.id_vistoria,
						saf.id_funcionario,
						ROW_NUMBER() OVER (
							PARTITION BY saf.id_funcionario, svd.id
							ORDER BY ABS(EXTRACT(EPOCH FROM svd.dt_despesa) - EXTRACT(EPOCH FROM dt_laudo))
						) AS rn
					FROM
						seguro.propostas_vistorias_previas AS spvp
						LEFT JOIN sinistro.cobranca_relatorio_vistorias scrv ON scrv.id_vistoria = spvp.id_vistoria 
						INNER JOIN seguro.propostas sprop ON sprop.id = spvp.id_proposta
						INNER JOIN produto.produtos prod ON prod.id = sprop.id_produto
						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
						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 sinistro.vistoriador_despesa svd
							ON svd.id_proposta = sprop.id
								AND svd.id_funcionario = saf.id_funcionario
								AND svd.id_estado = sm.id_estado
						WHERE
							svd.id IN ({$idsVistoriadoresDespesas})
							AND prod.id_safra >= {$idSafra}
							AND spvp.fl_transmitido IS TRUE AND spvp.fl_nova_vistoria_custo_perito IS FALSE
							AND scrv.id_vistoria IS NULL
				)
				SELECT
					id_vistoriador_despesa,
					dt_vistoria,
					id_vistoria,
					id_funcionario
				FROM
					VistoriasDespesas
				WHERE rn = 1
			";
		}
		
		return $this->_db->fetchAll($query);
	}

	public function getJustificativasKmByIdCobrancaRelatorio(int $idCobrancaRelatorio): Zend_Db_Table_Rowset
	{
		$select = $this->select()
			->setIntegrityCheck(false)
			->from(
				['svd' => 'sinistro.vistoriador_despesa'],
				['vl_despesa', 'ds_justificativa', 'TO_CHAR(dt_despesa, \'dd/MM/yyyy\') AS dt_despesa', 'id_vistoria']
			)
			->join(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], 'scrv.id_vistoria = svd.id_vistoria', false)
			->join(['sf' => 'sistema.funcionarios'], 'sf.id = svd.id_funcionario', 'ds_nome_funcionario')
			->join(['sp' => 'seguro.propostas'], 'sp.id = svd.id_proposta', 'id_proposta_mae')
			->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio)
			->order('sf.ds_nome_funcionario ASC, svd.dt_despesa DESC');

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