src/Controller/ContractOrderController.php line 79

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Accommodation;
  4. use App\Entity\Client;
  5. use App\Entity\ContractOrder;
  6. use App\Entity\Destination;
  7. use App\Entity\Term;
  8. use App\Entity\TermPrice;
  9. use App\Form\ClientLoginType;
  10. use App\Form\ContractClientType;
  11. use App\Form\ContractOrderType;
  12. use App\Repository\AccommodationRepository;
  13. use App\Repository\ClientRepository;
  14. use App\Repository\ContractOrderRepository;
  15. use App\Repository\DestinationRepository;
  16. use App\Repository\TermPriceRepository;
  17. use App\Repository\TermRepository;
  18. use App\Service\ContractOrderService;
  19. use App\Service\ContractService;
  20. use App\Service\TermService;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\Form\Form;
  23. use Symfony\Component\Form\FormError;
  24. use Symfony\Component\Form\FormInterface;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\RequestStack;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
  29. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. class ContractOrderController extends AbstractController
  32. {
  33.     public function __construct(
  34.         private ClientRepository        $clientRepository,
  35.         private DestinationRepository   $destinationRepository,
  36.         private TermRepository          $termRepository,
  37.         private AccommodationRepository $accommodationRepository,
  38.         private ContractOrderRepository $contractOrderRepository,
  39.         private RequestStack            $requestStack,
  40.         private TermPriceRepository     $termPriceRepository,
  41.     )
  42.     {
  43.     }
  44.     #[Route('/open/{code}'name'app_form_open')]
  45.     public function openCode(string $codeContractService $contractServiceTermService $termServiceRequest $request): Response
  46.     {
  47.         $destination $this->destinationRepository->findOneBy(['codeForOpen'=>$request->get('code')]);
  48.         if($destination instanceof Destination){
  49.             $contractOrder $this->getContractOrder();
  50.             $contractOrder->setDestination($destination);
  51.             $this->contractOrderRepository->save($contractOrdertrue);
  52.             $this->requestStack->getSession()->set('openDestinationId'$destination->getId());
  53.             return $this->redirectToRoute('app_form_2');
  54.         } else {
  55.             return $this->redirectToRoute('app_form');
  56.         }
  57.     }
  58.     #[Route('/form/1'name'app_form')]
  59.     public function step1(ContractService $contractServiceTermService $termServiceRequest $request): Response
  60.     {
  61.         $contractOrder $this->getContractOrder();
  62.         return $this->render('Pages/Form/step1.html.twig', [
  63.             'terms' => $termService->getTermsForForm(),
  64.             'destinations' => $this->destinationRepository->findBy([], ['sortOrder' => 'ASC''id' => 'ASC']),
  65.             'termsList' => [],
  66.             'controller_name' => 'FormController',
  67.             'contractOrder' => $contractOrder,
  68.         ]);
  69.     }
  70.     #[Route('/form/2'name'app_form_2')]
  71.     public function step2(ContractService $contractServiceTermService $termServiceRequest $request): Response
  72.     {
  73.         $contractOrder $this->getContractOrder();
  74.         return $this->render('Pages/Form/step2.html.twig', [
  75.             'terms' => $termService->getTermsForForm(),
  76.             'destinations' => $this->destinationRepository->findBy([], ['sortOrder' => 'ASC''id' => 'ASC']),
  77.             'termsList' => $this->termRepository->findActiveTermsForDestinatoin($contractOrder->getDestination()),
  78.             'controller_name' => 'FormController',
  79.             'contractOrder' => $contractOrder,
  80.         ]);
  81.     }
  82.     #[Route('/form3'name'app_form_3')]
  83.     public function step3(ContractService $contractServiceTermService $termServiceRequest $request): Response
  84.     {
  85.         $contractOrder $this->getContractOrder();
  86.         $form $this->createForm(ContractOrderType::class, $contractOrder, [
  87.             'action' => $this->generateUrl('app_form_3'),
  88.             'method' => 'POST',
  89.         ]);
  90.         $loginForm $this->createForm(ClientLoginType::class, null, [
  91.             'action' => $this->generateUrl('app_form_3'),
  92.             'method' => 'POST',
  93.         ]);
  94.         $loginForm->handleRequest($request);
  95.         if ($loginForm->isSubmitted() && $loginForm->isValid()) {
  96.             $client $this->clientRepository->findOneBy(['phone' => $loginForm->get('phone')->getData(), 'email' => $loginForm->get('email')->getData()]);
  97.             if ($client instanceof Client) {
  98.                 $contractOrder->setClient($client);
  99.                 $this->contractOrderRepository->save($contractOrdertrue);
  100.                 return $this->redirectToRoute('app_form_3');
  101.             }
  102.         }
  103.         $form->handleRequest($request);
  104.         if ($form->isSubmitted() && $form->isValid()) {
  105.             $this->clientRepository->save($contractOrder->getClient());
  106.             $this->contractOrderRepository->save($contractOrdertrue);
  107.             return $this->redirectToRoute('app_form_4');
  108.         }
  109.         return $this->render('Pages/Form/step3.html.twig', [
  110.             'terms' => $termService->getTermsForForm(),
  111.             'destinations' => $this->destinationRepository->findBy([], ['sortOrder' => 'ASC''id' => 'ASC']),
  112.             'termsList' => [],
  113.             'controller_name' => 'FormController',
  114.             'contractOrder' => $contractOrder,
  115.             'form' => $form->createView(),
  116.             'loginForm' => $loginForm->createView(),
  117.         ]);
  118.     }
  119.     #[Route('/form4'name'app_form_4')]
  120.     public function step4(ContractService $contractServiceTermService $termServiceRequest $request): Response
  121.     {
  122.         $contractOrder $this->getContractOrder();
  123.         $form $this->createForm(ContractClientType::class, $contractOrder, [
  124.             'action' => $this->generateUrl('app_form_4'),
  125.             'method' => 'POST',
  126.         ]);
  127.         $form->handleRequest($request);
  128.         $errors = [];
  129.         if ($form->isSubmitted() && $form->isValid()) {
  130.             /** @var ContractOrder $data */
  131.             $data $form->getData();
  132.             $errors = [];
  133.             if ($this->validateContractClients($data$errors)) {
  134.                 if (empty($data->getContractClient1()->getLastname())) {
  135.                     $data->setContractClient1(null);
  136.                 } else {
  137.                     $this->clientRepository->save($data->getContractClient1());
  138.                 }
  139.                 if (empty($data->getContractClient2()->getLastname())) {
  140.                     $data->setContractClient2(null);
  141.                 } else {
  142.                     $this->clientRepository->save($data->getContractClient2());
  143.                 }
  144.                 if (empty($data->getContractClient3()->getLastname())) {
  145.                     $data->setContractClient3(null);
  146.                 } else {
  147.                     $this->clientRepository->save($data->getContractClient3());
  148.                 }
  149.                 if (empty($data->getContractClient4()->getLastname())) {
  150.                     $data->setContractClient4(null);
  151.                 } else {
  152.                     $this->clientRepository->save($data->getContractClient4());
  153.                 }
  154.                 if (empty($data->getContractClient5()->getLastname())) {
  155.                     $data->setContractClient5(null);
  156.                 } else {
  157.                     $this->clientRepository->save($data->getContractClient5());
  158.                 }
  159.                 if (empty($data->getContractClient6()->getLastname())) {
  160.                     $data->setContractClient6(null);
  161.                 } else {
  162.                     $this->clientRepository->save($data->getContractClient6());
  163.                 }
  164.                 $this->contractOrderRepository->save($contractOrdertrue);
  165.                 return $this->redirectToRoute('app_form_5');
  166.             }
  167.         }
  168.         return $this->render('Pages/Form/step4.html.twig', [
  169.             'contractOrder' => $contractOrder,
  170.             'form' => $form->createView(),
  171.             'errors' => $errors,
  172.         ]);
  173.     }
  174.     #[Route('/form/5'name'app_form_5')]
  175.     public function step5(ContractService $contractServiceTermService $termServiceRequest $request): Response
  176.     {
  177.         $contractOrder $this->getContractOrder();
  178.         return $this->render('Pages/Form/step5.html.twig', [
  179.             'contractOrder' => $contractOrder,
  180.         ]);
  181.     }
  182.     #[Route('/form/finish'name'app_form_finish')]
  183.     public function finish(ContractOrderService $contractOrderServiceTermService $termServiceRequest $request): Response
  184.     {
  185.         $contractOrder $this->getContractOrder();
  186.         if ($contractOrderService->saveContractOrder($contractOrder)) {
  187.             $this->requestStack->getSession()->remove('contractOrderId');
  188.             return $this->redirectToRoute('app_form_done');
  189.         }
  190.         die("Něco se pokazilo");
  191.     }
  192.     #[Route('/form/dekujeme'name'app_form_done')]
  193.     public function done(ContractService $contractServiceTermService $termServiceRequest $request): Response
  194.     {
  195.         return $this->render('Pages/Form/done.html.twig', [
  196.         ]);
  197.     }
  198.     private function getContractOrder(): ContractOrder
  199.     {
  200.         $contractOrder $this->contractOrderRepository->findOneBy(['id' => $this->requestStack->getSession()->get('contractOrderId'0)]);
  201.         if (!$contractOrder instanceof ContractOrder) {
  202.             $contractOrder = new ContractOrder();
  203.             $this->contractOrderRepository->save($contractOrdertrue);
  204.         }
  205.         $this->requestStack->getSession()->set('contractOrderId'$contractOrder->getId());
  206.         return $contractOrder;
  207.     }
  208.     #[Route('/form_select_destination/{id}'name'form_select_destination')]
  209.     public function selectDestination(int $idRequest $request): Response
  210.     {
  211.         $contractOrder $this->getContractOrder();
  212.         $destination $this->destinationRepository->find($id);
  213.         $contractOrder->setDestination($destination);
  214.         $this->contractOrderRepository->save($contractOrdertrue);
  215.         return $this->redirectToRoute('app_form_2');
  216.     }
  217.     #[Route('/form_select_term_price/{id}'name'form_select_term_price')]
  218.     public function selectTermPrice(int $idRequest $request): Response
  219.     {
  220.         /** @var TermPrice $termPrice */
  221.         $termPrice $this->termPriceRepository->find($id);
  222.         $contractOrder $this->getContractOrder();
  223.         $contractOrder->setDestination($termPrice->getAccommodation()->getDestination());
  224.         $contractOrder->setTerm($termPrice->getTerm());
  225.         $contractOrder->setAccommodation($termPrice->getAccommodation());
  226.         $this->contractOrderRepository->save($contractOrdertrue);
  227.         return $this->redirectToRoute('app_form_3');
  228.     }
  229.     #[Route('/form_select_term/{id}'name'form_select_term')]
  230.     public function selectTerm(int $idRequest $request): Response
  231.     {
  232.         /** @var Term $term */
  233.         $term $this->termRepository->find($id);
  234.         $contractOrder $this->getContractOrder();
  235.         $contractOrder->setDestination($term->getDestination());
  236.         $contractOrder->setTerm($term);
  237.         $contractOrder->setAccommodation(null);
  238.         $this->contractOrderRepository->save($contractOrdertrue);
  239.         return $this->redirectToRoute('app_form_3');
  240.     }
  241.     #[Route('/form_select_term_accommodation/{termId}/{id}'name'form_select_term_accommodation')]
  242.     public function selectTermAccommodation(int $termIdint $idRequest $request): Response
  243.     {
  244.         /** @var Term $term */
  245.         $term $this->termRepository->find($termId);
  246.         /** @var Accommodation $accommodation */
  247.         $accommodation $this->accommodationRepository->find($id);
  248.         if (!$accommodation || !$accommodation->getIsActive()) {
  249.             throw $this->createNotFoundException('Ubytování není dostupné.');
  250.         }
  251.         $contractOrder $this->getContractOrder();
  252.         $contractOrder->setDestination($term->getDestination());
  253.         $contractOrder->setTerm($term);
  254.         $contractOrder->setAccommodation($accommodation);
  255.         $this->contractOrderRepository->save($contractOrdertrue);
  256.         return $this->redirectToRoute('app_form_3');
  257.     }
  258.     private function validateContractClients(ContractOrder $data, array &$errors)
  259.     {
  260.         $isPag $data->getDestination()->getId() == 1;
  261.         $client1 $data->getContractClient1();
  262.         if($client1->getIdNumber()==$data->getClient()->getIdNumber()) {
  263.             $errors[1]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  264.         }
  265.         if($client1->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  266.             $errors[1]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  267.         }
  268.         if (!empty($client1->getLastname()) || !empty($client1->getFirstname()) || !empty($client1->getBirthDate())) {
  269.             if (empty($client1->getLastname())) {
  270.                 $errors[1]['lastname'] = 'Příjmení spolucestujícího je povinné';
  271.             }
  272.             if (empty($client1->getFirstname())) {
  273.                 $errors[1]['firstname'] = 'Jméno spolucestujícího je povinné';
  274.             }
  275.             if (empty($client1->getBirthDate())) {
  276.                 $errors[1]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  277.             }
  278.             if (empty($client1->getNationality()) && !$isPag) {
  279.                 $errors[1]['nationality'] = 'Občanství spolucestujícího je povinné';
  280.             }
  281.             if (empty($client1->getBirthPlace()) && $isPag) {
  282.                 $errors[1]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  283.             }
  284.         }
  285.         $client2 $data->getContractClient2();
  286.         if($client2->getIdNumber()==$data->getClient()->getIdNumber()) {
  287.             $errors[2]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  288.         }
  289.         if($client2->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  290.             $errors[2]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  291.         }
  292.         if (!empty($client2->getLastname()) || !empty($client2->getFirstname()) || !empty($client2->getBirthDate())) {
  293.             if (empty($client2->getLastname())) {
  294.                 $errors[2]['lastname'] = 'Příjmení spolucestujícího je povinné';
  295.             }
  296.             if (empty($client2->getFirstname())) {
  297.                 $errors[2]['firstname'] = 'Jméno spolucestujícího je povinné';
  298.             }
  299.             if (empty($client2->getBirthDate())) {
  300.                 $errors[2]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  301.             }
  302.             if (empty($client2->getNationality()) && !$isPag) {
  303.                 $errors[2]['nationality'] = 'Občanství spolucestujícího je povinné';
  304.             }
  305.             if (empty($client2->getBirthPlace()) && $isPag) {
  306.                 $errors[2]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  307.             }
  308.         }
  309.         $client3 $data->getContractClient3();
  310.         if($client3->getIdNumber()==$data->getClient()->getIdNumber()) {
  311.             $errors[3]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  312.         }
  313.         if($client3->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  314.             $errors[3]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  315.         }
  316.         if (!empty($client3->getLastname()) || !empty($client3->getFirstname()) || !empty($client3->getBirthDate())) {
  317.             if (empty($client3->getLastname())) {
  318.                 $errors[3]['lastname'] = 'Příjmení spolucestujícího je povinné';
  319.             }
  320.             if (empty($client3->getFirstname())) {
  321.                 $errors[3]['firstname'] = 'Jméno spolucestujícího je povinné';
  322.             }
  323.             if (empty($client3->getBirthDate())) {
  324.                 $errors[3]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  325.             }
  326.             if (empty($client3->getNationality()) && !$isPag) {
  327.                 $errors[3]['nationality'] = 'Občanství spolucestujícího je povinné';
  328.             }
  329.             if (empty($client2->getBirthPlace()) && $isPag) {
  330.                 $errors[3]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  331.             }
  332.         }
  333.         $client4 $data->getContractClient4();
  334.         if($client4->getIdNumber()==$data->getClient()->getIdNumber()) {
  335.             $errors[4]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  336.         }
  337.         if($client4->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  338.             $errors[4]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  339.         }
  340.         if (!empty($client4->getLastname()) || !empty($client4->getFirstname()) || !empty($client4->getBirthDate())) {
  341.             if (empty($client4->getLastname())) {
  342.                 $errors[4]['lastname'] = 'Příjmení spolucestujícího je povinné';
  343.             }
  344.             if (empty($client4->getFirstname())) {
  345.                 $errors[4]['firstname'] = 'Jméno spolucestujícího je povinné';
  346.             }
  347.             if (empty($client4->getBirthDate())) {
  348.                 $errors[4]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  349.             }
  350.             if (empty($client4->getNationality()) && !$isPag) {
  351.                 $errors[4]['nationality'] = 'Občanství spolucestujícího je povinné';
  352.             }
  353.             if (empty($client2->getBirthPlace()) && $isPag) {
  354.                 $errors[4]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  355.             }
  356.         }
  357.         $client5 $data->getContractClient5();
  358.         if($client5->getIdNumber()==$data->getClient()->getIdNumber()) {
  359.             $errors[5]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  360.         }
  361.         if($client5->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  362.             $errors[5]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  363.         }
  364.         if (!empty($client5->getLastname()) || !empty($client5->getFirstname()) || !empty($client5->getBirthDate())) {
  365.             if (empty($client5->getLastname())) {
  366.                 $errors[5]['lastname'] = 'Příjmení spolucestujícího je povinné';
  367.             }
  368.             if (empty($client5->getFirstname())) {
  369.                 $errors[5]['firstname'] = 'Jméno spolucestujícího je povinné';
  370.             }
  371.             if (empty($client5->getBirthDate())) {
  372.                 $errors[5]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  373.             }
  374.             if (empty($client5->getNationality()) && !$isPag) {
  375.                 $errors[5]['nationality'] = 'Občanství spolucestujícího je povinné';
  376.             }
  377.             if (empty($client2->getBirthPlace()) && $isPag) {
  378.                 $errors[5]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  379.             }
  380.         }
  381.         $client6 $data->getContractClient6();
  382.         if($client6->getIdNumber()==$data->getClient()->getIdNumber()) {
  383.             $errors[6]['idNumber'] = 'Číslo dokladu musí být odlišné od hlavního cestujícího';
  384.         }
  385.         if (!empty($client6->getLastname()) || !empty($client6->getFirstname()) || !empty($client6->getBirthDate())) {
  386.             if (empty($client6->getLastname())) {
  387.                 $errors[6]['lastname'] = 'Příjmení spolucestujícího je povinné';
  388.             }
  389.             if (empty($client6->getFirstname())) {
  390.                 $errors[6]['firstname'] = 'Jméno spolucestujícího je povinné';
  391.             }
  392.             if (empty($client6->getBirthDate())) {
  393.                 $errors[6]['birthDate'] = 'Datum narození spolucestujícího je povinné';
  394.             }
  395.             if (empty($client6->getNationality()) && !$isPag) {
  396.                 $errors[6]['nationality'] = 'Občanství spolucestujícího je povinné';
  397.             }
  398.             if (empty($client2->getBirthPlace()) && $isPag) {
  399.                 $errors[6]['birthPlace'] = 'Místo narození spolucestujícího je povinné';
  400.             }
  401.         }
  402.         if($client6->getBirthDate()?->format('Y-m-d')==$data->getClient()->getBirthDate()?->format('Y-m-d')) {
  403.             $errors[6]['birthDate'] = 'Hlavní host a spolucestující nemohou mít stejné datum narození';
  404.         }
  405.         return empty($errors);
  406.     }
  407. }