add local mapbox script, update objects
This commit is contained in:
parent
c6e05463b1
commit
b1f6433b7d
13 changed files with 309 additions and 182 deletions
|
@ -92,6 +92,10 @@ final class AdminController extends AbstractController
|
|||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* rediriger vers l'url unique quand on est admin
|
||||
*/
|
||||
#[Route('/admin/commerce/{id}', name: 'app_admin_commerce')]
|
||||
public function commerce(int $id): Response
|
||||
{
|
||||
|
@ -115,6 +119,10 @@ 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
|
||||
{
|
||||
|
@ -122,29 +130,32 @@ final class AdminController extends AbstractController
|
|||
$results = $this->motocultrice->labourer($zip_code);
|
||||
|
||||
|
||||
// Récupérer les commerces existants dans la base de données pour cette zone
|
||||
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $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);
|
||||
|
||||
// for commerce, set stats
|
||||
// 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();
|
||||
}
|
||||
|
||||
// rebuild et persist
|
||||
$stats->computeCompletionPercent();
|
||||
$this->entityManager->persist($stats);
|
||||
$this->entityManager->flush();
|
||||
// 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);
|
||||
|
@ -155,9 +166,6 @@ final class AdminController extends AbstractController
|
|||
}
|
||||
}
|
||||
|
||||
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $zip_code]);
|
||||
|
||||
|
||||
// Initialiser les compteurs
|
||||
$counters = [
|
||||
'avec_horaires' => 0,
|
||||
|
@ -203,59 +211,80 @@ final class AdminController extends AbstractController
|
|||
|
||||
if ($commerces) {
|
||||
// Extraire les osm_object_ids des commerces existants
|
||||
$osm_object_ids = array_map(function($commerce) {
|
||||
return $commerce->getOsmId();
|
||||
}, $commerces);
|
||||
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['id'], $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['id'], $osm_object_ids);
|
||||
return in_array($commerce['type'] . '_' . $commerce['id'], $osm_object_ids);
|
||||
});
|
||||
|
||||
$new_places_counter = 0;
|
||||
|
||||
// var_dump($osm_object_ids);
|
||||
// var_dump($new_places_list);
|
||||
// var_dump($existing_places_list);
|
||||
// die();
|
||||
// on crée un commerce pour chaque résultat qui reste
|
||||
foreach ($new_places_list as $np) {
|
||||
$new_place = new Place();
|
||||
|
||||
$main_tag = $this->motocultrice->find_main_tag($np['tags']);
|
||||
if( !in_array($np['id'] . '_' . $np['type'] , $osm_object_ids )) {
|
||||
$new_place = new Place();
|
||||
|
||||
$new_place
|
||||
->setUuidForUrl($this->motocultrice->uuid_create())
|
||||
->setModifiedDate(new \DateTime())
|
||||
->setStats($stats)
|
||||
->setDead(false)
|
||||
->setOptedOut(false)
|
||||
->setOsmId($np['id'])
|
||||
->setMainTag($main_tag && isset($np['tags'][$main_tag]) ? $np['tags'][$main_tag] : "")
|
||||
->setOsmKind($np['type'])
|
||||
->setAskedHumainsSupport(false)
|
||||
->setLastContactAttemptDate(null)
|
||||
->update_place_from_overpass_data($np);
|
||||
$this->entityManager->persist($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] : "";
|
||||
var_dump($fullMainTag);
|
||||
$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_places_list) {
|
||||
foreach ($commerces as $existing_place) {
|
||||
foreach ($results as $result) {
|
||||
if ($existing_places_list->getOsmId() == $result['id'] && $existing_places_list->getOsmKind() == $result['type']) {
|
||||
$existing_places_list->update_place_from_overpass_data($result);
|
||||
$this->entityManager->persist($existing_places_list);
|
||||
if ($existing_place->getOsmId() == $result['id'] && $existing_place->getOsmKind() == $result['type']) {
|
||||
$existing_place->update_place_from_overpass_data($result);
|
||||
$existing_place->setStats($stats);
|
||||
|
||||
$this->entityManager->persist($existing_place);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$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' => $commerces,
|
||||
'commerces' => $stats->getPlaces(),
|
||||
'zone' => $zip_code,
|
||||
'stats' => $stats,
|
||||
'new_places_counter' => $new_places_counter,
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -85,6 +85,12 @@ class Place
|
|||
#[ORM\Column(nullable: true)]
|
||||
private ?\DateTime $displayed_date = null;
|
||||
|
||||
#[ORM\Column(nullable: true)]
|
||||
private ?int $lat = null;
|
||||
|
||||
#[ORM\Column(nullable: true)]
|
||||
private ?int $lon = null;
|
||||
|
||||
public function getMainTag(): ?string
|
||||
{
|
||||
return $this->main_tag;
|
||||
|
@ -120,15 +126,36 @@ class Place
|
|||
}
|
||||
return round($filled_fields / $total_fields * 100);
|
||||
}
|
||||
|
||||
public function guess_main_tag(array $tags_converted) {
|
||||
$main_tag = null;
|
||||
if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') {
|
||||
$main_tag = 'amenity='.$tags_converted['amenity'];
|
||||
}
|
||||
if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') {
|
||||
$main_tag = 'shop='.$tags_converted['shop'];
|
||||
}
|
||||
if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') {
|
||||
$main_tag = 'tourism='.$tags_converted['tourism'];
|
||||
}
|
||||
if (isset($tags_converted['office']) && $tags_converted['office'] != '') {
|
||||
$main_tag = 'office='.$tags_converted['office'];
|
||||
}
|
||||
if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') {
|
||||
$main_tag = 'healthcare='.$tags_converted['healthcare'];
|
||||
}
|
||||
return $main_tag;
|
||||
}
|
||||
/**
|
||||
* mettre à jour le lieu selon les tags osm
|
||||
*/
|
||||
public function update_place_from_overpass_data(array $overpass_data) {
|
||||
|
||||
if ( ! isset($overpass_data['tags']) || $overpass_data['tags'] == null) {
|
||||
if ( ! isset($overpass_data['tags']) || $overpass_data['tags'] == null) {
|
||||
return;
|
||||
}
|
||||
// var_dump($overpass_data);
|
||||
$orignal_overpass_data = $overpass_data;
|
||||
|
||||
$overpass_data = array_merge([
|
||||
'id' => '',
|
||||
'type' => '',
|
||||
|
@ -142,61 +169,35 @@ class Place
|
|||
'wheelchair' => '',
|
||||
'note' => ''
|
||||
], $overpass_data['tags'] );
|
||||
// var_dump($overpass_data);
|
||||
|
||||
if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') {
|
||||
$this->setMainTag('amenity='.$tags_converted['amenity']);
|
||||
}
|
||||
if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') {
|
||||
$this->setMainTag('shop='.$tags_converted['shop']);
|
||||
}
|
||||
if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') {
|
||||
$this->setMainTag('tourism='.$tags_converted['tourism']);
|
||||
}
|
||||
if (isset($tags_converted['office']) && $tags_converted['office'] != '') {
|
||||
$this->setMainTag('office='.$tags_converted['office']);
|
||||
}
|
||||
if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') {
|
||||
$this->setMainTag('healthcare='.$tags_converted['healthcare']);
|
||||
}
|
||||
|
||||
|
||||
$main_tag = $this->guess_main_tag($orignal_overpass_data['tags']);
|
||||
if($main_tag){
|
||||
$this->setMainTag($main_tag);
|
||||
}
|
||||
$this
|
||||
// ->setOsmId($overpass_data['id'])
|
||||
// ->setOsmKind($overpass_data['type'] )
|
||||
->setOsmId( $orignal_overpass_data['id'])
|
||||
->setOsmKind($orignal_overpass_data['type'] )
|
||||
->setLat($orignal_overpass_data['lat'])
|
||||
->setLon($orignal_overpass_data['lon'])
|
||||
->setName(isset($overpass_data['name']) && $overpass_data['name'] != '' ? $overpass_data['name'] : null);
|
||||
|
||||
if (isset($overpass_data['postcode']) && $overpass_data['postcode'] != ''){
|
||||
$this->setZipCode($overpass_data['postcode']);
|
||||
}
|
||||
if (isset($overpass_data['email']) && $overpass_data['email'] != ''){
|
||||
$this->setEmail($overpass_data['email']);
|
||||
}
|
||||
if (isset($overpass_data['tags']['opening_hours']) && $overpass_data['opening_hours'] != ''){
|
||||
$this->setHasOpeningHours($overpass_data['opening_hours']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){
|
||||
$this->setNote($overpass_data['tags']['note']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['addr:housenumber']) && $overpass_data['tags']['addr:housenumber'] != ''){
|
||||
$this->setHasAddress($overpass_data['tags']['addr:housenumber']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['website']) && $overpass_data['tags']['website'] != ''){
|
||||
$this->setHasWebsite($overpass_data['tags']['website']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['wheelchair']) && $overpass_data['tags']['wheelchair'] != ''){
|
||||
$this->setHasWheelchair($overpass_data['tags']['wheelchair']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){
|
||||
$this->setHasNote($overpass_data['tags']['note']);
|
||||
}
|
||||
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){
|
||||
$this->setHasNote($overpass_data['tags']['note']);
|
||||
$this->setNoteContent($overpass_data['tags']['note']);
|
||||
}
|
||||
$mapping = [
|
||||
['key' => 'postcode', 'setter' => 'setZipCode', 'source' => $overpass_data],
|
||||
['key' => 'email', 'setter' => 'setEmail', 'source' => $overpass_data],
|
||||
['key' => 'opening_hours', 'setter' => 'setHasOpeningHours', 'source' => $overpass_data['tags'] ?? []],
|
||||
['key' => 'note', 'setter' => 'setNote', 'source' => $overpass_data['tags'] ?? []],
|
||||
['key' => 'addr:housenumber', 'setter' => 'setHasAddress', 'source' => $overpass_data['tags'] ?? []],
|
||||
['key' => 'website', 'setter' => 'setHasWebsite', 'source' => $overpass_data['tags'] ?? []],
|
||||
['key' => 'wheelchair', 'setter' => 'setHasWheelchair', 'source' => $overpass_data['tags'] ?? []],
|
||||
['key' => 'note', 'setter' => 'setHasNote', 'source' => $overpass_data['tags'] ?? []],
|
||||
];
|
||||
|
||||
|
||||
// Remplir les clés attendues avec des valeurs par défaut si non définies
|
||||
|
||||
foreach ($mapping as $map) {
|
||||
if (isset($map['source'][$map['key']]) && $map['source'][$map['key']] !== '') {
|
||||
$this->{$map['setter']}($map['source'][$map['key']]);
|
||||
}
|
||||
}
|
||||
|
||||
$this
|
||||
// ->setOsmId($overpass_data['id'])
|
||||
|
@ -506,4 +507,28 @@ class Place
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getLat(): ?int
|
||||
{
|
||||
return $this->lat;
|
||||
}
|
||||
|
||||
public function setLat(?int $lat): static
|
||||
{
|
||||
$this->lat = $lat;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getLon(): ?int
|
||||
{
|
||||
return $this->lon;
|
||||
}
|
||||
|
||||
public function setLon(?int $lon): static
|
||||
{
|
||||
$this->lon = $lon;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ class Stats
|
|||
/**
|
||||
* @var Collection<int, Place>
|
||||
*/
|
||||
#[ORM\OneToMany(targetEntity: Place::class, mappedBy: 'stats')]
|
||||
#[ORM\OneToMany(targetEntity: Place::class, mappedBy: 'stats', cascade: ['persist', 'remove'])]
|
||||
private Collection $places;
|
||||
|
||||
// nombre de commerces dans la zone
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue