<?php
namespace App\EventSubscribers\Login;
use App\Entity\Timetable;
use App\Entity\User;
use App\Services\TimetableService;
use App\Services\UserService;
use DateTimeImmutable;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Throwable;
class StartTimetableOnLoginSubscriber implements EventSubscriberInterface
{
/** @var TimetableService */
private TimetableService $timetableService;
/** @var UserService */
private UserService $userService;
public function __construct(TimetableService $timetableService, UserService $userService)
{
$this->timetableService = $timetableService;
$this->userService = $userService;
}
/**
* @param InteractiveLoginEvent $event
* @throws Throwable
*/
public function onInteractiveLogin(InteractiveLoginEvent $event)
{
try {
$user = $event->getAuthenticationToken()->getUser();
if ($user instanceof User) {
/** @var Timetable $lastTimetableRecord */
$lastTimetableRecord = $user->getTimetables()->last();
if (
!empty($lastTimetableRecord)
&& empty($lastTimetableRecord->getFinishDatetime())
&& (new DateTimeImmutable())->getTimestamp() - $lastTimetableRecord->getStartDatetime()->getTimestamp() < 120
) {
return;
}
if($user->isTimetableEnabled()){
if($user->getTimetables()->last()){
/** @var Timetable $lastTimetableRecord */
$lastTimetableRecord = $user->getTimetables()->last();
$day_start = $lastTimetableRecord->getStartDatetime()->format('d');
$day_diff = 0;
if (!is_null($user->getLastActionTime())) {
$day_last_action = $user->getLastActionTime()->format('d');
$day_diff = $day_last_action - $day_start;
}
$current_day = date("d", time());
$day_finish = $lastTimetableRecord->getStartDatetime()->format('Y-m-d') . ' ' . $user->getFinishWorkingTime() . ':00';
if ($day_diff > 0 || ($current_day - $day_start) > 0) {
$date_finish = (new DateTimeImmutable())->setTimestamp(strtotime($day_finish));
$this->timetableService->finish($user, $date_finish);
$this->userService->releaseCurrentCashdesk($user);
}
}
}
if (!empty($lastTimetableRecord) && empty($lastTimetableRecord->getFinishDatetime())) {
if (empty($user->getLastActionTime())) {
$this->timetableService->finish($user, $lastTimetableRecord->getStartDatetime());
} else {
$this->timetableService->finish($user, $user->getLastActionTime());
}
$this->userService->releaseCurrentCashdesk($user);
}
$this->timetableService->start($user);
}
} catch (Throwable $t) {
throw $t;
}
}
public static function getSubscribedEvents(): array
{
return [
SecurityEvents::INTERACTIVE_LOGIN => ["onInteractiveLogin", 100],
];
}
}