<?php
namespace App\EventListener;
use App\Entity\User\AdminUser;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Contracts\EventDispatcher\Event;
class OrderListener
{
/** @var EntityManagerInterface */
protected EntityManagerInterface $em;
/** @var MailerInterface */
protected MailerInterface $mailer;
/**
* @param EntityManagerInterface $em
* @param MailerInterface $mailer
*/
public function __construct(EntityManagerInterface $em, MailerInterface $mailer) {
$this->em = $em;
$this->mailer = $mailer;
}
/**
* @param Event $event
* @return void
* @throws TransportExceptionInterface
*/
public function onPostComplete(Event $event): void
{
$order = $event->getSubject();
$paymentType = $order->getPayments()->first()->getMethod()->getGatewayConfig()->getGatewayName();
$customer = $order->getCustomer();
// Prepare payment confirmation mail to Customer
$customerMail = (new TemplatedEmail())
->to(new Address($customer->getEmail()))
->subject(
$paymentType === 'mercanet'
? 'FNTV Services – Votre commande réglée par carte bancaire a bien été enregistrée'
: 'FNTV Services – Concernant votre demande de règlement par virement bancaire'
)
->htmlTemplate('bundles/SyliusShopBundle/Email/payment_confirmation_customer.html.twig')
->context([
'order' => $order,
'customer' => $customer,
'paymentType' => $paymentType
])
;
// Prepare payment confirmation mail to Admin
$admins = $this->em->getRepository(AdminUser::class)->findBy(['enabled' => true]);
foreach ($admins as $admin) {
$adminsEmails[] = $admin->getEmail();
}
$adminMail = (new TemplatedEmail())
->to(... $adminsEmails ?? [])
->subject(
$paymentType === 'mercanet'
? 'FNTV Services – Un commande réglée par carte bancaire a été réalisée'
: 'FNTV Services – Nouveau règlement par virement bancaire'
)
->htmlTemplate('bundles/SyliusShopBundle/Email/payment_confirmation_admin.html.twig')
->context([
'order' => $order,
'customer' => $customer,
'paymentType' => $paymentType
])
;
// Send
$this->mailer->send($customerMail);
$this->mailer->send($adminMail);
}
}