<?php
namespace App\Controller;
use App\Entity\AllTyre;
use App\Entity\Auction;
use App\Entity\Sales;
use App\Form\LotType;
use App\Form\SalesType;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class AuctionController extends AbstractController
{
/**
* @Route("/auction", name="app_auction")
*/
public function index(EntityManagerInterface $entityManager): Response
{
$find_str = array('status_lot' => 'true');
$product = $entityManager->getRepository(AllTyre::class)->findBy($find_str);
$find = array('active' => 'true');
$auction_setting = $entityManager->getRepository(Auction::class)->findBy($find);
return $this->render('auction/index.html.twig', [
'page_name' => 'Аукцион',
'product' => $product,
'lot' => $auction_setting,
]);
}
/**
* @Route("/auction/add", name="app_auction_add")
*/
public function addLot(EntityManagerInterface $entityManager): Response
{
$user = $this->getUser();
$find_str = array('name' => $user->getUsername(), 'status_lot' => 'false');
$product = $entityManager->getRepository(AllTyre::class)->findBy($find_str);
return $this->render('auction/add_lot.html.twig', [
'controller_name' => 'Выбрать товар',
'product' => $product,
]);
}
/**
* @Route("/auction/create", name="app_auction_create")
*/
public function createLot(Request $request, EntityManagerInterface $entityManager): Response
{
$task = new Auction();
$user = $this->getUser();
$start_date = new DateTime();
$end_date = $start_date;
// $end_date = new DateTime();
// $end_date = $end_date->modify('+1 day');
$lot_unit = $request->request->all('turn_product');
$find_str = array('name' => $user->getUsername(), 'id' => intval($lot_unit['unit']), 'status_lot' => 'false');
$product = $entityManager->getRepository(AllTyre::class)->findOneBy($find_str);
if($product)
{
$task->setIdProduct($product->getId());
$task->setStartPrice($product->getPrice());
$task->setDataStart($start_date);
$task->setDataEnd($end_date);
$task->setActive('false');
$task->setPeriod(0);
$entityManager->persist($task);
$entityManager->flush();
$product->setStatus('false');
$product->setStatusLot('true');
$product->setIdLot($task->getId());
$entityManager->flush();
return $this->redirect('/auction/lot-'.$task->getId());
}
return $this->redirectToRoute('app_auction_add');
}
/**
* @Route("/auction/lot-{unit}", name="app_auction_lot")
*/
public function lot_page(Request $request, EntityManagerInterface $entityManager, String $unit): Response
{
$user = $this->getUser();
$task = new Auction();
$find = array('id' => intval($unit));
$auction_setting = $entityManager->getRepository(Auction::class)->findBy($find);
// $auction_setting = $entityManager->getRepository(Auction::class)->find(intval($unit));
$find_str = array('name' => $user->getUsername(), 'id' => intval($auction_setting[0]->getIdProduct()), 'status_lot' => 'true');
$product = $entityManager->getRepository(AllTyre::class)->findBy($find_str);
$value = $auction_setting[0]->getStartPrice(); // начальное значение
$all_prices = array();
$percent = 0.1; // процент 10% в десятичном виде
for ($i = 1; $i <= 8; $i++)
{
$value = $value - ($value * $percent);
$all_prices[] = intval($value);
}
$times_period = array
(
1 => array('09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00'),
2 => array('17:00','18:00','19:00','20:00','21:00','22:00','23:00','00:00'),
3 => array('01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00'),
);
if($product)
{
$form = $this->createForm(LotType::class, $task);
$form->handleRequest($request);
if ($form->isSubmitted())
{
$data = $request->request->all('lot');
$auction_setting_update = $entityManager->getRepository(Auction::class)->find(intval($unit));
$time_period = array(
0 => false,
1 => array(8, 16),
2 => array(16, 0),
3 => array(0, 8),
);
// $end_date = new DateTime();
// $a = $auction_setting[0]->getDataStart()->modify('+'.$time_period[$data['period']][0].' hours');
// $a = $auction_setting[0]->getDataEnd()->modify('+'.$time_period[$data['period']][1].' hours');
// $a->modify('+16 hours');
// var_dump($data['data_start']);
// var_dump($time_period[$data['period']]);
$dateString = $data['data_start'].' 00:00:00';
$format = 'Y-m-d H:i:s';
$datetimeS = DateTime::createFromFormat($format, $dateString);
$datetimeS->modify('+'.$time_period[$data['period']][0].' hours');
$datetimeE = DateTime::createFromFormat($format, $dateString);
$datetimeE->modify('+'.$time_period[$data['period']][1].' hours');
if(intval($data['period']) === 2)
{
$datetimeE->modify('+1 days');
}
if (intval($data['period']) === 3)
{
$datetimeS->modify('+1 days');
$datetimeE->modify('+1 days');
}
// $start_date = new DateTime();
// var_dump($start_date);
// var_dump($datetimeS);
// var_dump($datetimeE);
$auction_setting_update->setDataStart($datetimeS);
$auction_setting_update->setDataEnd($datetimeE);
$auction_setting_update->setActive('true');
$auction_setting_update->setPeriod($data['period']);
// $entityManager->persist($auction_setting);
$entityManager->flush();
}
// $a = $auction_setting[0]->getDataStart();
// var_dump($a->getTimestamp());
// var_dump($a->format('Y-m-d H:i:s'));
return $this->renderForm('auction/view_my_lot.html.twig', [
'page_name' => 'Лот №'.$unit.'. Редактирование',
'product' => $product,
'lot' => $auction_setting,
'finalPrice' => intval($value),
'all_prices' => $all_prices,
'form' => $form,
]);
}
else
{
// Доступ к лоту, соответствует ли дата лота настоящей дате
// Если до то разрешаем доступ, по умолчанию он доступ закрыт
$access = false;
$find_str = array('id' => intval($auction_setting[0]->getIdProduct()), 'status_lot' => 'true');
$product = $entityManager->getRepository(AllTyre::class)->findBy($find_str);
$time_line = $times_period[$auction_setting[0]->getPeriod()];
$curent_date = new DateTime();
$lot_date_start = $auction_setting[0]->getDataStart();
$lot_date_end = $auction_setting[0]->getDataEnd();
// var_dump($lot_date->format('Y-m-d H:i:s'));
$interval_start = $curent_date->diff($lot_date_start);
$interval_end = $curent_date->diff($lot_date_end);
if($curent_date > $lot_date_end)
// if($curent_date > $lot_date_end && $interval_end->h > 8)
{
$text_date = 'Лот истек '.$interval_end->days.' дн.'.$interval_end->h.' ч. назад';
}
elseif($curent_date > $lot_date_start && $interval_end->h < 8)
{
$text_date = 'Лот активен '.$interval_start->h.' ч.';
$access = true;
}
elseif($curent_date < $lot_date_start)
{
$text_date = 'Торги начнуться через '.$interval_start->days.' дн.'.$interval_start->h.' ч.';
}
// $time_lines = array_combine($time_line, $all_prices);
// $time_line = array(1,2);
// var_dump($product);
$sales = new Sales();
$buy_form = $this->createForm(SalesType::class, $sales);
$buy_form->handleRequest($request);
// Проверяем возможность совершения покупки (открыт ли доступ к лоту, активен ли еще товар)
// Активен ли сам лот, а также была ли нажата кнопка "Купить"
if ($buy_form->isSubmitted() && $access && $auction_setting[0]->getActive() && $product[0]->getStatusLot())
{
// Вычисляем стоимость из расчета времени сервера
$date = new DateTime();
$dateFormatted = $date->format('H');
$key_date = array_search($dateFormatted.':00', $times_period[$auction_setting[0]->getPeriod()]);
$key_date++;
$price_product = $all_prices[$key_date];
// Присваиваем заказу иникальный код + айди профиля покупателя
$length = 6;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= $characters[rand(0, strlen($characters) - 1)];
}
// $sales_data = array(
// 'buyer' => $user->getUsername(),
// 'saler' => $product[0]->getName(),
// 'date' => $date,
// 'price' => $price_product,
// 'code' => $user->getId().'-'.$code,
// 'product' => $product[0]->getId(),
// );
// var_dump($sales_data);
// Записываем данные в базу
$sales->setBuyer($user->getUsername());
$sales->setSaler($product[0]->getName());
$sales->setDate($date);
$sales->setPrice($price_product);
$sales->setCode($user->getId().'-'.$code);
$sales->setProduct($product[0]->getId());
$entityManager->persist($sales);
$entityManager->flush();
// Добавить код для деактиввации лота, и карточки товара из показов на всех страницах кроме кабинета
}
return $this->renderForm('auction/view_lot.html.twig', [
'page_name' => 'Лот №'.$unit,
'product' => $product,
'lot' => $auction_setting,
'finalPrice' => intval($value),
'time_line' => $time_line,
'all_prices' => $all_prices,
'curent_date' => $curent_date,
'text_date' => $text_date,
'buy_form' => $buy_form,
]);
}
// var_dump($auction_setting);
// var_dump($auction_setting[0]->getIdProduct());
}
}