src/Controller/TimetableController.php line 62

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller;
  4. use App\Entity\Roles;
  5. use App\Entity\Timetable;
  6. use App\Entity\User;
  7. use App\Services\ClubService;
  8. use App\Services\SessionService;
  9. use App\Services\TimetableService;
  10. use App\Services\UserService;
  11. use App\ValueObjects\Timetable\TimetableFilter;
  12. use DateTimeImmutable;
  13. use DateTime;
  14. use Exception;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. use Throwable;
  23. use Webmozart\Assert\Assert;
  24. use Doctrine\ORM\EntityManagerInterface;
  25. /**
  26.  * Class TimetableController
  27.  * @package App\Controller
  28.  * @IsGranted ("ROLE_USER")
  29.  */
  30. class TimetableController extends AbstractController
  31. {
  32.     /** @var UserService */
  33.     private UserService $userService;
  34.     /** @var TranslatorInterface */
  35.     private TranslatorInterface $translator;
  36.     /** @var TimetableService */
  37.     private TimetableService $timetableService;
  38.     /** @var SessionService */
  39.     private SessionService $sessionService;
  40.     /** @var ClubService */
  41.     private ClubService $clubService;
  42.     private string $projectName;
  43.     public function __construct(UserService $userServiceTimetableService $timetableServiceTranslatorInterface $translatorSessionService $sessionServiceClubService $clubServicestring $projectNameEntityManagerInterface $entityManager)
  44.     {
  45.         $this->userService $userService;
  46.         $this->translator $translator;
  47.         $this->timetableService $timetableService;
  48.         $this->sessionService $sessionService;
  49.         $this->clubService $clubService;
  50.         $this->projectName $projectName;
  51.         $this->entityManager $entityManager;
  52.     }
  53.     /**
  54.      * @Route(name="app_timetable_check_online", path="/users/healthcheck/online/check", methods={"GET"})
  55.      */
  56.     public function checkOnline(): JsonResponse
  57.     {
  58.         try {
  59.             /** @var User $user */
  60.             $user $this->getUser();
  61.             Assert::notEmpty($user$this->translator->trans('User not found'));
  62.             if (is_null($user->getLastActionTime())) {
  63.                 $this->sessionService->invalidateAllUsersSessions($user);
  64.                 throw new Exception($this->translator->trans("Session expired. Please, login again"));
  65.             }
  66.             if($user->isTimetableEnabled()){
  67.                 /** @var Timetable $lastTimetableRecord */
  68.                 $lastTimetableRecord $user->getTimetables()->last();
  69.                 $currentTime = (new DateTime())->format("H:i");
  70.                 if($currentTime $user->getFinishWorkingTime()){
  71.                     throw new Exception($this->translator->trans("User don't use cashdesk now"));
  72.                 }
  73.                 $day_start $lastTimetableRecord->getStartDatetime()->format('d');
  74.                 $day_diff 0;
  75.                 if(!is_null($user->getLastActionTime())){
  76.                     $day_last_action $user->getLastActionTime()->format('d');
  77.                     $day_diff $day_last_action $day_start;
  78.                 }
  79.                 $current_day date("d"time());
  80.                 $day_finish $lastTimetableRecord->getStartDatetime()->format('Y-m-d') .' '$user->getFinishWorkingTime() . ':00';
  81.                 if($day_diff || ($current_day $day_start) > 0){
  82.                     $date_finish = (new DateTimeImmutable())->setTimestamp(strtotime($day_finish));
  83.                     $this->userService->clearLastActionTime($user);
  84.                     $this->timetableService->finish($user$date_finish);
  85.                     $this->sessionService->invalidateAllUsersSessions($user);
  86.                     throw new Exception($this->translator->trans("Session expired. Please, login again"));
  87.                 }
  88.             }
  89.             if ($this->timetableService->isUserLogoutRequired($user) || !$user->isWorkingTimeNow()) {
  90.                 $this->userService->releaseCurrentCashdesk($user);
  91.                 $this->userService->clearLastActionTime($user);
  92.                 $this->timetableService->finish($user);
  93.                 $this->sessionService->invalidateAllUsersSessions($user);
  94.                 throw new Exception($this->translator->trans("Session expired. Please, login again"));
  95.             }
  96.             if ($this->timetableService->isUserActionRequired($user)) {
  97.                 $response = [
  98.                     'success' => true,
  99.                     'actionRequired' => true,
  100.                     'soundRequired' => true,
  101.                 ];
  102.                 return new JsonResponse($response);
  103.             }
  104.             return new JsonResponse(
  105.                 [
  106.                     'success' => true,
  107.                 ]
  108.             );
  109.         } catch (Throwable $t) {
  110.             return new JsonResponse([
  111.                 'success' => false,
  112.                 'message' => $t->getMessage()
  113.             ]);
  114.         }
  115.     }
  116.     /**
  117.      * @Route(name="app_timetable_confirm_online", path="/users/healthcheck/online/confirm", methods={"POST"})
  118.      */
  119.     public function confirmOnline(): JsonResponse
  120.     {
  121.         try {
  122.             /** @var User $user */
  123.             $user $this->getUser();
  124.             Assert::notEmpty($user$this->translator->trans('User not found'));
  125.             if (is_null($user->getLastActionTime())) {
  126.                 $this->sessionService->invalidateAllUsersSessions($user);
  127.                 throw new Exception($this->translator->trans("Session expired. Please, login again"));
  128.             }
  129.             if($user->isTimetableEnabled()){
  130.                 /** @var Timetable $lastTimetableRecord */
  131.                 $lastTimetableRecord $user->getTimetables()->last();
  132.                 $currentTime = (new DateTime())->format("H:i");
  133.                 if($currentTime $user->getFinishWorkingTime()){
  134.                     throw new Exception($this->translator->trans("User don't use cashdesk now"));
  135.                 }
  136.                 $day_start $lastTimetableRecord->getStartDatetime()->format('d');
  137.                 $day_diff 0;
  138.                 if(!is_null($user->getLastActionTime())){
  139.                     $day_last_action $user->getLastActionTime()->format('d');
  140.                     $day_diff $day_last_action $day_start;
  141.                 }
  142.                 $current_day date("d"time());
  143.                 $day_finish $lastTimetableRecord->getStartDatetime()->format('Y-m-d') .' '$user->getFinishWorkingTime() . ':00';
  144.                 if($day_diff || ($current_day $day_start) > 0){
  145.                     $date_finish = (new DateTimeImmutable())->setTimestamp(strtotime($day_finish));
  146.                     $this->userService->clearLastActionTime($user);
  147.                     $this->timetableService->finish($user$date_finish);
  148.                     $this->sessionService->invalidateAllUsersSessions($user);
  149.                     throw new Exception($this->translator->trans("Session expired. Please, login again"));
  150.                 }
  151.             }
  152.             if ($this->timetableService->isUserLogoutRequired($user)) {
  153.                 $this->userService->releaseCurrentCashdesk($user);
  154.                 $this->userService->clearLastActionTime($user);
  155.                 $this->timetableService->finish($user);
  156.                 $this->sessionService->invalidateAllUsersSessions($user);
  157.                 throw new Exception($this->translator->trans("Session expired. Please, login again"));
  158.             }
  159.             $this->userService->updateLastActionTime($user);
  160.             return new JsonResponse(
  161.                 [
  162.                     'success' => true,
  163.                 ]
  164.             );
  165.         } catch (Throwable $t) {
  166.             return new JsonResponse([
  167.                 'success' => false,
  168.                 'message' => $t->getMessage()
  169.             ]);
  170.         }
  171.     }
  172.     /**
  173.      * @Route(name="app_timetable_personal_report", path="/report/timetables/personal")
  174.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  175.      * @param Request $request
  176.      * @return Response
  177.      */
  178.     public function personalReport(Request $request): Response
  179.     {
  180.         /** @var User $currentUser */
  181.         $currentUser $this->getUser();
  182.         $yesterday time() - 60 60 24 30;
  183.         $filterStartDate $request->request->has("start_date") ? strtotime(filter_var($request->request->get("start_date"), FILTER_SANITIZE_STRING)) : mktime(000intval(date('m'$yesterday)), intval(date('d'$yesterday)), intval(date('Y'$yesterday)));
  184.         $filterFinishDate $request->request->has("finish_date") ? strtotime(filter_var($request->request->get("finish_date"), FILTER_SANITIZE_STRING)) : mktime(235959intval(date('m')), intval(date('d')), intval(date('Y')));
  185.         $filterUserId $request->request->getInt('user_id');
  186.         $export $request->request->get('export'false);
  187.         $filter = new TimetableFilter();
  188.         $filter
  189.             ->setAllowedUsersList($currentUser->getAllowedUsersId())
  190.             ->setStartDate($filterStartDate)
  191.             ->setFinishDate($filterFinishDate)
  192.             ->setMinimalDuration(10)
  193.             ->setUserId($filterUserId);
  194.         if (!empty($filterUserId)) {
  195.             Assert::inArray($filterUserId$currentUser->getAllowedUsersId(), $this->translator->trans('Access denied'));
  196.         }
  197.         $personalReport $this->timetableService->getPersonalReport($filter);
  198.         if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  199.             $this->timetableService->personalExportToXls($personalReport);
  200.         }
  201.         return $this->render('timetables/personal_report/index.html.twig', [
  202.             'filter' => $filter,
  203.             'users' => $this->userService->getAllowedUsersList(),
  204.             'personalReport' => $personalReport,
  205.         ]);
  206.     }
  207.     /**
  208.      * @Route(name="app_timetable_full_report", path="/report/timetables/full")
  209.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  210.      * @param Request $request
  211.      * @return Response
  212.      */
  213.     public function fullReport(Request $request): Response
  214.     {
  215.         /** @var User $currentUser */
  216.         $currentUser $this->getUser();
  217.         $submit $request->request->getInt('submit');
  218.         $filterYear $request->request->getInt('year'intval(date('Y')));
  219.         $filterMonth $request->request->getInt('month'intval(date('m')));
  220.         $export $request->request->get('export'false);
  221.         $clubs $request->request->get('clubs');
  222.         $fullReport = [];
  223.         $filter = new TimetableFilter();
  224.         if (!empty($submit) || !empty($export)) {
  225.             $monthStart mktime(000$filterMonth1$filterYear);
  226.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  227.             $filter
  228.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  229.                 ->setClubsList($clubs)
  230.                 ->setAllowedUsersList($currentUser->getAllowedUsersId())
  231.                 ->setYear($filterYear)
  232.                 ->setMonth($filterMonth)
  233.                 ->setStartDate($monthStart)
  234.                 ->setFinishDate($monthFinish);
  235.             $fullReport $this->timetableService->getFullReport($filter);
  236.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  237.                 $this->timetableService->fullExportToXls($fullReport$this->clubService);
  238.             }
  239.         }
  240.         return $this->render('timetables/full_report/index.html.twig', [
  241.             'filter' => $filter,
  242.             'users' => $this->userService->getAllowedUsersList(),
  243.             'clubs' => $this->clubService->getAllowedClubsList(),
  244.             'years' => [date('Y'), date('Y') - 1],
  245.             'fullReport' => $fullReport,
  246.         ]);
  247.     }
  248.     /**
  249.      * @Route(name="app_timetable_full_report_new", path="/report/timetables/full_new")
  250.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  251.      * @param Request $request
  252.      * @return Response
  253.      */
  254.     public function fullReportNew(Request $request): Response
  255.     {
  256.         /** @var User $currentUser */
  257.         $currentUser $this->getUser();
  258.         $submit $request->request->getInt('submit');
  259.         $filterYear $request->request->getInt('year'intval(date('Y')));
  260.         $filterMonth $request->request->getInt('month'intval(date('m')));
  261.         $export $request->request->get('export'false);
  262.         $clubs $request->request->get('clubs');
  263.         $fullReport = [];
  264.         $filter = new TimetableFilter();
  265.         if (!empty($submit) || !empty($export)) {
  266.             $monthStart mktime(000$filterMonth1$filterYear);
  267.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  268.             $filter
  269.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  270.                 ->setClubsList($clubs)
  271.                 ->setAllowedUsersList($currentUser->getAllowedUsersId())
  272.                 ->setYear($filterYear)
  273.                 ->setMonth($filterMonth)
  274.                 ->setStartDate($monthStart)
  275.                 ->setFinishDate($monthFinish);
  276.             $fullReport $this->timetableService->getFullReportNew($filter);
  277.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  278.                 $this->timetableService->fullNewExportToXls($fullReport$this->clubService);
  279.             }
  280.         }
  281.         return $this->render('timetables/full_report_new/index.html.twig', [
  282.             'filter' => $filter,
  283.             'users' => $this->userService->getAllowedUsersList(),
  284.             'clubs' => $this->clubService->getAllowedClubsList(),
  285.             'years' => [date('Y'), date('Y') - 1],
  286.             'fullReport' => $fullReport,
  287.         ]);
  288.     }
  289.     /**
  290.      * @Route(name="app_timetable_full_report_hours_worked", path="/report/timetables/full_hours_worked")
  291.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  292.      * @param Request $request
  293.      * @return Response
  294.      */
  295.     public function fullReportHoursWorked(Request $request): Response
  296.     {
  297.         /** @var User $currentUser */
  298.         $currentUser $this->getUser();
  299.         $submit $request->request->getInt('submit');
  300.         $filterYear $request->request->getInt('year'intval(date('Y')));
  301.         $filterMonth $request->request->getInt('month'intval(date('m')));
  302.         $export $request->request->get('export'false);
  303.         $clubs $request->request->get('clubs');
  304.         $fullReport $cashier_payments = [];
  305.         $filter = new TimetableFilter();
  306.         if (!empty($submit) || !empty($export)) {
  307.             $monthStart mktime(000$filterMonth1$filterYear);
  308.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  309.             $filter
  310.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  311.                 ->setClubsList($clubs)
  312.                 ->setAllowedUsersList($currentUser->getAllowedUsersId())
  313.                 ->setYear($filterYear)
  314.                 ->setMonth($filterMonth)
  315.                 ->setStartDate($monthStart)
  316.                 ->setFinishDate($monthFinish);
  317.             $fullReport $this->timetableService->getFullReport($filter);
  318.             $cashier_payments $this->timetableService->getCashierPayments($filter);
  319.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  320.                 $this->timetableService->fullHoursWorkedExportToXls($fullReport$cashier_payments$this->clubService);
  321.             }
  322.         }
  323.         return $this->render('timetables/full_report/index_hours_worked.html.twig', [
  324.             'filter' => $filter,
  325.             'users' => $this->userService->getAllowedUsersList(),
  326.             'clubs' => $this->clubService->getAllowedClubsList(),
  327.             'years' => [date('Y'), date('Y') - 1],
  328.             'fullReport' => $fullReport,
  329.             'cashier_payments' => $cashier_payments,
  330.         ]);
  331.     }
  332.     /**
  333.      * @Route(name="app_timetable_last_active", path="/report/timetables/last_active")
  334.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  335.      * @param Request $request
  336.      * @return Response
  337.      */
  338.     public function ReportWorkLastActive(Request $request): Response
  339.     {
  340.         /** @var User $currentUser */
  341.         $currentUser $this->getUser();
  342.         $yesterday time() - 60 60 24;
  343.         $filterStartDate $request->request->has("start_date") ? strtotime(filter_var($request->request->get("start_date"), FILTER_SANITIZE_STRING)) : mktime(000intval(date('m'$yesterday)), intval(date('d'$yesterday)), intval(date('Y'$yesterday)));
  344.         $filterFinishDate $request->request->has("finish_date") ? strtotime(filter_var($request->request->get("finish_date"), FILTER_SANITIZE_STRING)) : mktime(235959intval(date('m')), intval(date('d')), intval(date('Y')));
  345.         $filterUserList $request->request->get('users') ?? [];
  346.         $filterClubList $request->request->get('clubs') ?? [];
  347.         $export $request->request->get('export'false);
  348.         $filter = new TimetableFilter();
  349.         $filter
  350.             ->setAllowedUsersList($currentUser->getAllowedUsersId())
  351.             ->setAllowedClubsList($currentUser->getAllowedClubsId())
  352.             ->setStartDate($filterStartDate)
  353.             ->setFinishDate($filterFinishDate);
  354.         //        if($this->projectName != "ground_cashdesk_dom"){
  355. //            die;
  356. //        }
  357.         /*timetables*/
  358.         $timetables $timetables_tmp $payments = [];
  359.         if(sizeof($filterUserList) > || sizeof($filterClubList) > 0) {
  360.             $sql "SELECT
  361.                 `users`.`username` AS `username`, `clubs`.`title` AS `clubtitle`, `timetables`.*
  362.                 FROM `timetables`
  363.                 LEFT JOIN `users` ON `users`.id = `timetables`.`user_id`
  364.                 LEFT JOIN `clubs` ON `clubs`.id = `timetables`.`club_id`
  365.                 WHERE `start_datetime` >= '".date('Y-m-d H:i:s'$filterStartDate)."'
  366.                 AND `finish_datetime` <= '".date('Y-m-d H:i:s'$filterFinishDate)."'
  367.                 AND `duration` > 10";
  368.             if (sizeof($filterUserList) > 0) {
  369.                 $sql .= " AND user_id IN (" implode(', '$filterUserList) . ")";
  370.             }
  371.             if (sizeof($filterClubList) > 0) {
  372.                 $sql .= " AND club_id IN (" implode(', '$filterClubList) . ")";
  373.             }
  374.             $prepareStatement $this->entityManager->getConnection()->prepare($sql);
  375.             $result $prepareStatement->executeQuery();
  376.             if ($result->rowCount() > 0) {
  377.                 $row $result->fetchAllAssociative();
  378.                 foreach ($row as $value) {
  379.                     $timetables_tmp[$value["user_id"]][date("Y-m-d"strtotime($value["start_datetime"]))][] = $value;
  380.                 }
  381.             }
  382.             foreach ($timetables_tmp as $user_id => $val) {
  383.                 foreach ($val as $day => $value) {
  384.                     foreach ($value as $item) {
  385.                         $timetables[$user_id][$day]["timetable"][$item["start_datetime"]] = [
  386.                             "start" => $item["start_datetime"],
  387.                             "finish" => $item["finish_datetime"],
  388.                             "sql" => " AND `opdate` BETWEEN '".$item["start_datetime"]."' AND '".$item["finish_datetime"]."'"
  389.                         ];
  390.                         $timetables[$user_id][$day]["username"] = $item["username"];
  391.                         $timetables[$user_id][$day]["clubtitle"] = $item["clubtitle"];
  392.                     }
  393.                 }
  394.             }
  395.             foreach ($timetables as $user_id => $val) {
  396.                 foreach ($val as $day => $value) {
  397.                     foreach ($value as $item) {
  398.                         foreach ($item as $rec) {
  399.                             $sql "
  400.                                 SELECT * FROM `payments`
  401.                                 WHERE `operator_id` = " $user_id 
  402.                                 ".$rec["sql"].
  403.                                 ORDER BY id DESC LIMIT 1
  404.                             ";
  405.                             $prepareStatement $this->entityManager->getConnection()->prepare($sql);
  406.                             $result $prepareStatement->executeQuery();
  407.                             if ($result->rowCount() > 0) {
  408.                                 $row $result->fetchAssociative();
  409.                                 $payments[$user_id][$day][$rec["start"]] = [
  410.                                     "start" => $rec["start"],
  411.                                     "finish" => $rec["finish"],
  412.                                     "last" => $row["opdate"]
  413.                                 ];
  414.                             }
  415.                         }
  416.                     }
  417.                 }
  418.             }
  419.         }
  420.         /***********/
  421.         if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  422.             $this->timetableService->lastActiveToXls($timetables$payments);
  423.         }
  424.         return $this->render('timetables/last_active/index.html.twig', [
  425.             'filter' => $filter,
  426.             'users' => $this->userService->getAllowedUsersList(),
  427.             'clubs' => $this->clubService->getAllowedClubsList(),
  428.             'filterUserList' => $filterUserList,
  429.             'filterClubList' => $filterClubList,
  430.             'timetables' => $timetables,
  431.             'payments' => $payments,
  432.         ]);
  433.     }
  434. }