src/Controller/AuctionController.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AllTyre;
  4. use App\Entity\Auction;
  5. use App\Entity\Sales;
  6. use App\Form\LotType;
  7. use App\Form\SalesType;
  8. use DateTime;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. class AuctionController extends AbstractController
  15. {
  16.     /**
  17.      * @Route("/auction", name="app_auction")
  18.      */
  19.     public function index(EntityManagerInterface $entityManager): Response
  20.     {
  21.         $find_str = array('status_lot' => 'true');
  22.         $product $entityManager->getRepository(AllTyre::class)->findBy($find_str);
  23.         $find = array('active' => 'true');
  24.         $auction_setting $entityManager->getRepository(Auction::class)->findBy($find);
  25.         return $this->render('auction/index.html.twig', [
  26.             'page_name' => 'Аукцион',
  27.             'product' => $product,
  28.             'lot' => $auction_setting,
  29.         ]);
  30.     }
  31.     /**
  32.      * @Route("/auction/add", name="app_auction_add")
  33.      */
  34.     public function addLot(EntityManagerInterface $entityManager): Response
  35.     {
  36.         $user $this->getUser();
  37.         $find_str = array('name' => $user->getUsername(), 'status_lot' => 'false');
  38.         $product $entityManager->getRepository(AllTyre::class)->findBy($find_str);
  39.         return $this->render('auction/add_lot.html.twig', [
  40.             'controller_name' => 'Выбрать товар',
  41.             'product' => $product,
  42.         ]);
  43.     }
  44.     /**
  45.      * @Route("/auction/create", name="app_auction_create")
  46.      */
  47.     public function createLot(Request $requestEntityManagerInterface $entityManager): Response
  48.     {
  49.         $task = new Auction();
  50.         $user $this->getUser();
  51.         $start_date = new DateTime();
  52.         $end_date $start_date;
  53.         // $end_date = new DateTime();
  54.         // $end_date = $end_date->modify('+1 day');
  55.         $lot_unit $request->request->all('turn_product');
  56.         $find_str = array('name' => $user->getUsername(), 'id' => intval($lot_unit['unit']), 'status_lot' => 'false');
  57.         $product $entityManager->getRepository(AllTyre::class)->findOneBy($find_str);
  58.         if($product)
  59.         {
  60.             $task->setIdProduct($product->getId());
  61.             $task->setStartPrice($product->getPrice());
  62.             $task->setDataStart($start_date);
  63.             $task->setDataEnd($end_date);
  64.             $task->setActive('false');
  65.             $task->setPeriod(0);
  66.             $entityManager->persist($task);
  67.             $entityManager->flush();
  68.             $product->setStatus('false');
  69.             $product->setStatusLot('true');
  70.             $product->setIdLot($task->getId());
  71.             $entityManager->flush();
  72.             return $this->redirect('/auction/lot-'.$task->getId());
  73.         }
  74.         return $this->redirectToRoute('app_auction_add');
  75.     }
  76.     /**
  77.      * @Route("/auction/lot-{unit}", name="app_auction_lot")
  78.      */
  79.     public function lot_page(Request $requestEntityManagerInterface $entityManagerString $unit): Response
  80.     {
  81.         $user $this->getUser();
  82.         $task = new Auction();
  83.         $find = array('id' => intval($unit));
  84.         $auction_setting $entityManager->getRepository(Auction::class)->findBy($find);
  85.         // $auction_setting = $entityManager->getRepository(Auction::class)->find(intval($unit));
  86.         $find_str = array('name' => $user->getUsername(), 'id' => intval($auction_setting[0]->getIdProduct()), 'status_lot' => 'true');
  87.         $product $entityManager->getRepository(AllTyre::class)->findBy($find_str);
  88.         $value $auction_setting[0]->getStartPrice(); // начальное значение
  89.         $all_prices = array();
  90.         $percent 0.1// процент 10% в десятичном виде
  91.         for ($i 1$i <= 8$i++)
  92.         {
  93.             $value $value - ($value $percent);
  94.             $all_prices[] = intval($value);
  95.         }
  96.         $times_period = array
  97.             (
  98.                 => array('09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00'),
  99.                 => array('17:00','18:00','19:00','20:00','21:00','22:00','23:00','00:00'),
  100.                 => array('01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00'),
  101.             );
  102.         if($product)
  103.         {
  104.             $form $this->createForm(LotType::class, $task);
  105.             $form->handleRequest($request);
  106.             if ($form->isSubmitted())
  107.             {
  108.                 $data $request->request->all('lot');
  109.                 $auction_setting_update $entityManager->getRepository(Auction::class)->find(intval($unit));
  110.                 $time_period = array(
  111.                     => false,
  112.                     => array(816),
  113.                     => array(160),
  114.                     => array(08),
  115.                 );
  116.                 // $end_date = new DateTime();
  117.                 // $a = $auction_setting[0]->getDataStart()->modify('+'.$time_period[$data['period']][0].' hours');
  118.                 // $a = $auction_setting[0]->getDataEnd()->modify('+'.$time_period[$data['period']][1].' hours');
  119.                 // $a->modify('+16 hours');
  120.                 // var_dump($data['data_start']);
  121.                 // var_dump($time_period[$data['period']]);
  122.                 $dateString $data['data_start'].' 00:00:00';
  123.                 $format 'Y-m-d H:i:s';
  124.                 $datetimeS DateTime::createFromFormat($format$dateString);
  125.                 $datetimeS->modify('+'.$time_period[$data['period']][0].' hours');
  126.                 $datetimeE DateTime::createFromFormat($format$dateString);
  127.                 $datetimeE->modify('+'.$time_period[$data['period']][1].' hours');
  128.                 if(intval($data['period']) === 2)
  129.                 {
  130.                     $datetimeE->modify('+1 days');
  131.                 }
  132.                 if (intval($data['period']) === 3)
  133.                 {
  134.                     $datetimeS->modify('+1 days');
  135.                     $datetimeE->modify('+1 days');
  136.                 }
  137.                 // $start_date = new DateTime();
  138.                 // var_dump($start_date);
  139.                 // var_dump($datetimeS);
  140.                 // var_dump($datetimeE);
  141.                 $auction_setting_update->setDataStart($datetimeS);
  142.                 $auction_setting_update->setDataEnd($datetimeE);
  143.                 $auction_setting_update->setActive('true');
  144.                 $auction_setting_update->setPeriod($data['period']);
  145.                 // $entityManager->persist($auction_setting);
  146.                 $entityManager->flush();
  147.             }
  148.             // $a = $auction_setting[0]->getDataStart();
  149.             // var_dump($a->getTimestamp());
  150.             // var_dump($a->format('Y-m-d H:i:s'));
  151.             return $this->renderForm('auction/view_my_lot.html.twig', [
  152.                 'page_name' => 'Лот №'.$unit.'. Редактирование',
  153.                 'product' => $product,
  154.                 'lot' => $auction_setting,
  155.                 'finalPrice' => intval($value),
  156.                 'all_prices' => $all_prices,
  157.                 'form' => $form,
  158.             ]);            
  159.         }
  160.         else
  161.         {
  162.             // Доступ к лоту, соответствует ли дата лота настоящей дате
  163.             // Если до то разрешаем доступ, по умолчанию он доступ закрыт
  164.             $access false;
  165.             $find_str = array('id' => intval($auction_setting[0]->getIdProduct()), 'status_lot' => 'true');
  166.             $product $entityManager->getRepository(AllTyre::class)->findBy($find_str);
  167.             $time_line $times_period[$auction_setting[0]->getPeriod()];
  168.             $curent_date = new DateTime();
  169.             $lot_date_start $auction_setting[0]->getDataStart();
  170.             $lot_date_end $auction_setting[0]->getDataEnd();
  171.             // var_dump($lot_date->format('Y-m-d H:i:s'));
  172.             $interval_start $curent_date->diff($lot_date_start);
  173.             $interval_end $curent_date->diff($lot_date_end);
  174.             if($curent_date $lot_date_end)
  175.             // if($curent_date > $lot_date_end && $interval_end->h > 8)
  176.             {
  177.                 $text_date 'Лот истек '.$interval_end->days.' дн.'.$interval_end->h.' ч. назад';
  178.             }
  179.             elseif($curent_date $lot_date_start && $interval_end->8)
  180.             {
  181.                 $text_date 'Лот активен '.$interval_start->h.' ч.';
  182.                 $access true;
  183.             }
  184.             elseif($curent_date $lot_date_start)
  185.             {
  186.                 $text_date 'Торги начнуться через '.$interval_start->days.' дн.'.$interval_start->h.' ч.';
  187.             }
  188.             // $time_lines = array_combine($time_line, $all_prices);
  189.             // $time_line = array(1,2);
  190.             // var_dump($product);
  191.             $sales = new Sales();
  192.             $buy_form $this->createForm(SalesType::class, $sales);
  193.             $buy_form->handleRequest($request);
  194.             // Проверяем возможность совершения покупки (открыт ли доступ к лоту, активен ли еще товар)
  195.             // Активен ли сам лот, а также была ли нажата кнопка "Купить"
  196.             if ($buy_form->isSubmitted() && $access && $auction_setting[0]->getActive() && $product[0]->getStatusLot())
  197.             {
  198.                 // Вычисляем стоимость из расчета времени сервера
  199.                 $date = new DateTime();
  200.                 $dateFormatted $date->format('H');
  201.                 $key_date array_search($dateFormatted.':00'$times_period[$auction_setting[0]->getPeriod()]);
  202.                 $key_date++;
  203.                 $price_product $all_prices[$key_date];
  204.                 // Присваиваем заказу иникальный код + айди профиля покупателя
  205.                 $length 6;
  206.                 $characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  207.                 $code '';
  208.                 for ($i 0$i $length$i++) {
  209.                     $code .= $characters[rand(0strlen($characters) - 1)];
  210.                 }
  211.                 // $sales_data = array(
  212.                 //     'buyer' => $user->getUsername(),
  213.                 //     'saler' => $product[0]->getName(),
  214.                 //     'date' => $date,
  215.                 //     'price' => $price_product,
  216.                 //     'code' => $user->getId().'-'.$code,
  217.                 //     'product' => $product[0]->getId(),
  218.                 // );
  219.                 // var_dump($sales_data);
  220.                 // Записываем данные в базу
  221.                 $sales->setBuyer($user->getUsername());
  222.                 $sales->setSaler($product[0]->getName());
  223.                 $sales->setDate($date);
  224.                 $sales->setPrice($price_product);
  225.                 $sales->setCode($user->getId().'-'.$code);
  226.                 $sales->setProduct($product[0]->getId());
  227.                 $entityManager->persist($sales);
  228.                 $entityManager->flush();
  229.                 // Добавить код для деактиввации лота, и карточки товара из показов на всех страницах кроме кабинета
  230.             }
  231.             return $this->renderForm('auction/view_lot.html.twig', [
  232.                 'page_name' => 'Лот №'.$unit,
  233.                 'product' => $product,
  234.                 'lot' => $auction_setting,
  235.                 'finalPrice' => intval($value),
  236.                 'time_line' => $time_line,
  237.                 'all_prices' => $all_prices,
  238.                 'curent_date' => $curent_date,
  239.                 'text_date' => $text_date,
  240.                 'buy_form' => $buy_form,
  241.             ]);
  242.         }
  243.         // var_dump($auction_setting);
  244.         // var_dump($auction_setting[0]->getIdProduct());
  245.     }
  246. }