src/App/Subscriber/CardExpirationSubscriber.php line 30

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\Subscriber;
  3. use App\Email\CardExpiration;
  4. use App\Entity\User;
  5. use App\Repository\PaymentVxsOrderRepository;
  6. use DateTime;
  7. use Doctrine\Persistence\ManagerRegistry;
  8. use Sindrive\EmailSenderBundle\Service\EmailSender;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use VxsBundle\Event\VxsPaymentApprovalsEvent;
  11. class CardExpirationSubscriber implements EventSubscriberInterface
  12. {
  13.     private PaymentVxsOrderRepository $paymentVxsOrderRepository;
  14.     private ManagerRegistry $doctrine;
  15.     private EmailSender $emailSender;
  16.     public function __construct(PaymentVxsOrderRepository $paymentVxsOrderRepositoryManagerRegistry $doctrineEmailSender $emailSender)
  17.     {
  18.         $this->paymentVxsOrderRepository $paymentVxsOrderRepository;
  19.         $this->doctrine $doctrine;
  20.         $this->emailSender $emailSender;
  21.     }
  22.     public function onApproved(VxsPaymentApprovalsEvent $event): void
  23.     {
  24.         $transactions $event->getApprovedTransactions();
  25.         $nearExpired = new DateTime('+2 months');
  26.         $nearExpired->modify('first day of this month')->setTime(0000);
  27.         foreach ($transactions as $transactionId => $transactionData) {
  28.             if (!isset($transactionData['expiry']) || !is_string($transactionData['expiry'])) {
  29.                 continue;
  30.             }
  31.             $date DateTime::createFromFormat('Y-m-d'$transactionData['expiry']);
  32.             if (false === $date) {
  33.                 continue;
  34.             }
  35.             $date->setTime(0000);
  36.             if ($date $nearExpired) {
  37.                 continue;
  38.             }
  39.             $transaction $this->paymentVxsOrderRepository->findOneBy(['transactionId' => $transactionId]);
  40.             if (null === $transaction) {
  41.                 continue;
  42.             }
  43.             if (null === $transaction->getCreditsMembership()) {
  44.                 continue;
  45.             }
  46.             $user $transaction->getUser();
  47.             if (!$user instanceof User) {
  48.                 continue;
  49.             }
  50.             if ($user->getNotifiedExpiration($transactionId)) {
  51.                 continue;
  52.             }
  53.             $user->setEmailNotifiedExpiration($transactionId);
  54.             $this->emailSender->sendType(new CardExpiration($user));
  55.         }
  56.         $this->doctrine->getManager()->flush();
  57.     }
  58.     /**
  59.      * @return array<string, array<int|string, array<int|string, int|string>|int|string>|string>
  60.      */
  61.     public static function getSubscribedEvents(): array
  62.     {
  63.         return [
  64.             VxsPaymentApprovalsEvent::class => 'onApproved',
  65.         ];
  66.     }
  67. }