feat(MailCommand): Ajoute l'envoi d'emails de rappel et de satisfaction.
```
This commit is contained in:
Serreau Jovann
2026-01-29 17:10:15 +01:00
parent a85f08d9fa
commit 9970acfd89
4 changed files with 180 additions and 11 deletions

View File

@@ -78,7 +78,7 @@ class MailCommand extends Command
}
// --- 5 & 6. RAPPELS LOGISTIQUES (J-3 et J-1) ---
/* $this->sendEventReminders($io, 3, "Préparation de votre événement J-3");
$this->sendEventReminders($io, 3, "Préparation de votre événement J-3");
$this->sendEventReminders($io, 1, "À demain ! Dernières infos pour votre événement");
// --- 7. SATISFACTION (Fin d'événement + 3j) ---
@@ -90,7 +90,9 @@ class MailCommand extends Command
->setParameter('end', (clone $targetFeedback)->modify('+23 hours 59 mins'))
->getQuery()->getResult();
/** @var Contrats $contrat */
foreach ($finishedContrats as $contrat) {
if($contrat->isSolde() && $contrat->isAccompte()){
$customer = $contrat->getCustomer();
$this->mailer->send(
$customer->getEmail(),
@@ -100,8 +102,9 @@ class MailCommand extends Command
['contrat' => $contrat, 'customer' => $customer]
);
$io->text("Email de satisfaction envoyé à " . $customer->getEmail());
}
}
*/
$io->success('Toutes les tâches d\'envoi d\'emails ont été traitées.');
return Command::SUCCESS;
}
@@ -147,6 +150,7 @@ class MailCommand extends Command
$io->title("Envoi des rappels J-$daysBefore");
$targetDate = (new \DateTime())->modify("+$daysBefore days")->setTime(0, 0);
/** @var Contrats[] $contrats */
$contrats = $this->entityManager->getRepository(Contrats::class)->createQueryBuilder('c')
->where('c.dateStart >= :start AND c.dateStart <= :end')
->andWhere('c.isSigned = true')
@@ -155,15 +159,17 @@ class MailCommand extends Command
->getQuery()->getResult();
foreach ($contrats as $contrat) {
$customer = $contrat->getCustomer();
$this->mailer->send(
$customer->getEmail(),
$customer->getName(),
"[Ludikevent] $subject",
"mails/task/event-reminder-j$daysBefore.twig",
['contrat' => $contrat, 'customer' => $customer]
);
$io->text("Rappel J-$daysBefore envoyé pour " . $contrat->getNumReservation());
if($contrat->isAccompte() && $contrat->isSigned() && $contrat->isCaution()) {
$customer = $contrat->getCustomer();
$this->mailer->send(
$customer->getEmail(),
$customer->getName(),
"[Ludikevent] $subject",
"mails/task/event-reminder-j$daysBefore.twig",
['contrat' => $contrat, 'customer' => $customer,'isSolde'=>$contrat->isSolde()]
);
$io->text("Rappel J-$daysBefore envoyé pour " . $contrat->getNumReservation());
}
}
}
}

View File

@@ -0,0 +1,62 @@
{% extends 'mails/base.twig' %}
{% block content %}
<mj-section background-color="#ffffff" padding="40px 20px" border-radius="20px">
<mj-column>
{# En-tête J-1 #}
<mj-text font-size="24px" font-weight="bold" color="#e74c3c" align="center">
🚀 C'est pour demain !
</mj-text>
<mj-divider border-width="2px" border-color="#e74c3c" width="50px" />
<mj-text font-size="14px" color="#555555" padding-top="20px">
Bonjour {{ datas.customer.name }},
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="22px">
Votre événement approche à grands pas ! Nos équipes terminent le chargement de votre commande pour la livraison prévue demain.
</mj-text>
{# Infos Logistiques #}
<mj-section background-color="#f8f9fa" border-radius="8px" padding="10px">
<mj-column>
<mj-text font-size="14px" color="#2c3e50">
📍 <strong>Lieu :</strong> {{ datas.contrat.deliveryAddress }}
</mj-text>
<mj-text font-size="14px" color="#2c3e50">
⏰ <strong>Horaire prévu :</strong> {{ datas.contrat.deliveryTimeSlot }}
</mj-text>
</mj-column>
</mj-section>
{# Rappel Solde Urgent #}
{% if data.isSolde == false%}
<mj-text font-size="16px" color="#e74c3c" font-weight="bold" padding-top="20px">
⚠️ Rappel : Paiement du solde
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="22px">
Pour rappel, votre solde de <strong>{{ datas.contrat|resteAPayer }} €</strong> n'est pas encore validé.
<br><br>
Afin de fluidifier l'installation demain, nous vous recommandons de régler maintenant par CB via votre espace client. À défaut, <strong>le règlement devra être remis impérativement au livreur dès son arrivée</strong> pour permettre le déchargement du matériel.
</mj-text>
<mj-button background-color="#e74c3c" color="white" href="{{ datas.links.customerSpace }}" font-weight="bold">
Régler mon solde maintenant
</mj-button>
{% endif %}
<mj-divider border-color="#f4f4f4" padding-top="20px" />
<mj-text font-size="13px" color="#7f8c8d" align="center" font-style="italic">
Merci de préparer l'accès au terrain et de prévoir une prise électrique à proximité si nécessaire.
</mj-text>
<mj-text font-size="12px" color="#999999" padding-top="20px" align="center">
Besoin d'aide ? Répondez directement à ce mail ou appelez-nous.
</mj-text>
</mj-column>
</mj-section>
{% endblock %}

View File

@@ -0,0 +1,62 @@
{% extends 'mails/base.twig' %}
{% block content %}
<mj-section background-color="#ffffff" padding="40px 20px" border-radius="20px">
<mj-column>
{# En-tête de rappel J-3 #}
<mj-text font-size="22px" font-weight="bold" color="#27ae60" align="center">
✨ J-3 : Votre événement approche !
</mj-text>
<mj-divider border-width="2px" border-color="#27ae60" width="50px" />
<mj-text font-size="14px" color="#555555" padding-top="20px">
Bonjour {{ datas.customer.name }} {{ datas.customer.surname }},
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="22px">
Nous sommes ravis de vous accompagner pour votre événement du <strong>{{ datas.contrat.dateStart|date('d/m/Y') }}</strong> (Contrat n°{{ datas.contrat.numReservation }}). Nos équipes préparent actuellement votre matériel.
</mj-text>
{% if data.isSolde == false%}
{# Bloc Attention Solde #}
<mj-section background-color="#fff9f0" border="1px solid #f39c12" border-radius="10px" padding="15px">
<mj-column>
<mj-text font-size="16px" color="#d35400" font-weight="bold" align="center">
⚠️ Point sur votre règlement
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="20px">
À ce jour, le solde de votre réservation n'est pas encore réglé.
</mj-text>
<mj-text font-size="14px" color="#555555" font-weight="bold" line-height="20px">
Deux options s'offrent à vous :
</mj-text>
<mj-text font-size="13px" color="#555555">
1. <strong>Payer dès maintenant :</strong> Gagnez du temps le jour J en réglant par carte bancaire depuis votre espace client.
<br>
2. <strong>Payer à la livraison :</strong> Si le solde n'est pas réglé d'ici là, notre livreur vous demandera le paiement directement sur place (le jour même).
</mj-text>
</mj-column>
</mj-section>
{% endif %}
{# Bouton Espace Client #}
<mj-button background-color="#2c3e50" color="white" href="https://reservation.ludikevent.fr" font-family="Helvetica" padding-top="25px">
Accéder à mon espace client
</mj-button>
<mj-divider border-color="#f4f4f4" padding-top="20px" />
{# Récapitulatif #}
<mj-text font-size="15px" color="#333333">
<strong>Reste à régler :</strong> {{ datas.contrat|resteAPayer }}
</mj-text>
<mj-text font-size="12px" color="#999999" padding-top="30px" align="center">
À très vite pour un moment inoubliable ! L'équipe reste à votre disposition pour toute question.
</mj-text>
</mj-column>
</mj-section>
{% endblock %}

View File

@@ -0,0 +1,39 @@
{% extends 'mails/base.twig' %}
{% block content %}
<mj-section background-color="#ffffff" padding="40px 20px" border-radius="20px">
<mj-column>
{# En-tête de satisfaction #}
<mj-text font-size="24px" font-weight="bold" color="#2c3e50" align="center">
Merci de nous avoir fait confiance ! 🎈
</mj-text>
<mj-divider border-width="2px" border-color="#3498db" width="50px" />
<mj-text font-size="14px" color="#555555" padding-top="20px">
Bonjour {{ datas.customer.name }},
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="22px">
Nous espérons que votre événement s'est parfaitement déroulé et que vos invités ont passé un moment mémorable avec nos structures.
</mj-text>
<mj-text font-size="16px" color="#2c3e50" font-weight="bold" align="center" padding-top="20px">
Qu'avez-vous pensé de notre prestation ?
</mj-text>
<mj-text font-size="14px" color="#555555" align="center">
Votre avis est précieux pour nous aider à nous améliorer et pour guider les futurs clients.
</mj-text>
<mj-divider border-color="#f4f4f4" padding-top="30px" />
{# Appel aux réseaux sociaux / Photos #}
<mj-text font-size="14px" color="#555555" line-height="22px" align="center">
Vous avez pris de belles photos ? N'hésitez pas à nous taguer sur vos réseaux sociaux !
</mj-text>
</mj-column>
</mj-section>
{% endblock %}