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.         if(in_array(Roles::ROLE_SUPPORT$currentUser->getRoles())){
  188.             $allowedUsersId $currentUser->getAllowedUsersId();
  189.         }else{
  190.             $allowedUsersId $this->clubService->getAllowedUsersIdByClubs($currentUser->getAllowedClubsId());
  191.         }
  192.         foreach ($allowedUsersId as $user_id){
  193.             $allowedUsers[] = $this->userService->getById((int)$user_id);
  194.         }
  195.         $filter = new TimetableFilter();
  196.         $filter
  197.             ->setAllowedUsersList($allowedUsersId)
  198.             ->setStartDate($filterStartDate)
  199.             ->setFinishDate($filterFinishDate)
  200.             ->setMinimalDuration(10)
  201.             ->setUserId($filterUserId);
  202.         //надо продумать этот момент
  203. //        if (!empty($filterUserId)) {
  204. //            Assert::inArray($filterUserId, $currentUser->getAllowedUsersId(), $this->translator->trans('Access denied'));
  205. //        }
  206.         $personalReport $this->timetableService->getPersonalReport($filter);
  207.         if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  208.             $this->timetableService->personalExportToXls($personalReport);
  209.         }
  210.         return $this->render('timetables/personal_report/index.html.twig', [
  211.             'filter' => $filter,
  212.             'users' => $allowedUsers,
  213.             'personalReport' => $personalReport,
  214.         ]);
  215.     }
  216.     /**
  217.      * @Route(name="app_timetable_full_report", path="/report/timetables/full")
  218.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  219.      * @param Request $request
  220.      * @return Response
  221.      */
  222.     public function fullReport(Request $request): Response
  223.     {
  224.         /** @var User $currentUser */
  225.         $currentUser $this->getUser();
  226.         $submit $request->request->getInt('submit');
  227.         $filterYear $request->request->getInt('year'intval(date('Y')));
  228.         $filterMonth $request->request->getInt('month'intval(date('m')));
  229.         $export $request->request->get('export'false);
  230.         $clubs $request->request->get('clubs');
  231.         //        if(!in_array(Roles::ROLE_SUPPORT, $currentUser->getRoles())){
  232.         if(!$clubs){
  233.             $clubs $currentUser->getAllowedClubsId();
  234.         }
  235. //        }
  236.         $clubs array_filter($clubs);
  237.         $clubs array_values($clubs);
  238.         $fullReport = [];
  239.         $filter = new TimetableFilter();
  240.         if (!empty($submit) || !empty($export)) {
  241.             $monthStart mktime(000$filterMonth1$filterYear);
  242.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  243.             $filter
  244.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  245.                 ->setClubsList($clubs)
  246.                 ->setYear($filterYear)
  247.                 ->setMonth($filterMonth)
  248.                 ->setStartDate($monthStart)
  249.                 ->setFinishDate($monthFinish);
  250.             $fullReport $this->timetableService->getFullReport($filter);
  251.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  252.                 $this->timetableService->fullExportToXls($fullReport$this->clubService);
  253.             }
  254.         }
  255.         return $this->render('timetables/full_report/index.html.twig', [
  256.             'filter' => $filter,
  257.             'clubs' => $this->clubService->getAllowedClubsList(),
  258.             'years' => [date('Y'), date('Y') - 1],
  259.             'fullReport' => $fullReport,
  260.         ]);
  261.     }
  262.     /**
  263.      * @Route(name="app_timetable_full_report_new", path="/report/timetables/full_new")
  264.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  265.      * @param Request $request
  266.      * @return Response
  267.      */
  268.     public function fullReportNew(Request $request): Response
  269.     {
  270.         /** @var User $currentUser */
  271.         $currentUser $this->getUser();
  272.         $submit $request->request->getInt('submit');
  273.         $filterYear $request->request->getInt('year'intval(date('Y')));
  274.         $filterMonth $request->request->getInt('month'intval(date('m')));
  275.         $export $request->request->get('export'false);
  276.         $clubs $request->request->get('clubs');
  277.         //        if(!in_array(Roles::ROLE_SUPPORT, $currentUser->getRoles())){
  278.         if(!$clubs){
  279.             $clubs $currentUser->getAllowedClubsId();
  280.         }
  281. //        }
  282.         $clubs array_filter($clubs);
  283.         $clubs array_values($clubs);
  284.         $fullReport = [];
  285.         $filter = new TimetableFilter();
  286.         if (!empty($submit) || !empty($export)) {
  287.             $monthStart mktime(000$filterMonth1$filterYear);
  288.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  289.             $filter
  290.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  291.                 ->setClubsList($clubs)
  292.                 ->setYear($filterYear)
  293.                 ->setMonth($filterMonth)
  294.                 ->setStartDate($monthStart)
  295.                 ->setFinishDate($monthFinish);
  296.             $fullReport $this->timetableService->getFullReportNew($filter);
  297.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  298.                 $this->timetableService->fullNewExportToXls($fullReport$this->clubService);
  299.             }
  300.         }
  301.         return $this->render('timetables/full_report_new/index.html.twig', [
  302.             'filter' => $filter,
  303.             'clubs' => $this->clubService->getAllowedClubsList(),
  304.             'years' => [date('Y'), date('Y') - 1],
  305.             'fullReport' => $fullReport,
  306.         ]);
  307.     }
  308.     /**
  309.      * @Route(name="app_timetable_full_report_hours_worked", path="/report/timetables/full_hours_worked")
  310.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  311.      * @param Request $request
  312.      * @return Response
  313.      */
  314.     public function fullReportHoursWorked(Request $request): Response
  315.     {
  316.         /** @var User $currentUser */
  317.         $currentUser $this->getUser();
  318.         $submit $request->request->getInt('submit');
  319.         $filterYear $request->request->getInt('year'intval(date('Y')));
  320.         $filterMonth $request->request->getInt('month'intval(date('m')));
  321.         $export $request->request->get('export'false);
  322.         $clubs $request->request->get('clubs');
  323. //        if(!in_array(Roles::ROLE_SUPPORT, $currentUser->getRoles())){
  324.         if(!$clubs){
  325.             $clubs $currentUser->getAllowedClubsId();
  326.         }
  327. //        }
  328.         $clubs array_filter($clubs);
  329.         $clubs array_values($clubs);
  330.         $fullReport $cashier_payments = [];
  331.         $filter = new TimetableFilter();
  332.         if (!empty($submit) || !empty($export)) {
  333.             $monthStart mktime(000$filterMonth1$filterYear);
  334.             $monthFinish mktime(235959$filterMonthintval(date('t'$monthStart)), $filterYear);
  335.             $filter
  336.                 ->setAllowedClubsList($currentUser->getAllowedClubsId())
  337.                 ->setClubsList($clubs)
  338.                 ->setYear($filterYear)
  339.                 ->setMonth($filterMonth)
  340.                 ->setStartDate($monthStart)
  341.                 ->setFinishDate($monthFinish);
  342.             $fullReport $this->timetableService->getFullReport($filter);
  343.             $cashier_payments $this->timetableService->getCashierPayments($filter);
  344.             if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  345.                 $this->timetableService->fullHoursWorkedExportToXls($fullReport$cashier_payments$this->clubService);
  346.             }
  347.         }
  348.         return $this->render('timetables/full_report/index_hours_worked.html.twig', [
  349.             'filter' => $filter,
  350.             'clubs' => $this->clubService->getAllowedClubsList(),
  351.             'years' => [date('Y'), date('Y') - 1],
  352.             'fullReport' => $fullReport,
  353.             'cashier_payments' => $cashier_payments,
  354.         ]);
  355.     }
  356.     /**
  357.      * @Route(name="app_timetable_last_active", path="/report/timetables/last_active")
  358.      * @IsGranted("ROLE_CABINET_TIMETABLE_REPORTS")
  359.      * @param Request $request
  360.      * @return Response
  361.      */
  362.     public function ReportWorkLastActive(Request $request): Response
  363.     {
  364.         /** @var User $currentUser */
  365.         $currentUser $this->getUser();
  366.         $yesterday time() - 60 60 24;
  367.         $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)));
  368.         $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')));
  369.         $filterUserList $request->request->get('users') ?? [];
  370.         $filterClubList $request->request->get('clubs') ?? [];
  371.         $export $request->request->get('export'false);
  372.         $filter = new TimetableFilter();
  373.         $filter
  374.             ->setAllowedUsersList($currentUser->getAllowedUsersId())
  375.             ->setAllowedClubsList($currentUser->getAllowedClubsId())
  376.             ->setStartDate($filterStartDate)
  377.             ->setFinishDate($filterFinishDate);
  378.         //        if($this->projectName != "ground_cashdesk_dom"){
  379. //            die;
  380. //        }
  381.         /*timetables*/
  382.         $timetables $timetables_tmp $payments = [];
  383.         if(sizeof($filterUserList) > || sizeof($filterClubList) > 0) {
  384.             $sql "SELECT
  385.                 `users`.`username` AS `username`, `clubs`.`title` AS `clubtitle`, `timetables`.*
  386.                 FROM `timetables`
  387.                 LEFT JOIN `users` ON `users`.id = `timetables`.`user_id`
  388.                 LEFT JOIN `clubs` ON `clubs`.id = `timetables`.`club_id`
  389.                 WHERE `start_datetime` >= '".date('Y-m-d H:i:s'$filterStartDate)."'
  390.                 AND `finish_datetime` <= '".date('Y-m-d H:i:s'$filterFinishDate)."'
  391.                 AND `duration` > 10";
  392.             if (sizeof($filterUserList) > 0) {
  393.                 $sql .= " AND user_id IN (" implode(', '$filterUserList) . ")";
  394.             }
  395.             if (sizeof($filterClubList) > 0) {
  396.                 $sql .= " AND club_id IN (" implode(', '$filterClubList) . ")";
  397.             }
  398.             $prepareStatement $this->entityManager->getConnection()->prepare($sql);
  399.             $result $prepareStatement->executeQuery();
  400.             if ($result->rowCount() > 0) {
  401.                 $row $result->fetchAllAssociative();
  402.                 foreach ($row as $value) {
  403.                     $timetables_tmp[$value["user_id"]][date("Y-m-d"strtotime($value["start_datetime"]))][] = $value;
  404.                 }
  405.             }
  406.             foreach ($timetables_tmp as $user_id => $val) {
  407.                 foreach ($val as $day => $value) {
  408.                     foreach ($value as $item) {
  409.                         $timetables[$user_id][$day]["timetable"][$item["start_datetime"]] = [
  410.                             "start" => $item["start_datetime"],
  411.                             "finish" => $item["finish_datetime"],
  412.                             "sql" => " AND `opdate` BETWEEN '".$item["start_datetime"]."' AND '".$item["finish_datetime"]."'"
  413.                         ];
  414.                         $timetables[$user_id][$day]["username"] = $item["username"];
  415.                         $timetables[$user_id][$day]["clubtitle"] = $item["clubtitle"];
  416.                     }
  417.                 }
  418.             }
  419.             foreach ($timetables as $user_id => $val) {
  420.                 foreach ($val as $day => $value) {
  421.                     foreach ($value as $item) {
  422.                         foreach ($item as $rec) {
  423.                             $sql "
  424.                                 SELECT * FROM `payments`
  425.                                 WHERE `operator_id` = " $user_id 
  426.                                 ".$rec["sql"].
  427.                                 ORDER BY id DESC LIMIT 1
  428.                             ";
  429.                             $prepareStatement $this->entityManager->getConnection()->prepare($sql);
  430.                             $result $prepareStatement->executeQuery();
  431.                             if ($result->rowCount() > 0) {
  432.                                 $row $result->fetchAssociative();
  433.                                 $payments[$user_id][$day][$rec["start"]] = [
  434.                                     "start" => $rec["start"],
  435.                                     "finish" => $rec["finish"],
  436.                                     "last" => $row["opdate"]
  437.                                 ];
  438.                             }
  439.                         }
  440.                     }
  441.                 }
  442.             }
  443.         }
  444.         /***********/
  445.         if ($this->isGranted(Roles::ROLE_EXPORT_TO_EXCEL) && "xls" === $export) {
  446.             $this->timetableService->lastActiveToXls($timetables$payments);
  447.         }
  448.         return $this->render('timetables/last_active/index.html.twig', [
  449.             'filter' => $filter,
  450.             'users' => $this->userService->getAllowedUsersList(),
  451.             'clubs' => $this->clubService->getAllowedClubsList(),
  452.             'filterUserList' => $filterUserList,
  453.             'filterClubList' => $filterClubList,
  454.             'timetables' => $timetables,
  455.             'payments' => $payments,
  456.         ]);
  457.     }
  458. }