<?

class Sinistro_Model_LaudosFinais extends Agro_Db_Table_Abstract {

    protected $_rowClass = 'Sinistro_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']);

            $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->fl_assinatura_regulador = $dados['fl_assinatura_regulador'] ? 1 : 0;
            $Row->fl_assinatura_segurado = $dados['fl_assinatura_segurado'] ? $dados['fl_assinatura_segurado'] : 0;
            $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;

            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'];
            }

            if ($dados['fl_area_atingida']) {
                // Verifica se área atingida informada condiz com as quadras selecionadas
                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'];
            }

            $Row->fl_evento_nao_constatado = ($dados['fl_evento_nao_constatado']);
            $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->vl_tamanho_planta = ($dados['vl_tamanho_planta'] ? $dados['vl_tamanho_planta'] : 0);


            $dados['id_laudo_final'] = $Row->save();

            if (array_key_exists('vistoriadores', $dados)) {
                $Model_LaudosFinaisFuncionarios = new Sinistro_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
                                )
                        );
                    }
                }
            }


            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;
                }
            }

            if (count($dados['id_motivo_quadra_nao_vistoriada']) > 0) {
                $this->saveItensNaoVistoriadosLaudoFinal($dados['id_laudo_final'], $dados['id_motivo_quadra_nao_vistoriada']);
            }

            // Informações de status
            $idStatusEnviado = $this->getIdStatus('ENVIADO', 'LF');
            $idStatusDevolvido = $this->getIdStatus('PENDENTE_ENVIO', 'LF');

            if ($Row->id_status != $idStatusEnviado && $Row->id_status != $idStatusDevolvido) {
                if ($this->isComplete($dados['id_laudo_final'], $dados['fl_vistoria_preliminar'])) {
                    $Row->id_status = $this->getIdStatus('PENDENTE_ENVIO', 'LF');
                    $Row->save();
                } else {
                    $Row->id_status = $this->getIdStatus('PENDENTE_LAUDO_FINAL', 'LF');
                    $Row->save();
                }
            }

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

    /**
     * Retorna o nome do Controller cadastrado na tabela safraX.produtos_geral_coberturas_laudo_final
     * que será utilizado nas operações dos diferentes tipos de laudos finais.
     * Se $fullName = true, retorna o nome do controlador + a palavra Controller (conforme a nomenclaura dos arquivos).
     *
     * @param int $idProposta
     * @param int $idCobertura
     * @param String $schema
     * @param booblean $fullName
     * @return String
     */
    public function getItensDisponiveisLaudoFinal($idProposta) {
        $data = array();
        if ($idProposta) {
            $select = "
						select
							*
						from
							   sinistro.fn_itens_disponiveis_laudo_final($idProposta)
							as (id_proposta integer,
						    	id integer,
						        nr_item_segurado integer,
						    	ds_item_segurado text,
						    	vl_area numeric,
						   		vl_lmga numeric,
						    	ds_nome_variedade text)
			";

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

        return $data;
    }

    public function getItensVisPreliminarLaudoFinal($idProposta, $idVistoria) {
        $data = array();

        if ($idProposta && $idVistoria) {
            $select = "
						select
							*
						from
							   sinistro.fn_itens_vist_preliminar_laudo_final($idProposta, $idVistoria)
							as (id_proposta integer,
						    	id integer,
						        nr_item_segurado integer,
						    	ds_item_segurado text,
						    	vl_area numeric,
						   		vl_lmga numeric,
						    	ds_nome_variedade text)
			";

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

        return $data;
    }

    public function getItensRevistoria($idProposta, $idRevistoria) {
        $data = array();

        if ($idProposta && $idRevistoria) {
            $select = "
						select
							*
						from
							   sinistro.fn_itens_revistoria($idProposta, $idRevistoria)
							as (id_proposta integer,
						    	id integer,
						        nr_item_segurado integer,
						    	ds_item_segurado text,
						    	vl_area numeric,
						   		vl_lmga numeric,
						    	ds_nome_variedade text)
			";

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

        return $data;
    }

    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($id_proposta, $id_processo, $fl_liquidacao_avulsa = false, $id_cobertura = null) {
        $ModelTipoLiquidacao = new Sinistro_Model_TipoLiquidacao();
        $ModelProposta = new Seguro_Model_Propostas();
        $ModelProdutoCobertura = new Produto_Model_ProdutosCoberturas();
        $ModelLiquidacaoItemSeguradoCobertura = new Sinistro_Model_LiquidacoesItensSeguradosCoberturas();

        if ($id_cobertura) {
            $Proposta = $ModelProposta->find($id_proposta)->current();

            $ProdutoCobertura = $ModelProdutoCobertura->find($Proposta->id_produto, $id_cobertura)->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"));
                $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);

                $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->getQuadrasComLaudo($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($id_proposta, $id_processo, $fl_liquidacao_avulsa = false, $id_cobertura = null) {
        $TipoLiquidacao = new Sinistro_Model_TipoLiquidacao();

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

        $Select->from(array("lf" => "sinistro.laudos_finais"), false)->distinct(true);
        $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("pc" => "sinistro.processos"), "pc.id = lf.id_processo", 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'", false);
        $Select->join(array("ae" => "sinistro.avisos_encerramento"), "ae.id_proposta = pr.id", "to_char(ae.dt_encerramento_colheita, 'DD/MM/YYYY') as dt_encerramento_colheita");
        $Select->join(array("aeis" => "sinistro.avisos_encerramento_itens_segurados"), "aeis.id_aviso_encerramento = ae.id", false);
        $Select->join(array("iseg" => "seguro.itens_segurados"), "iseg.id = aeis.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('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 $iten) {
            	if ($this->naoExisteLiquidacaoAnterior($id_processo, $iten['id_item_segurado'], $id_cobertura)) {
                	$iten["LAUDOS"] = $this->getLaudos($id_processo, $id_proposta, $iten['id_item_segurado'], $fl_liquidacao_avulsa, false, $id_cobertura);
                	$result[] = $iten;
            	}
            }
        }

        return $result;
    }

    public function getLaudos($id_processo, $id_proposta, $id_item_segurado, $fl_liquidacao_avulsa, $id_dependencia = false, $id_cobertura = null) {
        $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
			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('st' => 'sistema.status'), "st.id = lf.id_status and st.ds_chave = 'ENVIADO'", false);
        $Select->joinInner(array("lfis" => "sinistro.laudos_finais_itens_segurados"), "lfis.id_laudo_final = lf.id and lfis.fl_nao_vistoriada = false", 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("pre" => "seguro.propostas_endosso"), "pre.id_proposta = pr.id and pre.fl_proposta_vigente = true", 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");

        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");
        }

        $order = Zend_Db_Table::getDefaultAdapter()->fetchOne("select prod.ds_ordenacao_laudos_liquidacao from produto.produtos prod inner join seguro.propostas pr on pr.id_produto = prod.id where pr.id = $id_proposta");

        $Select->order("$order 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");

        //die($Select);

        $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"));
        $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_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'", false);

        $Select->where('lf.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_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"
                )
        );
        $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->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 Sinistro_Model_LaudosFinaisFuncionarios();

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

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

        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 getItenSeguradosParcial($idProposta, $idVistoria, $idLaudo = null) {
        $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->joinLeft(
                array(
            'vis' => 'sistema.vistorias_itens_segurados'
                ), 'vis.id_item_segurado = iseg.id and id_vistoria = ' . $idVistoria, array('id_vistoria')
        );

        $select->join(
                array(
            'v' => 'produto.variedades'
                ), 'v.id = iseg.id_variedade', array(
            'ds_nome_variedade'
                )
        );
        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');
		$select->order('nr_item_segurado');

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

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

    	$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 Sinistro_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);
        }

        return $arItens;
    }

    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'
                )
        );

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

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

    public function getItensSeguradosLaudoFinalComPreliminar($idProposta, $idCobertura, $idVistoria, $idLaudoFinal, $fl_area_atingida='T') {

        // Recupera grupo de itens relacionados a vistorias preliminares que ainda possuem vistoria final pendente
        $select = 'select distinct
						*
					from (
					          select
					              "iseg"."id" AS "id_item_segurado",
					              "iseg"."nr_item_segurado",
					              "iseg"."ds_item_segurado",
					              "iseg"."vl_area",
					              "iseg"."vl_lmga",
					              lfis.dt_vistoria as dt_laudo_final,
					              (select max(sistema.vistorias.dt_inicio) from sistema.vistorias where id = vlp.id_vistoria) as dt_ultima_preliminar,
					              "lfis"."id_laudo_final",
					              "lfis"."id" AS "id_laudo_final_item_segurado",
					              "lfis"."vl_percent_perdas",
					              "lfis"."vl_rendimento_final_lavoura",
					              "lfis"."fl_nao_vistoriada",
					              "lfis"."id_motivo_quadra_nao_vistoriada",
					              "lfis"."vl_percent_colhido",
					              "va"."ds_nome_variedade",
								  "lfis"."vl_percent_perdas_chocho",
								  "lfis"."vl_percent_colhido_chocho",
								  "lfis"."vl_ha_area_replantada",
        						  "lfis"."vl_ha_area_afetada"
					          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 left join "produto"."variedades" AS "va" ON va.id = iseg.id_variedade left join
         						   sinistro.laudos_finais_itens_segurados lfis on lfis.id_item_segurado = iseg.id and lfis.id_laudo_final = ' . $idLaudoFinal . '
					          WHERE
					              iseg.id_proposta = ' . $idProposta . ' AND
					              iseg.vl_lmga > 0 AND
					              (lpis.id_intensidade != 10 or id_intensidade is null)
					          UNION
					              select
					                  "iseg"."id" AS "id_item_segurado",
					                  "iseg"."nr_item_segurado",
					                  "iseg"."ds_item_segurado",
					                  "iseg"."vl_area",
					                  "iseg"."vl_lmga",
					                  lfis.dt_vistoria as dt_laudo_final,
					                  null as dt_ultima_preliminar,
					                  "lfis"."id_laudo_final",
					                  "lfis"."id" AS "id_laudo_final_item_segurado",
					                  "lfis"."vl_percent_perdas",
					                  "lfis"."vl_rendimento_final_lavoura",
					                  "lfis"."fl_nao_vistoriada",
					                  "lfis"."id_motivo_quadra_nao_vistoriada",
					                  "lfis"."vl_percent_colhido",
					                  "va"."ds_nome_variedade",
					                  "lfis"."vl_percent_perdas_chocho",
					                  "lfis"."vl_percent_colhido_chocho",
					                  "lfis"."vl_ha_area_replantada",
					              	   "lfis"."vl_ha_area_afetada"
					          from
					              "seguro"."itens_segurados" AS "iseg" left join
					              "produto"."variedades" AS "va" ON va.id = iseg.id_variedade inner join
					              sinistro.laudos_finais_itens_segurados lfis on lfis.id_item_segurado = iseg.id and lfis.id_laudo_final = ' . $idLaudoFinal . '
					          WHERE
					              iseg.id not in (select id_item_segurado from sinistro.laudos_preliminares_itens_segurados where id_laudo_final = ' . $idLaudoFinal . ') and
					              iseg.id_proposta = ' . $idProposta . '
					              AND iseg.vl_lmga > 0

						) as itens_segurados

					ORDER BY
						nr_item_segurado';

        $arItens = array();

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

        foreach ($arItensEncontrados as $ItemEncontrado) {

        	$select = $this->select()->setIntegrityCheck(false);
        	$select->from(array('sl' => 'sistema.vistorias_itens_segurados'), 'id_item_segurado');
        	$select->where('sl.id_vistoria = ?', $idVistoria);
        	$select->where('sl.id_item_segurado = ?', $ItemEncontrado['id_item_segurado']);
        	$id_item_segurado_vistoria = $this->_db->fetchOne($select);

        	if($fl_area_atingida == 'T' || ($fl_area_atingida == 'P' && $id_item_segurado_vistoria)) {

	            if (
	                    $ItemEncontrado['id_laudo_final_item_segurado'] or
	                    !$ItemEncontrado['dt_laudo_final']
	            ) {
	                $arItens[$ItemEncontrado['nr_item_segurado']] = $ItemEncontrado;

	            } else if (
	                    $ItemEncontrado['dt_laudo_final'] and
	                    $ItemEncontrado['dt_laudo_final'] < $ItemEncontrado['dt_ultima_preliminar']
	            ) {
	                $arItens[$ItemEncontrado['nr_item_segurado']] = $ItemEncontrado;
	            }

        	}
        }

        return $arItens;
    }

    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();

            $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 Sinistro_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 saveItensNaoVistoriadosLaudoFinal($idLaudoFinal, array $ItensSegurados) {

        $LaudosFinaisItensSegurados = new Sinistro_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 Sinistro_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();

            /*
             * Atendendo a solicitação n°199
             */

                if (Agro_Util::checkPermission('sinistro:laudofinal:laudodigitalizado')) {
                    $ModeLaudoIS = new Sinistro_Model_LaudosFinaisItensSegurados();

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

                    foreach ($LaudosFinaisIS as $Item) {
                        if (!$Item->ds_nome_laudo_fisico && !$Item->ds_nome_laudo_fisico_chocho && !$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 {
                        return false;
                    }
                } else {
                    if ($nrVistoriasItensSegurados > 0  || $nrVistoriasItensSegurados == $nrLaudosFinaisItensSegurados) {
                        return true;
                    } else {
                        return false;
                    }
                }

        } else {
            return false;
        }
    }

    public function isReadonly($idLaudoFinal) {
        $Model_LaudosFinais = new Sinistro_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 ($LaudoFinal['ds_chave_status'] == 'ENVIADO' || ($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 Sinistro_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 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);
    }
}
