Subversion Repositories Sites.obs-saisons.fr

Compare Revisions

Ignore whitespace Rev 319 → Rev 320

/trunk/applications/jrest/services/OdsExport.php
1,7 → 1,7
<?php
 
class OdsExport extends OdsTriple {
 
const PREFIXE = 'get';
const ABBR_LISTE_EVENEMENTS = 'evenement';
const ABBR_LISTE_ESPECES = 'espece';
8,19 → 8,19
const ABBR_LISTE_MILIEUX = 'environnement';
 
private $type_mime = 'text/html';
 
/**
* Méthodes d'extractions d'informations
*/
 
/**
* Méthode appelée avec une requête de type GET.
*
*/
function getElement($param = array()) {
 
$type = $param[0];
 
if ($type == '*' || is_numeric($type)) {
$info = $this->getElementParDefaut($param);
} else {
35,40 → 35,40
 
$this->envoyer($info,$this->type_mime);
}
 
public function getExportStationJson() {
 
$donnees = $this->getExportStation();
$donnees_formatees = $this->formaterListeStationPourExportJson($donnees);
 
$this->type_mime = 'application/json';
 
return $donnees_formatees;
}
 
public function getExportStation($start = null,$limit = null, $order_by = 'oo_date') {
 
$id_demo = $this->config['appli']['id_participant_demo'];
$requete_selection_stations = 'SELECT * FROM ods_stations WHERE os_ce_participant != '.$this->proteger($id_demo);
$requete_selection_stations = 'SELECT * FROM ods_stations WHERE os_ce_participant != '.$this->proteger($id_demo);
$res_selection_stations = $this->executerRequete($requete_selection_stations);
 
return $res_selection_stations;
}
 
public function getExportUtilisateurCsv() {
 
$controle = new ControleUtilisateur($this->config);
$controle->authentifierAdmin();
 
$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
 
$utilisateurs_formates = array();
$premiere_annee = 2006;
 
$nb_obs = $this->compterObservationsParUtilisateur();
$annees = array();
 
foreach ($utilisateurs as $id => $utilisateur) {
$utilisateur_formate = array(
'id' => isset($utilisateur['uid']) ? $utilisateur['uid'] : '',
81,15 → 81,15
'type' => isset($utilisateur['profile_type']) ? $utilisateur['profile_type'] : '',
'date inscription' => isset($utilisateur['created']) ? date('d/m/Y', $utilisateur['created']) : '',
);
 
for($i = $premiere_annee; $i <= date('Y'); $i++) {
$annees['annee '.$i] += isset($nb_obs[$utilisateur['uid']]) && isset($nb_obs[$utilisateur['uid']][$i]) ? $nb_obs[$utilisateur['uid']][$i] : '0';
$utilisateur_formate['annee '.$i] = isset($nb_obs[$utilisateur['uid']]) && isset($nb_obs[$utilisateur['uid']][$i]) ? $nb_obs[$utilisateur['uid']][$i] : '0';
}
 
$utilisateurs_formates[] = $utilisateur_formate;
}
 
$ligne_total_obs = array(
'id' => '',
'pseudo' => '',
106,38 → 106,38
$csv = $this->convertirTableauAssocVersCSV($utilisateurs_formates);
$this->envoyerFichier($csv, 'utilisateurs');
}
 
private function compterObservationsParUtilisateur() {
$requete = 'SELECT COUNT(*) as nb_obs, oo_ce_participant as participant, YEAR(oo_date) as annee '.
'FROM `ods_observations` WHERE oo_date != "0000-00-00" GROUP BY oo_ce_participant, YEAR(oo_date)';
 
$res_selection_obs = $this->executerRequete($requete);
$stats = array();
foreach ($res_selection_obs as $obs_nb) {
$stats[$obs_nb['participant']][$obs_nb['annee']] = $obs_nb['nb_obs'];
}
 
return $stats;
}
 
public function formaterListeStationPourExportJson($tableau_stations_infos) {
 
$gestionnaire_especes = new OdsEspece($this->config);
$gestionnaire_communes = new OdsCommune($this->config);
$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
 
$especes = $gestionnaire_especes->getToutesEspeces();
$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
$utilisateurs = $gestionnaire_utilisateurs->getListeUtilisateurAvecInfosComplementairesFormateeId();
$communes = $gestionnaire_communes->obtenirCommunesLieesAStationIndexeesCodeInsee();
 
$resultats_formates = array();
$stats = array('total' => count($tableau_stations_infos));
foreach($tableau_stations_infos as $stations_infos) {
 
foreach($tableau_stations_infos as $stations_infos) {
$commune = isset($communes[$stations_infos['os_ce_commune']]['oc_nom']) ? $communes[$stations_infos['os_ce_commune']]['oc_nom'] : '';
 
$id_station = $stations_infos['os_id_station'];
$resultats_formates[$id_station]['nom'] = $stations_infos['os_nom'];
$resultats_formates[$id_station]['code_commune'] = is_numeric($stations_infos['os_ce_commune']) ? substr($stations_infos['os_ce_commune'], 0, 2) : '';
146,7 → 146,7
$resultats_formates[$id_station]['longitude'] = $stations_infos['os_longitude'];
$resultats_formates[$id_station]['altitude'] = $stations_infos['os_altitude'];
$resultats_formates[$id_station]['type_participant'] = 'Particulier';
 
if(isset($utilisateurs[$stations_infos['os_ce_participant']])) {
$participant = $utilisateurs[$stations_infos['os_ce_participant']];
$resultats_formates[$id_station]['participant']['id'] = $participant['uid'];
163,14 → 163,14
$stats[$resultats_formates[$id_station]['type_participant']] = 1;
}
}
$resultat = array('stats' => $stats, 'stations' => $resultats_formates);
$resultat = array('stats' => $stats, 'stations' => $resultats_formates);
return $resultat;
}
 
public function getExportObservation($start = null,$limit = null, $order_by = 'oo_date') {
 
$requete_selection_observations = 'SELECT oo.*, oi.*, os.*, oc.* FROM ods_observations oo'.
' LEFT JOIN ods_individus oi'.
' LEFT JOIN ods_individus oi'.
' ON oi_id_individu = oo_ce_individu'.
' INNER JOIN ods_especes oe'.
' ON oe.oe_espece_active = 1 '.
187,7 → 187,7
 
return $res_selection_observations;
}
 
private function creerFiltreIdZoneGeo($valeurMasque) {
$masque = '';
$dept = $valeurMasque;
196,49 → 196,49
$masque = " oc_code_insee LIKE ".$this->proteger($dept);
return $masque;
}
 
public function construireConditionRequete() {
 
$condition = ' WHERE oo_date != "0000-00-00" AND DAY(oo_date) != "00" AND ';
 
foreach($_GET as $cle => $valeur) {
 
switch($cle) {
 
case 'type_espece':
$condition .= 'oi_ce_espece IN (SELECT oe_id_espece FROM ods_especes WHERE oe_ce_type = '.$this->proteger($valeur).')';
break;
 
case 'annee':
if($this->anneesMultiplesDemandees($valeur)) {
$valeur = rtrim($valeur,',');
$condition .= 'YEAR(oo_date) IN ('.$valeur.')';
$condition .= 'YEAR(oo_date) IN ('.$valeur.')';
} else {
$condition .= 'YEAR(oo_date) ';
$condition .= ' = '.$this->proteger($valeur);
}
break;
 
case 'mois':
$condition .= 'MONTH(oo_date) <= '.$this->proteger($valeur);
break;
 
case 'espece':
$condition .= 'oi_ce_espece IN ('.$valeur.') ';
break;
 
case 'evenement':
$condition .= 'oo_ce_evenement = '.$this->proteger($valeur);
break;
 
case 'utilisateur':
$condition .= 'oo_ce_participant = '.$this->proteger($valeur);
$condition .= 'oo_ce_participant = '.$this->proteger($valeur);
break;
 
case 'departement' :
$condition .= $this->creerFiltreIdZoneGeo($valeur);
break;
 
case 'region' :
$requete_association_region .= 'SELECT * FROM ods_triples WHERE ot_ce_parent = 36 AND ot_valeur = '.$valeur;
$listeAssociationRegions = $this->executerRequete($requete_association_region);
250,21 → 250,21
break;
default:
}
 
$condition .= ' AND ';
}
 
$condition = rtrim($condition,'AND ');
 
$id_demo = $this->config['appli']['id_participant_demo'];
$id_admin = $this->config['appli']['id_participant_admin'];
 
$condition .= ' AND oo_ce_participant != '.$id_demo;
$condition .= ' AND oo_ce_participant != '.$id_admin;
 
return $condition;
}
 
private function anneesMultiplesDemandees($annee) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
271,51 → 271,51
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $annee);
}
 
public function getExportObservationPlat() {
 
$donnees = $this->getExportObservation();
$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
 
return $donnees_formatees ;
}
 
public function getExportObservationJson() {
 
$donnees = $this->getExportObservation();
$donnees_formatees = $this->formaterListeObservationPourExportJson($donnees);
 
$this->type_mime = 'application/json';
 
return $donnees_formatees;
}
 
public function formaterListeObservationPourExportJson($tableau_observations_infos) {
 
$gestionnaire_especes = new OdsEspece($this->config);
$gestionnaire_communes = new OdsCommune($this->config);
 
$especes = $gestionnaire_especes->getToutesEspeces();
$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
 
$resultats_formates = array();
 
foreach($tableau_observations_infos as $observations_infos) {
 
$id_espece = $observations_infos['oi_ce_espece'];
if($id_espece == 0) {
continue;
}
$nom_espece = $especes[$id_espece]['nom_scientifique'];
 
$id_evenement = $observations_infos['oo_ce_evenement'];
$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
 
$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
 
$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
 
$id_observation = $observations_infos['oo_id_observation'];
$infos_formatees = array(
'date' => $date_observation_formatee,
325,9 → 325,9
'id_espece' => $id_espece,
'participant' => $observations_infos['os_ce_participant']
);
 
$id_station = $observations_infos['oi_ce_station'];
 
if(!isset($resultats_formates[$id_station])) {
$resultats_formates[$id_station]['station'] = $observations_infos['os_nom'];
$resultats_formates[$id_station]['code_commune'] = $observations_infos['os_ce_commune'];
342,52 → 342,53
}
$resultats_formates[$id_station]['participant'] = $observations_infos['os_ce_participant'];
}
 
$resultats_formates[$id_station]['obs'][$id_observation] = $infos_formatees;
}
 
return $resultats_formates;
}
 
public function getFichierExportObservationCsv() {
 
$donnees = $this->getExportObservation();
$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
$donnees_formatees = $this->formaterListeObservationPourExportCSV($donnees);
$chaine_csv = $this->convertirTableauAssocVersCSV($donnees_formatees);
 
$this->envoyerFichier($chaine_csv);
}
 
public function formaterListeObservationPourExportCSV($tableau_observations_infos) {
 
$gestionnaire_especes = new OdsEspece($this->config);
$gestionnaire_communes = new OdsCommune($this->config);
$gestionnaire_utilisateurs = new OdsUtilisateur($this->config);
 
$especes = $gestionnaire_especes->getToutesEspeces();
$evenements = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_EVENEMENTS);
$milieux = $this->obtenirValeursListeParAbreviation(self::ABBR_LISTE_MILIEUX);
 
$codes_insee_communes = array();
 
$resultats_formates = array();
foreach($tableau_observations_infos as $observations_infos) {
 
$id_espece = $observations_infos['oi_ce_espece'];
$nom_espece = $especes[$id_espece]['nom_scientifique'];
 
$id_evenement = $observations_infos['oo_ce_evenement'];
$chaine_evenement = $evenements[$id_evenement]['ot_cle'];
 
$infos_evenement = $this->renvoyerInformationStadeAPartirChaineTriple($chaine_evenement);
 
$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observations_infos['oo_date']));
 
$id_observation = $observations_infos['oo_id_observation'];
$milieu = isset($milieux[$observations_infos['os_ce_environnement']]['ot_valeur']) ? $milieux[$observations_infos['os_ce_environnement']]['ot_valeur'] : '';
 
$infos_formatees = array(
'id_observation' => $id_observation,
'id_individu' => $observations_infos['oo_ce_individu'],
'date' => $date_observation_formatee,
'evenenement' => $infos_evenement['nom'],
'code_bbch' => $infos_evenement['numero'],
403,9 → 404,9
'pseudo_participant' => '',
'mail_participant' => ''
);
 
$resultats_formates[] = $infos_formatees;
 
if(is_numeric($observations_infos['os_ce_commune'])) {
$codes_insee_communes[] = $observations_infos['os_ce_commune'];
}
413,26 → 414,26
 
$correspondance_codes_insee_noms = $gestionnaire_communes->obtenirTableauNomsCommunesParTableauCodesInsee($codes_insee_communes);
$correspondance_id_utilisateur = $gestionnaire_utilisateurs->getListeUtilisateurFormateeId();
 
foreach($resultats_formates as &$resultat) {
if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
 
if(isset($correspondance_codes_insee_noms[$resultat['code_commune']]) && trim($correspondance_codes_insee_noms[$resultat['code_commune']]) != '') {
$resultat['nom_commune'] = $correspondance_codes_insee_noms[$resultat['code_commune']];
}
 
$resultat['pseudo_participant'] = isset($correspondance_id_utilisateur[$resultat['id_participant']]) ? $correspondance_id_utilisateur[$resultat['id_participant']]['name'] : '';
$resultat['mail_participant'] = isset($correspondance_id_utilisateur[$resultat['id_participant']]) ? $correspondance_id_utilisateur[$resultat['id_participant']]['mail'] : '';
}
 
return $resultats_formates;
}
 
public function convertirTableauAssocVersCSV($tableau) {
 
$csv = '';
$colonnes = array_keys($tableau[0]);
$csv .= implode(';',$colonnes).";\n";
 
foreach($tableau as $elements) {
$ligne = "";
// parcours des cases de chaque ligne nécessaire car si on utilise implode
442,39 → 443,39
}
$csv .= $ligne."\n";
}
 
return $csv;
}
 
public function envoyerFichier($contenu, $nom = 'observations_export') {
 
$nom_fichier = $nom.".csv";
$chemin_fichier = $this->config['appli']['chemin_fichiers_temp'].'/'.$nom_fichier;
file_put_contents($chemin_fichier, $contenu);
 
file_put_contents($chemin_fichier, $contenu);
 
$contenu = file_get_contents($chemin_fichier);
$taille_fichier = filesize($chemin_fichier);
 
unlink($chemin_fichier);
 
ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$nom_fichier.'"');
header('Content-Disposition: attachement; filename="'.$nom_fichier.'"');
 
header('Content-Length: '.$taille_fichier);
 
echo $contenu;
exit();
}
 
private function formaterInformationPourEnvoi($tableauinfos) {
 
}
/trunk/applications/jrest/services/OdsObservation.php
4,20 → 4,20
 
const PREFIXE = 'get';
const ABBR_LISTE_EVENEMENTS = 'evenement';
 
 
/**
* Méthodes d'extractions d'informations
*/
 
/**
* Méthode appelée avec une requête de type GET.
*
*/
function getElement($param = array()) {
 
$type = $param[0];
 
if ($type == '*' || is_numeric($type)) {
$info = $this->getElementParDefaut($param);
} else {
32,138 → 32,149
 
$this->envoyer($info);
}
 
private function getElementParDefaut($params) {
 
}
 
private function getObservationsPourStation($params) {
 
$id_station = isset($params[0]) ? $params[0] : '';
$annee = isset($params[1]) ? $params[1] : '';
 
return ;
 
}
 
private function getObservationsPourIndividu($params) {
 
$id_individu = isset($params[0]) ? $params[0] : '';
$annee = isset($params[1]) ? $params[1] : '';
 
$requete_liste_observation_individu = 'SELECT * FROM ods_observations '.
'WHERE oo_ce_individu ='.$this->proteger($id_individu).' '.
'AND DAY(oo_date) != "00" '.
'ORDER BY YEAR(oo_date) DESC, MONTH(oo_date) ASC, DAY(oo_date) ASC ';
'ORDER BY YEAR(oo_date) DESC, MONTH(oo_date) ASC, DAY(oo_date) ASC ';
 
$liste_observation_individu = $this->executerRequete($requete_liste_observation_individu);
 
$liste_observation_individu_formatees = array();
 
foreach($liste_observation_individu as $observation_individu) {
 
$annee_obs = date("Y",strtotime($observation_individu['oo_date']));
$stade_observation_complet = $this->getInformationEvenementParId($observation_individu['oo_ce_evenement']);
 
$abbr_stade_observation = $stade_observation_complet['ot_cle'];
 
$infos_stades = $this->renvoyerInformationStadeAPartirChaineTriple($abbr_stade_observation);
 
$titre_stade = $infos_stades['nom'];
$numero_stade = $infos_stades['numero'];
$abreviation_stade = $infos_stades['abreviation'];
 
$tableau_date = date_parse($observation_individu['oo_date']);
 
if(!$this->estUneDateInvalide($tableau_date['day'], $tableau_date['month'], $tableau_date['year'])) {
 
$date_observation_formatee = date($this->config['appli']['format_date'], strtotime($observation_individu['oo_date']));
$liste_observation_individu_formatees[$annee_obs][$titre_stade][$numero_stade] = $date_observation_formatee;
$liste_observation_individu_formatees[$annee_obs][$titre_stade][$numero_stade] = $date_observation_formatee;
 
$liste_observation_individu_formatees[$annee_obs][$titre_stade][$numero_stade][$observation_individu['oo_id_observation']] = $date_observation_formatee;
}
 
}
 
krsort($liste_observation_individu_formatees);
 
return $liste_observation_individu_formatees;
}
 
/**
* Méthodes de création et modification d'informations
*/
*/
 
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
$elements_requis = array('id_participant','id_individu');
 
$elements_requis = array('id_participant','id_individu', 'id_evenement', 'date_evenement');
$erreurs = array();
 
foreach($elements_requis as $requis) {
if(!isset($params[$requis])) {
$erreurs[$requis] = 'erreur ';
}
}
 
if(!isset($params['annee_en_cours'])) {
$annee_en_cours = date('Y');
} else {
$annee_en_cours = $params['annee_en_cours'];
}
 
if(!empty($erreurs)) {
$this->envoyer($erreurs);
exit;
}
 
$id_participant = $params['id_participant'];
unset($params['id_participant']);
$id_individu = $params['id_individu'];
unset($params['id_individu']);
$requete_obs_deja_saisies_cette_annee = 'SELECT * FROM ods_observations WHERE oo_ce_individu = '.$this->proteger($id_individu).' '.
'AND oo_ce_participant = '.$this->proteger($id_participant).' '.
'AND YEAR(oo_date) = '.$this->proteger($annee_en_cours);
 
$obs_deja_saisies_cette_annee = $this->executerRequete($requete_obs_deja_saisies_cette_annee);
foreach($params as $cle => $valeur) {
if($est_une_valeur_obs = $this->renvoyerIdEvenementSiChampDeFormulaireObservation($cle)) {
$valeur = $this->formaterDateObservationPourBdd($valeur);
$obs_a_traiter = array('date_evenement' => $valeur,
'id_evenement' => $est_une_valeur_obs,
'id_individu' => $id_individu,
'commentaire' => '');
if($a_modifier_ou_inserer = $this->renvoyerIdObservationSiEvenementDejaObserveCetteAnnee($est_une_valeur_obs,$obs_deja_saisies_cette_annee)) {
$obs_a_traiter['id_observation'] = $a_modifier_ou_inserer;
$this->modifierObservation($id_participant, $obs_a_traiter);
} else {
$this->insererObservation($id_participant, $obs_a_traiter);
}
}
$a_modifier_ou_inserer = !empty($params['id_observation']) ? $params['id_observation'] : false;
$retour = array();
 
$date_evenement = $this->formaterDateObservationPourBdd($params['date_evenement']);
 
// dans le cas des ajouts ou modifications on vérifie que l'on insère pas une date
// déjà existante, car ça n'a pas de sens pour un même individu et stade
if (strpos($date_evenement, '00-00') === false) {
$requete_existe_avec_cette_date = 'SELECT * FROM ods_observations '.
'WHERE oo_ce_participant = '.$this->proteger($id_participant).' AND '.
'oo_ce_individu = '.$this->proteger($id_individu).' AND '.
'oo_ce_evenement = '.$this->proteger($params['id_evenement']).' AND '.
'oo_date = '.$this->proteger($date_evenement);
$resultat_requete_existe_avec_cette_date = $this->executerRequete($requete_existe_avec_cette_date);
 
if(!empty($resultat_requete_existe_avec_cette_date)) {
$this->envoyer([
'erreurs' => [
'date' => 'Une observation à cette date existe déjà pour ce stade et cet individu'
]
]);
exit;
}
}
 
$obs_a_traiter = array(
'date_evenement' => $date_evenement,
'id_evenement' => $params['id_evenement'],
'id_individu' => $params['id_individu'],
'commentaire' => '');
 
if($a_modifier_ou_inserer) {
$obs_a_traiter['id_observation'] = $a_modifier_ou_inserer;
$this->modifierObservation($id_participant, $obs_a_traiter);
} else {
$retour = ['id_observation' => $this->insererObservation($id_participant, $obs_a_traiter)];
}
$this->envoyer();
 
$this->envoyer($retour);
}
 
private function insererObservation($id_participant, $donnees_obs_a_inserer) {
 
$nouvel_ordre = 1;
 
$requete_max_ordre = 'SELECT MAX(oo_ordre) as max_ordre FROM ods_observations WHERE '.
'oo_ce_participant = '.$this->proteger($id_participant);
 
$resultat_requete_ordre = $this->executerRequete($requete_max_ordre);
 
if(count($resultat_requete_ordre) > 0) {
$nouvel_ordre = $resultat_requete_ordre[0]['max_ordre'] + 1;
$nouvel_ordre = $resultat_requete_ordre[0]['max_ordre'] + 1;
}
 
$requete_nouvelle_observation = 'INSERT INTO ods_observations '.
'(oo_ce_participant, oo_ordre, oo_ce_individu, oo_ce_evenement, oo_date, oo_commentaire, oo_date_saisie, oo_date_modification) '.
'VALUES '.
176,88 → 187,84
'"",'.
'NOW(),'.
'NOW()'.
')';
return $this->executerRequeteSimple($requete_nouvelle_observation);
')';
 
$this->executerRequeteSimple($requete_nouvelle_observation);
return $this->renvoyerDernierIdInsere();
}
 
private function modifierObservation($id_participant, $donnees_obs_a_inserer) {
 
$requete_modification_observation = 'UPDATE ods_observations '.
'SET '.
'oo_date = '.$this->proteger($donnees_obs_a_inserer['date_evenement']).', '.
'oo_commentaire = '.$this->proteger($donnees_obs_a_inserer['commentaire']).', '.
'oo_date = '.$this->proteger($donnees_obs_a_inserer['date_evenement']).', '.
'oo_commentaire = '.$this->proteger($donnees_obs_a_inserer['commentaire']).', '.
'oo_date_modification = NOW() '.
'WHERE oo_id_observation = '.$donnees_obs_a_inserer['id_observation'].' '.
'AND oo_ce_participant = '.$this->proteger($id_participant);
 
return $this->executerRequeteSimple($requete_modification_observation);
}
 
private function renvoyerIdObservationSiEvenementDejaObserveCetteAnnee($id_evenement, $tableau_observations_cette_annee) {
 
foreach($tableau_observations_cette_annee as $observation_cette_annee) {
 
if($id_evenement == $observation_cette_annee['oo_ce_evenement']) {
return $observation_cette_annee['oo_id_observation'];
}
}
 
return false;
}
 
private function renvoyerIdEvenementSiChampDeFormulaireObservation($champ) {
 
$tab_champ = explode('observation_',$champ);
 
if(count($tab_champ) > 1 && is_numeric($tab_champ[1])) {
return $tab_champ[1];
}
 
return false;
}
 
private function formaterDateObservationPourBdd($date) {
 
$format = $this->config['appli']['format_date'];
 
if(!isset($format)) {
$format = 'd/m/Y';
}
 
$recherche = array('d','m','Y');
$remplacement = array('([0-9]{1,2})','([0-9]{1,2})','([0-9]{4})');
 
$pattern_date_simple = str_replace($recherche, $remplacement, $format);
 
$date_tab = explode('/', $date);
$time = mktime(0,0,0,$date_tab[1],$date_tab[0],$date_tab[2]);
 
if($this->estUneDateInvalide($date_tab[1],$date_tab[0],$date_tab[2])) {
$date_a_renvoyer = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0];
} else {
if(!ereg($pattern_date_simple, $date)) {
$time = strtotime($date);
}
$date_a_renvoyer = date('Y-m-d h:i:s', $time);
}
$date_a_renvoyer = date('Y-m-d', $time);
}
 
return $date_a_renvoyer;
}
}
 
private function estUneDateInvalide($jour, $mois, $annee) {
return ($jour == '00' || $mois == '00' || $annee == '0000');
}
 
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
 
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
?>
/trunk/applications/saisie/controleurs/Individu.php
12,98 → 12,98
* @version SVN: $Id: Fiche.php 152 2010-09-06 16:19:12Z jpm $
*/
class Individu extends aControleur {
 
private $id_individu_en_cours = null;
 
public function __construct() {
 
parent::__construct();
$this->initialiser();
}
 
public function initialiser() {
 
if(isset($_GET['id_individu'])) {
$this->id_individu_en_cours = $_GET['id_individu'];
}
$this->setNavigation();
}
 
public function executerActionParDefaut() {
return $this->afficherFormulaireSaisieIndividu();
}
 
public function afficherFormulaireSaisieIndividu($donnees = array()) {
 
$formulaire = $this->getFormulaireSaisieIndividu($donnees);
$this->setSortie(self::RENDU_CORPS, $formulaire);
$this->setSortie(self::RENDU_CORPS, $formulaire);
}
 
public function getFormulaireSaisieIndividu($donnees = array()) {
 
if($donnees == array()) {
$donnees['individu_nom'] = '';
}
 
$donnees['id_station'] = $_GET['id_station'];
 
if(!isset($donnees['id_espece'])) {
$donnees['id_espece'] = $_GET['id_espece'];
}
 
$espece_dao = new EspeceDao();
 
$donnees['informations_espece'] = $espece_dao->getInformationsEspece($donnees['id_espece']);
return $this->getVue('formulaires/individu_saisie',$donnees);
}
 
public function afficherFormulaireModificationIndividu($donnees = array()) {
 
$individu_dao = new IndividuDao();
 
$id_individu = $_GET['id_individu'];
$donnees['infos_individu'] = $individu_dao->getInformationsIndividu($id_individu);
$donnees['infos_individu'] = $individu_dao->getInformationsIndividu($id_individu);
$donnees['id_station'] = $_GET['id_station'];
$donnees['id_espece'] = $_GET['id_espece'];
 
$espece_dao = new EspeceDao();
$donnees['informations_espece'] = $espece_dao->getInformationsEspece($donnees['id_espece']);
 
$this->setSortie(self::RENDU_CORPS,$this->getVue('formulaires/individu_modification',$donnees));
}
 
public function afficherListeIndividu() {
 
$this->setSortie(self::RENDU_CORPS, $this->getListeIndividu());
}
public function getListeIndividu() {
 
public function getListeIndividu() {
 
$id_utilisateur = AppControleur::getUtilisateur()->getIdentifiantNumerique();
 
$id_station = $_GET['id_station'];
$id_espece = $_GET['id_espece'];
 
if(isset($_GET['annee'])) {
$donnees['annee'] = $_GET['annee'];
} else {
$donnees['annee'] = date('Y');
}
 
$espece = new Espece();
$evenements = $espece->getListeEvenementPourEspece($id_espece);
 
$individus = $this->getListeIndividus($id_station, $id_espece);
 
foreach($individus as &$individu) {
 
$observation = new Observation();
 
if(trim($individu['nom']) == '') {
$individu['nom'] = 'Individu sans nom';
}
$individu['observations'] = $observation->getListeObservationsPourIndividu($individu['id_individu']);
 
$individu['observations'] = $observation->getListeObservationsPourIndividu($individu['id_individu']);
$individu['url'] = Liens::getUrlConsultationFicheIndividu($id_station, $id_espece, $individu['id_individu']);
}
 
114,178 → 114,178
 
return $this->getVue('listes/evenement_liste', $donnees);
}
 
public function afficherInformationsIndividu($donnees = array()) {
 
$id_individu = $_GET['id_individu'];
$id_espece = $_GET['id_espece'];
 
$donnees['infos_individu'] = $this->getInformationsIndividu($id_individu);
$donnees['annees_observations'] = $this->getObservationsPourIndividu($id_individu);
 
$espece_dao = new EspeceDao();
$donnees['infos_espece'] = $espece_dao->getInformationsEspece($id_espece);
$donnees['infos_espece'] = $espece_dao->getInformationsEspece($id_espece);
 
$this->setSortie(self::RENDU_CORPS, $this->getVue('fiches/individu_fiche', $donnees));
 
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES DE VALIDATION DE FORMULAIRE
// METHODES DE VALIDATION DE FORMULAIRE
public function validerFormulaireSaisieIndividu() {
 
$valeurs_collectees = $this->collecterValeursFormulaireSaisieIndividu();
 
$verification_ou_erreurs = $this->verifierValeursIndividu($valeurs_collectees);
 
if($verification_ou_erreurs !== true) {
 
$donnees = $valeurs_collectees;
 
$donnees['erreurs'] = $verification_ou_erreurs;
$this->afficherFormulaireSaisieIndividu($donnees);
return;
}
 
$valeurs_verifiees = $valeurs_collectees;
 
$individu_dao = new IndividuDao();
$retour_ajout_individu = $individu_dao->ajouterIndividu($valeurs_verifiees);
 
if($id_nouvel_individu = $this->renvoyerIdSiAjoutIndividuEffectue($retour_ajout_individu)) {
$this->afficherListeIndividu();
$this->setNavigation();
} else {
} else {
$this->afficherFormulaireSaisieIndividu($donnees);
}
}
 
private function renvoyerIdSiAjoutIndividuEffectue($donnees_retour_dao) {
 
if(isset($donnees_retour_dao['id_nouvel_individu'])) {
return $donnees_retour_dao['id_nouvel_individu'];
}
 
return false;
}
 
private function collecterValeursFormulaireSaisieIndividu() {
 
$valeurs_verifiees['id_station'] = $_POST['station'];
$valeurs_verifiees['id_espece'] = $_POST['espece'];
$valeurs_verifiees['individu_nom'] = $_POST['individu_nom'];
 
return $valeurs_verifiees;
 
}
 
private function collecterValeursFormulaireModificationIndividu() {
 
$valeurs_verifiees['id_station'] = $_POST['id_station'];
$valeurs_verifiees['id_espece'] = $_POST['id_espece'];
$valeurs_verifiees['individu_nom'] = $_POST['individu_nom'];
$valeurs_verifiees['id_individu'] = $_POST['id_individu'];
 
return $valeurs_verifiees;
 
}
 
private function verifierValeursIndividu($valeurs_a_verifier) {
 
$erreurs = array();
 
foreach($valeurs_a_verifier as $champ => $valeur) {
if(trim($valeur) == '') {
$erreurs[$champ] .= ' Ce champ ne peut pas être vide';
$erreurs[$champ] .= ' Ce champ ne peut pas être vide';
}
}
 
if(!empty($erreurs)) {
return $erreurs;
}
 
return true;
}
 
public function validerFormulaireModificationIndividu() {
 
$valeurs_collectees = $this->collecterValeursFormulaireModificationIndividu();
 
$verification_ou_erreurs = $this->verifierValeursIndividu($valeurs_collectees);
 
if($verification_ou_erreurs !== true) {
 
$donnees = $valeurs_collectees;
 
$donnees['erreurs'] = $verification_ou_erreurs;
$this->afficherFormulaireModificationIndividu($donnees);
return;
}
 
$valeurs_verifiees = $valeurs_collectees;
 
$id_individu = $valeurs_collectees['id_individu'];
 
$individu_dao = new IndividuDao();
$retour_modification_individu = $individu_dao->modifierIndividu($id_individu, $valeurs_verifiees);
 
$this->afficherInformationsIndividu();
}
 
public function supprimerIndividu() {
 
$id_individu_a_supprimer = $_POST['id_individu_a_supprimer'];
 
$observations_individu = $this->getObservationsPourIndividu($id_individu_a_supprimer);
 
if(count($observations_individu) > 0) {
$donnees = array();
$donnees['erreurs'] = 'Impossible de supprimer un individu pour lequel on a saisi des données';
 
$this->id_individu_en_cours = $id_individu_a_supprimer;
$this->afficherInformationsIndividu($donnees);
$this->afficherInformationsIndividu($donnees);
 
} else {
 
$individu_dao = new IndividuDao();
$individu_dao->supprimerIndividu($id_individu_a_supprimer);
 
$gestion_station = new Station();
$_GET['id_station'] = $_POST['id_station'];
 
$this->setSortie(self::RENDU_CORPS, $gestion_station->getFicheInformationsStation());
}
 
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES POUR FABRIQUER LE MENU
// METHODES POUR FABRIQUER LE MENU
public function setNavigation() {
 
$station = new Station();
$this->setSortie(self::RENDU_NAVIGATION, $station->construireMenuNavigation());
}
 
protected function getListeIndividus($id_station, $id_espece) {
 
$individu_dao = new IndividuDao();
return $individu_dao->getListeIndividusPourStationPourEspece($id_station,$id_espece);
 
}
 
private function getInformationsIndividu($id_individu) {
 
$individu_dao = new IndividuDao();
$infos_individu = $individu_dao->getInformationsIndividu($id_individu);
 
return $infos_individu;
}
 
private function getObservationsPourIndividu($id_individu) {
$observation_dao = new ObservationDao();
$liste_observation_pour_individu = $observation_dao->getListeObservationsPourIndividu($id_individu);
 
return $liste_observation_pour_individu;
}
}
?>
?>
/trunk/applications/saisie/controleurs/Observation.php
12,193 → 12,177
* @version SVN: $Id: Fiche.php 152 2010-09-06 16:19:12Z jpm $
*/
class Observation extends aControleur {
 
private $id_observation_en_cours = null;
 
public function __construct() {
 
parent::__construct();
$this->initialiser();
}
 
public function initialiser() {
 
if(isset($_GET['$id_observation'])) {
$this->id_observation_en_cours = $_GET['id_observation'];
}
$this->setNavigation();
}
 
public function executerActionParDefaut() {
return $this->afficherFormulaireAjoutIndividu();
}
 
 
public function afficherFormulaireAjoutObservation($id_individu) {
$donnees = array();
$formulaire = $this->getVue('formulaires/observation_saisie',$donnees);
$this->setSortie(self::RENDU_CORPS, $formulaire);
$this->setSortie(self::RENDU_CORPS, $formulaire);
}
 
public function afficherFormulaireModificationObservation() {
 
$id_individu_a_modifier_observation = $_GET['id_individu'];
 
$id_espece = $_GET['id_espece'];
$id_station = $_GET['id_station'];
 
$id_utilisateur = AppControleur::getUtilisateur()->getIdentifiantNumerique();
 
$espece = new Espece();
$evenements = $espece->getListeEvenementPourEspece($id_espece);
 
$station = new Station();
 
$individus = $station->getIndividusStationPourEspece($id_station,$id_espece);
foreach($individus as &$individu) {
 
$observation = new Observation();
$individu['observations'] = $observation->getListeObservationsPourIndividu($individu['id_individu']);
$individu['url'] = Liens::getUrlConsultationFicheIndividu($id_station,$id_espece, $individu['id_individu']);
 
}
 
$donnees['evenements'] = $evenements;
$donnees['stades'] = $this->aplatirListeEvenementHierachiseeEnListeParStades($evenements);
$donnees['individus'] = $individus;
$donnees['id_station'] = $_GET['id_station'];
$donnees['id_espece'] = $_GET['id_espece'];
 
if(isset($_GET['annee'])) {
$donnees['annee'] = $_GET['annee'];
} else {
$donnees['annee'] = date('Y');
}
 
$donnees['id_individu_a_modifier_observation'] = $id_individu_a_modifier_observation;
 
$this->setSortie(self::RENDU_CORPS, $this->getVue('formulaires/evenement_modification', $donnees));
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES POUR FABRIQUER LE MENU
// METHODES POUR FABRIQUER LE MENU
public function setNavigation() {
 
$station = new Station();
$this->setSortie(self::RENDU_NAVIGATION, $station->construireMenuNavigation());
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES APPELEES LORS DE LA VALIDATION D'UN FORMULAIRE
public function validerFormulaireAjoutObservation() {
 
$valeurs_formulaires = $_POST;
 
$valeurs_verifiees = array();
 
$observation_dao = new ObservationDao();
$observation_dao->ajouterObservation($valeurs_verifiees);
 
}
 
public function validerFormulaireModificationObservation() {
 
$valeurs_verifiees = $this->collecterValeursFormulaireModificationObservation();
 
$observation_dao = new ObservationDao();
$observation_dao->modifierObservation($valeurs_verifiees['id_individu'], $valeurs_verifiees);
 
$individu = new Individu();
 
$this->setSortie(self::RENDU_CORPS, $individu->getListeIndividu());
 
}
 
public function validerFormulaireModificationObservationAjax() {
 
$valeurs_verifiees = $this->collecterValeursFormulaireModificationObservation();
 
$observation_dao = new ObservationDao();
$observation_dao->modifierObservation($valeurs_verifiees['id_individu'],$valeurs_verifiees);
$retour = array('reponse' => 'OK');
$data = $observation_dao->modifierObservation($valeurs_verifiees['id_individu'],$valeurs_verifiees);
 
$retour = array('reponse' => 'OK', 'data' => $data);
 
header('Content-type: text/json');
echo json_encode($retour);
exit;
}
 
private function collecterValeursFormulaireModificationObservation() {
$valeurs_verifiees = array();
foreach($_POST as $nom_champ => $valeur) {
$id_si_est_champ_observation = $this->renvoyerIdEvenementSiChampDeFormulaireObservation($nom_champ);
if($id_si_est_champ_observation && trim($valeur) != '') {
$valeurs_verifiees[$nom_champ] = $valeur;
}
}
 
$valeurs_verifiees = array();
 
$valeurs_verifiees['id_individu'] = $_POST['id_individu'];
$valeurs_verifiees['annee_en_cours'] = $_POST['annee_en_cours'];
//TODO: verifier valeurs plus complètement
 
$valeurs_verifiees['id_evenement'] = $_POST['id_evenement'];
$valeurs_verifiees['date_evenement'] = $_POST['date_evenement'];
 
if(!empty($_POST['id_observation'])) {
$valeurs_verifiees['id_observation'] = $_POST['id_observation'];
}
 
return $valeurs_verifiees;
}
private function renvoyerIdEvenementSiChampDeFormulaireObservation($champ) {
$tab_champ = explode('observation_',$champ);
if(count($tab_champ) > 1 && is_numeric($tab_champ[1])) {
return $tab_champ[1];
}
return false;
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES DE RECHERCHE DE DONNEES
// METHODES DE RECHERCHE DE DONNEES
public function getListeObservationsPourIndividu($id_individu, $annee = null) {
 
$observation_dao = new ObservationDao();
$observations_pour_individu = $observation_dao->getListeObservationsPourIndividu($id_individu, $annee);
 
return $observations_pour_individu;
}
 
 
private function aplatirListeEvenementHierachiseeEnListeParStades($liste_evenements_hierarchisee) {
 
$liste_evenements_plate_par_stade = array();
 
foreach($liste_evenements_hierarchisee as $evenement_hierarchise) {
foreach($evenement_hierarchise['stades'] as $id_stade => $stade) {
$liste_evenements_plate_par_stade[$id_stade] = $stade;
}
}
 
return $liste_evenements_plate_par_stade;
}
 
// +---------------------------------------------------------------------------------------------------------------+
// METHODES UTILITAIRES STATIQUES (UTILES POUR LES FORMULAIRES)
public static function individuAObservationValidePourStade($individu, $annee, $evenement, $id_stade) {
 
return (isset($individu['observations'][$annee][$evenement][$id_stade]) && trim($individu['observations'][$annee][$evenement][$id_stade]) != '');
}
 
public static function renvoyerObservationStadePourIndividu($individu, $annee, $evenement, $id_stade) {
 
if(self::individuAObservationValidePourStade($individu, $annee, $evenement, $id_stade)) {
return $individu['observations'][$annee][$evenement][$id_stade];
}
 
return '';
}
}
}
?>
?>
/trunk/applications/saisie/bibliotheque/dao/ObservationDao.php
13,10 → 13,10
*
*/
class ObservationDao extends Dao {
 
const SERVICE_OBSERVATION = 'OdsObservation';
const METHODE_OBSERVATION_INDIVIDU= 'ObservationsPourIndividu';
 
/**
* Retourne l'ensemble des observations d'une station.
*
24,55 → 24,49
* @return array un tableau contenant les informations sur les observations de cette station.
*/
public function getListeObservationsPourStation($id_station) {
 
$url = $this->url_jrest.self::SERVICE_OBSERVATION."/*/";
$json = $this->envoyerRequeteConsultation($url);
$donnees = json_decode($json, true);
return $donnees;
}
 
public function getListeObservationsPourIndividu($id_individu, $annee = null) {
 
if (is_numeric($id_individu)) {
$url = $this->url_jrest.self::SERVICE_OBSERVATION.'/'.self::METHODE_OBSERVATION_INDIVIDU.'/'.$id_individu;
$json = $this->envoyerRequeteConsultation($url);
$donnees = json_decode($json, true);
 
return $donnees;
}
}
 
public function ajouterObservation($valeurs_observation_verifiees) {
 
$donnees = $valeurs_individu_verifiees;
$donnees['id_participant'] = AppControleur::getIdUtilisateur();
 
$url = $this->url_jrest.self::SERVICE_OBSERVATION."/";
$json = $this->envoyerRequeteAjout($url, $donnees);
$donnees = json_decode($json, true);
if (true) {
//TODO: verifier ajout
}
 
return true;
}
 
public function modifierObservation($id_individu, $valeurs_observation_verifiees) {
 
$donnees = $valeurs_observation_verifiees;
$donnees['id_participant'] = AppControleur::getIdUtilisateur();
 
if (is_numeric($id_individu)) {
$url = $this->url_jrest.self::SERVICE_OBSERVATION."/$id_individu/";
$json = $this->envoyerRequeteModif($url, $donnees);
 
$donnees = json_decode($json, true);
if (true) {
//TODO: verifier modification
}
}
return true;
 
return $donnees;
}
}
?>
?>
/trunk/applications/saisie/squelettes/fiches/individu_fiche.tpl.html
2,7 → 2,7
<div id="fiche_individu">
<h2 class="titre_fiche"> <?= $infos_individu['nom'] ?></h2>
<hr class="separation_section" />
 
<h3 class="titre_section_fiche"> Espèce </h3>
<div class="informations_espece">
<img title="<?= Liens::getCreditImageEspece($espece['nom_scientifique']) ?>" alt="image de l'espece" class="droite" height="120" src="<?= Liens::getUrlImageEspece($infos_espece['nom_scientifique'],'M') ?>" />
11,9 → 11,9
</div>
 
<p class="intitule_fiche description_espece" > <?= $infos_espece['description'] ?></p>
 
<hr class="separation_section" />
 
<h3 class="titre_section_fiche" > Observations réalisées </h3>
<? $premier_element_date = true; ?>
<?php foreach ($annees_observations as $annee => $observations) : ?>
26,9 → 26,9
<div class="pliage stade_<?= aControleur::formaterChaineVersClasseCss($stade);?>">
<h4><?= $stade ?></h4>
<ul>
<?php foreach($observation as $num_stade => $date) : ?>
<?php foreach($observation as $num_stade => $dates) : ?>
<li>
<?= ' stade '.$num_stade.' : '.$date ?>
<?= ' stade '.$num_stade.' : '.implode(', ', $dates) ?>
</li>
<?php endforeach; ?>
</ul>
41,24 → 41,24
<?php if(empty($annees_observations)) { ?>
<div class="informations"> Aucune observation enregistrée pour cet individu</div>
<?php } ?>
 
<hr class="separation_section" />
 
<form class="bouton_formulaire_modification" method="post" action="<?= Liens::getUrlFormulaireModificationIndividu($infos_individu['id_station'], $infos_individu['id_espece'], $infos_individu['id_individu']); ?>" id="form_afficher_modification">
<input class=" droite gros_bouton_validation" type="submit" value="Modifier" />
<input class=" droite gros_bouton_validation" type="submit" value="Modifier" />
</form>
 
<hr class="separation_invisible" />
 
<?php if(empty($annees_observations)) { ?>
<form class="bouton_formulaire_suppression formulaire_suppression_individu droite" method="post" action="<?= Liens::getUrlSuppressionIndividu($infos_individu['id_station'], $infos_individu['id_espece'], $infos_individu['id_individu']); ?>" id="form_supprimer_individu">
<input type="hidden" id="id_individu_a_supprimer" name="id_individu_a_supprimer" value="<?= $infos_individu['id_individu']; ?>" />
<input class="gauche gros_bouton_validation lien_suppression" type="submit" value="Supprimer" />
<input class="gauche gros_bouton_validation lien_suppression" type="submit" value="Supprimer" />
</form>
<?php } ?>
 
<?php if(isset($donnees['erreurs'])) { ?>
<p class="attention"> <?= $donnees['erreurs']; ?> </p>
<?php } ?>
</div>
<!-- ODS_SAISIE - FIN FICHE INDIVIDU -->
<!-- ODS_SAISIE - FIN FICHE INDIVIDU -->
/trunk/applications/saisie/squelettes/listes/evenement_liste.tpl.html
1,9 → 1,9
<!-- ODS_SAISIE - DEBUT LISTE EVENEMENTS -->
<div>
<h2> Observations pour l'année <?= $annee ?> </h2>
<p class="cadre_information">Pour ajouter ou modifier une observation, cliquez sur la case correspondante et sélectionnez une date dans le calendrier,
pour la supprimer, effacez la date, cliquez en dehors de la case et confirmez.
 
<p class="cadre_information">Pour ajouter ou modifier une observation, cliquez sur la case correspondante et sélectionnez une date dans le calendrier,
(vous pouvez annuler l'édition en appuyant sur la touche échap). Pour la supprimer cliquez sur la croix à droite de la date.
</p>
 
<ul class="liste_annees_observations">
20,7 → 20,7
</ul>
<table id="saisie_liste_evenements">
<tr>
<th></th>
<th></th>
<?php foreach($evenements as $evenement) : ?>
<th class="stade_<?= $evenement['abreviation']; ?>" colspan="<?=count($evenement['stades']) ?>">
<div class="evenement"><?= $evenement['nom'] ?></div>
28,18 → 28,17
<?php endforeach; ?>
<th></th>
</tr>
 
<tr>
<th> stades </th>
<th> stades </th>
<?php foreach($evenements as $evenement) : ?>
<?php foreach($evenement['stades'] as $id_stade => $stade) : ?>
<th title="<?= $evenement['description'][$id_stade]; ?>" class="stade_evenement">
<?= $stade ?>
<th title="<?= $evenement['description'][$id_stade]; ?>" class="stade_evenement">
<?= $stade ?>
</th>
<?php endforeach; ?>
<?php endforeach; ?>
</tr>
 
<?php foreach ($individus as $individu) : ?>
<tr class="liste_observations_individu" id="observations_individu_<?= $individu['id_individu'] ?>">
50,14 → 49,33
</td>
<?php foreach($evenements as $nom_evenement => $evenement) : ?>
<?php foreach($evenement['stades'] as $id_stade => $stade) : ?>
<td class="date_observation_individu element_cliquable" title="Cliquez sur la cellule pour modifier la date de cette observation">
<span id="individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>">
<?php if (isset($individu['observations'][$annee][$nom_evenement][$stade])) { ?>
<?= $individu['observations'][$annee][$nom_evenement][$stade]; ?>
<?php } else { ?>
-
<?php } ?>
</span>
<td class="conteneur_date_observation" title="Cliquez pour modifier la date de cette observation">
<?php if (!empty($individu['observations'][$annee][$nom_evenement][$stade])) { ?>
<?php foreach($individu['observations'][$annee][$nom_evenement][$stade] as $id_observation => $date_observation) : ?>
<div class="date_observation_individu element_cliquable"
data-id-stade-observation="<?=$id_stade?>"
data-id-observation="<?=$id_observation?>"
data-id-individu="<?=$individu['id_individu']?>"
data-date-observation="<?=$date_observation?>"
id="individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>_observation_<?=$id_observation?>">
<span class="date_observation"><?= $date_observation ?></span>
<span class="datepicker_container"></span>
<div class="conteneur_supprimer_observation">
<span title="Cliquez pour supprimer cette observation" class="icone supprimer_observation">&nbsp;</span>
</div>
</div>
<?php endforeach; ?>
<?php } ?>
<div class="ajouter_observation date_observation_individu element_cliquable"
data-id-stade-observation="<?=$id_stade?>"
data-id-individu="<?=$individu['id_individu']?>"
title="Cliquez pour ajouter une nouvelle observation de ce stade"
id="ajouter_observation_individu_<?=$individu['id_individu']?>_evenement_<?=$id_stade?>">
<span class="icone date_observation">&nbsp;</span>
<span class="datepicker_container"></span>
<div class="conteneur_supprimer_observation">
<span title="Cliquez pour supprimer cette observation" class="icone supprimer_observation">&nbsp;</span>
</div>
</td>
<?php endforeach; ?>
<?php endforeach; ?>
72,4 → 90,4
 
<a id="lien_ajout_individu" href="<?= Liens::getUrlFormulaireSaisieIndividu($id_station,$id_espece); ?>"> Nouvel individu </a>
</div>
<!-- ODS_SAISIE - FIN LISTE EVENEMENTS -->
<!-- ODS_SAISIE - FIN LISTE EVENEMENTS -->
/trunk/applications/saisie/squelettes/css/saisie.css
1,8 → 1,8
/* =========================== Balises ============================
/* =========================== Balises ============================
 
 
 
/* =========================== Style général ============================ */
/* =========================== Style général ============================ */
 
#wrapper #container {
max-width:1650px;
9,15 → 9,15
}
 
.gauche {
float:left;
float:left;
}
 
.droite {
float:right;
float:right;
}
 
.information {
 
padding-left:40px;
border:1px solid #FF420F;
max-width:600px;
34,22 → 34,22
}
 
span.erreur {
color: red;
color: red;
}
 
input.erreur {
border: 1px solid red;
border: 1px solid red;
}
 
#center {
width: 720px;
width: 720px;
}
 
 
/* =========================== Titres ============================ */
/* =========================== Titres ============================ */
 
.titre_saisie {
padding-bottom: 10px;
padding-bottom: 10px;
}
 
.etape {
70,7 → 70,7
}
 
.item_menu_station > a {
padding: 5px;
padding: 5px;
}
 
#saisie_menu ul li.item_menu_espece {
78,7 → 78,7
}
 
.item_menu_espece > a {
padding: 5px
padding: 5px
}
 
#saisie_menu ul li.station_ajout {
86,7 → 86,7
}
 
li.station_en_cours {
padding-top: 10px;
padding-top: 10px;
}
 
li.station_en_cours > a {
94,9 → 94,9
font-weight: bold;
border: solid 1px #FFFFFF;
background-color: #BF3600;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
}
 
#retour_au_site {
112,8 → 112,8
font-weight: bold;
border: solid 1px #FFFFFF;
background-color: #9AC343;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
}
 
124,12 → 124,12
.liste_annees_observations li {
display: inline;
list-style: none;
background: none;
background: none;
}
 
#annee_en_cours {
font-size: 1.6em;
color: #9AC343;
color: #9AC343;
}
 
#retour_au_site ul li {
146,29 → 146,29
/* =========================== Formulaires d'inscription et d'identification ============================ */
 
#conteneur_formulaire_identification, #conteneur_formulaire_inscription {
 
width:650px;
border: 1px solid grey;
margin-top: 10px;
padding: 10px;
text-align: left !important;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
}
 
#conteneur_formulaire_identification form {
text-align: left !important;
text-align: left !important;
}
 
#conteneur_formulaire_identification input {
text-align: left !important;
width: 300px;
width: 300px;
}
 
#conteneur_formulaire_inscription input {
text-align: left !important;
width: 300px;
width: 300px;
}
 
.message_identification {
175,7 → 175,7
font-weight: bold;
padding-top: 5px;
color: #435F06;
font-size: 1.5em;
font-size: 1.5em;
}
 
 
182,16 → 182,16
/* =========================== Formulaires de l'application ============================ */
 
#saisie_station {
width: 700px;
width: 700px;
}
 
.element_formulaire label {
font-weight: bold;
width:150px;
width:150px;
}
 
.element_formulaire_en_ligne {
padding-right: 10px;
padding-right: 10px;
}
 
.element_formulaire, #conteneur_liens_lat_lon, #conteneur_form_liens_lat_lon {
212,7 → 212,7
}
 
#localiser_lat_lon {
background: url("../images/localiser.png") no-repeat scroll 2px transparent;
background: url("../images/localiser.png") no-repeat scroll 2px transparent;
}
 
#saisie_liste_evenements {
221,12 → 221,12
}
 
#saisie_modif_evenements tr, #saisie_liste_evenements tr {
height: 40px;
/*height: 40px;*/
}
 
.icone_s {
height: 30px;
width: 30px;
width: 30px;
}
 
.formulaire_en_ligne {
251,19 → 251,19
 
#form_saisie_espece {
margin-right: auto;
margin-left: auto;
margin-left: auto;
}
 
.formulaire_informations_espece_mini {
text-align: center;
height:50px;
height:50px;
width: 500px;
border: solid 1px #999999;
background-color: #CFCFCF;
padding: 10px;
margin-bottom: 10px;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
}
 
280,8 → 280,8
}
 
.formulaire_suppression_station {
margin-top: 10px;
margin-left: 2px;
margin-top: 10px;
margin-left: 2px;
}
 
.formulaire_suppression_individu {
289,7 → 289,7
margin-top: 10px;
}
 
/* =========================== Fiches ============================== */
/* =========================== Fiches ============================== */
 
.element_fiche {
padding-bottom : 5px;
296,11 → 296,11
}
 
.intitule_fiche {
 
}
 
.valeur_fiche {
font-weight: bold;
font-weight: bold;
}
 
.titre_section_fiche {
309,20 → 309,20
}
 
.titre_fiche {
 
}
 
hr.separation_section {
margin-top: 25px;
margin-top: 25px;
}
 
.informations_espece img {
margin-top:-35px;
margin-top:-35px;
padding: 15px;
}
 
.annee_observation {
padding-left: 10px;
padding-left: 10px;
}
 
.observations_individu {
344,8 → 344,8
}
 
.observations_individu li div {
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
-moz-border-radius: 0.9em;
-webkit-border-radius: 0.9em;
border-radius: 0.9em;
}
 
354,12 → 354,63
color: black;
}
 
.ajouter_observation .date_observation {
background: url("../images/ajout.png") no-repeat center center transparent;
width: 20px;
}
 
.conteneur_supprimer_observation {
position: absolute;
right: 0px;
top: 0px;
width: 20px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
 
.supprimer_observation {
background: url("../images/suppression.png") no-repeat center center transparent;
width: 20px;
display: none;
}
 
.date_observation_individu:not(.ajouter_observation):hover .supprimer_observation {
display: block;
}
 
.conteneur_date_observation {
padding: 0;
position: relative;
vertical-align: top;
}
 
.date_observation_individu {
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
flex: 1;
padding-top: 5px;
padding-bottom: 5px;
position: relative;
}
 
.date_observation_individu .ui-datepicker {
position: absolute;
top: 100%;
left: 0%;
z-index: 1;
}
 
.icone:hover {
filter: grayscale(100%);
}
 
.calendrier {
 
}
 
#fiche_individu {
369,14 → 420,14
}
 
 
/* =========================== Tableaux d'évenements ============================ */
/* =========================== Tableaux d'évenements ============================ */
 
#saisie_liste_evenements, #saisie_modif_evenements {
text-align: center;
text-align: center;
}
 
#saisie_liste_evenements .information_individu, #saisie_modif_evenements.information_individu {
text-align: left;
text-align: left;
}
 
tr:nth-child(odd) {
391,7 → 442,7
background-color: #FFFFFF ;
}
 
div.evenement {
div.evenement {
text-align: center;
}
 
400,7 → 451,7
}
 
 
/* =========================== Styles des différents stades ============================ */
/* =========================== Styles des différents stades ============================ */
 
.stade_feuillaison {
background-color: #ACC700;
407,7 → 458,7
}
 
.stade_floraison {
background-color: #B549B9;
background-color: #B549B9;
}
 
.stade_fructification {
434,7 → 485,7
}
 
#form_changement_identite {
width: 330px;
width: 330px;
display: inline;
}
 
493,7 → 544,7
}
 
.erreur_valeur {
background-color: red;
background-color: red;
}
 
.conteneur_type {
503,7 → 554,7
}
 
h4.lien_pliage {
text-decoration: underline;
text-decoration: underline;
display: inline;
}
 
516,7 → 567,7
}
 
.element_cliquable {
cursor: pointer;
cursor: pointer;
}
 
.element_cliquable:hover {
524,7 → 575,7
}
 
.element_clique {
background: #9AC343;
background: #9AC343;
}
 
#saisie_espece ul.liste_onglets {
535,6 → 586,8
height: 32px; /*--Set height of tabs--*/
border-bottom: 1px solid #999;
border-left: 1px solid #999;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
 
#saisie_espece ul.liste_onglets li {
587,7 → 640,10
float: left;
background: #fff;
position: relative;
width:565px;
width: 100%;
display: flex;
justify-content: center;
margin-left: 10px;
}
 
#saisie_espece .contenu_onglet {
597,7 → 653,7
 
 
.autocompletion {
position:relative;
position:relative;
}
 
.conteneur_suggestions, .conteneur_suggestions_utilisateur {
614,14 → 670,14
}
 
.conteneur_suggestions_utilisateur {
left: 188px;
left: 188px;
}
 
.liste_suggestions {
margin: 0px;
padding: 0px;
}
 
.liste_suggestions li {
margin: 0px 0px 3px 0px;
padding: 3px;
629,12 → 685,12
}
 
.liste_suggestions li {
list-style-type: none;
list-style-type: none;
margin-left: 5px;
margin-right: 5px;
}
 
 
.liste_suggestions .element_selectionne {
background-color: #659CD8;
}
642,5 → 698,5
/* ============ Styles crées spécifiquement pour compenser les faiblesses de certains navigateurs ===== */
 
.clearer {
clear:both;
}
clear:both;
}
/trunk/applications/saisie/squelettes/formulaires/evenement_modification.tpl.html
4,7 → 4,7
<form id="form_modif_observation" name="form_modif_observation" method="post" action="<?= Liens::getUrlValidationFormulaireModificationObservation($id_station,$id_espece, $id_individu_a_modifier_observation, $annee) ?>" >
<table id="saisie_modif_evenements">
<tr>
<th></th>
<th></th>
<?php foreach($evenements as $evenement) : ?>
<th class="stade_<?=$evenement['abreviation'] ?>" colspan="<?=count($evenement['stades']) ?>">
<div class="evenement"><?= $evenement['nom'] ?></div>
12,18 → 12,18
<?php endforeach; ?>
<th></th>
</tr>
 
<tr>
<th> stades </th>
<th> stades </th>
<?php foreach($evenements as $evenement) : ?>
<?php foreach($evenement['stades'] as $stade) : ?>
<th class="stade_evenement">
<?= $stade ?>
<th class="stade_evenement">
<?= $stade ?>
</th>
<?php endforeach; ?>
<?php endforeach; ?>
</tr>
 
<?php foreach ($individus as $individu) : ?>
<tr class="modification_observations_individu" id="modification_observations_individu_<?= $individu['id_individu'] ?>">
<td>
40,7 → 40,7
<?php if (isset($individu['observations'][$annee][$nom_evenement][$stade])) { ?>
<?= $individu['observations'][$annee][$nom_evenement][$stade]; ?>
<?php } else { ?>
-
-
<?php } ?>
<?php }?>
</div>
49,7 → 49,7
<?php endforeach; ?>
<td>
<?php if ($individu['id_individu'] == $id_individu_a_modifier_observation) { ?>
<input type="submit" class="valider_formulaire icone_s" value="OK" title="valider" />
<input type="submit" class="valider_formulaire icone_s" value="OK" title="valider" />
<?php } ?>
</td>
</tr>
59,4 → 59,4
<input type="hidden" id="annee_en_cours" name="annee_en_cours" value="<?= $annee ?>" />
</form>
</div>
<!-- ODS_SAISIE - FIN MODIFICATION EVENEMENTS -->
<!-- ODS_SAISIE - FIN MODIFICATION EVENEMENTS -->
/trunk/applications/saisie/squelettes/js/saisie.js
2,15 → 2,15
return urlBaseJrest;
}
 
/**
/**
************************************************************************************************
************************************************************************************************
 
Fonction permettant de transformer les élements de la classe pliage en accordéon
 
************************************************************************************************
************************************************************************************************
**/
**/
function initialiserElementsPliables() {
 
$('.pliage h4').addClass('lien_pliage');
22,7 → 22,7
$('.1er_element_date > ul:first-child').show();
 
$('.lien_pliage').bind('click', function() {
 
$(this).nextAll('ul').slideToggle();
return false;
});
33,27 → 33,27
});
 
 
/**
/**
************************************************************************************************
************************************************************************************************
 
Fonctions de gestion des onglets du formulaire de saisie d'espèce
 
************************************************************************************************
************************************************************************************************
**/
**/
function initialiserOnglets() {
$(".contenu_onglet").hide();
$("ul.liste_onglets li:first").addClass("active").show();
$(".contenu_onglet").hide();
$("ul.liste_onglets li:first").addClass("active").show();
$(".contenu_onglet:first").show();
 
$("ul.liste_onglets li").click(function() {
 
$("ul.liste_onglets li").removeClass("active");
$(this).addClass("active");
$("ul.liste_onglets li").removeClass("active");
$(this).addClass("active");
$(".contenu_onglet").hide();
 
var activeTab = $(this).find("a").attr("href");
var activeTab = $(this).find("a").attr("href");
$(activeTab).fadeIn();
return false;
});
64,20 → 64,20
});
 
function agrandirZoneCLicBoutonsRadios() {
 
$('.formulaire_informations_espece_mini').addClass("element_cliquable");
 
$('#form_saisie_espece').children('input[type="submit"]').hide();
$('.formulaire_informations_espece_mini').children('input[type="radio"]').hide();
$('.titre_type').hide();
 
$('.formulaire_informations_espece_mini').bind('click',function() {
$(this).children('input[type="radio"]').attr('checked','checked');
$('.formulaire_informations_espece_mini').removeClass('element_clique');
$(this).addClass('element_clique');
 
$('#form_saisie_espece').submit();
});
});
}
 
$('#form_saisie_espece').ready(function() {
87,12 → 87,12
 
 
 
/**
/**
************************************************************************************************
************************************************************************************************
 
Fonctions permettant de transformer les cases du tableau d'évenements en mini formulaire
 
************************************************************************************************
************************************************************************************************
**/
100,216 → 100,250
htmlEnCours = '';
elementEnCours = null;
ancienneValeurEnCours = null;
id_formulaire = null;
 
function initialiserLignesCliquables() {
 
$('.conteneur_element_modifier').hide();
$(".date_observation_individu").each(function() {
$(this).bind('click', function() {
if($(this).hasClass('element_clique')) {
return false;
} else {
conteneur_obs = $(this).children('span');
id_formulaire = conteneur_obs.attr('id');
remplacerElementDateParFormulaireAjax(id_formulaire, $(this));
return false;
}
});
});
}
 
function initialiserCalendrierFormulaire() {
dateMin = getDateMinCalendrier();
dateMax = getDateMaxCalendrier();
$(".calendrier").each(function() {
$(this).find("input").datepicker({
disabled: true,
altFormat: 'dd/mm/yyyy',
minDate: dateMin,
maxDate: dateMax
});
});
}
$(".date_observation_individu").live("click", function(e) {
e.preventDefault();
 
$(document).ready(function() {
initialiserCalendrierFormulaire();
if($(e.target).hasClass('conteneur_supprimer_observation') || $(e.target).hasClass('supprimer_observation')) {
return;
}
 
});
$('.element_clique').removeClass('element_clique');
if($(this).hasClass('element_clique')) {
fermerDatePicker();
return false;
} else {
$(this).addClass('element_clique');
afficherSaisieObservation($(this));
return false;
}
});
 
function estUneDateValide(peutEtreUneDate) {
var reg= new RegExp("^[0-3][0-9][/]{1}[0-1][0-2][/]{1}[0-9]{4}$","g");
return reg.test(peutEtreUneDate);
}
$(".date_observation_individu .conteneur_supprimer_observation").live("click", function(e) {
e.preventDefault();
if(window.confirm('Êtes-vous sûr de vouloir supprimer cette observation ?')) {
// les obs ne sont jamais vraiment supprimées
// mais seulement remplacées par des dates au format 00/00/yyyy
envoyerRequeteAjaxSaisieObservation('', $(this).parent('.date_observation_individu'));
}
});
 
function getAnneeEnCoursDeConsultation() {
anneeEnCours = jQuery.trim($("#annee_en_cours").html());
if(typeof(anneeEnCours)=='undefined'){
dateCourante = new Date();
anneeEnCours = dateCourante.getFullYear();
}
return anneeEnCours;
// pour fermer le datepicker sur esc
$(document).keyup(function(e) {
if (e.keyCode === 27) {
$('.element_clique').removeClass('element_clique');
fermerDatePicker(); // esc
}
});
}
 
function getDateMinCalendrier() {
anneeEnCours = getAnneeEnCoursDeConsultation();
dateMin = '01/01/'+anneeEnCours;
return dateMin;
}
function afficherSaisieObservation($obs) {
 
function getDateMaxCalendrier() {
anneeEnCours = getAnneeEnCoursDeConsultation();
dateMax = '31/12/'+anneeEnCours;
dateCourante = new Date();
if(anneeEnCours == dateCourante.getFullYear()) {
dateMax = dateCourante.getDate()+'/'+(dateCourante.getMonth()+ 1)+'/'+anneeEnCours;
fermerDatePicker();
 
var dateMin = getDateMinCalendrier();
var dateMax = getDateMaxCalendrier();
 
var dateCouranteStr = $obs.data('date-observation');
var dateCourante = new Date();
if(!!dateCouranteStr && dateCouranteStr != '' && dateCouranteStr != '+') {
var jour = parseInt(dateCouranteStr.substring(0,2));
var mois = parseInt(dateCouranteStr.substring(3,5));
var annee = parseInt(dateCouranteStr.substring(6,10));
dateCourante = new Date(annee, mois-1, jour);
}
return dateMax;
}
 
/** Fonctions de manipulation des éléments du tableau pour les transformer en élements cliquables et calendriers **/
function initialiserMiniCalendrierFormulaire(id_element) {
dateMin = getDateMinCalendrier();
dateMax = getDateMaxCalendrier();
$('#'+id_element)
.datepicker({
$obs.find('.datepicker_container').datepicker({
disabled: true,
constrainInput: true,
altFormat: 'dd/mm/yyyy',
minDate: dateMin,
maxDate: dateMax,
changeMonth: true,
defaultDate: dateCourante,
onSelect: function(dateText, inst) {
$('#'+id_element).val(dateText);
donnees_obs = collecterDonneesMiniFormulaire(id_formulaire);
envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire);
validerSaisieObservation(dateText, $obs)
},
onClose: function(dateText, inst) {
gererFermetureMiniCalendrier(dateText,id_formulaire);
}
beforeShowDay: function(date) {
var dates_a_exclure = getDatesSaisiesPourStadeEtIndividu($obs.data('id-individu'), $obs.data('id-stade-observation'));
var string = jQuery.datepicker.formatDate('dd/mm/yy', date);
return [dates_a_exclure.indexOf(string) == -1]
}
});
 
$('#'+id_element).datepicker( "show" );
$obs.datepicker("show");
$('.ui-datepicker').attr("title", "Appuyez sur échap pour annuler l'édition");
}
 
function gererFermetureMiniCalendrier(dateText, id_formulaire) {
ancienne_valeur_date = jQuery.trim(ancienneValeurEnCours);
nouvelle_valeur_date = jQuery.trim(dateText);
if(nouvelle_valeur_date == '' && ancienne_valeur_date != '-' && ancienne_valeur_date != nouvelle_valeur_date) {
if(window.confirm("Voulez vous supprimer cette observation ?")) {
$('#'+id_formulaire).val(nouvelle_valeur_date);
donnees_obs = collecterDonneesMiniFormulaire(id_formulaire);
envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire);
} else {
$('#'+id_formulaire).val(ancienne_valeur_date);
remplacerMiniFormulaireParElementDate(id_formulaire);
}
function validerSaisieObservation(dateStr, $obs) {
 
if(estUneDateValide(dateStr)) {
envoyerRequeteAjaxSaisieObservation(dateStr, $obs);
}
}
 
function remplacerElementDateParFormulaireAjax(id_element, conteneur_selectionne) {
if(elementEnCours != null) {
elementEnCours.removeClass('element_clique');
elementEnCours.html(htmlEnCours);
ancienneValeurEnCours = null;
function formaterDonneesObservationPourEnvoi(dateStr, $obs) {
 
if(dateStr == null ) {
return false ;
}
ancienneValeurEnCours = conteneur_selectionne.children('span').html()
elementEnCours = conteneur_selectionne;
htmlEnCours = conteneur_selectionne.html();
conteneur_obs = $('#'+id_element);
valeur_date = conteneur_obs.html();
valeur_date = valeur_date.replace('-','');
conteneur_selectionne.addClass('element_clique');
conteneur_selectionne.html('<span class="calendrier"><input type="text" value="'+jQuery.trim(valeur_date)+'" class="calendrier" id="'+id_formulaire+'" size="7" maxlenght="10" /></div>');
initialiserMiniCalendrierFormulaire(id_formulaire);
}
 
function remplacerMiniFormulaireParElementDate(id_element) {
valeur_date_pour_stade = $('#'+id_element).val();
if(jQuery.trim(valeur_date_pour_stade) == '') {
valeur_date_pour_stade = '-';
var anneeEnCours = getAnneeEnCoursDeConsultation();
if(jQuery.trim(dateStr) == '') {
dateStr = '00/00/'+anneeEnCours;
}
elementEnCours.html('<span id="'+id_element+'">'+valeur_date_pour_stade+' </span>');
elementEnCours.removeClass('element_clique');
elementEnCours = null;
ancienneValeurEnCours = null;
 
donnees_obs = {
"id_individu": $obs.data('id-individu'),
"id_evenement": $obs.data('id-stade-observation'),
"date_evenement": dateStr,
"annee_en_cours": anneeEnCours
};
 
if(!!$obs.data('id-observation')) {
donnees_obs.id_observation = $obs.data('id-observation');
}
 
return donnees_obs;
}
 
 
/** Fonctions d'envoi et de récupération des élements du formulaire ajax **/
function envoyerRequeteAjaxValidationMiniFormulaire(donnees_obs, id_formulaire) {
function envoyerRequeteAjaxSaisieObservation(dateStr, $obs) {
 
var est_obs_existante = !!$obs.data('id-observation');
var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);
 
url_page_courante = document.URL;
url_page_courante = url_page_courante.replace('module=Individu','module=Observation');
url_page_courante = url_page_courante.replace('action=afficherListeIndividu','action=validerFormulaireModificationObservationAjax');
url_ajax = url_page_courante.replace('action=validerFormulaireSaisieIndividu','action=validerFormulaireModificationObservationAjax');
 
$conteneurAjout = null;
if(!est_obs_existante) {
var id_conteneur_ajout = 'ajouter_observation_individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement'];
var $conteneurAjout = $('#'+id_conteneur_ajout).clone();
}
 
var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);
$.post(url_ajax, donnees_obs, function(obj_retour) {
 
if(obj_retour.data.erreurs) {
var message = 'Une ou plusieurs erreurs se sont produites : '+"\n";
for (var key in obj_retour.data.erreurs) {
if (obj_retour.data.erreurs.hasOwnProperty(key))
message += '- '+obj_retour.data.erreurs[key]+"\n";
}
window.alert(message);
return;
}
 
if(obj_retour.reponse === 'OK') {
remplacerMiniFormulaireParElementDate(id_formulaire);
 
// les obs ne sont jamais vraiment supprimées
// mais seulement remplacées par des dates au format 00/00/yyyy
if(estUneDateSuppressionObs(dateStr)) {
$obs.remove();
delete $obs;
return;
}
 
$obs.find('.date_observation').text(dateStr);
$obs.data('date-observation', dateStr);
 
if(!est_obs_existante) {
$obs.removeClass('ajouter_observation');
$obs.attr('title', 'Cliquez pour modifier la date de cette observation')
$obs.data('id-observation', obj_retour.data.id_observation);
 
var id_conteneur_observation = 'individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement']+'_observation_'+obj_retour.data.id_observation;
$obs.attr('id', id_conteneur_observation);
 
$obs.after($conteneurAjout);
}
 
$('.element_clique').removeClass('element_clique');
fermerDatePicker();
}
});
}
 
function collecterDonneesMiniFormulaire(id_formulaire) {
valeur_date_pour_stade = $('#'+id_formulaire).val();
if(valeur_date_pour_stade == null ) {
return false ;
function estUneDateSuppressionObs(dateStr) {
var date_vide_pattern = /^00\/00\/\d{4}$/;
return dateStr == '' || date_vide_pattern.test(dateStr);
}
 
function fermerDatePicker() {
if($(".hasDatepicker").length == 0) {
return;
}
if(jQuery.trim(valeur_date_pour_stade) == '') {
valeur_date_pour_stade = '00/00/'+anneeEnCours;
 
$(".hasDatepicker").each(function() {
$(this).datepicker("destroy");
$(this).removeClass(".hasDatepicker").removeAttr('id');
});
}
 
function obtenirAttributsData(el) {
return [].filter.call(el.attributes, function(at) { return /^data-/.test(at.name); });
}
 
// vérifie qu'une date est au format d/m/y
// merci stacky https://stackoverflow.com/questions/5812220/how-to-validate-a-date
function estUneDateValide(s) {
var bits = s.split('/');
var d = new Date(bits[2], bits[1] - 1, bits[0]);
return d && (d.getMonth() + 1) == bits[1];
}
 
function getDatesSaisiesPourStadeEtIndividu(id_individu, id_stade) {
var selecteur_data = '[data-id-individu="'+id_individu+'"]'+
'[data-id-stade-observation="'+id_stade+'"]';
 
return $('.date_observation_individu'+selecteur_data).map(function() {
return $(this).data("date-observation");
}).get();
}
 
function getAnneeEnCoursDeConsultation() {
 
anneeEnCours = jQuery.trim($("#annee_en_cours").html());
 
if(typeof(anneeEnCours)=='undefined'){
dateCourante = new Date();
anneeEnCours = dateCourante.getFullYear();
}
id_individu_stade_obs = id_formulaire.split('_');
stade_obs = 'observation_'+id_individu_stade_obs[3];
date_annee_en_cours = jQuery.trim($("#annee_en_cours").html());
donnees_obs = { "id_individu": id_individu_stade_obs[1],
"annee_en_cours": date_annee_en_cours
};
identifiant_observation = 'observation_'+id_individu_stade_obs[3];
donnees_obs[identifiant_observation] = valeur_date_pour_stade;
return donnees_obs;
 
return anneeEnCours;
}
 
function getDateMinCalendrier() {
anneeEnCours = getAnneeEnCoursDeConsultation();
dateMin = '01/01/'+anneeEnCours;
 
return dateMin;
}
 
function getDateMaxCalendrier() {
 
anneeEnCours = getAnneeEnCoursDeConsultation();
 
dateMax = '31/12/'+anneeEnCours;
 
dateCourante = new Date();
 
if(anneeEnCours == dateCourante.getFullYear()) {
dateMax = dateCourante.getDate()+'/'+(dateCourante.getMonth()+ 1)+'/'+anneeEnCours;
}
 
return dateMax;
}
 
$('#saisie_liste_evenements').ready(function() {
initialiserLignesCliquables();
});
317,15 → 351,15
 
 
 
/**
/**
************************************************************************************************
************************************************************************************************
 
Fonctions concernant la carte permettant de pointer d'afficher l'emplacement des stations
 
************************************************************************************************
************************************************************************************************
**/
**/
var map;
var marker;
var liste_localite_en_cours;
346,7 → 380,7
}
 
function ajouterAutoCompletionCommune() {
 
$('input#station_commune').after('<div class="conteneur_suggestions"></div>');
$('input#station_commune').parent().addClass('autocompletion');
$('input#station_commune').attr('autocomplete','off');
355,7 → 389,7
}
 
function ajouterListenerFormulaireSaisieLatLon() {
 
$('input#localiser_lat_lon').click(function() {
verifierEtLocaliserCoordonnees();
});
366,32 → 400,32
}
 
function verifierEtLocaliserCoordonnees() {
 
lat ;
lon;
 
if(carteEstEnSaisie()) {
lat = $('#station_lat').val();
lon = $('#station_lon').val();
 
obtenirInformationsPourCoordonnees(lat, lon);
} else {
var lat = jQuery.trim($('#station_lat').html());
var lon = jQuery.trim($('#station_lon').html());
}
 
if(jQuery.trim(lat) == '' || jQuery.trim(lon) == '') {
return;
}
 
if(!isNaN(lat) && lat.length > 0 && !isNaN(lon) && lon.length > 0) {
 
} else {
window.alert("coordonnées invalides");
}
 
var positionMarker = new google.maps.LatLng(lat, lon);
 
marker.setPosition(positionMarker);
map.setCenter(positionMarker);
map.setZoom(12);
398,123 → 432,123
}
 
function obtenirInformationsPourCoordonnees(lat, lon) {
 
lat = jQuery.trim(lat);
lon = jQuery.trim(lon);
lon = jQuery.trim(lon);
 
if(isNaN(lat) || lat.length <= 0 || isNaN(lon) || lon.length <= 0) {
return;
}
 
cacherElementsRafraichissables();
 
$.get(urlBaseJrest+'OdsCommune/informationsPourCoordonnees/?lat='+lat+'&lon='+lon, function(data) {
$.get(urlBaseJrest+'OdsCommune/informationsPourCoordonnees/?lat='+lat+'&lon='+lon, function(data) {
 
infos_localites = jQuery.parseJSON(data);
$('#station_alt').val(infos_localites.alt);
 
if(infos_localites.commune != null && infos_localites.commune != '') {
$('#station_commune').val(infos_localites.commune);
$('#station_code_insee').val(infos_localites.code_insee);
}
 
montrerElementsRafraichissables();
 
});
 
}
 
function obtenirInformationsPourCommune(nom_commune) {
 
if(jQuery.trim(nom_commune) == '') {
$('.conteneur_suggestions').hide();
return;
}
$.get(urlBaseJrest+'OdsCommune/informationsPourCommune/?commune='+nom_commune, function(data) {
 
$.get(urlBaseJrest+'OdsCommune/informationsPourCommune/?commune='+nom_commune, function(data) {
 
infos_localites = jQuery.parseJSON(data);
afficherListeAutoCompletion(infos_localites);
afficherListeAutoCompletion(infos_localites);
});
}
 
function afficherListeAutoCompletion(tableau_localites) {
 
liste_localite_en_cours = tableau_localites;
 
html_liste_localite = '<ul class="liste_suggestions">';
 
for(i = 0; i< tableau_localites.length; i++) {
html_liste_localite += '<li id="commune_'+i+'" class="element_auto_completion_commune">'+tableau_localites[i]['commune']+' ('+tableau_localites[i]['dpt']+')</li>';
}
 
html_liste_localite += '</ul>';
 
$('.conteneur_suggestions').html(html_liste_localite);
 
$('.element_auto_completion_commune').hover(function() {
indice = $(this).attr('id').split('_')[1];
mettreEnSurbrillanceCommune(indice);
});
 
$('.element_auto_completion_commune').click(function() {
indice = $(this).attr('id').split('_')[1];
selectionnerCommune(indice);
});
 
if(tableau_localites.length > 0) {
$('.conteneur_suggestions').show();
 
mettreEnSurbrillanceCommune(0);
}
}
 
function mettreEnSurbrillanceCommune(indice) {
if(indice_commune_en_cours != null) {
 
if(indice_commune_en_cours != null) {
$('#commune_'+indice_commune_en_cours).removeClass('element_selectionne');
}
$('#commune_'+indice).addClass('element_selectionne');
indice_commune_en_cours = indice;
 
reprogrammerTimerPourCacherListeAutoCompletion();
}
 
function rendreListeAutoCompletionInteractive(selecteur) {
 
$(selecteur).keyup(function(event) {
if(event.which == 8 || (event.which >= 48 && event.which <= 90)) {
if(event.which == 8 || (event.which >= 48 && event.which <= 90)) {
 
reprogrammerTimerPourCacherListeAutoCompletion();
reprogrammerTimerPourLancerRequeteCommune();
}
});
 
$(selecteur).keydown(function(event) {
 
reprogrammerTimerPourCacherListeAutoCompletion();
 
// entree
if(event.which==13){
selectionnerCommune(indice_commune_en_cours);
event.preventDefault();
}
 
// haut
if(event.which == 38){
if(indice_commune_en_cours > 0) {
if(indice_commune_en_cours > 0) {
mettreEnSurbrillanceCommune(indice_commune_en_cours - 1);
}
}
 
// bas
if(event.which == 40){
if(indice_commune_en_cours < liste_localite_en_cours.length - 1) {
if(indice_commune_en_cours < liste_localite_en_cours.length - 1) {
mettreEnSurbrillanceCommune(indice_commune_en_cours + 1);
}
}
});
 
$('.conteneur_suggestions').blur(function() {
$('.conteneur_suggestions').hide();
});
521,11 → 555,11
}
 
function reprogrammerTimerPourCacherListeAutoCompletion() {
 
if(timerAffichageAutocompletion != null) {
window.clearTimeout(timerAffichageAutocompletion);
}
 
timerAffichageAutocompletion = window.setTimeout(function() {
$('.conteneur_suggestions').hide();
}, 2000);
532,11 → 566,11
}
 
function reprogrammerTimerPourLancerRequeteCommune() {
 
if(timerRequeteAutocompletion != null) {
window.clearTimeout(timerRequeteAutocompletion);
}
 
timerRequeteAutocompletion = window.setTimeout(function() {
obtenirInformationsPourCommune($('input#station_commune').val());
}, 350);
543,29 → 577,29
}
 
function selectionnerCommune(indice) {
 
infos_commune = liste_localite_en_cours[indice];
 
$('input#station_commune').val(infos_commune['commune']);
$('input#station_lat').val(infos_commune['lat']);
$('input#station_lon').val(infos_commune['lon']);
$('input#station_code_insee').val(infos_commune['code_insee']);
 
verifierEtLocaliserCoordonnees();
 
$('.conteneur_suggestions').hide();
}
 
function mettreAJourValeursFormulaire(latlon) {
 
latlon = latlon.toString().split(',');
latlon = latlon.toString().split(',');
 
lat = latlon[0].replace('(', '');
lon = latlon[1].replace(')', '');
 
$('#station_lat').val(latlon[0].replace('(', ''));
$('#station_lon').val(latlon[1].replace(')', ''));
 
obtenirInformationsPourCoordonnees(lat, lon);
}
 
584,17 → 618,17
 
map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
 
marker = new google.maps.Marker({
position: latlng,
title:""
});
 
if (carteEstEnSaisie()) {
 
marker.setDraggable(true);
google.maps.event.addListener(marker, 'dragend', function(event) {
 
google.maps.event.addListener(marker, 'dragend', function(event) {
mettreAJourValeursFormulaire(marker.getPosition());
});
$('#conteneur_form_liens_lat_lon').ready(function() {
608,11 → 642,11
verifierEtLocaliserCoordonnees();
});
}
 
marker.setClickable(true);
 
// To add the marker to the map, call setMap();
marker.setMap(map);
marker.setMap(map);
}
 
$('#map_canvas').ready(function() {
619,7 → 653,7
initialiserCarte();
});
 
/**
/**
************************************************************************************************
************************************************************************************************
 
627,15 → 661,15
 
************************************************************************************************
************************************************************************************************
**/
**/
 
function initialiserLiensNouvelleFenetre() {
 
$('a.lien_nouvelle_fenetre').each(function() {
var titre = $(this).attr("title");
$(this).attr("title", titre+" (s'ouvre dans une nouvelle fenêtre)");
});
 
$('a.lien_nouvelle_fenetre').click(function(event) {
event.preventDefault();
window.open($(this).attr('href'));
655,7 → 689,7
 
 
 
/**
/**
************************************************************************************************
************************************************************************************************
 
663,7 → 697,7
 
************************************************************************************************
************************************************************************************************
**/
**/
 
function dump(arr,level) {
var dumped_text = "";
676,7 → 710,7
if(typeof(arr) == 'object') { //Array/Hashes/Objects
for(var item in arr) {
var value = arr[item];
 
if(typeof(value) == 'object') { //If it is an array,
dumped_text += level_padding + "'" + item + "' ...\n";
dumped_text += dump(value,level+1);
688,4 → 722,4
dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
}
}