bubble fraicheur des completions ajouté

This commit is contained in:
Tykayn 2025-06-24 13:16:48 +02:00 committed by tykayn
parent cd8369d08c
commit 93086eba60
18 changed files with 179 additions and 66 deletions

View file

@ -16,6 +16,7 @@ use Symfony\Component\HttpFoundation\Request;
use function uuid_create;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Twig\Environment;
final class AdminController extends AbstractController
{
@ -23,7 +24,8 @@ final class AdminController extends AbstractController
public function __construct(
private EntityManagerInterface $entityManager,
private Motocultrice $motocultrice,
private BudgetService $budgetService
private BudgetService $budgetService,
private Environment $twig
) {
}
@ -99,6 +101,10 @@ final class AdminController extends AbstractController
$this->entityManager->persist($place);
$stats->addPlace($place);
$processedCount++;
// Générer le contenu de l'email avec le template
$emailContent = $this->twig->render('admin/email_content.html.twig', ['place' => $place]);
$place->setEmailContent($emailContent);
} elseif ($updateExisting) {
// Mettre à jour les données depuis Overpass uniquement si updateExisting est true
$existingPlace->update_place_from_overpass_data($placeData);
@ -443,6 +449,8 @@ final class AdminController extends AbstractController
$overpass_osm_ids = array_map(fn($place) => $place['id'], $places_overpass);
$batchSize = 200;
$i = 0;
foreach ($places_overpass as $placeData) {
// Vérifier si le lieu existe déjà (optimisé)
$existingPlace = $placesByOsmId[$placeData['id']] ?? null;
@ -471,6 +479,10 @@ final class AdminController extends AbstractController
$this->entityManager->persist($place);
$stats->addPlace($place);
$processedCount++;
// Générer le contenu de l'email avec le template
$emailContent = $this->twig->render('admin/email_content.html.twig', ['place' => $place]);
$place->setEmailContent($emailContent);
} elseif ($updateExisting) {
$existingPlace->setDead(false);
$existingPlace->update_place_from_overpass_data($placeData);
@ -478,19 +490,19 @@ final class AdminController extends AbstractController
$this->entityManager->persist($existingPlace);
$updatedCount++;
}
}
// Supprimer les lieux qui ne sont plus dans la réponse Overpass, si activé
if ($deleteMissing) {
$db_places = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $insee_code]);
foreach ($db_places as $db_place) {
if (!in_array($db_place->getOsmId(), $overpass_osm_ids)) {
$this->entityManager->remove($db_place);
$deletedCount++;
}
$i++;
// Flush/clear Doctrine tous les X lieux pour éviter l'explosion mémoire
if (($i % $batchSize) === 0) {
$this->entityManager->flush();
$this->entityManager->clear();
// Recharger les stats après clear
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]);
}
}
// Flush final
$this->entityManager->flush();
$this->entityManager->clear();
// Récupérer tous les commerces de la zone qui n'ont pas été supprimés
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $insee_code]);

View file

@ -120,6 +120,12 @@ class Place
#[ORM\Column(nullable: true)]
private ?int $osm_changeset = null;
#[ORM\Column(type: Types::TEXT, nullable: true, options: ['charset' => 'utf8mb4'])]
private ?string $emailContent = null;
#[ORM\Column(type: Types::INTEGER, nullable: true)]
private ?int $place_count = null;
public function getPlaceTypeName(): ?string
{
if ($this->main_tag == 'amenity=restaurant') {
@ -734,4 +740,15 @@ class Place
return $this;
}
public function getEmailContent(): ?string
{
return $this->emailContent;
}
public function setEmailContent(?string $emailContent): static
{
$this->emailContent = $emailContent;
return $this;
}
}

View file

@ -252,16 +252,21 @@ out meta;';
}
public function get_city_osm_from_zip_code($zip_code) {
// Détection spéciale pour Paris, Lyon, Marseille
if (preg_match('/^75(0[1-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-9]|7[0-9]|8[0-9]|9[0-9])$/', $zip_code)) {
$arr = intval(substr($zip_code, 2, 3));
return 'Paris ' . $arr . 'e arr.';
}
if (preg_match('/^69(0[1-9]|1[0-9]|2[0-9])$/', $zip_code)) {
$arr = intval(substr($zip_code, 2, 3));
return 'Lyon ' . $arr . 'e arr.';
}
if (preg_match('/^13(0[1-9]|1[0-6])$/', $zip_code)) {
$arr = intval(substr($zip_code, 2, 3));
return 'Marseille ' . $arr . 'e arr.';
}
// Requête Overpass pour obtenir la zone administrative de niveau 8 avec un nom
$query = "[out:json][timeout:25];
area[\"ref:INSEE\"=\"{$zip_code}\"]->.searchArea;
(
relation[\"admin_level\"=\"8\"][\"name\"][\"type\"=\"boundary\"][\"boundary\"=\"administrative\"](area.searchArea);
);
out body;
>;
out skel qt;";
$query = "[out:json][timeout:25];\n area[\"ref:INSEE\"=\"{$zip_code}\"]->.searchArea;\n (\n relation[\"admin_level\"=\"8\"][\"name\"][\"type\"=\"boundary\"][\"boundary\"=\"administrative\"](area.searchArea);\n );\n out body;\n >;\n out skel qt;";
$response = $this->client->request('POST', $this->overpassApiUrl, [
'body' => ['data' => $query]
]);
@ -389,10 +394,6 @@ out meta;';
public static function uuid_create_static() {
return $this->uuid_create();
}
public function uuid_create() {
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"