diff --git a/assets/styles/app.css b/assets/styles/app.css index 961f08e..49ed4be 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -112,4 +112,36 @@ table.js-sort-table th:active { .good_filled { border-color: green; +} + +.hidden { + display: none; +} + +input[type="checkbox"] { + width: 20px; + height: 20px; +} + +.is-invalid { + border: 1px solid red; +} + +.is-invalid #validation_messages { + color: red; +} + +img { + max-width: 100%; + max-height: 400px; +} + +@media (max-width: 768px) { + .form-label { + margin-bottom: 0.5rem; + } + + .mb-3 { + margin-bottom: 1rem !important; + } } \ No newline at end of file diff --git a/migrations/Version20250608210112.php b/migrations/Version20250608210112.php new file mode 100644 index 0000000..f4a928e --- /dev/null +++ b/migrations/Version20250608210112.php @@ -0,0 +1,47 @@ +addSql(<<<'SQL' + ALTER TABLE place ADD street VARCHAR(255) DEFAULT NULL + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE place ADD housenumber VARCHAR(255) DEFAULT NULL + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE place ADD siret VARCHAR(255) DEFAULT NULL + SQL); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql(<<<'SQL' + ALTER TABLE place DROP street + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE place DROP housenumber + SQL); + $this->addSql(<<<'SQL' + ALTER TABLE place DROP siret + SQL); + } +} diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index e988711..6c74ab3 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -125,7 +125,7 @@ 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(string $zip_code, bool $updateExisting = false): Response + public function labourer(string $zip_code, bool $updateExisting = true): Response { try { // Récupérer ou créer les stats pour cette zone @@ -169,6 +169,10 @@ final class AdminController extends AbstractController ->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) ->setNote('') diff --git a/src/Controller/PublicController.php b/src/Controller/PublicController.php index e08ae72..7dff42e 100644 --- a/src/Controller/PublicController.php +++ b/src/Controller/PublicController.php @@ -76,7 +76,9 @@ class PublicController extends AbstractController ->setModifiedDate(new \DateTime()) ->setZipCode($zipCode) ->setPlaceCount(0) - + ->setMainTag($this->motocultrice->find_main_tag($data['tags_converted']) ?? '') + ->setStreet($this->motocultrice->find_street($data['tags_converted']) ?? '') + ->setHousenumber($this->motocultrice->find_housenumber($data['tags_converted']) ?? '') ->setLastContactAttemptDate(new \DateTime()) ->setUuidForUrl(uniqid()); @@ -461,4 +463,14 @@ class PublicController extends AbstractController 'places_displayed' => $places_displayed ]); } + + #[Route('/set_opted_out_place/{uuid}', name: 'app_public_set_opted_out_place')] + public function set_opted_out_place($uuid): Response + { + $place = $this->entityManager->getRepository(Place::class)->findOneBy(['uuid_for_url' => $uuid]); + if (!$place) { + $this->addFlash('warning', 'Ce commerce n\'existe pas.'); + return $this->redirectToRoute('app_public_index'); + } + } } \ No newline at end of file diff --git a/src/Entity/Place.php b/src/Entity/Place.php index c1778cc..1ceb91b 100644 --- a/src/Entity/Place.php +++ b/src/Entity/Place.php @@ -91,6 +91,15 @@ class Place #[ORM\Column(nullable: true)] private ?int $lon = null; + #[ORM\Column(length: 255, nullable: true)] + private ?string $street = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $housenumber = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $siret = null; + public function getMainTag(): ?string { return $this->main_tag; @@ -191,6 +200,9 @@ class Place ['key' => 'website', 'setter' => 'setHasWebsite', 'source' => $overpass_data['tags'] ?? []], ['key' => 'wheelchair', 'setter' => 'setHasWheelchair', 'source' => $overpass_data['tags'] ?? []], ['key' => 'note', 'setter' => 'setHasNote', 'source' => $overpass_data['tags'] ?? []], + ['key' => 'siret', 'setter' => 'setSiret', 'source' => $overpass_data['tags'] ?? []], + ['key' => 'addr:street', 'setter' => 'setStreet', 'source' => $overpass_data['tags'] ?? []], + ['key' => 'addr:housenumber', 'setter' => 'setHousenumber', 'source' => $overpass_data['tags'] ?? []], ]; foreach ($mapping as $map) { @@ -531,4 +543,40 @@ class Place return $this; } + + public function getStreet(): ?string + { + return $this->street; + } + + public function setStreet(?string $street): static + { + $this->street = $street; + + return $this; + } + + public function getHousenumber(): ?string + { + return $this->housenumber; + } + + public function setHousenumber(?string $housenumber): static + { + $this->housenumber = $housenumber; + + return $this; + } + + public function getSiret(): ?string + { + return $this->siret; + } + + public function setSiret(?string $siret): static + { + $this->siret = $siret; + + return $this; + } } diff --git a/src/Service/Motocultrice.php b/src/Service/Motocultrice.php index c83357c..7897022 100644 --- a/src/Service/Motocultrice.php +++ b/src/Service/Motocultrice.php @@ -74,6 +74,12 @@ class Motocultrice ]; +public function find_siret($tags) { + if(isset($tags['ref:FR:SIRET']) && $tags['ref:FR:SIRET'] != '') { + return $tags['ref:FR:SIRET']; + } + return null; +} public function export($zone) { $query = $this->get_export_query($zone); @@ -188,6 +194,26 @@ out center tags;'; } } + public function find_street($tags) { + if(isset($tags['addr:street']) && $tags['addr:street'] != '') { + return $tags['addr:street']; + } + if(isset($tags['contact:street']) && $tags['contact:street'] != '') { + return $tags['contact:street']; + } + return null; + } + + public function find_housenumber($tags) { + if(isset($tags['addr:housenumber']) && $tags['addr:housenumber'] != '') { + return $tags['addr:housenumber']; + } + if(isset($tags['contact:housenumber']) && $tags['contact:housenumber'] != '') { + return $tags['contact:housenumber']; + } + return null; + } + public function get_city_osm_from_zip_code($zip_code) { // Requête Overpass pour obtenir la zone administrative de niveau 8 avec un nom $query = "[out:json][timeout:25]; @@ -290,6 +316,9 @@ out center tags;'; return null; } + /** + * migrer seulement si la destination n'est pas remplie + */ public function migrate_tags($osm_object_data) { // migrer email vers contact:email diff --git a/templates/admin/edit.html.twig b/templates/admin/edit.html.twig index df562ca..6753c12 100644 --- a/templates/admin/edit.html.twig +++ b/templates/admin/edit.html.twig @@ -8,7 +8,12 @@
+ diff --git a/templates/admin/stats.html.twig b/templates/admin/stats.html.twig index 6ef9f49..e4391d6 100644 --- a/templates/admin/stats.html.twig +++ b/templates/admin/stats.html.twig @@ -84,6 +84,16 @@ Chargement de la carte... + +