Subversion Repositories eFlore/Applications.del

Rev

Rev 1970 | Rev 1972 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1970 Rev 1971
Line 92... Line 92...
92
	private function dedoublonnerPropositions() {
92
	private function dedoublonnerPropositions() {
93
		// Suppression des propositions et votes sur des obs inexistantes
93
		// Suppression des propositions et votes sur des obs inexistantes
94
		// pas la peine de traiter ce qui n'existe plus !
94
		// pas la peine de traiter ce qui n'existe plus !
95
		 $this->supprimerPropositionsOrphelines();
95
		$this->supprimerPropositionsOrphelines();
Line -... Line 96...
-
 
96
		 
-
 
97
		// Corriger les noms de référentiel permet de simplifier les affectations de noms ensuite
-
 
98
		$this->corrigerNomsReferentiels();
-
 
99
		
-
 
100
		// Affectations de nums noms aux propositions qui le permettent
-
 
101
		$this->affecterNnsAuxPropositionsViables();
-
 
102
		echo "\n";
96
		
103
		
97
		echo "Détection des propositions en doublons \n";
104
		echo "Détection des propositions en doublons \n";
98
		// La méthode n'est pas optimisée, on fait beaucoup de boucles, de traitement de données
105
		// La méthode n'est pas optimisée, on fait beaucoup de boucles, de traitement de données
99
		// etc... mais la méthode ne doit pas être lancée souvent et elle est rapide
106
		// etc... mais la méthode ne doit pas être lancée souvent et elle est rapide
100
		// donc lisibilité > performances
107
		// donc lisibilité > performances
101
		$infos_indexees = array();
108
		$infos_indexees = array();
Line 102... Line 109...
102
		$infos_indexees_par_obs = array();
109
		$infos_indexees_par_obs = array();
103
		
110
		
104
		// Selection des ids de commentaires dupliqués, groupés par observation (concaténés par des virgules)
111
		// Selection des ids de commentaires dupliqués, groupés par observation et par nom (concaténés par des virgules)
105
		$requete_id_prod_doubl = "SELECT GROUP_CONCAT(id_commentaire) as id_commentaires_dupliques ".
112
		$requete_id_prod_doubl = "SELECT GROUP_CONCAT(id_commentaire) as id_commentaires_dupliques ".
106
									"FROM del_commentaire ".
113
									"FROM del_commentaire ".
Line 124... Line 131...
124
						"ORDER BY ce_observation, date ";
131
						"ORDER BY ce_observation, date ";
Line 125... Line 132...
125
	
132
	
126
			$propositions_doublonnees = $this->conteneur->getBdd()->recupererTous($requete_prop_doubl);
133
			$propositions_doublonnees = $this->conteneur->getBdd()->recupererTous($requete_prop_doubl);
Line 127... Line 134...
127
		}
134
		}
Line 128... Line 135...
128
		
135
		
129
		echo count($propositions_doublonnees)." propositions pour ".count($ids_propositions_doublonnees)." observations sont potentiellement en doublons \n";
136
		echo count($propositions_doublonnees)." propositions pour ".count($ids_propositions_doublonnees)." couples 'observation-nom_sel' sont potentiellement en doublons \n";
130
		
137
		
131
		// Organisation par numéro d'obs, puis par nom sel, puis par id proposition
138
		// Organisation par numéro d'obs, puis par nom sel, puis par id proposition
Line 218... Line 225...
218
				// de réaffecter les votes à la proposition qui sera conservée
225
				// de réaffecter les votes à la proposition qui sera conservée
219
				if(!isset($votes_conserves[$index])) {
226
				if(!isset($votes_conserves[$index])) {
220
					$votes_conserves[$index] = array();
227
					$votes_conserves[$index] = array();
221
				}
228
				}
Line 222... Line 229...
222
				
229
				
223
				// Si on trouve un vote et un vote contre par le même utilisateur 
230
				// Si on trouve un vote pour et un vote contre par le même utilisateur 
224
				// (cas d'une proposition doublonnée voté de manière contradictoire par 
231
				// (cas d'une proposition doublonnée votée de manière contradictoire par 
Line 225... Line 232...
225
				// un utilisateur), on garde le vote positif
232
				// un utilisateur), on garde le vote positif
226
				
233
				
227
				foreach($prop['votes'] as $vote_proposition) {
234
				foreach($prop['votes'] as $vote_proposition) {
228
					// Un utilisateur ne peut avoir qu'un seul vote par proposition
235
					// Un utilisateur ne peut avoir qu'un seul vote par proposition
229
					$index_vote = $vote_proposition['ce_utilisateur'];
236
					$index_vote = $vote_proposition['ce_utilisateur'];
230
					if(isset($votes_conserves[$index][$index_vote])) {
237
					if(isset($votes_conserves[$index][$index_vote])) { // fusion
231
						$vote_deja_present = $votes_conserves[$index][$index_vote];
238
						$vote_deja_present = $votes_conserves[$index][$index_vote];
232
						// Mise à jour de la valeur dans le cas où le vote existe déjà
239
						// Mise à jour de la valeur dans le cas où le vote existe déjà
233
						$valeur_vote_maj = max($votes_conserves[$index][$index_vote]['valeur'], $vote_proposition['valeur']);
240
						$valeur_vote_maj = max($votes_conserves[$index][$index_vote]['valeur'], $vote_proposition['valeur']);
234
						$votes_conserves[$index][$index_vote]['valeur'] = $valeur_vote_maj;
241
						$votes_conserves[$index][$index_vote]['valeur'] = $valeur_vote_maj;
235
						$votes_conserves[$index][$index_vote]['raison'] .= ' - '.$vote_proposition['valeur'];
242
						$votes_conserves[$index][$index_vote]['raison'] .= ' - '.$vote_proposition['valeur'];
236
					} else {
243
					} else { // nouveau vote
237
						$vote_proposition['raison'] = 'Fusion de '.$vote_proposition['valeur'];
244
						$vote_proposition['raison'] = 'Fusion de '.$vote_proposition['valeur'];
238
						$votes_conserves[$index][$index_vote] = $vote_proposition;
245
						$votes_conserves[$index][$index_vote] = $vote_proposition;
239
					}
246
					}
Line -... Line 247...
-
 
247
				}
240
				}
248
			}
241
			}
249
 
Line 242... Line 250...
242
			
250
			// valeurs par défaut
243
			$conservee = false;
251
			$conservee = false;
244
			$raison = 'Supprimée car ne rentre dans aucun cas';
252
			$raison = 'Supprimée car ne rentre dans aucun cas';
Line 245... Line 253...
245
			
253
			
246
			// Les cas ci dessous permettent de fusionner le maximum d'information
254
			// Les cas ci dessous permettent de fusionner le maximum d'information
-
 
255
			// dans la proposition qui sera conservée (car il existe des doublons qui ne sont 
-
 
256
			// pas tout à fait identiques (ex.: l'un à un num_nom et l'autre pas)
-
 
257
			
-
 
258
			// Les propositions sont classées par ordre de saisie donc on gardera comme base de fusion,
-
 
259
			// la plus ancienne qui correspond à au moins un cas de conservation
-
 
260
			$this->fusionnerPropositions($index, $prop, $proposition_conservees, $propositions_supprimees);
-
 
261
		}
-
 
262
		
-
 
263
		// Si aucune proposition ne convient on prend la première
-
 
264
		// qui est normalement la plus ancienne
-
 
265
		// @TODO normalement ça sert plus à rien
-
 
266
		if (empty($proposition_conservees)) {
-
 
267
			$prop_conservee = reset($prop_a_doublons);
-
 
268
			$index = strtolower($prop_conservee['nom_sel']).'-'.$prop_conservee['utilisateur_courriel'];
-
 
269
			$proposition_conservees[$index] = $prop_conservee;
-
 
270
			$proposition_conservees[$index]['raison'] = "Conservée car aucune autre ne convient \n";
-
 
271
		
-
 
272
			// Dans ce cas on retire la proposition de la liste des propositions supprimées
-
 
273
			unset($propositions_supprimees[$prop_conservee['id_commentaire']]);
-
 
274
		}
-
 
275
		
-
 
276
		$prop_a_doublons['propositions_conservees'] = $proposition_conservees;
-
 
277
		$prop_a_doublons['propositions_supprimees'] = $propositions_supprimees;
-
 
278
		$prop_a_doublons['votes_propositions_doublons'] = $votes_conserves;
-
 
279
		
-
 
280
	}
-
 
281
 
-
 
282
	/**
-
 
283
	 * Tente de fusionner toutes les propositions, pour une observation donnée,
-
 
284
	 * en se basant sur le couple auteur-nom_selectionne
-
 
285
	 */
-
 
286
	protected function fusionnerPropositions($index, &$prop, &$proposition_conservees, &$propositions_supprimees) {
-
 
287
		// On garde un exemple de chaque couple auteur/nom scientifique
-
 
288
		// Ca laisse des doublons en terme de nom mais au moins ça ne lèse pas les auteurs
-
 
289
		if(!isset($proposition_conservees[$index])) {
-
 
290
			// première rencontre avec le couple nom_sel/auteur
-
 
291
			$proposition_conservees[$index] = $prop;
-
 
292
		} else { // Cas de la fusion
-
 
293
			// Fusion d'un nom valide : fusionner nom _sel_nn (et nom_ret_nn et nom_ret s'ils existent)
-
 
294
			if(!empty($prop['nom_sel_nn'])) {
-
 
295
				$proposition_conservees[$index]['nom_sel_nn'] = $prop['nom_sel_nn'];
-
 
296
				// infos complémentaires concernant le référentiel
-
 
297
				if(!empty($prop['nom_referentiel'])) {
-
 
298
					$proposition_conservees[$index]['nom_referentiel'] = $prop['nom_referentiel'];
-
 
299
				}				
-
 
300
				if(!empty($prop['famille'])) {
-
 
301
					$proposition_conservees[$index]['famille'] = $prop['famille'];
-
 
302
				}
-
 
303
				// Fusion du nom retenu s'il existe
-
 
304
				if($proposition_conservees[$index]['nom_ret_nn'] == 0) { // on admet que nom_ret existe aussi dans ce cas
-
 
305
					$proposition_conservees[$index]['nom_ret'] = $prop['nom_ret'];
-
 
306
					$proposition_conservees[$index]['nom_ret_nn'] = $prop['nom_ret_nn'];
-
 
307
				}
-
 
308
			}
-
 
309
			
-
 
310
			// Fusion du caractère retenu : fusioner le booleen, la date de retention, le validateur
-
 
311
			if($prop['proposition_retenue'] == "1") {
-
 
312
				$proposition_conservees[$index]['proposition_retenue'] = $prop['proposition_retenue'];
-
 
313
				if (empty($proposition_conservees[$index]['date_validation'])) {
-
 
314
					$proposition_conservees[$index]['date_validation'] = $prop['date_validation'];
-
 
315
				}
-
 
316
				if (empty($proposition_conservees[$index]['ce_validateur'])) {
-
 
317
					$proposition_conservees[$index]['ce_validateur'] = $prop['ce_validateur'];
-
 
318
				}
-
 
319
			}
-
 
320
			
-
 
321
			// Fusion du caractère initial : fusion du booleen, fusion des infos d'auteur et de la date la plus ancienne
-
 
322
			if($prop['proposition_initiale'] == "1") {
-
 
323
				$proposition_conservees[$index]['proposition_initiale'] = $prop['proposition_initiale'];
-
 
324
				if (empty($proposition_conservees[$index]['ce_utilisateur'])) {
-
 
325
					$proposition_conservees[$index]['ce_utilisateur'] = $prop['ce_utilisateur'];
-
 
326
				}
-
 
327
				if (empty($proposition_conservees[$index]['utilisateur_prenom'])) {
-
 
328
					$proposition_conservees[$index]['utilisateur_prenom'] = $prop['utilisateur_prenom'];
-
 
329
				}
-
 
330
				if (empty($proposition_conservees[$index]['utilisateur_nom'])) {
-
 
331
					$proposition_conservees[$index]['utilisateur_nom'] = $prop['utilisateur_nom'];
-
 
332
				}
-
 
333
				if (empty($proposition_conservees[$index]['utilisateur_courriel'])) {
-
 
334
					$proposition_conservees[$index]['utilisateur_courriel'] = $prop['utilisateur_courriel'];
-
 
335
				}
-
 
336
				// Test tout simple pour éviter les dates vides
-
 
337
				if (empty($proposition_conservees[$index]['date'])) {
-
 
338
					if(substr($prop['date'], 0, 4) != "0000") {
-
 
339
						$proposition_conservees[$index]['date'] = $prop['date'];
-
 
340
					}
-
 
341
				}
-
 
342
			}
-
 
343
 
-
 
344
			// Fusion du commentaire (concaténation du texte)
-
 
345
			if(trim($proposition_conservees[$index]['texte']) != "") {
-
 
346
				$prop['texte'] = trim($prop['texte']);
-
 
347
				// Suppression du texte fusionné, au cas où il existerait déjà (un peu barbare mais bon)
-
 
348
				$proposition_conservees[$index]['texte'] = str_replace($prop['texte'].';', '', $proposition_conservees[$index]['texte']);
-
 
349
				$proposition_conservees[$index]['texte'] .= $prop['texte'].';';		
-
 
350
			}		
Line -... Line 351...
-
 
351
	
-
 
352
			// À la fin, une proposition fusionnée doit être supprimée
-
 
353
			$propositions_supprimees[$prop['id_commentaire']] = $prop;
-
 
354
		}
-
 
355
	}
247
			// dans la proposition qui sera conservée (car il existe des doublons qui ne sont 
356
 
248
			// pas tout à fait identiques (ex.: l'un à un nom nom et l'autre pas)
357
	/**
249
			
358
	 * Tente de fusionner toutes les propositions, pour une observation donnée,
250
			// Les propositions sont classées par ordre de saisie donc on gardera comme base de fusion,
359
	 * en se basant sur le couple auteur-nom_selectionne (première version obsolète)
251
			// la plus ancienne qui correspond à au moins un cas de conservation
360
	 */
252
			
361
	protected function fusionnerPropositionsMauvais($index, &$prop, &$proposition_conservees, &$propositions_supprimees) {
253
			// On garde les num noms valides
362
		// On garde les num noms valides
254
			if($prop['nom_sel_nn'] != "" && $prop['nom_sel_nn'] != 0) {
363
		if($prop['nom_sel_nn'] != "" && $prop['nom_sel_nn'] != 0) {
255
				if(isset($proposition_conservees[$index])) {
364
			if(isset($proposition_conservees[$index])) {
256
					$proposition_conservees[$index]['nom_sel_nn'] = $prop['nom_sel_nn'];
365
				$proposition_conservees[$index]['nom_sel_nn'] = $prop['nom_sel_nn'];
257
					if($proposition_conservees[$index]['nom_ret_nn'] == "" ||
366
				if($proposition_conservees[$index]['nom_ret_nn'] == "" ||
258
							$proposition_conservees[$index]['nom_ret_nn'] == 0) {
367
				$proposition_conservees[$index]['nom_ret_nn'] == 0) { // on admet que nom_ret existe aussi dans ce cas
Line 329... Line 438...
329
				$propositions_supprimees[$prop['id_commentaire']] = $prop;
438
			$propositions_supprimees[$prop['id_commentaire']] = $prop;
330
				$propositions_supprimees[$prop['id_commentaire']]['raison'] = $raison;
439
			$propositions_supprimees[$prop['id_commentaire']]['raison'] = $raison;
331
			}
440
		}
332
		}
441
	}
Line 333... Line -...
333
		
-
 
334
		// Si aucune proposition ne convient on prend la première
-
 
335
		// qui est normalement la plus ancienne
-
 
336
		if(empty($proposition_conservees)) {
-
 
337
			$prop_conservee = reset($prop_a_doublons);
-
 
338
			$index = strtolower($prop_conservee['nom_sel']).'-'.$prop_conservee['utilisateur_courriel'];
-
 
339
			$proposition_conservees[$index] = $prop_conservee;
-
 
340
			$proposition_conservees[$index]['raison'] = "Conservée car aucune autre ne convient \n";
-
 
341
			
-
 
342
			// Dans ce cas on retire la proposition de la liste des propositions supprimées
-
 
343
			unset($propositions_supprimees[$prop_conservee['id_commentaire']]);
-
 
344
		}
-
 
345
		
-
 
346
		$prop_a_doublons['propositions_conservees'] = $proposition_conservees;
-
 
347
		$prop_a_doublons['propositions_supprimees'] = $propositions_supprimees;
-
 
348
		$prop_a_doublons['votes_propositions_doublons'] = $votes_conserves;
-
 
349
		
-
 
350
	}
-
 
351
 
442
 
352
	private function mettreAJourPropositions(&$propositions_a_obs_a_nom) {
443
	private function mettreAJourPropositions(&$propositions_a_obs_a_nom) {
353
		$propositions_conservees = $propositions_a_obs_a_nom['propositions_conservees'];
444
		$propositions_conservees = $propositions_a_obs_a_nom['propositions_conservees'];
Line 354... Line 445...
354
		foreach($propositions_conservees as $index => $proposition_conservee) {
445
		foreach($propositions_conservees as $index => $proposition_conservee) {
355
			
446
			
356
			$id_proposition_conservee = $proposition_conservee['id_commentaire'];
447
			$id_proposition_conservee = $proposition_conservee['id_commentaire'];
Line 357... Line 448...
357
			// Pas besoin de mettre à jour un clé primaire !
448
			// Pas besoin de mettre à jour une clé primaire !
358
			unset($proposition_conservee['id_commentaire']);
449
			unset($proposition_conservee['id_commentaire']);
359
			
450
			
360
			// Suppression des champs qui n'existent pas dans la base de données
451
			// Suppression des champs qui n'existent pas dans la base de données
Line -... Line 452...
-
 
452
			unset($proposition_conservee['votes']);
361
			unset($proposition_conservee['votes']);
453
			unset($proposition_conservee['raison']);
362
			unset($proposition_conservee['raison']);
454
			$maj_prop = array();
363
			$maj_prop = array();
455
			
Line 364... Line 456...
364
			
456
			// on prend les champs un par un
365
			foreach($proposition_conservee as $champ => $valeur) {
457
			foreach($proposition_conservee as $champ => $valeur) {
366
				$maj_prop[] = $champ.'='.$this->conteneur->getBdd()->proteger($valeur);
-
 
-
 
458
				$maj_prop[] = $champ.'='.$this->conteneur->getBdd()->proteger($valeur);
367
			}
459
			}
Line 368... Line 460...
368
			
460
			
369
			$requete_maj_prop = "UPDATE del_commentaire SET ".implode(',', $maj_prop)." ".
461
			$requete_maj_prop = "UPDATE del_commentaire SET ".implode(',', $maj_prop)." ".
Line 386... Line 478...
386
					
478
					
387
					$vote_a_proposition['ce_proposition'] = $id_proposition_conservee;
479
					$vote_a_proposition['ce_proposition'] = $id_proposition_conservee;
388
					foreach($vote_a_proposition as $champ_v => $valeur_v) {
480
					foreach($vote_a_proposition as $champ_v => $valeur_v) {
389
						$maj_vote[] = $champ_v.'='.$this->conteneur->getBdd()->proteger($valeur_v);
481
						$maj_vote[] = $champ_v.'='.$this->conteneur->getBdd()->proteger($valeur_v);
390
					}
-
 
-
 
482
					}
-
 
483
					// tous les votes pertinents pointent maintenant vers la proposition fusionnée
391
					
484
					// certains votes voient leur valeur mise à jour (fusion de valeurs de votes)
392
					$requete_maj_vote = "UPDATE del_commentaire_vote SET ".implode(',', $maj_vote)." ".
485
					$requete_maj_vote = "UPDATE del_commentaire_vote SET ".implode(',', $maj_vote)." ".
393
							"WHERE id_vote = ".$id_vote_conserve;
486
							"WHERE id_vote = ".$id_vote_conserve;
394
					$modif_vote = $this->conteneur->getBdd()->requeter($requete_maj_vote);
487
					$modif_vote = $this->conteneur->getBdd()->requeter($requete_maj_vote);
395
				}
488
				}