src/Controller/CheckoutController.php line 107

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Env;
  4. use App\Func;
  5. use App\DTO\AppDTO;
  6. use LogicException;
  7. use App\Entity\City;
  8. use App\Entity\Prod;
  9. use App\Entity\User;
  10. use App\Entity\Order;
  11. use App\Entity\Region;
  12. use App\Entity\Esystem;
  13. use App\Entity\Delivery;
  14. use App\Service\Pay\Pay;
  15. use App\Service\Auth\Auth;
  16. use App\Service\Cart\Cart;
  17. use App\Service\Mail\Mail;
  18. use App\Entity\Subdelivery;
  19. use App\Entity\Transaction;
  20. use App\Event\OrderMakedEvent;
  21. use App\Event\OrderPayedEvent;
  22. use App\Service\Referal\Referal;
  23. use App\Repository\CityRepository;
  24. use App\Repository\ProdRepository;
  25. use App\Repository\UserRepository;
  26. use App\Service\Checkout\Checkout;
  27. use App\Repository\OrderRepository;
  28. use App\Repository\RegionRepository;
  29. use App\Repository\EsystemRepository;
  30. use App\Repository\DeliveryRepository;
  31. use Psr\Cache\InvalidArgumentException;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use Doctrine\ORM\Exception\ORMException;
  34. use App\Repository\SubdeliveryRepository;
  35. use App\Repository\TransactionRepository;
  36. use Symfony\Contracts\Cache\CacheInterface;
  37. use Psr\Container\NotFoundExceptionInterface;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\Security\Core\Security;
  40. use Psr\Container\ContainerExceptionInterface;
  41. use Symfony\Component\HttpFoundation\Response;
  42. use Symfony\Component\Routing\Annotation\Route;
  43. use Psr\EventDispatcher\EventDispatcherInterface;
  44. use Symfony\Component\EventDispatcher\EventDispatcher;
  45. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  46. use Symfony\Component\HttpFoundation\Exception\BadRequestException;
  47. use Symfony\Component\HttpFoundation\RequestStack;
  48. /** @package App\Controller */
  49. class CheckoutController extends AbstractASController
  50. {
  51.     protected EntityManagerInterface $em;
  52.     protected CacheInterface $Cache;
  53.     protected AppDTO $app;
  54.     protected Auth $Auth;
  55.     protected Checkout $Checkout;
  56.     protected User $User;
  57.     protected Cart $Cart;
  58.     protected $cart_items;
  59.     // Repositories
  60.     protected ProdRepository $Prods;
  61.     protected DeliveryRepository $Deliveries;
  62.     protected SubdeliveryRepository $SubDeliveries;
  63.     protected CityRepository $Cities;
  64.     protected RegionRepository $Regions;
  65.     protected EsystemRepository $Esystems;
  66.     protected UserRepository $Users;
  67.     protected OrderRepository $Orders;
  68.     protected TransactionRepository $Transactions;
  69.     private $step;
  70.     private $order_key "asdflhi2508qyslakg08q2t5ojgz";
  71.     public function __construct(EntityManagerInterface $emCacheInterface $CacheAppDTO $appAuth $AuthCheckout $CheckoutCart $CartSecurity $securityRequestStack $requestStack)
  72.     {
  73.         $this->requestStack $requestStack;
  74.         $this->Cache $Cache;
  75.         $this->em $em;
  76.         $this->app $app;
  77.         $this->Auth $Auth;
  78.         $this->Auth->setUser($security->getUser());
  79.         $this->Checkout $Checkout;
  80.         $this->Cart $Cart;
  81.         $this->Deliveries $this->em->getRepository(Delivery::class);
  82.         $this->SubDeliveries $this->em->getRepository(Subdelivery::class);
  83.         $this->Cities $this->em->getRepository(City::class);
  84.         $this->Regions $this->em->getRepository(Region::class);
  85.         $this->Esystems $this->em->getRepository(Esystem::class);
  86.         $this->Users $this->em->getRepository(User::class);
  87.         $this->Orders $this->em->getRepository(Order::class);
  88.         $this->Prods $em->getRepository(Prod::class);
  89.         $this->Transactions $em->getRepository(Transaction::class);
  90.         $this->cart_items $this->Cart->getCart();
  91.         foreach ($this->cart_items as $k => $v) {
  92.             $this->cart_items[$k]['prod'] = $this->Prods->find($v['id']);
  93.         }
  94.     }
  95.     
  96.     #[Route(path'/checkout'name'checkout_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  97.     #[Route(path'/{_locale}/checkout'name'checkout'requirements: ['_locale' => '%app.langs%'])]
  98.     public function index(): Response
  99.     {
  100.         return $this->redirectToRoute('checkout_form');
  101.     }
  102.     // Форма. Данные пользователя
  103.     #[Route(path'/checkout/form'name'checkout_form_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  104.     #[Route(path'/{_locale}/checkout/form'name'checkout_form'requirements: ['_locale' => '%app.langs%'])]
  105.     public function form(Request $request): Response
  106.     {
  107.         $email strtolower(trim($request->get('email')));
  108.         $surname trim($request->get('surname'));
  109.         $name trim($request->get('name'));
  110.         $phone trim($request->get('phone'));
  111.         $errors = [];
  112.         if (!empty($request->get('submit'))) {
  113.             $usergender '';
  114.             $user $this->Users->findOneBy(['email' => $email]);
  115.             if (strlen($email) && $this->Auth->getUserId() == && $user) { // Клиент есть в базе но не авторизирован
  116.                 $this->Checkout->setEmail($email);
  117.                 $errors['notloggedin'] = 1;
  118.             } else {
  119.                 if (!strlen($surname)) { // Пустое поле Фамилии
  120.                     $errors['surname_empty'] = 1;
  121.                 } elseif (!strlen($name)) { // Пустое поле Имени
  122.                     $errors['name_empty'] = 1;
  123.                 } else {
  124.                     $usersurname $surname;
  125.                     $username $name;
  126.                     if ($username && $usersurname) {
  127.                         if ($this->Auth->getUserId() == && !$user) { // Новый клиент
  128.                         } elseif ($this->Auth->getUserId()) { // Клиент авторизирован
  129.                             $user->setName($username);
  130.                             $user->setSurname($usersurname);
  131.                             $user->setGender($usergender);
  132.                             $user->setPhone($phone);
  133.                             //$this->Auth->login($user); /// TODO
  134.                             $this->em->flush();
  135.                         }
  136.                     }
  137.                 }
  138.                 if (!empty($email) && filter_var($emailFILTER_CALLBACK, array('options' => '\App\Func::is_email'))) {
  139.                     $this->Checkout->setName($name);
  140.                     $this->Checkout->setSurname($surname);
  141.                     $this->Checkout->setGender($usergender);
  142.                     $this->Checkout->setEmail($email);
  143.                     $this->Checkout->setPhone($phone);
  144.                     $this->Checkout->setKey($this->order_key);
  145.                     $this->Checkout->setAds($request->get('ads')=='on' 0);
  146.                 } else {
  147.                     $errors['email_invalid'] = 1;   // email невалиден
  148.                 }
  149.                 if (!strlen($phone)) { // Пустое поле Номер телефона
  150.                     $errors['phone_empty'] = 1;
  151.                 }
  152.                 if (count((array)$errors) == 0) { // Если ошибок нет, переходим на этап Доставка
  153.                     return $this->redirectToRoute('checkout_delivery');
  154.                 }
  155.             }
  156.             return $this->render('checkout/form.html.twig', [
  157.                 'controller_name' => 'CheckoutController',
  158.                 'checkout' => $this->Checkout,
  159.                 'user' => $this->getUser(),
  160.                 "errors" => $errors,
  161.                 "step" => 1,
  162.                 'h1' => $this->app->labels->get('checkout-title-1'),
  163.                 'cart' => $this->Cart,
  164.                 'cart_items' => $this->cart_items,                
  165.             ]);
  166.         } else { // Форма не отправлена. Заход на страницу /checkout/            
  167.             return $this->render('checkout/form.html.twig', [
  168.                 'controller_name' => 'CheckoutController',
  169.                 'checkout' => $this->Checkout,
  170.                 'user' => $this->getUser(),
  171.                 "errors" => $errors,
  172.                 "step" => 1,
  173.                 'h1' => $this->app->labels->get('checkout-title-1'),
  174.                 'cart' => $this->Cart,
  175.                 'cart_items' => $this->cart_items,
  176.                 'ga_events_checkout_begin' => 1,
  177.             ]);
  178.         }
  179.     }
  180.     // Выбор способа доставки
  181.     #[Route(path'/checkout/delivery'name'checkout_delivery_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  182.     #[Route(path'/{_locale}/checkout/delivery'name'checkout_delivery'requirements: ['_locale' => '%app.langs%'])]
  183.     public function delivery(Request $request): Response
  184.     {
  185.         if (empty($this->Checkout->getName()) || empty($this->Checkout->getEmail())) {
  186.             return $this->redirectToRoute('checkout_form');
  187.         }
  188.         if ($request->get('postform')) { // Обработка формы с полями ввода (для некоторых видов доставки)
  189.             $d_addr $request->get('delivery-addr');
  190.             $d_flat $request->get('delivery-flat');
  191.             $d_post_code $request->get('delivery-postcode');
  192.             $d_comment $request->get('delivery-comment');
  193.             $name $request->get('name');
  194.             $d_post_name $request->get('delivery-postname');
  195.             $d_worktime $request->get('delivery-worktime');
  196.             $this->Checkout->setDelivery_post_code('');
  197.             $this->Checkout->setDelivery_post_name('');
  198.             $this->Checkout->setDelivery_post_worktime('');
  199.             $this->Checkout->setDelivery_post_phone('');
  200.             $this->Checkout->setDelivery_post_email('');
  201.             //if (($name) && ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX))) {
  202.             if ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX)) {
  203.                 $this->Checkout->setCity_name($name);
  204.                 $this->Checkout->setDelivery_post_name($d_post_name);
  205.             }
  206.             if (isset($d_addr)) {
  207.                 $this->Checkout->setUseraddr($d_addr);
  208.             }
  209.             if (isset($d_flat)) {
  210.                 $this->Checkout->setUseraddr($d_addr);
  211.                 if ((Env::site() != Env::MIX) && (Env::site() != Env::OPT_MIX) && (Env::site() != Env::MIR) && (Env::site() != Env::OPT_MIR)) {
  212.                     $this->Checkout->setUseraddr($d_addr ', ' $this->app->labels->get('checkout-confirm-6') . ' ' $d_flat);
  213.                 }
  214.                 $this->Checkout->setUserflat($d_flat);
  215.             }
  216.             if (isset($d_worktime)) {
  217.                 $this->Checkout->setDelivery_post_worktime($d_worktime);
  218.             }
  219.             $this->Checkout->setDelivery_post_code($d_post_code);
  220.             $this->Checkout->setComment($d_comment);
  221.             return $this->redirectToRoute('checkout_payment');
  222.         } else {
  223.             if (!$this->Checkout->getUserlat() && !$this->Checkout->getUserlon()) {
  224.                 $user $this->Users->find($this->Auth->getUserId());
  225.                 if ($user && $user->getLat() && $user->getLon()) {
  226.                     $this->Checkout->setUserlat($user->getLat());
  227.                     $this->Checkout->setUserlon($user->getLon());
  228.                 }
  229.             }
  230.             if (count($request->request->all()) > 0) {
  231.                 return $this->redirectToRoute('checkout_payment');
  232.             } else {
  233.                 $user $this->Users->find($this->Auth->getUserId());
  234.                 return $this->render('checkout/delivery.html.twig', [
  235.                     'controller_name' => 'CheckoutController',
  236.                     'checkout' => $this->Checkout,
  237.                     'user' => $this->getUser(),
  238.                     "step" => 2,
  239.                     'h1' => $this->app->labels->get('checkout-title-2'),
  240.                     'deliveries' => $this->Deliveries->getByRegion($this->Checkout->getRegion_fias_id()),
  241.                     'this_checkout' => $this->Checkout,
  242.                     'cart' => $this->Cart,
  243.                     'cart_items' => $this->cart_items,
  244.                 ]);
  245.             }
  246.         }
  247.     }
  248.     // Выбор способа оплаты
  249.     #[Route(path'/checkout/payment'name'checkout_payment_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  250.     #[Route(path'/{_locale}/checkout/payment'name'checkout_payment'requirements: ['_locale' => '%app.langs%'])]
  251.     public function payment(): Response
  252.     {
  253.         if (empty($this->Checkout->getName()) || empty($this->Checkout->getEmail())) {
  254.             //return $this->redirectToRoute('checkout_form');
  255.         }
  256.         $esystems $this->Esystems->getByRegion($this->Checkout->getRegion_fias_id(), $this->Auth->isOpt(), $this->Cart->getAmount());
  257.         $esystems $this->Esystems->filterByDelivery($esystems, (int) $this->Checkout->getDelivery_id());
  258.         return $this->render('checkout/payment.html.twig', [
  259.             'controller_name' => 'CheckoutController',
  260.             'checkout' => $this->Checkout,
  261.             'user' => $this->getUser(),
  262.             "step" => 3,
  263.             'h1' => $this->app->labels->get('checkout-title-3'),
  264.             'esystems' => $esystems,
  265.             'cart' => $this->Cart,
  266.             'cart_items' => $this->cart_items,
  267.         ]);
  268.     }
  269.     
  270.     // Подтверждение заказа
  271.     #[Route(path'/checkout/confirm'name'checkout_confirm_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  272.     #[Route(path'/{_locale}/checkout/confirm'name'checkout_confirm'requirements: ['_locale' => '%app.langs%'])]
  273.     public function confirm(Request $requestMail $MailReferal $Referal): Response
  274.     {
  275.         //$this->app->page->setH1($this->app->labels->get('checkout-title-4'));
  276.         $user null;        
  277.         if (empty($request->request->all())) {
  278.             $worktimestr '';
  279.             if ($this->Checkout->getDelivery_post_worktime()) {
  280.                 $worktimestr $this->Checkout->getDelivery_post_worktime();
  281.                 $worktimestr str_replace(': '':|'$worktimestr);
  282.                 $worktimestr str_replace('; ''|'$worktimestr);
  283.                 $worktimearr explode('|'$worktimestr);
  284.                 $worktimestr '';
  285.                 for ($i 0$i count($worktimearr); $i++) {
  286.                     if ($i == 0) {
  287.                         $worktimestr .= '<dt>' $worktimearr[$i] . '</dt>';
  288.                     } else {
  289.                         $worktimestr .= '<dd>' $worktimearr[$i] . '</dd>';
  290.                     }
  291.                 }
  292.             }
  293.             return $this->render('checkout/confirm.html.twig', [
  294.                 'worktime' => $worktimestr,
  295.                 'checkout' => $this->Checkout,
  296.                 'user' => $this->getUser(),
  297.                 "step" => 4,
  298.                 'cart' => $this->Cart,
  299.                 'cart_items' => $this->cart_items,
  300.                 'esystems' => $this->Esystems->getByRegion($this->Checkout->getRegion_fias_id(), $this->Auth->isOpt(), $this->Cart->getAmount()),
  301.             ]);
  302.         } else {
  303.             // if (empty($this->Checkout->getName()) || empty($this->Checkout->getEmail())) {
  304.             //     return $this->redirectToRoute('checkout_form');
  305.             // }
  306.             // if ($this->Checkout->getLastOrderTime() && $this->Checkout->getLastOrderTime() > (time() - 60)) {
  307.             //     return $this->redirectToRoute('cart');
  308.             // } else {
  309.             //     $this->Checkout->setLastOrderTime(time());
  310.             // }
  311.             // Регистрация нового клиента
  312.             if (!$this->Auth->getUserId()) {
  313.                 $password substr(md5(time()), 08);
  314.                 $usermail strtolower($this->Checkout->getEmail());
  315.                 $opt $this->Auth->isOpt() ? 0;
  316.                 $user = new User();
  317.                 $user->setType('client');
  318.                 $user->setPassword($password);
  319.                 $user->setEmail(strtolower(trim($usermail)));
  320.                 $user->setExternalId(md5($user->getEmail()));
  321.                 $user->setName($this->Checkout->getName());
  322.                 $user->setSurname($this->Checkout->getSurname());
  323.                 $user->setGender($this->Checkout->getGender());
  324.                 $user->setPhone(Func::mkphone($this->Checkout->getPhone()));
  325.                 $user->setCity($this->Checkout->getCity_name());
  326.                 $user->setAddress($this->Checkout->getUseraddr());
  327.                 $user->setLat($this->Checkout->getUserlat());
  328.                 $user->setLon($this->Checkout->getUserlon());
  329.                 $user->setIp($_SERVER['REMOTE_ADDR']);
  330.                 $user->setCreated(time());
  331.                 $user->setDiscount(0);
  332.                 $user->setOpt($opt);
  333.                 $user->setAds($this->Checkout->getAds());
  334.                 if ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX)) {
  335.                     $user->setCompanyNip($this->Checkout->getCompanyNip());
  336.                     $user->setCompanyName($this->Checkout->getCompanyName());
  337.                     $user->setCompanyIndex($this->Checkout->getCompanyIndex());
  338.                     $user->setCompanyCity($this->Checkout->getCompanyCity());
  339.                     $user->setCompanyStreet($this->Checkout->getCompanyStreet());
  340.                     $user->setCompanyHouse($this->Checkout->getCompanyHouse());
  341.                     $user->setCompanyFlat($this->Checkout->getCompanyFlat());
  342.                 }
  343.                 
  344.                 $this->em->persist($user);
  345.                 $this->em->flush();
  346.                 $userid $user->getId();
  347.                 $params = array(
  348.                     "type" => "client",
  349.                     "login" => $usermail,
  350.                     "gender" => $this->Checkout->getGender(),
  351.                     "pass" => $password,
  352.                     "email" => $usermail,
  353.                     "name" => $this->Checkout->getName(),
  354.                     "surname" => $this->Checkout->getSurname(),
  355.                     "phone" => $this->Checkout->getPhone(),
  356.                     "city" => $this->Checkout->getCity_name(),
  357.                     "address" => $this->Checkout->getUseraddr(),
  358.                 );
  359.                 // $Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $usermail, $this->app->labels->get("register_message_theme"), Func::mess_from_tmp($this->app->templates->get("register_message_template"), $params));
  360.                 // $Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $this->app->sett->get('admin_email'), $this->app->labels->get("register_message_theme"), Func::mess_from_tmp($this->app->templates->get("register_message_template"), $params));
  361.             } else {
  362.                 $user $this->Users->find($this->Auth->getUserId());
  363.                 $userid $user->getId();
  364.             }
  365.             $deliverycost = (float) $this->Checkout->getDelivery_cost();
  366.             if (($this->Cart->getAmount() >= $this->app->sett->get('free_delivery_amount')) && (!$this->Auth->isOpt())) {
  367.                 $deliverycost 0;
  368.             }
  369.             $needcall = ($request->get('needcall') == 'on' || $request->get('needcall') == 1) ? 0;
  370.             $opt $this->Auth->isOpt() ? 0;
  371.             $Order = new Order();
  372.             $Order->setUser($userid);
  373.             $Order->setManager((int) $user->getManager());
  374.             $Order->setName($this->Checkout->getSurname() . " " $this->Checkout->getName());
  375.             if ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX)) {
  376.                 $addr $this->Checkout->getUseraddr();
  377.                 if ($this->Checkout->getUserflat()) {
  378.                     $addr $this->Checkout->getUseraddr() . ' ' $this->app->labels->get('checkout-confirm-6') . ' ' $this->Checkout->getUserflat();
  379.                 }
  380.                 $Order->setAddr($addr);
  381.             } else {
  382.                 $Order->setAddr($this->Checkout->getUseraddr());
  383.             }
  384.             $Order->setCity($this->Checkout->getCity_name());
  385.             $Order->setPhone($this->Checkout->getPhone());
  386.             $Order->setEmail($this->Checkout->getEmail());
  387.             $Order->setTstamp(time());
  388.             $Order->setDelivery($this->Checkout->getDelivery_id());
  389.             $Order->setSubdelivery($this->Checkout->getDelivery_sub_id());
  390.             $Order->setDeliverycost($deliverycost);
  391.             $Order->setPostcode($this->Checkout->getDelivery_post_code());
  392.             $Order->setEsystem($this->Checkout->getPayment_id());
  393.             $Order->setSklad($this->Checkout->getDelivery_post_name());
  394.             $Order->setComment($request->get('comment'''));
  395.             $Order->setStatus(4);
  396.             $Order->setNeedcall($needcall);
  397.             $Order->setReferal($Referal->getId());
  398.             $Order->setSession(json_encode($_SESSIONJSON_UNESCAPED_UNICODE));
  399.             $Order->setCookie(json_encode($_COOKIEJSON_UNESCAPED_UNICODE));
  400.             $Order->setOpt($opt);
  401.             $Order->setAmount($this->Cart->getAmount() + $deliverycost);
  402.             $Order->setWeight($this->Cart->getWeight());
  403.             $Order->setAmountWithoutDiscount($this->Cart->getAmountWithoutDiscount());
  404.             if ((Env::site() == Env::MIX) || (Env::site() == Env::OPT_MIX)) {
  405.                 $Order->setCompanyNip($this->Checkout->getCompanyNip());
  406.                 $Order->setCompanyName($this->Checkout->getCompanyName());
  407.                 $Order->setCompanyIndex($this->Checkout->getCompanyIndex());
  408.                 $Order->setCompanyCity($this->Checkout->getCompanyCity());
  409.                 $Order->setCompanyStreet($this->Checkout->getCompanyStreet());
  410.                 $Order->setCompanyHouse($this->Checkout->getCompanyHouse());
  411.                 $Order->setCompanyFlat($this->Checkout->getCompanyFlat());
  412.             }
  413.             $this->em->persist($Order);
  414.             $this->em->flush();
  415.             $order_id $Order->getId();
  416.             $this->Checkout->setLastOrderTime(time());
  417.             $client_data "<table><tr><td>" $this->app->labels->get('name') . "</td><td>" $this->Checkout->getName() . " " $this->Checkout->getSurname() . "</td></tr><tr><td>Email</td><td>" $this->Checkout->getEmail() . "</td></tr><tr><td>" $this->app->labels->get('phone') . "</td><td>" Func::mkphone($this->Checkout->getPhone()) . "</td></tr><tr><td>" $this->app->labels->get('address') . "</td><td>" $this->Checkout->getCity_name() . ", " . ($this->Checkout->getUseraddr() ? $this->Checkout->getUseraddr() : $this->Checkout->getDelivery_post_name()) . " ".($this->Checkout->getDelivery_name() ? " (".$this->Checkout->getDelivery_name().")" '') . "</td></tr></table>";
  418.             $this->Cart->saveCart($order_id);
  419.             $order_maked 1;
  420.             // $Order = new Model_Order($order_id);
  421.             // $view->Model_Order = $Order;
  422.             // $view->cart = $Order->cart;
  423.             // $view->order = $Order->get($order_id);
  424.             // $view->order_amount = $Order->amount();
  425.             $order_cont $this->renderView('cart/show.html.twig', [
  426.                 'checkout' => $this->Checkout,
  427.                 'user' => $this->getUser(),
  428.                 'cart' => $this->Cart,
  429.                 'cart_items' => $this->cart_items,
  430.                 'freedelivery' => $this->Cart->isFreeDelivery((float) $this->app->sett->get('free_delivery_amount')),
  431.                 'order' => $Order,
  432.             ]);
  433.             $payment $this->Esystems->find($this->Checkout->getPayment_id());
  434.             $delivery $this->Deliveries->find($this->Checkout->getDelivery_id());
  435.             $params = array(
  436.                 "order_id" => $order_id,
  437.                 //"client" => $url->s['checkout']['surname']." ".$url->s['checkout']['name'],
  438.                 "order_time" => date("d.m.Y (G:i)"time()),
  439.                 "order" => $order_cont,
  440.                 "client" => $client_data,
  441.                 "payment" => $payment $payment->getCont() : '',
  442.                 "delivery" => $delivery $delivery->getCont() : '',
  443.                 "login" => $user->getEmail(),
  444.                 "pass" => $user->getPassword(),
  445.                 "name" => $this->Checkout->getName(),
  446.                 "surname" => $this->Checkout->getSurname(),
  447.                 "email" => $this->Checkout->getEmail(),
  448.                 "phone" => Func::mkphone($this->Checkout->getPhone()),
  449.                 "city" => $this->Checkout->getCity_name(),
  450.                 "address" => $this->Checkout->getUseraddr(),
  451.                 "needcall" => $needcall,
  452.             );
  453.             $Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $this->Checkout->getEmail(), $this->app->labels->get("order_message_theme"), Func::mess_from_tmp($this->app->templates->get("order_message_template"), $params));
  454.             $Mail->send($this->app->sett->get('sitename'), Env::mail_from(), $this->app->sett->get('admin_email'), $this->app->labels->get("order_message_theme"), Func::mess_from_tmp($this->app->templates->get("order_message_template"), $params));
  455.             
  456.             $this->Cart->deleteNullFromColors();
  457.             $this->Cart->deleteAll();
  458.             $this->Checkout->setRemarkingCart(1);
  459.             if ($payment && $payment->isAutof()) {
  460.                 return $this->redirectToRoute('checkout_pay', ['order' => $order_id]);
  461.             } else {
  462.                 return $this->redirectToRoute('checkout_finish', ['order_id' => $order_id]);
  463.             }            
  464.         }
  465.     }
  466.     
  467.     // Заказ оформлен. Страница "Спасибо"
  468.     #[Route(path'/checkout/finish/{order_id}'name'checkout_finish_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  469.     #[Route(path'/checkout/completed/{order_id}'name'checkout_completed_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  470.     #[Route(path'/{_locale}/checkout/finish/{order_id}'name'checkout_finish'requirements: ['_locale' => '%app.langs%'])]
  471.     #[Route(path'/{_locale}/checkout/completed/{order_id}'name'checkout_completed'requirements: ['_locale' => '%app.langs%'])]
  472.     public function finish(EventDispatcherInterface $dispatcherint $order_id): Response
  473.     {
  474.         // if ($this->Checkout->getRemarkingCart() == 1) {
  475.             $order $this->Orders->find($order_id);
  476.             $user $this->Users->find($order->getUser());
  477.             $this->Cart->loadFromOrder($order->getId());
  478.             if ($order->getStatus() != && !in_array($order->getEsystem(), [25])) {
  479.                 $event = new OrderMakedEvent($order);
  480.                 $dispatcher->dispatch($eventOrderMakedEvent::NAME);
  481.             }
  482.             $order_sum $order->getAmount();
  483.             $prods $this->Cart->getCart();
  484.             $cartitems $this->Cart->getCart();
  485.             foreach ($cartitems as $k => $v) {
  486.                 $cartitems[$k]['prod'] = $this->Prods->find($v['id']);
  487.             }
  488.             $order_sum $order_sum;
  489.             $order_id $order_id;
  490.             $this->Cart->deleteAll();
  491.             $this->Checkout->clear();
  492.             $this->Checkout->setRemarkingCart(0);
  493.             
  494.             return $this->render('checkout/finish.html.twig', [
  495.                 'controller_name' => 'CheckoutController',
  496.                 'checkout' => $this->Checkout,
  497.                 'user' => $user,
  498.                 "step" => 5,
  499.                 'h1' => $this->app->labels->get('checkout-title-5'),
  500.                 "order_sum" => $order_sum,
  501.                 "prods" => $prods,
  502.                 "cartitems" => $cartitems,
  503.                 "cart_items" => $cartitems,
  504.                 "order_id" => $order_id,
  505.                 'ga_events_checkout_finish' => 1,
  506.             ]);
  507.         // } else {
  508.         //     return $this->redirectToRoute('home');
  509.         // }
  510.     }
  511.     // Оплата
  512.     /**
  513.      * @param Pay $Pay 
  514.      * @param Request $request 
  515.      * @param EventDispatcherInterface $dispatcher 
  516.      * @return Response 
  517.      * @throws BadRequestException 
  518.      * @throws NotFoundExceptionInterface 
  519.      * @throws ContainerExceptionInterface 
  520.      * @throws LogicException 
  521.      * @throws InvalidArgumentException 
  522.      * @throws ORMException 
  523.      */
  524.     #[Route('/checkout/pay'name'checkout_pay')]
  525.     public function pay(Pay $PayRequest $requestEventDispatcherInterface $dispatcher): Response
  526.     {
  527.         $order_id $request->get("order"0);
  528.         $order $this->Orders->find($order_id);
  529.         if (!$order) {
  530.             return $this->redirectToRoute('home');
  531.         }
  532.         
  533.         $order->setStatus(9);
  534.         $this->em->flush();
  535.         $esystem $this->Esystems->find($order->getEsystem());
  536.         
  537.         //TODO. Костыль для мира бусин. Не проверяю autof
  538.         if (!$esystem) {
  539.             return $this->redirectToRoute('checkout_finish', ['order_id' => $order_id]);
  540.         }
  541.         //TODO. Решить костыль с задвоением
  542.         
  543.         $event = new OrderMakedEvent($order);
  544.         $dispatcher->dispatch($eventOrderMakedEvent::NAME);        
  545.         $this->Cart->loadFromOrder($order->getId());
  546.         $order_sum $order->getAmount();
  547.         $Pay->pay($order->getEsystem(), $order->getId(), $order_sum);
  548.         return new Response('ok');
  549.     }
  550.     // Проверка результата оплаты
  551.     #[Route('/checkout/pay-result/esystem-{esystem_id}/order-{order_id}'name'checkout_pay_result')]
  552.     public function payResult(EventDispatcherInterface $dispatcherint $esystem_idint $order_id): Response
  553.     {
  554.         $esystem $this->Esystems->find($esystem_id);
  555.         $script_name $esystem->getScript();
  556.         /** @var Pay $Pay */
  557.         $Pay = new $script_name();
  558.         if ($Pay->is_success($order_id)) {
  559.             $order $this->Orders->find($order_id);
  560.             $order->setStatus(7);
  561.             $this->em->flush();
  562.             $dispatcher->dispatch(new OrderPayedEvent($order), OrderPayedEvent::NAME);
  563.         }
  564.         return new Response('ok');
  565.     }
  566.     // Успешная оплата Robokassa
  567.     #[Route('/checkout/pay-result-robokassa-afog91856kgfsadf150h'name'checkout_pay_result_robokassa_success')]
  568.     public function payResultRobokassaSuccess(Request $request): Response
  569.     {
  570.         $order_id $request->get('inv_id');
  571.         $order_sum $request->get('out_summ');
  572.         $order $this->Orders->find($order_id);
  573.         $order->setStatus(7);
  574.         $this->em->flush();
  575.         return $this->redirectToRoute('checkout_finish', ['order_id' => $order_id]);
  576.     }
  577.     // Неудачная оплата Robokassa
  578.     #[Route('/checkout/pay-result-robokassa-asg258goag0lvb'name'checkout_pay_result_robokassa_failed')]
  579.     public function payResultRobokassaFailed(): Response
  580.     {
  581.         return $this->render('checkout/failed.html.twig', [
  582.             'controller_name' => 'CheckoutController',
  583.         ]);
  584.     }
  585.     // Успешная оплата Prezelewy
  586.     /**
  587.      * @param EventDispatcherInterface $dispatcher 
  588.      * @param Request $request 
  589.      * @return Response 
  590.      * @throws BadRequestException 
  591.      */
  592.     #[Route('/checkout/payresult-przelewy-asdflkh2058yjba0g8g250ib0'name'checkout_pay_result_przelewy_success')]
  593.     public function payResultPrzelewySuccess(EventDispatcherInterface $dispatcherRequest $request): Response
  594.     {
  595.         $order_id $request->get('order');
  596.         $input = (string) $request->getContent();
  597.         $post json_encode($_POST);
  598.         if (!empty($input)) {
  599.             $this->Transactions->transactionResult($order_id$post$input);
  600.         }
  601.         
  602.         $order $this->Orders->find($order_id);
  603.         $order->setStatus(7);
  604.         $this->em->flush();
  605.         $dispatcher->dispatch(new OrderPayedEvent($order), OrderPayedEvent::NAME);
  606.         return new Response('done');
  607.     }
  608.     #[Route('/checkout/test-test'name'checkout_test_test')]
  609.     public function testtest(EventDispatcherInterface $dispatcherRequest $request): Response
  610.     {
  611.         $order_id $request->get('order');
  612.         $input = (string) $request->getContent();
  613.         $post json_encode($_POST);
  614.         // if (!empty($input)) {
  615.         //     $this->Transactions->transactionResult($order_id, $post, $input);
  616.         // }
  617.         
  618.         $order $this->Orders->find($order_id);
  619.         $event = new OrderMakedEvent($order);
  620.         $dispatcher->dispatch($eventOrderMakedEvent::NAME);
  621.         return new Response('done');
  622.     }
  623. }