← Back
Editing: ElevatorBreakdownHistoryListener.php
<?php /** * Handle elevatory breakdown history. */ namespace App\EventListener; use App\Entity\Adresse; use App\Entity\ElevatorBreakdown; use App\Entity\Prestataire; use App\Entity\Service; use App\Repository\ElevatorBreakdownRepository; use App\Service\SolutionService; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\NonUniqueResultException; use Doctrine\Persistence\Event\LifecycleEventArgs; use Psr\Log\LoggerInterface; use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\MailerInterface; use Symfony\Component\Mime\Address; class ElevatorBreakdownHistoryListener { private ElevatorBreakdownRepository $elevatorBreakdownRepository; private EntityManagerInterface $em; private MailerInterface $mailer; protected $emailFrom; public const ACTION_CREATE = 'ACTION_CREATE'; public const ACTION_UPDATE = 'ACTION_UPDATE'; private SolutionService $solutionService; private LoggerInterface $logger; public function __construct( ElevatorBreakdownRepository $elevatorBreakdownRepository, EntityManagerInterface $entityManager, MailerInterface $mailer, SolutionService $solutionService, LoggerInterface $logger ) { $this->elevatorBreakdownRepository = $elevatorBreakdownRepository; $this->em = $entityManager; $this->mailer = $mailer; $this->emailFrom = $solutionService->getCurrent()->getEmail(); $this->solutionService = $solutionService; $this->logger = $logger; } /** * @throws NonUniqueResultException|TransportExceptionInterface */ private function handleHistory(Adresse $address): void { $lastBreakdownStatus = $this->elevatorBreakdownRepository->getLastStatus($address); $this->logger->debug('AscenseurIsActive : '.$address->getAscenseurIsActive()); // $this->logger->debug('lastBreakdownStatus : '.print_r($lastBreakdownStatus, true)); if ($lastBreakdownStatus && $address->getAscenseurIsActive()) { $lastBreakdownStatus->setEndDate(new \DateTime()); $this->em->persist($lastBreakdownStatus); $service = $this->createServiceFromBreakdown($lastBreakdownStatus); $this->alertPrestataire($lastBreakdownStatus, self::ACTION_UPDATE, $service); } if (!$lastBreakdownStatus && !$address->getAscenseurIsActive()) { $this->logger->debug('Alert Provider for '.$address->getId()); $lastBreakdownStatus = new ElevatorBreakdown(); $lastBreakdownStatus->setAdresse($address); $this->logger->debug('Persist Elevator Breakdown'); $this->em->persist($lastBreakdownStatus); $this->logger->debug('End Persist Elevator Breakdown'); $this->logger->debug('createServiceFromBreakdown'); $service = $this->createServiceFromBreakdown($lastBreakdownStatus); $this->logger->debug('End createServiceFromBreakdown'); $this->alertPrestataire($lastBreakdownStatus, self::ACTION_CREATE, $service); } } /** * @return void * * @throws NonUniqueResultException * @throws TransportExceptionInterface */ public function postUpdate(LifecycleEventArgs $args) { $this->logger->debug('Post Update'); if ( !$args->getObject() instanceof Adresse || 'lift-manager' !== $this->solutionService->getCurrent()->getSlug() ) { return; } $this->em = $args->getObjectManager(); /** @var Adresse $adresse */ $adresse = $args->getObject(); $this->logger->debug('Handle History'); $this->handleHistory($adresse); $this->em->flush(); } /** * @throws TransportExceptionInterface * * @psalm-param 'ACTION_CREATE'|'ACTION_UPDATE' $actionType */ private function alertPrestataire(ElevatorBreakdown $elevatorBreakdown, string $actionType, ?Service $service = null): void { $tpl = [ self::ACTION_CREATE => 'emails/elevator_breakdown/new_elevator_breakdown.html.twig', self::ACTION_UPDATE => 'emails/elevator_breakdown/end_elevator_breakdown.html.twig', ]; foreach ($elevatorBreakdown->getAdresse()->getPrestataires() as $prestataire) { foreach ($prestataire->getAgencyPrestataires() as $agencyPrestataire) { if ($agencyPrestataire->getAgency()->getLogo()) { $logo = '@logos/'.$agencyPrestataire->getAgency()->getLogo(); } else { $logo = '@images/bot.png'; } $email = (new TemplatedEmail()) ->from($this->emailFrom) ->to(new Address($agencyPrestataire->getMailContact())) ->subject('Rapport de panne d\ascenseur') // path of the Twig template to render ->htmlTemplate($tpl[$actionType]) // pass variables (name => value) to the template ->context( [ 'logo' => $logo, 'address' => $elevatorBreakdown->getAdresse()->getFullAddress(), 'startDate' => $elevatorBreakdown->getStartDate(), 'endDate' => $elevatorBreakdown->getEndDate(), 'prenomContact' => $agencyPrestataire->getPrenomContact(), 'nomContact' => $agencyPrestataire->getNomContact(), 'hash' => $service->getHash(), 'hasServiceOption' => $agencyPrestataire->getAgency()->getHasServiceOption(), ] ); $this->mailer->send($email); } } } private function createServiceFromBreakdown(ElevatorBreakdown $breakdown): Service { /** @var Prestataire $provider */ $provider = $breakdown->getAdresse()->getPrestataires()->first(); $providerContact = $provider->getAgencyPrestataires()->first(); $service = new Service(); $service->setElevatorBreakdown($breakdown); $service->setProviderContact($providerContact); $service->setHash(uniqid()); $this->em->persist($service); return $service; } }
Save File
Cancel