331 lines
14 KiB
PHP
Executable File
331 lines
14 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* classe dérivée de Agenda
|
|
* on va spécifier ici tout ce qui est propre à cette application :
|
|
* manipulation base de données, cache.
|
|
*
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
require_once("agenda.php");
|
|
require_once("FclFlux_utilisateur.php");
|
|
require_once("FclFlux_abonnement.php");
|
|
class FclFlux_absences extends Agenda
|
|
{
|
|
public $id_periode;//identifiant unique d'une période d'absence
|
|
/**
|
|
* Surcharge de la méthode testant la validité d'une date de fin
|
|
* je vérifie en + que date de fin > date actuelle
|
|
* et qu'il y a au moins 24H entre les dates de fin et de début.
|
|
*
|
|
* @param date de fin au format JJ/MM/AAAA
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_time_fin($date_fin)
|
|
{
|
|
if(!isset($this->time_debut))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_AGENDA_DATE_FIN_DEBUT_ABSENT);
|
|
return false;
|
|
}
|
|
if(preg_match(DATE_FORMAT_EREG,$date_fin)==0)
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_AGENDA_DATE_FIN_FORMAT);
|
|
return false;
|
|
}
|
|
$tab_fin=explode("/",$date_fin);
|
|
$time_fin=mktime(0,0,0,$tab_fin[1],$tab_fin[0],$tab_fin[2]);
|
|
if($time_fin===false) return false;
|
|
$time_actuel=time();
|
|
if($time_fin<=$time_actuel)
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_AGENDA_DATE_FIN_PASSE);
|
|
return false;
|
|
}
|
|
if($time_fin<$this->time_debut)
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_AGENDA_DATE_FIN_AVANT_DEBUT);
|
|
return false;
|
|
}
|
|
if((($time_fin)-($this->time_debut))<(3600*24))
|
|
$time_fin=$this->time_debut+(3600*24);
|
|
$this->time_fin=$time_fin;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode cherchant une période d'absence dans la bd via son id_periode, seul identifiant unique.
|
|
*
|
|
* @param l'id de la période recherchée, son propriétaire + les champs souhaités en sortie.
|
|
* @return les données de la table dans un tableau si trouvé, false si pas trouvé ou en cas d'erreur.
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
static function recherche($valeur,$proprietaire,$champ_sortie="*")
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(!empty($proprietaire))
|
|
{
|
|
if(!($proprietaire instanceof FclFlux_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
if(!isset($proprietaire->id_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$prepare=$Bd->prepare("SELECT $champ_sortie FROM utilisateurs_absences WHERE id_periode=:valeur AND utilisateur_id=:id");
|
|
$recherche=$prepare->execute(array(":valeur"=>$valeur,":id"=>$proprietaire->id_utilisateur));
|
|
}
|
|
else
|
|
{
|
|
$prepare=$Bd->prepare("SELECT $champ_sortie FROM utilisateurs_absences WHERE id_periode=:valeur");
|
|
$recherche=$prepare->execute(array(":valeur"=>$valeur));
|
|
}
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetch(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
if(empty($resultat))
|
|
return false;
|
|
else
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode enregistrant une nouvelle période d'absence où l'utilisateur ne souhaite plus recevoir d'email
|
|
*
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function ajout()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((empty($this->time_debut))||(empty($this->time_fin))||(empty($this->designation)))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_UTILISA_CHAMPS_ABSENTS);
|
|
return false;
|
|
}
|
|
if((FclFlux_utilisateur::recherche($this->proprietaire->id_utilisateur,"id_utilisateur","id_utilisateur"))===false)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT." >> ".intval($this->proprietaire->id_utilisateur)));
|
|
return false;
|
|
}
|
|
$prepare=$Bd->prepare("INSERT INTO utilisateurs_absences (utilisateur_id,time_debut,time_fin,designation) VALUES (:id,:time_debut,:time_fin,:designation)");
|
|
$ajout=$prepare->execute(array(':id'=>$this->proprietaire->id_utilisateur,':time_debut'=>$this->time_debut,':time_fin'=>$this->time_fin,':designation'=>$this->designation));
|
|
if((test_requete(__FILE__,__LINE__,$ajout,$prepare)===false)) return false;
|
|
$this->id_periode=$Bd->lastInsertId();
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode modifiant une période d'absence
|
|
*
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function actualise()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((!isset($this->id_periode))||(!isset($this->proprietaire->id_utilisateur)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if((empty($this->time_debut))||(empty($this->time_fin))||(empty($this->designation)))
|
|
{
|
|
$this->erreurs=array_merge($this->erreurs,(array) ERREUR_UTILISA_CHAMPS_ABSENTS);
|
|
return false;
|
|
}
|
|
$prepare=$Bd->prepare("UPDATE utilisateurs_absences SET time_debut=:time_debut,time_fin=:time_fin,designation=:designation WHERE id_periode=:id_periode AND utilisateur_id=:id_utilisateur;");
|
|
$maj=$prepare->execute(array(':time_debut'=>$this->time_debut,':time_fin'=>$this->time_fin,':designation'=>$this->designation,':id_periode'=>$this->id_periode,':id_utilisateur'=>$this->proprietaire->id_utilisateur));
|
|
if((test_requete(__FILE__,__LINE__,$maj,$prepare)===false)) return false;
|
|
$prepare=null;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode supprimant une période d'absence
|
|
*
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function supprime()
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((!isset($this->id_periode))||(!isset($this->proprietaire->id_utilisateur)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
//je commence par réactiver si nécessaire les abonnements concernés par cette période d'absence
|
|
$prepare_reactive=$Bd->prepare("UPDATE abonnements SET actif_ok=1 WHERE ((actif_ok=0) AND (id_abonnement IN (SELECT abonnement_id FROM abonnements_pauses WHERE periode_id=:id_periode)));");//!!il faudrait vérifier qu'il n'y pas d'autres périodes d'absence en cours pour ces mêmes abonnements....
|
|
$reactive=$prepare_reactive->execute(array(':id_periode'=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$reactive,$prepare_reactive)===false)) return false;
|
|
$prepare=$Bd->prepare("DELETE FROM utilisateurs_absences WHERE (id_periode=:id_periode AND utilisateur_id=:id_utilisateur);");
|
|
$suppr=$prepare->execute(array(':id_periode'=>$this->id_periode,':id_utilisateur'=>$this->proprietaire->id_utilisateur));
|
|
if((test_requete(__FILE__,__LINE__,$suppr,$prepare)===false)) return false;
|
|
$nb_enreg=$prepare->rowCount();
|
|
$prepare=null;
|
|
if($nb_enreg==0)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_SUPPR." >> ".intval($this->id_periode)));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode actualisant la liste des abonnements concernés par une période d'absence
|
|
*
|
|
* @param tableau contenant ou +sieurs objets FclFlux_abonnement
|
|
* @return booléen suivant succès
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function set_liste_abonnements($abonnements)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if((empty($this->id_periode))||(empty($abonnements))||(!isset($this->proprietaire->id_utilisateur)))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT.">>".$this->id_periode.",".$this->proprietaire->id_utilisateur));
|
|
return false;
|
|
}
|
|
if((self::recherche($this->id_periode,$this->proprietaire,"id_periode"))===false)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($this->id_periode).">>".intval($this->proprietaire->id_utilisateur)));
|
|
return false;
|
|
}
|
|
if(!is_array($abonnements))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
foreach($abonnements as $abo_infos)
|
|
{
|
|
if(!($abo_infos instanceof FclFlux_abonnement))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
if(empty($abo_infos->id_abonnement))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_FORMAT));
|
|
return false;
|
|
}
|
|
if((FclFlux_abonnement::recherche($abo_infos->id_abonnement,$this->proprietaire,"id_abonnement"))===false)
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_SQL_ENREG_ABSENT.">>".intval($abo_infos->id_abonnement)));
|
|
return false;
|
|
}
|
|
}
|
|
$prepare_doublon=$Bd->prepare("SELECT * FROM abonnements_pauses WHERE periode_id=:id_periode and abonnement_id=:id_abonnement LIMIT 1;");
|
|
$prepare_ajout=$Bd->prepare("INSERT INTO abonnements_pauses (periode_id,abonnement_id) VALUES (:id_periode,:id_abonnement);");
|
|
$selection=array();//me permettra de supprimer les anciennes sélections d'abonnement
|
|
foreach($abonnements as $abo_infos)
|
|
{
|
|
$test_doublon=$prepare_doublon->execute(array(':id_abonnement'=>$abo_infos->id_abonnement,':id_periode'=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$test_doublon,$prepare_doublon)===false)) return false;
|
|
$doublon=$prepare_doublon->fetch();
|
|
if(empty($doublon))
|
|
{
|
|
$ajout=$prepare_ajout->execute(array(':id_abonnement'=>$abo_infos->id_abonnement,':id_periode'=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$ajout,$prepare_ajout)===false)) return false;
|
|
}
|
|
$selection[]=$abo_infos->id_abonnement;
|
|
}
|
|
$prepare_doublon=null;
|
|
$prepare_ajout=null;
|
|
//je peux supprimer le lien avec les abonnements qui ne sont plus concernés par cette période d'absence
|
|
//mais avant il me faut les réactivés si nécessaire
|
|
if(!empty($selection))
|
|
{
|
|
$sql_selection=implode(",",$selection);
|
|
$prepare_reactive=$Bd->prepare("UPDATE abonnements SET actif_ok=1 WHERE ((actif_ok=0) AND (id_abonnement IN (SELECT abonnement_id FROM abonnements_pauses WHERE (abonnement_id NOT IN($sql_selection) AND periode_id=:id))));");
|
|
$prepare_suppr=$Bd->prepare("DELETE FROM abonnements_pauses WHERE (abonnement_id NOT IN($sql_selection) and periode_id=:id);");
|
|
}
|
|
else
|
|
{
|
|
$prepare_reactive=$Bd->prepare("UPDATE abonnements SET actif_ok=1 WHERE ((actif_ok=0) AND (id_abonnement IN (SELECT abonnement_id FROM abonnements_pauses WHERE periode_id=:id)));");
|
|
$prepare_suppr=$Bd->prepare("DELETE FROM abonnements_pauses WHERE periode_id=:id;");//plus aucun abonnement n'est concerné
|
|
}
|
|
$reactive=$prepare_reactive->execute(array(':id'=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$reactive,$prepare_reactive)===false)) return false;
|
|
$suppr=$prepare_suppr->execute(array(':id'=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$suppr,$prepare_suppr)===false)) return false;
|
|
$prepare_suppr=null;
|
|
return true;
|
|
}
|
|
/**
|
|
* Méthode renvoyant la liste des abonnements concernés par une période d'absence
|
|
*
|
|
* @param get_infos_abo : booléen pour savoir si je souhaite remonter les infos des abonnements ou seulement leur id
|
|
* @return les données de la table dans un tableau (qui peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
public function get_liste_abonnements($get_infos_abo=false)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(!isset($this->id_periode))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
if(!$get_infos_abo)
|
|
$prepare=$Bd->prepare("SELECT abonnement_id FROM abonnements_pauses WHERE periode_id=:id");
|
|
else
|
|
$prepare=$Bd->prepare("SELECT A.id_abonnement,A.designation FROM abonnements AS A,abonnements_pauses AS P WHERE ((A.id_abonnement=P.abonnement_id) AND (P.periode_id=:id)) ORDER BY A.designation");
|
|
$recherche=$prepare->execute(array(":id"=>$this->id_periode));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
if(!$get_infos_abo)
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_COLUMN,0);
|
|
else
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode renvoyant la liste des périodes d'absence de l'utilisateur
|
|
*
|
|
* @return les données de la table dans un tableau (qui peut être vide), false en cas d'erreur
|
|
* @author Fabrice PENHOËT
|
|
**/
|
|
static function get_liste_utilisateur($user)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(!isset($user->id_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$prepare=$Bd->prepare("SELECT * FROM utilisateurs_absences WHERE utilisateur_id=:id order by time_debut");
|
|
$recherche=$prepare->execute(array(":id"=>$user->id_utilisateur));
|
|
if((test_requete(__FILE__,__LINE__,$recherche,$prepare)===false)) return false;
|
|
$resultat=$prepare->fetchAll(PDO::FETCH_ASSOC);
|
|
$prepare=null;
|
|
return $resultat;
|
|
}
|
|
/**
|
|
* Méthode supprimant toutes les périodes de vacance d'un utilisateur
|
|
*
|
|
* @return le nombre d'enregistrements supprimés (0 possible). False en cas d'erreur.
|
|
* @author Fabrice PENHOËT
|
|
|
|
static function supprime_dates_utilisateur($user)
|
|
{
|
|
global $Bd;
|
|
if((isset_connexion(__FILE__,__LINE__)===false)) return false;
|
|
if(!isset($user->id_utilisateur))
|
|
{
|
|
$ajout_journal=new journal_erreurs(array(__FILE__,__LINE__,ERREUR_PARAM_MANQUANT));
|
|
return false;
|
|
}
|
|
$prepare=$Bd->prepare("DELETE FROM utilisateurs_absences WHERE utilisateur_id=:id_utilisateur;");
|
|
$suppr=$prepare->execute(array(':id_utilisateur'=>$user->id_utilisateur));
|
|
if((test_requete(__FILE__,__LINE__,$suppr,$prepare)===false)) return false;
|
|
$nb_enreg=$prepare->rowCount();
|
|
$prepare=null;
|
|
return $nb_enreg;
|
|
} **/
|
|
} |