up without batch

This commit is contained in:
Tykayn 2025-06-05 16:20:20 +02:00 committed by tykayn
parent 4c1a7729a1
commit 409bff6d4c
4 changed files with 86 additions and 201 deletions

View file

@ -125,165 +125,82 @@ final class AdminController extends AbstractController
* récupérer les commerces de la zone, créer les nouveaux lieux, et mettre à jour les existants
*/
#[Route('/admin/labourer/{zip_code}', name: 'app_admin_labourer')]
public function labourer_zone(string $zip_code): Response
public function labourer(string $zip_code, bool $updateExisting = false): Response
{
$results = [];
$results = $this->motocultrice->labourer($zip_code);
// Récupérer ou créer les stats pour cette zone
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
if (!$stats) {
$stats = new Stats();
$stats->setZone($zip_code);
// Récupérer les commerces existants dans la base de données pour cette zone
}
$commerces = $stats->getPlaces();
// for commerce, set stats
foreach ($commerces as $commerce) {
$commerce->setStats($stats);
$this->entityManager->persist($commerce);
$stats->addPlace($commerce);
}
// rebuild et persist
$stats->computeCompletionPercent();
$this->entityManager->persist($stats);
$this->entityManager->flush();
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
// Si le nom de la zone n'est pas défini, le récupérer via OSM
if (!$stats->getName()) {
$city_name = $this->motocultrice->get_city_osm_from_zip_code($zip_code);
if ($city_name) {
$stats->setName($city_name);
try {
// Récupérer ou créer les stats pour cette zone
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
if (!$stats) {
$stats = new Stats();
$stats->setZone($zip_code)
->setPlacesCount(0)
->setAvecHoraires(0)
->setAvecAdresse(0)
->setAvecSite(0)
->setAvecAccessibilite(0)
->setAvecNote(0)
->setCompletionPercent(0);
$this->entityManager->persist($stats);
$this->entityManager->flush();
}
}
// Initialiser les compteurs
$counters = [
'avec_horaires' => 0,
'avec_adresse' => 0,
'avec_site' => 0,
'avec_accessibilite' => 0,
'avec_note' => 0
];
// Compter les différents critères pour chaque commerce
foreach ($stats->getPlaces() as $commerce) {
if ($commerce->hasOpeningHours()) {
$counters['avec_horaires']++;
}
if ($commerce->hasAddress()) {
$counters['avec_adresse']++;
}
if ($commerce->hasWebsite()) {
$counters['avec_site']++;
}
if ($commerce->hasWheelchair()) {
$counters['avec_accessibilite']++;
}
if ($commerce->hasNote()) {
$counters['avec_note']++;
}
$commerce->setStats($stats);
}
// Mettre à jour les statistiques
$stats->setPlacesCount(count($commerces));
$stats->setAvecHoraires($counters['avec_horaires']);
$stats->setAvecAdresse($counters['avec_adresse']);
$stats->setAvecSite($counters['avec_site']);
$stats->setAvecAccessibilite($counters['avec_accessibilite']);
$stats->setAvecNote($counters['avec_note']);
$stats->computeCompletionPercent();
$this->entityManager->persist($stats);
$this->entityManager->flush();
$osm_object_ids = [];
if ($commerces) {
// Extraire les osm_object_ids des commerces existants
foreach ($commerces as $commerce) {
$osm_object_ids[] = $commerce->getOsmKind() . '_' . $commerce->getOsmId();
}
}
// pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id
$new_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
return !in_array($commerce['type'] . '_' . $commerce['id'], $osm_object_ids);
});
$existing_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
return in_array($commerce['type'] . '_' . $commerce['id'], $osm_object_ids);
});
$new_places_counter = 0;
// on crée un commerce pour chaque résultat qui reste
foreach ($new_places_list as $np) {
if( !in_array($np['id'] . '_' . $np['type'] , $osm_object_ids )) {
$new_place = new Place();
$main_tag = $this->motocultrice->find_main_tag($np['tags']);
$fullMainTag = $main_tag && isset($np['tags'][$main_tag]) ? $main_tag.'='.$np['tags'][$main_tag] : "";
$new_place
->setUuidForUrl($this->motocultrice->uuid_create())
->setModifiedDate(new \DateTime())
->setStats($stats)
->setDead(false)
->setOptedOut(false)
->setZipCode($zip_code)
->setOsmId($np['id'])
->setMainTag($fullMainTag)
->setOsmKind($np['type'])
->setAskedHumainsSupport(false)
->setLastContactAttemptDate(null)
->update_place_from_overpass_data($np);
$this->entityManager->persist($new_place);
$new_place->setStats($stats);
$stats->addPlace($new_place);
$new_places_counter++;
}
}
// Mise à jour des commerces existants avec les données Overpass
foreach ($commerces as $existing_place) {
foreach ($results as $result) {
if ($existing_place->getOsmId() == $result['id'] && $existing_place->getOsmKind() == $result['type']) {
$existing_place->update_place_from_overpass_data($result);
$existing_place->setStats($stats);
// Récupérer toutes les données
$places = $this->motocultrice->labourer($zip_code);
$processedCount = 0;
$updatedCount = 0;
foreach ($places as $placeData) {
// Vérifier si le lieu existe déjà
$existingPlace = $this->entityManager->getRepository(Place::class)
->findOneBy(['osmId' => $placeData['id']]);
if (!$existingPlace) {
$place = new Place();
$place->setOsmId($placeData['id'])
->setOsmKind($placeData['type'])
->setZipCode($zip_code)
->setUuidForUrl($this->motocultrice->uuid_create())
->setModifiedDate(new \DateTime())
->setStats($stats)
->setDead(false)
->setOptedOut(false)
->setAskedHumainsSupport(false)
->setLastContactAttemptDate(null)
->setNote('')
->setPlaceCount(0);
$this->entityManager->persist($existing_place);
break;
// Mettre à jour les données depuis Overpass
$place->update_place_from_overpass_data($placeData);
$this->entityManager->persist($place);
$stats->addPlace($place);
$processedCount++;
} elseif ($updateExisting) {
// Mettre à jour les données depuis Overpass uniquement si updateExisting est true
$existingPlace->update_place_from_overpass_data($placeData);
$this->entityManager->persist($existingPlace);
$updatedCount++;
}
}
// Flush final
$this->entityManager->flush();
// Mettre à jour les statistiques finales
$stats->computeCompletionPercent();
$this->entityManager->persist($stats);
$this->entityManager->flush();
$message = 'Labourage terminé avec succès. ' . $processedCount . ' nouveaux lieux traités.';
if ($updateExisting) {
$message .= ' ' . $updatedCount . ' lieux existants mis à jour.';
}
$this->addFlash('success', $message);
} catch (\Exception $e) {
$this->addFlash('error', 'Erreur lors du labourage : ' . $e->getMessage());
}
$this->entityManager->persist($stats);
$this->entityManager->flush();
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
return $this->render('admin/labourage_results.html.twig', [
'results' => $results,
'commerces' => $stats->getPlaces(),
'zone' => $zip_code,
'stats' => $stats,
'new_places_counter' => $new_places_counter,
]);
return $this->redirectToRoute('app_public_dashboard');
}
#[Route('/admin/delete/{id}', name: 'app_admin_delete')]