<?php
namespace App\EventListener;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\SiteSacZipSelection;
/**
* Empêche la suppression depuis l'admin des éléments suivants :
* - Promotion "FREE_DELIVERY" sinon l'intégration est cassé
* - Page CMS "Les marchés" sinon l'intégration de la page "Boutiques" est cassé
* - Suppression de produits, déclinaisons, clients, méthode de paiement et modes de livraisons
* - Suppression d'une combinaison Sac&Zip qui possède la coche "par défaut"
*
* Empêche aussi des cas qui casse le site :
* - Retirer la coche "par défaut" quand il reste que 1 combinaison Sac&Zip
*
* Déclenche des éléments quand on modifie des choses :
* - Quand on modifie un filtre à facettes, on met à jour l'ensemble de l'index de recherche
*/
class AdminResourceListener
{
public const PAGE_CMS_LES_MARCHE_ID = 9;
private $em;
private $kernel;
public function __construct(EntityManagerInterface $em, KernelInterface $kernel)
{
$this->em = $em;
$this->kernel = $kernel;
}
public function onPromotionPreDelete(ResourceControllerEvent $event)
{
if ($event->getSubject()->getCode() === 'FREE_DELIVERY') {
$event->stop(
"Vous ne pouvez pas supprimer cette promotion, elle est indispensable au bon fonctionnement du site.",
ResourceControllerEvent::TYPE_ERROR
);
}
}
public function onPageCMSPreDelete(ResourceControllerEvent $event)
{
if ($event->getSubject()->getId() === self::PAGE_CMS_LES_MARCHE_ID) {
$event->stop(
"Vous ne pouvez pas supprimer cette page, elle est utilisée dans 'Nos boutiques'.",
ResourceControllerEvent::TYPE_ERROR
);
}
}
public function onSacZipSelectionPreUpdate(ResourceControllerEvent $event)
{
if ($event->getSubject()->getDefault() == false) {
$qb = $this->em->getRepository(SiteSacZipSelection::class)->createQueryBuilder('s');
$count = $qb->select($qb->expr()->count('s'))
->getQuery()
->getSingleScalarResult();
if ($count == 1) {
$event->stop(
"Vous ne pouvez pas retirer la coche 'combinaison par défaut' quand il y a que 1 combinaison.",
ResourceControllerEvent::TYPE_ERROR
);
}
}
if ($event->getSubject()->getEnabled() == false) {
if ($event->getSubject()->getDefault() == true) {
$event->stop(
"Vous ne pouvez pas désactiver la combinaison par défaut.",
ResourceControllerEvent::TYPE_ERROR
);
}
}
}
public function onSacZipSelectionPreDelete(ResourceControllerEvent $event)
{
if ($event->getSubject()->getDefault() == true) {
$event->stop(
"Vous ne pouvez pas supprimer la combinaison par défaut.",
ResourceControllerEvent::TYPE_ERROR
);
}
}
public function onProductOrVariantOrCustomerPreDelete(ResourceControllerEvent $event)
{
$event->stop(
"Vous ne pouvez pas supprimer ces éléments depuis l'admin. Utilisez 'Panda' pour le faire.",
ResourceControllerEvent::TYPE_ERROR
);
}
public function onPaymentMethodPreDelete(ResourceControllerEvent $event)
{
$event->stop(
"Vous ne pouvez pas supprimer de moyens de paiements tant qu'il y aura des flux avec 'Panda'.",
ResourceControllerEvent::TYPE_ERROR
);
}
public function onShippingMethodPreDelete(ResourceControllerEvent $event)
{
$event->stop(
"Vous ne pouvez pas supprimer de modes de livraisons tant qu'il y aura des flux avec 'Panda'.",
ResourceControllerEvent::TYPE_ERROR
);
}
public function onPaymentMethodPreCreate(ResourceControllerEvent $event)
{
$event->stop(
"Vous ne pouvez pas créer de moyens de paiements tant qu'il y aura des flux avec 'Panda'.",
ResourceControllerEvent::TYPE_ERROR
);
}
public function onShippingMethodPreCreate(ResourceControllerEvent $event)
{
$event->stop(
"Vous ne pouvez pas créer de modes de livraisons tant qu'il y aura des flux avec 'Panda'.",
ResourceControllerEvent::TYPE_ERROR
);
}
public function onFilterFacetPostCreate(ResourceControllerEvent $event)
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$application->run(new ArrayInput([
'command' => 'ppmc:search-indexer'
]), new NullOutput());
}
public function onFilterFacetPostUpdate(ResourceControllerEvent $event)
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$application->run(new ArrayInput([
'command' => 'ppmc:search-indexer'
]), new NullOutput());
}
}