hellofacteurV1/modele/FclFlux_absences.php

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;
} **/
}