<?php
namespace App\EventSubscriber;
use App\Entity\FraisPeriode;
use App\Event\Depenses\DepenseCreatedEvent;
use App\Event\Depenses\DepenseDeletedEvent;
use App\Event\Depenses\DepenseUpdatedEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class DepensesSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents(): array
{
return [
DepenseCreatedEvent::class => ['onDepenseCreated', 100],
DepenseUpdatedEvent::class => ['onDepenseUpdated', 100],
DepenseDeletedEvent::class => ['onDepenseDeleted', 100],
];
}
/**
* Cas création d'une dépense mensuelle,
* on créé toutes les mensualités
* @param DepenseCreatedEvent $event
* @throws \Exception
*/
public function onDepenseCreated(DepenseCreatedEvent $event)
{
$depense = $event->getFrais();
// Si mensuel, on ajoute une ligne chaque mois
if ($depense->getMensuel()) {
$request = $event->getRequest();
$debut = new \DateTime($request->get('frais_periode_mensuel')['debut']);
$fin = new \DateTime($request->get('frais_periode_mensuel')['fin']);
// On se place sur le premier jour du mois
$debut = date_create($debut->format('Y-m-01'));
$fin = date_create($fin->format('Y-m-01'));
$interval = \DateInterval::createFromDateString('1 month');
$daterange = new \DatePeriod($debut, $interval ,$fin);
$lastId = null;
// On parcours tous les mois
foreach($daterange as $date){
$annee = $date->format('Y');
$mois = $date->format('m');
$fraisPeriode = new FraisPeriode();
$fraisPeriode->setStructure($depense->getStructure())
->setFrais($depense->getFrais())
->setMensuel(true)
->setMontantReel($depense->getMontantReel())
->setMontantTheorique($depense->getMontantTheorique())
->setMois($mois)
->setAnnee($annee)
->setParent($lastId);
$this->entityManager->persist($fraisPeriode);
$this->entityManager->flush();
// Pour la ligne d'origine
if ($lastId == null) {
$lastId = $fraisPeriode;
}
}
// $daterange n'inclut pas la dernière date, on l'ajoute manuellement
$fraisPeriode = new FraisPeriode();
$fraisPeriode->setStructure($depense->getStructure())
->setFrais($depense->getFrais())
->setMensuel(true)
->setMontantReel($depense->getMontantReel())
->setMontantTheorique($depense->getMontantTheorique())
->setMois($fin->format('m'))
->setAnnee($fin->format('Y'))
->setParent($lastId);
$this->entityManager->persist($fraisPeriode);
$this->entityManager->flush();
}
}
/**
* Cas suppression d'une ligne dépense
* Si c'est une dépense mensuelle, on supprime toutes celles qui sont liées
* @param DepenseDeletedEvent $deletedEvent
*/
public function onDepenseDeleted (DepenseDeletedEvent $deletedEvent) {
$depense = $deletedEvent->getFrais();
if ($depense->getMensuel()) {
$parent = $depense->getParent() ? $depense->getParent() : $depense;
$children = $parent->getChildren();
foreach ($children as $child) {
$this->entityManager->remove($child);
$this->entityManager->flush();
}
// On supprime le parent
$this->entityManager->remove($parent);
$this->entityManager->flush();
}
}
/**
* Cas modification d'une ligne dépense
* Si c'est une dépense mensuelle, on supprime toutes celles qui sont liées
* @param DepenseUpdatedEvent $deletedEvent
*/
public function onDepenseUpdated (DepenseUpdatedEvent $deletedEvent) {
$depense = $deletedEvent->getFrais();
if ($depense->getMensuel()) {
$parent = $depense->getParent() ? $depense->getParent() : $depense;
$children = $parent->getChildren();
foreach ($children as $child) {
$child->setMontantReel($depense->getMontantReel())
->setMontantTheorique($depense->getMontantTheorique());
$this->entityManager->flush();
}
}
}
}