export command et enddpoint pour les villes

This commit is contained in:
Tykayn 2025-07-05 10:50:38 +02:00 committed by tykayn
parent c81affd3e3
commit 46d3b21cf6
4 changed files with 663 additions and 0 deletions

View file

@ -198,4 +198,138 @@ class ApiController extends AbstractController
$response->headers->set('Content-Disposition', 'attachment; filename="places_'.$insee.'.csv"');
return $response;
}
#[Route('/api/v1/stats/export', name: 'api_stats_export', methods: ['GET'])]
public function statsExport(
StatsRepository $statsRepository,
\Symfony\Component\HttpFoundation\Request $request
): JsonResponse {
// Récupérer les paramètres de requête
$zone = $request->query->get('zone');
$pretty = $request->query->getBoolean('pretty', false);
$includeFollowups = $request->query->getBoolean('include_followups', true);
$includePlaces = $request->query->getBoolean('include_places', false);
try {
// Construire la requête
$qb = $statsRepository->createQueryBuilder('s');
if ($zone) {
$qb->where('s.zone = :zone')
->setParameter('zone', $zone);
}
$stats = $qb->getQuery()->getResult();
if (empty($stats)) {
return new JsonResponse([
'error' => 'Aucun objet Stats trouvé',
'message' => $zone ? "Aucune zone trouvée pour le code INSEE: $zone" : 'Aucune donnée disponible'
], Response::HTTP_NOT_FOUND);
}
// Préparer les données pour l'export
$exportData = [];
foreach ($stats as $stat) {
$statData = [
'id' => $stat->getId(),
'zone' => $stat->getZone(),
'name' => $stat->getName(),
'dateCreated' => $stat->getDateCreated() ? $stat->getDateCreated()->format('Y-m-d H:i:s') : null,
'dateModified' => $stat->getDateModified() ? $stat->getDateModified()->format('Y-m-d H:i:s') : null,
'population' => $stat->getPopulation(),
'budgetAnnuel' => $stat->getBudgetAnnuel(),
'siren' => $stat->getSiren(),
'codeEpci' => $stat->getCodeEpci(),
'codesPostaux' => $stat->getCodesPostaux(),
'decomptes' => [
'placesCount' => $stat->getPlacesCount(),
'avecHoraires' => $stat->getAvecHoraires(),
'avecAdresse' => $stat->getAvecAdresse(),
'avecSite' => $stat->getAvecSite(),
'avecAccessibilite' => $stat->getAvecAccessibilite(),
'avecNote' => $stat->getAvecNote(),
'completionPercent' => $stat->getCompletionPercent(),
'placesCountReal' => $stat->getPlaces()->count(),
],
];
// Ajouter les followups si demandé
if ($includeFollowups) {
$statData['followups'] = [];
foreach ($stat->getCityFollowUps() as $followup) {
$statData['followups'][] = [
'name' => $followup->getName(),
'measure' => $followup->getMeasure(),
'date' => $followup->getDate()->format('Y-m-d H:i:s')
];
}
}
// Ajouter les lieux si demandé
if ($includePlaces) {
$statData['places'] = [];
foreach ($stat->getPlaces() as $place) {
$statData['places'][] = [
'id' => $place->getId(),
'name' => $place->getName(),
'mainTag' => $place->getMainTag(),
'osmId' => $place->getOsmId(),
'osmKind' => $place->getOsmKind(),
'email' => $place->getEmail(),
'note' => $place->getNote(),
'zipCode' => $place->getZipCode(),
'siret' => $place->getSiret(),
'lat' => $place->getLat(),
'lon' => $place->getLon(),
'hasOpeningHours' => $place->hasOpeningHours(),
'hasAddress' => $place->hasAddress(),
'hasWebsite' => $place->hasWebsite(),
'hasWheelchair' => $place->hasWheelchair(),
'hasNote' => $place->hasNote(),
'completionPercentage' => $place->getCompletionPercentage(),
];
}
}
$exportData[] = $statData;
}
// Préparer le JSON
$jsonOptions = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES;
if ($pretty) {
$jsonOptions |= JSON_PRETTY_PRINT;
}
$jsonContent = json_encode($exportData, $jsonOptions);
if (json_last_error() !== JSON_ERROR_NONE) {
return new JsonResponse([
'error' => 'Erreur lors de l\'encodage JSON',
'message' => json_last_error_msg()
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
// Retourner la réponse
$response = new JsonResponse($exportData, Response::HTTP_OK);
$response->headers->set('Content-Type', 'application/json');
$response->headers->set('Content-Disposition', 'attachment; filename="stats_export.json"');
// Ajouter des métadonnées dans les headers
$response->headers->set('X-Export-Count', count($stats));
$response->headers->set('X-Export-Generated', (new \DateTime())->format('c'));
if ($zone) {
$response->headers->set('X-Export-Zone', $zone);
}
return $response;
} catch (\Exception $e) {
return new JsonResponse([
'error' => 'Erreur lors de l\'export',
'message' => $e->getMessage()
], Response::HTTP_INTERNAL_SERVER_ERROR);
}
}
}