<?php

declare(strict_types=1);

class Sinistro2_Model_VistoriadorDespesaArquivo extends Agro_Db_Table_Abstract
{
    protected $_schema = 'sinistro';
	protected $_name = 'vistoriador_despesa_arquivo';
	protected $_primary = 'id';

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

        $row->id_vistoriador_despesa = $data['id_vistoriador_despesa'];
        $row->ds_caminho_arquivo = $data['ds_caminho_arquivo'];

        $id = $row->save();

        if (empty($id)) {
            throw new Exception('Erro ao salvar arquivos de despesa do vistoriador.');
        }

        return $row;
    }

    public function getArquivosByCobranca(int $idCobrancaRelatorio, bool $isPrevia): array
    {
        $query = $this->select()
            ->setIntegrityCheck(false)
            ->from(['svda' => 'sinistro.vistoriador_despesa_arquivo'], 'ds_caminho_arquivo')
            ->join(
                ['svd' => 'sinistro.vistoriador_despesa'],
                'svd.id = svda.id_vistoriador_despesa',
                'vl_despesa, ds_justificativa, dt_despesa'
            )
            ->join(
                ['scrv' => 'sinistro.cobranca_relatorio_vistorias'],
                'scrv.id_vistoria = svd.id_vistoria',
                'id_vistoria, vl_custo_quilometragem'
            )
            ->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, ds_tipo_despesa, ds_unidade'
            )
            ->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio);

        if (!$isPrevia) {
            $queryLaudoFinal = $this->select()
                ->setIntegrityCheck(false)
                ->from(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], false)
                ->join(['svlf' => 'sistema.vistorias_laudos_finais'], 'svlf.id_vistoria = scrv.id_vistoria',false)
                ->join(
                    ['svd' => 'sinistro.vistoriador_despesa'],
                    'svd.id_vistoria = svlf.id_vistoria',
                    'id as id_vistoriador_despesa'
                )
                ->join(['slf' => 'sinistro.laudos_finais'], 'slf.id = svlf.id_laudo_final', false)
                ->join(['sp' => 'sinistro.processos'], 'sp.id = slf.id_processo', 'id_proposta')
                ->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio);

            $queryLaudoPreliminar = $this->select()
                ->setIntegrityCheck(false)
                ->from(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], false)
                ->join(['svlp' => 'sistema.vistorias_laudos_preliminares'], 'svlp.id_vistoria = scrv.id_vistoria', false)
                ->join(
                    ['svd' => 'sinistro.vistoriador_despesa'],
                    'svd.id_vistoria = svlp.id_vistoria',
                    'id as id_vistoriador_despesa'
                )
                ->join(['slp' => 'sinistro.laudos_preliminares'], 'slp.id = svlp.id_laudo_preliminar', false)
                ->join(['sp' => 'sinistro.processos'], 'sp.id = slp.id_processo', 'id_proposta')
                ->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio);
            
            $subquery = $this->select()->union([$queryLaudoFinal, $queryLaudoPreliminar]);
        } else {
            $subquery = $this->select()
                ->setIntegrityCheck(false)
                ->from(['scrv' => 'sinistro.cobranca_relatorio_vistorias'], false)
                ->join(['spvp' => 'seguro.propostas_vistorias_previas'], 'spvp.id_vistoria = scrv.id_vistoria','id_proposta')
                ->join(
                    ['svd' => 'sinistro.vistoriador_despesa'],
                    'svd.id_vistoria = spvp.id_vistoria',
                    'id as id_vistoriador_despesa'
                )
                ->where('scrv.id_cobranca_relatorio = ?', $idCobrancaRelatorio);
        }

        $query->joinLeft(['subq' => $subquery], 'subq.id_vistoriador_despesa = svd.id', 'subq.id_proposta');
        
        $rs = $this->fetchAll($query);
        
        if ($rs->count() > 0) {
            return $rs->toArray();
        }

        return [];
    }

    public function getArquivos(array $idsVistoriadoresDespesas): array
    {
        $query = $this->select()
            ->setIntegrityCheck(false)
            ->from(['svda' => 'sinistro.vistoriador_despesa_arquivo'], 'id, ds_caminho_arquivo')
            ->join(
                ['svd' => 'sinistro.vistoriador_despesa'],
                'svd.id = svda.id_vistoriador_despesa',
                'vl_despesa, ds_justificativa, dt_despesa'
            )
            ->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, ds_tipo_despesa, ds_unidade'
            )
            ->where('svda.id_vistoriador_despesa IN (?)', $idsVistoriadoresDespesas);

        $rs = $this->fetchAll($query);
        
        if ($rs->count() > 0) {
            return $rs->toArray();
        }

        return [];
    }
}

?>