src/Controller/Pages/AquaController.php line 83

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Pages;
  3. use App\Controller\Objects\AquaReg;
  4. use App\Controller\Objects\AquaResInfo;
  5. use App\Controller\Objects\AquaSettings;
  6. use App\Controller\System;
  7. use App\Controller\Objects\HomeFacebookItem;
  8. use App\Kernel;
  9. use App\Controller\AbstractKasController;
  10. use App\Controller\AbstractKasModel;
  11. use App\Controller\Database;
  12. use App\Controller\PageInfo;
  13. use Doctrine\DBAL\Exception;
  14. use Symfony\Bundle\FrameworkBundle\Console\Application;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\Cache\Adapter\MemcachedAdapter;
  17. use Symfony\Component\Console\Input\ArrayInput;
  18. use Symfony\Component\Console\Output\BufferedOutput;
  19. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\VarDumper;
  25. use PHPMailer\PHPMailer\PHPMailer;
  26. use Doctrine\DBAL\ParameterType;
  27. class AquaController extends AbstractKasController
  28. {
  29.     private AquaSettings $settings;
  30.     public function __construct(RequestStack $requestStackDatabase $dbPageInfo $pageInfo)
  31.     {
  32.         parent::__construct($requestStack$db$pageInfo);
  33.         $this->request $requestStack->getCurrentRequest();
  34.         $this->model = new AquaModel($db);
  35.         $this->settings $this->model->getAquaSettings();
  36.     }
  37.     /**
  38.      * @Route("/aquasvet/kurzy-plavani")
  39.      * @return Response
  40.      * @throws \Facebook\Exceptions\FacebookSDKException
  41.      */
  42.     public function kurzy_plavani(): Response
  43.     {
  44.         //$n = $this->pageInfo->getNavbar();
  45.         //dump($n);
  46.         $link $this->request->getRequestUri();
  47.         $link str_replace('/kurzy-plavani'''$link);
  48.         $model = new ObjectModel($this->db);
  49.         $objectinfo $model->getObjectInfo($link);
  50.         //pokud nenalezeno, tak 404
  51.         if (!$objectinfo->isFound()) return $this->render('/pages/404.html.twig', [
  52.             'pageinfo' => $this->pageInfo
  53.         ]);
  54.         $model = new HomeModel($this->db);
  55.         $top_events $model->getTopEvents(); //dump($top_events);
  56.         $facebook_feed $model->getFacebookFeed();
  57.         $courses $this->model->getCourses();
  58.         return $this->render('/pages/aqua_courses.html.twig', [
  59.             'courses' => $courses,
  60.             'pageinfo' => $this->pageInfo,
  61.             'objectinfo' => $objectinfo,
  62.             'top_events' => $top_events,
  63.             'html_info' => $this->settings->getHtmlInfo(),
  64.             'facebook_feed' => $facebook_feed
  65.         ]);
  66.     }
  67.     /**
  68.      * @Route("/aquasvet/prehled-terminu")
  69.      * @Route("/aquasvet/prehled-nasledujicich-terminu")
  70.      * @return Response
  71.      * @throws \Facebook\Exceptions\FacebookSDKException
  72.      */
  73.     public function prehled_terminu(): Response
  74.     {
  75.         //$n = $this->pageInfo->getNavbar();
  76.         //dump($n);
  77.         $link $this->request->getRequestUri();
  78.         $model = new ObjectModel($this->db);
  79.         $objectinfo $model->getObjectInfo('/aquasvet');
  80.         //pokud nenalezeno, tak 404
  81.         if (!$objectinfo->isFound()) return $this->render('/pages/404.html.twig', [
  82.             'pageinfo' => $this->pageInfo
  83.         ]);
  84.         $model = new HomeModel($this->db);
  85.         $top_events $model->getTopEvents(); //dump($top_events);
  86.         $facebook_feed $model->getFacebookFeed();
  87.         if ($link == '/aquasvet/prehled-terminu'$filename 'prehled_terminu.html';
  88.         else $filename 'prehled_nasledujicich_terminu.html';
  89.         $html $this->getHTML($filename);
  90.         $objectinfo->setTitle('Přehled termínů');
  91.         $objectinfo->setSubtitle('Plavecných kurzů ve dvouměsíčních cyklech');
  92.         $objectinfo->setButtons([]);
  93.         return $this->render('/pages/aqua_termines.html.twig', [
  94.             'html' => $html,
  95.             'pageinfo' => $this->pageInfo,
  96.             'objectinfo' => $objectinfo,
  97.             'top_events' => $top_events,
  98.             'facebook_feed' => $facebook_feed
  99.         ]);
  100.     }
  101.     /**
  102.      * @Route("/aquasvet/prihlaska-na-kurz")
  103.      * @return Response
  104.      * @throws \Facebook\Exceptions\FacebookSDKException
  105.      */
  106.     public function prihlaska_na_kurz(): Response
  107.     {
  108.         $model = new ObjectModel($this->db);
  109.         $objectinfo $model->getObjectInfo('/aquasvet');
  110.         $objectinfo->setTitle('Přihláška na kurz');
  111.         $objectinfo->setButtons([]);
  112.         //pokud nenalezeno, tak 404
  113.         if (!$objectinfo->isFound()) return $this->render('/pages/404.html.twig', [
  114.             'pageinfo' => $this->pageInfo
  115.         ]);
  116.         $model = new HomeModel($this->db);
  117.         $top_events $model->getTopEvents(); //dump($top_events);
  118.         $facebook_feed $model->getFacebookFeed();
  119.         $active_months $this->model->getActiveMonths();
  120.         //nejsou aktivni kurzy pro prihlaseni
  121.         if ($active_months->getName()=='') {
  122.             $objectinfo->setSubtitle('');
  123.             return $this->render('/pages/aqua_form_prepare.html.twig', [
  124.                 'settings' => $this->settings,
  125.                 'pageinfo' => $this->pageInfo,
  126.                 'objectinfo' => $objectinfo,
  127.                 'top_events' => $top_events,
  128.                 'facebook_feed' => $facebook_feed
  129.             ]);
  130.         }
  131.         else {
  132.             $objectinfo->setSubtitle($active_months->getName());
  133.             return $this->render('/pages/aqua_form.html.twig', [
  134.                 'settings' => $this->settings,
  135.                 'pageinfo' => $this->pageInfo,
  136.                 'objectinfo' => $objectinfo,
  137.                 'top_events' => $top_events,
  138.                 'facebook_feed' => $facebook_feed,
  139.                 'g_site_key' => getenv('G_SITE_KEY')
  140.             ]);
  141.         }
  142.     }
  143.     /**
  144.      * @Route("/aquasvet/prihlaska-na-kurz/kurzy")
  145.      * @Route("/aquasvet/prihlaska-na-kurz/kurzy-{age}")
  146.      * @return Response
  147.      */
  148.     public function prihlaska_kurzy(float $age): Response
  149.     {
  150.         $courses $this->model->getCoursesReg($age);
  151.         return $this->render('/partials/aquareg_courses.html.twig', [
  152.             'courses' => $courses,
  153.             'age' => $age
  154.         ]);
  155.     }
  156.     /**
  157.      * @Route("/aquasvet/prihlaska-na-kurz/terminy")
  158.      * @Route("/aquasvet/prihlaska-na-kurz/terminy-{course}")
  159.      * @return Response
  160.      */
  161.     public function prihlaska_terminy(int $course): Response
  162.     {
  163.         $termines = [];
  164.         if ($course>0) {
  165.             $active_months $this->model->getActiveMonths();
  166.             $termines $this->model->getTerminesReg($course$active_months->getMonthIds());
  167.         }
  168.         return $this->render('/partials/aquareg_termines.html.twig', [
  169.             'termines' => $termines
  170.         ]);
  171.     }
  172.     /**
  173.      * @Route("/aquasvet/prihlaska-na-kurz/datum", methods={"POST"})
  174.      * @return Response
  175.      */
  176.     public function prihlaska_datum(): JsonResponse
  177.     {
  178.         $date $this->request->get('date');
  179.         $age '0';
  180.         //validace
  181.         if ($date=='') {
  182.             $message 'zadejte datum narození';
  183.             $focus 'id-date';
  184.         }
  185.         elseif (!System::isDateCZ($date)) {
  186.             $message 'špatný formát data narození';
  187.             $focus 'id-date';
  188.         }
  189.         elseif (self::isFutureDate($date)) {
  190.             $message 'nenarozené účastníky nebereme';
  191.             $focus 'id-date';
  192.         }
  193.         else {
  194.             $age self::ageFromDate($date);
  195.             $message 'OK';
  196.             $focus 'id-firstname';
  197.         }
  198.         $return = ['message' => $message'age' => $age'focus' => $focus];
  199.        return new JsonResponse($return);
  200.     }
  201.     /**
  202.      * @Route("/aquasvet/prihlaska-na-kurz/odeslani", methods={"POST"})
  203.      * @return Response
  204.      * @throws Exception
  205.      */
  206.     public function prihlaska_odeslani(): JsonResponse
  207.     {
  208.         sleep(1);
  209.         $message    '';
  210.         $reload     '';
  211.         $focus      '';
  212.         $error      1;
  213.         $age        '0';
  214.         $date       $this->request->get('date');
  215.         $firstname  $this->request->get('firstname');
  216.         $lastname   $this->request->get('lastname');
  217.         $email      $this->request->get('email');
  218.         $phone      $this->request->get('phone');
  219.         $course     $this->request->get('course');
  220.         $less       $this->request->get('less');
  221.         $subst      $this->request->get('subst');
  222.         $cond       $this->request->get('cond');
  223.         $gdpr       $this->request->get('gdpr');
  224.         $note       $this->request->get('note');
  225.         //validace
  226.         if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], getenv('APP_URL')) !==0) {
  227.             $message 'chyba zpracování';
  228.             $focus '';
  229.         }
  230.         elseif ($date=='') {
  231.             $message 'zadejte datum narození';
  232.             $focus 'id-date';
  233.         }
  234.         elseif (!System::isDateCZ($date)) {
  235.             $message 'špatný formát data narození';
  236.             $focus 'id-date';
  237.         }
  238.         elseif (self::isFutureDate($date)) {
  239.             $message 'nenarozené účastníky nebereme';
  240.             $focus 'id-date';
  241.         }
  242.         elseif ($firstname=='') {
  243.             $message 'zadejte křestní jméno účastníka';
  244.             $focus 'id-firstname';
  245.         }
  246.         elseif ($lastname=='') {
  247.             $message 'zadejte příjmení účastníka';
  248.             $focus 'id-lastname';
  249.         }
  250.         elseif ($email=='') {
  251.             $message 'zadejte e-mail zákonného zástupce';
  252.             $focus 'id-email';
  253.         }
  254.         elseif (!System::isEmail($email)) {
  255.             $message 'chybný formát e-mailu';
  256.             $focus 'id-email';
  257.         }
  258.         elseif ($phone=='') {
  259.             $message 'zadejte telefon zákonného zástupce';
  260.             $focus 'id-phone';
  261.         }
  262.         elseif (!System::isPhone($phone)) {
  263.             $message 'chybný formát telefonního čísla';
  264.             $focus 'id-phone';
  265.         }
  266.         else if ($course.'' === '' || !System::IsIntPosNum($course)) {
  267.             $message 'vyberte kurz';
  268.             $focus 'id-table-courses-radios';
  269.         }
  270.         elseif ($less.''==='' && $subst.''==='') {
  271.             $message 'vyberte termín kurzu';
  272.             $focus 'id-table-less';
  273.         }
  274.         elseif ((int)$cond!==1) {
  275.             $message 'potvrďte souhlas s podmínkami plavecké školy';
  276.             $focus 'id-cond';
  277.         }
  278.         elseif ((int)$gdpr!==1) {
  279.             $message 'potvrďte souhlas se zpracováním osobních údajů';
  280.             $focus 'id-gdpr';
  281.         }
  282.         else {
  283.             $age self::ageFromDate($date);
  284.             $pin self::generatePIN($date$firstname$lastname);
  285.             $rcnt $this->model->getPinPerMonth($pin$this->settings);
  286.             $reg = new AquaReg();
  287.             $reg->setAge($age);
  288.             $reg->setPin($pin);
  289.             $reg->setFirstname($firstname);
  290.             $reg->setLastname($lastname);
  291.             $reg->setEmail($email);
  292.             $reg->setPhone($phone);
  293.             $reg->setCourseId($course);
  294.             $reg->setDate($date);
  295.             $reg->setNote($note);
  296.             //zjistim pocet prihlasek na unikatni id
  297.             if ($rcnt>=$this->settings->getMaxReg()) {
  298.                 $message 'pro uvedené údaje je již definován maximální počet možných přihlášek za měsíc! ['.$rcnt.'x]';
  299.                 $focus 'id-date';
  300.                 $return = ['message' => $message'age' => $age'focus' => $focus];
  301.                 return new JsonResponse($return);
  302.             }
  303.             //musime jeste serverove zkontrolovat vek ... jestli si lokalne disablovane pole nepovolili
  304.             $age_from $age_to 0;
  305.             $this->model->getCourseAge($course$age_from$age_to);
  306.             if ($age<$age_from || $age>$age_to) {
  307.                 $message 'účastník věkově nespadá do vybraného kurzu';
  308.                 $focus 'id-table-courses-radios';
  309.                 $reload 'courses';
  310.                 $return = ['message' => $message'age' => $age'focus' => $focus'reload' => $reload];
  311.                 return new JsonResponse($return);
  312.             }
  313.             //serverova kontrola volne kapacity
  314.             if ($less!='') {
  315.                 $a explode('|'$less);
  316.                 $from     $a[0];
  317.                 $day     $a[1];
  318.                 $reg->setTimeFrom($from);
  319.                 $reg->setDayIndex($day);
  320.                 $cap $this->model->getCapacityLess($course$day$from);
  321.                 if ($cap===0) {
  322.                     $message 'bohužel jste nestihli rezervovat, na zvolenou lekci se můžete zaregistrovat jako náhradník';
  323.                     $focus 'id-table-less';
  324.                     $reload 'termines';
  325.                     $return = ['message' => $message'age' => $age'focus' => $focus'reload' => $reload];
  326.                     return new JsonResponse($return);
  327.                 }
  328.             }
  329.             elseif ($subst!='') {
  330.                 $a explode('|'$subst);
  331.                 $from     $a[0];
  332.                 $day     $a[1];
  333.                 $reg->setTimeFrom($from);
  334.                 $reg->setDayIndex($day);
  335.                 $reg->setSubst(true);
  336.                 $cap $this->model->getCapacitySubst($course$day$from);
  337.                 if ($cap===0) {
  338.                     $message 'bohužel jste nestihli rezervovat, byl naplněn také limit pro náhradníky';
  339.                     $focus 'id-table-less';
  340.                     $reload 'termines';
  341.                     $return = ['message' => $message'age' => $age'focus' => $focus];
  342.                     return new JsonResponse($return);
  343.                 }
  344.                 $less $subst;
  345.             }
  346.             //kontrola, zda již není klient na konkrétní termín kurzu přihlášen
  347.             $already_in $this->model->isAlreadyIn($pin$course$less);
  348.             if ($already_in) {
  349.                 $message 'na vybraný kurz a čas je již uživatel přihlášen(a)';
  350.                 $focus 'id-table-less';
  351.                 $return = ['message' => $message'age' => $age'focus' => $focus];
  352.                 return new JsonResponse($return);
  353.             }
  354.             //captcha
  355.             /*$result = file_get_contents( 'https://www.google.com/recaptcha/api/siteverify', false, stream_context_create( array(
  356.                 'http' => array(
  357.                     'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
  358.                     'method'  => 'POST',
  359.                     'content' => http_build_query( array(
  360.                         'response' => $_POST['g-recaptcha-response'],
  361.                         'secret' => getenv('G_SECRET_KEY'),
  362.                         'remoteip' => $_SERVER['REMOTE_ADDR']
  363.                     ) ),
  364.                 ),
  365.             ) ) );
  366.             $result = json_decode($result);
  367.             if ($result->success) {*/
  368.             $ch curl_init();
  369.             curl_setopt($chCURLOPT_URL"https://www.google.com/recaptcha/api/siteverify");
  370.             curl_setopt($chCURLOPT_POST1);
  371.             curl_setopt($chCURLOPT_CONNECTTIMEOUT5);
  372.             curl_setopt($chCURLOPT_TIMEOUT10);
  373.             curl_setopt($chCURLOPT_POSTFIELDShttp_build_query([
  374.                 'response' => $_POST['g-recaptcha-response'],
  375.                 'secret' => getenv('G_SECRET_KEY'),
  376.                 'remoteip' => $_SERVER['REMOTE_ADDR']
  377.             ]));
  378.             curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  379.             $data curl_exec($ch);
  380.             curl_close($ch);
  381.             $response = @json_decode($data);
  382.             if ($response && $response->success) {
  383.                 //vse je OK, ulozeni
  384.                 try {
  385.                     $ids = [];
  386.                     $pincode '';
  387.                     $this->model->saveReg($this->settings$reg$ids$pincode);
  388.                     $message 'úspěšně odesláno';
  389.                     $error 0;
  390.                     $id implode('|'$ids);
  391.                     $eid System::encrypt($id);
  392.                     $reg->setEid($eid);
  393.                     $reg->setPincode($pincode);
  394.                     $info $this->model->getResInfo($ids);
  395.                     $subject 'Přihláška na kurz plavání';
  396.                     $body '<h2>PŘIHLÁŠKA NA KURZ PLAVÁNÍ</h2>';
  397.                     $body .= '<p>děkujeme za vyplnění přihlášky na kurz plavání.</p>';
  398.                     $this->sendMail($reg$info$subject$bodyfalsetrue);
  399.                 } catch (Exception $e) {
  400.                     $message $e->getMessage();
  401.                     $focus 'id-submit';
  402.                 }
  403.             }
  404.             else {
  405.                 $message 'zaškrtněte "Nejsem robot"';
  406.             }
  407.         }
  408.         $return = ['message' => $message'error' => $error'age' => $age'focus' => $focus'reload' => $reload];
  409.         return new JsonResponse($return);
  410.     }
  411.     /**
  412.      * @Route("/aquasvet/prihlaska-na-kurz-{eid}")
  413.      * @Route("/prihlaska-na-kurz-{eid}")
  414.      * @return Response
  415.      * @throws Exception
  416.      * @throws \Facebook\Exceptions\FacebookSDKException
  417.      */
  418.     public function moje_prihlaska($eid): Response
  419.     {
  420.         $model = new ObjectModel($this->db);
  421.         $objectinfo $model->getObjectInfo('/aquasvet');
  422.         $objectinfo->setTitle('Moje přihláška');
  423.         $objectinfo->setButtons([]);
  424.         //pokud nenalezeno, tak 404
  425.         if (!$objectinfo->isFound() || $eid=='' || System::decrypt($eid)=='') {
  426.             return $this->render('/pages/404.html.twig', [
  427.                 'pageinfo' => $this->pageInfo
  428.             ]);
  429.         }
  430.         $ids explode('|'System::decrypt($eid));
  431.         $model = new HomeModel($this->db);
  432.         $top_events $model->getTopEvents(); //dump($top_events);
  433.         $facebook_feed $model->getFacebookFeed();
  434.         $reg $this->model->getReg($ids);
  435.         $info $this->model->getResInfo($ids);
  436.         //$terms = $this->model->getResTerms($ids);
  437.         $months $this->model->getMonthName($ids);
  438.         $objectinfo->setSubtitle($months);
  439.         return $this->render('/pages/aqua_mycourse.html.twig', [
  440.             'settings' => $this->settings,
  441.             'pageinfo' => $this->pageInfo,
  442.             'objectinfo' => $objectinfo,
  443.             'top_events' => $top_events,
  444.             'facebook_feed' => $facebook_feed,
  445.             'reg' => $reg,
  446.             'info' => $info,
  447.             'eid' => $eid
  448.         ]);
  449.     }
  450.     /**
  451.      * @param $date
  452.      * @return int
  453.      */
  454.     private static function ageFromDate($date):float {
  455.         if(strlen($date) >= && strlen($date) <= 10 && System::isDateCZ($date)) {
  456.             //$sdate = substr($date, 0,2).'.'.substr($date, 2,2).'.20'.substr($date, 4,2);
  457.             $birthday = new \DateTime($date);
  458.             $birthday->modify('first day of this month');
  459.             $diff $birthday->diff(new \DateTime());
  460.             $months $diff->format('%m') + 12 $diff->format('%y');
  461.             $months++; //vzdy se prihlasujeme na nasledujici mesic, musim se jakoby narodit o mesic driv
  462.             return $months/12;
  463.         }
  464.         return 0;
  465.     }
  466.     /**
  467.      * @param $date
  468.      * @return bool
  469.      */
  470.     private static function isFutureDate($date):bool {
  471.         $testing_date = new \DateTime($date);
  472.         $current_date = new \DateTime();
  473.         return ($testing_date $current_date)?true:false;
  474.     }
  475.     /**
  476.      * @param string $filename
  477.      * @return string
  478.      */
  479.     private function getHTML(string $filename): string {
  480.         $file getenv('APP_DIR').'private/data/files/www_html/'.$filename;
  481.         if (file_exists($file)) {
  482.             return file_get_contents($file);
  483.         }
  484.         return '';
  485.     }
  486.     /**
  487.      * @param string $date
  488.      * @param string $name
  489.      * @param string $surname
  490.      * @return string
  491.      */
  492.     public static function generatePIN(string $datestring $name,string $surname):string
  493.     {
  494.         $name str_replace(' '''System::removeAccents2($name));
  495.         $surname str_replace(' '''System::removeAccents2($surname));
  496.         $sourceString substr($name03).$surname;
  497.         $sum 0;
  498.         for ($i 0$i strlen($sourceString); $i++) {
  499.             $sum += self::letterPosInAlphabet($sourceString[$i]) * $i;
  500.         }
  501.         $sum $sum.'';
  502.         $sum substr($sum04);
  503.         while(strlen($sum) < 4) {
  504.             $sum $sum.'0';
  505.         }
  506.         $dateArray explode('.'$date);
  507.         $dateArray[0] = sprintf("%02d"$dateArray[0]);
  508.         $dateArray[1] = sprintf("%02d"$dateArray[1]);
  509.         // odstranění prvních dvou čísel u roku ( 2017 -> 17 )
  510.         $dateArray[2] = substr($dateArray[2], 2);
  511.         return implode(''$dateArray).$sum;
  512.     }
  513.     /**
  514.      * @param string $letterOfAlphabet
  515.      * @return int
  516.      */
  517.     private static function letterPosInAlphabet(string $letterOfAlphabet):int {
  518.         return ord(strtoupper($letterOfAlphabet)) - ord('A') + 1;
  519.     }
  520.     /**
  521.      * @param AquaReg $reg
  522.      * @param AquaResInfo $info
  523.      * @param string $subject
  524.      * @param string $body
  525.      * @param bool $internal
  526.      * @return void
  527.      * @throws \PHPMailer\PHPMailer\Exception
  528.      */
  529.     private function sendMail(AquaReg $regAquaResInfo $infostring $subjectstring $bodybool $internal falsebool $mailinfo true):void {
  530.             $mailinfo_txt = ($mailinfo)?$this->settings->getMailInfo():'';
  531.             $body .= $this->renderView('/partials/aquareg_mail.html.twig', [
  532.                 'app_url' => getenv('APP_URL'),
  533.                 'reg' => $reg,
  534.                 'info' => $info,
  535.                 'mailinfo' => $mailinfo_txt,
  536.                 'sign' => true
  537.             ]);
  538.         System::sendMail(1$subject$body$reg->getEmail(), $internal);
  539.     }
  540.     /**
  541.      * @Route("/aquasvet/prihlaska-na-kurz/zruseni-terminu", methods={"POST"})
  542.      * @return Response
  543.      * @throws Exception
  544.      * @throws \PHPMailer\PHPMailer\Exception
  545.      */
  546.     public function zruseni_terminu(): JsonResponse
  547.     {
  548.         sleep(1);
  549.         $message    '';
  550.         $reload     '';
  551.         $focus      '';
  552.         $error      1;
  553.         $pincode    $this->request->get('pincode');
  554.         $eid        $this->request->get('eid');
  555.         $termid     $this->request->get('termid');
  556.         $reason     $this->request->get('reason');
  557.         $reason2    $this->request->get('reason2');
  558.         $r_date     date('Y-m-d H:i:s');
  559.         //validace
  560.         if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], getenv('APP_URL')) !==0) {
  561.             $message 'chyba zpracování';
  562.         }
  563.         elseif ($eid=='' || (int)System::decrypt($eid)==|| (int)$termid==0) {
  564.             $message 'chyba zpracování [2]';
  565.         }
  566.         elseif ($pincode=='') {
  567.             $message 'zadejte PIN';
  568.         }
  569.         elseif (strlen($pincode)!=|| !System::IsIntPosNum($pincode)) {
  570.             $message 'chybný formát PIN kódu';
  571.         }
  572.         elseif ($reason=='') {
  573.             $message 'vyberte důvod';
  574.         }
  575.         elseif ($reason=='jiný důvod' && $reason2=='') {
  576.             $message 'zadejte jiný důvod';
  577.         }
  578.         else {
  579.             $id System::decrypt($eid);
  580.             //$message = System::decrypt($eid);
  581.             $db_pin $this->model->getPIN($id);
  582.             $term_date $this->model->getTermDate($termid);
  583.             $today_time = new \DateTime(date('d.m.Y H:i'));
  584.             //mohou se odhlásit nejpozdeji ten den do 8.00
  585.             $expire_time = new \DateTime($term_date->format('d.m.Y').' 08:00');
  586.             $past = (int)$today_time->format('YmdHi') > (int)$expire_time->format('YmdHi');
  587.             if ($pincode!=$db_pin) {
  588.                 $message 'chybný PIN kód';
  589.             }
  590.             else if ($past) {
  591.                 $message 'odhlášení je možné pouze do 8.00 v den konání kurzu';
  592.             }
  593.             else {
  594.                 if ($reason=='jiný důvod') {
  595.                     $reason $reason2;
  596.                 }
  597.                 try {
  598.                     //zruseni terminu a nahradnici
  599.                     $subst_rids $this->model->cancelTerm($id$termid$reason$this->settings);
  600.                     $message 'termín byl zrušen, děkujeme za informaci';
  601.                     $error 0;
  602.                     $reg $this->model->getReg([$id]);
  603.                     $ids explode('|'$reg->getIds());
  604.                     $info $this->model->getResInfo($ids);
  605.                     //rusejicimu e-mail hned
  606.                     $subject 'Zrušení termínu kurzu';
  607.                     $body '<h2>ZRUŠENÝ TERMÍN KURZU PLAVÁNÍ</h2>';
  608.                     $body .= '<p>Termín <b>'.$term_date->format('d.m.Y').'</b> byl zrušen z důvodu "<b>'.$reason.'</b>", děkujeme za informaci.</p>';
  609.                     $this->sendMail($reg$info$subject$bodytruefalse);
  610.                     //odeslani e-mailu nahradnikum pres frontu
  611.                     if (is_array($subst_rids) && count($subst_rids)>0) {
  612.                         foreach ($subst_rids as $r_id) {
  613.                             //mail pres frontu
  614.                             $reg $this->model->getReg([$r_id]);
  615.                             $info $this->model->getResInfo([$r_id]);
  616.                             $r_email $reg->getEmail();
  617.                             $r_subject 'Uvolnění plaveckého kurzu';
  618.                             $html '<p style="line-height: 1.2">Dobrý den,</p>';
  619.                             $html .= '<p style="line-height: 1">došlo k uvolnění plaveckého kurzu. Na tento kurz jste registrovaným náhradníkem.</p>';
  620.                             $html .= '<p style="line-height: 1">V případě zájmu se dostavte uhradit kurzovné na recepci Aquasvěta do '.$this->settings->getPaydate().'. dne v měsíci. V opačném případě dojde k nabídnutí kurzu dalšímu náhradníkovi v pořadí.</p>';
  621.                             $html .= '<h4>Vaše přihláška</h4>';
  622.                             $html .= $this->renderView('/partials/aquareg_mail.html.twig', [
  623.                                 'app_url' => getenv('APP_URL'),
  624.                                 'reg' => $reg,
  625.                                 'info' => $info,
  626.                                 'mailinfo' => '',
  627.                                 'sign' => false
  628.                             ]);
  629.                             /*
  630.                                 1   kurzyplavani@kultura-sport.cz
  631.                                 2    prazdniny@kultura-sport.cz
  632.                                 3    prazdniny-miniskola@kultura-sport.cz
  633.                                 4    prazdniny-aquasvet@kultura-sport.cz
  634.                              */
  635.                             $this->model->mailToQueue($r_email$r_subject$html$r_date1);
  636.                         }
  637.                     }
  638.                 } catch (Exception $e) {
  639.                     $message $e->getMessage();
  640.                 }
  641.             }
  642.         }
  643.         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  644.         return new JsonResponse($return);
  645.     }
  646.     /**
  647.      * @Route("/aquasvet/prihlaska-na-kurz/nahrada-terminu", methods={"POST"})
  648.      * @return Response
  649.      * @throws Exception
  650.      */
  651.     public function nahrada_terminu(): JsonResponse
  652.     {
  653.         sleep(1);
  654.         $message    '';
  655.         $reload     '';
  656.         $focus      '';
  657.         $error      1;
  658.         $pincode    $this->request->get('pincode');
  659.         $eid        $this->request->get('eid');       //id registrace (t4)
  660.         $termid     $this->request->get('termid');    //termin, ktery nahrazujeme
  661.         $substermid $this->request->get('substermid');//nahradni termin
  662.         //validace
  663.         if (!isset($_SERVER['HTTP_REFERER']) || strpos($_SERVER['HTTP_REFERER'], getenv('APP_URL')) !==0) {
  664.             $message 'chyba zpracování';
  665.         }
  666.         elseif ($eid=='' || (int)System::decrypt($eid)==|| (int)$termid==0) {
  667.             $message 'chyba zpracování [2]';
  668.         }
  669.         elseif ($pincode=='') {
  670.             $message 'zadejte PIN';
  671.         }
  672.         elseif (strlen($pincode)!=|| !System::IsIntPosNum($pincode)) {
  673.             $message 'chybný formát PIN kódu';
  674.         }
  675.         elseif ($substermid=='') {
  676.             $message 'vyberte náhradní termín';
  677.         }
  678.         else {
  679.             $r_id System::decrypt($eid);
  680.             //$message = System::decrypt($eid);
  681.             $db_pin $this->model->getPIN($r_id);
  682.             if ($pincode!=$db_pin) {
  683.                 $message 'chybný PIN kód';
  684.             }
  685.             else {
  686.                 try {
  687.                     // nahrazovane ID terminu, vybrane ze selectboxu, pokud je L_ID, predavame ID lekce
  688.                     if (str_starts_with($substermid'L_ID_')) {
  689.                         $l_id       substr($substermid5);
  690.                         $substermid    0;
  691.                     }
  692.                     else {
  693.                         //zjisteni lekce z terminu
  694.                         $l_id $this->model->getLessonID($substermid);
  695.                     }
  696.                     //kontrola, zda se nejedna o nahradu z nahrady
  697.                     if ($this->model->isSubterm($termid)) {
  698.                         $message 'nelze nahrazovat náhradu';
  699.                         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  700.                         return new JsonResponse($return);
  701.                     }
  702.                     //kontrola 2 náhrad v měsíci
  703.                     if ($this->model->getSubstCnt($r_id)>=2) {
  704.                         $message 'jsou možné pouze 2 náhrady v měsíci';
  705.                         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  706.                         return new JsonResponse($return);
  707.                     }
  708.                     //kontrola, zda jsem nevybral lekci, kde už jsem
  709.                     $l_ids $this->model->getLessonIDs($r_id);
  710.                     if (in_array($l_id$l_ids)) {
  711.                         $message 'na zvolené lekci již jste';
  712.                         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  713.                         return new JsonResponse($return);
  714.                     }
  715.                     //nakonec jeste jednou overime kapacitu (stavovost)
  716.                     //zkontroluji vlastne, jestli vybrany radek jiz nebyl vybran - uvolnena kapacita nahrazena
  717.                     if ($substermid>&& !$this->model->isSubtermAval($substermid)) {
  718.                         $message 've vybraný termín již není volné místo';
  719.                         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  720.                         return new JsonResponse($return);
  721.                     }
  722.                     $this->model->saveSubsTerm($r_id$l_id$termid$substermid);
  723.                     $message 'náhradní termín byl úspěšně vybrán';
  724.                     $error 0;
  725.                     $reg $this->model->getReg([$r_id]);
  726.                     $ids explode('|'$reg->getIds());
  727.                     $info $this->model->getResInfo($ids);
  728.                     $term_date      $this->model->getTermDate($termid);
  729.                     $subterm_date   $this->model->getTermDate($substermid);
  730.                     $subject 'Náhrada zrušené lekce';
  731.                     $body '<h2>NAHRAZENÝ TERMÍN KURZU PLAVÁNÍ</h2>';
  732.                     $body .= '<p>Zrušený termín <b>'.$term_date->format('d.m.Y').'</b> byl nahrazen <b>'.$subterm_date->format('d.m.Y').'</b>.</p>';
  733.                     $this->sendMail($reg$info$subject$bodytruefalse);
  734.                 } catch (Exception $e) {
  735.                     $message $e->getMessage();
  736.                 }
  737.             }
  738.         }
  739.         $return = ['message' => $message'error' => $error'focus' => $focus'reload' => $reload];
  740.         return new JsonResponse($return);
  741.     }
  742.      /**
  743.      * @Route("/aquasvet/prihlaska-na-kurz/nahradni-terminy-{eid}-{term_id}", methods={"GET"})
  744.      * @return Response
  745.      * @throws Exception
  746.      */
  747.     public function nahradni_terminy(string $eidint $term_id): Response
  748.     {
  749.         $data = [];
  750.         if ($eid!='' && $term_id>0) {
  751.             $r_id System::decrypt($eid);
  752.             if ((int)$r_id>0) {
  753.                 $data $this->model->loadSubsTerms($r_id$term_id$this->settings);
  754.             }
  755.         }
  756.         return $this->render('/partials/aquareg_subterms.html.twig', [
  757.             'data' => $data
  758.         ]);
  759.     }
  760.     /**
  761.      * @Route("/aquasvet/moje-prihlaska/terminy-{eid}", methods={"GET"})
  762.      * @return Response
  763.      */
  764.     public function moje_terminy(string $eid): Response
  765.     {
  766.         $terms=[];
  767.         if ($eid!='') {
  768.             $ids explode('|'System::decrypt($eid));
  769.             $terms $this->model->getResTerms($ids);
  770.         }
  771.         return $this->render('/partials/aquareg_mytermines.html.twig', [
  772.             'terms' => $terms
  773.         ]);
  774.     }
  775. }
  776. ?>