src/Controller/OrderController.php line 723

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Company;
  4. use App\Entity\File\Contract;
  5. use App\Entity\File\DigiSign;
  6. use App\Entity\File\File;
  7. use App\Entity\File\Signi;
  8. use App\Entity\File\SimpleFile;
  9. use App\Entity\Order;
  10. use App\Entity\OrderEshop;
  11. use App\Entity\Product;
  12. use App\Entity\User;
  13. use App\Exception\FulltextSearchNullResults;
  14. use App\Form\Filter\OrderFilterType;
  15. use App\Form\OrderType;
  16. use App\Helper\EnumsHelper;
  17. use App\Model\FileModel;
  18. use App\Model\RewardLineModel;
  19. use App\Model\RewardModel;
  20. use App\Model\UserModel;
  21. use App\Repository\FileRepository;
  22. use App\Repository\OrderRepository;
  23. use App\Repository\ProductRepository;
  24. use App\Repository\UserRepository;
  25. use App\Security\Voter\OrderVoter;
  26. use App\Services\GalosoftAdamna;
  27. use App\Services\GalosoftDigiSign;
  28. use App\Services\GalosoftDigiSignGenerator;
  29. use App\Services\GalosoftMailerInterface;
  30. use App\Services\GalosoftNotifications;
  31. use App\Services\GalosoftPdfGenerator;
  32. use App\Services\GalosoftRaynet;
  33. use App\Services\GalosoftSigni;
  34. use App\Services\GalosoftSigniGenerator;
  35. use App\Services\GalosoftValuablePaperGenerator;
  36. use App\Services\OrderFilter;
  37. use App\Services\OrdersExporter;
  38. use Doctrine\ORM\EntityManagerInterface;
  39. use Knp\Component\Pager\PaginatorInterface;
  40. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  41. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  42. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  43. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  44. use Symfony\Component\HttpFoundation\JsonResponse;
  45. use Symfony\Component\HttpFoundation\Request;
  46. use Symfony\Component\HttpFoundation\Response;
  47. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  48. use Symfony\Component\HttpFoundation\Session\Session;
  49. use Symfony\Component\HttpFoundation\StreamedResponse;
  50. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  51. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  52. use Symfony\Component\Routing\Annotation\Route;
  53. /**
  54.  *
  55.  */
  56. class OrderController extends AbstractController
  57. {
  58.     /**
  59.      * @isGranted("ROLE_MERCHANT")
  60.      * @Route("/order", name="app_order_index", methods={"GET", "POST"})
  61.      */
  62.     public function index(FileRepository $repository,
  63.                           OrderRepository $orderRepository,
  64.                           Request $request,
  65.                           PaginatorInterface $paginator,
  66.                           GalosoftSigni $galosoftSigni,
  67.                           Session $session,
  68.                           EntityManagerInterface $entityManager,
  69.                           OrderFilter $orderFilter,
  70.                           UserModel $userModel,
  71.                           \Symfony\Component\Security\Core\Security $security
  72.     ): Response
  73.     {
  74.         // clear filter
  75.         if($orderFilter->clearFilter($session$request) == true){
  76.             return $this->redirect($this->generateUrl('app_order_index'));
  77.         }
  78.         // ulozeni strankovace
  79.         $paginationSettings $orderFilter->storePaginationSettings($session$request);
  80.         // predvyplneni formulare filtrace
  81.         $data $orderFilter->loadPrefilledData($session$entityManager);
  82.         $formFilter $this->createForm(OrderFilterType::class, $data, [
  83.             'action' => $this->generateUrl('app_order_index'),
  84.             'method' => 'post',
  85.             'request' => $request,
  86.         ]);
  87.         // ulozim filtr do session
  88.         $orderFilter->storeFilter($formFilter$request$session);
  89.         // aplikace filtru na query builder
  90.         $queryBuilder $orderRepository->createQueryBuilder('o');
  91.         try {
  92.             $orders $orderFilter->applyFilter($session$request$queryBuilder$paginator);
  93.         }catch (FulltextSearchNullResults $e){
  94.             $orders = [];
  95.         }
  96.         return $this->render('order/index.html.twig', [
  97.             'orders' => $orders,
  98.             'filter' => $formFilter->createView(),
  99.             'ordering' => $paginationSettings['ordering'],
  100.             'pageSize' => $paginationSettings['pageSize'],
  101.             'isOnlyMetalist' => $orderRepository->isOnlyMetalist()
  102.         ]);
  103.     }
  104.     /**
  105.      * @Route("/order/export/{type}", name="app_order_export", methods={"GET"})
  106.      */
  107.     public function export(
  108.         OrderRepository $orderRepository,
  109.         Session $session,
  110.         Request $request,
  111.         OrderFilter $orderFilter,
  112.         OrdersExporter $ordersExporter,
  113.         $type 'csv'
  114.     ){
  115.         $queryBuilder $orderRepository->createQueryBuilder('o');
  116.         $orders $orderFilter->applyFilter($session$request$queryBuilder);
  117.         $response = match ($type) {
  118.             // default 'csv'  => $ordersExporter->exportToCSV($orders->getQuery()->getResult()),
  119.             'xlsx' => $ordersExporter->exportToXlsx($orders->getQuery()->getResult()),
  120.             default => $ordersExporter->exportToCSV($orders->getQuery()->getResult()),
  121.         };
  122.         return $response;
  123.     }
  124.     /**
  125.      * @IsGranted("ROLE_ADMIN")
  126.      *
  127.      * @Route("/order/report/{type}", name="app_order_report", methods={"GET"})
  128.      */
  129.     public function report(
  130.         OrderRepository $orderRepository,
  131.         Session $session,
  132.         Request $request,
  133.         OrderFilter $orderFilter,
  134.         RewardModel $rewardModel,
  135.         OrdersExporter $ordersExporter,
  136.         $type 'csv'
  137.     ){
  138.         $queryBuilder $orderRepository->createQueryBuilder('o');
  139.         $orders $orderFilter->applyFilter($session$request$queryBuilder);
  140.         $rewards $rewardModel->byOrderList($orders->getQuery()->getResult());
  141.         $response = match ($type) {
  142.             // default 'csv'  => $ordersExporter->exportToCSV($orders->getQuery()->getResult()),
  143.             'xlsx' => $ordersExporter->reportToXlsx($rewards),
  144.             default => $ordersExporter->reportToCSV($rewards),
  145.         };
  146.         return $response;
  147.     }
  148.     /**
  149.      * @Route("/order/new", name="app_order_new", methods={"GET", "POST"})
  150.      */
  151.     public function new(Request $requestOrderRepository $orderRepository): Response
  152.     {
  153.         $order = new Order();
  154.         $currentPersonType $order->getPersonType();
  155.         if(is_null($currentPersonType)){
  156.             $order->setPersonType('FO');
  157.         }
  158.         $options = [
  159.             'action' => $this->generateUrl('app_order_new_process'),
  160.             'method' => 'post',
  161.             'logged_user' => $this->getUser()
  162.         ];
  163.         $form $this->createForm(OrderType::class, $order$options);
  164.         $form->handleRequest($request);
  165.         return $this->render('order/new.html.twig', [
  166.             'form' => $form->createView(),
  167.             'product' => $order->getProduct(),
  168.             'reloadUrl' => $this->generateUrl('app_order_new')
  169.         ]);
  170.     }
  171.     /**
  172.      * @Route("/order/{hash}/preview", name="app_order_preview")
  173.      */
  174.     public function previewPdf(
  175.         Request $request,
  176.         $hash,
  177.         OrderRepository $orderRepository,
  178.         EntityManagerInterface $entityManager,
  179.         GalosoftPdfGenerator $pdfGenerator
  180.     ){
  181.         $order $orderRepository->findOneBy(['hash' => $hash]);
  182.         if(!$order){
  183.             throw new NotFoundHttpException('Objednávka nenalezena');
  184.         }
  185.         $pdf $pdfGenerator->generatePdf($orderfalse);
  186.         $response = new StreamedResponse(function() use ($pdf) {
  187.             $outputStream fopen('php://output''wb');
  188.             $fileStream fopen($pdf->getUrlDel(), 'r+');
  189.             stream_copy_to_stream($fileStream$outputStream);
  190.         });
  191.         $response->headers->set('Content-Type'$pdf->getMime());
  192.         return $response;
  193.     }
  194.     /**
  195.      * @Route("/order/{order}", name="app_order_detail", requirements={"order"="\d+"})
  196.      */
  197.     public function detail(Order $orderUserModel $userModel\Symfony\Component\Security\Core\Security $security): Response
  198.     {
  199.         $this->denyAccessUnlessGranted(OrderVoter::NOT_ANONYMIZE$order);
  200.         return $this->render('order/view.html.twig', [
  201.             'order' => $order,
  202.             'isOrderMetalist' => $order instanceof OrderEshop
  203.         ]);
  204.     }
  205.     /**
  206.      * @Route("/order/{order}/sequence-number", name="app_order_save_sequence_number", requirements={"order"="\d+"})
  207.      */
  208.     public function saveSequenceNumber(
  209.         Request $request,
  210.         Order $order,
  211.         EntityManagerInterface $entityManager
  212.     ): Response
  213.     {
  214.         try {
  215.             //TODO: Add checking access for admin only
  216.             //$this->denyAccessUnlessGranted(OrderVoter::VIEW, $order);
  217.             $sequenceNumber $request->get('sequenceNumber'null);
  218.             if (!is_null($sequenceNumber)) {
  219.                 $order->setSequenceNumber($sequenceNumber);
  220.                 $entityManager->flush();
  221.             }
  222.             return $this->json(['status' => 'success']);
  223.         } catch (\Exception $exception) {
  224.             return $this->json(['status' => 'error''message' => $exception->getMessage()]);
  225.         }
  226.     }
  227.     /**
  228.      * @Route("/order/{order}/valuable-paper/generate", name="app_order_valuable_paper_generate", requirements={"order"="\d+"})
  229.      */
  230.     public function generateValuablePaper(
  231.         Request $request,
  232.         Order $order,
  233.         EntityManagerInterface $entityManager,
  234.         GalosoftValuablePaperGenerator $galosoftValuablePaperGenerator
  235.     ): Response
  236.     {
  237.         try {
  238.             //TODO: Add checking access for admin only
  239.             //$this->denyAccessUnlessGranted(OrderVoter::VIEW, $order);
  240.             // generate and save valuable paper
  241.             $galosoftValuablePaperGenerator->generatePdf($order);
  242.             // generate and save valuable paper
  243.             $galosoftValuablePaperGenerator->generatePdf($ordertrueGalosoftValuablePaperGenerator::TYPE_PDF_VALUABLE_PROTOCOL);
  244.             return $this->forward(OrderController::class . '::detail', [
  245.                 'order' => $order->getId()
  246.             ]);
  247.         } catch (\Exception $exception) {
  248.             return $this->json(['status' => 'error''message' => $exception->getMessage()]);
  249.         }
  250.     }
  251.     /**
  252.      * @Route("/order/{order}/edit", name="app_order_edit", requirements={"order"="\d+"})
  253.      */
  254.     public function show(Order $order): Response
  255.     {
  256.         $this->denyAccessUnlessGranted(OrderVoter::EDIT$order);
  257.         $form $this->createForm(OrderType::class, $order, [
  258.             'action' => $this->generateUrl('app_order_edit_process', ['order' => $order->getId()]),
  259.             'method' => 'post',
  260.             'edit_entity' => true,
  261.             'logged_user' => $this->getUser()
  262.         ]);
  263.         return $this->render('order/new.html.twig', [
  264.             'form' => $form->createView(),
  265.             'product' => $order->getProduct(),
  266.             'reloadUrl' => $this->generateUrl('app_order_new')
  267.         ]);
  268.     }
  269.     /**
  270.      * To complete data from api
  271.      *
  272.      * @Route("/dokonceni-objednavky/{hash}", name="app_order_complete")
  273.      */
  274.     public function complete(Request $request$hashOrderRepository $orderRepositoryProductRepository $productRepository): Response
  275.     {
  276.         $order $orderRepository->findOneBy(['hash' => $hash]);
  277.         $now = new \DateTime('now');
  278.         if(!$order || $now $order->getApiValidTill()){
  279.             return $this->render('errors/404.html.twig',
  280.             [
  281.                 'title' => 'Ouha! Objednávku se nepodařilo najít!',
  282.                 'description' => 'Požadovaná objednávka nebyla nalezena nebo expirovala její platnost. <br /> Pokud máte dotazy ozvěte se nám prosím na email <a href="objednavky@efsgroup.cz">objednavky@efsgroup.cz</a>.'
  283.             ]);
  284.         }
  285.         $currentPersonType $order->getPersonType();
  286.         if(is_null($currentPersonType)){
  287.             $order->setPersonType('FO');
  288.         }
  289.         if(isset($request->get('order')['product'])
  290.             && (int)$request->get('order')['product'] != $order->getProduct()->getId()
  291.         ){
  292.             // pri zmene produktu, aby se spravne renderoval formular tj. dependece atd. vlozim do objednavky novy
  293.             // produkt jiz ted a ne az skrze handlerequest
  294.             $formSentProduct $productRepository->findOneBy(['id' => $request->get('order')['product']]);
  295.             if(false == is_null($formSentProduct)){
  296.                 $order->setProduct($formSentProduct);
  297.                 // array data from request
  298.                 $requestOrder $request->get('order');
  299.                 $requestOrder['company'] = $formSentProduct->getCompany()->getId();
  300.                 $request->request->set('order'$requestOrder);
  301.             }
  302.             //$order->setCompany($formSentProduct->getCompany());
  303.         }
  304.         $form $this->createForm(OrderType::class, $order, [
  305.             'action' => $this->generateUrl('app_order_edit_process', ['order' => $order->getId()]),
  306.             'method' => 'post',
  307.             'edit_entity' => true,
  308.             'api_call' => true,
  309.             'api_complete' => true,
  310.             'logged_user' => $this->getUser()
  311.         ]);
  312.         $form->handleRequest($request);
  313.         return $this->render('order/new.html.twig', [
  314.             'form' => $form->createView(),
  315.             'completeOrder' => true,
  316.             'product' => $order->getProduct(),
  317.             'reloadUrl' => $this->generateUrl('app_order_complete', ['hash' => $hash]),
  318.         ]);
  319.     }
  320.     /**
  321.      * @Route("/order/new/process", name="app_order_new_process", methods={"POST"})
  322.      * @Route("/order/{order}/edit/process", name="app_order_edit_process", methods={"POST"})
  323.      */
  324.     public function saveProcess(
  325.         Request $request,
  326.         OrderRepository $orderRepository,
  327.         Order $order null,
  328.         GalosoftPdfGenerator $pdfGenerator,
  329.         GalosoftSigniGenerator $signiGenerator,
  330.         GalosoftSigni $signi,
  331.         EntityManagerInterface $entityManager,
  332.         UserPasswordHasherInterface $userPasswordHasher,
  333.         GalosoftMailerInterface $galosoftMailer,
  334.         UserRepository $userRepository,
  335.         GalosoftRaynet $galosoftRaynet,
  336.         GalosoftDigiSignGenerator $digiSignGenerator,
  337.         GalosoftDigiSign $digiSign,
  338.         GalosoftAdamna $galosoftAdamna
  339.     ): Response
  340.     {
  341.         $orderEnt is_null($order) ? new Order() : $order;
  342.         $orderData $request->request->get('order');
  343.         if(isset($orderData['api_call']) && $orderData['api_call'] == "1") {
  344.             $orderOriginal = clone $order;
  345.         }
  346.         $form $this->createForm(OrderType::class, $orderEnt, [
  347.             'edit_entity' => is_null($order) === false,
  348.             'allow_extra_fields' => true,
  349.             'logged_user' => $this->getUser()
  350.         ]);
  351.         $form->handleRequest($request);
  352.         // vratim do puvodni podoby disabled data
  353.         if(isset($orderData['api_call']) && $orderData['api_call'] == "1") {
  354.             $orderEnt->setUser($orderOriginal->getUser())
  355.                 ->setMerchant($orderOriginal->getMerchant())
  356.                 ->setMerchantCode($orderOriginal->getMerchantCode())
  357.                 ->setCompany($orderOriginal->getCompany());
  358.         }
  359.         if ($form->isSubmitted() && $form->isValid()) {
  360.             //try {
  361.                 $formOwnAggreements $request->request->get('ownAgreements', []);
  362.                 $productOwnAgreements $order->getProduct()->getOwnAgreementsFiles();
  363.                 $ownAgreementsForOrder = [];
  364.                 // pokud mame nastavene souhlasy v objednavce a na produktu provedeme sparovani a priradime dane labely
  365.                 foreach ($productOwnAgreements as $productOwnAgreement) {
  366.                     $oneOwn = [];
  367.                     // jedna se o checkbox, budeme zaznamenavat true/false
  368.                     if ($productOwnAgreement->isRequired()) {
  369.                         if ($productOwnAgreement->getFileType() == 'link' || $productOwnAgreement->getFileType() == 'file') {
  370.                             $oneOwn['label'] = $productOwnAgreement->getName();
  371.                             $oneOwn['consent'] = (bool)array_key_exists($productOwnAgreement->getId(), (array)$formOwnAggreements);
  372.                         } else {
  373.                             $oneOwn['label'] = $productOwnAgreement->getHtmlText();
  374.                             $oneOwn['consent'] = (bool)array_key_exists($productOwnAgreement->getId(), (array)$formOwnAggreements);
  375.                         }
  376.                         $ownAgreementsForOrder[] = $oneOwn;
  377.                     }
  378.                 }
  379.                 $orderEnt->setOwnAgreements($ownAgreementsForOrder);
  380. //            }catch (\Exception $exception){
  381. //
  382. //            }
  383.             $genSigni = @isset($request->request->get('order', [])['generateSigni']) ? @$request->request->get('order', [])['generateSigni'] : false;
  384.             $genPdf = @isset($request->request->get('order', [])['generatePdf']) ? @$request->request->get('order', [])['generatePdf'] : false;
  385.             $genDigiSign = @isset($request->request->get('order', [])['generateDigiSign']) ? @$request->request->get('order', [])['generateDigiSign'] : false;
  386.             $pdfPreview true// vzdycky generujeme pdf pro nahled
  387.             $genRaynet $orderEnt->getProduct()->isGeneratorRaynet();
  388.             $genAdamna $orderEnt->getProduct()->isUseAdamna();
  389.             $what '';
  390.             if((boolean)$genPdf == true){
  391.                 $what .= 'p';
  392.             }
  393.             if((boolean)$genSigni == true){
  394.                 $what .= 's';
  395.             }
  396.             if((boolean)$genDigiSign == true){
  397.                 $what .= 'd';
  398.             }
  399.             if((boolean)$genRaynet == true){
  400.                 $what .= 'r';
  401.             }
  402.             if((boolean)$genAdamna == true){
  403.                 $what .= 'a';
  404.             }
  405.             $targetUrl $this->generateUrl('app_order_index');
  406.             if(isset($orderData['api_call']) && $orderData['api_call'] == "1") {
  407.                 $orderEnt->setWhatGenerated($what);
  408.                 $orderEnt->setReinvest((bool)$orderData['reinvest']);
  409.                 $targetUrl $this->generateUrl('app_order_thankyou', [
  410.                     'hash' => $orderEnt->getHash()
  411.                 ]);
  412.             }
  413.             try {
  414.                 if($orderEnt->getUser() == null){
  415.                     $alreadyStored $userRepository->findOneBy(['email' => $orderEnt->getEmail()]);
  416.                     if(is_null($alreadyStored)) {
  417.                         $user = new User();
  418.                         $user->setEmail($orderEnt->getEmail())
  419.                             ->setActive(false)
  420.                             ->setIsVerified(false)
  421.                             ->setRoles(['ROLE_CUSTOMER'])
  422.                             ->setName($orderEnt->getName())
  423.                             ->setSurname($orderEnt->getSurname())
  424.                             ->setPassword($userPasswordHasher->hashPassword(
  425.                                 $user,
  426.                                 substr(md5(rand(10000999999999)), 08)
  427.                             ));
  428.                         $entityManager->persist($user);
  429.                     }else{
  430.                         $user $alreadyStored;
  431.                     }
  432.                     $orderEnt->setUser($user);
  433.                 }
  434.                 $orderRepository->store($orderEnttrue);
  435.                 if((boolean)$pdfPreview === true && $genPdf == false && $genSigni == false && $genDigiSign == false){
  436.                     return $this->json([
  437.                         'status' => 'success',
  438.                         'previewUrl' => $this->generateUrl('app_order_preview', [
  439.                             'hash' => $order->getHash()
  440.                         ])
  441.                     ]);
  442.                 }
  443.                 if ((boolean)$genPdf === true) {
  444.                     $pdf $pdfGenerator->generatePdf($orderEnt);
  445.                     $pdfData base64_encode(file_get_contents($pdf->getUrlDel()));
  446.                     $filename str_replace(['.docx''.json'], ''$pdf->getName()). ".pdf";
  447.                     if($request->get('preview'null) == "1"){
  448.                         // jedna se o preview, vracim pdfko
  449.                         return $this->json([
  450.                             'status' => 'success',
  451.                             'previewUrl' => $this->generateUrl('app_order_preview', [
  452.                                 'hash' => $order->getHash()
  453.                             ])
  454.                         ]);
  455.                     }
  456.                     if(isset($orderData['api_call']) && $orderData['api_call'] == "1") {
  457.                         // posilame soubor na email - pouze v pripade ze se jedna o prichod z emailu - tj. api_call == 1
  458.                         $galosoftMailer->send([
  459.                             "template_id" => "d-a0b8f951e1af4fa4b73e5682fd2cc5b2",
  460.                             "from" => array(
  461.                                 "name" => "EFS",
  462.                                 "email" => "info@efsgroup.cz"
  463.                             ),
  464.                             "personalizations" => array(
  465.                                 array(
  466.                                     "dynamic_template_data" => [
  467.                                         "product" => $order->getProduct()->getName(),
  468.                                         "company" => $order->getProduct()->getCompany()->getName()
  469.                                     ],
  470.                                     "to" => array(
  471.                                         array(
  472.                                             "email" => $orderEnt->getEmail()
  473.                                         ),
  474.                                     )
  475.                                 )
  476.                             ),
  477.                             "attachments" => [
  478.                                 [
  479.                                     "content" => $pdfData,
  480.                                     "type" => $pdf->getMime(),
  481.                                     "filename" => $filename
  482.                                 ]
  483.                           ]
  484.                         ]);
  485.                     }
  486.                 }
  487.                 if ((boolean)$genSigni === true && $orderEnt->getProduct()->isGeneratorSigni()) {
  488.                     $signiContract $signiGenerator->generateSigni($orderEntfalse);
  489.                     $result $signi->signContract($signiContract);
  490.                     if($result !== false) {
  491.                         $entityManager->flush();
  492.                     }else{
  493.                         throw new \Exception("Chyba při komunikaci se Signi.com");
  494.                     }
  495.                 }
  496.                 if ((boolean)$genDigiSign === true) {
  497.                     /** @var DigiSign $digiSignContract - Vygeneruje pdf, nasledne vytvorime obalku a posleme do digisignu */
  498.                     $digiSignContract $digiSignGenerator->generateDigiSign($orderEntfalse);
  499.                     $result $digiSign->send($digiSignContract->getEnvelopeId());
  500.                     if($result !== false && $result['title'] != 'Validation Failed') {
  501.                         $entityManager->flush();
  502.                     }else{
  503.                         throw new \Exception("Chyba při komunikaci se Digisign.org (".$result['detail'].")");
  504.                     }
  505.                 }
  506.                 if ((boolean)$genRaynet === true) {
  507.                     $result $galosoftRaynet->sendContract($orderEnt);
  508.                     if($result instanceof \stdClass && $result->success != 'true'){
  509.                         throw new \Exception($result->message);
  510.                     }
  511.                 }
  512.                 if ((boolean)$genAdamna === true) {
  513.                     $result $galosoftAdamna->sendContract($orderEnt);
  514.                     if($result instanceof \stdClass && $result->status != 'true'){
  515.                         throw new \Exception($result->message);
  516.                     }
  517.                 }
  518.                 $entityManager->flush();
  519.                 return $this->json([
  520.                     'status' => 'success',
  521.                     'target_url' => $targetUrl
  522.                 ]);
  523.             } catch (\Exception $exception) {
  524.                 return $this->json([
  525.                     'status' => 'error',
  526.                     'msg' => $exception->getMessage()
  527.                 ]);
  528.             }
  529.         } else {
  530.             return $this->json([
  531.                 'status' => 'error',
  532.                 'msg' => (string)$form->getErrors(truefalse)
  533.             ]);
  534.         }
  535.     }
  536.     /**
  537.      * @Route("/dokonceni-objednavky/{hash}/dekujeme", name="app_order_thankyou", methods={"GET"})
  538.      */
  539.     public function thankyou($hashOrderRepository $orderRepository)
  540.     {
  541.         $order $orderRepository->findOneBy(['hash' => $hash]);
  542.         if(!$order){
  543.             throw new NotFoundHttpException('Objednávka nenalezena');
  544.         }
  545.         $what $order->getWhatGenerated();
  546.         return $this->render('order/thankyou.html.twig', [
  547.             'what' => $what
  548.         ]);
  549.     }
  550.     /**
  551.      * @Route("/order/{order}/delete", name="app_order_delete", methods={"POST"}, requirements={"order"="\d+"})
  552.      */
  553.     public function delete(Request $request,
  554.                         Order $order,
  555.                         OrderRepository $orderRepository,
  556.                         FileRepository $fileRepository,
  557.                         EntityManagerInterface $entityManager
  558.     ): Response
  559.     {
  560.         try {
  561.             $this->denyAccessUnlessGranted(OrderVoter::DELETE$order);
  562.             $files $order->getFiles();
  563.             foreach ($files as $file){
  564.                 $fileRepository->remove($file);
  565.             }
  566.             $orderRepository->remove($ordertrue);
  567.             $entityManager->flush();
  568.             return $this->json([
  569.                 'status' => 'success'
  570.             ]);
  571.         } catch (\Exception $e) {
  572.             return $this->json([
  573.                 'status' => 'error',
  574.                 'msg' => $e->getMessage()
  575.             ]);
  576.         }
  577.     }
  578.     /**
  579.      * @Route("/order/{order}/state/{state}/date/{datechange}/{onoff}/", name="app_change_order_state", methods={"POST", "GET"}, requirements={"order"="\d+", "state"="inprogress|paid|sent|signed|paid2|paid3|transfer|vpDelivery"})
  580.      */
  581.     public function changeState(Order $order$state$datechange$onoffEntityManagerInterface $entityManager): Response
  582.     {
  583.         try {
  584.             if($datechange == 'now'){
  585.                 $date = new \DateTime('now');
  586.             }else {
  587.                 $date \DateTime::createFromFormat('d.m.Y'$datechange);
  588.             }
  589.             if(filter_var($onoffFILTER_VALIDATE_BOOLEAN) == false){
  590.                 $date null;
  591.             }
  592.             switch ($state){
  593.                 case "inprogress":
  594.                     $order->setInProgress(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  595.                         ->setInProgressDate($date);
  596.                     break;
  597.                 case "paid":
  598.                     $order->setPaid(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  599.                         ->setPaidDate($date);
  600.                     break;
  601.                 case "paid2":
  602.                     $order->setPaid2(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  603.                         ->setPaidDate2($date);
  604.                     break;
  605.                 case "paid3":
  606.                     $order->setPaid3(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  607.                         ->setPaidDate3($date);
  608.                     break;
  609.                 case "transfer":
  610.                     $order->setTransfer(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  611.                         ->setTransferDate($date);
  612.                     break;
  613.                 case "signed":
  614.                     $order->setSigned(filter_var($onoffFILTER_VALIDATE_BOOLEAN));
  615.                     $order->setSignedDate($date);
  616.                     break;
  617.                 case "vpDelivery":
  618.                     $order->setVpDelivery(filter_var($onoffFILTER_VALIDATE_BOOLEAN));
  619.                     $order->setVpDeliveryDate($date);
  620.                     break;
  621.                 case "sent":
  622.                     $order->setSent(filter_var($onoffFILTER_VALIDATE_BOOLEAN))
  623.                         ->setSentDate($date);
  624.                     break;
  625.                 default:
  626.                     throw new \Exception('Nepovoleny stav');
  627.             }
  628.             $entityManager->flush();
  629.             return $this->json([
  630.                 'status' => 'success'
  631.             ]);
  632.         } catch (\Exception $e) {
  633.             return $this->json([
  634.                 'status' => 'error',
  635.                 'msg' => $e->getMessage()
  636.             ]);
  637.         }
  638.     }
  639.     /**
  640.      * @Route("/order/{order}/{file}/delete", name="app_order_file_delete", methods={"GET"}, requirements={"file"="\d+", "order"="\d+"})
  641.      */
  642.     public function deleteFile(
  643.         Request $request,
  644.         Order $order,
  645.         File $file,
  646.         FileRepository $fileRepository
  647.     ): Response
  648.     {
  649.         try {
  650.             $this->denyAccessUnlessGranted(OrderVoter::DELETE$order);
  651.             $fileRepository->remove($filetrue);
  652.             return $this->render('order/view.html.twig', [
  653.                 'order' => $order,
  654.                 'isOrderMetalist' => $order instanceof OrderEshop
  655.             ]);
  656.         } catch (\Exception $e) {
  657.             return new JsonResponse(['statue' => 'error''msg' => $e->getMessage()]);
  658.         }
  659.     }
  660.     /**
  661.      * @Route("/order/download/digisign/{digiSign}/{output}", name="app_order_file_download_digisign", requirements={"digiSign"="\d+","output"="combined|only_log"})
  662.      * @param DigiSign $digiSign
  663.      */
  664.     public function downloadDigiSign($digiSign$outputGalosoftDigiSign $galosoftDigiSignFileRepository $fileRepository)
  665.     {
  666.         $digiSignFile $fileRepository->findOneBy(['id' => $digiSign]);
  667.         if(!$digiSignFile){
  668.             exit('Chyba aplikace');
  669.         }
  670.         $galosoftDigiSign->authenticate($digiSignFile->getProduct());
  671.         $data $galosoftDigiSign->download($digiSignFile->getEnvelopeId(), $output);
  672.         // Vytvořte odpověď prohlížeče jako PDF soubor
  673.         $response = new Response($data);
  674.         $response->headers->set('Content-Type''application/pdf');
  675.         $response->headers->set('Content-Disposition''attachment; filename="'.$digiSignFile->getName().'.pdf"'); // Nastavte název souboru
  676.         // Odpověď odeslat
  677.         return $response;
  678.     }
  679.     /**
  680.      * @Route("/order/download/signi/{signi}", name="app_order_file_download_signi", requirements={"signi"="\d+"})
  681.      * @param Signi $signi
  682.      */
  683.     public function downloadSigni(Signi $signiGalosoftSigni $galosoftSigni)
  684.     {
  685.         // TODO: Check rights or is owner
  686.         $filePath $galosoftSigni->downloadSigniContract($signi);
  687.         $pdfData file_get_contents($filePath);
  688.         $response = new Response($pdfData200, [
  689.             'Content-Length' => strlen($pdfData),
  690.             'Content-type' => 'application/pdf',
  691.             'Content-Transfer-Encoding' => 'binary'
  692.         ]);
  693.         $filename str_replace(['.docx''.json'], ''$signi->getName()). ".pdf";
  694.         $filenameFallback preg_replace(
  695.             '#^.*\.#',
  696.             md5($filename) . '.'$filename
  697.         );
  698.         $disposition $response->headers->makeDisposition(
  699.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  700.             $filename,
  701.             $filenameFallback
  702.         );
  703.         $response->headers->set('Content-Disposition'$disposition);
  704.         return $response;
  705.     }
  706.     /**
  707.      * @Route("/order/download/signicl/{signi}", name="app_order_file_download_signi_cl", requirements={"signi"="\d+"})
  708.      * @param Signi $signi
  709.      */
  710.     public function downloadSigniControlList(Signi $signiGalosoftSigni $galosoftSigni)
  711.     {
  712.         // TODO: Check rights or is owner
  713.         $filePath $galosoftSigni->downloadControlList($signi);
  714.         $pdfData file_get_contents($filePath);
  715.         $response = new Response($pdfData200, [
  716.             'Content-Length' => strlen($pdfData),
  717.             'Content-type' => 'application/pdf',
  718.             'Content-Transfer-Encoding' => 'binary'
  719.         ]);
  720.         $order $signi->getOrderEnt();
  721.         preg_match("/v\.([0-9]+)\.docx/"$signi->getName(), $parsedVersion);
  722.         $version = isset($parsedVersion[1]) ?  " v." .$parsedVersion[1] : "";
  723.         $filename "Kontrolní list digitálního podpisu ke smlouvě č." $order->getId() . $version".pdf";
  724.         $filenameFallback preg_replace(
  725.             '#^.*\.#',
  726.             md5($filename) . '.'$filename
  727.         );
  728.         $disposition $response->headers->makeDisposition(
  729.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  730.             $filename,
  731.             $filenameFallback
  732.         );
  733.         $response->headers->set('Content-Disposition'$disposition);
  734.         return $response;
  735.     }
  736.     /**
  737.      * @Route("/order/{id}/uploadchunk/", name="app_order_uploadefilechunk")
  738.      * @param Request $request
  739.      * @return string
  740.      */
  741.     public function uploadChunkFile(Request $requestOrder $orderFileModel $fileModel){
  742.         try {
  743.             $fileModel->uploadChunkFile($request$order);
  744.             return new JsonResponse(array(
  745.                 "success" => true
  746.             ));
  747.         } catch (Exception $e) {
  748.             return new JsonResponse(array(
  749.                 "success" => false,
  750.                 "error" => $e->getMessage()
  751.             ));
  752.         }
  753.     }
  754.     /**
  755.      * @Route("/order/{id}/upload/", name="app_order_uploadefile")
  756.      * @param Request $request
  757.      * @return string
  758.      */
  759.     public function uploadeFile(
  760.         Request $request,
  761.         EntityManagerInterface $em,
  762.         Order $order,
  763.         FileModel $fileModel,
  764.         GalosoftNotifications $galosoftNotifications
  765.     ){
  766.         try {
  767.             $result $fileModel->uploadOrderFile($request$order);
  768.             $simpleFile = new SimpleFile();
  769.             $simpleFile->setName($result['fileName'])
  770.                 ->setMime($result['mimeType'])
  771.                 ->setUrl($result['url'])
  772.                 ->setUrlDel($result['urlDel'])
  773.                 ->setSize($result['size'])
  774.                 ->setOrderEnt($order)
  775.                 ->setProduct($order->getProduct())
  776.                 ->setVersion('1.0')
  777.             ;
  778.             $em->persist($simpleFile);
  779.             $em->flush();
  780.             //$galosoftNotifications->manualUpload($order);
  781.             if(is_string($result['cmd'])){
  782.                 $cmd $result['cmd'];
  783.             }else{
  784.                 $cmd implode(" "$result['cmd']);
  785.             }
  786.             return $this->json([
  787.                 "success" => true,
  788.                 "origName" => $result['origName'],
  789.                 "slug" => $result['slug'],
  790.                 "name" => $result['name'],
  791.                 "type" => $result['type'],
  792.                 "cmd" => $cmd,
  793.                 "out" => $result['out']
  794.             ]);
  795.         }catch (\Exception $exception){
  796.             return $this->json([
  797.                 "success" => false,
  798.                 "error" => $exception->getMessage(),
  799.                 "preventRetry" => false
  800.             ]);
  801.         }
  802.     }
  803.     /**
  804.      * @Route("/order/download/file/{file}", name="app_order_file_download", requirements={"file"="\d+"})
  805.      * @param File $file
  806.      */
  807.     public function downloadFile(File $file)
  808.     {
  809.         $fileData file_get_contents($file->getUrlDel());
  810.         $response = new Response($fileData200, [
  811.             'Content-Length' => strlen($fileData),
  812.             'Content-type' => $file->getMime(),
  813.             'Content-Transfer-Encoding' => 'binary'
  814.         ]);
  815.         $filename $file->getName();
  816.         $filenameFallback preg_replace(
  817.             '#^.*\.#',
  818.             md5($filename) . '.'$filename
  819.         );
  820.         $disposition $response->headers->makeDisposition(
  821.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  822.             $filename,
  823.             $filenameFallback
  824.         );
  825.         $response->headers->set('Content-Disposition'$disposition);
  826.         return $response;
  827.     }
  828.     /**
  829.      * @Route("/order/download/pdf/{file}", name="app_order_file_download_file", requirements={"file"="\d+"})
  830.      * @param File $file
  831.      */
  832.     public function downloadPdf(File $fileGalosoftSigni $galosoftSigni)
  833.     {
  834.         // TODO: Check rights or is owner
  835.         $pdfData file_get_contents($file->getUrlDel());
  836.         $response = new Response($pdfData200, [
  837.             'Content-Length' => strlen($pdfData),
  838.             'Content-type' => 'application/pdf',
  839.             'Content-Transfer-Encoding' => 'binary'
  840.         ]);
  841.         $filename str_replace(['.docx''.json'], ''$file->getName()) . ".pdf";
  842.         $filenameFallback preg_replace(
  843.             '#^.*\.#',
  844.             md5($filename) . '.'$filename
  845.         );
  846.         $disposition $response->headers->makeDisposition(
  847.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  848.             $filename,
  849.             $filenameFallback
  850.         );
  851.         $response->headers->set('Content-Disposition'$disposition);
  852.         return $response;
  853.     }
  854. }