<?

class Sinistro_Model_LaudosPreliminares extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Sinistro_Model_Row_LaudoPreliminar';
	protected $_name = 'laudos_preliminares';
	protected $_schema = 'sinistro';
	public $_order = 'id_processo';
	protected $_primary = 'id';

	
    public function save($dados) {
    	
        try {
            $Adapter = new Zend_File_Transfer_Adapter_Http();
            $Adapter->setDestination(PATH_LAUDOS);
            $file = $Adapter->getFileInfo();

            if(array_key_exists('id_laudo_preliminar', $dados)) {
                $dados['id'] = $dados['id_laudo_preliminar'];
            }

            $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 = (array_key_exists('fl_assinatura_regulador', $dados) ? ($dados['fl_assinatura_regulador'] ? 1 : 0) : null);
            $Row->fl_assinatura_segurado = (array_key_exists('fl_assinatura_segurado', $dados) ? $dados['fl_assinatura_segurado'] : null);
            $Row->fl_dt_evento_em_cobertura = (array_key_exists('fl_dt_evento_em_cobertura', $dados) ? $dados['fl_dt_evento_em_cobertura'] : null);
            $Row->ds_coordenadas = $dados['ds_coordenadas'] ? $dados['ds_coordenadas'] : null;
            $Row->dt_vistoria = Agro_Util::formatDate($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].' '.$dados['dt_vistoria_minutos'], "yyyy-MM-dd HH:mm");

            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'] ? 1 : 0);

            if ($file["ds_nome_laudo_fisico"]["name"]){

                if ($dados['fl_evento_nao_constatado'] == "0"){
                    $newName = $this->geraNomeArquivoFisico($Row, $file["ds_nome_laudo_fisico"]["name"], $dados);
                } else {
                    $newName = $this->geraNomeArquivoFisicoEventoNaoConstatado($Row, $file["ds_nome_laudo_fisico"]["name"], $dados);
                }

                $Adapter->addFilter('Rename', array('target' => PATH_LAUDOS."/".$newName, 'overwrite' => true));

                if ($Adapter->receive($file["ds_nome_laudo_fisico"]["name"])){
                    if ($Row->ds_nome_laudo_fisico){
                        unlink(PATH_LAUDOS."/".$Row->ds_nome_laudo_fisico);
                    }

                    $Row->ds_nome_laudo_fisico = $newName;
                }else{
                    $this->setMessage("Não foi possível salvar o laudo preliminar.<br>Erro: {$Adapter->getErrors()}");
                    return true;
                }
            }
            
            $idLaudoPreliminar = $Row->save();

            if ($dados['id_vistoria']) {
                $VistoriasLaudosPreliminares = new Sistema_Model_VistoriasLaudosPreliminares();
                $Vistoria = $VistoriasLaudosPreliminares->save(array('id_vistoria'=>$dados['id_vistoria'],'id_laudo_preliminar'=>$idLaudoPreliminar));

                //atualiza a data da vistoria em sistema.vistorias, para ser usada no relatório de cobrança
                $Vistorias = new Sistema_Model_Vistorias();
                $Vistorias->save(array('id'=>$dados['id_vistoria'],'dt_inicio'=>$dados['dt_vistoria_data']));

                // Relaciona vistoria com avisos
                $Model_VistoriaAvisos = new Sinistro_Model_VistoriasAvisos();
                $dtVistoria = new Zend_Date($dados['dt_vistoria_data'].' '.$dados['dt_vistoria_hora'].':'.$dados['dt_vistoria_minutos'], 'dd/MM/yyyy HH:mm');

                if (!$Model_VistoriaAvisos->setVistoriaPreliminarAvisos($dados['id_proposta'], $dados['id_vistoria'], $dtVistoria->toString('yyyy-MM-dd HH:mm'), $dados['id_cobertura'])){
                	$this->setMessage($Model_VistoriaAvisos->getMessages());
                    //return false;
                }

                if (array_key_exists('vistoriadores', $dados)) {
                     $Model_VistoriasFuncionarios = new Sistema_Model_VistoriasFuncionarios();
                     $Model_VistoriasFuncionarios->delete($dados['id_vistoria']);

                     if (is_array($dados['vistoriadores'])) {
                         foreach ($dados['vistoriadores'] as $idFuncionario) {
                            $Model_VistoriasFuncionarios->insert(
                                array(
                                    'id_vistoria'=>$dados['id_vistoria'],
                                    'id_funcionario'=>$idFuncionario
                                )
                            );
                         }
                     }
                }

            }
            
            return $idLaudoPreliminar;

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

    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 getLaudosPreliminaresByAviso($idAviso){
		$data = array();
		if($idAviso){
			$select = $this->select();
			$select->setIntegrityCheck(false);
			$select->from(array('lp'=>'sinistro.laudos_preliminares'),'lp.id');
			$select->join(array('vl'=>'sistema.vistorias_laudos_preliminares'),'lp.id = vl.id_laudo_preliminar',false);
			$select->join(array('va'=>'sinistro.vistorias_avisos'),'vl.id_vistoria = va.id_vistoria');

			if(is_array($idAviso)){
				if(count($idAviso) > 0){
					$select->where('va.id_aviso in (' . implode(',',$idAviso) . ')');
					$data = $this->_db->fetchCol($select);

				}
			}else{
				$select->where($this->getAdapter()->quoteInto('va.id_aviso = ?',$idAviso));
				$data = $this->_db->fetchCol($select);
			}
			//echo $select;
		}
		return $data;
	}

	public function getIdStatusLP($ds_chave_status) {
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select->from(array('s'=>'sistema.status'),'id');
        $select->join(array('ts'=>'sistema.tipo_status'),'ts.id = s.id_tipo_status and ts.ds_chave = \'LAUDOS_PRELIMINARES\'', false);
        $select->WHERE('s.ds_chave = ?', $ds_chave_status);
        return $this->fetchRow($select)->id;
	}

    public function getIdLaudoPreliminarByVistoria($idVistoria) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
            	'vlp'=>'sistema.vistorias_laudos_preliminares'
            ),
            'id_laudo_preliminar'
        );
        $select->where('vlp.id_vistoria = ?', $idVistoria);

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

    public function getLaudoPreliminar($idLaudoPreliminar) {

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
                'lp'=>'sinistro.laudos_preliminares'
            ),
            array(
                'id as id_laudo_preliminar',
                'id_processo',
                'id_cobertura',
                'fl_assinatura_regulador',
                'fl_assinatura_segurado',
                'fl_evento_nao_constatado',
                'fl_area_atingida',
                'id_status',
                'ds_observacao',
                'ds_coordenadas',
                'dt_vistoria',
                'fl_dt_evento_em_cobertura',
                "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 = lp.id_status',
            array(
                'ds_status',
                'cd_status',
                'ds_chave as ds_chave_status'
            )
        );
        $select->join(
            array(
                'sp'=>'sinistro.processos'
            ),
            'sp.id = lp.id_processo',
            array(
                'id_proposta'
            )
        );
        $select->join(
            array(
                'vlp'=>'sistema.vistorias_laudos_preliminares'
            ),
            'vlp.id_laudo_preliminar = lp.id',
            array(
                'id_vistoria'
            )
        );
        $select->joinLeft(
            array(
                'lpe'=>strtolower($this->_request['module']).'.'.strtolower($this->_request['controller'])
            ),
            'lpe.id_laudo_preliminar = lp.id',
            '*'
        );
        $select->where('lp.id = ?',$idLaudoPreliminar);

        $dataLaudo = $this->fetchRow($select)->toArray();

        $Model_VistoriasFuncionarios = new Sistema_Model_VistoriasFuncionarios();

        $vistoriadores = $Model_VistoriasFuncionarios->getArrayVistoriadoresByIDLaudoPreliminar($idLaudoPreliminar);

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


        return $dataLaudo;
    }

    public function deleteEventoNaoConstatado($idLaudoPreliminar, $dados) {
    	$Model_LaudosPreliminaresItensSegurados = new Sinistro_Model_LaudosPreliminaresItensSegurados();
        $Model_LaudosPreliminaresItensSegurados->deleteItensbyLaudoPreliminar($idLaudoPreliminar);

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

        return true;
    }

    public function getItensSeguradosByProposta ($idProposta, array $ItensSegurados = null, $idLaudoPreliminar = 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'));
        $select->join(array('v'=>'produto.variedades'), 'v.id = iseg.id_variedade', 'ds_nome_variedade');

        if ($idLaudoPreliminar) {
            $select->join(array('lpis'=>'sinistro.laudos_preliminares_itens_segurados'), 'lpis.id_item_segurado = iseg.id', null);
            $select->join(array('lp'=>'sinistro.laudos_preliminares'), 'lp.id = '.$idLaudoPreliminar, null);

            //subselect para o caso de haver mais de um laudo preliminar, mostrar os itens referentes só ao seu devido laudo
            $select->where('lpis.id NOT IN (SELECT lpis.id FROM sinistro.laudos_preliminares_itens_segurados lpis
            								INNER JOIN sinistro.laudos_preliminares lp ON lp.id = lpis.id_laudo_preliminar
            								WHERE lp.id != '.$idLaudoPreliminar.')');

        }

        $select->where('iseg.id_proposta = ?', $idProposta);
        $select->where('iseg.vl_lmga > 0');
        if ($ItensSegurados) {
            $select->where('iseg.id in ('.implode(',', $ItensSegurados).')');
        }


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

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

    public function getInformacoesProposta ($idProposta) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pr'=>'seguro.propostas'), null);
        $select->join(array('pd'=>'produto.produtos'), 'pd.id = pr.id_produto', null);
        $select->join(array('pg'=>'produto.produtos_geral'), 'pg.id = pd.id_produto_geral', 'id_cultura');
        $select->where('pr.id = ?', $idProposta);

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

    public function getItenSeguradosParcial($idProposta, $idVistoria) {
        $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('iseg.nr_item_segurado');

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

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

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

    public function geraNomeArquivoFisico($Row, $nome_arquivo_original, $params){

        if ($Row->ds_nome_laudo_fisico){
            $nome = explode(".", $Row->ds_nome_laudo_fisico);
            $nome = $nome[0];

            $extensao = explode(".", $nome_arquivo_original);
            $extensao = $extensao[1];

            return $nome.".".$extensao;
        }else{
            $LP = $this->find($Row->id)->current();

            $count = count($this->contaLaudosByProcesso($params['id_processo']));
            $count++;

            $extensao = explode(".", $nome_arquivo_original);
            $extensao = $extensao[1];

            return strtoupper(str_pad($params['id_proposta'], 6, "0", STR_PAD_LEFT)."_VL_".str_pad($count, 3, "0", STR_PAD_LEFT).".".$extensao);
        }
    }

    public function contaLaudosByProcesso($idProcesso){
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pro' => 'sinistro.processos'), false);
        $select->join(array('lp' => 'sinistro.laudos_preliminares'), 'pro.id = lp.id_processo', 'id');
        $select->where('pro.id = ?', $idProcesso);

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

    public function geraNomeArquivoFisicoEventoNaoConstatado($Row, $nome_arquivo_original, $params){

        if ($Row->ds_nome_laudo_fisico){
            $nome = explode(".", $Row->ds_nome_laudo_fisico);
            $nome = $nome[0];

            $extensao = explode(".", $nome_arquivo_original);
            $extensao = $extensao[1];

            return $nome.".".$extensao;
        }else{
            $count = count($this->contaLaudosByProcesso($params['id_processo']));
            $count++;

            $extensao = explode(".", $nome_arquivo_original);
            $extensao = $extensao[1];

            return strtoupper(str_pad($params['id_proposta'], 6, "0", STR_PAD_LEFT)."_VL_".str_pad($count, 3, "0", STR_PAD_LEFT)."EV_N_CONST.".$extensao);
        }
    }

    public function deleteArquivo($idLaudoPreliminar){
        $Row = $this->getRow($idLaudoPreliminar);
        Agro_File::delete(PATH_LAUDOS, $Row->ds_nome_laudo_fisico);

        $Row->ds_nome_laudo_fisico = null;
        $Row->save();
    }
}

