up command and labourage

This commit is contained in:
Tykayn 2025-08-08 18:51:44 +02:00 committed by tykayn
parent 8cfea30fdf
commit a81112a018
5 changed files with 279 additions and 86 deletions

View file

@ -3,24 +3,22 @@
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use App\Entity\Place;
use App\Entity\Stats;
use App\Entity\StatsHistory;
use App\Service\Motocultrice;
use App\Service\ActionLogger;
use App\Service\BudgetService;
use App\Service\FollowUpService;
use App\Service\Motocultrice;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use function uuid_create;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Twig\Environment;
use App\Service\ActionLogger;
use DateTime;
use App\Service\FollowUpService;
use phpDocumentor\Reflection\DocBlock\Tags\Var_;
use function uuid_create;
final class AdminController extends AbstractController
{
@ -31,12 +29,13 @@ final class AdminController extends AbstractController
public function __construct(
private EntityManagerInterface $entityManager,
private Motocultrice $motocultrice,
private BudgetService $budgetService,
private Environment $twig,
private ActionLogger $actionLogger,
FollowUpService $followUpService
) {
private Motocultrice $motocultrice,
private BudgetService $budgetService,
private Environment $twig,
private ActionLogger $actionLogger,
FollowUpService $followUpService
)
{
$this->followUpService = $followUpService;
}
@ -46,7 +45,6 @@ final class AdminController extends AbstractController
{
$this->actionLogger->log('labourer_toutes_les_zones', []);
$updateExisting = true;
@ -103,8 +101,7 @@ final class AdminController extends AbstractController
->setSiret($this->motocultrice->find_siret($placeData['tags']) ?? '')
->setAskedHumainsSupport(false)
->setLastContactAttemptDate(null)
->setPlaceCount(0)
// ->setOsmData($placeData['modified'] ?? null)
->setPlaceCount(0)// ->setOsmData($placeData['modified'] ?? null)
;
// Mettre à jour les données depuis Overpass
@ -324,7 +321,44 @@ final class AdminController extends AbstractController
$this->followUpService->generateCityFollowUps($stats, $this->motocultrice, $this->entityManager);
$followups = $stats->getCityFollowUps();
}
$commerces = $stats->getPlaces();
$commerces = $stats->getPlacesCount();
if (!$commerces) {
// labourer
$places_found = $this->motocultrice->labourer($insee_code);
if (count($places_found)) {
var_dump(count($places_found));
foreach ($places_found as $placeData) {
$newPlace = new Place();
$newPlace->setOsmId($placeData['id'])
->setOsmKind($placeData['type'])
->setZipCode($insee_code)
->setUuidForUrl($this->motocultrice->uuid_create())
->setModifiedDate(new \DateTime())
->setStats($stats)
->setDead(false)
->setOptedOut(false)
->setMainTag($this->motocultrice->find_main_tag($placeData['tags']) ?? '')
->setStreet($this->motocultrice->find_street($placeData['tags']) ?? '')
->setHousenumber($this->motocultrice->find_housenumber($placeData['tags']) ?? '')
->setSiret($this->motocultrice->find_siret($placeData['tags']) ?? '')
->setAskedHumainsSupport(false)
->setLastContactAttemptDate(null)
->setPlaceCount(0)// ->setOsmData($placeData['modified'] ?? null)
;
// Mettre à jour les données depuis Overpass
$newPlace->update_place_from_overpass_data($placeData);
$stats->addPlace($newPlace);
$newPlace->setStats($stats);
$this->entityManager->persist($newPlace);
}
}
}
$this->entityManager->persist($newPlace);
$this->entityManager->flush();
$this->actionLogger->log('stats_de_ville', ['insee_code' => $insee_code, 'nom' => $stats->getZone()]);
// Récupérer tous les commerces de la zone
// $commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $insee_code, 'dead' => false]);
@ -347,9 +381,12 @@ final class AdminController extends AbstractController
// Données pour le graphique des modifications par trimestre
$modificationsByQuarter = [];
foreach ($commerces as $commerce) {
if ($commerce->getOsmDataDate()) {
$date = $commerce->getOsmDataDate();
if (isset($commerces) && count($commerces) > 0) {
foreach ($commerces as $commerce) {
if ($commerce->getOsmDataDate()) {
$date = $commerce->getOsmDataDate();
}
$year = $date->format('Y');
$quarter = ceil($date->format('n') / 3);
$key = $year . '-Q' . $quarter;
@ -393,10 +430,10 @@ final class AdminController extends AbstractController
'p.osm_user',
'COUNT(p.id) as nb',
'AVG((CASE WHEN p.has_opening_hours = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_address = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_website = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_wheelchair = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_note = true THEN 1 ELSE 0 END)) / 5 * 100 as completion_moyen'
. ' (CASE WHEN p.has_address = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_website = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_wheelchair = true THEN 1 ELSE 0 END) +'
. ' (CASE WHEN p.has_note = true THEN 1 ELSE 0 END)) / 5 * 100 as completion_moyen'
)
->where('p.osm_user IS NOT NULL')
->andWhere("p.osm_user != ''")
@ -503,7 +540,7 @@ final class AdminController extends AbstractController
}
// Tri par date dans chaque série
foreach ($ctc_completion_series as &$points) {
usort($points, function($a, $b) {
usort($points, function ($a, $b) {
return strcmp($a['date'], $b['date']);
});
}
@ -523,7 +560,7 @@ final class AdminController extends AbstractController
'latestFollowups' => $latestFollowups,
'followup_labels' => \App\Service\FollowUpService::getFollowUpThemes(),
'followup_icons' => \App\Service\FollowUpService::getFollowUpIcons(),
'progression7Days' => $progression7Days,
'progression7Days' => $progression7Days,
'all_types' => \App\Service\FollowUpService::getFollowUpThemes(),
'getTagEmoji' => [self::class, 'getTagEmoji'],
'completion_tags' => \App\Service\FollowUpService::getFollowUpCompletionTags(),
@ -607,15 +644,15 @@ final class AdminController extends AbstractController
// Cas particuliers multi-valeurs (ex: healthcare)
if ($theme === 'healthcare') {
if ($main_tag && (
str_starts_with($main_tag, 'healthcare=') ||
in_array($main_tag, [
'amenity=doctors',
'amenity=pharmacy',
'amenity=hospital',
'amenity=clinic',
'amenity=social_facility'
])
)) {
str_starts_with($main_tag, 'healthcare=') ||
in_array($main_tag, [
'amenity=doctors',
'amenity=pharmacy',
'amenity=hospital',
'amenity=clinic',
'amenity=social_facility'
])
)) {
$match = true;
}
} else {
@ -714,7 +751,6 @@ final class AdminController extends AbstractController
}
/**
* rediriger vers l'url unique quand on est admin
*/
@ -793,7 +829,8 @@ final class AdminController extends AbstractController
$stats->setPopulation((int)$data['population']);
}
}
} catch (\Exception $e) {}
} catch (\Exception $e) {
}
}
// Compléter le budget si manquant
if (!$stats->getBudgetAnnuel()) {
@ -815,7 +852,8 @@ final class AdminController extends AbstractController
$stats->setLat((string)$data['centre']['coordinates'][1]);
}
}
} catch (\Exception $e) {}
} catch (\Exception $e) {
}
}
// Mettre à jour la date de requête de labourage
$stats->setDateLabourageRequested(new \DateTime());
@ -846,7 +884,7 @@ final class AdminController extends AbstractController
// Toujours générer les CityFollowUp (mais ne jamais les supprimer)
// $themes = \App\Service\FollowUpService::getFollowUpThemes();
// foreach (array_keys($themes) as $theme) {
$this->followUpService->generateCityFollowUps($stats, $this->motocultrice, $this->entityManager, true);
$this->followUpService->generateCityFollowUps($stats, $this->motocultrice, $this->entityManager, true);
// }
$this->entityManager->flush();
return $this->redirectToRoute('app_admin_stats', ['insee_code' => $insee_code]);
@ -966,9 +1004,9 @@ final class AdminController extends AbstractController
fclose($handle);
return $response;
}
#[Route('/admin/export_csv/{insee_code}', name: 'app_admin_export_csv')]
public function export_csv(string $insee_code): Response
{
@ -1730,15 +1768,15 @@ final class AdminController extends AbstractController
// Cas particuliers multi-valeurs (ex: healthcare)
if ($theme === 'healthcare') {
if ($main_tag && (
str_starts_with($main_tag, 'healthcare=') ||
in_array($main_tag, [
'amenity=doctors',
'amenity=pharmacy',
'amenity=hospital',
'amenity=clinic',
'amenity=social_facility'
])
)) {
str_starts_with($main_tag, 'healthcare=') ||
in_array($main_tag, [
'amenity=doctors',
'amenity=pharmacy',
'amenity=hospital',
'amenity=clinic',
'amenity=social_facility'
])
)) {
$match = true;
}
} else {
@ -1830,7 +1868,7 @@ final class AdminController extends AbstractController
}
}
foreach ($ctc_completion_series as &$points) {
usort($points, function($a, $b) {
usort($points, function ($a, $b) {
return strcmp($a['date'], $b['date']);
});
}
@ -1870,7 +1908,7 @@ final class AdminController extends AbstractController
foreach ($places as $place) {
$rue = $place->getStreet() ?: '(sans nom)';
if (!isset($rues[$rue])) {
$rues[$rue] = [ 'places' => [], 'completion_sum' => 0 ];
$rues[$rue] = ['places' => [], 'completion_sum' => 0];
}
$rues[$rue]['places'][] = $place;
$rues[$rue]['completion_sum'] += $place->getCompletionPercentage();