src/Controller/Pages/AquaController.php line 81

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