<?phpnamespace App\Listener;use App\Entity\DeviceSale;use App\Entity\Order;use App\Entity\User;use App\Mailer\AppMailer;use App\Service\CreditService;use App\Service\CreditSmsService;use App\Service\InvoiceService;use Doctrine\ORM\EntityManagerInterface;use Psr\Log\LoggerInterface;use Wits\PaymentBundle\Event\PaymentEvent;class PaymentEventListener{ private LoggerInterface $logger; private CreditService $creditService; private CreditSmsService $creditSmsService; private InvoiceService $invoiceService; private EntityManagerInterface $em; private AppMailer $appMailer; public function __construct(CreditService $creditService, CreditSmsService $creditSmsService, InvoiceService $invoiceService, LoggerInterface $logger, EntityManagerInterface $em, AppMailer $appMailer) { $this->logger = $logger; $this->creditService = $creditService; $this->invoiceService = $invoiceService; $this->creditSmsService = $creditSmsService; $this->em = $em; $this->appMailer = $appMailer; } /** * Method triggered when a payment confirmation is received * @param PaymentEvent $event */ public function onPaymentConfirmed(PaymentEvent $event) { $this->logger->debug('PaymentEventListener onPaymentConfirmed'); $payment = $event->getPayment(); if ($payment) { $this->logger->info('Payment ' . $payment->getId() . ' has been confirmed'); //search associated order $orderRepository = $this->em->getRepository(Order::class); $order = $orderRepository->findOrderAssociatedAtPayment($payment); //search associated deviceSale $deviceSaleRepository = $this->em->getRepository(DeviceSale::class); $sale = $deviceSaleRepository->findSaleAssociatedwithPayment($payment); if ($order) { if ($order->hasPack()) { if ($order->getPack()->isCreditPack()) { $this->creditService->increaseCreditForOrder($order); } else if ($order->getPack()->isSmsCreditPack()) { $this->creditSmsService->increaseCreditForOrder($order); } else { $this->logger->error('Unknown pack type for order ' . $order->getId()); } } elseif ($order->hasCreditCost()) { $this->logger->info('CreditCost of order ' . $order->getId() . ' have been paid'); } elseif ($order->hasStoreIndexation()) { $this->logger->info('StoreIndexation of order ' . $order->getId() . ' have been paid'); } else { $this->logger->error('Unknown order type (orderId: ' . $order->getId().')'); } //generate invoice & notify $this->invoiceService->createInvoiceForOrder($order); } elseif ($sale) { $this->invoiceService->createInvoiceForDeviceSale($sale); } else { $this->logger->error('No Order nor sale found (associated with payment ' . $payment->getId() . ' )'); } } else { $this->logger->warning('No payment associated with event onPaymentConfirmed'); } } /** * Method triggered when a user is created (in stripe) * @param PaymentEvent $event */ public function onCustomerCreated(PaymentEvent $event) { $this->logger->debug('PaymentEventListener onCustomerCreated'); $customerStripe = $event->getStripeEvent()->data->object; $this->logger->info('User is ' . $customerStripe->id . ' - ' . $customerStripe->email); $user = $this->em->getRepository(User::class)->findOneBy(['email' => $customerStripe->email]); $user->setStripeId($customerStripe->id); $this->em->flush(); } /** * Method triggered when a payment is refused (in stripe) * @param PaymentEvent $event */ public function onPaymentRefused(PaymentEvent $event) { $this->logger->debug('PaymentEventListener onPaymentRefused'); $payment = $event->getPayment(); if ($payment) { $this->logger->info('Payment ' . $payment->getId() . ' has been refused'); $this->appMailer->sendAdminEmailPaymentRefused($payment); $this->em->flush(); } }}