<?php
namespace App\EventSubscriber;
use App\Entity\AppointmentDate;
use App\Event\CreateDatesEvent;
use App\Repository\AppointmentDateRepository;
use App\Service\TimeSlotCreator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class DatesEventsSubscriber implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $manager,
private TimeSlotCreator $timeSlotCreator,
private AppointmentDateRepository $repository
) {
}
public static function getSubscribedEvents(): array
{
return [
CreateDatesEvent::NAME => 'dateCreation',
];
}
public function dateCreation(CreateDatesEvent $event): void
{
$dateToSave = null;
foreach ($event->getPostDates() as $postDate) {
$datetime = new \DateTime($postDate);
$existDate = $this->repository->findOneBy([
'date' => $datetime
]);
if(!$existDate) {
$start = new \DateTime($datetime->format('Y-m-d') . 'T' . $event->getDate()->getStartTime()->format('H:i'));
$end = new \DateTime($datetime->format('Y-m-d') . 'T' . $event->getDate()->getEndTime()->format('H:i'));
$startClose = null;
$endClose = null;
if($event->getDate()->getCloseStartTime() && $event->getDate()->getCloseEndTime()) {
$startClose = new \DateTime($datetime->format('Y-m-d') . 'T' . $event->getDate()->getCloseStartTime()->format('H:i'));
$endClose = new \DateTime($datetime->format('Y-m-d') . 'T' . $event->getDate()->getCloseEndTime()->format('H:i'));
}
$dateToSave = new AppointmentDate();
$dateToSave
->setDate($datetime)
->setStartTime($start)
->setEndTime($end)
->setCloseStartTime($startClose)
->setCloseEndTime($endClose)
;
$this->manager->persist($dateToSave);
$this->timeSlotCreator->generateSlots($dateToSave);
}
}
$event->setCreatedDate($dateToSave);
$this->manager->flush();
}
}