<?php
declare(strict_types=1);
namespace App\Bundles\PatientBundle\EventListener;
use App\Bundles\OutbreakBundle\Event\RecalculateOutbreakFieldsEvent;
use App\Bundles\PatientBundle\Event\PatientDeleteEvent;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
#[AsEventListener(event: PatientDeleteEvent::class, method: 'onDelete')]
class PatientSoftDeleteListener
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly EventDispatcherInterface $eventDispatcher,
) {
}
public function onDelete(PatientDeleteEvent $event): void
{
$patient = $event->getPatient();
$outbreaksToRecalculate = [];
if (!$patient->isDeleted()) {
return;
}
foreach ($patient->getDiseaseCases() as $diseaseCase) {
$diseaseCase->setDeletedAt(new DateTime());
if ($outbreak = $diseaseCase->getOutbreak()) {
$outbreaksToRecalculate[$outbreak->getId()] = $outbreak;
$outbreak->removeDiseaseCase($diseaseCase);
$this->entityManager->persist($outbreak);
}
$this->entityManager->persist($diseaseCase);
}
$this->entityManager->flush();
foreach ($outbreaksToRecalculate as $outbreak) {
$this->eventDispatcher->dispatch(new RecalculateOutbreakFieldsEvent($outbreak));
}
}
}