src/EventSubscriber/DepensesSubscriber.php line 131

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\FraisPeriode;
  4. use App\Event\Depenses\DepenseCreatedEvent;
  5. use App\Event\Depenses\DepenseDeletedEvent;
  6. use App\Event\Depenses\DepenseUpdatedEvent;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. class DepensesSubscriber implements EventSubscriberInterface
  10. {
  11.     /**
  12.      * @var EntityManagerInterface
  13.      */
  14.     private $entityManager;
  15.     public function __construct(EntityManagerInterface $entityManager)
  16.     {
  17.         $this->entityManager $entityManager;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             DepenseCreatedEvent::class => ['onDepenseCreated'100],
  23.             DepenseUpdatedEvent::class => ['onDepenseUpdated'100],
  24.             DepenseDeletedEvent::class => ['onDepenseDeleted'100],
  25.         ];
  26.     }
  27.     /**
  28.      * Cas création d'une dépense mensuelle,
  29.      * on créé toutes les mensualités
  30.      * @param DepenseCreatedEvent $event
  31.      * @throws \Exception
  32.      */
  33.     public function onDepenseCreated(DepenseCreatedEvent $event)
  34.     {
  35.         $depense $event->getFrais();
  36.         // Si mensuel, on ajoute une ligne chaque mois
  37.         if ($depense->getMensuel()) {
  38.             $request $event->getRequest();
  39.             $debut = new \DateTime($request->get('frais_periode_mensuel')['debut']);
  40.             $fin = new \DateTime($request->get('frais_periode_mensuel')['fin']);
  41.             // On se place sur le premier jour du mois
  42.             $debut date_create($debut->format('Y-m-01'));
  43.             $fin date_create($fin->format('Y-m-01'));
  44.             $interval = \DateInterval::createFromDateString('1 month');
  45.             $daterange = new \DatePeriod($debut$interval ,$fin);
  46.             $lastId null;
  47.             // On parcours tous les mois
  48.             foreach($daterange as $date){
  49.                 $annee $date->format('Y');
  50.                 $mois $date->format('m');
  51.                 $fraisPeriode = new FraisPeriode();
  52.                 $fraisPeriode->setStructure($depense->getStructure())
  53.                             ->setFrais($depense->getFrais())
  54.                             ->setMensuel(true)
  55.                             ->setMontantReel($depense->getMontantReel())
  56.                             ->setMontantTheorique($depense->getMontantTheorique())
  57.                             ->setMois($mois)
  58.                             ->setAnnee($annee)
  59.                             ->setParent($lastId);
  60.                 $this->entityManager->persist($fraisPeriode);
  61.                 $this->entityManager->flush();
  62.                 // Pour la ligne d'origine
  63.                 if ($lastId == null) {
  64.                     $lastId $fraisPeriode;
  65.                 }
  66.             }
  67.             // $daterange n'inclut pas la dernière date, on l'ajoute manuellement
  68.             $fraisPeriode = new FraisPeriode();
  69.             $fraisPeriode->setStructure($depense->getStructure())
  70.                 ->setFrais($depense->getFrais())
  71.                 ->setMensuel(true)
  72.                 ->setMontantReel($depense->getMontantReel())
  73.                 ->setMontantTheorique($depense->getMontantTheorique())
  74.                 ->setMois($fin->format('m'))
  75.                 ->setAnnee($fin->format('Y'))
  76.                 ->setParent($lastId);
  77.             $this->entityManager->persist($fraisPeriode);
  78.             $this->entityManager->flush();
  79.         }
  80.     }
  81.     /**
  82.      * Cas suppression d'une ligne dépense
  83.      * Si c'est une dépense mensuelle, on supprime toutes celles qui sont liées
  84.      * @param DepenseDeletedEvent $deletedEvent
  85.      */
  86.     public function onDepenseDeleted (DepenseDeletedEvent $deletedEvent) {
  87.         $depense $deletedEvent->getFrais();
  88.         if ($depense->getMensuel()) {
  89.             $parent $depense->getParent() ? $depense->getParent() : $depense;
  90.             $children $parent->getChildren();
  91.             foreach ($children as $child) {
  92.                 $this->entityManager->remove($child);
  93.                 $this->entityManager->flush();
  94.             }
  95.             // On supprime le parent
  96.             $this->entityManager->remove($parent);
  97.             $this->entityManager->flush();
  98.         }
  99.     }
  100.     /**
  101.      * Cas modification d'une ligne dépense
  102.      * Si c'est une dépense mensuelle, on supprime toutes celles qui sont liées
  103.      * @param DepenseUpdatedEvent $deletedEvent
  104.      */
  105.     public function onDepenseUpdated (DepenseUpdatedEvent $deletedEvent) {
  106.         $depense $deletedEvent->getFrais();
  107.         if ($depense->getMensuel()) {
  108.             $parent $depense->getParent() ? $depense->getParent() : $depense;
  109.             $children $parent->getChildren();
  110.             foreach ($children as $child) {
  111.                 $child->setMontantReel($depense->getMontantReel())
  112.                         ->setMontantTheorique($depense->getMontantTheorique());
  113.                 $this->entityManager->flush();
  114.             }
  115.         }
  116.     }
  117. }