<?php
namespace App\Calendar;
use App\Repository\LeaveMCRecordRepository;
use App\Repository\LeaveRequestRepository;
use App\Repository\LeaveBankHolidayRepository;
use CalendarBundle\CalendarEvents;
use CalendarBundle\Entity\Event;
use CalendarBundle\Event\CalendarEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class CalendarSubscriber implements EventSubscriberInterface
{
private $leaveMCRecordRepository;
private $leaveRequestRepository;
private $leaveBankHolidayRepository;
private $router;
public function __construct(
LeaveMCRecordRepository $leaveMCRecordRepository,
LeaveRequestRepository $leaveRequestRepository,
LeaveBankHolidayRepository $leaveBankHolidayRepository,
UrlGeneratorInterface $router
) {
$this->leaveMCRecordRepository = $leaveMCRecordRepository;
$this->leaveRequestRepository = $leaveRequestRepository;
$this->leaveBankHolidayRepository = $leaveBankHolidayRepository;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [
CalendarEvents::SET_DATA => 'onCalendarSetData',
];
}
public function onCalendarSetData(CalendarEvent $calendar)
{
$start = $calendar->getStart();
$end = $calendar->getEnd();
$filters = $calendar->getFilters();
switch ($filters['calendar-id']) {
case 'mt-calendar':
$this->fillMtCalendar($calendar, $start, $end, $filters);
break;
case 'user-calendar':
$this->fillUserCalendar($calendar, $start, $end, $filters);
break;
case 'admin-calendar':
$this->fillAdminCalendar($calendar, $start, $end, $filters);
break;
}
}
public function fillMtCalendar(CalendarEvent $calendar, \DateTimeInterface $start, \DateTimeInterface $end, array $filters)
{
$mcs = $this->leaveRequestRepository
->createQueryBuilder('l')
->where('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
//->andWhere('l.isApproved = 1')
$requests = $this->leaveRequestRepository
->createQueryBuilder('l')
->where('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.isApproved = 1')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
$otherLeaves = $this->leaveRequestRepository
->createQueryBuilder('l')
->where('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.isApproved = 1')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
$holidays = $this->leaveBankHolidayRepository
->createQueryBuilder('l')
->where('l.date BETWEEN :start and :end')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
foreach ($mcs as $mc) {
if ($mc->getLeaveType()->getAttributes()['label'] == 'Sick') {
$title = $mc->getUser()->getOffice()->getCountry() . ' - MC - ' . $mc->getUser()->getPersonalInfo()->getFullName();
$start = $mc->getStartDate();
$start = $start->format('Y-m-d');
$isHalfStart = $mc->getIsHalfStart();
$end = $mc->getEndDate();
$end = $end->format('Y-m-d');
$isHalfEnd = $mc->getIsHalfEnd();
if ($isHalfStart){
$start = date('Y-m-d 13:00:00',strtotime($start));
$end = date('Y-m-d 18:00:00',strtotime($end));
}
if($isHalfEnd){
$end = date('Y-m-d 13:00:00',strtotime($end));
$start = date('Y-m-d 09:00:00',strtotime($start));
}
$mcEvent = new Event(
$title,
new \DateTime($start),
new \DateTime($end)
);
$mcEvent->setOptions([
'backgroundColor' => '#616161',
'borderColor' => '#616161',
'allDay' => ($isHalfStart == false & $isHalfEnd == false) ? true : false,
]);
$calendar->addEvent($mcEvent);
}
}
foreach ($otherLeaves as $otherLeave) {
if ($otherLeave->getLeaveType()->getAttributes()['label'] != 'Sick' && $otherLeave->getLeaveType()->getAttributes()['label'] != 'Annual') {
$title = $otherLeave->getUser()->getOffice()->getCountry() . ' - ' . ucwords($otherLeave->getLeaveType()->getLeaveName()) . ' - ' . $otherLeave->getUser()->getPersonalInfo()->getFullName();
$start = $otherLeave->getStartDate();
$start = $start->format('Y-m-d');
$isHalfStart = $otherLeave->getIsHalfStart();
$end = $otherLeave->getEndDate();
$end = $end->format('Y-m-d');
$isHalfEnd = $otherLeave->getIsHalfEnd();
if ($isHalfStart){
$start = date('Y-m-d 13:00:00',strtotime($start));
$end = date('Y-m-d 18:00:00',strtotime($end));
}
if($isHalfEnd){
$end = date('Y-m-d 13:00:00',strtotime($end));
$start = date('Y-m-d 09:00:00',strtotime($start));
}
$otherLeaveEvent = new Event(
$title,
new \DateTime($start),
new \DateTime($end)
);
$otherLeaveEvent->setOptions([
'backgroundColor' => '#8e24aa',
'borderColor' => '#8e24aa',
'allDay' => ($isHalfStart == false & $isHalfEnd == false) ? true : false,
]);
$calendar->addEvent($otherLeaveEvent);
}
}
foreach ($holidays as $holiday) {
$title = $holiday->getLocation() . ' - ' . $holiday->getDescription();
$start = $holiday->getDate();
$end = is_null($holiday->getEndDate()) ? $holiday->getDate() : $holiday->getEndDate();
$holidayEvent = new Event(
$title,
$start,
$end,
);
$holidayEvent->setOptions([
'backgroundColor' => '#f5511d',
'borderColor' => '#f5511d',
'allDay' => true
]);
$calendar->addEvent($holidayEvent);
}
foreach ($requests as $request) {
if ($request->getLeaveType()->getAttributes()['label'] == 'Annual') {
$requestEvent = new Event(
$request->getUser()->getOffice()->getCountry() . ' - Annual - ' . $request->getUser()->getPersonalInfo()->getFullName(),
$request->getStartDate(),
$request->getEndDate()->modify('+1 day')
);
$requestEvent->setOptions([
'backgroundColor' => '#7986cb',
'borderColor' => '#7986cb',
]);
$calendar->addEvent($requestEvent);
}
}
}
public function fillUserCalendar(CalendarEvent $calendar, \DateTimeInterface $start, \DateTimeInterface $end, array $filters)
{
}
public function fillAdminCalendar(CalendarEvent $calendar, \DateTimeInterface $start, \DateTimeInterface $end, array $filters)
{
$mcs = $this->leaveMCRecordRepository
->createQueryBuilder('l')
->where('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.isJustified = 1')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
$requests = $this->leaveRequestRepository
->createQueryBuilder('l')
->where('l.startDate BETWEEN :start and :end OR l.endDate BETWEEN :start and :end')
->andWhere('l.isApproved = 1')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
$holidays = $this->leaveBankHolidayRepository
->createQueryBuilder('l')
->where('l.date BETWEEN :start and :end')
->setParameter('start', $start->format('Y-m-d H:i:s'))
->setParameter('end', $end->format('Y-m-d H:i:s'))
->getQuery()
->getResult();
foreach ($mcs as $mc) {
$mcEvent = new Event(
$mc->getUser()->getOffice()->getCountry() . ' - mc - ' . $mc->getUser()->getPersonalInfo()->getFullName(),
$mc->getStartDate(),
$mc->getEndDate()->modify('+1 day')
);
$mcEvent->setOptions([
'backgroundColor' => 'red',
'borderColor' => 'red',
]);
$calendar->addEvent($mcEvent);
}
foreach ($holidays as $holiday) {
$holidayEvent = new Event(
$holiday->getLocation() . ' - ' . $holiday->getDescription(),
$holiday->getDate(),
);
$holidayEvent->setOptions([
'backgroundColor' => 'blue',
'borderColor' => 'blue',
]);
$calendar->addEvent($holidayEvent);
}
foreach ($requests as $request) {
$requestEvent = new Event(
$request->getUser()->getOffice()->getCountry() . ' - leave - ' . $request->getUser()->getPersonalInfo()->getFullName(),
$request->getStartDate(),
$request->getEndDate()->modify('+1 day')
);
$requestEvent->setOptions([
'backgroundColor' => 'green',
'borderColor' => 'green',
]);
$calendar->addEvent($requestEvent);
}
}
}