<?php
namespace App\Controller\Eshop;
use App\Controller\EshopController;
use App\Entity\ClickAndCollect;
use App\Entity\Client;
use App\Entity\ClientAddress;
use App\Entity\Newsletter;
use App\Entity\Order;
use App\Entity\Reclamation;
use App\Enum\CollectEnum;
use App\Enum\OrderEnum;
use App\Fce\F_Ecomail;
use App\Fce\F_Tree;
use App\Form\Eshop\CartAddressType;
use App\Form\Eshop\ContactType;
use App\Form\Eshop\NewsletterType;
use App\Form\Eshop\ReclamationType;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/")
*/
class DefaultController extends EshopController
{
/**
* @Route("", name="web_default")
* @Template()
*
* @return array
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function index(): array
{
return [
'categories' => $this->categoryRepository->findAllTree(true),
'top_brands' => $this->brandRepository->getAtHomepage(),
'brands' => $this->brandRepository->findForMenu(),
'biggestDiscount' => $this->productRepository->biggestDiscount(),
'news_products' => $this->productRepository->newsProducts(),
'banner' => $this->slideRepository->getHomepage()
//'banners' => $this->slideRepository->getAtHomepage()
];
}
/**
* @Route("reklamace/", name="web_page_reclamation")
* @Template()
* @param Request $request
* @param \Swift_Mailer $mailer
*
* @param TranslatorInterface $translator
*
* @return array|RedirectResponse
*/
public function reclamation(Request $request, \Swift_Mailer $mailer, TranslatorInterface $translator)
{
$reclamation = new Reclamation();
$form = $this->createForm(ReclamationType::class, $reclamation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$order = $this->orderRepository->findForReclamation($form);
if (!$order instanceof Order) {
$this->addFlash('danger', $translator->trans('reclamation.notFound'));
return $this->redirectToRoute('web_page_reclamation');
}
$reclamation->setOrder($order);
$reclamation->setCreatets(new \DateTime());
$reclamation->setDealer($order->getDealer());
$this->em->persist($reclamation);
$this->em->flush();
$message = (
new \Swift_Message($translator->trans('reclamation.email.subject')))
->setFrom($this->getParameter('from_email'))
->setTo($reclamation->getEmail())
//->setBcc( [$this->getParameter('test_email'),$reclamation->getDealer()->getOrderEmail()] )
->setBcc(explode(',', $reclamation->getDealer()->getOrderEmail()))
->setBody($this->renderView('eshop/emails/reclamation.html.twig', ['form' => $form]), 'text/html');
if ($mailer->send($message)) {
$this->addFlash('success', $translator->trans('reclamation.sended'));
return $this->redirectToRoute('web_default');
}
}
return [
'form' => $form->createView(),
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'dealers' => $this->dealerRepository->findForContacts(),
];
}
/**
* @Route("kontakt/", name="web_page_contact")
* @Template()
* @param Request $request
* @param \Swift_Mailer $mailer
*
* @param TranslatorInterface $translator
*
* @return array|RedirectResponse
*/
public function contact(Request $request, \Swift_Mailer $mailer, TranslatorInterface $translator)
{
$form = $this->createForm(ContactType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->isHoneypotFilled($form)) {
$this->addFlash('success', $translator->trans('contact.sended'));
return $this->redirectToRoute('web_page_contact');
}
if (isset($_POST['g-recaptcha-response'])) {
$captcha = $_POST['g-recaptcha-response'];
$secretKey = "6Lc9IQosAAAAAN1Oavyb1aiH10seSXD-0xUg05vO";
$url = 'https://www.google.com/recaptcha/api/siteverify?secret=' . urlencode($secretKey) . '&response=' . urlencode($captcha);
$response = file_get_contents($url);
$responseKeys = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
// should return JSON with success as true
if ($responseKeys["success"]) {
$message = (
new \Swift_Message('Kontaktní formulář'))
->setFrom($this->getParameter('from_email'))
->setTo($this->getParameter('contact_email'))
//->setBcc( $this->getParameter('test_email') )
->setBody($this->renderView('eshop/emails/contact.html.twig', ['form' => $form]), 'text/html');
if ($mailer->send($message)) {
$this->addFlash('success', $translator->trans('contact.sended'));
return $this->redirectToRoute('web_page_contact');
}
} else {
$this->addFlash('danger', 'Žádost byla odeslána.');
}
}
}
return [
'form' => $form->createView(),
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'dealers' => $this->dealerRepository->findForContacts(),
];
}
private function isHoneypotFilled(FormInterface $form): bool
{
return $form->has('website') && trim((string) $form->get('website')->getData()) !== '';
}
/**
* @Route("click-and-collect/", name="web_page_cac")
* @Route("click-and-order/", name="web_page_ord")
* @Template()
*
* @return array
*/
public function cac(): array
{
return [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu()
];
}
/**
* @Route("market-place/", name="web_market_place")
* @Template()
*
* @return array
*/
public function marketPlace(): array
{
return [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu()
];
}
/**
* @Route("profil/address", name="web_client_address")
* @Template()
*
* @param Request $request
*
* @return array|RedirectResponse
*/
public function profileAddress(Request $request)
{
/** @var Client $client */
$client = $this->getUser();
$billingAddress = new ClientAddress();
$billingAddress->setClient($client);
$deliveryAddress = new ClientAddress();
$deliveryAddress->setClient($client);
if ($client->getBillingAddress() instanceof ClientAddress) {
$billingAddress = $client->getBillingAddress();
}
if ($client->getDeliveryAddress() instanceof ClientAddress) {
$deliveryAddress = $client->getDeliveryAddress();
}
$form = $this->createFormBuilder(null, ['data_class' => Client::class, 'data' => $client])
->add('billingAddress', CartAddressType::class, ['data' => $billingAddress, 'type' => 'billing', 'data_class' => ClientAddress::class])
->add('deliveryAddress', CartAddressType::class, ['data' => $deliveryAddress, 'type' => 'delivery', 'data_class' => ClientAddress::class])
->add('hasDeliveryAddress', CheckboxType::class, ['label' => 'cart.address.hasDelivery', 'data' => $client->getHasDeliveryAddress(), 'required' => false])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (empty($client->getDeliveryAddress()->getStreet())) {
$client->setDeliveryAddress(null);
}
$this->em->persist($client);
$this->em->flush();
return $this->redirectToRoute('web_client_address');
}
return [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'form' => $form->createView()
];
}
/**
* @Route("search/{search}", name="web_search")
* @Route("search/", name="web_search_ape")
* @param Request $request
* @param $search
*
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
*/
public function search(Request $request, $search = null)
{
if ($search === null) {
return $this->redirectToRoute('web_default');
}
$filters = $this->productRepository->getFiltersSearch($search);
$ret = new Response();
[$hash, $ret] = $this->_generateHash($request, $this->generateUrl('web_search', ['search' => $search]), $ret);
$ret->setContent($this->renderView('eshop/default/search.html.twig', [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'search' => $search,
'filters' => $filters,
'recentlyProducts' => $this->recentlyProductRepository->getRecentlyProducts($hash, $this->getUser()),
]));
return $ret;
}
/**
* @Route("brand/{brand}", name="web_brand")
* @Route("brand/", name="web_brand_ape")
* @Route("dealer/{dealer}", name="web_dealer")
* @Route("dealer/", name="web_dealer_ape")
* @Template()
* @param Request $request
* @param $brand
*
* @param null $dealer
*
* @return array
*/
public function brand(Request $request, $brand = null, $dealer = null)
{
$ret = new Response();
if (!empty($brand)) {
$entity = $brand = $this->brandRepository->findOneBy(['slug' => $brand]);
$filters = $this->productRepository->getFilters($brand);
[$hash, $ret] = $this->_generateHash($request, $this->generateUrl('web_brand', ['brand' => $brand->getSlug()]), $ret);
} else {
$entity = $dealer = $this->dealerRepository->findOneBy(['slug' => $dealer]);
$filters = $this->productRepository->getFilters($dealer);
[$hash, $ret] = $this->_generateHash($request, $this->generateUrl('web_dealer', ['dealer' => $dealer->getSlug()]), $ret);
}
$ret->setContent($this->renderView('eshop/default/brand.html.twig', [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'brand' => $brand,
'dealer' => $dealer,
'entity' => $entity,
'filters' => $filters,
'recentlyProducts' => $this->recentlyProductRepository->getRecentlyProducts($hash, $this->getUser())
]));
return $ret;
}
/**
* @Route("category/{slug}", name="web_category")
* @param Request $request
* @param $slug
*
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
*/
public function category(Request $request, $slug)
{
try {
$categ = $this->categoryRepository->findOneBySlug($slug);
} catch (NoResultException $e) {
return $this->redirectToRoute('web_default');
} catch (NonUniqueResultException $e) {
return $this->redirectToRoute('web_default');
}
$categories = $this->categoryRepository->findAllTree(true);
$filters = $this->productRepository->getFilters($this->categoryRepository->findAllTree(true, $categ->getId()));
$filters['subs'] = F_Tree::findInTree($categories, $categ->getId());
$ret = new Response();
[$hash, $ret] = $this->_generateHash($request, $this->generateUrl('web_category', ['slug' => $slug]), $ret);
$ret->setContent($this->renderView('eshop/default/category.html.twig', [
'category' => $categ,
'brands' => $this->brandRepository->findForMenu(),
'filters' => $filters,
'categories' => $categories,
'recentlyProducts' => $this->recentlyProductRepository->getRecentlyProducts($hash, $this->getUser()),
]));
return $ret;
}
private function _generateHash(Request $request, $route, $ret)
{
$hash = $request->cookies->get('recentlyProducts');
if (empty($hash)) {
$hash = md5(uniqid(time(), true));
$ret->headers->setCookie(new Cookie('recentlyProducts', $hash, time() + 31556926));
}
return [$hash, $ret];
}
public function _breadcrumbs($id, $categories, $product = null): Response
{
$tree = F_Tree::getBreadcrumbs($categories, $id);
return $this->render('eshop/core/breadcrumb.html.twig', ['tree' => $tree, 'product' => $product]);
}
public function _newsletter(Request $request, $locale = null, $source = 'eshop')
{
$entity = new Newsletter();
if (!empty($locale)) {
$entity->setLocale($locale);
$entity->setSource($source);
}
$form = $this->createForm(NewsletterType::class, $entity);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$entity->setCreatets(new \DateTime());
$entity->setIp($_SERVER['REMOTE_ADDR']);
$this->em->persist($entity);
$this->em->flush();
F_Ecomail::addSubscriberFromEntity($entity);
return [];
}
if ($source === 'eshop') {
return $this->render('eshop/core/newsletter.html.twig', ['form' => $form->createView()]);
}
return $this->render('web/core/newsletter.html.twig', ['form' => $form->createView()]);
}
/**
* @Route("odber-vytvoren/", name="web_newsletter_add")
* @Template()
* @param Request $request
*
* @return array
*/
public function newsletter(Request $request): array
{
$entity = new Newsletter();
$entity->setLocale(\Locale::getDefault());
$form = $this->createForm(NewsletterType::class, $entity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entity->setCreatets(new \DateTime());
$entity->setIp($_SERVER['REMOTE_ADDR']);
$this->em->persist($entity);
$this->em->flush();
F_Ecomail::addSubscriberFromEntity($entity);
return [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'email' => $entity->getEmail(),
'result' => 1
];
}
return [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'email' => $entity->getEmail(),
'result' => 0
];
}
/**
* @Route("product/{slug}", name="web_product")
* @Route("product/", name="web_product_ape")
* @param Request $request
* @param $slug
*
* @return array|RedirectResponse
*/
public function product(Request $request, $slug)
{
try {
$product = $this->productRepository->findOneBySlug($slug);
$product = $this->productRepository->getProductData([$product->getId()]);
$product = reset($product);
} catch (NoResultException $e) {
return $this->redirectToRoute('web_default');
} catch (NonUniqueResultException $e) {
return $this->redirectToRoute('web_default');
}
$ret = new Response();
[$hash, $ret] = $this->_generateHash($request, $this->generateUrl('web_product', ['slug' => $slug]), $ret);
$this->recentlyProductRepository->addRecently($hash, $this->getUser(), $product['id']);
$ret->setContent($this->renderView('eshop/default/product.html.twig', [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'recentlyProducts' => $this->recentlyProductRepository->getRecentlyProducts($hash, $this->getUser(), $product['id']),
'product' => $product,
'selectedVariant' => $request->query->get('var')
]));
return $ret;
}
/**
* @Route("rezervace/prodlouzeni/{hash}", name="web_click_and_collect_extended")
* @Template()
* @param TranslatorInterface $translator
* @param null $hash
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function collectionExtend(TranslatorInterface $translator, $hash = null): ?RedirectResponse
{
$data = explode('|', base64_decode($hash));
$entity = $this->clickAndCollectRepository->findOneBy(['clientEmail' => $data[0], 'number' => $data[1], 'id' => $data[2]]);
if (!$entity instanceof ClickAndCollect) {
return $this->redirectToRoute('web_default');
}
if ($entity->getExtended()) {
$message = $translator->trans('extend.repeate');
} else {
$entity->setExtended(true);
$entity->setStatus(CollectEnum::EXTENDED);
$date = clone $entity->getReservedTo();
$date->modify('+4 days');
$entity->setReservedTo($date);
$this->em->persist($entity);
$this->em->flush();
$message = $translator->trans('extend.success', ['%date%' => $date->format('d.m.Y H:i:s')]);
}
echo $message;
die;
}
/**
* @Route("objednavka/storno/{hash}", name="web_order_storno")
* @Route("objednavka/storno/{hash}/{confirm}", name="web_order_storno_confirm")
* @Template()
* @param TranslatorInterface $translator
* @param null $hash
*
* @param bool $confirm
*
* @return RedirectResponse|Response
*/
public function orderStorno(TranslatorInterface $translator, $hash = null, $confirm = false)
{
$order = $this->orderRepository->findByHash($hash);
$message = false;
if (!$order instanceof Order) {
return $this->redirectToRoute('web_default');
}
if ($confirm) {
if ($order->getStornots() !== null) {
$message = $translator->trans('order.storno.repeate');
} else {
$order->setStornots(new \DateTime());
$order->setStatus(OrderEnum::STORNO_CLIENT);
$this->em->persist($order);
$this->em->flush();
$message = $translator->trans('order.storno.success');
}
}
return $this->render('eshop/order/order_storno.html.twig', [
'categories' => $this->categoryRepository->findAllTree(true),
'brands' => $this->brandRepository->findForMenu(),
'cart' => $order,
'message' => $message
]);
}
/**
* @Route("change-currency/{code}", name="web_change_currency")
* @Route("change-currency/", name="web_change_currency_ape")
* @param Request $request
* @param string $code
*
* @return RedirectResponse
*/
public function changeCurrency(Request $request, string $code): RedirectResponse
{
if (!empty($code)) {
$request->getSession()->set('_currency', $code);
}
if (!empty($request->query->get('referer'))) {
return $this->redirectToRoute($request->query->get('referer'));
}
return $this->redirect($request->headers->get('referer', $this->generateUrl('web_default')));
}
/**
* @Route("app/{locale}/{code}", name="web_application_texts")
* @param $locale
* @param string $code
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function applicationTextx($locale, string $code)
{
switch ($code) {
case 'gdpr':
{
return $this->render('eshop/files/gdpr_' . $locale . '.html.twig');
}
case 'terms-and-conditions':
{
return $this->render('eshop/files/terms_and_conditions_' . $locale . '.html.twig');
}
default:
{
return $this->redirectToRoute('web_default');
}
}
}
}