<?

class Sinistro2_Model_LaudosFinaisItensSegurados extends Agro_Db_Table_Abstract {
	protected $_rowClass = 'Sinistro2_Model_Row_LaudoFinalItemSegurado';
	protected $_schema = 'sinistro';
	protected $_name = 'laudos_finais_itens_segurados';
	protected $_primary = array('id_laudo_final', 'id_item_segurado');
	public $_order = 'id_laudo_final';

	public function save($dados, &$fileUpload=TRUE, &$msg = null) {
		

            $ModelLF = new Sinistro2_Model_LaudosFinais();
			$modelMotivosQuadraNaoVistoriada = new Sinistro2_Model_MotivosQuadraNaoVistoriada();
			$modelStatus = new Sistema_Model_Status();
            
            try {
                $Adapter = new Zend_File_Transfer_Adapter_Http();
				
                $Adapter->setDestination(PATH_LAUDOS);
				$filesAlreadyValidated = array_key_exists('files_already_validated', $dados) && $dados['files_already_validated'];
				
				if (!$filesAlreadyValidated) {
					$Adapter->addValidator('Size', false, 2097152);
					$Adapter->addValidator('Extension', false, ['pdf', 'PDF','jpeg', 'JPEG', 'jpg', 'JPG']);
				}

                $files = $Adapter->getFileInfo();
		
				$infoArquivo = pathinfo($files['ds_nome_laudo_fisico']['name']);
				if (preg_match('/[áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ@#$%&*()\[\]\{\}<>:;?\/°\.]/u',$infoArquivo['filename'])) {
					throw new Exception("Nome de arquivo inválido. Arquivo [ {$files['ds_nome_laudo_fisico']['name']} ] possui caracteres especiais.");
				}	
                $LaudoFinal = $ModelLF->find($dados['id_laudo_final'])->current();

				if (in_array($LaudoFinal['id_status'], [Sistema_Model_Status::LF_ENVIADO, Sistema_Model_Status::LF_ENVIADO_NAO_ASSINADO])) {
					throw new Exception('Não é possível editar item de laudo já enviado.');
				}
                
                if ($LaudoFinal->verificaIntervaloVistoria($dados['dt_vistoria_data'])){

                    $Row = $this->getRow($dados['id_laudo_final'], $dados['id_item_segurado']);

					if ($LaudoFinal['fl_transmitido_tablet']) {
						throw new Exception('Não é permitido alterar item recebido pela vistoria realizada no Aplicativo.');
					}
					
                    //gerais
                    $Row->id_laudo_final 					= $dados['id_laudo_final'];
                    $Row->id_item_segurado 					= $dados['id_item_segurado'];
                    $Row->fl_nao_vistoriada 				= ($dados['fl_nao_vistoriada'] ? 1 : 0);

                    //se a quadra fosse vistoria após ter salvo como não vistoriada o id_motivo não era zerado
                    if ($dados['fl_nao_vistoriada'] > 0){
						$Row->id_motivo_quadra_nao_vistoriada = ($dados['id_motivo_quadra_nao_vistoriada'] ? $dados['id_motivo_quadra_nao_vistoriada'] : null);
                    } else {
						$Row->id_motivo_quadra_nao_vistoriada = null;
                    }

					$idStatus = $modelMotivosQuadraNaoVistoriada->getStatusIdByMotivo($Row->id_motivo_quadra_nao_vistoriada);

					if (array_key_exists('vl_area_vistoriada', $dados) && $dados['vl_area_vistoriada'] < $dados['vl_area']) {
						$idStatus = $modelStatus->getIdByChaveTipoChave('AGUARDANDO_VISTORIA','ITENS_VISTORIAS_FINAIS');
					}

					$Row->id_status                         = $idStatus;
                    $Row->dt_vistoria 						= $dados['dt_vistoria_data'] ? Agro_Util::formatDate($dados['dt_vistoria_data']." ".$dados['dt_vistoria_hora']." ".$dados['dt_vistoria_minutos'], Zend_Date::W3C) : null;
                    $Row->fl_assinatura_regulador	 		= ($dados['fl_assinatura_regulador'] ? 1 : 0);
                    $Row->fl_assinatura_segurado 			= ($dados['fl_assinatura_segurado'] ? 1 : 0);
                    $Row->ds_observacao 					= $dados['ds_observacao'];
                    $Row->ds_aspectos_gerais_cultura		= $dados['ds_aspectos_gerais_cultura'];
                    $Row->ds_coordenadas_geograficas 		= $dados['ds_coordenadas_geograficas'];
                    $Row->fl_avalia_danos_anteriores 		= ($dados["fl_avalia_danos_anteriores"] ? 1 : 0);
                    $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->vl_percent_perdas 				= ($dados['vl_percent_perdas'] ? $dados['vl_percent_perdas'] : 0);
                    $Row->vl_percent_colhido 				= ($dados['vl_percent_colhido'] ? $dados['vl_percent_colhido'] : 0);
                    $Row->vl_percent_area_afetada 			= ($dados["vl_percent_area_afetada"] ? $dados["vl_percent_area_afetada"] : null);
                    $Row->vl_ha_area_afetada 				= ($dados["vl_ha_area_afetada"] ? $dados["vl_ha_area_afetada"] : null);
                    $Row->vl_area_sinistrada 				= ($dados['vl_area_sinistrada'] ? $dados['vl_area_sinistrada'] : 0);

                    $Row->vl_rendimento_final_lavoura 		= ($dados["vl_rendimento_final_lavoura"] ? $dados['vl_rendimento_final_lavoura'] : 0);
                    $Row->vl_ha_area_replantada             = ($dados['vl_ha_area_replantada'] ? $dados['vl_ha_area_replantada'] : 0);
					$Row->vl_area_vistoriada 				= ($dados['vl_area_vistoriada'] ? $dados['vl_area_vistoriada'] : null);
					
					$zoneamento = null;
					if (isset($dados["fl_zoneamento_valido"]) && $dados["fl_zoneamento_valido"] != "") {
						$zoneamento = ($dados["fl_zoneamento_valido"]) ? 1 : 0;
					}
					$Row->fl_zoneamento_valido = $zoneamento;

					if (isset($dados["fl_assinado"])) {
						if ($dados["fl_assinado"] === "") {
							$dados["fl_assinado"] = null;
						} else {
							$dados["fl_assinado"] = ($dados["fl_assinado"] ? 1 : 0);
						}

						$Row->fl_assinado = $dados["fl_assinado"];
					}

					if (empty($dados['id_item_segurado_replicar_arquivo']) || $dados['id_item_segurado_replicar_arquivo'] === $dados['id_item_segurado']) {
						if ($files["ds_nome_laudo_fisico"]["name"] && $fileUpload) {
							$Row->ds_nome_laudo_fisico = null;
							$infoArquivo = pathinfo($files["ds_nome_laudo_fisico"]["name"]);
							if (preg_match('/[áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ@#$%&*()\[\]\{\}<>:;?\/°\.]/u',$infoArquivo['filename'])) {
								throw new Exception("Nome de arquivo de laudo inválido. Arquivo [{$infoArquivo['filename']}] possui caracteres especiais.");
							}else{
								$newName = $this->geraNomeArquivoFisico($Row, $files["ds_nome_laudo_fisico"]["name"], $dados);

								if (APPLICATION_ENV != 'production') {
									$Adapter->addFilter('Rename', array('target' => PATH_LAUDOS_DEV."/".$newName, 'overwrite' => true));
									$this->setMessage(PATH_LAUDOS_DEV."/".$newName);
								} else {
									$Adapter->addFilter('Rename', array('target' => PATH_LAUDOS."/".$newName, 'overwrite' => true));
								}
							
								if ($filesAlreadyValidated) {
									$laudo = file_get_contents($files["ds_nome_laudo_fisico"]["name"]);
  									file_put_contents(PATH_LAUDOS."/".$newName, $laudo);
								} elseif ($Adapter->isValid()) {
									if($Adapter->receive($files["ds_nome_laudo_fisico"]["name"])) {
									// Comentado pois, se por algum motivo existe o nome do laudo registrado na base
									// mas não foi possível salvar o arquivo
									// ele deletava o arquivo. (unlink)
									//if ($Row->ds_nome_laudo_fisico){
									//	unlink(PATH_LAUDOS."/".$Row->ds_nome_laudo_fisico);
									//}
									$Row->ds_nome_laudo_fisico = $newName;
									} else {
										$this->setMessage($Adapter->getMessages());
										$fileUpload = false;
										return false;
									}
								} else {
									$mensagemErro = "Não foi possível salvar o Laudo pois o arquivo excede o limite máximo permitido (2Mb).";
								
									$erros = $Adapter->getErrors();

									foreach ($erros as $er) {
										$this->setMessage($er);
									}
								
									if ($erros[0] == "fileExtensionFalse") {
										$mensagemErro = "Formato de arquivo inválido (formatos aceitos: PDF, jpeg e jpg).";	
									}

									$this->setMessage($mensagemErro);
									$fileUpload = false;
									return false;
								}
							}
						} else if (!empty($Row->id_item_segurado_origem)) {
							$oldName = $Row->ds_nome_laudo_fisico;
							$Row->ds_nome_laudo_fisico = '';
							
							$newName = $this->geraNomeArquivoFisico($Row, $oldName, $dados);
							$diretorio = (APPLICATION_ENV != 'production') ? PATH_LAUDOS_DEV : PATH_LAUDOS;
							copy("{$diretorio}/{$oldName}", "{$diretorio}/{$newName}");
							$Row->id_item_segurado_origem = null;
							$Row->ds_nome_laudo_fisico = $newName;
						}
					}

                    if (!empty($dados['id_item_segurado_replicar_arquivo']) && $dados['id_item_segurado_replicar_arquivo'] !== $dados['id_item_segurado']) {
                        $rowItemSegurado = $this->fetchAll(["id_item_segurado = {$dados['id_item_segurado_replicar_arquivo']}", "id_laudo_final = {$dados['id_laudo_final']}"])->current();
                        $dados['ds_nome_laudo_fisico'] = $rowItemSegurado['ds_nome_laudo_fisico'];
						$Row->id_item_segurado_origem = $dados['id_item_segurado_replicar_arquivo'];
                    }

                    //utilizado para digitação de itens segurados replicados
                    if($dados['ds_nome_laudo_fisico']) {
                        $Row->ds_nome_laudo_fisico = $dados['ds_nome_laudo_fisico'];
                    }

                    $Row->save();

                    $dados['id_laudo_final_item_segurado'] = $Row->id;

					$Model_LaudosFinaisItensSeguradoFuncionarios = new Sinistro2_Model_LaudosFinaisItensSeguradosFuncionarios();
					
					if (!in_array($this->request['controller'], ['lf034itemsegurado', 'lf003itemsegurado'])) {
						$Model_LaudosFinaisItensSeguradoFuncionarios->delete($Row->id);

						if (array_key_exists('vistoriadores', $dados)) {
                            ($dados['is_from_tagh'] === true )? $key = 'id_tagh' : $key = 'id_funcionario';

							foreach ($dados['vistoriadores'] as $idFuncionario) {
								$Model_LaudosFinaisItensSeguradoFuncionarios->insert(
									array(
										'id_laudo_final_item_segurado'=>$Row->id,
										$key=>$idFuncionario
									)
								);
							}
						}
					}

                    if (array_key_exists('auxiliares', $dados)) {

						foreach ($dados['auxiliares'] as $idFuncionario) {

							$Model_LaudosFinaisItensSeguradoFuncionarios->insert(
								array(
									'id_laudo_final_item_segurado'=>$Row->id,
									'id_funcionario'=>$idFuncionario
								)
							);
						}
					}

					if ($Row->fl_avalia_danos_anteriores) {
                            $AvisosRelacionados = new Sinistro2_Model_LaudosFinaisItensSeguradosAvisosRelacionados();
                            $AvisosRelacionados->save($dados);
                    }

                    if ($dados['id_vistoria']) {
                        // Relaciona item segurado com vistoria
                        $ModelVIS = new Sistema_Model_VistoriasItensSegurados();
                        $ModelVIS->save(array(
                            'id_vistoria'       =>  $dados['id_vistoria'],
                            'id_item_segurado'  =>  $dados['id_item_segurado']
                        ));
                    }
                    return $Row->id;

                } else {
				
                        $this->setMessage("O intervalo entre vistorias não pode ser superior a 4 dias.");
                        return false;
                }

            } catch (Exception $e) {
                    $this->setMessage("Não foi possível salvar o Item Segurado.<br>Erro: {$e->getMessage()}");
                    return false;
            }
	}

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

		$Vistorias = new Sistema_Model_Vistorias();
		
		$sufixo = ($Vistorias->isNovaAvaliacao($params['id_vistoria']) ? '_NA_' : '_VF_');

		if ($Row->ds_nome_laudo_fisico){
			$nome = explode(".", $Row->ds_nome_laudo_fisico);
			$nome = $nome[0];
			
			$extensao = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);
			
			return $nome.".".$extensao;
			
		} else {
			$Model = new Seguro_Model_ItensSegurados();
			$IS = $Model->find($Row->id_item_segurado)->current();

			//$count = $this->fetchAll("id_item_segurado={$Row->id_item_segurado} and id <> $Row->id and ds_nome_laudo_fisico is not null")->count();
			//$count = $this->fetchAll("id_laudo_final= ".$Row->id_laudo_final." and ds_nome_laudo_fisico is not null")->count();
			$count = count($this->contaLaudosByProcesso($params['id_processo']));
			$count++;

			$extensao = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);
            $idPropostaMae = null;

            if (!empty($params['id_processo'])) {
                $Processos = new Sinistro2_Model_Processos();
                $idPropostaMae = $Processos->getPropostaMaeByProcesso($params['id_processo']);
            }

            $idProposta = !empty($idPropostaMae) ? $idPropostaMae : $IS->id_proposta;
			return strtoupper(str_pad($idProposta, 6, "0", STR_PAD_LEFT).$sufixo.str_pad($count, 3, "0", STR_PAD_LEFT)."_".$IS->nr_item_segurado.".".$extensao);

		}
	}

	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 = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);
			return $nome.".".$extensao;

		} else {

			//$count = $this->fetchAll("id_item_segurado={$Row->id_item_segurado} and id <> $Row->id and ds_nome_laudo_fisico is not null")->count();
			//$count = $this->fetchAll("id_laudo_final= ".$Row->id_laudo_final." and ds_nome_laudo_fisico_chocho is not null")->count();
			$count = count($this->contaLaudosByProcesso($params['id_processo']));
			$count++;

			$extensao = pathinfo($nome_arquivo_original, PATHINFO_EXTENSION);

            $idPropostaMae = null;

            if (!empty($params['id_processo'])) {
                $Processos = new Sinistro2_Model_Processos();
                $idPropostaMae = $Processos->getPropostaMaeByProcesso($params['id_processo']);
            }

            $idProposta = !empty($idPropostaMae) ? $idPropostaMae : $IS->id_proposta;
			return strtoupper(str_pad($idProposta, 6, "0", STR_PAD_LEFT)."_VF_".str_pad($params['id_vistoria'], 6, "0", STR_PAD_LEFT)."_EV_N_CONST.".$extensao);

		}
	}

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

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

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

		} else {
			$Model = new Seguro_Model_ItensSegurados();
			$IS = $Model->find($Row->id_item_segurado)->current();

			//$count = $this->fetchAll("id_item_segurado={$Row->id_item_segurado} and id <> $Row->id and ds_nome_laudo_fisico is not null")->count();
			//$count = $this->fetchAll("id_laudo_final= ".$Row->id_laudo_final." and ds_nome_laudo_fisico_chocho is not null")->count();
			$count = count($this->contaLaudosChochoByProcesso($params['id_processo']));
			$count++;

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

			return strtoupper(str_pad($IS->id_proposta, 6, "0", STR_PAD_LEFT)."_VF_".str_pad($count, 3, "0", STR_PAD_LEFT)."_".$IS->nr_item_segurado."_CH.".$extensao);

		}
	}


	public function getRow($idLaudoFinal, $idItemSegurado) {
	    $Row = false;
	    if($idLaudoFinal && $idItemSegurado) {
	        $Row = parent::find($idLaudoFinal, $idItemSegurado)->current();
	    }
	    if (!$Row) {
	        $Row = $this->createRow();
	    }

	    return $Row;
	}

	public function setMotivoNaoVistoriado($id, $id_motivo=null){
		$Row = parent::find($id)->current();
		$Row->id_motivo_quadra_nao_vistoriada = $id_motivo;

		return $Row->save();
	}

	public function clear($idLaudoFinal) {
		return $this->getAdapter()->query("delete from sinistro.laudos_finais_itens_segurados where id_laudo_final = $idLaudoFinal");
	}

	public function setTotal($idLaudoFinal) {
		try {
			// Limpa as quadras existentes
			$this->clear($idLaudoFinal);

			// Instancia o laudo final
			$LaudosFinais = new Sinistro2_Model_LaudosFinais();

			// Busca o laudo do banco
			$LaudoFinal = $LaudosFinais->getRow($idLaudoFinal);
			$LaudoFinal->fl_area_atingida = 'T';
			$LaudoFinal->save();

			// Busca o processo para chegar nos itens
			$Processo = $LaudoFinal->processo();

			// busca os itens
			$itens = $Processo->itens_segurados();

			// Salva os itens da proposta nos itens do laudo
			if (is_array($itens) && count($itens)) {
				foreach ($itens as $idx => $item) {
					$this->save(array('id_laudo_final' => $idLaudoFinal, 'id_item_segurado' => $item['id']));
				}
			}

			return true;
		} catch (Exception $e) {
			die($e);
		}
	}

	public function setParcial($idLaudoFinal, $itensSegurados) {
		$LaudosFinais = new Sinistro2_Model_LaudosFinais();

		try {
			// Busca o Laudo
			$LaudoFinal = $LaudosFinais->getRow($idLaudoFinal);
			$LaudoFinal->fl_area_atingida = 'P';
			$LaudoFinal->save();

			// Limpa as quadras existentes
			$this->clear($idLaudoFinal);

			// Salva os itens da proposta nos itens do laudo
			if (is_array($itensSegurados) && count($itensSegurados)) {
				foreach ($itensSegurados as $itemSegurado) {
					$this->save(array('id_laudo_final' => $idLaudoFinal, 'id_item_segurado' => $itemSegurado));
				}
			}

			return true;
		} catch (Exception $e) {
			die($e);
		}
	}

	/**
	 * @todo CONCERTAR ESTE AMADORISMO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	 */
	public function find($idLaudo, $idItem) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('lf'=>$this->_schema . '.' . $this->_name), '*');
		$select->where('lf.id_laudo_final = ?', $idLaudo);
		$select->where('lf.id_item_segurado = ?', $idItem);

		if ($this->fetchRow($select)) {
			return $this->fetchRow($select)->toArray();
		} else {
			return array();
		}
	}

	/**
	 * Bacalhau em casacata!!!!!
	 */
	public function getByID($id){
		$select = $this->select()->setIntegrityCheck(false);
		$select->from(array('lf'=>$this->_schema . '.' . $this->_name));
		$select->where("lf.id = $id");

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

	public function delete($idLaudoFinal, $idItem = null) {
		if ($idLaudoFinal){
			$sql = "delete from {$this->_schema}.{$this->_name} where id_laudo_final = $idLaudoFinal";

			if ($idItem) {
				if (is_array($idItem)) {
					$sql .= " and id_item_segurado in (" . implode(',', $idItem) . ")";
				} else {
					$sql .= " and id_item_segurado = $idItem";
				}
			}

			$this->_db->query($sql);
		}
	}

	public function deleteItem($idLaudoFinalItemSegurado) {
		$sql = "delete from {$this->_schema}.{$this->_name} where id = $idLaudoFinalItemSegurado";

		$this->_db->query($sql);
	}

	public function getMenorDtVistoria($idLaudoFinal) {
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('lf'=>$this->_schema . '.' . $this->_name), '*');
		$select->where('lf.id_laudo_final = ?', $idLaudoFinal);
		$select->order('lf.dt_vistoria');
		$select->limit('1');

		if ($this->fetchRow($select)) {
			return $this->fetchRow($select)->toArray();
		} else {
			return array();
		}
	}

	public function hasDtVistoriaIntervaloMaior15DiasMesmaVistoria($idVistoria, $dtAnterior15Dias, $dtPosterior15Dias) {

		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('lfis'=>$this->_schema . '.' . $this->_name), '*');
		$select->join(array('vl'=>"sistema.vistorias_laudos_finais"),'vl.id_laudo_final = lfis.id_laudo_final', false);
		$select->where('vl.id_vistoria = ?', $idVistoria);
		$select->where('lfis.dt_vistoria < to_timestamp(\' '.$dtAnterior15Dias.' \', \'dd/mm/yyyy\') or lfis.dt_vistoria > to_timestamp(\' '.$dtPosterior15Dias.' \', \'dd/mm/yyyy\')');

		$rs = $this->fetchAll($select);
		if ($rs) {
			$dados = $rs->toArray();
			if (count($dados) > 0) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	public function hasDtVistoriaIntervaloMaior15DiasOutrasVistorias($idVistoria, $dtAnterior15Dias, $dtPosterior15Dias) {

		$data = array();
		$select = "
				select
					lfis.*
				from
		   			       sinistro.vistorias_avisos vav
				inner join sistema.vistorias_laudos_finais vlf on vlf.id_vistoria = vav.id_vistoria
				inner join sinistro.laudos_finais_itens_segurados lfis on lfis.id_laudo_final = vlf.id_laudo_final
				inner join sistema.vistorias v on v.id = vav.id_vistoria
				inner join sistema.tipos_vistoria tv on tv.id = v.id_tipo
				where
					tv.ds_chave_tipos_vistoria='FINAL' and
					v.id != $idVistoria and
					(lfis.dt_vistoria < to_timestamp('$dtAnterior15Dias', 'dd/mm/yyyy') or lfis.dt_vistoria > to_timestamp('$dtPosterior15Dias', 'dd/mm/yyyy')) and
					vav.id_aviso in(
								select
									a.id
								from
				   					       sinistro.avisos a
								inner join sinistro.vistorias_avisos va on va.id_aviso = a.id
								where
									va.id_vistoria = $idVistoria
					)
		";

		$data = $this->_db->fetchAll($select);
		if ($data) {
			if (count($data) > 0) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}


	public function setMotivo($dados) {

		$Model = new Sinistro2_Model_LaudosFinaisItensSegurados();
		//feio pra caralho, eu sei... um dia o Samir arruma isso ;-)
  		$sql = "insert into
  					sinistro.laudos_finais_itens_segurados
  					(id_laudo_final, id_item_segurado, id_motivo_quadra_nao_vistoriada)
  				values
  					({$dados['id_laudo_final']}, {$dados['id']}, {$dados['id_motivo_quadra_nao_vistoriada']})";

		/*
		$sql = "update
					sinistro.laudos_finais_itens_segurados
				set
					id_motivo_quadra_nao_vistoriada = {$dados['id_motivo_quadra_nao_vistoriada']}
				where
					id_item_segurado = {$dados['id']} and
					id_laudo_final = {$dados['id_laudo_final']}";*/
		return $this->_db->query($sql);
	}

	public function getDataLaudoFinalItemSegurado($idLaudoFinalItemSegurado) {
		$ModelAvisosRelacionados = new Sinistro2_Model_LaudosFinaisItensSeguradosAvisosRelacionados();

		$caseAssinado = new Zend_Db_Expr('(CASE WHEN fl_assinado IS NULL THEN NULL WHEN fl_assinado IS TRUE THEN 1 ELSE 0 END) AS fl_assinado');

	    $select = $this->select()->setIntegrityCheck(false);
        $select->from(
            array(
                'lfis'=>$this->_schema.'.'.$this->_name
            ),
            array(
            	'id_item_segurado',
                'vl_percent_perdas',
                'fl_nao_vistoriada',
                'id_motivo_quadra_nao_vistoriada',
                'dt_vistoria',
                'fl_assinatura_regulador',
                'fl_assinatura_segurado',
                'ds_observacao',
            	'ds_aspectos_gerais_cultura',
                'vl_percent_colhido',
                'vl_area_sinistrada',
            	'vl_percent_area_afetada',
                'ds_coordenadas_geograficas',
                "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",
            	"vl_rendimento_final_lavoura",
            	"fl_avalia_danos_anteriores",
            	'ds_observacao_assinatura_regulador',
            	'ds_observacao_assinatura_segurado',
            	'vl_ha_area_afetada',
            	'ds_nome_laudo_fisico',
            	'vl_percent_perdas_chocho',
            	'vl_percent_colhido_chocho',
				'fl_zoneamento_valido',
				'vl_area_vistoriada',
				'id_laudo_final',
				'vl_area_declarada',
				$caseAssinado,
            )
        );
        $select->where('id = ?', $idLaudoFinalItemSegurado);

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

        $Model_LaudosFinaisItensSeguradosFuncionarios = new Sinistro2_Model_LaudosFinaisItensSeguradosFuncionarios();

        $vistoriadores = $Model_LaudosFinaisItensSeguradosFuncionarios->getArrayVistoriadoresByIdLaudoFinalItemSegurado($idLaudoFinalItemSegurado);
		
        if(count($vistoriadores) > 0) {
            $dataLaudoFinalItemSegurado['vistoriadores'] = $vistoriadores;
        }

		$auxiliares = $Model_LaudosFinaisItensSeguradosFuncionarios->getArrayVistoriadoresByIdLaudoFinalItemSegurado($idLaudoFinalItemSegurado, true);

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

        $avisos_relacionados = $ModelAvisosRelacionados->fetchAll("id_laudo_final_item_segurado=$idLaudoFinalItemSegurado");

        $dataLaudoFinalItemSegurado['avisos_relacionados'] = array();

        if ($avisos_relacionados){
        	foreach ($avisos_relacionados  as $aviso){
        		$dataLaudoFinalItemSegurado['avisos_relacionados'][] = $aviso["id_aviso"];
        	}
        }

        return $dataLaudoFinalItemSegurado;
    }

	public function valida($params){
		$dados = $params;

		if ($dados["vl_area_sinistrada"]){
			$ModelIS = new Seguro_Model_ItensSegurados();
			$IS = $ModelIS->find($dados["id_item_segurado"])->current();

			if ($dados["vl_area_sinistrada"] > $IS->vl_area){
				$this->setMessage("A área sinistrada não pode ser superior à área do talhão");
				$dados=false;
			}
		}

		return $dados;
	}

    public function getMinMaxDtVistoriaByIdLaudoFinal($idLaudoFinal, $idLaudoFinalItemSegurado = null) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('lfis'=>'sinistro.laudos_finais_itens_segurados'), array('min(lfis.dt_vistoria) as min_dt_vistoria', 'max(lfis.dt_vistoria) as max_dt_vistoria'));
        $select->where('lfis.id_laudo_final = ?', $idLaudoFinal);
        if ($idLaudoFinalItemSegurado) {
            $select->where('lfis.id != ?', $idLaudoFinalItemSegurado);
        }

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

    public function contaLaudosByProcesso($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pro'=>'sinistro.processos'), false);
        $select->join(array('lf'=>'sinistro.laudos_finais'),'pro.id = lf.id_processo', 'id');
        $select->join(array('lfis'=>'sinistro.laudos_finais_itens_segurados'),'lf.id = lfis.id_laudo_final', false);
        $select->where('pro.id = ?', $idProcesso);
        $select->where('lfis.ds_nome_laudo_fisico != ?', 'null');

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

    public function contaLaudosChochoByProcesso($idProcesso) {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pro'=>'sinistro.processos'), false);
        $select->join(array('lf'=>'sinistro.laudos_finais'),'pro.id = lf.id_processo', 'id');
        $select->join(array('lfis'=>'sinistro.laudos_finais_itens_segurados'),'lf.id = lfis.id_laudo_final', false);
        $select->where('pro.id = ?', $idProcesso);
        $select->where('lfis.ds_nome_laudo_fisico != ?', 'null');

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

    public function getLaudoEscaneado($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', null);
    	$select->join(array('lfis' => 'sinistro.laudos_finais_itens_segurados'),'lf.id = lfis.id_laudo_final', array('ds_nome_laudo_fisico', 'fl_nao_vistoriada', 'id_motivo_quadra_nao_vistoriada'));
    	$select->where('lf.id = ?', $idLaudoFinal);

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

	/**
	 * Atualiza quais itens foram marcados como assinados
	 *
	 * @param int $idLaudoFinal
	 * @param array $idsLaudosFinaisItensSegurados
	 */
	public function	atualizarAssinaturas(int $idLaudoFinal, array $idsLaudosFinaisItensSegurados = null)
	{
		if (!empty($idsLaudosFinaisItensSegurados)) {

			foreach ($idsLaudosFinaisItensSegurados as $idLaudoFinalItemSegurado => $valor) {

				$valor = $valor === "" ? null : $valor;

				$this->update(
					array('fl_assinado' => $valor),
					"id_laudo_final = {$idLaudoFinal}
					AND id IN ({$idLaudoFinalItemSegurado})"
				);
			}
		}
	}

	/**
	 * Atualiza quais os itens possuem zoneamentos válidos
	 *
	 * @param int $idLaudoFinal
	 * @param array $idsLaudosFinaisItensSegurados
	 */
	public function atualizarZoneamentos(int $idLaudoFinal, array $idsLaudosFinaisItensSegurados = []): void
	{
		$this->update(array('fl_zoneamento_valido' => null), "id_laudo_final = {$idLaudoFinal}");

		$idsZoneamentoValidos = array_keys(array_filter($idsLaudosFinaisItensSegurados, function($valor) {
			return $valor === "1";
		}));
		
		if (!empty($idsZoneamentoValidos)) {
			$ids = implode(", ", $idsZoneamentoValidos);
			$this->update(
				array('fl_zoneamento_valido' => 1),
				"id_laudo_final = {$idLaudoFinal}
				AND id IN ({$ids})"
			);
		}

		$idsZoneamentoInvalidos = array_keys(array_filter($idsLaudosFinaisItensSegurados, function($valor) {
			return $valor === "0";
		}));

		if (!empty($idsZoneamentoInvalidos)) {
			$ids = implode(", ", $idsZoneamentoInvalidos);
			$this->update(
				array('fl_zoneamento_valido' => 0),
				"id_laudo_final = {$idLaudoFinal}
				AND id IN ({$ids})"
			);
		}
	}

	public function getZoneamentos(int $idLaudoFinal): array
	{
		$rs = $this->fetchAll(
			$this->select()
				->from(['itens' => 'sinistro.laudos_finais_itens_segurados'], ['id', 'fl_zoneamento_valido'])
				->where('id_laudo_final = ?', $idLaudoFinal)
		)->toArray();

		$map = [];
		foreach ($rs as $row) {
			$zoneamentoValido = null;
			if ($row['fl_zoneamento_valido'] === false) {
				$zoneamentoValido = '0';
			} elseif ($row['fl_zoneamento_valido'] === true) {
				$zoneamentoValido = '1';
			}

			$map[$row['id']] = $zoneamentoValido;
		}

		return $map;
	}
}
