<?php
namespace App\Controller;
use App\Entity\Hermes\Article;
use App\Entity\Hermes\ArticleFamille;
use App\Entity\Hermes\ArticleGamme;
use App\Entity\Hermes\Client;
use App\Entity\Hermes\ClientArticleIndispensable;
use App\Entity\Hermes\ClientGroupe;
use App\Entity\Hermes\UserCommercial;
use App\Repository\ArticleMarqueRepository;
use App\Repository\ArticleRepository;
use App\Repository\ClientRestrictionVenteRepository;
use App\Repository\UserClientRepository;
use App\Services\Trie\TrieServices;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
class WidgetController extends AbstractController
{
public function __construct(
private ManagerRegistry $doctrine,
private HermesController $hermesController,
private ClientRestrictionVenteRepository $clientRestrictionVenteRepository,
private PromotionController $promotionController,
private ArticleRepository $articleRepository,
private TrieServices $trieServices,
) {
$this->doctrine = $doctrine;
}
public function header(
CacheInterface $cache,
UserClientRepository $userClientRepository,
ArticleMarqueRepository $articleMarqueRepository,
ArticleRepository $articleRepository
): Response {
$indispensables = null;
$marquesPrioritaires = [];
$bonsPlansWeb = [];
$affichageBonsPlansWeb = false;
$restrictionCategorie = [];
$user = null;
$clientGroupe = null;
$client = null;
$groupeDom = $this->doctrine->getRepository(ClientGroupe::class, 'hermes')->findOneBy(['nom' => 'T-DOM']);
if ($this->getUser()) {
$email = $this->getUser()->getUserIdentifier();
$user = $userClientRepository->findOneBy(['email' => $email]);
$client = $this->doctrine->getRepository(Client::class, 'hermes')->findOneBy(['numero' => $user->getNumero()]);
if (null !== $client) {
$clientGroupe = $client->getClientGroupe();
/* @phpstan-ignore-next-line */
$indispensables = $this->doctrine->getRepository(ClientArticleIndispensable::class, 'hermes')->findIndispensables($client);
}
$restrictionCategorie = $this->clientRestrictionVenteRepository->findRestriction($client, 'Categorie');
$marques = $articleMarqueRepository->findByCheckRestrictionVente($client);
$bonsPlansWeb = $articleRepository->findByCheckRestrictionVenteFilters($client, true);
0 === \count($bonsPlansWeb) ? $affichageBonsPlansWeb = false : $affichageBonsPlansWeb = true;
foreach ($marques as $marque) {
if (
$marque->getisPrioritaire()
&& null !== $marque->getClientGroupes()
&& !\in_array($clientGroupe, $marque->getClientGroupes()->getValues(), false)
) {
$marquesPrioritaires[] = $marque;
}
}
}
$accessoireMenus = $this->hermesController->getMenuAccessoire();
$panier = null;
$nbArticlesPanier = 0;
if ($this->getUser()) {
$email = $this->getUser()->getUserIdentifier();
$panier = $userClientRepository->findOneBy(['email' => $email])->getPanier();
if ($panier) {
foreach ($panier->getLignes() as $ligne) {
if (!$ligne->getOffert() && !$ligne->getRemise()) {
++$nbArticlesPanier;
}
}
}
}
// $cache->delete('marques');
// [$marquesCom, $marquesOem, $marquesAcc] = $cache->get('marques', function (ItemInterface $item) {
// $item->expiresAfter(600);
$marquesCom = [];
$marquesOem = [];
$marquesAcc = [];
if ($this->getUser()) {
$email = $this->getUser()->getUserIdentifier();
$user = $userClientRepository->findOneBy(['email' => $email]);
$client = $this->doctrine->getRepository(Client::class, 'hermes')->findOneBy(['numero' => $user->getNumero()]);
if (null !== $client) {
$clientGroupe = $client->getClientGroupe();
}
}
$articles = $this->doctrine->getRepository(Article::class, 'hermes')->findAll();
foreach ($articles as $article) {
if (
null !== $article->getCategorie()
&& null !== $article->getArticleMarque()
&& null !== $article->getArticleMarque()->getClientGroupes()
&& !\in_array($clientGroupe, $article->getArticleMarque()->getClientGroupes()->getValues(), false)
) {
if ('1-COM' === $article->getCategorie()->getCode()) {
if (
!\in_array($article->getArticleMarque(), $marquesCom, true)
&& true === $article->getArticleMarque()->getisVisibleAriane()
) {
$marquesCom[] = $article->getArticleMarque();
}
} elseif ('2-OEM' === $article->getCategorie()->getCode()) {
if (
!\in_array($article->getArticleMarque(), $marquesOem, true)
&& true === $article->getArticleMarque()->getisVisibleAriane()
) {
$marquesOem[] = $article->getArticleMarque();
}
} elseif ('3-ACC' === $article->getCategorie()->getCode()) {
if (
!\in_array($article->getArticleMarque(), $marquesAcc, true)
&& true === $article->getArticleMarque()->getisVisibleAriane()
) {
$marquesAcc[] = $article->getArticleMarque();
}
}
}
}
usort($marquesCom, function ($a, $b) {
return ($a->getNom() < $b->getNom()) ? -1 : 1;
});
usort($marquesOem, function ($a, $b) {
return ($a->getNom() < $b->getNom()) ? -1 : 1;
});
usort($marquesAcc, function ($a, $b) {
return ($a->getNom() < $b->getNom()) ? -1 : 1;
});
// return [$marquesCom, $marquesOem, $marquesAcc];
// });
usort($marquesPrioritaires, function ($a, $b) {
return ($a->getNom() < $b->getNom()) ? -1 : 1;
});
$totalHt = null;
$articles = null;
if ($this->getUser()) {
$totalHt = $this->promotionController->getMontantTotalHtWithPromotion($client, $user->getPanier());
$articles = [];
$articleRepository = $this->doctrine->getRepository(Article::class, 'hermes');
foreach ($user->getPanier()->getLignes() as $ligne) {
$article = $articleRepository->find($ligne->getArticle());
if (null === $ligne->getRemise() && true !== $ligne->getOffert()) {
$articles[] = [$article, $ligne->getQuantite(), $ligne];
}
}
}
$brother = $this->doctrine->getRepository(ArticleGamme::class, 'hermes')->findOneBy(['nom' => 'brother']);
$canon = $this->doctrine->getRepository(ArticleGamme::class, 'hermes')->findOneBy(['nom' => 'canon']);
$epson = $this->doctrine->getRepository(ArticleGamme::class, 'hermes')->findOneBy(['nom' => 'epson']);
$hp = $this->doctrine->getRepository(ArticleGamme::class, 'hermes')->findOneBy(['nom' => 'hp']);
$promotions = $this->articleRepository->findByCheckRestrictionVenteFilters($client, null, 4);
$promotions = $this->trieServices->sortByIsPrioritaire($promotions);
return $this->render('partial/_header.html.twig', [
'client' => $client,
'clientGroupe' => $clientGroupe,
'restrictionCategorie' => $restrictionCategorie,
// PANIER
'panier' => $panier,
'nbArticlePanier' => $nbArticlesPanier,
'articles' => $articles,
'totalHt' => $totalHt,
// PRODUITS
'groupeDom' => $groupeDom,
'brother' => $brother,
'canon' => $canon,
'epson' => $epson,
'hp' => $hp,
'accessoireMenus' => $accessoireMenus,
// MARQUES
'marquesPrioritaires' => $marquesPrioritaires,
'marquesAcc' => $marquesAcc,
'marquesCom' => $marquesCom,
'marquesOem' => $marquesOem,
// INDISPENSABLES
'indispensables' => $indispensables,
// DESTOCKAGE (anciennement BONS PLANS WEB)
'affichageBonsPlansWeb' => $affichageBonsPlansWeb,
'promotions' => $promotions,
]);
}
public function footer(UserClientRepository $userClientRepository): Response
{
$commercial = null;
if ($this->getUser()) {
$email = $this->getUser()->getUserIdentifier();
$user = $userClientRepository->findOneBy(['email' => $email]);
if ($user->getCompte()->getCommercial()) {
$client = $this->doctrine->getRepository(Client::class, 'hermes')->findOneBy(['numero' => $user->getCompte()->getSuperClient()->getNumero()]);
$commercial = $this->doctrine->getRepository(UserCommercial::class, 'hermes')->find(['id' => $client->getCommercial()]);
}
}
return $this->render('partial/_footer.html.twig', [
'commercial' => $commercial,
]);
}
// liste des references pour autocomplétion de la barre de recherche
#[Route('/references-autocompletion', name: 'references_autocompletion')]
public function produits(
CacheInterface $cache,
ArticleRepository $articleRepository,
UserClientRepository $userClientRepository
): Response {
// $produits = $this->doctrine->getRepository(Article::class, 'hermes')->findBy(['isVisibleAriane' => 1], ['designation' => 'ASC']);
$email = $this->getUser()->getUserIdentifier();
$user = $userClientRepository->findOneBy(['email' => $email]);
$client = $this->doctrine->getRepository(Client::class, 'hermes')->findOneBy(['numero' => $user->getNumero()]);
$produits = $articleRepository->getAutocompletion($client);
$familles = $this->doctrine->getRepository(ArticleFamille::class, 'hermes')->findBy([], ['nom' => 'ASC']);
$cache->delete('produits');
$cacheReturn = $cache->get('produits', function (ItemInterface $item) use ($produits, $familles) {
$item->expiresAfter(3600);
$rechProduit = [];
foreach ($produits as $produit) {
// if ((null !== $produit->getArticleMarque() && $produit->getArticleMarque()->getisVisibleAriane()) || null === $produit->getArticleMarque()) {
if (!empty($produit->getNumero())) {
$rechProduit[] = $produit->getNumero();
}
if (!empty($produit->getDescription1())) {
$rechProduit[] = $produit->getDescription1();
}
if (!empty($produit->getCodeBarre())) {
$rechProduit[] = $produit->getCodeBarre();
}
}
// }
foreach ($familles as $famille) {
if (!empty($famille->getNom())) {
$rechProduit[] = $famille->getNom();
}
}
return $rechProduit;
});
return $this->json($cacheReturn);
}
}