<?php
namespace TheatreCore\Repository;
use Doctrine\ORM\Query;
use TheatreCore\Entity\Abonnements;
use TheatreCore\Entity\AnnAnnonces;
use TheatreCore\Entity\BookmarkExtranetuser;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Subscribers;
use TheatreCore\Entity\UserAction;
use TheatreCore\Traits\TheatreTrait;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* ExtranetusersRepository
*
* This class was generatedN by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class ExtranetusersRepository extends ServiceEntityRepository
{
use TheatreTrait;
private $em;
public $__table;
public $__table_object;
public $__idtable;
public function __construct(ManagerRegistry $registry, TranslatorInterface $translator)
{
parent::__construct($registry, Extranetusers::class);
$this->__table = $this->getClassMetadata()->getTableName();
$this->__table_object = $this->getClassMetadata()->name;
$this->__idtable = $this->getClassMetadata()->getSingleIdentifierFieldName();
$this->translator = $translator;
$this->current_database = $_ENV['TH_BDD'];
}
// {{{ getTable()
/** Retourne le nom complet de la table avec le nom de la base en préfixe
*
*
* @access private
* @return string
*/
private function getTable()
{
return $this->current_database . '.' . $this->__table;
}
// }}}
// {{{ getRights()
/** Recupere les droits d'un utilisateur
*
*
* @access public
*/
public function getRights()
{
/*
* superadmin = 16+8+4+2+1=31
* root => 2n4 = 16+8+4+2+1=31
* lire (select) => 2n3 = 8
* creer (insert) => 2n2 = 4
* modifier (update) => 2n1 = 2
* supprimer (delete) => 2n0 = 1
*/
$crud = array('delete', 'update', 'insert', 'select', 'isroot');
//idextranetuser
// require_once PATH_LIBS.'Auth/Login.php';
$idextranetuser = SessionTheatre::getStaticValue('idextranetuser');
if (!empty($idextranetuser)) {
//recuperer les droits de l'utilisateur
$sql = 'SELECT userrights
FROM ' . $this->getTable() . '
WHERE idextranetuser=' . ((int)$idextranetuser);
$rightsValue = $this->queryOne($sql);
if ($rightsValue > 0) {
//tableau des droits
$rightstab = array();
//inscription des differents droits
$crud_count = count($crud);
for ($i = 0; $crud_count > $i; $i++) {
if (($rightsValue & pow(2, $i)) != 0) {
$rightstab[$crud[$i]] = true;
} else {
$rightstab[$crud[$i]] = false;
}
}
//isadmin si superieur a 15
$crud[5] = 'isadmin';
$rightstab[$crud[5]] = false;
if ($rightsValue >= 15) {
$rightstab[$crud[$i]] = true;
}
return $rightstab;
} else {
return array();
}
} else {
return array();
}
}
// }}}
// {{{ findData()
/** Recherche des extranetusers
*
*
* @access public
* @see Theatre::find()
*/
public function findData()
{
// requete perso
$query = null;
$query = $this->createQueryBuilder('e');
$query->leftJoin(Abonnements::class, 'a', 'WITH', 'a.idextranetuser = e.idextranetuser');
if ($this->getCount()) {
$query->select('COUNT(e.idextranetuser)');
$this->setCount(false);
return $query;
}
// $query->addSelect('partial a.{idabonnement}');
// parametre
if (isset($_REQUEST['idextranetuser']) && !empty($_REQUEST['idextranetuser'])) {
$idextranetuser = $_REQUEST['idextranetuser'];
}
if (isset($_REQUEST['keywords']) && !empty($_REQUEST['keywords'])) {
$keywords = filter_var(trim($_REQUEST['keywords']), FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
if ($this->my_is_int($keywords)) {
$idextranetuser = (int)$keywords;
$keywords = null;
}
}
if (isset($_REQUEST['nonactif'])) {
$nonactif = true;
}
if (isset($_REQUEST['enseignants'])) {
$enseignants = true;
}
if (isset($_REQUEST['enseignantsavalider'])) {
$enseignantsavalider = true;
}
// eleves ou connexion theduc
if (isset($_REQUEST['connexion_theduc'])) {
$connexion_theduc = true;
}
// compte relancé
if (isset($_REQUEST['date_resend'])) {
$date_resend = true;
}
// utilistauer thtv
if (isset($_REQUEST['thtv']) && intval($_REQUEST['thtv'])) {
$thtv = (int)$_REQUEST['thtv'];
}
// ayant proposé un spectacle
if (isset($_REQUEST['spectacle_extranetuser'])) {
$spectacle_extranetuser = $_REQUEST['spectacle_extranetuser'];
}
// // on précise les champs pour le SELECT
// $query = 'SELECT * FROM '.$this->getTable().' WHERE 1';
//recherche stricte par id
if (!empty($idextranetuser)) {
// $query .= ' AND idextranetuser='.$idextranetuser;
$query->andWhere(' e.idextranetuser=' . $idextranetuser);
}
// mots cles
if (!empty($keywords)) {
// $query .= ' AND (
// login LIKE "%'.$this->escape($keywords).'%"
// OR email LIKE "%'.$this->escape($keywords).'%"
// OR lastname LIKE "%'.$this->escape($keywords).'%"
// )';
$query->andWhere('e.login LIKE \'%' . $this->escape($keywords) . '%\'');
$query->orWhere('e.email LIKE \'%' . $this->escape($keywords) . '%\'');
$query->orWhere('e.lastname LIKE \'%' . $this->escape($keywords) . '%\'');
}
if (!empty($nonactif)) {
$query->andWhere('e.active=0');
}
if (!empty($enseignants)) {
// $query .= ' AND (e.enseignantActive=1) AND e.enseignantFonction>0';
$query->andWhere('(e.enseignantActive=1) AND e.enseignantFonction>0');
}
if (!empty($enseignantsavalider)) {
// $query .= ' AND enseignant_active=0 AND enseignant_fonction>=1';
$query->andWhere('e.enseignantActive=1 AND e.enseignantFonction>=1');
}
if (!empty($connexion_theduc)) {
// $query .= ' AND (connexion_theduc=1) AND enseignant_fonction IS NULL';
$query->andWhere('(e.connexionTheduc=1) AND e.enseignantFonction IS NULL');
}
if (!empty($date_resend)) {
// $query .= ' AND date_resend IS NOT NULL AND active=0';
$query->andWhere('e.dateResend IS NOT NULL AND e.active=0');
}
if (!empty($thtv)) {
$query->andWhere(' e.specialUser=' . $thtv);
}
if (!empty($spectacle_extranetuser)) {
dump('refaire la ligne 246 de ExtranetuersRepository');
// $query->andWhere(' e.idextranetuser IN (
// SELECT idextranetuser FROM spectacles
// )');
/*SELECT e.`idextranetuser`, e.`firstname`, e.`lastname`
FROM spectacles s
JOIN extranetusers e ON e.`idextranetuser`=s.`idextranetuser`
WHERE DATEDIFF(NOW(), s.`dateinsert`) > 100
GROUP BY e.`idextranetuser`*/
}
//
return $query->getQuery();
}
// }}}
// {{{ setToArray()
/** Liste des extranetusers dans un tableau associatif
*
* Tableau associatif notament utilisé pour lister les informations sur des extranetusers
* Utile pour générer les tableaux HTML de listes de contacts
*
* @access public
* @return array
* @see findData()
*/
public function setToArray($spec = true)
{
if ($spec == true) {
$this->findData();
}
$values = array();
$color = null;
$nb = 0;
while ($this->fetch()) {
$values[$nb] = $this->getInfosExtranetuser(null, true);
// couleur de ligne alternative
$color = $this->colorAlternate($color);
$values[$nb]['colorline'] = $color;
$nb++;
}
return $values;
}
// }}}
// {{{ getInfosExtranetuser()
/** Informations sur un utilisateur
*
* @access public
* @param int $idextranetuser Identifiant de l'utilisateur
* @return array
*/
public function getInfosExtranetuser($idextranetuser = null, $simple = false)
{
$infos = array();
////////////// infos de la table
if (empty($this->idextranetuser)) {
$query = $this->createQueryBuilder('u')
->select('u, r, c')
->leftJoin('u.idregion', 'r')
->leftJoin('u.country', 'c')
->where('u.' . $this->__idtable . ' =:value')->setParameter('value', $idextranetuser);
$datas = $this->datas = $query->getQuery()->getOneOrNullResult(Query::HYDRATE_ARRAY);
$this->loadResult($datas);
} else {
$idextranetuser = $this->idextranetuser;
}
$infos += array(
'idextranetuser' => $this->idextranetuser,
'lastname' => $this->lastname,
'firstname' => $this->firstname,
'email' => $this->email,
'login' => $this->login,
'active' => $this->active,
'userrights' => $this->userrights,
);
// date d'inscription
$infos['date_inscription'] = $this->getFormeDate($this->dateinsert);
if (!$simple) {
$infos += array(
'avatar' => $this->avatar,
'address' => $this->address,
'zip' => $this->zip,
'city' => $this->city,
'country' => (!empty($this->country['country'])) ? $this->country['id'] : null,
'idregion' => (!empty($this->idregion['idregion'])) ? $this->idregion['idregion'] : null,
'secteur' => $this->secteur,
'structure' => $this->structure,
'fonction' => $this->fonction,
'phone' => $this->phone,
'enseignant_fonction' => $this->enseignantFonction,
'enseignant_matiere' => $this->enseignantMatiere,
'enseignant_etablissement' => $this->enseignantEtablissement,
'enseignant_qualite' => $this->enseignantQualite,
'enseignant_precision_qualite' => $this->enseignantPrecisionQualite,
'enseignant_active' => $this->enseignantActive,
'connexion_theduc' => $this->connexionTheduc,
'private_comment' => $this->privateComment,
'other_email' => $this->otherEmail,
'code_chge_email' => $this->codeChgeEmail,
'old_login' => $this->oldLogin,
'password' => $this->password,
'thnetuser' => $this->thnetuser,
'last_visit_annonces' => $this->lastVisitAnnonces,
'address_ip' => $this->addressIp,
'verified' => $this->verified,
'activekey' => $this->activekey,
'tokenpass' => $this->tokenpass,
'public_api_token' => $this->publicApiToken,
'public_api_desc' => $this->publicApiDesc,
'special_user' => $this->specialUser,
'pseudo_streaming' => $this->pseudoStreaming,
'contact_owner' => $this->contactOwner,
'dateupdate' => $this->dateupdate,
);
}
// on vérifie si abonne à une news
$subscribers = $this->getEntityManager()->getRepository(Subscribers::class);
if (!empty($this->email)) {
$infos['idsubscriber'] = $subscribers->isSubscriber($this->email);
} else {
$infos['idsubscriber'] = null;
}
// on vérifie si possède un abonnement
$abonnements = $this->getEntityManager()->getRepository(Abonnements::class);
$infos['abonnement'] = $abonnements->getLastAbonnementForUser([
'special' => array(
'idextranetuser' => $this->idextranetuser,
'actif' => new DateTime()
)
]);
// pays
if (!empty($this->country['id'])) {
$infos['country'] = $this->getNameCountry($this->country['id'], $GLOBALS['lng']);
$infos['country_code'] = $this->country['id'];
}
return $infos;
}
// }}}
// {{{ getUser()
/** Informations sur un utilisateur
*
* @access public
* @param string $name login ou mail de l'utilisateur
* @return array
*/
public function getUser($name)
{
$query = 'SELECT * FROM ' . $this->getTable() . '
WHERE (login=\'' . $this->escape($name) . '\' OR email=\'' . $this->escape($name) . '\') LIMIT 0,1';
$user = $this->queryRow($query);
if (!$user) {
return false;
}
// acces a l'extranet ?
if ($user['userrights'] >= 8) {
$user['extranet'] = true;
}
//Si on a les droits canopés ou les droits d'administrations de thnet
if ($user['userrights'] >= 8 || $user['userrights'] == 2) {
$user['canope_edutheque'] = true;
}
// acces a mon theatre ?
if ($user['thnetuser'] == 1) {
$user['montheatre'] = true;
}
return $user;
}
// }}}
// {{{ getByToken()
/** Permet de retrouver un utilisateur via un token
* @access public
* @param string $token le token
* @param string $field_token le token
*/
public function getByToken($token, $field_token)
{
$query = 'SELECT *
FROM ' . $this->getTable() . '
WHERE ' . $field_token . '=\'' . $this->escape($token) . '\' LIMIT 0,1';
$res = $this->queryRow($query);
if (!empty($res)) {
return $res;
}
return false;
}
// }}}
// {{{ getPass()
/** Permet de retourner le mot de passe d'un identifiant/login indiqué
* @access public
* @param string $login le login saisi
* @return string
*/
public function getPass($login)
{
$query = 'SELECT password FROM ' . $this->getTable() . '
WHERE (login=\'' . $this->escape($login) . '\' OR email=\'' . $this->escape($login) . '\') LIMIT 0,1';
$pass = $this->queryOne($query);
if ($pass) {
return $pass;
}
return false;
}
// }}}
// {{{ getByEmail()
/** Permet de retourner l'identifiant d'un utilisateur à partir de son email
*
*
* @access public
* @param string $email email recherché
* @return int
*/
public function getByEmail($email)
{
$query = 'SELECT idextranetuser FROM ' . $this->getTable() . '
WHERE email=\'' . $this->escape($email) . '\' LIMIT 1';
$res = $this->queryOne($query);
return $res;
}
// }}}
// {{{ getEmail()
/** Retourne l'email d'un utilisateur extranet
*
*
* @param int $idextranetuser identifiant de l'utilisateur
* @access public
* @return mixed false si erreur, l'email sinon
*/
public function getEmail($idextranetuser = null)
{
if (is_null($idextranetuser)) {
$idextranetuser = $this->idextranetuser;
}
if (empty($idextranetuser)) return false;
$query = 'SELECT email FROM ' . $this->getTable() . '
WHERE idextranetuser=' . ((int)$idextranetuser) . ' LIMIT 1';
$res = $this->queryOne($query);
return $res;
}
// }}}
// {{{ extranetUserExists()
/** Vérifie si l'extranetuser existe a partir de son mail
*
* @param int $idextranetuser identifiant de l'extranet user
* @param string $email email de l'extranet user recherché
* @access public
* @return int false si inexistant, l'identifiant numérique sinon
*/
public function extranetUserExists($idextranetuser = null, $email = null, $login = null)
{
if ($idextranetuser != 'disabled' && is_null($idextranetuser)) {
$idextranetuser = $this->idextranetuser;
}
if (empty($idextranetuser) && empty($email) && empty($login)) {
return false;
}
$sql = 'SELECT idextranetuser FROM ' . $this->getTable() . ' WHERE 1 ';
if ($idextranetuser != 'disabled' && $idextranetuser) {
$sql .= ' AND idextranetuser=' . ((int)$idextranetuser);
}
if ($email) {
$sql .= ' AND email=\'' . $this->escape($email) . '\' ';
}
if ($login) {
$sql .= ' AND login=\'' . $this->escape($login) . '\' ';
}
$sql .= ' LIMIT 1';
$res = $this->queryOne($sql);
return empty($res) ? false : (int)$res;
}
// }}}
// {{{ getInfo()
/** Permet de retourner le mot de passe d'un utilisateur actif
*
*
* @access public
* @param string $login le login saisi
* @return array
*/
public function getInfo($login)
{
$query = 'SELECT password FROM ' . $this->getTable() . '
WHERE active=1
AND (login="' . $this->escape($login) . '" OR email="' . $this->escape($login) . '") LIMIT 0,1';
$infos = $this->queryAll($query);
if (!empty($infos)) {
return $infos;
}
}
// }}}
// {{{ getCryptPass()
/** Retourne le mot de passe crypte
*
* @access public
* @param string $pass Mot de passe en clair
* @return string
*/
public function getCryptPass($pass)
{
// creation du grain de sel
srand((double)microtime() * 1000000);
$salt = substr(md5(rand(0, 9999999)), 0, 8);
$pass = strip_tags($pass);
// encryption de type MD5 avec grain de sel
if (CRYPT_MD5 == 1)
return crypt($pass, '$1$' . $salt);
throw new \Exception('CRYPT_MD5 non disponible !!');
}
// }}}
// {{{ setModuleConnexion()
/** Marquer la connexion à un module
*
* @param string $module Le module
* @param int $idextranetuser Identifiant de l'utilisateur
* @param int $value Autre valeur ?
* @return boolean
* @access public
*/
public function setModuleConnexion($field_module, $idextranetuser, $value = 1)
{
$this->setUpdateFields(array($field_module => $value));
$this->setData($idextranetuser);
return true;
}
// }}}
// {{{ setDateResend()
/** Marquer l'envoi d'une relance
*
* @param string $module Le module
* @param int $idextranetuser Identifiant de l'utilisateur
* @param int $value Autre valeur ?
* @return boolean
* @access public
*/
public function setDateResend($date_resend, $idextranetuser)
{
$this->setUpdateFields(array('date_resend' => $date_resend));
$this->setData($idextranetuser);
return true;
}
// }}}
// {{{ setRegion()
/** Marquer la région
*
* @param string $idregion La région
* @return boolean
* @access public
*/
public function setRegion($idregion, $idextranetuser)
{
$this->setUpdateFields(array('idregion' => $idregion));
$this->setData($idextranetuser);
return true;
}
// }}}
// {{{ setActive()
/** Change l'etat actif ou inactif
*
* @param int $id Valeur du champ index pour l'enregistrement
* @return boolean
* @access public
*/
public function setActive($id = null, $active = 1)
{
if (empty($id)) $id = $this->id;
// champ à mettre à jour
$this->get($id);
$this->active = $active;
$this->update();
}
// }}}
// {{{ getObjectTitle()
/** Infos de l'item recherché
*
* Pour les champs Ajax de relations
*
* @access public
*/
public function getObjectTitle($idobject = null, $infos_object = array(), $params = array())
{
if (!$idobject && isset($this->idextranetuser)) $idobject = $this->idextranetuser;
// champs
$fields = array('idextranetuser', 'lastname', 'firstname', 'login');
if (!empty($infos_object)) {
foreach ($fields as $k => $v) {
if (array_key_exists($v, $infos_object)) {
$infos[$v] = $infos_object[$v];
} else {
$infos[$v] = '';
}
}
} else {
//charger les infos que si necessaire
if (empty($this->login)) {
$sql = 'SELECT ' . join(',', $fields) . '
FROM ' . $this->__table . '
WHERE ' . $this->__idtable . '=' . $idobject;
$infos = $this->queryRow($sql);
} else {
foreach ($fields as $k => $v) {
if (isset($this->$v) && $this->$v != '') {
$infos[$v] = trim($this->$v);
} else {
$infos[$v] = '';
}
}
}
}
// renvoyer un array plutôt que le titre (utile si on veux l'url)
if (array_key_exists('return_array', $params)) {
return $infos;
}
return $infos['login'];
}
// }}}
// {{{ deleteExtranetUser()
/** Supprime un utilisateur et les données associées
*
*
* @param int $idextranetuser identifiant de l'utilisateur
* @param boolean|string $delete_subscriber si vrai ou contient un email efface aussi les abonnements aux newsletters
* @access public
* @return array|boolean retourne false en cas d'erreur dans les paramètres ou un tableau (contenant le champ success en cas de succès)
*/
public function deleteExtranetUser($idextranetuser = null, $delete_subscriber = false)
{
//vérification des paramètres
$idextranetuser = $this->extranetUserExists($idextranetuser);
if ($idextranetuser === false) return false;
$email = false;
if (!empty($delete_subscriber)) {
if ($delete_subscriber === true) {
$email = $this->getEmail($idextranetuser);
} else if (is_string($delete_subscriber)) {
$email = $delete_subscriber;
}
if (empty($email)) return false;
}
$ret = array();
$err = false;
// supprimer les petites annonces de l'utilisateur
$annonces = $this->getEntityManager()->getRepository(AnnAnnonces::class);
$delete_ann = $annonces->deleteAnnonce(null, $idextranetuser);
if ($delete_ann) {
$ret['annonces'] = false;
$err = true;
} else {
$ret['annonces'] = true;
}
if (!$err) {
// supprimer les bookmarks
try {
$bkm = $this->getEntityManager()->getRepository(BookmarkExtranetuser::class);
$delete_bkm = $bkm->deleteBookmark(null, null, $idextranetuser);
$ret['bookmarks'] = true;
} catch (\Throwable $e) {
$ret['bookmarks'] = false;
$err = true;
}
}
if (!$err) {
//supprimer les abonnements si demandé
if ($email) {
try {
$subscribers = $this->getEntityManager()->getRepository(Subscribers::class);
$subscribers->return_errors = true;
$delete_subscriber = $subscribers->reallyDeleteSubscriber($email, true);
$ret['subscriber'] = true;
} catch (\Throwable $e) {
$ret['subscriber'] = false;
$err = true;
}
}
}
if (!$err) {
//suppression de l'utilisateur
$useraction = $this->getEntityManager()->getRepository(UserAction::class);
$nb_action = $useraction->countUserActions($idextranetuser);
if ($nb_action == 0) {
// ce gars n'a rien fait, son compte est détruit sans attendre
// supprimer son compte
$r = $this->deleteData($idextranetuser);
if (empty($r)) {
$err = true;
$ret['user'] = false;
} else {
$ret['user'] = true;
}
} else {
// ce gars a fait des actions, son compte est renommé et désactivé
try {
$values['old_login'] = $this->login;
$values['login'] = 'Anonymous' . uniqid();
$values['active'] = 0;
$this->setUpdateFields($values);
$r = $this->setData($idextranetuser);
$ret['user_renamed'] = true;
} catch (\Throwable $e) {
$err = true;
$ret['user_renamed'] = false;
}
}
}
if (!$err) {
//pas d'erreur, on termine la transaction
$res = $this->query('COMMIT');
$ret['success'] = true;
} else {
// erreur -> rollback
$res = $this->query('ROLLBACK');
$ret['success'] = false;
}
//retourne le tableau d'état
return $ret;
}
// }}}
// {{{ getValue()
/** Récupérer un champ
*
*
* @access public
* @param string $field le champ
* @param string $idextranetuser l'utilisateur
* @return mixed
*/
public function getValue($field, $idextranetuser = null)
{
//idextranetuser
if (empty($idextranetuser)) {
require_once PATH_LIBS . 'Auth/Login.php';
$idextranetuser = Session::getValue('idextranetuser');
}
if (empty($idextranetuser)) {
return null;
}
$sql = 'SELECT ' . $field . '
FROM ' . $this->__table . '
WHERE idextranetuser=' . (int)$idextranetuser;
return $this->queryOne($sql);
}
// }}}
// {{{ isRoot()
/** Voir si root
*
*
* @access public
* @param string $idextranetuser l'utilisateur
* @return mixed
*/
public function isRoot($idextranetuser)
{
if ($this->getValue('userrights', $idextranetuser) > 0) {
return true;
} else {
return false;
}
}
// }}}
// {{{ checkUserByToken()
/** Récupérer un utilisateur par le token
*
*
* @access public
* @param string $token le token
* @param string $le champ du token le champ du token
* @return mixed
*/
public function checkUserByToken($token, $type = 'tokenpass')
{
$sql = 'SELECT ' . $this->__idtable . '
FROM ' . $this->__table . '
WHERE ' . $type . '=\'' . $this->escape($token) . '\'';
return $this->queryOne($sql);
}
// }}}
// {{{ updatePasswd()
/** Mettre à jour le mot de passe
*
*
* @access public
* @param string $token le token pour trouver le user
* @param string $newpass le nouveau mot de passe
* @return mixed
*/
public function updatePasswd($token, $newpass)
{
$fields_values = array(
'password' => $this->getCryptPass($newpass),
'tokenpass' => NULL,
);
return $this->autoExecute($this->__table, $fields_values, AUTOQUERY_UPDATE, 'tokenpass=\'' . $this->escape($token) . '\'');
}
// }}}
// {{{ setToken()
/** Ajouter un token dans un champ
*
*
* @access public
* @param string $email adresse email du user
* @param string $type type de token
* @param string $token token (ou null pour générer un nouveau token)
* @return mixed false si erreur, le token sinon
*/
public function setToken($email, $type = 'tokenpass', $token = null)
{
// generer la cle de token
if (empty($token)) {
$token = $this->codeAlea(30);
}
$resQuery = $this->autoExecute(
$this->__table,
array($type => $token),
AUTOQUERY_UPDATE, 'email=\'' . $this->escape($email) . '\''
);
if ("0" === $resQuery) {
return $token;
}
return false;
}
// }}}
// {{{ QFormCheckEmail()
/** Test si un email existe/n'existe pas dans la table extranetusers, à utiliser avec Quickform seulement
*
* $this->context['form']->registerRule('checkemail', 'function', 'QFormCheckEmail', 'Theatre_Extranetusers');
* $email_exist = 'Cette adresse email n\'est pas enregistrée dans notre base de données.';
* $this->context['form']->addRule('email', $email_exist, 'checkemail', $this);
*
* @param string $email
* @access public
* @return boolean vrai si existe
*/
public function QFormCheckEmail($email)
{
return ($this->extranetUserExists('disabled', $email) !== false);
}
// }}}
// {{{ QFormCheckNoEmail()
/** Test si un email n'existe pas dans la table extranetusers, à utiliser avec Quickform seulement
*
* @see QFormCheckEmail()
*/
public function QFormCheckNoEmail($email)
{
return ($this->extranetUserExists('disabled', $email) === false);
}
// }}}
// {{{ QFormCheckLogin()
/** Test si un login existe/n'existe pas dans la table extranetusers, à utiliser avec Quickform seulement
*
* $this->context['form']->registerRule('checklogin', 'function', 'QFormCheckLogin', 'Theatre_Extranetusers');
* $email_exist = 'Ce login email n\'est pas enregistrée dans notre base de données.';
* $this->context['form']->addRule('email', $email_exist, 'checkemail', $this);
*
* @param string $login
* @access public
* @return boolean vrai si existe
*/
public function QFormCheckLogin($login)
{
return ($this->extranetUserExists('disabled', null, $login) !== false);
}
// }}}
// {{{ QFormCheckNoLogin()
/** Test si un login 'existe pas dans la table extranetusers, à utiliser avec Quickform seulement
*
* @see QFormCheckNoLogin()
*/
public function QFormCheckNoLogin($login)
{
return $this->extranetUserExists('disabled', null, $login);
}
// }}}
// {{{ CheckEmailEducation()
/** fonction pour vérifier les adresses email du personnel de l'Education Nationale
*
*
* @param string $email l'adresse email à tester
* @access public
* @return boolean vrai si adresse de l'Education Nationale
*/
public function CheckEmailEducation($email)
{
$email = strtolower(trim($email));
// @theatre-contemporain.net (TEST)
if (preg_match('/@theatre-contemporain\.net$/', $email)) return true;
// @intempestifs.fr (TEST)
//if (preg_match('/@intempestifs.fr$/',$email)) return true;
// @education.gouv.fr
if (preg_match('/@education\.gouv\.fr$/', $email)) return true;
// @ac-nomdel’académie.fr
if (preg_match('/@ac-[a-z0-9-]+\.fr$/', $email)) return true;
return false;
}
// }}}
// {{{ acceptExtranetuser()
/** valider l'accès d'un extranetuser à un objet'
*
*
* @param string $object Type d'objet
* @param int $idobject Identifiant de l'objet
* @param int $idextranetuser Identifiant de l'extranetuser
* @access public
* @return boolean
*/
public function acceptExtranetuser($object, $idobject, $idextranetuser)
{
// l'objet sans le s
$object_simple = substr($object, 0, -1);
// instancie l'objet de liaison
$obj = Theatre::factory($object_simple . '_extranetuser');
// status à 1 et droits à 15
$obj->setUpdateFields(array(
'status' => 1,
'user_rights' => 15,
'date_accept' => now(),
));
$where = 'idextranetuser=' . $idextranetuser . ' AND id' . $object_simple . '=' . $idobject;
if ($obj->setData(null, null, true, $where)) {
return true;
} else {
return false;
}
}
// }}}
// {{{ rejectExtranetuser()
/** refuser l'accès d'un extranetuser à un objet'
*
*
* @param string $object Type d'objet
* @param int $idobject Identifiant de l'objet
* @param int $idextranetuser Identifiant de l'extranetuser
* @access public
* @return boolean
*/
public function rejectExtranetuser($object, $idobject, $idextranetuser)
{
// l'objet sans le s
$object_simple = substr($object, 0, -1);
// instancie l'objet de liaison
$obj = Theatre::factory($object_simple . '_extranetuser');
// status à 1 et droits à 15
$sql = 'DELETE
FROM ' . $obj->__table . '
WHERE idextranetuser=' . $idextranetuser . '
AND id' . $object_simple . '=' . $idobject;
$this->logDeletion('[Theatre_Extranetusers::rejectExtranetuser] Refuse l\'accès à un objet ' . $sql);
if ($obj->exec($sql)) {
return true;
} else {
return false;
}
}
// }}}
// {{{ deleteInactiveExtranetusers()
/** supprimer les utilisateurs qui n'ont jamais activé leur compte et qui ont été relancé
*
*
* @param string $days nombre de jours ecoulés depuis la relance
* @access public
* @return boolean
*/
public function deleteInactiveExtranetusers($day)
{
$date_relance = date('Y-m-d H:i:s', strtotime('-' . $day . ' day'));
// trouve les utilisateurs à supprimer
$sql = 'SELECT ' . $this->__idtable . '
FROM ' . $this->__table . '
WHERE date_resend IS NOT NULL
AND active=0
AND TO_DAYS(NOW()) - TO_DAYS(date_resend) > ' . (int)$day;
// si on veut exclure les enseignants
//AND enseignant_fonction IS NULL
$idsubscribers_tab = $this->queryAll($sql);
$nb_deleted = null;
if (!empty($idsubscribers_tab)) {
foreach ($idsubscribers_tab as $k => $v) {
if ($this->deleteExtranetUser($v['idextranetuser'])) {
$nb_deleted++;
}
}
}
return $nb_deleted;
}
// }}}
// {{{ checkHTTPAuth()
/** Checker l'authentification HTTP
*
*
* @return boolean vrai si authentifié
*/
public function checkHttpAuth()
{
return true;
}
// }}}
// {{{ checkAPIKey()
/** Checker l'authentification avec la clé simple
*
*
* @return boolean vrai si authentifié
*/
public function checkAPIKey($token, $type = 'public_api_token')
{
return $this->checkUserByToken($token, $type);
}
// }}}
// {{{ getListSearch()
/** Liste de contacts
*
* Pour les champs Ajax de relations et les recherches diverses
*
* @access public
* @param string $lettres Pour la recherche alphabetique
* @param string $type Pour le type recherche (editeurs, revues...)
* @param string $keywords Recherche par mots cles
* @return array
*/
public function getListSearch($lettre = null, $type = null, $keywords = null, $only = null)
{
$query = 'SELECT idextranetuser,login,email FROM ' . $this->__table . ' WHERE 1 ';
// selection par ordre alpha
if (!empty($lettre)) {
$query .= ' AND LOWER(LEFT(LTRIM(login),1))=\'' . $this->escape($lettre) . '\' ';
}
// recherche avec un mot cle
$list = $this->splitKeywords($keywords);
if ($list) {
$subsql = '';
if (!empty($list[$this->IDSTR])) {
// mots clés
$ssubsql = '';
foreach ($list[$this->IDSTR] as $s) {
if ($ssubsql) $ssubsql .= ' AND ';
$ssubsql .= 'login LIKE \'%' . $s . '%\'';
}
$subsql .= ' AND (' . $ssubsql . ') ';
}
if (!empty($list[$this->IDNUM])) {
// recherche par numéro d'id pour les mots clés numériques
if ($subsql) $subsql .= ' OR ';
$subsql .= 'idextranetuser IN (' . implode(',', $list[$this->IDNUM]) . ')';
}
if ($subsql) $query .= $subsql;
}
//echo $query;
$this->query($query);
$r = array();
while ($this->fetch()) {
$r[$this->idextranetuser] = $this->login;
// si trouvé par id, on l'affiche en fin de titre
if (!empty($list[$this->IDNUM]) && in_array($this->idextranetuser, $list[$this->IDNUM])) {
$r[$this->idextranetuser] .= ' - n°' . $this->idextranetuser;
}
}
$this->free();
return $r;
}
// }}}
// {{{ getObjectsRights()
/** Droits de l'utilisateur sur des fiches
*
* Trouver les droits d'utilisateur sur des fiches contact et person
*
* @access public
* @param int $idextranetuser Identifiant de l'extranetuser
* @return array
*/
public function getObjectsRights($idextranetuser, $params = array())
{
$conn = $this->getEntityManager();
$obj_links = array(
'contact' => array(
'title' => 'structures',
'url' => 'contacts',
'edit_page' => 'presentation-edit',
),
'person' => array(
'title' => 'biographies',
'url' => 'biographies',
'edit_page' => 'presentation-edit?edit',
)
);
if (!empty($params['specifique']) && !empty($obj_links[$params['specifique']])) {
$obj_value = $obj_links[$params['specifique']];
unset($obj_links);
$obj_links[$params['specifique']] = $obj_value;
}
$limit = '';
if (array_key_exists('limit', $params)) {
if (is_array($params['limit'])) {
$limit = ' LIMIT ' . $params['limit'][0] . ',' . $params['limit'][1];
} else {
$limit = ' LIMIT ' . $params['limit'];
}
}
foreach ($obj_links as $o => $v) {
$datas[$o]['infos'] = $v;
//si nous souhaitons le nombre de résultat
if (array_key_exists('count', $params)) {
$sql = 'SELECT COUNT(DISTINCT(id' . $o . ')) AS total FROM ' . $o . '_extranetuser WHERE idextranetuser=' . (int)$idextranetuser . ' ' . $limit;
$datas[$o]['total'] = $this->queryOne($sql);
} //si nous récupérer les résulats eux même...
else {
$sql = 'SELECT * FROM ' . $o . '_extranetuser WHERE idextranetuser=' . (int)$idextranetuser . ' ' . $limit;
$resultats = $this->query($sql);
if (!empty($resultats)) {
$obj = $this->getEntityManager()->getRepository('TheatreCore\Entity\\' . ucfirst($o) . 's');
foreach ($resultats as $resultat) {
$obj->getInfosObject($resultat['id' . $o]);
$obj->loadResult($resultat);
$datas[$o]['objects'][$obj->{'id' . $o}] = $obj->getObjectTitle($obj->{'id' . $o}, array(), array('return_array' => true));
}
$obj->free();
}
}
$this->free();
}
return $datas;
}
// }}}
// {{{ countSpecialUser()
/** utilisateurs spéciaux
*
* @access public
* @return int
*/
public function countSpecialUser()
{
// utilisateurs en attente
$sql_special_user = 'SELECT COUNT(DISTINCT(' . $this->__idtable . '))
FROM ' . $this->__table . '
WHERE special_user=2';
return $this->queryOne($sql_special_user);
}
// }}}
// {{{ getSQLExtranetusers()
/** Générer la requete standard pour des dvds
*
* $params = array(
* 'select' => champs en plus pour le select,
* 'from' => champs en plus pour le from,
* 'where' => paramètres en plus le where,
* 'order' => classement des résultats,
* 'limit' => limiter le nb de résultats array(debut,fin), (all pour pas de limit)
* )
* $special = array(
* 'select_by_text_or_adaptation' => text et adaptation,
* 'prochains' => true = date dans le future, un entier = fait un between
* 'anciens' =>
* 'join' => jointure gauche sur contacts et schedules
* )
*
*
* @access public
* @param array $params Les paramètres pour la requete
* @param array $special Les paramètres supplémentaires
* @param bool $debug afficher la requête TODO
* @return string
*/
public function getSQLExtranetusers($query = array(), $debug = false)
{
// on prepare les tableaux
foreach (array('select', 'from', 'where', 'order', 'group', 'limit') as $t) {
if (!empty($query[$t])) {
if (!is_array($query[$t])) {
$query[$t][] = $query[$t];
} else {
$query[$t] = $query[$t];
}
} else {
$query[$t] = array();
}
}
// champs par défaut
$this->addSQLParams('select', $query, array(
array($this->__table => '*')
));
return $this->getSQLObject($query);
}
// }}}
// {{{ getObjectExtranetusers()
/** Trouver les utilisateurs qui sont liés à un objet
*
* Trouver par exemple les extranetusers associés à une fiche contact
*
* @access public
* @param string $object Objet source (contact, person...)
* @param int $idobject Identifiant de l'objet
* @return array
*/
public function getObjectExtranetusers($object, $idobject, $count_only = false)
{
if ($count_only) {
$sql = 'SELECT COUNT(DISTINCT(e.`idextranetuser`)) as total ';
} else {
$sql = 'SELECT o.*, e.login, e.`email` ';
}
$sql .= '
FROM ' . $object . '_extranetuser o
JOIN ' . $this->__table . ' e ON e.`idextranetuser`=o.`idextranetuser`
WHERE o.`id' . $object . '`=' . (int)$idobject;
if ($count_only) {
$datas = $this->queryOne($sql);
} else {
$datas = $this->queryAll($sql);
}
if (!empty($datas)) {
return $datas;
} else {
if ($count_only) {
return null;
} else {
return array();
}
}
return $datas;
}
// }}}
// {{{ getExtranetuserObject()
/** Trouver les objets associés à un utilisateur
*
* Trouver par exemple les contacts sur lesquels l'utilisateur à des droits
*
* @access public
* @param string $object Objet source (contact, person...)
* @return array
*/
public function getExtranetuserObject($idextranetuser, $object)
{
$sql = 'SELECT o.`id' . $object . '`
FROM ' . $object . '_extranetuser o
JOIN ' . $this->__table . ' e ON e.`idextranetuser`=o.`idextranetuser`
WHERE o.`status`=1 AND o.`user_rights`=15 AND o.`idextranetuser`=' . (int)$idextranetuser;
$datas = $this->queryCol($sql);
if (!empty($datas)) {
foreach ($datas as $k => $v) {
$rows[$v] = $v;
}
return $rows;
} else {
return array();
}
return $datas;
}
// }}}
// {{{ getListExtranetusers()
/** Retourne des listes de extranetusers
*
* Retourne des listes de extranetusers au format "standard""
*
* @access public
* @param array $params_sql paramètre pour la requete SQL
* @param array $format_vignette de la vignette si pas standard
* @param array $params_display paramètre pour l'affichage
* @return array
*/
public function getListExtranetusers($params_sql = null, $format_vignette = array(), $params_display = array())
{
// si pas de tableau
if (!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if (!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// construction de la requête avec le passage de paramètres
$sql = $this->getSQLExtranetusers($params_sql);
// paramètre de debug
$dbg = (empty($params_sql['dbg'])) ? array() : $dbg = $params_sql['dbg'];
// executer la requete
$this->query($sql, $dbg);
// debug
$start_boucle = microtime(true);
$results = array();
// on boucle
while ($this->fetch()) {
$id = $this->{$this->__idtable};
$results[$id] = $this->getInfosExtranetuser($id);
}
// debug de la boucle
if ($this->isTraceMode('list_object')) {
$this->setTraceInfos(array(
'execution_time_boucle' => microtime(true) - $start_boucle,
'dbg' => $dbg,
));
}
$this->free();
return $results;
}
// }}}
// {{{ getRightsList()
/** Retourne la liste des droits
*
*
* @access public
* @return array
*/
public function getRightsList()
{
/* superadmin = 16+8+4+2+1=31
* root => 2n4 = 16+8+4+2+1=31
* lire (select) => 2n3 = 8
* creer (insert) => 2n2 = 4
* modifier (update) => 2n1 = 2
* supprimer (delete) => 2n0 = 1*/
$rights = array(
'15' => 'administrateur',
'8' => 'consultation',
);
return $rights;
}
// }}}
// {{{ countExtranetusers()
/** compter tous les utilisateurs
*
* @return int
*/
public function countExtranetusers()
{
return $this->queryOne('SELECT COUNT(DISTINCT(idextranetuser)) FROM extranetusers');
}
// }}}
// {{{ countPostedSpectacles()
/** chercher les spectacles proposés par des extranetusers de la structure
*
* @return int
*/
public function countPostedSpectacles($idcontact)
{
$sql = 'SELECT COUNT(s.`idspectacle`)
FROM spectacles s
INNER JOIN schedules sc ON s.`idspectacle`=sc.`idspectacle`
LEFT JOIN spectacle_contact sct ON s.`idspectacle`=sct.`idspectacle`
INNER JOIN extranetusers e ON e.`idextranetuser`=s.`idextranetuser`
WHERE e.`userrights` < 15
AND (
sct.`idcontact`=' . $idcontact . '
OR sc.`idcontact`=' . $idcontact . '
OR s.`idcontact_creation`=' . $idcontact . '
) GROUP BY s.`idspectacle`';
return $this->queryOne($sql);
}
// }}}
}