Subversion Repositories eFlore/Applications.coel

Rev

Rev 1919 | Rev 1925 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1917 aurelien 1
<?php
2
 
3
/**
4
 * Exemple lancement:
5
 * /opt/lampp/bin/php -d memory_limit=3500M cli.php desontologisation -a unitebase
6
 */
7
 
8
class Desontologisation extends Script {
9
 
10
	private $bdd = null;
11
	private $structures = array();
12
	private $communes = array();
13
	private $nonTrouvees = array();
14
 
15
	public function __construct($script_nom, $parametres) {
16
		parent::__construct($script_nom, $parametres);
17
		$this->bdd = new Bdd();
18
	}
19
 
20
	public function executer() {
21
		try {
22
			$cmd = $this->getParametre('a');
23
			switch ($cmd) {
24
				case "unitebase" :
1921 delphine 25
					$this->desontologiserUniteBase(); break;
1919 aurelien 26
				case "uniterangement" :
1921 delphine 27
					$this->desontologiserUniteRangement(); break;
28
				case "inventaire" :
29
					$this->desontologiserInventaire(); break;
30
				case "etat" :
31
					$this->desontologiserEtat(); break;
1917 aurelien 32
				default :
33
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
34
			}
35
		} catch (Exception $erreur) {
36
			$this->traiterErreur($erreur->getMessage());
37
		}
38
	}
39
 
1921 delphine 40
	private function desontologiserInventaire() {
41
		$requete_table = "ALTER TABLE coel_collection_botanique ".
42
			"CHANGE `ccb_ce_inventaire` `ccb_ce_inventaire` VARCHAR(20) NULL DEFAULT NULL COMMENT 'Existe-t-il un inventaire de cette collection?', ".
43
			"CHANGE `ccb_ce_inventaire_auteur` `ccb_ce_inventaire_auteur` VARCHAR(20) NULL DEFAULT NULL COMMENT 'L''auteur de la collection a-t-il participé à cet inventaire?';";
44
 
45
		$infos_truk = $this->bdd->requeter($requete_table);
46
 
47
		$requete = "SELECT ccb_id_collection, ccb_ce_inventaire, ccb_ce_inventaire_auteur ".
48
				"FROM coel_collection_botanique ".
49
				"WHERE (ccb_ce_inventaire IS NOT NULL AND ccb_ce_inventaire != '') OR (ccb_ce_inventaire_auteur IS NOT NULL AND ccb_ce_inventaire_auteur != '')";
50
 
51
		$infos_truk = $this->bdd->recupererTous($requete);
52
 
53
		foreach ($infos_truk as $truk) {
54
			$id_collection = $truk['ccb_id_collection'];
55
			$inventaire = $this->transformerouinon($truk["ccb_ce_inventaire"]);
56
			$inventaire_auteur = $this->transformerouinon($truk["ccb_ce_inventaire_auteur"]);
57
			$update = 'UPDATE coel_collection_botanique '.
58
					'SET '.
59
					'ccb_ce_inventaire = "'.$inventaire.'", '.
60
					'ccb_ce_inventaire_auteur = "'.$inventaire_auteur.'" '.
61
					'WHERE ccb_id_collection = "'.$id_collection.'"';
62
 
63
			$this->bdd->executer($update);
64
		}
65
	}
66
 
67
	private function desontologiserEtat() {
68
		$requete_table = "ALTER TABLE coel_collection_botanique ".
69
				"CHANGE `ccb_ce_unite_rangement_etat` `ccb_ce_unite_rangement_etat` VARCHAR(20) NULL DEFAULT NULL, ".
70
				"CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` VARCHAR(20) NULL DEFAULT NULL;";
71
 
72
		$infos_truk = $this->bdd->requeter($requete_table);
73
 
74
		$requete = "SELECT ccb_id_collection, ccb_ce_unite_rangement_etat, ccb_ce_etat_general ".
75
				"FROM coel_collection_botanique ".
76
				"WHERE (ccb_ce_unite_rangement_etat IS NOT NULL AND ccb_ce_unite_rangement_etat != '') OR (ccb_ce_etat_general IS NOT NULL AND ccb_ce_etat_general != '')";
77
 
78
		$infos_truk = $this->bdd->recupererTous($requete);
79
 
80
		foreach ($infos_truk as $truk) {
81
			$id_collection = $truk['ccb_id_collection'];
82
			$inventaire = $this->transformerBonMauvaisEtat($truk["ccb_ce_unite_rangement_etat"]);
83
			$inventaire_auteur = $this->transformerBonMauvaisEtat($truk["ccb_ce_etat_general"]);
84
			$update = 'UPDATE coel_collection_botanique '.
85
					'SET '.
86
					'ccb_ce_unite_rangement_etat = "'.$inventaire.'", '.
87
					'ccb_ce_etat_general = "'.$inventaire_auteur.'" '.
88
					'WHERE ccb_id_collection = "'.$id_collection.'"';
89
 
90
			$this->bdd->executer($update);
91
		}
92
	}
93
 
94
	private function transformerBonMauvaisEtat($cle) {
95
		if ($cle==0) $cle="NULL";
96
		$valeur = $cle;
97
		$ontologies = array("2265" => "Très mauvais état",
98
						"2266" => "Mauvais état",
99
						"2267" => "État moyen",
100
						"2268" => "Bon état",
101
						"2269" => "Très bon état",
102
				);
103
		if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
104
		return $valeur;
105
	}
106
 
107
	private function transformerouinon($cle) {
108
		$valeur = $cle;
109
		$ontologies = array("2092" => "non",
110
						"2093" => "oui",
111
						"2094" => "en partie",
112
						"2239" => "ne sait pas",
113
						"2240" => "peut-être",
114
						"2241" => "oui",
115
						"2242" => "non",
116
						"2339" => "oui",
117
						"2340" => "non",
118
						"2341" => "en grande partie",
119
						"2342" => "ne sait pas)",
120
						"2343" => "parfois",
121
						"2344" => "oui",
122
						"2345" => "non",
123
						"30744" => "indéterminé",
124
						"30745" => "oui",
125
						"30746" => "non");
126
		if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
127
		return $valeur;
128
	}
129
 
1917 aurelien 130
	private function desontologiserUniteBase() {
1921 delphine 131
		$requete_table = "ALTER TABLE coel_collection_botanique ADD ".
132
				" ccb_nb_planches_herbiers int(20)  AFTER `ccb_truk_unite_base`, ADD ccb_nb_especes int(20)  AFTER ccb_nb_planches_herbiers;";
133
 
134
		$infos_truk = $this->bdd->requeter($requete_table);
135
 
1917 aurelien 136
		$requete = "SELECT ccb_id_collection, ccb_truk_unite_base ".
137
					"FROM coel_collection_botanique ".
138
					"WHERE ccb_truk_unite_base IS NOT NULL AND ccb_truk_unite_base != ''";
139
 
140
		$infos_truk = $this->bdd->recupererTous($requete);
141
 
142
		foreach($infos_truk as $truk) {
143
 
144
			$id_collection = $truk['ccb_id_collection'];
145
 
146
			// Séparation de chaque catégorie d'unite de truk
147
			$categories_truk = explode(';;', $truk['ccb_truk_unite_base']);
148
			// Iteration sur toutes les catégories de truk trouvées
149
			foreach($categories_truk as $categorie_truk) {
150
				// extraction du numéro d'ontologie de la liste concernée
151
				$categorie_truk_unite_infos = explode('##', $categorie_truk);
152
				// Seules les infos de planche d'herbier nous interessent (donc numéro d'ontologie 2270)
153
				if($categorie_truk_unite_infos[0] == '2270') {
154
					$truk_unite_infos = $categorie_truk_unite_infos[1];
155
 
156
					$truk_unite_infos = explode('||', $truk_unite_infos);
157
					$nb_planches_herbiers = $truk_unite_infos[0];
158
					$nb_especes =  $truk_unite_infos[5];
159
 
160
					$update = 'UPDATE coel_collection_botanique '.
161
								'SET '.
1919 aurelien 162
									'ccb_nb_planches_herbiers = "'.$nb_planches_herbiers.'", '.
163
									'ccb_nb_especes = "'.$nb_especes.'" '.
1917 aurelien 164
								'WHERE ccb_id_collection = "'.$id_collection.'"';
165
 
166
					$this->bdd->executer($update);
167
				}
168
			}
169
		}
170
	}
1919 aurelien 171
 
172
	private function desontologiserUniteRangement() {
1921 delphine 173
		$requete_table = "ALTER TABLE coel_collection_botanique ADD ".
174
				" ccb_nb_liasses int(20)  AFTER `ccb_truk_unite_rangement`, ADD ccb_format_liasses varchar(50)  AFTER ccb_nb_liasses ,".
175
				" ADD ccb_nb_cartons_herbier int(20)  AFTER `ccb_format_liasses`, ADD ccb_format_cartons_herbier varchar(50)  AFTER ccb_nb_cartons_herbier , ".
176
				"ADD ccb_autres_unites_rangement text AFTER ccb_format_cartons_herbier;";
177
 
178
		//print_r($requete_table);
179
		$infos_truk = $this->bdd->requeter($requete_table);
1919 aurelien 180
 
181
		$requete = "SELECT ccb_id_collection, ccb_truk_unite_rangement ".
182
					"FROM coel_collection_botanique ".
183
					"WHERE ccb_truk_unite_rangement IS NOT NULL AND ccb_truk_unite_rangement != '' ";
184
 
185
		$infos_truk = $this->bdd->recupererTous($requete);
186
 
187
		// Récupération de la liste des termes d'ontologies pour les types de rangement
188
		$requete_onto = "SELECT * FROM coel_meta_liste_valeur ".
189
					"WHERE cmlv_ce_parent = 1044";
190
 
191
		$infos_onto = $this->bdd->recupererTous($requete_onto);
192
 
193
		// Pour associer facilement chaque id d'ontologie à sa signification
194
		$ontologie_rangement = array();
195
		foreach($infos_onto as $onto) {
196
			$ontologie_rangement[$onto['cmlv_id_valeur']] = $onto;
197
		}
198
 
199
		foreach($infos_truk as $truk) {
200
 
201
			$id_collection = $truk['ccb_id_collection'];
202
			$unite_rangement_des = array('cartons' => array(), 'liasses' => array(), 'autres' => array());
203
 
204
			// Séparation de chaque catégorie d'unite de truk
205
			$categories_unite_rangement = explode(';;', $truk['ccb_truk_unite_rangement']);
206
 
207
			// Pour éviter de modifier une collection où seul un "squelette" de truk serait présent
208
			$collection_a_modifier = false;
209
 
210
			// Iteration sur toutes les catégories de rangement trouvées
211
			foreach($categories_unite_rangement as $unite_rangement) {
212
				// extraction du numéro d'ontologie de la liste concernée
213
				list($id_ontologie_rangement, $infos_unite_rangement) = explode('##', $unite_rangement);
214
				$tableau_unite_rangement = $this->parserUniteRangement($infos_unite_rangement);
215
 
216
				if($tableau_unite_rangement['nombre'] > 0) {
217
					$collection_a_modifier = true;
218
					switch($id_ontologie_rangement) {
219
						// Liasses : 2256
220
						case "2256":
221
							$unite_rangement_des['liasses'] = $tableau_unite_rangement;
222
						break;
223
						// Cartons d'herbier : 2255
224
						case "2255":
225
							$unite_rangement_des['cartons'] = $tableau_unite_rangement;
226
						break;
227
						// Autres
228
						default:
229
							$unite_rangement_des['autres'][] = $this->formaterLigneAutreUniteRangement($id_ontologie_rangement, $ontologie_rangement, $tableau_unite_rangement);
230
					}
231
				}
232
			}
233
 
234
			// Pas la peine de modifier une collection qui ne content ni liasse, ni carton d'herbier, ni autre
235
			// (on ne le sait qu'à ce moment là après analyse par le script car la colonne ccb_truk_unite_rangement
236
			// est tout de même quelquefois remplie par une syntaxe d'ontologie vide quand il n'y a rien)
237
			if($collection_a_modifier) {
238
				$update = "UPDATE coel_collection_botanique ".
239
								"SET ";
240
 
241
				$champs = array();
242
 
243
				if(!empty($unite_rangement_des['liasses'])) {
244
					$champs[] = "ccb_nb_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['nombre']).", ".
245
					"ccb_format_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['format'])." ";
246
				}
247
 
248
				if(!empty($unite_rangement_des['cartons'])) {
249
					$champs[] = "ccb_nb_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['nombre']).", ".
250
					"ccb_format_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['format'])." ";
251
				}
252
 
253
				if(!empty($unite_rangement_des['autres'])) {
254
					// Pour éviter de casser les sauts de lignes il faut les remplacer après avoir protégé la valeur
255
					$champs[] = "ccb_autres_unites_rangement = ".str_replace('NEWLINE', "\r\n", $this->bdd->proteger(implode('NEWLINE', $unite_rangement_des['autres'])));
256
				}
257
 
258
				$update .= implode(', ', $champs)." ".
259
							"WHERE ccb_id_collection = '".$id_collection."'";
260
 
261
				$this->bdd->executer($update);
262
			}
263
		}
264
	}
265
 
266
	private function parserUniteRangement($unite_rangement) {
267
		$tableau_unite_rangement = explode('||', $unite_rangement);
268
		return array(
269
			'nombre' => $tableau_unite_rangement[0],
270
			'precision' => $tableau_unite_rangement[1],
271
			'format' => $tableau_unite_rangement[2]
272
		);
273
	}
274
 
275
	private function formaterLigneAutreUniteRangement($id_ontologie, $ontologie_rangement, $tableau_unite_rangement) {
276
		$nom_rangement = $id_ontologie;
277
 
278
		// Des fois on a un numéro d'ontologie des fois un nom de type de rangement
279
		if(!is_numeric($id_ontologie)) {
280
			$nom_rangement = $id_ontologie;
281
		} else if(!empty($ontologie_rangement[$id_ontologie])) {
282
			$nom_rangement = $ontologie_rangement[$id_ontologie]['cmlv_nom'];
283
		} else {
284
			$nom_rangement = 'Type de rangement inconnu';
285
		}
286
 
287
		// Le nombre d'unités est directement accolé au type
288
		$tab_autre_ligne_rangement = array($nom_rangement);
289
		if(!empty($tableau_unite_rangement['nombre'])) {
290
			$tab_autre_ligne_rangement[0] .= ' : '.$tableau_unite_rangement['nombre'];
291
		}
292
 
293
		// La précision est soit exacte soit approximative
294
		if(!empty($tableau_unite_rangement['precision'])) {
295
			$precision = $tableau_unite_rangement['precision'] == 'E' ? 'exacte' : 'appromixative';
296
			$tab_autre_ligne_rangement[] = 'Précision '.$precision;
297
		}
298
 
299
		// Le format est une suite de de type YxZ ou Y et Z sont des longueurs et largeurs
300
		// eventuellement séparés par des virgules s'il y a différents formats
301
		if(!empty($tableau_unite_rangement['format'])) {
302
			$tab_autre_ligne_rangement[] = 'Format '.$tableau_unite_rangement['format'];
303
		}
304
		// On retourne une ligne de la forme "type de rangement : nombre - Précision précision - Format format"
305
		return implode(' - ', $tab_autre_ligne_rangement);
306
	}
1917 aurelien 307
}
308
?>