src/EventSubscriber/BuildingAdminSubscriber.php line 34
<?php
namespace App\EventSubscriber;
use App\Entity\Building;
use App\Entity\BuildingEditHistory;
use App\Entity\BuildingReportingHistory;
use App\Entity\User;
use App\Services\Admin\BuildingReportingHistory\PersistBuildingReportingHistoryService;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class BuildingAdminSubscriber implements EventSubscriberInterface
{
public function __construct(private EntityManagerInterface $entityManager, private PersistBuildingReportingHistoryService $buildingReportingHistoryService, private HttpClientInterface $client)
{
}
public static function getSubscribedEvents()
{
return [
AfterEntityPersistedEvent::class => ['afterEntityPersisted'],
BeforeEntityUpdatedEvent::class => ['beforeEntityUpdated'],
AfterEntityUpdatedEvent::class => ['afterEntityUpdated'],
];
}
public function afterEntityPersisted(AfterEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
if (!($entity instanceof Building)) {
return;
}
if ($entity->getId() && !$entity->getNumberId()) {
$entity->setNumberId(sprintf('N°%s%s%s%s', $entity->getCreatedAt()->format('Y'), $entity->getCreatedAt()->format('m'), $entity->getCreatedAt()->format('d'), str_pad($entity->getId(), 8, '0', STR_PAD_LEFT)));
}
if ($entity->getId() && $entity->getNumberId() == "NULL") {
$entity->setNumberId(sprintf('N°%s%s%s%s', $entity->getCreatedAt()->format('Y'), $entity->getCreatedAt()->format('m'), $entity->getCreatedAt()->format('d'), str_pad($entity->getId(), 8, '0', STR_PAD_LEFT)));
}
if ($entity->getStreetNumber() && $entity->getStreet() && $entity->getCityEntity()) {
$address = sprintf('%s %s, %s', $entity->getStreetNumber(), $entity->getStreet(), $entity->getCityEntity()->getCityName());
$address = urlencode($address);
$response = $this->client->request('GET', 'https://maps.googleapis.com/maps/api/geocode/json', [
'query' => [
'address' => $address,
'key' => $this->getParameter('app.googlemapkey'),
],
]);
$content = $response->toArray();
if ($content['status'] === 'OK') {
$lat = $content['results'][0]['geometry']['location']['lat'];
$lng = $content['results'][0]['geometry']['location']['lng'];
$entity->setLat($lat); // Assumes you have a setLat() method in your Building entity
$entity->setLng($lng); // Assumes you have a setLng() method in your Building entity
}
}
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
public function beforeEntityUpdated(BeforeEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
if (!($entity instanceof Building)) {
return;
}
$entity->setIsEnd(true);
$lastBuildingReportingHistory = $entity->getBuildingReportingHistories()->last();
if ($lastBuildingReportingHistory && $lastBuildingReportingHistory->getId() == null) {
$this->buildingReportingHistoryService->persist($entity, $lastBuildingReportingHistory);
}
$buildingEditHistory = new BuildingEditHistory();
$buildingEditHistory->setBuilding($entity);
$buildingEditHistory->setEditedAt(new \DateTimeImmutable('now', new \DateTimeZone('Europe/Paris')));
$this->entityManager->persist($buildingEditHistory);
$this->entityManager->flush();
$entity->setEditedAt(new \DateTime());
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
public function afterEntityUpdated(AfterEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
if (!($entity instanceof Building)) {
return;
}
if ($entity->getStreetNumber() && $entity->getStreet() && $entity->getCityEntity()) {
$address = sprintf('%s %s, %s', $entity->getStreetNumber(), $entity->getStreet(), $entity->getCityEntity()->getCityName());
$address = urlencode($address);
$response = $this->client->request('GET', 'https://maps.googleapis.com/maps/api/geocode/json', [
'query' => [
'address' => $address,
'key' => $this->getParameter('app.googlemapkey'),
],
]);
$content = $response->toArray();
if ($content['status'] === 'OK') {
$lat = $content['results'][0]['geometry']['location']['lat'];
$lng = $content['results'][0]['geometry']['location']['lng'];
$entity->setLat($lat); // Assumes you have a setLat() method in your Building entity
$entity->setLng($lng); // Assumes you have a setLng() method in your Building entity
}
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
}
}