Subversion Repositories eFlore/Applications.coel

Rev

Rev 1925 | 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');
1925 delphine 23
			switch ($cmd) {
24
				case "sauvegarder" :
25
					$this->sauvegarder(); break;
1917 aurelien 26
				case "unitebase" :
1921 delphine 27
					$this->desontologiserUniteBase(); break;
1919 aurelien 28
				case "uniterangement" :
1921 delphine 29
					$this->desontologiserUniteRangement(); break;
30
				case "inventaire" :
31
					$this->desontologiserInventaire(); break;
32
				case "etat" :
1925 delphine 33
					$this->desontologiserEtat(); break;
34
				case "periode" :
35
					$this->desontologiserPeriode(); break;
1917 aurelien 36
				default :
37
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
38
			}
39
		} catch (Exception $erreur) {
40
			$this->traiterErreur($erreur->getMessage());
41
		}
42
	}
43
 
1925 delphine 44
	private function sauvegarder() {
45
		$requete = "CREATE TABLE coel_collection_sauv SELECT * FROM coel_collection; CREATE TABLE coel_collection_botanique_sauv SELECT * FROM coel_collection_botanique;";
46
		$infos_truk = $this->bdd->requeter($requete);
47
	}
48
 
1921 delphine 49
	private function desontologiserInventaire() {
50
		$requete_table = "ALTER TABLE coel_collection_botanique ".
51
			"CHANGE `ccb_ce_inventaire` `ccb_ce_inventaire` VARCHAR(20) NULL DEFAULT NULL COMMENT 'Existe-t-il un inventaire de cette collection?', ".
1925 delphine 52
			"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?', ".
53
			"CHANGE `ccb_ce_traitement` `ccb_ce_traitement` VARCHAR(20) NULL DEFAULT NULL COMMENT 'L''auteur de la collection a-t-il participé à cet inventaire?';";
1921 delphine 54
 
55
		$infos_truk = $this->bdd->requeter($requete_table);
56
 
1925 delphine 57
		$requete = "SELECT ccb_id_collection, ccb_ce_inventaire, ccb_ce_inventaire_auteur, ccb_ce_traitement ".
1921 delphine 58
				"FROM coel_collection_botanique ".
59
				"WHERE (ccb_ce_inventaire IS NOT NULL AND ccb_ce_inventaire != '') OR (ccb_ce_inventaire_auteur IS NOT NULL AND ccb_ce_inventaire_auteur != '')";
60
 
61
		$infos_truk = $this->bdd->recupererTous($requete);
62
 
63
		foreach ($infos_truk as $truk) {
64
			$id_collection = $truk['ccb_id_collection'];
65
			$inventaire = $this->transformerouinon($truk["ccb_ce_inventaire"]);
66
			$inventaire_auteur = $this->transformerouinon($truk["ccb_ce_inventaire_auteur"]);
1925 delphine 67
			$traitement = $this->transformerouinon($truk["ccb_ce_traitement"]);
1921 delphine 68
			$update = 'UPDATE coel_collection_botanique '.
69
					'SET '.
70
					'ccb_ce_inventaire = "'.$inventaire.'", '.
71
					'ccb_ce_inventaire_auteur = "'.$inventaire_auteur.'" '.
1925 delphine 72
					'ccb_ce_traitement = "'.$traitement.'" '.
1921 delphine 73
					'WHERE ccb_id_collection = "'.$id_collection.'"';
74
 
75
			$this->bdd->executer($update);
76
		}
77
	}
78
 
79
	private function desontologiserEtat() {
80
		$requete_table = "ALTER TABLE coel_collection_botanique ".
1925 delphine 81
				"CHANGE `ccb_ce_unite_rangement_etat` `ccb_ce_unite_rangement_etat` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon', ".
82
				"CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon';";
1921 delphine 83
 
84
		$infos_truk = $this->bdd->requeter($requete_table);
85
 
86
		$requete = "SELECT ccb_id_collection, ccb_ce_unite_rangement_etat, ccb_ce_etat_general ".
87
				"FROM coel_collection_botanique ".
88
				"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 != '')";
89
 
90
		$infos_truk = $this->bdd->recupererTous($requete);
91
 
92
		foreach ($infos_truk as $truk) {
93
			$id_collection = $truk['ccb_id_collection'];
94
			$inventaire = $this->transformerBonMauvaisEtat($truk["ccb_ce_unite_rangement_etat"]);
95
			$inventaire_auteur = $this->transformerBonMauvaisEtat($truk["ccb_ce_etat_general"]);
96
			$update = 'UPDATE coel_collection_botanique '.
97
					'SET '.
98
					'ccb_ce_unite_rangement_etat = "'.$inventaire.'", '.
99
					'ccb_ce_etat_general = "'.$inventaire_auteur.'" '.
100
					'WHERE ccb_id_collection = "'.$id_collection.'"';
101
 
102
			$this->bdd->executer($update);
103
		}
104
	}
105
 
1925 delphine 106
	private function desontologiserPeriode() {
107
		$requete_table = "ALTER TABLE coel_collection ADD ".
108
				" cc_periode_constitution_debut int(4)  AFTER cc_truk_periode_constitution, ADD cc_periode_constitution_fin int(4)  AFTER cc_periode_constitution_debut;";
109
 
1926 mathias 110
		$infos_truk = $this->bdd->requeter($requete_table);
1921 delphine 111
 
1925 delphine 112
		$requete = "SELECT cc_id_collection, substr(`ccb_recolte_date_debut`, 1, 4) AS annee_debut, ccb_ce_recolte_date_debut_type as type_debut, ".
113
				"substr(`ccb_recolte_date_fin`, 1, 4) AS annee_fin, ccb_ce_recolte_date_fin_type as type_fin,".
114
		" cc_truk_periode_constitution AS siecle FROM `coel_collection_botanique`, `coel_collection`
115
					WHERE `ccb_id_collection`=`cc_id_collection` ";
116
 
117
		$infos_truk = $this->bdd->recupererTous($requete);
118
 
119
 
120
		foreach ($infos_truk as $truk) {
121
			$id_collection = $truk['ccb_id_collection'];
122
			$periode = $this->transformerPeriode($truk);
123
			$update = 'UPDATE coel_collection '.
124
					'SET '.
125
					'cc_periode_constitution_debut = "'.$periode[0].'", '.
126
					'cc_periode_constitution_fin = "'.$periode[1].'" '.
127
					'WHERE cc_id_collection = "'.$id_collection.'"';
128
 
129
			$this->bdd->executer($update);
130
		}
131
 
132
		$requete = "SELECT cc_id_collection, '0000' AS annee_debut, '' as type_debut, ".
133
				"'0000' AS annee_fin, '' as type_fin,".
134
				" cc_truk_periode_constitution AS siecle FROM `coel_collection`
135
					WHERE `cc_periode_constitution_debut` is null and `cc_truk_periode_constitution` != ''";
136
 
137
		$infos_truk = $this->bdd->recupererTous($requete);
138
 
139
 
140
		foreach ($infos_truk as $truk) {
141
			$id_collection = $truk['cc_id_collection'];
142
			$periode = $this->transformerPeriode($truk);
143
			$update = 'UPDATE coel_collection '.
144
					'SET '.
145
					'cc_periode_constitution_debut = "'.$periode[0].'", '.
146
					'cc_periode_constitution_fin = "'.$periode[1].'" '.
147
					'WHERE cc_id_collection = "'.$id_collection.'"';
148
 
149
			$this->bdd->executer($update);
150
		}
151
		/*supprimer ccb_recolte_date_debut,  ccb_ce_recolte_date_debut_type, ccb_recolte_date_fin,  ccb_ce_recolte_date_fin_type, cc_truk_periode_constitution
152
		 *
153
		 * $requete_table = "ALTER TABLE coel_collection_botanique ".
154
		 "CHANGE `ccb_ce_unite_rangement_etat` `ccb_ce_unite_rangement_etat` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon', ".
155
		 "CHANGE `ccb_ce_etat_general` `ccb_ce_etat_general` int(1) NULL DEFAULT NULL COMMENT 'liste de 1 à 5 correspondant à une liste déroulante entre très mauvais et très bon';";
156
 
157
		 $infos_truk = $this->bdd->requeter($requete_table);
158
		 */
1921 delphine 159
	}
160
 
1917 aurelien 161
	private function desontologiserUniteBase() {
1921 delphine 162
		$requete_table = "ALTER TABLE coel_collection_botanique ADD ".
163
				" ccb_nb_planches_herbiers int(20)  AFTER `ccb_truk_unite_base`, ADD ccb_nb_especes int(20)  AFTER ccb_nb_planches_herbiers;";
164
 
165
		$infos_truk = $this->bdd->requeter($requete_table);
166
 
1917 aurelien 167
		$requete = "SELECT ccb_id_collection, ccb_truk_unite_base ".
168
					"FROM coel_collection_botanique ".
169
					"WHERE ccb_truk_unite_base IS NOT NULL AND ccb_truk_unite_base != ''";
170
 
171
		$infos_truk = $this->bdd->recupererTous($requete);
172
 
173
		foreach($infos_truk as $truk) {
174
 
175
			$id_collection = $truk['ccb_id_collection'];
176
 
177
			// Séparation de chaque catégorie d'unite de truk
178
			$categories_truk = explode(';;', $truk['ccb_truk_unite_base']);
179
			// Iteration sur toutes les catégories de truk trouvées
180
			foreach($categories_truk as $categorie_truk) {
181
				// extraction du numéro d'ontologie de la liste concernée
182
				$categorie_truk_unite_infos = explode('##', $categorie_truk);
183
				// Seules les infos de planche d'herbier nous interessent (donc numéro d'ontologie 2270)
184
				if($categorie_truk_unite_infos[0] == '2270') {
185
					$truk_unite_infos = $categorie_truk_unite_infos[1];
186
 
187
					$truk_unite_infos = explode('||', $truk_unite_infos);
188
					$nb_planches_herbiers = $truk_unite_infos[0];
189
					$nb_especes =  $truk_unite_infos[5];
190
 
191
					$update = 'UPDATE coel_collection_botanique '.
192
								'SET '.
1919 aurelien 193
									'ccb_nb_planches_herbiers = "'.$nb_planches_herbiers.'", '.
194
									'ccb_nb_especes = "'.$nb_especes.'" '.
1917 aurelien 195
								'WHERE ccb_id_collection = "'.$id_collection.'"';
196
 
197
					$this->bdd->executer($update);
198
				}
199
			}
200
		}
201
	}
1919 aurelien 202
 
203
	private function desontologiserUniteRangement() {
1921 delphine 204
		$requete_table = "ALTER TABLE coel_collection_botanique ADD ".
205
				" ccb_nb_liasses int(20)  AFTER `ccb_truk_unite_rangement`, ADD ccb_format_liasses varchar(50)  AFTER ccb_nb_liasses ,".
206
				" ADD ccb_nb_cartons_herbier int(20)  AFTER `ccb_format_liasses`, ADD ccb_format_cartons_herbier varchar(50)  AFTER ccb_nb_cartons_herbier , ".
207
				"ADD ccb_autres_unites_rangement text AFTER ccb_format_cartons_herbier;";
208
 
209
		//print_r($requete_table);
210
		$infos_truk = $this->bdd->requeter($requete_table);
1919 aurelien 211
 
212
		$requete = "SELECT ccb_id_collection, ccb_truk_unite_rangement ".
213
					"FROM coel_collection_botanique ".
214
					"WHERE ccb_truk_unite_rangement IS NOT NULL AND ccb_truk_unite_rangement != '' ";
215
 
216
		$infos_truk = $this->bdd->recupererTous($requete);
217
 
218
		// Récupération de la liste des termes d'ontologies pour les types de rangement
219
		$requete_onto = "SELECT * FROM coel_meta_liste_valeur ".
220
					"WHERE cmlv_ce_parent = 1044";
221
 
222
		$infos_onto = $this->bdd->recupererTous($requete_onto);
223
 
224
		// Pour associer facilement chaque id d'ontologie à sa signification
225
		$ontologie_rangement = array();
226
		foreach($infos_onto as $onto) {
227
			$ontologie_rangement[$onto['cmlv_id_valeur']] = $onto;
228
		}
229
 
230
		foreach($infos_truk as $truk) {
231
 
232
			$id_collection = $truk['ccb_id_collection'];
233
			$unite_rangement_des = array('cartons' => array(), 'liasses' => array(), 'autres' => array());
234
 
235
			// Séparation de chaque catégorie d'unite de truk
236
			$categories_unite_rangement = explode(';;', $truk['ccb_truk_unite_rangement']);
237
 
238
			// Pour éviter de modifier une collection où seul un "squelette" de truk serait présent
239
			$collection_a_modifier = false;
240
 
241
			// Iteration sur toutes les catégories de rangement trouvées
242
			foreach($categories_unite_rangement as $unite_rangement) {
243
				// extraction du numéro d'ontologie de la liste concernée
244
				list($id_ontologie_rangement, $infos_unite_rangement) = explode('##', $unite_rangement);
245
				$tableau_unite_rangement = $this->parserUniteRangement($infos_unite_rangement);
246
 
247
				if($tableau_unite_rangement['nombre'] > 0) {
248
					$collection_a_modifier = true;
249
					switch($id_ontologie_rangement) {
250
						// Liasses : 2256
251
						case "2256":
252
							$unite_rangement_des['liasses'] = $tableau_unite_rangement;
253
						break;
254
						// Cartons d'herbier : 2255
255
						case "2255":
256
							$unite_rangement_des['cartons'] = $tableau_unite_rangement;
257
						break;
258
						// Autres
259
						default:
260
							$unite_rangement_des['autres'][] = $this->formaterLigneAutreUniteRangement($id_ontologie_rangement, $ontologie_rangement, $tableau_unite_rangement);
261
					}
262
				}
263
			}
264
 
265
			// Pas la peine de modifier une collection qui ne content ni liasse, ni carton d'herbier, ni autre
266
			// (on ne le sait qu'à ce moment là après analyse par le script car la colonne ccb_truk_unite_rangement
267
			// est tout de même quelquefois remplie par une syntaxe d'ontologie vide quand il n'y a rien)
268
			if($collection_a_modifier) {
269
				$update = "UPDATE coel_collection_botanique ".
270
								"SET ";
271
 
272
				$champs = array();
273
 
274
				if(!empty($unite_rangement_des['liasses'])) {
275
					$champs[] = "ccb_nb_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['nombre']).", ".
276
					"ccb_format_liasses = ".$this->bdd->proteger($unite_rangement_des['liasses']['format'])." ";
277
				}
278
 
279
				if(!empty($unite_rangement_des['cartons'])) {
280
					$champs[] = "ccb_nb_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['nombre']).", ".
281
					"ccb_format_cartons_herbier = ".$this->bdd->proteger($unite_rangement_des['cartons']['format'])." ";
282
				}
283
 
284
				if(!empty($unite_rangement_des['autres'])) {
285
					// Pour éviter de casser les sauts de lignes il faut les remplacer après avoir protégé la valeur
286
					$champs[] = "ccb_autres_unites_rangement = ".str_replace('NEWLINE', "\r\n", $this->bdd->proteger(implode('NEWLINE', $unite_rangement_des['autres'])));
287
				}
288
 
289
				$update .= implode(', ', $champs)." ".
290
							"WHERE ccb_id_collection = '".$id_collection."'";
291
 
292
				$this->bdd->executer($update);
293
			}
294
		}
295
	}
296
 
297
	private function parserUniteRangement($unite_rangement) {
298
		$tableau_unite_rangement = explode('||', $unite_rangement);
299
		return array(
300
			'nombre' => $tableau_unite_rangement[0],
301
			'precision' => $tableau_unite_rangement[1],
302
			'format' => $tableau_unite_rangement[2]
303
		);
304
	}
305
 
306
	private function formaterLigneAutreUniteRangement($id_ontologie, $ontologie_rangement, $tableau_unite_rangement) {
307
		$nom_rangement = $id_ontologie;
308
 
309
		// Des fois on a un numéro d'ontologie des fois un nom de type de rangement
310
		if(!is_numeric($id_ontologie)) {
311
			$nom_rangement = $id_ontologie;
312
		} else if(!empty($ontologie_rangement[$id_ontologie])) {
313
			$nom_rangement = $ontologie_rangement[$id_ontologie]['cmlv_nom'];
314
		} else {
315
			$nom_rangement = 'Type de rangement inconnu';
316
		}
317
 
318
		// Le nombre d'unités est directement accolé au type
319
		$tab_autre_ligne_rangement = array($nom_rangement);
320
		if(!empty($tableau_unite_rangement['nombre'])) {
321
			$tab_autre_ligne_rangement[0] .= ' : '.$tableau_unite_rangement['nombre'];
322
		}
323
 
324
		// La précision est soit exacte soit approximative
325
		if(!empty($tableau_unite_rangement['precision'])) {
326
			$precision = $tableau_unite_rangement['precision'] == 'E' ? 'exacte' : 'appromixative';
327
			$tab_autre_ligne_rangement[] = 'Précision '.$precision;
328
		}
329
 
330
		// Le format est une suite de de type YxZ ou Y et Z sont des longueurs et largeurs
331
		// eventuellement séparés par des virgules s'il y a différents formats
332
		if(!empty($tableau_unite_rangement['format'])) {
333
			$tab_autre_ligne_rangement[] = 'Format '.$tableau_unite_rangement['format'];
334
		}
335
		// On retourne une ligne de la forme "type de rangement : nombre - Précision précision - Format format"
336
		return implode(' - ', $tab_autre_ligne_rangement);
337
	}
1925 delphine 338
 
339
 
340
	private function transformerPeriode($donnees) {
341
		// initialisation
342
		$siecle = array("2233"=>"15",
343
				"2234"=>"16",
344
				"2235"=>"17",
345
				"2236"=>"18",
346
				"2237"=>"19",
347
				"2238"=>"20");
348
		$type = array("2316"=>"Date inconnue",
349
				"2317"=>"Date exacte",
350
				"2318"=>"Antérieure à",
351
				"2319"=>"Postérieure à",
352
				"2320"=>"Date estimée",
353
				"2321"=>"Date inconnue",
354
				"2322"=>"Date exacte",
355
				"2323"=>"Antérieure à",
356
				"2324"=>"Postérieure à",
357
				"2325"=>"Date estimée",
358
				"2326"=>"Encore en activité");
359
		$periode_debut = ""; $periode_fin = "";
360
		if ($donnees["annee_debut"] == "") $donnees["annee_debut"] = "0000";
361
		if($donnees["annee_fin"] == "") $donnees["annee_fin"] = "0000";
362
 
363
		// si une date de début ET une date de fin sont indiquées
364
		if ($donnees["annee_debut"] !== "0000" && $donnees["annee_fin"] !== "0000") {
365
			$periode_debut = $donnees["annee_debut"];
366
			$periode_fin = $donnees["annee_fin"];
367
 
368
			// si un (ou plusieurs) siècles sont indiqué(s)
369
		} else if($donnees["siecle"] != "") {
370
			// initialisation années début et fin de siècle
371
			$siecles = explode(";;", $donnees["siecle"]);
372
			$siecle_debut = $siecle[$siecles[0]]."01";
373
			$siecle_fin = $siecle[array_pop($siecles)]."99";
374
 
375
			// si les centaines de l'année de début et du siècle sont égales
376
			if (substr($donnees["annee_debut"],0,2) == substr($siecle_debut,0,2)) {
377
				$periode_debut = $donnees["annee_debut"];
378
			} else if ($donnees["annee_debut"] != "0000" && $donnees["annee_debut"] < $siecle_debut) {
379
				$periode_debut = $donnees["annee_debut"];
380
			} else {
381
				$periode_debut = $siecle_debut;
382
			}
383
 
384
			if (substr($donnees["annee_fin"],0,2) == substr($siecle_fin,0,2)) {
385
				$periode_fin = $donnees["annee_fin"];
386
			} else if ($donnees["annee_fin"] != "0000" && $donnees["annee_fin"] > $siecle_fin) {
387
				$periode_fin = $donnees["annee_fin"];
388
			} else {
389
				$periode_fin = $siecle_fin;
390
			}
391
		} else {
392
			if ($donnees["annee_debut"] !== "0000") $periode_debut = $donnees["annee_debut"];
393
			if($donnees["annee_fin"] !== "0000") $periode_fin = $donnees["annee_fin"];
394
		}
395
		//print_r($donnees); echo $periode_debut." - ".$periode_fin;
396
		return array($periode_debut,$periode_fin);
397
	}
398
 
399
	private function transformerBonMauvaisEtat($cle) {
400
		if ($cle==0) $cle="NULL";
401
		$valeur = $cle;
402
		$ontologies = array("2265" => "1",
403
				"2266" => "2",
404
				"2267" => "3",
405
				"2268" => "4",
406
				"2269" => "5",
407
		);
408
		if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
409
		return $valeur;
410
	}
411
 
412
	private function transformerouinon($cle) {
413
		$valeur = $cle;
414
		$ontologies = array("2092" => "non",
415
				"2093" => "oui",
416
				"2094" => "enPartie",
417
				"2239" => "neSaitPas",
418
				"2240" => "peutEtre",
419
				"2241" => "oui",
420
				"2242" => "non",
421
				"2339" => "oui",
422
				"2340" => "non",
423
				"2341" => "enGrandePartie",
424
				"2342" => "neSaitPas)",
425
				"2343" => "parfois",
426
				"2344" => "oui",
427
				"2345" => "non",
428
				"30744" => "indetermine",
429
				"30745" => "oui",
430
				"30746" => "non");
431
		if (isset($ontologies[$cle])) $valeur = $ontologies[$cle];
432
		return $valeur;
433
	}
1917 aurelien 434
}
1926 mathias 435
?>