Subversion Repositories Sites.obs-saisons.fr

Rev

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