3 namespace Rapsys\AirBundle\Repository
; 
   5 use Symfony\Component\Translation\TranslatorInterface
; 
   6 use Doctrine\ORM\Query\ResultSetMapping
; 
  11 class SessionRepository 
extends \Doctrine\ORM\EntityRepository 
{ 
  13          * Find session by location, slot and date 
  15          * @param $location The location 
  16          * @param $slot The slot 
  17          * @param $date The datetime 
  19         public function findOneByLocationSlotDate($location, $slot, $date) { 
  21                 $ret = $this->getEntityManager() 
  22                         ->createQuery('SELECT s FROM RapsysAirBundle:Session s WHERE (s.location = :location AND s.slot = :slot AND s.date = :date)') 
  23                         ->setParameter('location', $location) 
  24                         ->setParameter('slot', $slot) 
  25                         ->setParameter('date', $date) 
  33          * Find sessions by date period 
  35          * @param $period The date period 
  37         public function findAllByDatePeriod($period) { 
  39                 $ret = $this->getEntityManager() 
  40                         ->createQuery('SELECT s FROM RapsysAirBundle:Session s WHERE s.date BETWEEN :begin AND :end') 
  41                         ->setParameter('begin', $period->getStartDate()) 
  42                         ->setParameter('end', $period->getEndDate()) 
  50          * Find sessions by location and date period 
  52          * @param $location The location 
  53          * @param $period The date period 
  55         public function findAllByLocationDatePeriod($location, $period) { 
  57                 $ret = $this->getEntityManager() 
  58                         ->createQuery('SELECT s FROM RapsysAirBundle:Session s WHERE (s.location = :location AND s.date BETWEEN :begin AND :end)') 
  59                         ->setParameter('location', $location) 
  60                         ->setParameter('begin', $period->getStartDate()) 
  61                         ->setParameter('end', $period->getEndDate()) 
  69          * Fetch sessions calendar with translated location by date period 
  71          * @param $translator The TranslatorInterface instance 
  72          * @param $period The date period 
  73          * @param $locationId The location id 
  74          * @param $sessionId The session id 
  75          * @param $granted The session is granted 
  77         public function fetchCalendarByDatePeriod(TranslatorInterface 
$translator, $period, $locationId = null, $sessionId = null, $granted = false) { 
  79                 $em = $this->getEntityManager(); 
  82                 $qs = $em->getConfiguration()->getQuoteStrategy(); 
  83                 $dp = $em->getConnection()->getDatabasePlatform(); 
  85                 //Get quoted table names 
  86                 //XXX: this allow to make this code table name independent 
  88                         'RapsysAirBundle:GroupUser' => $qs->getJoinTableName($em->getClassMetadata('RapsysAirBundle:User')->getAssociationMapping('groups'), $em->getClassMetadata('RapsysAirBundle:User'), $dp), 
  89                         'RapsysAirBundle:Session' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Session'), $dp), 
  90                         'RapsysAirBundle:Application' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Application'), $dp), 
  91                         'RapsysAirBundle:Group' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Group'), $dp), 
  92                         'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), 
  93                         'RapsysAirBundle:Slot' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Slot'), $dp), 
  94                         'RapsysAirBundle:User' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:User'), $dp) 
  98                 $req = 'SELECT s.id, s.date, s.location_id AS l_id, l.title AS l_title, s.slot_id AS t_id, t.title AS t_title, s.application_id AS a_id, a.user_id AS a_u_id, au.pseudonym AS a_u_pseudonym, GROUP_CONCAT(sa.user_id ORDER BY sa.user_id SEPARATOR "\n") AS as_u_id, GROUP_CONCAT(sau.pseudonym ORDER BY sa.user_id SEPARATOR "\n") AS as_u_pseudonym 
  99                         FROM RapsysAirBundle:Session AS s 
 100                         JOIN RapsysAirBundle:Location AS l ON (l.id = s.location_id) 
 101                         JOIN RapsysAirBundle:Slot AS t ON (t.id = s.slot_id) 
 102                         '.($granted?'':'LEFT ').'JOIN RapsysAirBundle:Application AS a ON (a.id = s.application_id) 
 103                         '.($granted?'':'LEFT ').'JOIN RapsysAirBundle:User AS au ON (au.id = a.user_id) 
 104                         LEFT JOIN RapsysAirBundle:Application AS sa ON (sa.session_id = s.id) 
 105                         LEFT JOIN RapsysAirBundle:User AS sau ON (sau.id = sa.user_id) 
 106                         WHERE s.date BETWEEN :begin AND :end 
 107                         '.($locationId?'AND s.location_id = :lid':'').' 
 111                 //Replace bundle entity name by table name 
 112                 $req = str_replace(array_keys($tables), array_values($tables), $req); 
 114                 //Get result set mapping instance 
 115                 //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php 
 116                 $rsm = new ResultSetMapping(); 
 119                 //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php 
 120                 //addScalarResult($sqlColName, $resColName, $type = 'string'); 
 121                 $rsm->addScalarResult('id', 'id', 'integer') 
 122                         ->addScalarResult('date', 'date', 'date') 
 123                         ->addScalarResult('t_id', 't_id', 'integer') 
 124                         ->addScalarResult('t_title', 't_title', 'string') 
 125                         ->addScalarResult('l_id', 'l_id', 'integer') 
 126                         ->addScalarResult('l_title', 'l_title', 'string') 
 127                         ->addScalarResult('a_id', 'a_id', 'integer') 
 128                         ->addScalarResult('a_u_id', 'a_u_id', 'integer') 
 129                         ->addScalarResult('a_u_pseudonym', 'a_u_pseudonym', 'string') 
 130                         //XXX: is a string because of \n separator 
 131                         ->addScalarResult('as_u_id', 'as_u_id', 'string') 
 132                         //XXX: is a string because of \n separator 
 133                         ->addScalarResult('as_u_pseudonym', 'as_u_pseudonym', 'string') 
 134                         ->addIndexByScalar('id'); 
 138                         ->createNativeQuery($req, $rsm) 
 139                         ->setParameter('begin', $period->getStartDate()) 
 140                         ->setParameter('end', $period->getEndDate()) 
 141                         ->setParameter('lid', $locationId) 
 150                 //Iterate on each day 
 151                 foreach($period as $date) { 
 152                         //Init day in calendar 
 153                         $calendar[$Ymd = $date->format('Ymd')] = [ 
 154                                 'title' => $date->format('d'), 
 159                         //Detect month change 
 160                         if ($month != $date->format('m')) { 
 161                                 $month = $date->format('m'); 
 162                                 //Append month for first day of month 
 163                                 //XXX: except if today to avoid double add 
 164                                 if ($date->format('U') != strtotime('today')) { 
 165                                         $calendar[$Ymd]['title'] .= '/'.$month; 
 169                         if ($date->format('U') == ($today = strtotime('today'))) { 
 170                                 $calendar[$Ymd]['title'] .= '/'.$month; 
 171                                 $calendar[$Ymd]['current'] = true; 
 172                                 $calendar[$Ymd]['class'][] =  'current'; 
 174                         //Disable passed days 
 175                         if ($date->format('U') < $today) { 
 176                                 $calendar[$Ymd]['disabled'] = true; 
 177                                 $calendar[$Ymd]['class'][] =  'disabled'; 
 179                         //Set next month days 
 180                         if ($date->format('m') > date('m')) { 
 181                                 $calendar[$Ymd]['next'] = true; 
 182                                 $calendar[$Ymd]['class'][] =  'next'; 
 185                         //Iterate on each session to find the one of the day 
 186                         foreach($res as $session) { 
 187                                 if (($sessionYmd = $session['date']->format('Ymd')) == $Ymd) { 
 188                                         //Count number of application 
 189                                         $count = count(explode("\n", $session['as_u_id'])); 
 193                                         if (!empty($session['a_id'])) { 
 194                                                 $applications = [ $session['a_u_id'] => $session['a_u_pseudonym'] ]; 
 195                                                 $class[] = 'granted'; 
 196                                         } elseif ($count == 0) { 
 197                                                 $class[] = 'orphaned'; 
 198                                         } elseif ($count > 1) { 
 199                                                 $class[] = 'disputed'; 
 201                                                 $class[] = 'pending'; 
 204                                         if ($sessionId == $session['id']) { 
 205                                                 $class[] = 'highlight'; 
 208                                         //Check that session is not granted 
 209                                         if (empty($session['a_id'])) { 
 210                                                 //Fetch pseudonyms from session applications 
 211                                                 $applications = array_combine(explode("\n", $session['as_u_id']), explode("\n", $session['as_u_pseudonym'])); 
 215                                         //XXX: see if we shouldn't prepend with 0 the slot and location to avoid collision ??? 
 216                                         $calendar[$Ymd]['sessions'][$session['t_id'].$session['l_id']] = [ 
 217                                                 'id' => $session['id'], 
 218                                                 'title' => $translator->trans($session['l_title']).' ('.$translator->trans($session['t_title']).')', 
 220                                                 'applications' => [ 0 => $translator->trans($session['t_title']).' '.$translator->trans('at '.$session['l_title']).($count > 1?' ['.$count.']':'') ]+
$applications 
 226                         ksort($calendar[$Ymd]['sessions']); 
 234          * Fetch sessions calendar with translated location by date period and user 
 236          * @param $translator The TranslatorInterface instance 
 237          * @param $period The date period 
 238          * @param $userId The user id 
 239          * @param $sessionId The session id 
 241         public function fetchUserCalendarByDatePeriod(TranslatorInterface 
$translator, $period, $userId = null, $sessionId = null) { 
 243                 $em = $this->getEntityManager(); 
 246                 $qs = $em->getConfiguration()->getQuoteStrategy(); 
 247                 $dp = $em->getConnection()->getDatabasePlatform(); 
 249                 //Get quoted table names 
 250                 //XXX: this allow to make this code table name independent 
 252                         'RapsysAirBundle:GroupUser' => $qs->getJoinTableName($em->getClassMetadata('RapsysAirBundle:User')->getAssociationMapping('groups'), $em->getClassMetadata('RapsysAirBundle:User'), $dp), 
 253                         'RapsysAirBundle:Session' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Session'), $dp), 
 254                         'RapsysAirBundle:Application' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Application'), $dp), 
 255                         'RapsysAirBundle:Group' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Group'), $dp), 
 256                         'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), 
 257                         'RapsysAirBundle:Slot' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Slot'), $dp), 
 258                         'RapsysAirBundle:User' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:User'), $dp) 
 262                 $req = 'SELECT s.id, s.date, s.location_id AS l_id, l.title AS l_title, s.slot_id AS t_id, t.title AS t_title, s.application_id AS a_id, a.user_id AS a_u_id, au.pseudonym AS a_u_pseudonym, GROUP_CONCAT(sa.user_id ORDER BY sa.user_id SEPARATOR "\n") AS as_u_id, GROUP_CONCAT(sau.pseudonym ORDER BY sa.user_id SEPARATOR "\n") AS as_u_pseudonym 
 263                         FROM RapsysAirBundle:Session AS s 
 264                         JOIN RapsysAirBundle:Location AS l ON (l.id = s.location_id) 
 265                         JOIN RapsysAirBundle:Slot AS t ON (t.id = s.slot_id) 
 266                         LEFT JOIN RapsysAirBundle:Application AS a ON (a.id = s.application_id) 
 267                         LEFT JOIN RapsysAirBundle:User AS au ON (au.id = a.user_id) 
 268                         LEFT JOIN RapsysAirBundle:Application AS sa ON (sa.session_id = s.id) 
 269                         LEFT JOIN RapsysAirBundle:User AS sau ON (sau.id = sa.user_id) 
 270                         WHERE s.date BETWEEN :begin AND :end 
 271                         '.($userId?' AND sa.user_id = :uid':'').' 
 275                 //Replace bundle entity name by table name 
 276                 $req = str_replace(array_keys($tables), array_values($tables), $req); 
 278                 //Get result set mapping instance 
 279                 //XXX: DEBUG: see ../blog.orig/src/Rapsys/BlogBundle/Repository/ArticleRepository.php 
 280                 $rsm = new ResultSetMapping(); 
 283                 //XXX: see vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Types.php 
 284                 //addScalarResult($sqlColName, $resColName, $type = 'string'); 
 285                 $rsm->addScalarResult('id', 'id', 'integer') 
 286                         ->addScalarResult('date', 'date', 'date') 
 287                         ->addScalarResult('t_id', 't_id', 'integer') 
 288                         ->addScalarResult('t_title', 't_title', 'string') 
 289                         ->addScalarResult('l_id', 'l_id', 'integer') 
 290                         ->addScalarResult('l_title', 'l_title', 'string') 
 291                         ->addScalarResult('a_id', 'a_id', 'integer') 
 292                         ->addScalarResult('a_u_id', 'a_u_id', 'integer') 
 293                         ->addScalarResult('a_u_pseudonym', 'a_u_pseudonym', 'string') 
 294                         //XXX: is a string because of \n separator 
 295                         ->addScalarResult('as_u_id', 'as_u_id', 'string') 
 296                         //XXX: is a string because of \n separator 
 297                         ->addScalarResult('as_u_pseudonym', 'as_u_pseudonym', 'string') 
 298                         ->addIndexByScalar('id'); 
 302                         ->createNativeQuery($req, $rsm) 
 303                         ->setParameter('begin', $period->getStartDate()) 
 304                         ->setParameter('end', $period->getEndDate()) 
 305                         ->setParameter('uid', $userId) 
 314                 //Iterate on each day 
 315                 foreach($period as $date) { 
 316                         //Init day in calendar 
 317                         $calendar[$Ymd = $date->format('Ymd')] = [ 
 318                                 'title' => $date->format('d'), 
 323                         //Detect month change 
 324                         if ($month != $date->format('m')) { 
 325                                 $month = $date->format('m'); 
 326                                 //Append month for first day of month 
 327                                 //XXX: except if today to avoid double add 
 328                                 if ($date->format('U') != strtotime('today')) { 
 329                                         $calendar[$Ymd]['title'] .= '/'.$month; 
 333                         if ($date->format('U') == ($today = strtotime('today'))) { 
 334                                 $calendar[$Ymd]['title'] .= '/'.$month; 
 335                                 $calendar[$Ymd]['current'] = true; 
 336                                 $calendar[$Ymd]['class'][] =  'current'; 
 338                         //Disable passed days 
 339                         if ($date->format('U') < $today) { 
 340                                 $calendar[$Ymd]['disabled'] = true; 
 341                                 $calendar[$Ymd]['class'][] =  'disabled'; 
 343                         //Set next month days 
 344                         if ($date->format('m') > date('m')) { 
 345                                 $calendar[$Ymd]['next'] = true; 
 346                                 $calendar[$Ymd]['class'][] =  'next'; 
 349                         //Iterate on each session to find the one of the day 
 350                         foreach($res as $session) { 
 351                                 if (($sessionYmd = $session['date']->format('Ymd')) == $Ymd) { 
 352                                         //Count number of application 
 353                                         $count = count(explode("\n", $session['as_u_id'])); 
 357                                         if (!empty($session['a_id'])) { 
 358                                                 $applications = [ $session['a_u_id'] => $session['a_u_pseudonym'] ]; 
 359                                                 if ($session['a_u_id'] == $userId) { 
 360                                                         $class[] = 'granted'; 
 362                                                         $class[] = 'disputed'; 
 364                                         } elseif ($count == 0) { 
 365                                                 $class[] = 'orphaned'; 
 366                                         } elseif ($count > 1) { 
 367                                                 $class[] = 'disputed'; 
 369                                                 $class[] = 'pending'; 
 372                                         if ($sessionId == $session['id']) { 
 373                                                 $class[] = 'highlight'; 
 376                                         //Check that session is not granted 
 377                                         if (empty($session['a_id'])) { 
 378                                                 //Fetch pseudonyms from session applications 
 379                                                 $applications = array_combine(explode("\n", $session['as_u_id']), explode("\n", $session['as_u_pseudonym'])); 
 383                                         //XXX: see if we shouldn't prepend with 0 the slot and location to avoid collision ??? 
 384                                         $calendar[$Ymd]['sessions'][$session['t_id'].$session['l_id']] = [ 
 385                                                 'id' => $session['id'], 
 386                                                 'title' => $translator->trans($session['l_title']).' ('.$translator->trans($session['t_title']).')', 
 388                                                 'applications' => [ 0 => $translator->trans($session['t_title']).' '.$translator->trans('at '.$session['l_title']).($count > 1?' ['.$count.']':'') ]+
$applications 
 394                         ksort($calendar[$Ymd]['sessions']);