<?php
namespace App\Controller;
use App\Entity\Agreements;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Service\TrafficTracker;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Partner;
use App\Entity\Productbywholesaler;
use App\Entity\Vendors;
use App\Entity\Customer;
use App\Entity\Product;
use App\Entity\Category;
use App\Entity\Cta;
use App\Entity\Resources;
use App\Entity\Productline;
use App\Entity\Wholesaler;
use App\Entity\Productopinions;
use App\Entity\User;
use App\Service\DataProductFinder;
use App\Service\HeaderData;
use App\Form\Catalog\CatalogProductSearch;
use App\Service\Translation;
use Doctrine\ORM\Tools\Pagination\Paginator;
use App\Form\Catalog\SearchPromotion;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use App\Service\SanitizeService;
use App\Entity\Bundle;
use Doctrine\ORM\Query\Expr\Join;
use App\Service\PriceCalculatorService;
use App\Service\ConnectifService;
use App\Service\Currency\OperationalCurrencyProvider;
use App\Service\JsonSearchService;
use App\Entity\WarehouseProduct;
use App\Service\ExtraFieldsService;
class CatalogController extends AbstractController
{
private $connectifService;
private $operationalCurrencyProvider;
public function __construct(ConnectifService $connectifService, OperationalCurrencyProvider $operationalCurrencyProvider)
{
$this->connectifService = $connectifService;
$this->operationalCurrencyProvider = $operationalCurrencyProvider;
}
/**
* @Route("/catalog/default/goto", name="catalog_goto")
*/
public function index(TrafficTracker $trafficTracker)
{
$trafficTracker->registerTraffic();
$user = $this->getUser();
if ($user->getPartner()) {
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$partner = $partnerRepository->MyPartnerQuery($user)->setMaxResults(1)->getQuery()->getSingleResult();
return $this->redirectToRoute('catalog_index', ['partnerId' => $partner->getId()]);
}
if ($user->getCustomer()) {
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$customer = $customerRepository->MyCustomerQuery($user)->setMaxResults(1)->getQuery()->getSingleResult();
return $this->redirectToRoute('catalog_index', ['partnerId' => $customer->getPartner()->getId()]);
}
return $this->redirectToRoute('catalog_customizemarket');
}
/**
* @Route("/catalog/default/index/{partnerId}", name="catalog_index", requirements={"partnerId"="\d+"})
*/
public function catalog(Request $request, HeaderData $buildHeaderData, Translation $translation, TrafficTracker $trafficTracker, PriceCalculatorService $priceCalculator, OperationalCurrencyProvider $operationalCurrencyProvider, $partnerId)
{
$trafficTracker->registerTraffic();
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$data = array();
$locale = $request->getLocale();
$user = $this->getUser();
//TODO wholesaler can't enter in index - goes to customize. to delete?
if (!is_null($user->getWholesaler())) {
$idwholesaler = $user->getWholesaler()->getId();
} elseif (!is_null($user->getPartner())) {
$partner = $partnerRepository->MyPartnerQuery($user)
->andWhere('p.id = :partnerId ')
->setParameter('partnerId', $partnerId)
->setMaxResults(1)->getQuery()->getSingleResult();
$idwholesaler = $partner->getWholesaler()->getId();
}
//TODO customer can enter in index???
elseif (!is_null($user->getCustomer())) {
$customer = $customerRepository->MyCustomerQuery($user)
->andWhere('c.id = :customerId ')
->setParameter('customerId', $user->getCustomer()->getId())
->setMaxResults(1)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
$idwholesaler = $partner->getwholesaler()->getId();
}
$carouselImages = $this->getDoctrine()->getRepository(\App\Entity\Catalogcarouselimages::class)->findBy(['wholesaler' => $idwholesaler]);
return $this->render('/catalog/default/index.html.twig', [
'partner' => $partner,
'idWholesaler' => $partner->getWholesaler()->getId(),
'headerData' => $buildHeaderData->buildHeaderData($user),
'coverProducts' => $this->catalogCoverProducts(),
'carousel' => $carouselImages,
'locale' => $locale,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'server_name' => $_ENV["LOCAL_SERVER_NAME"],
'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'cnClientInfo' => ($this->connectifService->cnClientInfo($user)),
'cnCart' => $this->connectifService->cnCart($user),
'operationalCurrency' => $operationalCurrencyProvider->provide($partner),
]);
}
/**
* @Route("/catalog/default/customizemarket", name="catalog_customizemarket")
*/
public function customizemarket(HeaderData $buildHeaderData, Translation $translation, TrafficTracker $trafficTracker, PriceCalculatorService $priceCalculator, Request $request)
{
$trafficTracker->registerTraffic();
$user = $this->getUser();
$idwholesaler = $user->getWholesaler()->getId();
$carouselImages = $this->getDoctrine()->getRepository(\App\Entity\Catalogcarouselimages::class)->findBy(['wholesaler' => $idwholesaler]);
return $this->render('/catalog/default/index.html.twig', [
'data' => array(),
'headerData' => $buildHeaderData->buildHeaderData($user),
'coverProducts' => $this->catalogCoverProducts(),
'carousel' => $carouselImages,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'partner' => $partnerRepository = $this->getDoctrine()->getRepository(Partner::class)->find(7),
'locale' => $request->getLocale(),
'idWholesaler' => $idwholesaler,
'server_name' => $_ENV["LOCAL_SERVER_NAME"],
'useSymbol' => $user->getWholesaler()->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'operationalCurrency' => $this->operationalCurrencyProvider->provide($user->getWholesaler())
]);
}
/**
* @Route("/catalog/default/vendor/{id}/{page}", name="catalog_vendor", requirements={"id"="\d+"}, defaults={"page"=1})
*/
public function vendor($id, $page, TranslatorInterface $translator, Translation $translation, HeaderData $buildHeaderData, TrafficTracker $trafficTracker, PriceCalculatorService $priceCalculator, Request $request, OperationalCurrencyProvider $operationalCurrencyProvider)
{
$trafficTracker->registerTraffic();
$user = $this->getUser();
$entityManager = $this->getDoctrine()->getManager();
$vendorRepository = $this->getDoctrine()->getRepository(Vendors::class);
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$userRepository = $this->getDoctrine()->getRepository(User::class);
$operationalCurrency = $operationalCurrencyProvider->provide($userRepository->getCompany($user));
$vendor = $vendorRepository->find($id);
$customer = null;
$hasFilter = false;
$locale = $request->getLocale();
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
} elseif ($user->getWholesaler()) {
$partner = $partnerRepository->MyPartnerQuery($user)
->andWhere('p.wholesaler = :wholesaler ')
->setParameter('wholesaler', $user->getWholesaler()->getId())
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
} else {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
}
$wholesaler = $partner->getWholesaler();
//Mirar si el mayorista tiene agreement para ese fabricante?
$hasAgreement = $userRepository->checkWholesalerAgreementByVendor($user, $vendor);
if (!$hasAgreement) {
if ($user->getWholesaler()) {
return $this->redirectToRoute('catalog_customizemarket');
} else {
return $this->redirectToRoute('catalog_goto');
}
}
$productsQuery = $productRepository->MyProductQuery($user)
->andWhere('p.cansellalone = 1 and p.isflavour = 0 and p.cansell = 1')
->andWhere('pl.vendor = :vendorId')
->leftJoin('p.productLine', 'pl')
->leftJoin('pl.categories', 'cat')
->setParameter('vendorId', $id);
$programms = $entityManager->createQuery("SELECT vp FROM \App\Entity\Vendorprogramms vp "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. 'where vp.id = p.vendorProgramm and pbw.product=p.id and pbw.wholesaler = :idWholesaler and pbw.unregistrationdate is null and vp.vendor = :vendorId and p.cansell = 1')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('vendorId', $id)
->getResult();
$productLines = $entityManager->createQuery("SELECT pl FROM \App\Entity\Productline pl "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. 'where pl.id = p.productLine and pbw.product=p.id and pbw.wholesaler = :idWholesaler and pl.vendor = :vendorId and pl.unregistrationdate is null and pbw.unregistrationdate is null and p.cansell = 1')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('vendorId', $id)
->getResult();
$categories = $entityManager->createQuery("SELECT c FROM \App\Entity\Category c "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. "JOIN c.productlines pl "
. 'where pl.id = p.productLine and pbw.product=p.id and pbw.wholesaler = :idWholesaler and pl.vendor = :vendorId and pl.unregistrationdate is null and pbw.unregistrationdate is null and p.cansell = 1')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('vendorId', $id)
->getResult();
$form = $this->createForm(CatalogProductSearch::class, null, array(
'translator' => $translator,
'translation' => $translation,
'text' => $request->get('text'),
'productline' => $request->get('productline'),
'locale' => $locale,
'productlines' => $productLines,
'programm' => $programms,
'categories' => $categories,
'vendors' => array(),
));
$form->handleRequest($request);
if ($form->get('text')->getData() || $form->get('productline')->getData() || $form->get('programm')->getData()) {
$hasFilter = true;
//save query in bd
$catalogQuery = new \App\Entity\Catalogquerys();
$catalogQuery->setUser($user);
}
$filters = [
'text' => null,
'programm' => null,
'productline' => null,
'category' => null
];
//Custom filters
if ($form->get('text')->getData()) {
$productsQuery = $productsQuery
->andWhere("p.name like :text or p.sku like :text ")
->setParameter('text', '%' . $form->get('text')->getData() . '%');
$catalogQuery->setText($form->get('text')->getData());
$filters['text'] = $form->get('text')->getData();
}
if ($form->get('programm')->getData()) {
$productsQuery = $productsQuery
->andWhere("p.vendorProgramm = :programm ")
->setParameter('programm', $form->get('programm')->getData());
$catalogQuery->setIdProgramm($form->get('programm')->getData());
$filters['programm'] = $form->get('programm')->getData();
}
if ($form->get('productline')->getData()) {
$productsQuery = $productsQuery
->andWhere("p.productLine = :pl ")
->setParameter('pl', $form->get('productline')->getData());
$catalogQuery->setIdProductline($form->get('productline')->getData());
$filters['productline'] = $form->get('productline')->getData();
}
if ($form->get('category')->getData()) {
$productsQuery = $productsQuery
->andWhere("cat.id = :cat ")
->setParameter('cat', $form->get('category')->getData());
$filters['category'] = $form->get('category')->getData();
}
$pbwIds = "";
$productsWithoutFilterCtas = $this->catalogSingleVendorProducts($vendor);
$featuredCtas = $this->filterCatalogSingleVendorProducts($productsWithoutFilterCtas, $filters);
$lengthFeaturedProducts = sizeof($featuredCtas);
$limit = 18;
if ($page == 1) {
$limit = $limit - $lengthFeaturedProducts;
$featuredProducts = array();
foreach ($featuredCtas as $cta) {
array_push($featuredProducts, $cta->getProductbywholesaler());
}
$featuredCtasArray = array();
foreach ($featuredCtas as $cta) {
$featuredCtasArray[$cta->getProductbywholesaler()->getId()] = $cta;
}
}
$offset = 18;
if ($lengthFeaturedProducts > 0) //if get data from campaign
{
$pbwIds = array();
foreach ($featuredCtas as $cta) {
array_push($pbwIds, $cta->getProductbywholesaler()->getId());
}
$offset = 18 - $lengthFeaturedProducts;
}
$productbywholesalerRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$productsbywholesaler = $productbywholesalerRepository->MyProductbywholesalerQuery($user)
->leftJoin("pbw.product", "p");
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$productsbywholesaler = $productsbywholesaler
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$productsbywholesaler = $productsbywholesaler
->andWhere('pbw.product IN (:products)')
->andWhere('pbw.id NOT IN (:featuredProducts)')
->setParameter('products', $productsQuery->getQuery()->execute())
->setParameter('featuredProducts', $pbwIds)
->orderBy('p.name', 'asc');
//if filter, save result
if ($hasFilter) {
$result = '';
foreach ($productsbywholesaler->orderBy('p.name', 'asc')->getQuery()->execute() as $product) {
$result = $result . $product->getId() . ',';
}
$catalogQuery->setResult($result);
$entityManager->persist($catalogQuery);
$entityManager->flush();
}
$productsbywholesaler->setFirstResult($offset * ($page - 1))->setMaxResults($limit);
$paginator = new Paginator($productsbywholesaler, $fetchJoinCollection = true);
$maxPages = ceil($paginator->count() / $limit);
$thisPage = $page;
return $this->render('/catalog/default/vendor.html.twig', [
'vendor' => $vendor,
'products' => $paginator->getIterator(),
'partner' => $partner,
'headerData' => $buildHeaderData->buildHeaderData($user),
'form' => $form->createView(),
'customer' => $customer,
'locale' => $locale,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'productRepository' => $this->getDoctrine()->getRepository(Product::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'maxPages' => $maxPages,
'thisPage' => $thisPage,
'count' => count($paginator),
'programms' => count($programms),
'categories' => count($categories),
'vendorRepo' => $vendorRepository,
'vendors' => 0,
'featuredProducts' => $page == 1 ? $featuredProducts : null,
'featuredCtasArray' => $page == 1 ? $featuredCtasArray : null,
'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'operationalCurrency' => $operationalCurrency
]);
}
/**
* @Route("/catalog/default/vendors", name="catalog_vendors")
*/
public function vendors(TranslatorInterface $translator, Translation $translation, HeaderData $buildHeaderData, TrafficTracker $trafficTracker, Request $request)
{
$trafficTracker->registerTraffic();
$user = $this->getUser();
$locale = $request->getLocale();
$entityManager = $this->getDoctrine()->getManager();
$vendorRepository = $this->getDoctrine()->getRepository(Vendors::class);
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$userRepository = $this->getDoctrine()->getRepository(User::class);
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
} elseif ($user->getWholesaler()) {
$partner = $partnerRepository->MyPartnerQuery($user)
->andWhere('p.wholesaler = :wholesaler ')
->setParameter('wholesaler', $user->getWholesaler()->getId())
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
} else {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
}
$wholesaler = $partner->getWholesaler();
$featuredVendorArray = $this->catalogFeaturedVendors();
$lengthFeaturedVendorArray = sizeof($featuredVendorArray);
$limit = 18;
$limit = $limit - $lengthFeaturedVendorArray;
$offset = 18;
$vendorIds = "";
if ($lengthFeaturedVendorArray > 0) {
$offset = 18 - $lengthFeaturedVendorArray;
$vendorIds = array();
foreach ($featuredVendorArray as $cta) {
array_push($vendorIds, $cta->getVendor()->getId());
}
}
$vendors = $entityManager->createQueryBuilder()
->select('DISTINCT v')
->from('App\Entity\Vendors', 'v')
->join('App\Entity\Productline', 'pl', 'WITH', 'pl.vendor = v.id')
->join('App\Entity\Product', 'p', 'WITH', 'p.productLine = pl.id')
->join('App\Entity\Productbywholesaler', 'pbw', 'WITH', 'pbw.product = p.id')
->where('pbw.wholesaler = :idWholesaler');
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$vendors = $vendors
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$vendors = $vendors
->andWhere('pbw.unregistrationdate IS NULL')
->andWhere('v.id NOT IN (:vendors)')
->orderBy('v.name', 'ASC')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('vendors', $vendorIds);
$vendors->setMaxResults($limit);
$paginator = new Paginator($vendors, $fetchJoinCollection = false);
$maxPages = ceil($paginator->count() / $limit);
return $this->render('/catalog/default/vendors.html.twig', [
'vendors' => $paginator,
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'headerData' => $buildHeaderData->buildHeaderData($user),
'remaining' => $paginator->count() - $limit,
'nextOffset' => $offset,
'featuredVendorArray' => $featuredVendorArray,
]);
}
/**
* @Route("/catalog/default/category/{id}/{page}", name="catalog_category", requirements={"id"="\d+"}, defaults={"page"=1})
*/
public function category($id, $page, TranslatorInterface $translator, Translation $translation, HeaderData $buildHeaderData, TrafficTracker $trafficTracker, PriceCalculatorService $priceCalculator, Request $request)
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$userRespository = $this->getDoctrine()->getRepository(User::class);
$wholesalerRepository = $this->getDoctrine()->getRepository(Wholesaler::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$categoryRepository = $this->getDoctrine()->getRepository(Category::class);
$productlineRepository = $this->getDoctrine()->getRepository(Productline::class);
$locale = $request->getLocale();
$user = $this->getUser();
$category = $categoryRepository->find($id);
$customer = null;
$hasFilter = false;
$target = $userRespository->getCompany($this->getUser());
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
$wholesaler = $partner->getWholesaler();
$partnerId = $partner->getId();
} elseif ($user->getCustomer()) {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
$wholesaler = $partner->getWholesaler();
$partnerId = $partner->getId();
} else {
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->getQuery()->getSingleResult();
$partnerId = '';
}
$productsQuery = $productRepository->MyProductQuery($user)
->andWhere('p.cansellalone = 1 and p.isflavour = 0 and c.id = :catId and p.cansell = 1')
->leftJoin('p.productLine', 'pl')
->leftJoin('pl.categories', 'c')
->leftJoin('pl.vendor', 'v')
->setParameter('catId', $id);
$productLines = $entityManager->createQuery("SELECT pl FROM \App\Entity\Productline pl "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. "JOIN pl.categories cat "
. 'where pl.id = p.productLine and pbw.product=p.id and pbw.wholesaler = :idWholesaler and cat.id = :catId and pl.unregistrationdate is null and pbw.unregistrationdate is null')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('catId', $id)
->getResult();
$vendors = $entityManager->createQuery("SELECT v FROM \App\Entity\Vendors v "
. "JOIN App\Entity\Productline pl "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. "JOIN pl.categories cat "
. 'where pl.vendor = v.id and pl.id = p.productLine and pbw.product=p.id and pbw.wholesaler = :idWholesaler and cat.id = :catId and pl.unregistrationdate is null and pbw.unregistrationdate is null')
->setParameter('idWholesaler', $wholesaler->getId())
->setParameter('catId', $id)
->getResult();
$form = $this->createForm(CatalogProductSearch::class, null, array(
'translator' => $translator,
'translation' => $translation,
'text' => $request->get('text'),
'productline' => $request->get('productline'),
'locale' => $locale,
'productlines' => $productLines,
'programm' => array(),
'categories' => array(),
'vendors' => $vendors,
));
$form->handleRequest($request);
if ($form->get('text')->getData() || $form->get('productline')->getData()) {
$hasFilter = true;
//save query in bd
$catalogQuery = new \App\Entity\Catalogquerys();
$catalogQuery->setUser($user);
}
//Custom filters
if ($form->get('text')->getData()) {
$productsQuery = $productsQuery
->andWhere("p.name like :text or p.sku like :text ")
->setParameter('text', '%' . $form->get('text')->getData() . '%');
}
if ($form->get('productline')->getData()) {
$productsQuery = $productsQuery
->andWhere("p.productLine = :pl ")
->setParameter('pl', $form->get('productline')->getData());
}
if ($form->get('vendor')->getData()) {
$productsQuery = $productsQuery
->andWhere("v.id = :vId ")
->setParameter('vId', $form->get('vendor')->getData());
}
$productbywholesalerRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$productsbywholesaler = $productbywholesalerRepository->MyProductbywholesalerQuery($user)
->leftJoin("pbw.product", "p");
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$productsbywholesaler = $productsbywholesaler
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$productsbywholesaler = $productsbywholesaler
->andWhere('pbw.product IN (:products)')
->setParameter('products', $productsQuery->getQuery()->execute())
->orderBy('p.name', 'asc');
if ($hasFilter) {
$result = '';
foreach ($productsbywholesaler->orderBy('p.name', 'asc')->getQuery()->execute() as $product) {
$result = $result . $product->getId() . ',';
}
$catalogQuery->setResult($result);
$entityManager->persist($catalogQuery);
$entityManager->flush();
}
$limit = 18;
$productsbywholesaler->setFirstResult($limit * ($page - 1))->setMaxResults($limit);
$paginator = new Paginator($productsbywholesaler, $fetchJoinCollection = true);
$maxPages = ceil($paginator->count() / $limit);
$thisPage = $page;
return $this->render('/catalog/default/category.html.twig', [
'category' => $category,
'products' => $paginator->getIterator(),
'partnerId' => $partnerId,
'partner' => null,
'headerData' => $buildHeaderData->buildHeaderData($user),
'form' => $form->createView(),
'customer' => $customer,
'locale' => $locale,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'productRepository' => $this->getDoctrine()->getRepository(Product::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'maxPages' => $maxPages,
'thisPage' => $thisPage,
'count' => count($paginator),
'programms' => 0,
'categories' => 0,
'vendors' => count($vendors),
'category_name' => $translation->getTranslationBy($category, $locale, 'name'),
'useSymbol' => $wholesaler->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'operationalCurrency' => $this->operationalCurrencyProvider->provide($target),
'cnClientInfo' => ($this->connectifService->cnClientInfo($user)),
]);
}
/**
* @Route("/catalog/default/view/{id}", name="catalog_view", requirements={"id"="\d+"})
*/
public function view($id, TrafficTracker $trafficTracker, TranslatorInterface $translator, Translation $translation, DataProductFinder $dataProductFinder, HeaderData $buildHeaderData, PriceCalculatorService $priceCalculator, JsonSearchService $jsonSearchService, Request $request, ExtraFieldsService $extraFieldsService)
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$wholesalerRepository = $this->getDoctrine()->getRepository(Wholesaler::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$resourceRepository = $this->getDoctrine()->getRepository(Resources::class);
$userRepository = $this->getDoctrine()->getRepository(User::class);
$licensetypeRepository = $this->getDoctrine()->getRepository(\App\Entity\Licensetype::class);
$user = $this->getUser();
$locale = $request->getLocale();
$commercialEmail = '';
$markup_value = 0;
$discount = 0;
$isVendor = false;
$pbw = $pbwRepository->MyProductbywholesalerQuery($user)
->andWhere('pbw.id = :id')->setParameter('id', $id);
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$pbw = $pbw
->leftJoin("pbw.product", "p")
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$pbw = $pbw
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$partner = null;
if ($user->getPartner()) {
if (!$pbw || $pbw->getProduct()->getProducttype() == null || $pbw->getProduct()->getCanSellAlone() == 0) {
return $this->redirect($this->generateUrl('catalog_goto'));
}
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
$commercialUser = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($partner->getIdcommercialagent());
$commercialEmail = $commercialUser->getEmail();
$isPartner = true;
$isWholesaler = false;
$wholesaler = $user->getPartner()->getWholesaler();
$target = $partner;
if (!$pbw) {
return $this->redirect($this->generateUrl('catalog_goto'));
}
} elseif ($user->getWholesaler()) {
if (!$pbw || $pbw->getProduct()->getProducttype() == null || $pbw->getProduct()->getCanSellAlone() == 0) {
return $this->redirect($this->generateUrl('catalog_customizemarket'));
}
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->getQuery()->getSingleResult();
//TODO hotfix por un calculo necesiario para el product DataFinder - eliminar el precio de allÃ
$partner = $entityManager->createQuery('SELECT p FROM App\Entity\Partner p '
. 'where p.wholesaler = :wholesaler ')
->setParameters(array('wholesaler' => $wholesaler->getId()))
->setMaxResults(1)
->getOneOrNullResult();
$isPartner = false;
$isWholesaler = true;
$wholesaler = $user->getWholesaler();
$target = $wholesaler;
} elseif ($user->getVendor()) {
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->setMaxResults(1)->getQuery()->getSingleResult();
$partner = $entityManager->createQuery('SELECT p FROM App\Entity\Partner p '
. 'where p.wholesaler = :wholesaler ')
->setParameters(array('wholesaler' => $wholesaler->getId()))
->setMaxResults(1)
->getOneOrNullResult();
$isPartner = false;
$isVendor = true;
$isWholesaler = false;
$target = $wholesaler;
} else {
if (!$pbw || $pbw->getProduct()->getCanSellAlone() == 0) {
return $this->redirect($this->generateUrl('catalog_goto'));
}
$customer = $customerRepository->MyCustomerQuery($user)
->andWhere('c.id = :customerId ')
->setParameter('customerId', $user->getCustomer()->getId())
->getQuery()->getSingleResult();
$wholesaler = $user->getCustomer()->getPartner()->getWholesaler();
$partner = $customer->getPartner();
$commercialUser = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($customer->getIdcommercialagent());
$commercialEmail = $commercialUser->getEmail();
$isPartner = false;
$isWholesaler = false;
$target = $customer;
}
$promotion = null;
if ($pbwRepository->getProductPromotion($pbw, 1)['pp']) {
$promotion = $pbwRepository->getProductPromotion($pbw, 1)['pp']->getPromotion();
}
$customers = $customerRepository->MyCustomerQuery($user)
->andWhere('c.unregistrationdate is NULL ')
->andWhere('c.is_self_consumption is NULL ')
->orderBy('c.company', 'DESC')
->getQuery()
->getResult();
if ($user->getPartner()) {
$selfConsumptionCustomer = $partnerRepository->getSelfConsumptionCustomer($partner);
if ($selfConsumptionCustomer) {
array_unshift($customers, $selfConsumptionCustomer);
}
}
// TO-DO : revisar si se tiene que borrar.
$licenseTypeIds=$jsonSearchService->searchKeyInArray($productRepository->getParentSkuIds($pbw->getProduct())->getParameters(), 'licenseType');
$licenseTypes=[];
if($licenseTypeIds){
foreach($licenseTypeIds[0] as $value){
$lt = $licensetypeRepository->find((int)$value);
$licenseTypes[$lt->getId()] = $translation->getTranslationBy($lt, $locale, 'name');
}
}
$parametersTranslated = $extraFieldsService->translateExtraFields(
$productRepository->getParentSkuIds($pbw->getProduct())->getParameters() ?? []
);
$data_to_view = array(
'headerData' => $buildHeaderData->buildHeaderData($user),
'recomended' => $this->similarProducts($pbw->getId()),
'resources' => $this->relatedResources($pbw->getId()),
'ratingreview' => $this->ratingReview($pbw->getProduct()->getId()),
'images' => $pbwRepository->getImages($pbw),
'defaultimage' => $pbwRepository->getDefaultImages($pbw),
'canSell' => $pbw->getProduct()->getCanSell(),
'commercialEmail' => $commercialEmail,
'ispartner' => $isPartner,
'partnerDiscount' => $discount,
'locale' => $locale,
'isWholesaler' => $isWholesaler,
'isVendor' => $isVendor,
'promotion' => $promotion,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'userRepository' => $this->getDoctrine()->getRepository(User::class),
'partner' => $partner,
'i18n' => $translation,
'customers' => $customers,
'resourceRepository' => $resourceRepository,
'useSymbol' => $wholesaler->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'target' => $target, //Partner, Customer or Wholesaler
'cnClientInfo' => ($this->connectifService->cnClientInfo($user)),
'cnProductVisited' => ($this->connectifService->cnProductVisited()),
'cnCart' => ($user->getPartner() || $user->getCustomer()) ? $this->connectifService->cnCart($user) : null,
'operationalCurrency' => $this->operationalCurrencyProvider->provide($target),
'licenseType' => $licenseTypes,
'wholesaler' => $wholesaler,
'warehouseProductRepository' => $this->getDoctrine()->getRepository(WarehouseProduct::class),
'parametersTranslated' => $parametersTranslated
);
$typeofproduct = $pbw->getProduct()->getProductType();
$dataPbw = $dataProductFinder->findData($pbwRepository, $typeofproduct, $pbw, $partner, $wholesaler->getId(), $user);
$data_to_view = array_merge($data_to_view, $dataPbw);
return $this->render('/catalog/default/view.html.twig', $data_to_view);
}
/**
* @Route("/catalog/default/genericsearch/{page}", name="catalog_genericsearch", defaults={"page"=1})
*
* Save reviews from a Product in BD
*
*/
public function genericsearch($page, TrafficTracker $trafficTracker, Request $request, SanitizeService $sanitizeService, HeaderData $buildHeaderData, PriceCalculatorService $priceCalculator)
{
if (!$sanitizeService->getSanitize($request->get('text'))) {
return $this->redirectToRoute('catalog_genericsearch');
}
$trafficTracker->registerTraffic();
$user = $this->getUser();
$search = '';
$entityManager = $this->getDoctrine()->getManager();
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$wholesalerRepository = $this->getDoctrine()->getRepository(Wholesaler::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$productbywholesalerRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
$wholesaler = $partner->getWholesaler();
$partnerId = $partner->getId();
$target=$user->getPartner();
} elseif ($user->getCustomer()) {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
$wholesaler = $partner->getWholesaler();
$partnerId = $partner->getId();
$target=$user->getCustomer();
} else {
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->getQuery()->getSingleResult();
$partnerId = '';
$partner = null;
$target=$wholesaler;
}
$products = $productRepository->MyProductQuery($user)
->andWhere('p.cansellalone = 1 and p.isflavour = 0 and p.cansell = 1');
//Custom filters
if ($request->get('text')) {
$productIds = $productRepository->MyProductQuery($user)
->andWhere('p.name like :text or p.sku like :text ')
->setParameter('text', '%' . $request->get('text') . '%')
->andWhere('p.cansellalone = 1 and p.cansell = 1')
->getQuery()
->execute();
$products
->andWhere('p.name like :text or p.sku like :text ')
->setParameter('text', '%' . $request->get('text') . '%');
foreach ($productIds as $pId) {
$parentId = $productRepository->getParentSkuIds($pId);
$products->orWhere('p.id = :parentId')->setParameter('parentId', $parentId);
}
}
$productsbywholesaler = $productbywholesalerRepository->MyProductbywholesalerQuery($user)
->andWhere('pbw.product IN (:products)')
->setParameter('products', $products->getQuery()->execute());
//if search
if ($request->get('text')) {
$result = '';
//search result
foreach ($productsbywholesaler->getQuery()->execute() as $product) {
$result = $result . $product->getId() . ',';
}
//save query in bd
$catalogQuery = new \App\Entity\Catalogquerys();
$catalogQuery->setText($request->get('text'));
$catalogQuery->setUser($user);
$catalogQuery->setResult($result);
$entityManager->persist($catalogQuery);
$entityManager->flush();
}
$limit = 12;
$productsbywholesaler->setFirstResult($limit * ($page - 1))->setMaxResults($limit);
$paginator = new Paginator($productsbywholesaler, $fetchJoinCollection = true);
$maxPages = ceil($paginator->count() / $limit);
$thisPage = $page;
$search = '"' . $request->get('text') . '"';
return $this->render('/catalog/default/genericsearch.html.twig', [
'products' => $paginator->getIterator(),
'categories' => null, //array(),
'partnerId' => $partnerId,
'partner' => $partner,
'headerData' => $buildHeaderData->buildHeaderData($user),
'search' => $search,
'maxPages' => $maxPages,
'thisPage' => $thisPage,
'count' => count($paginator),
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'productRepository' => $this->getDoctrine()->getRepository(Product::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'useSymbol' => $wholesaler->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator,
'target' => $target
]);
}
/**
* @Route("/catalog/default/writereview", name="catalog_writereview")
*
* Save reviews from a Product in BD
*
*/
public function writereview(Request $request, TrafficTracker $trafficTracker)
{
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$user = $this->getUser();
$id = $request->request->get('idproduct');
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$productByWholesaler = $pbwRepository->find($id);
$review = $request->request->get('review');
$rating = $request->request->get('rating');
$productOpinions = new Productopinions();
$productOpinions->setProduct($productByWholesaler->getProduct());
$productOpinions->setUser($user);
$productOpinions->setScore($rating);
$productOpinions->setComment($review);
$entityManager->persist($productOpinions);
$entityManager->flush();
$response = new \Symfony\Component\HttpFoundation\JsonResponse();
$response->setStatusCode(200);
return $response;
}
/**
* @Route("/catalog/default/loadvendors", name="catalog_load_vendors")
*
*
*
*/
public function getMoreVendors(Request $request, TranslatorInterface $translator)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$offset = $request->get('offset');
$limit = 6;
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$vendorRepository = $this->getDoctrine()->getRepository(Vendors::class);
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
} elseif ($user->getWholesaler()) {
$partner = $partnerRepository->MyPartnerQuery($user)
->andWhere('p.wholesaler = :wholesaler ')
->setParameter('wholesaler', $user->getWholesaler()->getId())
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
} else {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getSingleResult();
$partner = $customer->getPartner();
}
$wholesaler = $partner->getWholesaler();
$featuredVendorArray = $this->catalogFeaturedVendors();
$lengthFeaturedVendorArray = sizeof($featuredVendorArray);
$vendorIds = "";
if ($lengthFeaturedVendorArray > 0) {
$vendorIds = array();
foreach ($featuredVendorArray as $cta) {
array_push($vendorIds, $cta->getVendor()->getId());
}
}
$vendors = $em->createQuery("SELECT DISTINCT v from App\Entity\Vendors v "
. "JOIN App\Entity\Productline pl "
. "JOIN App\Entity\Product p "
. "JOIN App\Entity\Productbywholesaler pbw "
. "WHERE pl.vendor = v.id and pbw.product = p.id and p.productLine = pl.id and pbw.wholesaler = :idWholesaler and pbw.unregistrationdate is null and v.id NOT IN (:vendors) "
. "ORDER BY v.name ASC")
->setParameter("idWholesaler", $wholesaler->getId())
->setParameter('vendors', $vendorIds)
->setFirstResult($offset)
->setMaxResults($limit);
$vendorsResult = $vendors->getResult();
$vendorsArray = array();
foreach ($vendorsResult as $vendor) {
array_push($vendorsArray, array('id' => $vendor->getId(), 'name' => $vendor->getName(), 'img' => $vendorRepository->getRouteCompanyLogo($vendor)));
}
$paginator = new Paginator($vendors, $fetchJoinCollection = true);
$maxPages = ceil($paginator->count() / $limit);
$data = array(
'vendors' => $vendorsArray,
'newOffset' => $offset + sizeof($vendorsResult),
'remaining' => $paginator->count() - $limit - $offset,
);
$response = json_encode($data);
return new Response($response, 200, array(
'Content-Type' => 'application/json'
));
}
/**
* Get recomended products(6) to show in catalog index
*
* @param $idwholesaler
*
*/
private function catalogCoverProducts()
{
$user = $this->getUser();
/** @var UserRepository */
$userRepository = $this->getDoctrine()->getRepository(User::class);
/** @var CtaRepository */
$ctaRepository = $this->getDoctrine()->getRepository(Cta::class);
$wholesalerId = $userRepository->getParentWholesaler($user)->getId();
$recomendedArray = array();
for ($i = 30; $i <= 41; $i++) {
$cta = $ctaRepository->MyCtaQuery($wholesalerId, $i);
if (is_null($cta)) {
$cta = $ctaRepository->MyCtaDefaultQuery($wholesalerId, $i);
}
array_push($recomendedArray, $cta);
}
return $recomendedArray;
}
/**
* Get Featued Vendors (6) to show in vendor page
*
* @param $vendor
*
*/
private function catalogFeaturedVendors()
{
$user = $this->getUser();
/** @var UserRepository */
$userRepository = $this->getDoctrine()->getRepository(User::class);
/** @var CtaRepository */
$ctaRepository = $this->getDoctrine()->getRepository(Cta::class);
$wholesalerId = $userRepository->getParentWholesaler($user)->getId();
$featuredVendorArray = array();
for ($i = 63; $i <= 68; $i++) {
$cta = $ctaRepository->MyCtaQuery($wholesalerId, $i);
if (is_null($cta)) {
$cta = $ctaRepository->MyCtaDefaultQuery($wholesalerId, $i);
}
if (!is_null($cta)) {
array_push($featuredVendorArray, $cta);
}
}
return $featuredVendorArray;
}
/**
* Get SingleVendorProducts (3) to show in vendor page
*
* @param $vendor
*
*/
private function catalogSingleVendorProducts($vendor)
{
$user = $this->getUser();
/** @var UserRepository */
$userRepository = $this->getDoctrine()->getRepository(User::class);
/** @var CtaRepository */
$ctaRepository = $this->getDoctrine()->getRepository(Cta::class);
$wholesalerId = $userRepository->getParentWholesaler($user)->getId();
$singleVendorProductsArray = array();
for ($i = 57; $i <= 59; $i++) {
$cta = $ctaRepository->MyCtaDinamicVendorQuery($wholesalerId, $i, $vendor);
if (is_null($cta)) {
$cta = $ctaRepository->MyCtaDefaultDinamicVendorQuery($wholesalerId, $i, $vendor);
}
if (!is_null($cta) && !is_null($cta->getProductbywholesaler())) {
array_push($singleVendorProductsArray, $cta);
}
}
return $singleVendorProductsArray;
}
private function filterCatalogSingleVendorProducts($products, $filters)
{
$user = $this->getUser();
/** @var ProductRepository */
$productRepository = $this->getDoctrine()->getRepository(Product::class);
/** @var UserRepository */
$userRepository = $this->getDoctrine()->getRepository(User::class);
$singleVendorProductsArray = array_filter($products, function ($obj) use ($filters, $productRepository, $user) {
$cumpleTexto = true;
if (isset($filters['text'])) {
$texto = $filters['text'];
$cumpleTexto = stripos($obj->getProductbywholesaler()->getProduct()->getName(), $texto) !== false || stripos($obj->getProductbywholesaler()->getProduct()->getSku(), $texto) !== false;
}
$cumpleNumericos = true;
if (isset($filters['programm'])) {
$cumpleNumericos = $cumpleNumericos && $obj->getProductbywholesaler()->getProduct()->getVendorProgramm()->getId() == $filters['programm'];
}
if (isset($filters['productline'])) {
$cumpleNumericos = $cumpleNumericos && $obj->getProductbywholesaler()->getProduct()->getProductline()->getId() == $filters['productline'];
}
if (isset($filters['category'])) {
$productsQuery = $productRepository->MyProductQuery($user)
->andWhere('p.cansellalone = 1 and p.isflavour = 0 and p.cansell = 1 and p.id = :id')
->leftJoin('p.productLine', 'pl')
->leftJoin('pl.categories', 'cat')
->andWhere("cat.id = :cat ")
->setParameter('cat', $filters['category'])
->setParameter('id', $obj->getProductbywholesaler()->getProduct()->getId())
->getQuery()
->getResult();
$cumpleNumericos = $cumpleNumericos && $productsQuery;
}
return $cumpleTexto && $cumpleNumericos;
});
return $singleVendorProductsArray;
}
/**
* Get selected partner and all allowed to switch
*
* @param $partnerId
*
*/
private function partnerSelection($partnerId)
{
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
// Get the list of all partners we can view the catalog for
// TODO - why myquery? only return 1 result
$partners = $partnerRepository->MyPartnerQuery($this->getUser())
->orderBy('p.name', 'ASC')
->getQuery()
->getResult();
if ($partnerId) {
// Verify that we are allowed to view this partner
$partner = $partnerRepository->MyPartnerQuery($this->getUser())
->andWhere('p.id = :partnerId ')
->setParameter('partnerId', $partnerId)
->setMaxResults(1)
->getQuery()
->getResult();
}
if (!$partner) {
throw $this->createNotFoundException();
}
return array($partner, $partners);
}
/**
* Get reviews for a Product to show in catalog single view
*
* @param $idproduct
*
*/
public function ratingReview($idproduct)
{
$entityManager = $this->getDoctrine()->getManager();
$productOpinions = $entityManager->createQuery("SELECT po from App\Entity\Productopinions po "
. "WHERE po.product = :idproduct "
. "ORDER BY po.product DESC ")
->setParameter("idproduct", $idproduct)
->getResult();
return $productOpinions;
}
/**
* Get similar products(6) to show in catalog view
*
* @param $idPbw
*
*/
private function similarProducts($idPbw)
{
//TODO checkear if borrado de vendor exclusivo
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$pbw = $pbwRepository->find($idPbw);
$idVendor = $pbw->getProduct()->getProductline()->getVendor()->getId();
$user = $this->getUser();
if ($user->getVendor()) {
$pbws = $pbwRepository->MyProductbywholesalerQuery($user)
->leftJoin('p.productLine', 'pl');
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$pbws = $pbws
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$pbws = $pbws
->andWhere('pbw.unregistrationdate is null and pbw.id != :idPbw and pbw.wholesaler = :wholesalerId ')
->andWhere('p.cansellalone = 1 and p.isflavour = 0 ')
->andWhere('pl.vendor = :idVendor ')
->setParameter('idPbw', $idPbw)
->setParameter('wholesalerId', $pbw->getWholesaler()->getId())
->setParameter('idVendor', $idVendor)
->setMaxResults(6)
->getQuery()
->getResult();
} else {
$pbws = $pbwRepository->MyProductbywholesalerQuery($user)
->leftJoin('pbw.product', 'p');
if ($user->getCustomer() && $user->getCustomer()->getPartner()->getCustomProducts()) {
$pbws = $pbws
->leftJoin("App\Entity\ProductByCustomer", "pbc", Join::WITH, 'pbc.Product = p.id')
->andWhere('pbc.Product = pbw.product');
}
$pbws = $pbws
->leftJoin('p.productLine', 'pl')
->andWhere('pbw.unregistrationdate is null and pbw.id != :idPbw and pbw.wholesaler = :wholesalerId ')
->andWhere('p.cansellalone = 1 and p.isflavour = 0 ')
->andWhere('pl.vendor = :idVendor ')
->setParameter('idPbw', $idPbw)
->setParameter('wholesalerId', $pbw->getWholesaler()->getId())
->setParameter('idVendor', $idVendor)
->setMaxResults(6)
->getQuery()
->getResult();
}
return $pbws;
}
/**
* Get related resources for product to show in catalog view
*
* @param $idPbw
*
*/
private function relatedResources($idPbw)
{
$user = $this->getUser();
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$pbw = $pbwRepository->find($idPbw);
$productline = $pbw->getProduct()->getProductline();
$resourcesRepository = $this->getDoctrine()->getRepository(\App\Entity\Resources::class);
$queryData = $resourcesRepository->findAllMyActiveResources($user);
$queryData->join('r.productLines', 'pl');
$queryData->andWhere('pl.id = :productline');
$queryData->setParameter('productline', $productline->getId());
$resources = $queryData->getQuery()->execute();
return $resources;
}
/**
* @Route("/catalog/default/promotions", name="catalog_promotions")
*/
public function promotions($page = 1, TrafficTracker $trafficTracker, TranslatorInterface $translator, Translation $translation, HeaderData $buildHeaderData, PriceCalculatorService $priceCalculator, Request $request)
{
$trafficTracker->registerTraffic();
$locale = $request->getLocale();
$user = $this->getUser();
$currentDate = date("Y-m-d");
$idWholesaler = null;
$pl = null;
$vd = null;
$pw = null;
$NameProduct = null;
$arrayid = null;
$newarrayid = null;
$arrayidTemp = array();
$arrayPbwUrl = array();
/** @var EntityManager */
$entityManager = $this->getDoctrine()->getManager();
/** @var PartnerRepository */
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
/** @var CustomerRepository */
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$categoryRepository = $this->getDoctrine()->getRepository(Category::class);
$vendorRepository = $this->getDoctrine()->getRepository(Vendors::class);
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
$searchName = $translator->trans('app.Promos.Promotions');
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getOneOrNullResult();
$wholesaler = $user->getPartner()->getWholesaler();
} elseif ($user->getWholesaler()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->setMaxResults(1)->getOneOrNullResult();
$wholesaler = $user->getWholesaler();
} else {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getOneOrNullResult();
$partner = $customer->getPartner();
$wholesaler = $user->getCustomer()->getPartner()->getWholesaler();
}
$promotions = $entityManager->createQuery("SELECT pp FROM App\Entity\Productpromotion pp
JOIN pp.promotion p
WHERE (pp.stock > 0 OR pp.stock is null)
AND p.wholesaler = :wholesaler
AND p.deactivated != 1
AND p.validated = 1
AND p.expirydate >= :date1
AND p.startdate <= :date2")
->setParameter("wholesaler", $wholesaler)
->setParameter("date1", $currentDate)
->setParameter("date2", $currentDate);
foreach ($promotions->getResult() as $p) {
if ($p->getProductByWholesaler()) {
$id = $p->getProductByWholesaler()->getProduct()->getId();
$groupId = $p->getProductByWholesaler()->getProduct()->getGroupid();
$pbwMain = $entityManager->createQuery("SELECT pbw FROM App\Entity\Productbywholesaler pbw
JOIN pbw.product p
WHERE p.id = :groupid
AND pbw.wholesaler = :wholesaler")
->setParameter("groupid", $groupId)
->setParameter("wholesaler", $wholesaler)
->getOneOrNullResult();
$pw[$p->getId()] = $p->getProductByWholesaler();
if ($groupId == $id) {
if (!array_key_exists($groupId, $arrayidTemp)) {
$arrayidTemp[$groupId] = array("promotion" => $p->getId(), "isMain" => 1, "pbw" => $p, "pbwMain" => $pbwMain->getId());
}
} else {
$arrayidTemp[$groupId] = array("promotion" => $p->getId(), "isMain" => 0, "pbw" => $p, "pbwMain" => $pbwMain->getId());
}
}
if ($p->getProductline()) {
$pl[$p->getId()] = $p->getProductline()->getVendor();
}
if ($p->getVendor()) {
$vd[$p->getId()] = $p->getVendor();
}
}
foreach ($arrayidTemp as $key => $pp) {
$arrayid[] = $pw[$pp["pbw"]->getId()]->getId();
$arrayPbwUrl[$pw[$pp["pbw"]->getId()]->getId()] = $pp["pbwMain"];
}
if ($arrayid) {
$promotions = $entityManager->createQuery("SELECT pp FROM App\Entity\Productpromotion pp
JOIN pp.promotion p
LEFT JOIN pp.productByWholesaler pbw
WHERE (pp.stock > 0 OR pp.stock is null)
AND p.wholesaler = :wholesaler
AND p.deactivated != 1
AND p.validated = 1
AND p.expirydate >= :date1
AND p.startdate <= :date2
AND (pbw.id IN (:pbws)
OR pp.productLine is not null
OR pp.vendor is not null)")
->setParameter("wholesaler", $wholesaler)
->setParameter("date1", $currentDate)
->setParameter("date2", $currentDate)
->setParameter("pbws", $arrayid);
}
$form = $this->createForm(SearchPromotion::class, null, array(
'translator' => $translator,
'categories' => array(),
'vendors' => array(),
));
$form->handleRequest($request);
return $this->render('/catalog/default/promotionsview.html.twig', [
'searchName' => $searchName,
'pl' => $pl,
'vd' => $vd,
'pw' => $pw,
'promotions' => $promotions->getResult(), //$pagination,
'headerData' => $buildHeaderData->buildHeaderData($user),
'form' => $form->createView(),
'partnerId' => $partner,
'arrayPbwUrl' => $arrayPbwUrl,
'locale' => $locale,
'vendorsRepository' => $vendorRepository,
'pbwRepository' => $pbwRepository,
'productRepository' => $productRepository,
'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency(),
'priceCalculator' => $priceCalculator
]);
}
/**
* @Route("/catalog/default/bundles", name="catalog_bundles")
*/
public function bundles($page = 1, TrafficTracker $trafficTracker, TranslatorInterface $translator, Translation $translation, HeaderData $buildHeaderData, Request $request)
{
$trafficTracker->registerTraffic();
$locale = $request->getLocale();
$user = $this->getUser();
$currentDate = date("Y-m-d");
$idWholesaler = null;
$NameProduct = null;
$arrayid = null;
$newarrayid = null;
$arrayidTemp = array();
$arrayPbwUrl = array();
/** @var EntityManager */
$entityManager = $this->getDoctrine()->getManager();
/** @var PartnerRepository */
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
/** @var CustomerRepository */
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
/** @var BundleRepository */
$bundleRepository = $this->getDoctrine()->getRepository(Bundle::class);
$categoryRepository = $this->getDoctrine()->getRepository(Category::class);
$vendorRepository = $this->getDoctrine()->getRepository(Vendors::class);
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getOneOrNullResult();
$wholesaler = $user->getPartner()->getWholesaler();
} elseif ($user->getWholesaler()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->setMaxResults(1)->getOneOrNullResult();
$wholesaler = $user->getWholesaler();
} else {
$customer = $customerRepository->MyCustomerQuery($user)->getQuery()->getOneOrNullResult();
$partner = $customer->getPartner();
}
$bundles = $bundleRepository->MyBundleQuery($user)->andWhere('b.stock > 0')->andWhere('b.endDate >= :date1')->andWhere('b.startDate <= :date2')->setParameter("date1", $currentDate)
->setParameter("date2", $currentDate)->getQuery()->getResult();
return $this->render('/catalog/default/bundlesview.html.twig', [
'bundles' => $bundles, //$pagination,
'headerData' => $buildHeaderData->buildHeaderData($user),
'partnerId' => $partner,
'arrayPbwUrl' => $arrayPbwUrl,
'locale' => $locale,
'vendorsRepository' => $vendorRepository,
'pbwRepository' => $pbwRepository,
'productRepository' => $productRepository,
'useSymbol' => $partner->getWholesaler()->getUseSymbolCurrency()
]);
}
/**
* @Route("/catalog/default/view_bundle/{id}", name="catalog_view_bundle", requirements={"id"="\d+"})
*/
public function viewBundle($id, TrafficTracker $trafficTracker, TranslatorInterface $translator, Translation $translation, DataProductFinder $dataProductFinder, HeaderData $buildHeaderData, Request $request)
{
$session = $this->get('session');
$trafficTracker->registerTraffic();
$entityManager = $this->getDoctrine()->getManager();
$pbwRepository = $this->getDoctrine()->getRepository(Productbywholesaler::class);
$partnerRepository = $this->getDoctrine()->getRepository(Partner::class);
$wholesalerRepository = $this->getDoctrine()->getRepository(Wholesaler::class);
$customerRepository = $this->getDoctrine()->getRepository(Customer::class);
$productRepository = $this->getDoctrine()->getRepository(Product::class);
/** @var BundleRepository */
$bundleRepository = $this->getDoctrine()->getRepository(Bundle::class);
$user = $this->getUser();
$locale = $request->getLocale();
// $id es un id de ProductByWholesaler
$commercialEmail = '';
$markup_value = 0;
$discount = 0;
//$currentDate = date("Y-m-d");
$isVendor = false;
$bundle = $bundleRepository->MyBundleQuery($user)
->andWhere('b.id = :id')
->andWhere('b.active = 1')
->andWhere('b.stock > 0')
->setParameter('id', $id)
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
if (!$bundle) {
$session->getFlashBag()->add('danger', $translator->trans('app.General.NoResult'));
return $this->redirect($this->generateUrl('catalog_goto'));
}
$partner = null;
if ($user->getPartner()) {
$partner = $partnerRepository->MyPartnerQuery($user)->getQuery()->getSingleResult();
$commercialUser = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($partner->getIdcommercialagent());
$commercialEmail = $commercialUser->getEmail();
$currencyIso = $partner->getWholesaler()->getCurrency()->getIso();
$isPartner = true;
$isWholesaler = false;
$wholesaler = $user->getPartner()->getWholesaler();
} elseif ($user->getWholesaler()) {
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->getQuery()->getSingleResult();
$currencyIso = $wholesaler->getCurrency()->getIso();
$partner = null;
$isPartner = false;
$isWholesaler = true;
$wholesaler = $user->getWholesaler();
} elseif ($user->getVendor()) {
$wholesaler = $wholesalerRepository->MyWholesalerQuery($user)->setMaxResults(1)->getQuery()->getSingleResult();
$currencyIso = $wholesaler->getCurrency()->getIso();
$partner = $entityManager->createQuery('SELECT p FROM App\Entity\Partner p '
. 'where p.wholesaler = :wholesaler ')
->setParameters(array('wholesaler' => $wholesaler->getId()))
->setMaxResults(1)
->getOneOrNullResult();
$isPartner = false;
$isVendor = true;
$isWholesaler = false;
} else {
$customer = $customerRepository->MyCustomerQuery($user)
->andWhere('c.id = :customerId ')
->setParameter('customerId', $user->getCustomer()->getId())
->getQuery()->getSingleResult();
$wholesaler = $user->getCustomer()->getPartner()->getWholesaler();
$partner = $customer->getPartner();
$commercialUser = $this->getDoctrine()->getRepository(\App\Entity\User::class)->find($customer->getIdcommercialagent());
$commercialEmail = $commercialUser->getEmail();
$isPartner = false;
$isWholesaler = false;
$currencyIso = $wholesaler->getCurrency()->getIso();
}
$catalogImages = $bundle->getCatalogImages();
$images = [];
$images[] = 'uploads/images/productImages/' . $bundle->getImageName();
foreach ($catalogImages as $img) {
$images[] = 'uploads/images/productImages/' . $img;
}
$customers = $customerRepository->MyCustomerQuery($user)
->andWhere('c.unregistrationdate is NULL ')
->orderBy('c.company', 'DESC')
->getQuery()
->getResult();
$data_to_view = array(
'headerData' => $buildHeaderData->buildHeaderData($user),
'bundle' => $bundle,
'images' => $images,
'defaultimage' => $images[0],
'commercialEmail' => $commercialEmail,
'ispartner' => $isPartner,
'currencyIso' => $currencyIso,
'locale' => $locale,
'isWholesaler' => $isWholesaler,
'isVendor' => $isVendor,
'pbwRepository' => $this->getDoctrine()->getRepository(Productbywholesaler::class),
'vendorsRepository' => $this->getDoctrine()->getRepository(Vendors::class),
'userRepository' => $this->getDoctrine()->getRepository(User::class),
'partner' => $partner,
'i18n' => $translation,
'customers' => $customers,
);
return $this->render('/catalog/default/viewBundle.html.twig', $data_to_view);
}
}