<?php
namespace TheatreCore\Repository;
use TheatreCore\Entity\EcoleRole;
use TheatreCore\Entity\PersonEcole;
use TheatreCore\Entity\Persons;
use TheatreCore\Traits\TheatreTrait;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* TextAideRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class PersonEcoleRepository extends ServiceEntityRepository
{
use TheatreTrait;
private $em;
public $__table;
public $__table_object;
public $__idtable;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PersonEcole::class);
$this->__table = $this->getClassMetadata()->getTableName();
$this->__table_object = $this->getClassMetadata()->name;
$this->__idtable = $this->getClassMetadata()->getSingleIdentifierFieldName();
// $this->__table = 'persons';
// $this->__table_object = '\\App\\Entity\\Persons';
}
// {{{ countEleves()
/** Compter le nombre d'élèves
*
* @access public
* param int idcontact identifiant du contact
* @return int
*/
public function countEleves($idcontact = null, $params = array())
{
$sql = 'SELECT COUNT(DISTINCT(idperson))
FROM ' . $this->__table . ' WHERE 1 ';
if (!empty($idcontact)) {
if (is_array($idcontact)) {
$sql .= ' AND idcontact IN (' . $this->arrayToIn($idcontact) . ') ';
} else {
$sql .= ' AND idcontact=' . (int)$idcontact;
}
}
// exclure des structures
if (!empty($params['exclude']['idcontacts'])) {
$sql .= ' AND idcontact NOT IN (' . $this->arrayToIn($params['exclude']['idcontacts']) . ') ';
}
// uniquement les anciens
if (!empty($params['old'])) {
if ($idcontact == 3914) {
$sql .= ' AND date_end < \'' . date('Y') . '-06-30 00:00:00\' ';
} else {
$sql .= ' AND date_end < \'' . date('Y-m-d') . ' 00:00:00\' ';
}
}
// uniquement les courants
if (!empty($params['current'])) {
if ($idcontact == 3914) {
$sql .= ' AND date_end > \'' . date('Y-m-d') . '-06-30 00:00:00\' ';
} else {
$sql .= ' AND (date_end >= \'' . date('Y-m-d') . '\' OR date_end=\'0000-00-00 00:00:00\' OR date_end IS NULL)';
}
}
$nb_eleves = $this->queryOne($sql);
if ($nb_eleves) {
return $nb_eleves;
}
}
// }}}
// {{{ getInfosPerson_ecole()
/** R&écupèrer les infos
*
* @access public
* param int idcontact identifiant du contact
* param int idperson identifiant de la personne
* @return array
*/
public function getInfosPerson_ecole($idcontact, $idperson)
{
try {
$sql = 'SELECT * FROM ' . $this->__table . ' WHERE idcontact=' . (int)$idcontact . ' AND idperson=' . (int)$idperson;
$infos = $this->queryRow($sql);
if (empty($infos)) {
return [];
}
// formater les dates
foreach (array('start', 'end') as $f) {
$day = substr($infos['date_' . $f], 8, 2);
$month = substr($infos['date_' . $f], 5, 2);
$year = substr($infos['date_' . $f], 0, 4);
$infos['date_' . $f . '_day'] = $day;
$infos['date_' . $f . '_month'] = $month;
$infos['date_' . $f . '_year'] = $year;
$infos['date_' . $f . '_str'] = $day . '/' . $month . '/' . $year;
}
if (empty($infos)) {
return [];
}
return $infos;
} catch (\Throwable $e) {
return [];
}
}
// }}}
// {{{ getItemsList()
/** Liste des items pour les champs relationnels
*
* Retourne un tableau associatif contenant la liste des items
* d'une relation. Exemple : getItemsList(4,'text_author'); retourne les noms
* et prénom des auteurs du texte numéro 4
*
* @access public
* @param string $type Ce qu'on recherche
* @param string $idtext L'id de l'objet
* @return array
*/
public function getItemsList($idobject, $type)
{
// splitter idcontact;idperson
$ids = explode(';', $idobject);
$idcontact = $ids[0];
$idperson = $ids[1];
// les personnes associées
if ($type == 'idperson') {
// on veut seulement une personne qui n'est pas encore inscrite
if ($idcontact == 'idperson') {
$infos['idperson'] = $idperson;
$infos['code'] = $idperson;
$infos['view_name'] = $this->getEntityManager()->getRepository(Persons::class)->getObjectTitle($idperson);
return array($idperson => $infos);
// personne déjà inscrite (JOIN dans getLinkedObject)
} else {
return parent::getItemsList($idperson, $type);
}
}
// les contacts
if ($type == 'idcontact') {
return parent::getItemsList($idcontact, $type);
}
// les rôles
if ($type == 'roles') {
return $this->getEntityManager()->getRepository(EcoleRole::class)->getRolesByPerson($idperson, array('idcontact' => $idcontact));
}
}
// }}}
// {{{ getRelationsArray()
/** Décrit les relations de l'objet
*
* @access public
* @param string|int $type si on souhaite retourner uniquement un type precis
* @see Theatre::getLinkedObject()
*/
public function getRelationsArray($type)
{
$array_types = array(
// jointure avec persons
'idperson' => array(// contacts associés
'type_join' => 'simple',
'dest_table' => 'persons',
'fields_dest_table' => array('idperson'),
'src_table_field' => 'idperson',
'fields' => array('idperson', 'lastname', 'firstname', 'url_clean'),
'description' => 'Personne associé',
),
// jointure avec contacts
'idcontact' => array(// contacts associés
'type_join' => 'simple',
'dest_table' => 'contacts',
'fields_dest_table' => array('idcontact'),
'src_table_field' => 'idcontact',
'fields' => array('idcontact', 'organisation', 'firstname', 'lastname', 'type'),
'description' => 'Contact associé',
),
);
// retourne uniquement un type précis
if ($type == 'all') {
return $array_types;
}
if (!empty($array_types[$type])) {
$array_types[$type]['type'] = $type;
return $array_types[$type];
} else {
return null;
}
}
// }}}
// {{{ deleteEleve()
/** Supprime un élève d'une école
*
* @access public
* @param int $idcontact le contact
* @param int $idperson la personne
* @return bool
*/
public function deleteEleve($idcontact, $idperson)
{
try {
$sql = 'DELETE FROM ' . $this->__table . ' WHERE idcontact=' . (int)$idcontact . ' AND idperson=' . (int)$idperson;
$res = $this->exec($sql);
$sql = 'DELETE FROM ecole_role WHERE idcontact=' . (int)$idcontact . ' AND idperson=' . (int)$idperson;
$res = $this->exec($sql);
$this->logDeletion('[Person_ecole::deleteEleve] Supprime un élève d\une école');
return true;
} catch (\Throwable $e) {
return false;
}
}
// }}}
// {{{ getEcoles()
/** Récupèrer les écoles d'une personne
*
* @access public
* param int|array $idperson identifiant de la personne
* @return array
*/
public function getEcoles($idperson, $exclude = 3914)
{
$sql = 'SELECT ' . $this->__table . '.*, contacts.`organisation`, contacts.`url_clean`
FROM ' . $this->__table . '
JOIN contacts ON contacts.`idcontact`=' . $this->__table . '.`idcontact`
WHERE ' . $this->__table . '.`idperson`';
// pour une personne ou plusieurs
if (is_array($idperson)) {
$sql .= ' IN (' . join(',', $idperson) . ') ';
} else {
$sql .= '=' . (int)$idperson;
}
// exclure le JTN
if ($exclude) {
$sql .= ' AND contacts.`idcontact`!=' . (int)$exclude;
}
$infos = $this->queryAll($sql);
if (empty($infos)) {
return array();
} else {
// promo ==> date_end
foreach ($infos as $k => $v) {
$infos[$k]['promo'] = substr($v['date_end'], 0, 4);
// si date_end > date du jour = promo courante
$now = new DateTime(date('Y-m-d'));
$expire = new DateTime($v['date_end']);
if ($now < $expire) {
$infos[$k]['current'] = true;
}
}
// groupement par persons
if (is_array($idperson)) {
foreach ($infos as $k => $v) {
$new_infos[$v['idperson']][$v['idcontact']] = $v;
}
return $new_infos;
} else { // classement par idcontact
return $infos;
}
}
}
// }}}
// {{{ getPersons()
/** Récupèrer les personnes d'une école
*
* @access public
* param int|array $idcontact identifiant de l'école
* @return array
*/
public function getPersons($idcontact = null, $params = array())
{
$sql = 'SELECT ' . $this->__table . '.*, contacts.`organisation`, contacts.`url_clean`
FROM ' . $this->__table . '
JOIN contacts ON contacts.`idcontact`=' . $this->__table . '.`idcontact`
WHERE ' . $this->__table . '.`idcontact`';
// pour une personne ou plusieurs
if (!empty($idcontact)) {
if (is_array($idcontact)) {
$sql .= ' IN (' . join(',', $idcontact) . ') ';
} else {
$sql .= '=' . (int)$idcontact;
}
}
$infos = $this->queryAll($sql);
if (empty($infos)) {
return array();
} else {
// uniquement les ids
if (array_key_exists('get_ids', $params)) {
foreach ($infos as $k => $v) {
$ids[$v['idperson']] = $v['idperson'];
}
return $ids;
}
// promo ==> date_end
foreach ($infos as $k => $v) {
// formater les dates
foreach (array('start', 'end') as $f) {
$day = substr($infos[$k]['date_' . $f], 8, 2);
$month = substr($infos[$k]['date_' . $f], 5, 2);
$year = substr($infos[$k]['date_' . $f], 0, 4);
$infos[$k]['date_' . $f . '_day'] = $day;
$infos[$k]['date_' . $f . '_month'] = $month;
$infos[$k]['date_' . $f . '_year'] = $year;
$infos[$k]['date_' . $f . '_str'] = $day . '/' . $month . '/' . $year;
}
$infos[$k]['promo'] = substr($v['date_end'], 0, 4);
}
// groupement par persons
if (!empty($idcontact)) {
if (is_array($idcontact)) {
foreach ($infos as $k => $v) {
$new_infos[$v['idcontact']][$v['idperson']] = $v;
}
return $new_infos;
} else { // classement par idcontact
return $infos;
}
} else {
return $infos;
}
}
}
// }}}
// {{{ getRoles()
/** Différent rôle des éléves
*
* @access public
* param int|array $idcontact identifiant de l'école
* @return array
*/
public function getRoles($idcontact)
{
$sql = 'SELECT DISTINCT(`comments`)
FROM ' . $this->__table . '
WHERE ' . $this->__table . '.`idcontact`';
// pour une personne ou plusieurs
if (is_array($idcontact)) {
$sql .= ' IN (' . join(',', $idcontact) . ') ';
} else {
$sql .= '=' . (int)$idcontact;
}
try {
$infos = $this->queryCol($sql);
if (empty($infos)) {
return [];
}
foreach ($infos as $i) {
$new_infos[$i] = $i;
}
return $new_infos;
} catch (\Throwable $e) {
return [];
}
}
// }}}
// {{{ getPromos()
/** Différentes promos d'une école
*
* @access public
* param int|array $idcontact identifiant de l'école
* @return array
*/
public function getPromos($idcontact = null, $last_only = false)
{
$sql = 'SELECT YEAR(date_end) as year_end
FROM person_ecole pe
WHERE 1 ';
if (!empty($idcontact)) {
$sql .= ' AND pe.`idcontact`=' . (int)$idcontact;
}
if ($last_only) {
$sql .= ' AND YEAR(pe.`date_end`)<=\'' . date('Y') . '\' ';
}
$sql .= '
GROUP BY year_end
ORDER BY year_end DESC';
$infos = $this->queryCol($sql);
if (empty($infos)) {
return array();
} else {
// si on est avant le 31/07@-, exclure l'année courante
$now = new DateTime(date('Y-m-d'));
$expire = new DateTime(date('Y') . '-07-01');
foreach ($infos as $i) {
if ($now < $expire && $i == date('Y')) {
continue;
}
$new_infos[$i] = $i;
}
return $new_infos;
}
}
// }}}
// {{{ getLastPromo()
/** Dernière promo
*
* @access public
* param array $promos liste des promos
* @return int
*/
public function getLastPromo($promos)
{
// si on est avant le 31/07@-, exclure l'année courante
$now = new DateTime(date('Y-m-d'));
$expire = new DateTime(date('Y') . '-07-01');
foreach ($promos as $p) {
if ($now < $expire && $p == date('Y')) {
continue;
}
return $p;
}
}
// }}}
// {{{ countSpectacles()
/** Compter les spectacles d'une école
*
* @access public
* param int $idcontact le contact
* @return int
*/
public function countSpectacles($idcontact)
{
// nb de spectacle avec la classification JTN
if ($idcontact == 3914) {
$idclassification_specifique = 103;
$sql_nb_spectacles = '
SELECT COUNT(DISTINCT(spectacles.`idspectacle`)) as total
FROM spectacles
INNER JOIN spectacle_classification ON spectacle_classification.`idspectacle`=spectacles.`idspectacle`
WHERE spectacle_classification.`idclassification`=' . $idclassification_specifique . '
AND spectacles.`publish`=1';
} else {
$sql_nb_spectacles = '
SELECT COUNT(DISTINCT(spectacles.`idspectacle`)) as total
FROM spectacles
INNER JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
INNER JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
WHERE person_ecole.`idcontact`=' . $idcontact . '
AND spectacles.`publish`=1';
}
return $this->queryOne($sql_nb_spectacles);
}
// }}}
// {{{ countDates()
/** Compter les dates de représentation pour une école
*
* @access public
* param int $idcontact le contact
* @return int
*/
public function countDates($idcontact)
{
// nombre de représentations avec la classification JTN
if ($idcontact == 3914) {
$idclassification_specifique = 103;
$sql_nb_dates = 'SELECT COUNT(DISTINCT(schedules.`date`)) as total
FROM spectacles
INNER JOIN schedules ON schedules.`idspectacle`=spectacles.`idspectacle`
INNER JOIN spectacle_classification ON spectacle_classification.`idspectacle`=spectacles.`idspectacle`
WHERE spectacle_classification.`idclassification`=' . $idclassification_specifique . ' AND schedules.`date`>\'1999-12-31\'
AND spectacles.`publish`=1';
} else {
$sql_nb_dates = 'SELECT COUNT(DISTINCT(schedules.`date`)) as total
FROM spectacles
INNER JOIN schedules ON schedules.`idspectacle`=spectacles.`idspectacle`
INNER JOIN spectacle_person ON spectacle_person.`idspectacle`=spectacles.`idspectacle`
INNER JOIN person_ecole ON person_ecole.`idperson`=spectacle_person.`idperson`
WHERE person_ecole.`idcontact`=' . $idcontact . ' AND schedules.`date`>\'1999-12-31\'
AND spectacles.`publish`=1';
}
return $this->queryOne($sql_nb_dates);
}
// }}}
// {{{ getIdsSpectacles()
/** les spectacles pour une saison
*
* @access public
* param int $idcontact le contact
* @return int
*/
public function getIdsSpectacles($idcontact, $params = array(), $list_idpersons = array())
{
if ($idcontact == 3914) {
$idclassification_specifique = 103;
$sql_spectacles = '
SELECT DISTINCT(s.`idspectacle`)
FROM spectacles s
JOIN text_spectacle ts ON ts.idspectacle=s.idspectacle
JOIN schedules sc ON sc.idspectacle=s.idspectacle
JOIN spectacle_classification scl ON scl.idspectacle=s.idspectacle
WHERE 1
AND s.`publish`=1 AND scl.`idclassification` = ' . $idclassification_specifique . ' ';
} else {
// nb de spectacle pour la saison en cours pour les élèves
$sql_spectacles = '
SELECT DISTINCT(s.`idspectacle`)
FROM spectacles s
JOIN spectacle_person sp ON sp.idspectacle=s.idspectacle
JOIN schedules sc ON sc.idspectacle=s.idspectacle
WHERE 1
AND s.`publish`=1 AND sp.`idperson` IN (' . join(',', $list_idpersons) . ') ';
}
if (!empty($params['saison'])) {
$s = explode('-', $params['saison']);
$sql_spectacles .= ' AND sc.`date` BETWEEN \'' . $s[0] . '-09-01\' AND \'' . $s[1] . '-08-31\' ';
}
return $this->queryCol($sql_spectacles);
}
// }}}
}