<?

class Sinistro2_Model_LaudosFinais extends Agro_Db_Table_Abstract {
    const DS_CHAVE_STATUS_ENVIADO_NAO_ASSINADO = 'ENVIADO_NAO_ASSINADO';
    const DS_CHAVE_STATUS_PENDENTE_ENVIO = 'PENDENTE_ENVIO';
    const DS_CHAVE_STATUS_PENDENTE_LAUDO_FINAL = 'PENDENTE_LAUDO_FINAL';

    protected $_rowClass = 'Sinistro2_Model_Row_LaudoFinal';
    protected $_schema = 'sinistro';
    protected $_name = 'laudos_finais';
    protected $_primary = 'id';
    public $_order = 'id_processo';

    public function save($dados) {
        try {
            if (array_key_exists('id_laudo_final', $dados)) {
                $dados['id'] = $dados['id_laudo_final'];
            }

            $Row = $this->getRow($dados['id']);

            if ($Row->fl_transmitido_tablet) {
                throw new Exception('Não é possível alterar laudo recebido pelo Aplicativo.');
            }
            
            $Row->id_processo = $dados['id_processo'] ? $dados['id_processo'] : null;
            $Row->id_cobertura = $dados['id_cobertura'] ? $dados['id_cobertura'] : null;
            $Row->ds_observacao = $dados['ds_observacao'] ? $dados['ds_observacao'] : null;
            $Row->ds_coordenadas = $dados['ds_coordenadas'] ? $dados['ds_coordenadas'] : null;
            $Row->ds_observacao_assinatura_regulador = $dados["ds_observacao_assinatura_regulador"] ? $dados["ds_observacao_assinatura_regulador"] : null;
            $Row->ds_observacao_assinatura_segurado = $dados["ds_observacao_assinatura_segurado"] ? $dados["ds_observacao_assinatura_segurado"] : null;
            $Row->ds_nome_laudo_fisico = $dados["ds_nome_laudo_fisico"] ? $dados["ds_nome_laudo_fisico"] : $Row->ds_nome_laudo_fisico;
            $Row->vl_tamanho_planta = ($dados['vl_tamanho_planta'] ? $dados['vl_tamanho_planta'] : 0);
           	$Row->fl_assinatura_regulador = $dados['fl_assinatura_regulador'] ? 1 : 0;
           	$Row->fl_assinatura_segurado = $dados['fl_assinatura_segurado'] ? $dados['fl_assinatura_segurado'] : 0;
           	$Row->fl_evento_nao_constatado = ($dados['fl_evento_nao_constatado'] ? $dados['fl_evento_nao_constatado'] : 0);
           	$Row->fl_dt_evento_em_cobertura = ($dados['fl_dt_evento_em_cobertura'] ? $dados['fl_dt_evento_em_cobertura'] : 0);
           	$Row->fl_area_declarada_representa_area_cultivada = ($dados['fl_area_declarada_representa_area_cultivada'] ? $dados['fl_area_declarada_representa_area_cultivada'] : 0);
            $Row->ds_responsavel = (!empty($dados['ds_responsavel']) ? $dados['ds_responsavel'] : null);
            $Row->cpf_responsavel = (!empty($dados['cpf_responsavel']) ? $dados['cpf_responsavel'] : null);
            $Row->ds_tipo_responsavel = (!empty($dados['ds_tipo_responsavel']) ? $dados['ds_tipo_responsavel'] : null);

            if ($Row->id_motivo_vistoria_nao_vistoriada != Sinistro2_Model_MotivosQuadraNaoVistoriadaTipos::VISTORIA_NAO_CONCLUIDA) {
                $Row->id_motivo_vistoria_nao_vistoriada = (!empty($dados['id_motivo_vistoria_nao_vistoriada']) ? $dados['id_motivo_vistoria_nao_vistoriada'] : null);
            }
            
            $Row->id_status = $this->getIdStatus('PENDENTE_ENVIO', 'LF');

            if ($dados['dt_vistoria_data']) {
                $dados['dt_vistoria_hora'] = $dados['dt_vistoria_hora'] < 10 ? "0" . $dados['dt_vistoria_hora'] : $dados['dt_vistoria_hora'];
                $dados['dt_vistoria_minutos'] = $dados['dt_vistoria_minutos'] < 10 ? "0" . $dados['dt_vistoria_minutos'] : $dados['dt_vistoria_minutos'];
                $dados['dt_vistoria'] = Agro_Util::formatDate($dados['dt_vistoria_data'] . " " . $dados['dt_vistoria_hora'] . ":" . $dados['dt_vistoria_minutos'], "yyyy-MM-dd HH:mm");
                $Row->dt_vistoria = $dados['dt_vistoria'];
            }

            // Verifica se área atingida informada condiz com as quadras selecionadas
            if ($dados['fl_area_atingida']) {
                if (count($dados['itens_segurados_selecionados']) > 0) {
                    if ($this->isAreaParcial($dados['id_proposta'], $dados['itens_segurados_selecionados'])) {
                        $dados['fl_area_atingida'] = 'P';
                    } else {
                        $dados['fl_area_atingida'] = 'T';
                    }
                }
                $Row->fl_area_atingida = $dados['fl_area_atingida'];
            }

            $dados['id_laudo_final'] = $Row->save();
            
            // Vincula os agronomos agro com o laudo
            if (array_key_exists('id_agronomos', $dados)) {
                $modelLaudosFinaisAgronomosAgro = new Sinistro2_Model_LaudosFinaisAgronomosAgro();
                $modelLaudosFinaisAgronomosAgro->deleteByLaudoFinal($Row->id);

                foreach ($dados['id_agronomos'] as $idFuncionario) {
                    $modelLaudosFinaisAgronomosAgro->save([
                        'id_laudo_final' => $Row->id,
                        'id_funcionario' => $idFuncionario
                    ]);
                }
            }

            // Salva os vistoriadores que realizaram a vistoria
            if (array_key_exists('vistoriadores', $dados)) {
                $Model_LaudosFinaisFuncionarios = new Sinistro2_Model_LaudosFinaisFuncionarios();
                $Model_LaudosFinaisFuncionarios->delete($Row->id);

                if (is_array($dados['vistoriadores'])) {
                    foreach ($dados['vistoriadores'] as $idFuncionario) {
                        $Model_LaudosFinaisFuncionarios->insert(
                                array(
                                    'id_laudo_final' => $Row->id,
                                    'id_funcionario' => $idFuncionario
                                )
                        );
                    }
                }
            }

            //Salva auxiliares de vistoriadores
            if (array_key_exists('auxiliares', $dados)) {
                $Model_LaudosFinaisFuncionarios = new Sinistro2_Model_LaudosFinaisFuncionarios();
                if (is_array($dados['auxiliares'])) {
                    foreach ($dados['auxiliares'] as $idFuncionario) {
                        $Model_LaudosFinaisFuncionarios->insert(
                            array(
                                'id_laudo_final' => $Row->id,
                                'id_funcionario' => $idFuncionario
                            )
                        );
                    }
                }
            }

            // Relaciona o Laudo Final com a Vistoria
            if ($dados['id_vistoria']) {
                $VistoriasLaudosFinais = new Sistema_Model_VistoriasLaudosFinais();
                $Vistoria = $VistoriasLaudosFinais->save(array('id_vistoria' => $dados['id_vistoria'], 'id_laudo_final' => $dados['id_laudo_final']));
            }
            
            if (count($dados['itens_segurados_selecionados']) > 0) { 
            	if (!$this->saveItensSeguradosVistorias($dados['id_proposta'], $Vistoria['id_vistoria'], $dados['fl_area_atingida'], $dados['fl_area_vistoriada'], $dados['itens_segurados_selecionados'])) {
            		return false;
            	}
            } elseif ($dados['fl_area_atingida'] == 'T' || $dados['fl_area_vistoriada'] == 'T') {
            	if (!$this->saveItensSeguradosVistorias($dados['id_proposta'], $Vistoria['id_vistoria'], $dados['fl_area_atingida'], $dados['fl_area_vistoriada'])) {
            		return false;
            	}
            }

            $acao = empty($dados['Devolver'])
                ? Log_Model_LaudosFinaisHistorico::ACAO_SALVAR
                : Log_Model_LaudosFinaisHistorico::ACAO_DEVOLVER;

            (new Sinistro2_Service_LaudosFinaisHistorico(new Log_Model_LaudosFinaisHistorico()))
                ->salvarHistorico($dados['id_laudo_final'], $acao);

            return $dados['id_laudo_final'];
        } catch (Exception $e) {
            $this->setMessage($e->getMessage() . '<br><pre>' . $e->getTraceAsString() . '</pre>');
            return false;
        }
    }

    public function novoLaudo($dados)
    {
        try {
            $cobertura = (new Produto_Model_Coberturas())->getChaveById($dados['id_cobertura']);
            $rowProposta = (new Seguro_Model_Propostas())->getRow($dados['id_proposta']);
            $produto = $rowProposta->produto();

            $row = $this->getRow($dados['id']);

            $row->id_processo = $dados['id_processo'] ? $dados['id_processo'] : null;
            $row->id_cobertura = $dados['id_cobertura'] ? $dados['id_cobertura'] : null;
            $row->id_status = $dados['id_status'];
            $id_laudo_final = $row->save();

            $idVistoria = !isset($dados['id_vistoria']) || !Agro_Util::filterVariable($dados['id_vistoria'])
                ? 0
                : (int)$dados['id_vistoria'];

            if ($dados['id_vistoria']) {
                (new Sistema_Model_VistoriasLaudosFinais())->save(
                    array('id_vistoria' => $dados['id_vistoria'], 'id_laudo_final' => $id_laudo_final)
                );
            }

            /**
             * Verificação dos Itens Segurados a serem vistoriados
             */
            $avisos = $this->getAvisosNaoVistoriados($dados['id_cobertura'], $dados['id_proposta'], $idVistoria);

            //Se a cobertura possui preliminar, verifica se para os avisos a serem vistoriados, a preliminar foi
            // dispensada
            if ($this->possuiPreliminar($dados['id_proposta'], $dados['id_cobertura'])) {
                $fl_dispensa_preliminar = false;
                foreach ($avisos as $aviso) {
                    if ($aviso['fl_dispensa_preliminar'] == true) {
                        $fl_dispensa_preliminar = true;
                    }
                }

                $idLaudoPreliminar = (new Sinistro2_Model_LaudosPreliminares())->getLaudosPreliminaresByAviso(
                    $idVistoria
                );
            }
            /*
             * Se a cobertura não possuir preliminar ou a preliminar estiver dispensada, executa os passos da vistoria
             * final
             */
            if (
                !$idLaudoPreliminar > 0
                || $fl_dispensa_preliminar == true
                || ($produto['cd_produto_seguradora'] == 260) || ($cobertura == 'COB_MULTIRISCO_II')
            ) {
                /*
                 * Se possuir um novo aviso, todos os itens segurados devem ser vistoriados novamente
                */
                if (count($avisos) > 0) {
                    $select = $this->select()->setIntegrityCheck(false);
                    $select->from(array('iseg' => 'seguro.itens_segurados'), array('id as id_item_segurado'));
                    $select->where('iseg.id_proposta = ?', $dados['id_proposta']);
                    $select->where('iseg.vl_lmga > 0');

                    $rsItensSegurados = $this->_db->fetchAll($select);
                } else {
                    $rsItensSegurados = $this->getItensSeguradosSemLaudo(
                        $dados['id_cobertura'],
                        $dados['id_proposta'],
                        $idVistoria
                    );
                }
            } else {
                $avisosVistoria = (new Sinistro2_Model_VistoriasAvisos())->getAvisos($idVistoria);
                $rsItensSegurados = $this->getItensSeguradosLaudoFinalComPreliminar(
                    $dados['id_proposta'],
                    $avisosVistoria,
                    $dados['id_cobertura']
                );
            }

            foreach ($rsItensSegurados as $itemSegurado) {
                $arItensSegurados[] = $itemSegurado['id_item_segurado'];
            }

            $rowVistoria = (new Sistema_Model_Vistorias())->getRow($idVistoria);

            //SE ESTÁ REAVALIANDO, REFAZ O ARRAY DE ITENS, BUSCANDO ELES DA TABELA DE ITENS PARA REAVALIAÇÃO
            if ($rowVistoria->id_vistoria_reavaliada) {
                unset($arItensSegurados);

                $select = $this->select()->setIntegrityCheck(false);
                $select->from(
                    array('visna' => 'sistema.vistorias_itens_segurados_nova_avaliacao'),
                    array('id_item_segurado')
                );
                $select->where("id_vistoria = ?", $idVistoria);

                $result = $this->fetchAll($select);

                foreach ($result as $item) {
                    $arItensSegurados[] = $item['id_item_segurado'];
                }
            }

            if (!empty($arItensSegurados)) {
                if (!$this->saveItensSeguradosVistorias(
                    $dados['id_proposta'],
                    $idVistoria,
                    false,
                    false,
                    $arItensSegurados
                )) {
                    return false;
                }
            } else {
                return false;
            }

            return $id_laudo_final;

        } catch (Exception $e) {
            $this->setMessage($e->getMessage() . '<br><pre>' . $e->getTraceAsString() . '</pre>');
            return false;
        }
    }

    public function getItensSeguradosSemLaudo($idCobertura, $idProposta, $idVistoria){
    	$subSelectIS = $this->select()->setIntegrityCheck(false);
    	$subSelectIS->from(array('lf'=>'sinistro.laudos_finais'), null);
    	$subSelectIS->join(array('vlf'=>'sistema.vistorias_laudos_finais'), 'vlf.id_laudo_final = lf.id', null);
    	$subSelectIS->join(array('lfis'=>'sinistro.laudos_finais_itens_segurados'), 'lfis.id_laudo_final = lf.id and (id_motivo_quadra_nao_vistoriada not in (6,8,10) or id_motivo_quadra_nao_vistoriada is null)', 'id_item_segurado');
    	$subSelectIS->join(array('sp'=>'sinistro.processos'), 'sp.id = lf.id_processo', null);
    	$subSelectIS->join(array('va'=>'sinistro.vistorias_avisos'), 'va.id_vistoria = vlf.id_vistoria', null);
    	$subSelectIS->where('sp.id_proposta = ?', $idProposta);
    	$subSelectIS->where('lf.id_cobertura = ?', $idCobertura);
    	$subSelectIS->where('lf.fl_evento_nao_constatado = false');
    	$subSelectIS->where('lf.id_status in (109,110,211)'); //"Pendente Envio", "Pendente de Laudo", "Enviada",
    	$subSelectIS->where('va.id_aviso in (select id_aviso from sinistro.vistorias_avisos where id_vistoria = '.$idVistoria.')');
    	$subSelectIS->where('lfis.id_status = 302');

    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('iseg' => 'seguro.itens_segurados'), array('id as id_item_segurado'));
    	$select->where('iseg.id_proposta = ?', $idProposta);
    	$select->where('iseg.vl_lmga > 0');
    	$select->where("iseg.id not in ($subSelectIS)");
    	$select->where("iseg.id not in (select id_item_segurado from sinistro.avisos_encerramento_itens_segurados where fl_del=false)");

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

    public function verificaTodosItensVistoriados($idVistoria){
    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('lf'=>'sinistro.laudos_finais'), null);
    	$select->join(array('vlf'=>'sistema.vistorias_laudos_finais'), 'vlf.id_laudo_final = lf.id', null);
    	$select->join(array('vis'=>'sistema.vistorias_itens_segurados'), 'vis.id_vistoria = vlf.id_vistoria', 'count(id_item_segurado)');
    	$select->where('vlf.id_vistoria = ?', $idVistoria);
    	$select->where("vis.id_item_segurado not in (select id_item_segurado from sinistro.laudos_finais_itens_segurados where id_laudo_final = lf.id)");

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

    public function getAvisosNaoVistoriados($idCobertura, $idProposta, $idVistoria){
	    $subselect1 = $this->select()->setIntegrityCheck(false);
	    $subselect1->from(array('ae'=>'sinistro.avisos_eventos'), array('id_aviso'));
	    $subselect1->join(array('ce'=>'produto.coberturas_eventos'), 'ce.id_evento = ae.id_evento', null);
	    $subselect1->where('ce.id_cobertura = ?', $idCobertura);

	    $select = $this->select()->setIntegrityCheck(false);
	    $select->from(array('a'=>'sinistro.avisos'), array('a.id', 'fl_dispensa_preliminar'));
	    $select->join(array('st'=>'sistema.status'), "st.id = a.id_status and st.ds_chave = 'ACEITO'", null);
	    $select->where('a.id_proposta = '.$idProposta);
	    $select->where('a.dt_sinistro < ?', 'now()');
	    $select->where('fl_ocorrencia_queda_parreiral is true or a.id in (?)', $subselect1);
	    $select->where('a.id not in (select id_aviso from sinistro.vistorias_avisos where id_vistoria <> '.$idVistoria.' and id_vistoria in (select id_vistoria from sistema.vistorias_laudos_finais))');

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

    public function getItensNaoSalvos($idProposta, $idItem, $idLaudoFinal) {
        $select = "
                    select
                        item.id_proposta,
                        item.id,
                        item.nr_item_segurado,
                        item.ds_item_segurado,
                        item.vl_area,
                        item.vl_lmga,
                        v.ds_nome_variedade
                    from
                           seguro.itens_segurados item
                    inner join produto.variedades v on (v.id = item.id_variedade)
                    where
                        item.id_proposta = $idProposta
                        and item.fl_ativo = true
                        and item.id not in (
                                    select
                                        lfis.id_item_segurado
                                    from
                                        sinistro.laudos_finais_itens_segurados lfis
                                    where
                                        lfis.id_laudo_final = $idLaudoFinal
                                )
                        and item.id != $idItem
                    order by
                        item.id
        ";

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

    public function getItens(
        ?int $id_proposta,
        ?int $id_processo,
        $fl_liquidacao_avulsa = false,
        ?int $id_cobertura,
        $id_produto = null
    ) {
        $ModelProposta = new Seguro_Model_Propostas();
        $ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();

        if ($id_cobertura) {
            $Proposta = $ModelProposta->find($id_proposta)->current();
            $TipoLiquidacao = $ModelProdutoCobertura->getTipoLiquidacao($Proposta->id_produto, $id_cobertura);

            if ($TipoLiquidacao["fl_liquidacao_manual"]) {
                $Select = $this->select()->setIntegrityCheck(false)->distinct(true);

                $Select->from(array("iseg" => "seguro.itens_segurados"), array("iseg.id_proposta", "iseg.id as id_item_segurado", "iseg.nr_item_segurado", "iseg.ds_item_segurado", "iseg.vl_area", "iseg.vl_lmga", "iseg.vl_rendimento_tonelada"));
                $Select->joinInner(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", "v.ds_nome_variedade");
                $Select->joinInner(array("pc" => "seguro.propostas_coberturas"), "pc.id_proposta = iseg.id_proposta", false);
                $Select->joinInner(array("ave" => "sinistro.avisos_encerramento_itens_segurados"), "ave.id_item_segurado = iseg.id", false);

                if ($id_cobertura == 16) { //COB_PROTECAO_FITO
                    $siglaLaudoFinal = '';
                    $modelProdutosCoberturas = new Produto_Model_ProdutosCoberturas();
                    $row = $modelProdutosCoberturas->getCoberturaPrincipal($id_produto, $id_cobertura);

                    if (!empty($row)) {
                        $idTipoLaudoFinal = null;

                        if (!empty($row['id_tipo_laudo_final'])) {
                            $idTipoLaudoFinal = $row['id_tipo_laudo_final'];
                        }

                        if (empty($row['id_tipo_laudo_final']) && !$row['fl_cobertura_principal']) {
                            $row = $modelProdutosCoberturas->getCoberturaPrincipal($id_produto);

                            if (!empty($row) && !empty($row['id_tipo_laudo_final'])) {
                                $idTipoLaudoFinal = $row['id_tipo_laudo_final'];
                            }
                        }

                        if (!empty($idTipoLaudoFinal)) {
                            $rowTipoLaudo = (new Sinistro_Model_TipoLaudoFinal())->find($idTipoLaudoFinal)->current();

                            if (!empty($rowTipoLaudo)) {
                                $siglaLaudoFinal = strtolower($rowTipoLaudo['ds_chave']);
                            }
                        }
                    }

                    if (!empty($siglaLaudoFinal)) {
                        $Select->join(array('slfis' => 'sinistro.laudos_finais_itens_segurados'), 'slfis.id_item_segurado = iseg.id', false);
                        $Select->join(array('rlfis' => "regulacao.{$siglaLaudoFinal}_itens_segurados"), 'rlfis.id_laudo_final_item_segurado = slfis.id', false);
                        $Select->joinLeft(array('lpis' => 'sinistro.laudos_preliminares_itens_segurados'), 'lpis.id_item_segurado = iseg.id', false);
                        $Select->where("(lpis.fl_direito_fitossanitaria = true or rlfis.fl_indenizacao_fitossanitaria = true)");
                    } else {
                        return [];
                    }
                }
                
                $Select->where("iseg.id_proposta = {$id_proposta}");
                $Select->where("pc.id_cobertura = {$id_cobertura}");

                $Select->order("iseg.id asc");

                $Row = $this->fetchAll($Select);

                $result = array();

                if ($Row) {
                    $itens = $Row->toArray();
                    foreach ($itens as $iten) {
                        if ($this->naoExisteLiquidacaoAnterior($id_processo, $iten['id_item_segurado'], $id_cobertura)) {
                            $iten["LAUDOS"] = array();
                            $result[] = $iten;
                        }
                    }
                }
                return $result;
            } else {
                
                return $this->getQuadrasComLaudo($id_proposta, $id_processo, $fl_liquidacao_avulsa, $id_cobertura);
            }
        } else {
            return $this->getQuadrasLiquidacao($id_proposta, $id_processo, $fl_liquidacao_avulsa, $id_cobertura);
        }
    }

    public function naoExisteLiquidacaoAnterior($id_processo, $id_item_segurado, $id_cobertura = false) {
        $Select = $this->select()->setIntegrityCheck(false);

        $Select->from(array("lisc" => "sinistro.liquidacoes_itens_segurados_coberturas"));
        $Select->joinInner(array("l" => "sinistro.liquidacoes"), "l.id=lisc.id_liquidacao", false);

        $Select->where("l.id_processo=$id_processo");
        $Select->where("lisc.id_item_segurado=$id_item_segurado");

        if ($id_cobertura) {
            $Select->where("lisc.id_cobertura=$id_cobertura");
        }

        $Row = $this->fetchAll($Select);

        $Row = ($Row ? $Row->toArray() : array());

        return (count($Row) > 0 ? false : true);
    }

    public function getQuadrasComLaudo(
        ?int $id_proposta,
        ?int $id_processo,
        $fl_liquidacao_avulsa = false,
        ?int $id_cobertura
    ) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array("lf" => "sinistro.laudos_finais"), false)->distinct();
        $select->join(array('lfis' => 'sinistro.laudos_finais_itens_segurados'), 'lfis.id_laudo_final = lf.id and (lfis.fl_nao_vistoriada = false or lfis.id_motivo_quadra_nao_vistoriada in (1,2,3,5,7,4,9))', false);
        $select->joinLeft(array("mt" => "sinistro.motivos_quadra_nao_vistoriada"), "mt.id = lfis.id_motivo_quadra_nao_vistoriada", 'ds_motivo');
        $select->join(array("pc" => "sinistro.processos"), "pc.id = lf.id_processo", false);
        $select->join(array("svl" => "sistema.vistorias_laudos_finais"), "svl.id_laudo_final = lf.id", false);
        $select->join(array("sv" => "sistema.vistorias"), "svl.id_vistoria = sv.id and sv.fl_vistoria_valida=true", false);
        $select->join(array("pr" => "seguro.propostas"), "pr.id = pc.id_proposta", false);
        $select->join(array("pco" => "produto.produtos_coberturas"), "pco.id_produto = pr.id_produto and pco.id_cobertura = lf.id_cobertura", false);
        $select->join(array('tl' => 'sinistro.tipo_liquidacao'), 'tl.id = pco.id_tipo_liquidacao', false);
        $select->join(array('st' => 'sistema.status'), "st.id = lf.id_status and (st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        $select->join(array("iseg" => "seguro.itens_segurados"), "iseg.id = lfis.id_item_segurado", array("iseg.id as id_item_segurado", "iseg.id_proposta", "iseg.nr_item_segurado", "iseg.ds_item_segurado", "iseg.vl_area", "iseg.vl_lmga"));
        $select->join(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", "v.ds_nome_variedade");

        if ($id_cobertura == 30) { //COB_REPLANTIO_SEM_ESTIAGEM
            $select->joinLeft(array('afris' => 'sinistro.avisos_final_replantio_itens_segurados'), 'afris.id_item_segurado = lfis.id_item_segurado', false);
            $select->joinLeft(array('afr' => 'sinistro.avisos_final_replantio'), 'afr.id = afris.id_aviso_final_replantio', "to_char(afr.dt_final_replantio, 'DD/MM/YYYY') as dt_final_replantio");
            $select->join(array('rlfis' => 'regulacao.lf026_itens_segurados'), 'rlfis.id_laudo_final_item_segurado = lfis.id', array('vl_ha_area_replantada', 'dt_replantio', 'fl_replantio_dentro_zoneamento'));
        } else {
            $select->join(array("aeis" => "sinistro.avisos_encerramento_itens_segurados"), "aeis.id_item_segurado = lfis.id_item_segurado", false);
            $select->join(array("ae" => "sinistro.avisos_encerramento"), "ae.id = aeis.id_aviso_encerramento", "to_char(ae.dt_encerramento_colheita, 'DD/MM/YYYY') as dt_encerramento_colheita");
        }

        $select->joinLeft(array('lislf' => 'sinistro.liquidacoes_itens_segurados_coberturas_lf'), 'lislf.id_laudo_final_item_segurado = lfis.id', false);
        $select->joinLeft(array('lis' => 'sinistro.liquidacoes_itens_segurados_coberturas'), 'lis.id_item_segurado = lfis.id_item_segurado and lis.id_cobertura = ' . $id_cobertura, false);

        $select->where('lf.id_processo = ?', $id_processo);
        $select->where('lislf.id is null');
        $select->where('lis.id is null');
        $select->where('lfis.fl_disponivel_liquidacao is true');

        if ($fl_liquidacao_avulsa) {
            $select->where("tl.fl_liquidacao_avulsa = true");
            $select->where("pco.id_cobertura = ?", $id_cobertura);
        } else {
            $select->where("tl.fl_liquidacao_avulsa = false");
        }

        $select->order('iseg.nr_item_segurado');

        $row = $this->fetchAll($select);

        $result = array();
        if ($row) {
            $itens = $row->toArray();
            foreach ($itens as $item) {
                $idItemSegurado = !Agro_Util::filterVariable($item['id_item_segurado'])
                    ? 0
                    : (int)$item['id_item_segurado'];

                $item["LAUDOS"] = $this->getLaudos(
                    $id_processo,
                    $id_proposta,
                    $idItemSegurado,
                    $fl_liquidacao_avulsa,
                    false,
                    $id_cobertura
                );

                $result[$item['nr_item_segurado']] = $item;
            }
        }

        /*
         * Busca itens que foram marcados como não sinistrados no Laudo Preliminar e que não possuem Laudo Final
         */
        $select = $this->select()->setIntegrityCheck(false);

        $select->from(array("lp" => "sinistro.laudos_preliminares"), false)->distinct(true);
        $select->join(array('lpis' => 'sinistro.laudos_preliminares_itens_segurados'), 'lpis.id_laudo_preliminar = lp.id and lpis.fl_quadra_sinistrada=false', false);
        $select->join(array("pc" => "sinistro.processos"), "pc.id = lp.id_processo", false);
        $select->join(array("svl" => "sistema.vistorias_laudos_preliminares"), "svl.id_laudo_preliminar = lp.id", false);
        $select->join(array("sv" => "sistema.vistorias"), "svl.id_vistoria = sv.id and sv.fl_vistoria_valida=true", false);
        $select->join(array("pr" => "seguro.propostas"), "pr.id = pc.id_proposta", false);
        $select->join(array("pco" => "produto.produtos_coberturas"), "pco.id_produto = pr.id_produto and pco.id_cobertura = lp.id_cobertura", false);
        $select->join(array('tl' => 'sinistro.tipo_liquidacao'), 'tl.id = pco.id_tipo_liquidacao', false);
        $select->join(array('st' => 'sistema.status'), "st.id = lp.id_status and (st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        $select->join(array("aeis" => "sinistro.avisos_encerramento_itens_segurados"), "aeis.id_item_segurado = lpis.id_item_segurado", false);
        $select->join(array("ae" => "sinistro.avisos_encerramento"), "ae.id = aeis.id_aviso_encerramento", "to_char(ae.dt_encerramento_colheita, 'DD/MM/YYYY') as dt_encerramento_colheita");
        $select->join(array("iseg" => "seguro.itens_segurados"), "iseg.id = lpis.id_item_segurado", array("iseg.id as id_item_segurado", "iseg.id_proposta", "iseg.nr_item_segurado", "iseg.ds_item_segurado", "iseg.vl_area", "iseg.vl_lmga"));
        $select->join(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", "v.ds_nome_variedade");
        $select->joinLeft(array('lis' => 'sinistro.liquidacoes_itens_segurados_coberturas'), 'lis.id_item_segurado = lpis.id_item_segurado and lis.id_cobertura = ' . $id_cobertura, false);
        $select->where('lis.id is null');
        $select->where('lp.id_processo = ?', $id_processo);

        if ($fl_liquidacao_avulsa) {
            $select->where("tl.fl_liquidacao_avulsa = true");
            $select->where("pco.id_cobertura = ?", $id_cobertura);
        } else {
            $select->where("tl.fl_liquidacao_avulsa = false");
        }

        $select->order('iseg.nr_item_segurado');

        $row = $this->fetchAll($select);

        if ($row) {
            $itens = $row->toArray();
            foreach ($itens as $iten) {
                if (array_key_exists($iten['nr_item_segurado'], $result)) {
                    continue;
                }
                $iten['ds_motivo'] = 'Evento não constatado na Vistoria Preliminar';
                $result[$iten['nr_item_segurado']] = $iten;
            }
        }

        ksort($result);

        return $result;
    }

    public function getQuadrasLiquidacao(
        ?int $id_proposta,
        ?int $id_processo,
        $fl_liquidacao_avulsa = false,
        ?int $id_cobertura)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array("pr" => "seguro.propostas"), false);
        $select->join(array("iseg" => "seguro.itens_segurados"), "iseg.id_proposta = pr.id", array("iseg.id as id_item_segurado", "iseg.id_proposta", "iseg.nr_item_segurado", "iseg.ds_item_segurado", "iseg.vl_area", "iseg.vl_lmga"));
        $select->join(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", "v.ds_nome_variedade");
        $select->join(array("pc" => "sinistro.processos"), "pc.id_proposta = pr.id", false);
        $select->join(array("lf" => "sinistro.laudos_finais"), "lf.id_processo = pc.id", false);
        $select->join(array('lfis' => 'sinistro.laudos_finais_itens_segurados'), 'lfis.id_laudo_final = lf.id and lfis.fl_nao_vistoriada = false', false);
        $select->join(array("svl" => "sistema.vistorias_laudos_finais"), "svl.id_laudo_final = lf.id", false);
        $select->join(array("sv" => "sistema.vistorias"), "svl.id_vistoria = sv.id and sv.fl_vistoria_valida=true", false);
        $select->join(array("pco" => "produto.produtos_coberturas"), "pco.id_produto = pr.id_produto and pco.id_cobertura = lf.id_cobertura", false);
        $select->join(array('tl' => 'sinistro.tipo_liquidacao'), 'tl.id = pco.id_tipo_liquidacao', false);
        $select->join(array('st' => 'sistema.status'), "st.id = lf.id_status and (st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        $select->join(array("aeis" => "sinistro.avisos_encerramento_itens_segurados"), "aeis.id_item_segurado = lfis.id_item_segurado", false);
        $select->join(array("ae" => "sinistro.avisos_encerramento"), "ae.id = aeis.id_aviso_encerramento", "to_char(ae.dt_encerramento_colheita, 'DD/MM/YYYY') as dt_encerramento_colheita");
        $select->joinLeft(array('lislf' => 'sinistro.liquidacoes_itens_segurados_coberturas_lf'), 'lislf.id_laudo_final_item_segurado = lfis.id', false);

        $select->where('lf.id_processo = ?', $id_processo);
        $select->where('lislf.id is null');
        $select->where('lfis.fl_disponivel_liquidacao is true');

        if ($fl_liquidacao_avulsa) {
            $select->where("tl.fl_liquidacao_avulsa = true");
            $select->where("pco.id_cobertura = ?", $id_cobertura);
        } else {
            $select->where("tl.fl_liquidacao_avulsa = false");
        }

        $select->order('iseg.nr_item_segurado');

        $row = $this->fetchAll($select);

        $result = array();
        if ($row) {
            $itens = $row->toArray();
            foreach ($itens as $item) {
                $idItemSegurado = !Agro_Util::filterVariable($item['id_item_segurado'])
                    ? 0
                    : (int)$item['id_item_segurado'];

                $item["LAUDOS"] = $this->getLaudos(
                    $id_processo,
                    $id_proposta,
                    $idItemSegurado,
                    $fl_liquidacao_avulsa,
                    false,
                    $id_cobertura
                );
                $result[] = $item;
            }
        }

        return $result;
    }

    public function getLaudos(
        ?int $id_processo,
        ?int $id_proposta,
        ?int $id_item_segurado,
        $fl_liquidacao_avulsa,
        $id_dependencia = false,
        ?int $id_cobertura = null,
        $fl_nao_vistoriada = false,
        $tipo_liquidacao = false
    ) {
        $Coberturas = false;

        $SubSelect = new Zend_Db_Expr("
			select
				min(av.dt_sinistro)
			from
				sinistro.avisos av inner join
				sinistro.vistorias_avisos vav on vav.id_aviso = av.id inner join
				sistema.vistorias_laudos_finais vlf on vlf.id_vistoria = vav.id_vistoria inner join
        		sistema.vistorias v on vlf.id_vistoria = sv.id and v.fl_vistoria_valida=true
			where
				vlf.id_laudo_final = lf.id
		");

        $Select = $this->select()->setIntegrityCheck(false)->distinct(true);
        $Select->from(array("lf" => "sinistro.laudos_finais"), array("lf.id_cobertura", "lf.dt_vistoria", "($SubSelect) as dt_aviso_sinistro"));
        $Select->joinInner(array("svl" => "sistema.vistorias_laudos_finais"), "svl.id_laudo_final = lf.id", false);
        $Select->joinInner(array("sv" => "sistema.vistorias"), "svl.id_vistoria = sv.id and sv.fl_vistoria_valida=true", false);
        $Select->joinInner(array('st' => 'sistema.status'), "st.id = lf.id_status and (st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        $Select->joinInner(array("lfis" => "sinistro.laudos_finais_itens_segurados"), "lfis.id_laudo_final = lf.id", array('lfis.id as id_laudo_final_item_segurado', 'lfis.vl_percent_perdas as percentual_dano', "lfis.vl_percent_colhido", 'lfis.vl_percent_perdas_chocho', "lfis.vl_percent_colhido_chocho", "lfis.vl_rendimento_final_lavoura"));
        $Select->joinInner(array("p" => "sinistro.processos"), "p.id = lf.id_processo", false);
        $Select->joinInner(array("pr" => "seguro.propostas"), "pr.id = p.id_proposta", false);
        $Select->joinInner(array("c" => "produto.coberturas"), "c.id = lf.id_cobertura", array('c.ds_nome_cobertura as nome_cobertura', 'c.ds_chave_cobertura'));
        $Select->joinInner(array("pco" => "produto.produtos_coberturas"), "pco.id_cobertura = c.id and pco.id_produto = pr.id_produto", 'pco.nr_prioridade_liquidacao');
        $Select->joinInner(array('tl' => 'sinistro.tipo_liquidacao'), 'tl.id = pco.id_tipo_liquidacao', false);

        $Select->where("lf.id_processo = {$id_processo}");
        $Select->where("p.id_proposta = {$id_proposta}");
        $Select->where("lfis.id_item_segurado = {$id_item_segurado}");
        $Select->where("lfis.fl_disponivel_liquidacao is true");

        // para liquidação multirisco
        if (!$fl_nao_vistoriada) {
            $Select->where("lfis.fl_nao_vistoriada is false");
        } else {
            if ($tipo_liquidacao == 'LIQ10') {
                $Select->where("lfis.id_motivo_quadra_nao_vistoriada IS NULL OR lfis.id_motivo_quadra_nao_vistoriada = 1");
            } else {
                $Select->where("lfis.id_motivo_quadra_nao_vistoriada IS NULL OR lfis.id_motivo_quadra_nao_vistoriada IN (1,2,3,4,7)");
            }
        }

        if ($fl_liquidacao_avulsa) {
            $Select->where("tl.fl_liquidacao_avulsa = true");
            $Select->where("pco.id_cobertura = ?", $id_cobertura);
        } else {
            $Select->where("tl.fl_liquidacao_avulsa = false");
        }

        $Select->order("dt_aviso_sinistro ASC");

        $Row = $this->fetchAll($Select);

        if ($Row) {
            $ArrCoberturas = $Row->toArray();

            $Coberturas = array();
            foreach ($ArrCoberturas as $cobertura) {
                $cobertura["dependente"] = false;

                $Coberturas[] = $cobertura;
            }
        }

        return $Coberturas;
    }

    public function getCoberturaLiquidacaoManual($id_processo, $id_proposta, $id_item_segurado, $fl_liquidacao_avulsa, $id_cobertura = null) {
        $Coberturas = false;

        $Select = $this->select()->setIntegrityCheck(false)->distinct(true);
        $Select->from(array("pc" => "seguro.propostas_coberturas"), false);
        $Select->joinInner(array("c" => "produto.coberturas"), "c.id = pc.id_cobertura", "c.ds_nome_cobertura as nome_cobertura");
        $Select->where("pc.id_proposta = $id_proposta");
        $Row = $this->fetchAll($Select);

        if ($Row) {
            $ArrCoberturas = $Row->toArray();

            $Coberturas = array();
            foreach ($ArrCoberturas as $cobertura) {
                $cobertura["dependente"] = false;

                $Coberturas[] = $cobertura;
            }
        }

        return $Coberturas;
    }

    public function getItensLaudoFinal($id_laudo_final) {
        $Select = $this->select()->setIntegrityCheck(false);

        $Select->from(array("lfis" => "sinistro.laudos_finais_itens_segurados"), array("lfis.id as id_laudo_final_item_segurado", "lfis.id_motivo_quadra_nao_vistoriada", "lfis.vl_percent_colhido", "lfis.vl_percent_perdas", "lfis.vl_rendimento_final_lavoura", "lfis.ds_nome_laudo_fisico", 'lfis.fl_assinado'));
        $Select->joinInner(array("iseg" => "seguro.itens_segurados"), "iseg.id = lfis.id_item_segurado", array("id as id_item_segurado", "ds_item_segurado", "vl_area", "vl_lmga", 'nr_item_segurado'));
        $Select->joinInner(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", array("v.ds_nome_variedade"));
        $Select->join(array("st" => "sistema.status"), "st.id = lfis.id_status", array("ds_status"));
        $Select->where("lfis.id_laudo_final = $id_laudo_final");
        $Select->order("iseg.nr_item_segurado");

        $Row = $this->fetchAll($Select);

        return ($Row ? $Row->toArray() : array());
    }

    public function getItemLaudoFinal($id_laudo_final_item_segurado) {
        $Select = $this->select()->setIntegrityCheck(false);

        $Select->from(array("lfis" => "sinistro.laudos_finais_itens_segurados"), array("lfis.id as id_laudo_final_item_segurado", "lfis.id_motivo_quadra_nao_vistoriada", "lfis.vl_percent_colhido", "lfis.vl_percent_perdas", "lfis.vl_rendimento_final_lavoura"));
        $Select->joinInner(array("iseg" => "seguro.itens_segurados"), "iseg.id = lfis.id_item_segurado", array("id as id_item_segurado", "ds_item_segurado", "vl_area", "vl_lmga", 'nr_item_segurado'));
        $Select->joinInner(array("v" => "produto.variedades"), "v.id = iseg.id_variedade", array("v.ds_nome_variedade"));
        $Select->where("lfis.id = $id_laudo_final_item_segurado");

        $Row = $this->fetchRow($Select);

        return ($Row ? $Row->toArray() : array());
    }

    public function getAreaItensSelecionados($id_laudo_final) {
        $area = 0;

        $FItensSegurados = $this->getItensLaudoFinal($id_laudo_final);
        foreach ($FItensSegurados as $item) {
            $area += $item['vl_area'];
        }

        return $area;
    }

    public function existeLaudoFinalEnviado($idProcesso) {

        $Select = $this->select()->setIntegrityCheck(false);

        $Select->from(array('lf' => $this->_schema . '.' . $this->_name), 'id');
        $Select->join(array('st' => 'sistema.status'), "st.id = lf.id_status and (st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        $Select->where('lf.id_processo = ?', $idProcesso);
        $Rs = $this->fetchRow($Select);

        if(!$Rs){
        	$Select = $this->select()->setIntegrityCheck(false);
        	$Select->from(array('lp' => 'sinistro.laudos_preliminares'), 'id');
        	$Select->join(array('st' => 'sistema.status'), "st.id = lp.id_status and st.ds_chave = 'ENVIADO' OR st.ds_chave = 'TRANSMITIDA_SEM_FOTOS')", false);
        	$Select->where('lp.id_processo = ?', $idProcesso);
        	$Rs = $this->fetchRow($Select);
        }

        return ($Rs ? 1 : 0);
    }

    public function getDsChaveStatus($idLaudoFinal) {
        $Select = $this->select()->setIntegrityCheck(false);

        $Select->from(array('lf' => $this->_schema . '.' . $this->_name), null);
        $Select->join(array('st' => 'sistema.status'), "st.id = lf.id_status", 'ds_chave');
        $Select->where('lf.id = ?', $idLaudoFinal);

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

    public function getLaudoFinal($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
                array(
            'lf' => 'sinistro.laudos_finais'
                ), array(
            'id as id_laudo_final',
            'id_processo',
            'id_cobertura',
            'fl_assinatura_regulador',
            'fl_assinatura_segurado',
            'ds_observacao_assinatura_regulador',
            'ds_observacao_assinatura_segurado',
            'fl_evento_nao_constatado',
            'fl_area_atingida',
            'fl_area_vistoriada',
            'id_status',
            'ds_observacao',
            'ds_coordenadas',
            'fl_dt_evento_em_cobertura',
            'fl_sincronizado',
            'fl_transmitido_tablet',
            new Zend_Db_Expr(" CASE WHEN fl_area_declarada_representa_area_cultivada IS TRUE
                                THEN 1 ELSE 0 END AS fl_area_declarada_representa_area_cultivada"),
            'vl_tamanho_planta',
            "to_char(dt_vistoria, 'dd/mm/yyyy') as dt_vistoria_data",
            "to_char(dt_vistoria, 'HH24') as dt_vistoria_hora",
            "to_char(dt_vistoria, 'MI') as dt_vistoria_minutos",
            "ds_responsavel",
            "cpf_responsavel",
            "ds_tipo_responsavel",
            "id_motivo_vistoria_nao_vistoriada",
            "ds_email_segurado",
            "ds_telefone_segurado",
            "fl_transmitido_tablet",
            "ds_tipo_envio_laudo",
            "ds_tipo_envio_doc_acompanhante"
                )
        );
        $select->join(
                array(
            'st' => 'sistema.status'
                ), 'st.id = lf.id_status', array(
            'ds_status',
            'cd_status',
            'ds_chave as ds_chave_status'
                )
        );
        $select->join(
                array(
            'sp' => 'sinistro.processos'
                ), 'sp.id = lf.id_processo', array(
            'id_proposta'
                )
        );
        $select->join(
        		array(
        				'spe' => 'sinistro.processos_empresas'
        		), 'spe.id_processo = sp.id', array(
        				'id_empresa'
        		)
        );
        $select->join(
                array(
            'vlf' => 'sistema.vistorias_laudos_finais'
                ), 'vlf.id_laudo_final = lf.id', array(
            'id_vistoria'
                )
        );

        if($this->_request['module'] != 'sinistro' && $this->_request['module'] != 'sinistro2'){
	        $select->joinLeft(
	        		array(
	        				'lfe' => strtolower($this->_request['module']) . '.' . strtolower($this->_request['controller'])
	        		), 'lfe.id_laudo_final = lf.id', '*'
	        );
        }

        $select->where('lf.id = ?', $idLaudoFinal);

        $dataLaudoFinal = $this->_db->fetchRow($select);

        $Model_LaudosFinaisFuncionarios = new Sinistro2_Model_LaudosFinaisFuncionarios();

        $vistoriadores = $Model_LaudosFinaisFuncionarios->getArrayVistoriadoresByIdLaudoFinal($idLaudoFinal);

        if (count($vistoriadores) > 0) {
            $dataLaudoFinal['vistoriadores'] = $vistoriadores;
        }

        $auxiliares = $Model_LaudosFinaisFuncionarios->getArrayVistoriadoresByIdLaudoFinal($idLaudoFinal, true);

        if (count($auxiliares) > 0) {
            $dataLaudoFinal['auxiliares'] = $auxiliares;
        }

        return $dataLaudoFinal;
    }

    public function getLaudoFinalGeneralizacao($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
                array(
            'lf' => 'sinistro.laudos_finais'
                ), array(
            'id as id_laudo_final',
            'id_processo',
            'id_cobertura',
            'fl_assinatura_regulador',
            'fl_assinatura_segurado',
            'fl_evento_nao_constatado',
            'fl_area_atingida',
            'id_status',
            'ds_observacao',
            'ds_coordenadas'
                )
        );
        $select->join(
                array(
            'st' => 'sistema.status'
                ), 'st.id = lf.id_status', array(
            'ds_status',
            'cd_status',
            'ds_chave as ds_chave_status'
                )
        );
        $select->join(
                array(
            'sp' => 'sinistro.processos'
                ), 'sp.id = lf.id_processo', array(
            'id_proposta'
                )
        );
        $select->join(
                array(
            'vlf' => 'sistema.vistorias_laudos_finais'
                ), 'vlf.id_laudo_final = lf.id', array(
            'id_vistoria'
                )
        );
        $select->where('lf.id = ?', $idLaudoFinal);

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

    public function possuiPreliminar($idProposta, $idCobertura){
    	// Verifica se o produto/cobertura possui vistoria preliminar
    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('pr' => 'seguro.propostas'), null);
    	$select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_produto = pr.id_produto and pc.id_cobertura = ' . $idCobertura, 'fl_vistoria_preliminar');
    	$select->where('pr.id = ?', $idProposta);

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


    public function getItensSeguradosLaudoFinal($idProposta, $idCobertura, $idVistoria, $idLaudoFinal) {

    	$arItens = $this->getItensSeguradosLaudoFinalSemPreliminar($idVistoria, $idLaudoFinal);
    	return $arItens;


    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('sl' => 'sinistro.laudos_finais'), 'fl_area_atingida');
    	$select->where('sl.id = ?', $idLaudoFinal);
    	$fl_area_atingida = $this->_db->fetchOne($select);

        // Verifica se o produto/cobertura possui vistoria preliminar
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pr' => 'seguro.propostas'), null);
        $select->join(array('pc' => 'produto.produtos_coberturas'), 'pc.id_produto = pr.id_produto and pc.id_cobertura = ' . $idCobertura, 'fl_vistoria_preliminar');
        $select->where('pr.id = ?', $idProposta);

        // Array que irá receber os itens segurados do laudo
        $arItens = array();

        // Verifica se há dispensa de preliminar...
        $Model = new Sinistro2_Model_AvisosSinistro();

        $fl_dispensa_preliminar = false;
        $Avisos = $Model->fetchAll("id_proposta=$idProposta");
        foreach ($Avisos as $aviso) {
            if ($aviso->fl_dispensa_preliminar) {
                $fl_dispensa_preliminar = true;
            }
        }

        /*
         * Passa os parametros para o método de recuperação dos itens segurados do laudo, conforme a necessidade ou não
         * de vistoria preliminar do produto/cobertura
         */
        if ($this->_db->fetchOne($select) && !$fl_dispensa_preliminar) {
            try {
                $arItens = $this->getItensSeguradosLaudoFinalComPreliminar($idProposta, $idCobertura, $idVistoria, $idLaudoFinal, $fl_area_atingida);
            } catch (Exception $e) {
                echo $e->getMessage();
            }
        } else {
            $arItens = $this->getItensSeguradosLaudoFinalSemPreliminar($idVistoria, $idLaudoFinal);
        }

    }

    public function getItensSeguradosLaudoFinalSemPreliminar($idVistoria, $idLaudoFinal) {

    	$select = $this->select()->setIntegrityCheck(false);
        $select->from(
                array(
            'iseg' => 'seguro.itens_segurados'
                ), array(
            'id as id_item_segurado',
            'nr_item_segurado',
            'ds_item_segurado',
            'vl_area',
            'vl_lmga'
                )
        );
        $select->joinInner(
                array(
            'vis' => 'sistema.vistorias_itens_segurados'
                ), 'vis.id_item_segurado = iseg.id and id_vistoria = ' . $idVistoria, array(
            'id_vistoria'
                )
        );
        $select->joinLeft(
                array(
            'v' => 'produto.variedades'
                ), 'v.id = iseg.id_variedade', array(
            'ds_nome_variedade'
                )
        );
        $select->joinLeft(
                array(
            'lfis' => 'sinistro.laudos_finais_itens_segurados'
                ), "lfis.id_item_segurado = iseg.id and lfis.id_laudo_final = $idLaudoFinal", array(
            'id as id_laudo_final_item_segurado',
            'vl_percent_perdas',
            'vl_rendimento_final_lavoura',
            'fl_nao_vistoriada',
            'id_motivo_quadra_nao_vistoriada',
            'vl_percent_colhido',
            'vl_rendimento_final_lavoura',
            'vl_percent_perdas_chocho',
            'vl_percent_colhido_chocho',
            'vl_ha_area_afetada',
            'vl_ha_area_replantada',
            'id_item_segurado_origem',
            'fl_assinado',
            'fl_zoneamento_valido'
                )
        );

        $select->where('iseg.vl_lmga > 0');
        $select->order('iseg.nr_item_segurado');

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

    public function getItensSeguradosLaudoFinalComPreliminar($idProposta, $arAvisos, $idCobertura = '') {

        // Recupera grupo de itens relacionados a vistorias preliminares que ainda possuem vistoria final pendente
        $select = "
        		SELECT
      				iseg.id AS id_item_segurado
				FROM
					seguro.itens_segurados AS iseg
					inner join sinistro.laudos_preliminares_itens_segurados lpis on lpis.id_item_segurado = iseg.id
					inner join sistema.vistorias_laudos_preliminares AS vlp ON vlp.id_laudo_preliminar = lpis.id_laudo_preliminar
					inner join sistema.vistorias AS v ON v.id = vlp.id_vistoria
        		    inner join sinistro.laudos_preliminares AS lp on lp.id = vlp.id_laudo_preliminar and lp.id_status=76
				WHERE
					v.id in (select id_vistoria from sinistro.vistorias_avisos where id_aviso in (".$arAvisos."))
					AND iseg.id_proposta = ".$idProposta."
					AND iseg.vl_lmga > 0
					AND (lpis.id_intensidade != 10 or id_intensidade is null)
					AND (lpis.fl_quadra_sinistrada is null or lpis.fl_quadra_sinistrada = true)
				    AND iseg.id not in (
					select
					     lfis.id_item_segurado
					from
					     sinistro.laudos_finais_itens_segurados lfis
					     inner join sistema.vistorias_laudos_finais AS vlf ON vlf.id_laudo_final = lfis.id_laudo_final
					     inner join sistema.vistorias AS v2 ON v2.id = vlf.id_vistoria
                         inner join sinistro.laudos_finais lf on lf.id = lfis.id_laudo_final 
                         and lf.id_status in (109,110,211)
                         and lf.id_cobertura = $idCobertura
					where
					    v2.id in (select id_vistoria from sinistro.vistorias_avisos where id_aviso in (".$arAvisos."))
					    AND (id_motivo_quadra_nao_vistoriada is null or id_motivo_quadra_nao_vistoriada not in (6,8,10))
                        AND lfis.id_status = 302
				    )
		"; 

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

    public function isAreaParcial($idProposta, array $ItensSeguradosAtingidos) {

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('iseg' => 'seguro.itens_segurados'), 'count(id)');
        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');

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

        if (count($ItensSeguradosAtingidos) < $countItensComLMGA) {
            return true;
        } else {
            return false;
        }
    }

    public function saveItensSeguradosVistorias($idProposta, $idVistoria, $flAreaAtingida = null, $flAreaVistoriada = null, array $ItensSeguradosAtingidos = null) {
        try {

            $VistoriasItensSegurados = new Sistema_Model_VistoriasItensSegurados();

            $VistoriasItensSegurados->delete($idVistoria);

            $select = $this->select()->setIntegrityCheck(false);
            $select->from(array('iseg' => 'seguro.itens_segurados'), array('id as id_item_segurado'));
            $select->where('iseg.id_proposta = ?', $idProposta);
            $select->where('iseg.vl_lmga > 0');

            $ItensSeguradosProposta = $this->_db->fetchAll($select);

            if ($flAreaAtingida == 'T' || $flAreaVistoriada == 'T') {
                foreach ($ItensSeguradosProposta as $ItemSegurado) {
                    $data = array(
                        'id_vistoria' => $idVistoria,
                        'id_item_segurado' => $ItemSegurado['id_item_segurado']
                    );

                    $VistoriasItensSegurados->save($data);
                }
            } else {

                $LaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
                $idLaudoFinal               = $this->getIdLaudoFinalByVistoria($idVistoria);

                foreach ($ItensSeguradosProposta as $ItemSegurado) {

                    if (in_array($ItemSegurado['id_item_segurado'], $ItensSeguradosAtingidos)) {

                        $data = array(
                            'id_vistoria'      => $idVistoria,
                            'id_item_segurado' => $ItemSegurado['id_item_segurado']
                        );

                        $VistoriasItensSegurados->save($data);
                    } else {

                    	/*
                        if ($idLaudoFinal) {
                            $LaudosFinaisItensSegurados->delete($idLaudoFinal, $ItemSegurado['id_item_segurado']);
                        }
                        $VistoriasItensSegurados->delete($idVistoria, $ItemSegurado['id_item_segurado']);
                        */
                    }
                }
            }

            return true;
        } catch (Exception $e) {
            $this->setMessage($e->getMessage());
            return false;
        }
    }

    public function getIdLaudoFinalByVistoria($idVistoria) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('vlf' => 'sistema.vistorias_laudos_finais'), 'id_laudo_final');
        $select->where('vlf.id_vistoria = ?', $idVistoria);

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

    public function getVistoriaByLaudoFinal($idLaudoFinal) {
    	$select = $this->select()->setIntegrityCheck(false);
    	$select->from(array('vlf' => 'sistema.vistorias_laudos_finais'), 'id_laudo_final');
    	$select->join(array('v'   => 'sistema.vistorias'), 'v.id = vlf.id_vistoria');
    	$select->where('vlf.id_laudo_final = ?', $idLaudoFinal);

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

    public function saveItensNaoVistoriadosLaudoFinal($idLaudoFinal, array $ItensSegurados) {

        $LaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
        foreach ($ItensSegurados as $idItemSegurado => $idMotivoNaoVistoriado) {

            if ($idMotivoNaoVistoriado == 0) {
                $select = $this->select()->setIntegrityCheck(false);
                $select->from(
                        array(
                    'lfis' => 'sinistro.laudos_finais_itens_segurados'
                        ), 'id_motivo_quadra_nao_vistoriada'
                );
                $select->where('lfis.id_laudo_final = ?', $idLaudoFinal);
                $select->where('lfis.id_item_segurado = ?', $idItemSegurado);

                if ($this->_db->fetchOne($select)) {
                    $LaudosFinaisItensSegurados->delete($idLaudoFinal, $idItemSegurado);
                }
            } else {

                $LaudosFinaisItensSegurados->delete($idLaudoFinal, $idItemSegurado);

                $LaudosFinaisItensSegurados->save(
                        array(
                            'id_laudo_final' => $idLaudoFinal,
                            'id_item_segurado' => $idItemSegurado,
                            'id_motivo_quadra_nao_vistoriada' => $idMotivoNaoVistoriado,
                            'fl_nao_vistoriada' => 1
                        )
                );
            }
        }
    }

    public function deleteEventoNaoConstatado($idLaudoFinal, $dados) {
        $Model_LaudosFinaisItensSegurados = new Sinistro2_Model_LaudosFinaisItensSegurados();
        $Model_LaudosFinaisItensSegurados->delete($idLaudoFinal);

        $Model_VistoriasItensSegurados = new Sistema_Model_VistoriasItensSegurados();
        $Model_VistoriasItensSegurados->delete($dados['id_vistoria']);

        return true;
    }

    public function isComplete($idLaudoFinal, $flPreliminar = null) {

        if ($idLaudoFinal) {

            $LaudoFinal = $this->find($idLaudoFinal)->current();

            if (Agro_Util::checkPermission('sinistro2:laudofinal:laudodigitalizado')) {
            	$ModeLaudoIS = new Sinistro2_Model_LaudosFinaisItensSegurados();

            	$LaudosFinaisIS = $ModeLaudoIS->fetchAll("id_laudo_final = $idLaudoFinal");

            	foreach ($LaudosFinaisIS as $Item) {
            		if (!$Item->ds_nome_laudo_fisico && !$Item->fl_nao_vistoriada) {
            			//return false;
            		}
            	}
            }

            $select = $this->select()->setIntegrityCheck(false);
            $select->from(array('vis' => 'sistema.vistorias_laudos_finais'), 'id_vistoria');
            $select->where('vis.id_laudo_final = ?', $idLaudoFinal);
            $idVistoria = $this->_db->fetchOne($select);

            $select = $this->select()->setIntegrityCheck(false);
            $select->from(array('lfis' => 'sinistro.laudos_finais_itens_segurados'), 'count(id_item_segurado)');
            $select->where('lfis.id_laudo_final = ?', $idLaudoFinal);
            $select->where('(lfis.fl_nao_vistoriada = true or lfis.vl_percent_perdas is not null or lfis.vl_rendimento_final_lavoura is not null)');
            $nrLaudosFinaisItensSegurados = $this->_db->fetchOne($select);

            if ($idVistoria) {
            	$select = $this->select()->setIntegrityCheck(false);
            	$select->from(array('vis' => 'sistema.vistorias_itens_segurados'), 'count(id_item_segurado)');
            	$select->where('vis.id_vistoria = ?', $idVistoria);
            	$nrVistoriasItensSegurados = $this->_db->fetchOne($select);
            } else {
            	$nrVistoriasItensSegurados = null;
            }

            if ($flPreliminar) {
            	if ($nrVistoriasItensSegurados > 0) {
            		return true;
            	} else {
            		if($LaudoFinal['fl_evento_nao_constatado'] == true){
            			return true;
            		}
            		return false;
            	}
            } else {
            	if ($nrVistoriasItensSegurados > 0  || $nrVistoriasItensSegurados == $nrLaudosFinaisItensSegurados) {
            		return true;
            	} else {
            		return false;
            	}
            }

        } else {
            return false;
        }
    }

    public function isReadonly($idLaudoFinal) {
        $Model_LaudosFinais = new Sinistro2_Model_LaudosFinais();
        $LaudoFinal = $this->getLaudoFinalGeneralizacao($idLaudoFinal);

        $User = Zend_Auth::getInstance()->getIdentity();

        $Funcionario = new Sistema_Model_Funcionarios();
        $f = $Funcionario->fetchRow('id_usuario = ' . $User->id);
        $idEmpresaUserLogado = $f['id_empresa'];

        $VistoriaEmpresa = new Sistema_Model_VistoriasEmpresas();
        $idEmpresaVistoriadora = $VistoriaEmpresa->getIdEmpresaByLaudoFinal($idLaudoFinal);

        if (
            in_array($LaudoFinal['ds_chave_status'], ['ENVIADO', 'ENVIADO_NAO_ASSINADO']) 
            || ($idEmpresaUserLogado != $idEmpresaVistoriadora && $User->tp_usuario != 'F')
        ) {
            return true;
        } else {
            return false;
        }
    }

    public function getPeriodoVistoria($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lfis' => 'sinistro.laudos_finais_itens_segurados'), array('dt_inicio_vistoria' => "(to_char(min(dt_vistoria), 'DD/MM/YYYY'))", 'dt_fim_vistoria' => "(to_char(max(dt_vistoria),'DD/MM/YYYY'))"));
        $select->where('lfis.id_laudo_final = ?', $idLaudoFinal);

        $Rs = $this->fetchRow($select);

        if ($Rs) {
            if ($Rs->dt_inicio_vistoria) {
                if ($Rs->dt_inicio_vistoria == $Rs->dt_fim_vistoria) {
                    return $Rs->dt_inicio_vistoria;
                } else {
                    return $Rs->dt_inicio_vistoria . ' - ' . $Rs->dt_fim_vistoria;
                }
            } else {
                $select = $this->select()->setIntegrityCheck(false);
                $select->from(array('lfis' => 'sinistro.laudos_finais'), array('dt_vistoria' => "(to_char(dt_vistoria, 'DD/MM/YYYY'))"));
                $select->where('lfis.id = ?', $idLaudoFinal);

                $Rs = $this->fetchRow($select);
                return $Rs->dt_vistoria;
            }
        } else {
            return '-';
        }
    }

    public function getIdProcessoByIdLaudoFinal($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lf' => 'sinistro.laudos_finais'), 'id_processo');
        $select->where('lf.id = ?', $idLaudoFinal);

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

    public function delete($id) {
        //Exclui arquivos do laudo
        $ModelLaudoArquivos = new Sinistro2_Model_LaudosFinaisArquivos();
        $ModelLaudoArquivos->deleteArquivosLaudoFinal($id);

        parent::delete($id);
    }

    public function getLaudoEscaneado($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lf' => 'sinistro.laudos_finais'), 'ds_nome_laudo_fisico');
        $select->where('lf.id = ?', $idLaudoFinal);

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

    public function getIdVistoriaByIdLaudoFinal($idLaudoFinal) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lf' => 'sinistro.laudos_finais'), null);
    	$select->join(array('vlf' => 'sistema.vistorias_laudos_finais'),'vlf.id_laudo_final = lf.id', array('id_vistoria'));
        $select->where('lf.id = ?', $idLaudoFinal);

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

    public function deleteArquivo($idLaudoFinal) {
        $Row = $this->getRow($idLaudoFinal);
        $Row->ds_nome_laudo_fisico = null;
        $Row->save();
    }

    public function getDadosEnviaTablet($idProposta, $idCobertura, $idVistoria) {
    	$avisos = Agro_Db_Table_Abstract::getDefaultAdapter()->fetchOne('select sinistro.fn_avisos_vistoria_final('.$idProposta.','.$idCobertura.', '.$idVistoria.')');
    	$arAvisos = explode(",", $avisos);

    	$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array('pr' => 'seguro.propostas'), array('id as id_proposta', 'nr_apolice', '(select sinistro.fn_avisos_vistoria_final('.$idProposta.','.$idCobertura.', '.$idVistoria.')) as avisos'));
    	$Select->join(array('pp' => 'seguro.propostas_proponentes'), 'pp.id_proposta = pr.id', array('ds_nome_proponente', 'ds_tel_celular', 'ds_tel_propriedade', 'ds_tel_residencia'));
    	$Select->join(array('po' => 'seguro.propostas_propriedades'), 'po.id_proposta = pr.id', array('ds_nome_propriedade', 'id_municipio', 'ds_coordenadas', 'ds_referencia_localizacao'));
    	$Select->join(array('m'  => 'sistema.municipios'), 'm.id = po.id_municipio', array('id_estado'));
    	$Select->join(array('sa' => 'sinistro.avisos'), 'sa.id_proposta = pr.id', array('dt_criacao', 'dt_sinistro', 'dt_aceitacao'));
    	$Select->where('pr.id = ?', $idProposta);
    	//$Select->where('sa.id = ?', $arAvisos[0]);

    	return Agro_Db_Table_Abstract::getDefaultAdapter()->fetchRow($Select);
    }

    public function alterarStatusLaudo(int $idLaudoFinal, int $idStatus) : void
    {
        $row = $this->getRow($idLaudoFinal);
        $row->id_status = $idStatus;
        $row->save();
    }

    /**
     * Retorna os dados para assinatura/envio do termo de autorização ou do laudo final
     *
     * @param int $idLaudoFinal
     * @return array
     */
    public function getDadosEnvio(int $idLaudoFinal, int $tipoEnvio): array
    {
        $campoTipoEnvio = "ds_tipo_envio_doc_acompanhante as ds_tipo_envio";
        
        if ($tipoEnvio == Sinistro2_Service_ValidaDadosEnvio::TIPO_ENVIO_LAUDO) {
            $campoTipoEnvio = "ds_tipo_envio_laudo as ds_tipo_envio";
        }

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lf' => 'sinistro.laudos_finais'], ["{$campoTipoEnvio}", 'ds_telefone_segurado', 'ds_email_segurado', 'id as id_laudo_final', "to_char(dt_vistoria, 'DD/MM/YYYY') as dt_vistoria"]);
        $select->join(['proc' => 'sinistro.processos'], 'proc.id = lf.id_processo', ['id_proposta']);
        $select->join(['pr' => 'seguro.propostas'], 'pr.id = proc.id_proposta', ['seguro.id_proposta_mae_completo(pr.id) as proposta_completa']);
        $select->join(['pp' => 'seguro.propostas_proponentes'], 'pp.id_proposta = pr.id', ['ds_nome_proponente', "split_part(ds_nome_proponente, ' ', 1) as nome_segurado"]);
        $select->join(['spc' => 'seguro.propostas_corretores'], 'spc.id_proposta = pr.id', null);
        $select->join(['sc' => 'sistema.corretores'], 'sc.id_usuario = spc.id_usuario', ['ds_email as ds_email_corretor']);
        $select->join(['vlf' => 'sistema.vistorias_laudos_finais'], 'vlf.id_laudo_final = lf.id', ['id_vistoria']);
        $select->where('lf.id = ?', $idLaudoFinal);
        $rs = $this->fetchRow($select);

        return $rs ? $rs->toArray() : [];
    }

    /**
     * Retorna os dados necessários para o preenchimento do termo de autorização do acompanhante
     *
     * @param int $idLaudoFinal
     * @return array
     */
    public function getDadosTermoAutorizacaoAcompanhante(int $idLaudoFinal): array
    {
        $campos  = "lf.ds_responsavel as texto_nome_autorizado, ";
        $campos .= "lf.cpf_responsavel as texto_cpf_autorizado, ";
        $campos .= "regexp_replace(seguro.id_proposta_mae_completo(pr.id), '[-.]', '', 'g') || ' (' || pr.id || ')' as texto_proposta, ";
        $campos .= "pp.ds_nome_proponente as texto_nome_segurado, ";
        $campos .= "mproponente.ds_nome_municipio || ' - ' || e.ds_sigla AS texto_local";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lf' => 'sinistro.laudos_finais'], $campos);
        $select->join(['proc' => 'sinistro.processos'], 'proc.id = lf.id_processo', null);
        $select->join(['pr' => 'seguro.propostas'], 'pr.id = proc.id_proposta', null);
        $select->join(['pp' => 'seguro.propostas_proponentes'], 'pp.id_proposta = pr.id', null);
        $select->join(array('mproponente' => 'sistema.municipios'), 'mproponente.id = pp.id_municipio', null);
        $select->join(array('e' => 'sistema.estados'), 'e.id = mproponente.id_estado', null);
        $select->where('lf.id = ?', $idLaudoFinal);
        $rs = $this->fetchRow($select);
        
        return $rs ? $rs->toArray() : [];
    }

    /**
     * Retorna se o método utilizado para realizar o laudo foi digital(VSD) ou manual
     *
     * @param int $idLaudoFinal
     * @return bool
     */
    public function isMetodoDigital(int $idLaudoFinal): bool
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lf' => 'sinistro.laudos_finais'], 'fl_transmitido_tablet');
        $select->where('lf.id = ?', $idLaudoFinal);
        $flTransmitidoTablet = $this->_db->fetchOne($select);

        return !empty($flTransmitidoTablet);
    }

    /**
     * Retorna o id da proposta mãe pelo id do laudo final informado
     *
     * @param int $idLaudoFinal
     * @return int
     */
    public function getIdPropostaMaeByLaudoFinal(int $idLaudoFinal): int
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lf' => 'sinistro.laudos_finais'], false);
        $select->join(['proc' => 'sinistro.processos'], 'proc.id = lf.id_processo', false);
        $select->join(['pr' => 'seguro.propostas'], 'pr.id = proc.id_proposta', 'id_proposta_mae');
        $select->where('lf.id = ?', $idLaudoFinal);
        return $this->_db->fetchOne($select);
    }

    /**
     * Verifica se os itens do laudo final possuem assinaturas que não foram preenchidas (nem marcadas que sim nem que não)
     * para os casos onde o laudo final não foi dispensado.
     *
     * @param int $idLaudoFinal
     * @return bool
     */
    public function possuiAssinaturasNaoPreenchidas(int $idLaudoFinal): bool
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['lf' => 'sinistro.laudos_finais'], 'id');
        $select->join(['lfis' => 'sinistro.laudos_finais_itens_segurados'], "lfis.id_laudo_final = lf.id", false);
        $select->where('lf.id = ?', $idLaudoFinal);
        $select->where('lf.id_motivo_vistoria_nao_vistoriada is null');
        $select->where('lfis.fl_assinado is null');
        $rs = $this->_db->fetchOne($select);
        
        return !empty($rs);
    }
}
