<?php
namespace App\EventListener;
namespace App\EventListener;
use App\Event\Vacation\VacationAddedEvent;
use App\Event\Vacation\VacationDeletedEvent;
use App\Repository\AvailableDayRepository;
use DateInterval;
use DatePeriod;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpClient\HttpClient;
class VacationListener
{
private $availableDayRepository;
private $entityManager;
public function __construct(AvailableDayRepository $availableDayRepository, EntityManagerInterface $entityManager)
{
$this->availableDayRepository = $availableDayRepository;
$this->entityManager = $entityManager;
}
public function onVacationAdded(VacationAddedEvent $event)
{
$vacation = $event->getVacation();
$user = $vacation->getUser();
$url = "https://calendar.kuzyak.in/api/calendar/{$vacation->getDateFrom()->format('Y')}/holidays";
$response = HttpClient::create()->request('GET', $url);
$daysOff = json_decode($response->getContent(), true, 512, \JSON_BIGINT_AS_STRING | \JSON_THROW_ON_ERROR);
$holidaysDate = array_map(function ($holiday) {
$date = new DateTime($holiday['date']);
return $date->format('Y-m-d');
}, $daysOff['holidays']);
$datePeriod = new DatePeriod($vacation->getDateFrom(), new DateInterval('P1D'), (clone $vacation->getDateTo())->modify('+1 day'));
$requestedDays = 0;
foreach ($datePeriod as $date) {
// Исключаем праздники
if (in_array($date->format('Y-m-d'), $holidaysDate)) {
continue;
}
// Исключаем выходные
if ($date->format('N') >= 6) {
continue;
}
$requestedDays++;
}
$availableDays = $this->availableDayRepository->findOneBy(['user' => $user]);
$availableDays->setDays($availableDays->getDays() - $requestedDays);
$this->entityManager->persist($availableDays);
$this->entityManager->flush();
}
public function onVacationDeleted(VacationDeletedEvent $event)
{
$vacation = $event->getVacation();
$user = $vacation->getUser();
$daysToAdd = $vacation->getDateFrom()->diff($vacation->getDateTo())->days + 1;
$availableDays = $this->availableDayRepository->findOneBy(['user' => $user]);
$availableDays->setDays($availableDays->getDays() + $daysToAdd);
$this->entityManager->persist($availableDays);
$this->entityManager->flush();
}
}