<?php
namespace TheatreCore\Repository;
use TheatreCore\Classes\Date\Calendar;
use TheatreCore\Entity\Contacts;
use TheatreCore\Entity\Newschedules;
use TheatreCore\Traits\TheatreTrait;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* NewschedulesRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class NewschedulesRepository extends ServiceEntityRepository
{
use TheatreTrait;
private $em;
public $__table;
public $__table_object;
public $__idtable;
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Newschedules::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';
}
// {{{ getHours()
/** heures du spectacle
*
* @access public
* @return array
* @param string $date La date du spectacle
* @param int $idspectacle identifiant du spectacle
* @param int $idcontact identifiant du contact
*/
public function getHours($date,$idnew,$idcontact)
{
$query = 'SELECT hour,note
FROM newschedules
WHERE date="'.$date.'"
AND idnew='.$idnew.'
AND idcontact='.$idcontact;
$datas = $this->query($query);
foreach($datas AS $row) {
if($row['hour']!='00:00') {
$hour[]['hour'] = $row['hour'];
}
$hour[]['note'] = $row['note'];
}
unset($datas);
return $hour;
}
// }}}
// {{{ getItemsList()
/** Liste des items pour les champs relationnels
*
* Retourne un tableau associatif contenant la liste des items d'une relation
*
* @access public
* @return array
* @param string $type Ce qu'on recherche
* @param string $idtext L'id de l'objet
*/
public function getItemsList($idcontact,$type)
{
$conn = $this->getEntityManager();
// on doit recherche l'id contact qui correspond
if($type=='idcontact') {
$contact = $conn->getRepository(Contacts::class)->getObjectTitle($idcontact,array(),array('return_array' => true));
return array($contact['idcontact'] => array(
'id' => $contact['idcontact'],
'view_name' => $contact['title']
));
} else {
return $idnewschedule.' Aucune fonction de recherche pour le type <strong>'.$type.'</strong> dans la méthode !';
}
}
// }}}
// {{{ getDatesHours()
/** Dates et heures de l'évènement
*
* @access public
* @return array
* @param int $idnew identifiant du spectacle
* @param int $idcontact identifiant du contact
*/
public function getDatesHours($idnew,$idcontact,$type=null)
{
$sql = 'SELECT DISTINCT(date), note
FROM newschedules
WHERE idnew='.$idnew.'
AND idcontact='.$idcontact.' ';
// pour les dates futurs, commencer au début du mois
if(!empty($type) && $type!='tous') {
if ($type == 'demain') {
$expr = '>=';
$date_search = date('Y-m-01');
} else {
$expr = '<=';
$date_search = date('Y-m-d');
}
$sql .= ' AND date'.$expr.'\''.$date_search.'\' ';
}
// classement
$sql .= ' ORDER BY date';
$res = $this->query($sql);
//setDebug('SQL datehour : '.$sql);
$nbresult = count($res);
if($nbresult>1) {
$dateshours['periode'] = true;
}
$i = 0;
foreach($res AS $row) {
$this->loadResult($row);
// année mois
$y = $this->getFormeDate($row['date'],"%y",true);
$m = $this->getFormeDate($row['date'],"%m",true);
// format string ou classique
$date_str = $this->getFormeDate($row['date'],"%a %d/%m/%y",true);
$date_orig = $this->getFormeDate($row['date'],$GLOBALS['format_date'][$GLOBALS['lng']]);
// une période
if($nbresult>1) {
$dateshours[$date_orig]['hours'] = $this->getHours($row['date'],$idnew,$idcontact);
if($type=='demain' && empty($date_debut_ok)) {
if($row['date']>=date('Y-m-d')) {
$dateshours[$date_orig]['datedebut'] = $date_str;
$date_debut_ok = true;
}
} else {
if($i==0) { // première date = date de début
$dateshours[$date_orig]['datedebut'] = $date_str;
}
}
if($i==$nbresult-1) {
$dateshours[$date_orig]['datefin'] = $date_str;
}
} else { // inde date unique
$dateshours['date'] = $date_orig;
$dateshours['hours'] = $this->getHours($row['date'],$idnew,$idcontact);
}
$hour_string = array();
if(!empty($dateshours[$date_orig]['hours'])) {
foreach($dateshours[$date_orig]['hours'] as $k=>$v) {
if(!empty($v['hour'])) {
$hour_string[] = $v['hour'];
}
}
}
// plusieurs heures ou une seule
if(!empty($hour_string)) {
$hour_string = join(' / ', $hour_string);
} else {
$hour_string = null;
}
$dateshours['event'][$row['date']] = array(
'date' => $row['date'],
'hour' => $hour_string,
);
$dateshours['months'][$y.$m] = array('y' => $y, 'm' => $m);
if(!empty($row['note'])) {
$dateshours['event'][$row['date']]['note'] = $row['note'];
}
$i++;
}
unset($res);
// classement months
ksort($dateshours['months']);
ksort($dateshours['event']);
return $dateshours;
}
// }}}
// {{{ getRelationsArray()
/** Tableau des relations
*
* @access public
* @param string|int $type le type de champ
*/
public function getRelationsArray($type=null)
{
$array_types = array(
'idcontact' => array(
'type_join' => 'simple',
'dest_table' => 'contacts',
'join_field_src' => 'idcontact',
'fields' => array('idcontact','organisation','firstname','lastname','url_clean'),
'silent_delete_relation' => true,
'description' => 'Lieu de représentation associé à cette date',
)
);
if(!empty($array_types[$type])) {
$array_types[$type]['type'] = $type;
return $array_types[$type];
} else {
return $array_types;
}
}
// }}}
// {{{ getDateLieuCommon()
/** Code commun à getDateLieuDemain() et getDateLieuHier(),
* Liste des dates pour un spectacle
*
*
* @param string $type demain|hier
* @param int $idnew
* @param string $limit
* @param string $order ASC|DESC
* @access protected
* @return array
*/
public function getDateLieuCommon($type='demain',$idnew,$limit,$order)
{
if ($type=='demain') {
$expr = '>=';
} elseif($type=='hier') {
$expr = '<=';
} else {
$expr = 'tous';
}
//récupérer les informations et la date de début
$sql = 'SELECT DISTINCT(s.idnewschedule),s.note,s.hour,c.idcontact,c.organisation,c.phone1,c.phone2,c.city,c.url_clean,MIN(s.date) AS datedebut
FROM newschedules s,contacts c
WHERE s.idcontact=c.idcontact
AND s.idnew='.((int)$idnew);
if($expr!='tous') {
$sql .= ' AND s.date'.$expr.'\''.date('Y-m-d').'\'';
}
$sql .= ' GROUP BY s.idcontact ORDER BY s.date '.$order;
//$sql .= ' GROUP BY s.idcontact ORDER BY SIGN(DATEDIFF(NOW(), s.`date`)) ASC, ABS (DATEDIFF(NOW(), s.`date`)) ';
if(!empty($limit)) {
$sql .= ' LIMIT 0,'.((int)$limit);
}
//setDebug($sql);
//executer la requete
$datas = $this->query($sql);
//tableau de retour
$r = array();
// génération du calendrier
$fields_contact_select = array('city','url_clean','idcontact','organisation','phone1','phone2' );
//trouver la date de fin pour chaque spectacle
foreach($datas AS $data) {
$this->loadResult($data);
foreach($fields_contact_select as $f) {
if(isset($this->$f)) {
$r[$this->idnewschedule][$f] = $this->$f;
}
}
$r[$this->idnewschedule]['dateshours'] = $this->getDatesHours($idnew,$this->idcontact,$type);
$r[$this->idnewschedule]['event'] = $r[$this->idnewschedule]['dateshours']['event'];
$r[$this->idnewschedule]['months'] = $r[$this->idnewschedule]['dateshours']['months'];
// ne pas encombrer le tableau
unset($r[$this->idnewschedule]['dateshours']['months']);
unset($r[$this->idnewschedule]['dateshours']['event']);
// générer le calendrier
// première date
foreach($r[$this->idnewschedule]['event'] as $k=>$v) {
$calendar = new Calendar($v['date']);
break;
}
// highlight les dates
$i = 0;
foreach($r[$this->idnewschedule]['months'] as $k=>$v) {
if($i>0) {
$calendar = new Calendar($v['y'].'-'.$v['m'].'-01');
}
$calendar->highlighted_dates = $r[$this->idnewschedule]['event'];
$calendar->link_days = 2;
$calendar->formatted_link_to = "javascript:;";
$r[$this->idnewschedule]['calendar'][] = $calendar->output_calendar();
$i++;
}
}
$this->free();
//retourner le tableau
return $r;
}
// }}}
// {{{ deleteSchedule()
/** Supprimer toutes les dates pour une news et/ou un lieu
*
*
* @param int $idnew Identifiant de la news
* @param int $idcontact Identifiant du contact
* @access public
* @return array
*/
public function deleteSchedule($idnew,$idcontact=null)
{
$sql = 'DELETE FROM '.$this->__table.'
WHERE idnew='.(int)$idnew;
if(!empty($idcontact)) {
$sql .= ' AND idcontact='.(int)$idcontact;
}
return $this->execute($sql);
}
// }}}
}