Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 324 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 aurelien 1
<?php
2
 
92 aurelien 3
class OdsObservation extends OdsTriple {
31 aurelien 4
 
5
	const PREFIXE = 'get';
41 aurelien 6
	const ABBR_LISTE_EVENEMENTS = 'evenement';
320 aurelien 7
 
8
 
46 aurelien 9
/**
10
 * Méthodes d'extractions d'informations
11
 */
320 aurelien 12
 
31 aurelien 13
	/**
14
     * Méthode appelée avec une requête de type GET.
15
     *
16
     */
17
    function getElement($param = array()) {
320 aurelien 18
 
31 aurelien 19
    	$type = $param[0];
320 aurelien 20
 
31 aurelien 21
        if ($type == '*' || is_numeric($type)) {
22
            $info = $this->getElementParDefaut($param);
23
        } else {
24
            $methode = self::PREFIXE.$type;
25
            if (method_exists($this, $methode)) {
26
                array_shift($param);
27
                $info = $this->$methode($param);
28
            } else {
29
                $this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
30
            }
31
        }
215 aurelien 32
 
31 aurelien 33
        $this->envoyer($info);
34
    }
320 aurelien 35
 
46 aurelien 36
	private function getElementParDefaut($params) {
320 aurelien 37
 
31 aurelien 38
   	}
320 aurelien 39
 
327 aurelien 40
		private function getAnneeMinimumObservation() {
41
			$requete_annee_min_obs = 'SELECT MIN(YEAR(oo_date)) as min_annee FROM ods_observations '.
42
														'WHERE oo_date != "0000-00-00"';
43
			$resultat_min_annee_obs = $this->executerRequete($requete_annee_min_obs);
44
			return !empty($resultat_min_annee_obs) ? $resultat_min_annee_obs[0]['min_annee'] : Date('Y');
45
		}
46
 
47
		private function getAnneesAyantObservations() {
48
			$requete_annee_min_obs = 'SELECT DISTINCT YEAR(oo_date) as annee FROM ods_observations '.
49
														'WHERE oo_date != "0000-00-00" AND YEAR(oo_date) <= "'.date('Y').'" '.
50
														'ORDER BY annee DESC';
51
 
52
			$resultat_annees_ayant_obs = $this->executerRequete($requete_annee_min_obs);
53
			$annees_ayant_obs = [];
54
			foreach($resultat_annees_ayant_obs as $res_annee_ayant_obs) {
55
				$annees_ayant_obs[] = $res_annee_ayant_obs['annee'];
56
			}
57
 
58
			return $annees_ayant_obs;
59
		}
60
 
31 aurelien 61
   	private function getObservationsPourStation($params) {
320 aurelien 62
 
254 aurelien 63
   		$id_station = isset($params[0]) ? $params[0] :  '';
64
   		$annee = isset($params[1]) ? $params[1] :  '';
320 aurelien 65
 
31 aurelien 66
   		return ;
67
 
68
   	}
320 aurelien 69
 
31 aurelien 70
    private function getObservationsPourIndividu($params) {
320 aurelien 71
 
254 aurelien 72
    	$id_individu = isset($params[0]) ? $params[0] :  '';
73
   		$annee = isset($params[1]) ? $params[1] :  '';
320 aurelien 74
 
41 aurelien 75
   		$requete_liste_observation_individu = 'SELECT * FROM ods_observations '.
76
   												  'WHERE oo_ce_individu ='.$this->proteger($id_individu).' '.
228 aurelien 77
   												  'AND DAY(oo_date) != "00" '.
320 aurelien 78
   												  'ORDER BY YEAR(oo_date) DESC, MONTH(oo_date) ASC, DAY(oo_date) ASC ';
79
 
41 aurelien 80
   		$liste_observation_individu = $this->executerRequete($requete_liste_observation_individu);
320 aurelien 81
 
46 aurelien 82
   		$liste_observation_individu_formatees = array();
320 aurelien 83
 
41 aurelien 84
   		foreach($liste_observation_individu as $observation_individu) {
320 aurelien 85
 
46 aurelien 86
   			$annee_obs = date("Y",strtotime($observation_individu['oo_date']));
87
   			$stade_observation_complet = $this->getInformationEvenementParId($observation_individu['oo_ce_evenement']);
320 aurelien 88
 
46 aurelien 89
   			$abbr_stade_observation = $stade_observation_complet['ot_cle'];
320 aurelien 90
 
46 aurelien 91
   			$infos_stades = $this->renvoyerInformationStadeAPartirChaineTriple($abbr_stade_observation);
320 aurelien 92
 
46 aurelien 93
   			$titre_stade = $infos_stades['nom'];
94
   			$numero_stade = $infos_stades['numero'];
95
   			$abreviation_stade = $infos_stades['abreviation'];
320 aurelien 96
 
228 aurelien 97
   			$tableau_date =  date_parse($observation_individu['oo_date']);
320 aurelien 98
 
228 aurelien 99
   			if(!$this->estUneDateInvalide($tableau_date['day'], $tableau_date['month'], $tableau_date['year'])) {
320 aurelien 100
 
228 aurelien 101
	   			$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observation_individu['oo_date']));
324 aurelien 102
	   			$liste_observation_individu_formatees[$annee_obs][$titre_stade][$numero_stade][$observation_individu['oo_id_observation']] = [
103
						'date' => $date_observation_formatee,
104
						'absence_evenement' => $observation_individu['oo_absence_evenement']
105
					];
228 aurelien 106
   			}
41 aurelien 107
   		}
320 aurelien 108
 
215 aurelien 109
   		krsort($liste_observation_individu_formatees);
320 aurelien 110
 
41 aurelien 111
		return $liste_observation_individu_formatees;
31 aurelien 112
    }
320 aurelien 113
 
46 aurelien 114
/**
115
 * Méthodes de création et modification d'informations
320 aurelien 116
 */
117
 
137 aurelien 118
     /**
46 aurelien 119
     * Méthode appelée pour mettre à jour un élément
120
     */
121
    public function updateElement($uid, $params)    {
320 aurelien 122
 
123
    	$elements_requis = array('id_participant','id_individu', 'id_evenement', 'date_evenement');
46 aurelien 124
    	$erreurs = array();
320 aurelien 125
 
46 aurelien 126
    	foreach($elements_requis as $requis) {
127
    		if(!isset($params[$requis])) {
128
    			$erreurs[$requis] = 'erreur ';
129
    		}
130
    	}
320 aurelien 131
 
324 aurelien 132
			if(!empty($erreurs)) {
133
				$this->envoyer($erreurs);
134
				exit;
135
			}
136
 
46 aurelien 137
    	if(!isset($params['annee_en_cours'])) {
138
    		$annee_en_cours = date('Y');
139
    	} else {
140
    		$annee_en_cours = $params['annee_en_cours'];
141
    	}
320 aurelien 142
 
46 aurelien 143
    	$id_participant = $params['id_participant'];
144
    	$id_individu = $params['id_individu'];
145
 
324 aurelien 146
			$a_modifier = !empty($params['id_observation']) ? $params['id_observation'] : false;
320 aurelien 147
			$retour = array();
148
 
149
			$date_evenement = $this->formaterDateObservationPourBdd($params['date_evenement']);
150
 
151
			// dans le cas des ajouts ou modifications on vérifie que l'on insère pas une date
152
			// déjà existante, car ça n'a pas de sens pour un même individu et stade
153
			if (strpos($date_evenement, '00-00') === false) {
154
				$requete_existe_avec_cette_date = 'SELECT * FROM ods_observations '.
155
																			'WHERE oo_ce_participant = '.$this->proteger($id_participant).' AND '.
156
																			'oo_ce_individu = '.$this->proteger($id_individu).' AND '.
157
																			'oo_ce_evenement = '.$this->proteger($params['id_evenement']).' AND '.
158
																			'oo_date = '.$this->proteger($date_evenement);
159
				$resultat_requete_existe_avec_cette_date = $this->executerRequete($requete_existe_avec_cette_date);
160
 
161
				if(!empty($resultat_requete_existe_avec_cette_date)) {
162
					$this->envoyer([
163
						'erreurs' => [
164
							'date' => 'Une observation à cette date existe déjà pour ce stade et cet individu'
165
						]
166
					]);
167
					exit;
168
				}
169
			}
170
 
171
    	$obs_a_traiter = array(
172
				'date_evenement' => $date_evenement,
173
    		'id_evenement' => $params['id_evenement'],
174
	    	'id_individu' => $params['id_individu'],
324 aurelien 175
				'absence_observation' => 0,
320 aurelien 176
    		'commentaire' => '');
177
 
324 aurelien 178
    	if($a_modifier) {
179
    		$obs_a_traiter['id_observation'] = $a_modifier;
180
    		$retour = $this->modifierObservation($id_participant, $obs_a_traiter);
320 aurelien 181
    	} else {
324 aurelien 182
				// le signalement de l'absence d'un stade pour une année et un individu donné est toujours
183
				// une nouvelle observation (car cela bloque la saisie d'obs supplementaires pour ce stade,
184
				// cette année et cet individu)
185
				if(!empty($params['absence_observation']) && $params['absence_observation'] == 1) {
186
					// si l'observation d'absence concerne l'année en cours on la met à la date du jour
187
					// sinon on la met arbitrairement au premier janvier de l'année concernée
188
					$obs_a_traiter['date_evenement'] = ($annee_en_cours == date('Y')) ? date('Y-m-d') : $annee_en_cours.'-01-01';
189
					$obs_a_traiter['absence_observation'] = $params['absence_observation'];
190
				}
320 aurelien 191
    		$retour = ['id_observation' => $this->insererObservation($id_participant, $obs_a_traiter)];
46 aurelien 192
    	}
320 aurelien 193
 
194
      $this->envoyer($retour);
46 aurelien 195
    }
320 aurelien 196
 
46 aurelien 197
    private function insererObservation($id_participant, $donnees_obs_a_inserer) {
320 aurelien 198
 
46 aurelien 199
    	$nouvel_ordre = 1;
320 aurelien 200
 
137 aurelien 201
    	$requete_max_ordre = 'SELECT MAX(oo_ordre) as max_ordre FROM ods_observations WHERE '.
46 aurelien 202
    		'oo_ce_participant = '.$this->proteger($id_participant);
320 aurelien 203
 
46 aurelien 204
    	$resultat_requete_ordre = $this->executerRequete($requete_max_ordre);
320 aurelien 205
 
46 aurelien 206
    	if(count($resultat_requete_ordre) > 0) {
320 aurelien 207
    		$nouvel_ordre = $resultat_requete_ordre[0]['max_ordre'] + 1;
46 aurelien 208
    	}
320 aurelien 209
 
46 aurelien 210
    	$requete_nouvelle_observation = 'INSERT INTO ods_observations '.
324 aurelien 211
    		'(oo_ce_participant, oo_ordre, oo_ce_individu, oo_ce_evenement, oo_date, oo_commentaire, oo_date_saisie, oo_date_modification, oo_absence_evenement) '.
46 aurelien 212
    		'VALUES '.
213
    		'( '.
137 aurelien 214
    		    $this->proteger($id_participant).','.
46 aurelien 215
	    		$this->proteger($nouvel_ordre).','.
216
	    		$this->proteger($donnees_obs_a_inserer['id_individu']).','.
217
	    		$this->proteger($donnees_obs_a_inserer['id_evenement']).','.
218
	    		$this->proteger($donnees_obs_a_inserer['date_evenement']).','.
219
	    		'"",'.
220
	    		'NOW(),'.
324 aurelien 221
	    		'NOW(),'.
222
					$this->proteger($donnees_obs_a_inserer['absence_observation']).
320 aurelien 223
    		')';
224
 
225
	    $this->executerRequeteSimple($requete_nouvelle_observation);
226
			return $this->renvoyerDernierIdInsere();
46 aurelien 227
    }
320 aurelien 228
 
46 aurelien 229
	private function modifierObservation($id_participant, $donnees_obs_a_inserer) {
230
 
324 aurelien 231
			$requete_obs_existante = 'SELECT * FROM ods_observations '.
232
												'WHERE oo_id_observation = '.$this->proteger($donnees_obs_a_inserer['id_observation']);
233
			$obs_existante = $this->executerRequete($requete_obs_existante);
320 aurelien 234
 
324 aurelien 235
			if(empty($obs_existante)) {
236
				return false;
237
			}
238
 
239
			$obs_existante = $obs_existante[0];
240
 
241
			$tableau_date =  date_parse($donnees_obs_a_inserer['date_evenement']);
242
			$est_une_suppression_obs = $this->estUneDateInvalide($tableau_date['day'], $tableau_date['month'], $tableau_date['year']);
243
 
244
			$resultat = true;
245
			// Pour supprimer une observation, on indique une date invalide contenant seulement son année.
246
			// Celle-ci n'est du coup pas supprimée mais plutôt désactivée car le reste du programme
247
			// ne tient normalement pas compte des obs avec des dates au format 00-00-yyyy (où yyyy est l'année où elle a eu lieu).
248
			// Ceci permet de garder les données et les faires traiter par Isabelle.
249
			// TODO: on pourrait faire bien mieux mais ça fonctionne et changer le système demanderait
250
			// plus de temps mais ça serait une bonne chose à faire.
251
			// Par contre si c'est une obs de signalement d'absence d'évènement on la supprime carrément
252
			// car ça n'a pas d'interêt à être gardé (car c'est surement pour saisir une vraie obs après)
253
			if($est_une_suppression_obs && $obs_existante['oo_absence_evenement'] == 1) {
254
 
255
				$requete_suppression_observation = 'DELETE FROM ods_observations '.
256
					'WHERE oo_id_observation = '.$this->proteger($donnees_obs_a_inserer['id_observation']).' '.
257
					'AND oo_absence_evenement = 1';
327 aurelien 258
 
324 aurelien 259
					$this->executerRequeteSimple($requete_suppression_observation);
260
			} else {
261
				$requete_modification_observation = 'UPDATE ods_observations '.
262
					'SET '.
263
						'oo_date = '.$this->proteger($donnees_obs_a_inserer['date_evenement']).', '.
264
						'oo_commentaire = '.$this->proteger($donnees_obs_a_inserer['commentaire']).', '.
265
						'oo_date_modification = NOW() '.
266
					'WHERE oo_id_observation = '.$donnees_obs_a_inserer['id_observation'].' '.
267
					'AND oo_ce_participant = '.$this->proteger($id_participant);
268
 
269
					$resultat = $this->executerRequeteSimple($requete_modification_observation);
270
			}
271
 
272
    	return $resultat;
46 aurelien 273
    }
320 aurelien 274
 
46 aurelien 275
    private function renvoyerIdObservationSiEvenementDejaObserveCetteAnnee($id_evenement, $tableau_observations_cette_annee) {
320 aurelien 276
 
46 aurelien 277
    	foreach($tableau_observations_cette_annee as $observation_cette_annee) {
320 aurelien 278
 
46 aurelien 279
    		if($id_evenement == $observation_cette_annee['oo_ce_evenement']) {
280
    			return $observation_cette_annee['oo_id_observation'];
41 aurelien 281
    		}
282
    	}
320 aurelien 283
 
46 aurelien 284
    	return false;
285
    }
320 aurelien 286
 
46 aurelien 287
	private function renvoyerIdEvenementSiChampDeFormulaireObservation($champ) {
320 aurelien 288
 
262 gduche 289
    	$tab_champ = explode('observation_',$champ);
320 aurelien 290
 
46 aurelien 291
    	if(count($tab_champ) > 1 && is_numeric($tab_champ[1])) {
292
    		return $tab_champ[1];
293
    	}
320 aurelien 294
 
46 aurelien 295
    	return false;
296
    }
320 aurelien 297
 
46 aurelien 298
    private function formaterDateObservationPourBdd($date) {
320 aurelien 299
 
46 aurelien 300
		$format = $this->config['appli']['format_date'];
320 aurelien 301
 
46 aurelien 302
		if(!isset($format)) {
303
			$format = 'd/m/Y';
304
		}
320 aurelien 305
 
46 aurelien 306
		$recherche = array('d','m','Y');
307
		$remplacement = array('([0-9]{1,2})','([0-9]{1,2})','([0-9]{4})');
320 aurelien 308
 
215 aurelien 309
		$pattern_date_simple = str_replace($recherche, $remplacement, $format);
320 aurelien 310
 
262 gduche 311
		$date_tab = explode('/', $date);
215 aurelien 312
		$time = mktime(0,0,0,$date_tab[1],$date_tab[0],$date_tab[2]);
320 aurelien 313
 
215 aurelien 314
		if($this->estUneDateInvalide($date_tab[1],$date_tab[0],$date_tab[2])) {
315
			$date_a_renvoyer = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0];
316
		} else {
320 aurelien 317
			$date_a_renvoyer = date('Y-m-d', $time);
318
		}
319
 
215 aurelien 320
		return $date_a_renvoyer;
320 aurelien 321
	}
322
 
215 aurelien 323
	private function estUneDateInvalide($jour, $mois, $annee) {
324
		return ($jour == '00' || $mois == '00' || $annee == '0000');
325
	}
320 aurelien 326
 
46 aurelien 327
    /**
328
     * Méthode appelée pour supprimer un élément
329
     */
330
    public function deleteElement($uid) {
320 aurelien 331
 
46 aurelien 332
        // Envoie sur la sortie standard
333
        $this->envoyer();
334
    }
31 aurelien 335
}
320 aurelien 336
?>