add mail action and view, unsubscription

This commit is contained in:
Tykayn 2025-06-19 10:37:29 +02:00 committed by tykayn
parent dbe2f62c45
commit 06ced163e6
5 changed files with 69 additions and 9 deletions

View file

@ -272,6 +272,12 @@ final class AdminController extends AbstractController
#[Route('/admin/labourer/{insee_code}', name: 'app_admin_labourer')]
public function labourer(string $insee_code, bool $updateExisting = true): Response
{
// Vérifier si le code INSEE est valide (composé uniquement de chiffres)
if (!ctype_digit($insee_code) || $insee_code == 'undefined' || $insee_code == '') {
$this->addFlash('error', 'Code INSEE invalide : il doit être composé uniquement de chiffres.');
return $this->redirectToRoute('app_public_index');
}
try {
// Récupérer ou créer les stats pour cette zone
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $insee_code]);
@ -536,4 +542,43 @@ final class AdminController extends AbstractController
return $this->redirectToRoute('app_public_index');
}
#[Route('/admin/send_email_to_place/{id}', name: 'app_admin_send_email_to_place')]
public function send_email_to_place(Place $place, \Symfony\Component\Mailer\MailerInterface $mailer): Response
{
// Vérifier si le lieu est opted out
if ($place->isOptedOut()) {
$this->addFlash('error', 'Ce lieu a demandé à ne plus être sollicité pour mettre à jour ses informations.');
return $this->redirectToRoute('app_public_index');
}
// Vérifier si le lieu a déjà été contacté
if ($place->getLastContactAttemptDate() !== null) {
$this->addFlash('error', 'Ce lieu a déjà été contacté le ' . $place->getLastContactAttemptDate()->format('d/m/Y H:i:s'));
return $this->redirectToRoute('app_public_index');
}
// Générer le contenu de l'email avec le template
$emailContent = $this->renderView('admin/email_content.html.twig', [
'place' => $place
]);
// Envoyer l'email
$email = (new \Symfony\Component\Mime\Email())
->from('contact@openstreetmap.fr')
->to('contact+send_email@cipherbliss.com')
->subject('Mise à jour des informations de votre établissement dans OpenStreetMap')
->html($emailContent);
$mailer->send($email);
// Mettre à jour la date de dernier contact
$place->setLastContactAttemptDate(new \DateTime());
$this->entityManager->persist($place);
$this->entityManager->flush();
$this->addFlash('success', 'Email envoyé avec succès à ' . $place->getName() . ' le ' . $place->getLastContactAttemptDate()->format('d/m/Y H:i:s'));
return $this->redirectToRoute('app_public_index');
}
}

View file

@ -137,7 +137,7 @@ class Place
return 'école';
}
return 'lieu';
return 'établissement';
}
public function getMainTag(): ?string

View file

@ -1,21 +1,26 @@
<div class="content">
<i class="bi bi-shop-window"></i>
<p>Bonjour, votre {{place.getPlaceTypeName()}} "{{place.name }}" est présent dans la base de données mondiale OpenStreetMap avec 650 000 autres en France. Ces informations sont utilisées dans des milliers de sites web, par Île de France mobilités, TomTom, Geovelo, Cartes IGN, Facebook, Instagram, et Apple Plans.
<p>Bonjour, votre {{place.getPlaceTypeName()}} "{{place.name }}" est présent dans la base de données mondiale OpenStreetMap (OSM) avec 650 000 autres en France.
<br>
Ces informations sont utilisées dans des milliers de sites web et annuaires, par Île de France mobilités, TomTom, Geovelo, Cartes IGN, Facebook, Instagram, Apple Plans et bien d'autres.
<br>
Plus les informations seront à jour et plus vous aurez de chances d'avoir des clients satisfaits.</p>
<p> Vous pouvez le modifier en cliquant sur le bouton ci-dessous, c'est gratuit et sans engagement.</p>
<a href="{{ path('app_admin_commerce', {'id': place.id}) }}" class="btn btn-primary">
<i class="bi bi-pencil-square"></i>
Compléter les informations de mon commerce</a>
<a href="{{ path('app_public_edit', {'zipcode': place.zipCode, 'name': place.name != '' ? place.name : '?', 'uuid': place.uuidForUrl}) }}" class="btn btn-primary">
<i class="bi bi-pencil-square"></i>
Compléter les informations de mon commerce
</a>
<br>
<br>
Les bénévoles de l'association OpenStreetMap France ont mis en place cet outil pour faciliter la mise à jour des informations de vos commerces et améliorer la souveraineté numérique. Si vous avez besoin d'aide, n'hésitez pas à nous contacter à l'adresse <a href="mailto:contact@openstreetmap.fr">contact@openstreetmap.fr</a>.
<br>
Pour des besoins de prestation de services concernant l'intégration de données, vous pouvez contacter la fédération des pros d'OpenStreetMap France sur <a href="https://fposm.fr">https://fposm.fr</a>.
<br>
Pour des besoins de prestation de services concernant l'intégration ou l'exportation de données depuis OSM, vous pouvez contacter la fédération des pros d'OpenStreetMap France sur <a href="https://fposm.fr">https://fposm.fr</a>.
<br>
<br>
En vous souhaitant une bonne journée.
<br>

View file

@ -9,4 +9,14 @@
{% include 'admin/email_content.html.twig' with {'place': place} %}
</div>
</div>
<div class="container">
<div class="row">
<div class="col-12">
<a href="{{ path('app_admin_send_email_to_place', {'id': place.id}) }}" class="btn btn-primary">
<i class="bi bi-envelope-fill"></i>
Envoyer l'email
</a>
</div>
</div>
</div>
{% endblock %}

View file

@ -36,7 +36,7 @@
</div>
{% for label, messages in app.flashes %}
{% for message in messages %}
<div class="alert alert-{{ label }} alert-dismissible fade show mt-3" role="alert">
<div class="alert alert-{{ label }} is-{{ label }} alert-dismissible fade show mt-3" role="alert">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>