```
✨ feat(MailCommand): Ajoute l'envoi d'emails de rappel et de satisfaction.
```
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
62
templates/mails/task/event-reminder-j1.twig
Normal file
62
templates/mails/task/event-reminder-j1.twig
Normal 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 %}
|
||||
62
templates/mails/task/event-reminder-j3.twig
Normal file
62
templates/mails/task/event-reminder-j3.twig
Normal 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 %}
|
||||
39
templates/mails/task/feedback.twig
Normal file
39
templates/mails/task/feedback.twig
Normal 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 %}
|
||||
Reference in New Issue
Block a user