src/EventSubscriber/Package/PackageSubscriber.php line 161

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Package;
  3. use App\DTO\MMPZ\PaymentMethod\PaymentGatewayAuthorizationDTO;
  4. use App\DTO\MMPZ\PaymentMethod\Paypal\PaypalCurrencyDTO;
  5. use App\DTO\MMPZ\PaymentMethod\Paypal\PaypalProductDTO;
  6. use App\DTO\MMPZ\PaymentMethod\Paypal\Plan\PaypalPlanBillingCyclesDTO;
  7. use App\DTO\MMPZ\PaymentMethod\Paypal\Plan\PaypalPlanDTO;
  8. use App\DTO\MMPZ\PaymentMethod\Paypal\Plan\PaypalPlanFrequencyDTO;
  9. use App\DTO\MMPZ\PaymentMethod\Paypal\Plan\PaypalPlanPaymentPreferenceDTO;
  10. use App\DTO\MMPZ\PaymentMethod\Paypal\Plan\PayPalPlanPricingSchemeDTO;
  11. use App\DTO\Request\UserPayloadMMAZ;
  12. use App\Entity\Logs\EventLog;
  13. use App\Entity\Package\Invoice;
  14. use App\Entity\Package\Package;
  15. use App\Entity\Package\PackageSongWriter;
  16. use App\Entity\Package\PackageTransaction;
  17. use App\Entity\Package\ReactivationAttempts;
  18. use App\Entity\Profile\Profile;
  19. use App\Entity\Profile\ProfileRBAC;
  20. use App\Entity\User\User;
  21. use App\Enums\Constants;
  22. use App\Enums\PackageSongwriterStatus;
  23. use App\Enums\PackageType;
  24. use App\Enums\TransactionPlatform;
  25. use App\Event\LogEvent;
  26. use App\Event\Package\PackageCreatedEvent;
  27. use App\Event\Package\PackageDeletedEvent;
  28. use App\Event\Package\PackagePurchasedEvent;
  29. use App\Event\Package\PackageTransactionApprovedEvent;
  30. use App\Event\Package\PackageTransactionSubscriptionCanceledEvent;
  31. use App\Event\Package\PackageTransactionSubscriptionInactivatedEvent;
  32. use App\Event\Package\PackageTransactionSubscriptionReactivatedEvent;
  33. use App\Event\Package\PackageUpdatedEvent;
  34. use App\Repository\Package\InvoiceRepository;
  35. use App\Repository\Package\PackageRepository;
  36. use App\Repository\Package\PackageSongwriterRepository;
  37. use App\Repository\Profile\InvitationRepository;
  38. use App\Service\AuthenticationService;
  39. use App\Service\Mailer\PackageMailer;
  40. use App\Service\PackageService;
  41. use App\Service\PaymentMethod\Paypal\PaypalService;
  42. use App\Service\PaymentMethod\Stripe\StripeService;
  43. use App\Service\ProfileService;
  44. use Stripe\Subscription;
  45. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  46. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  47. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  48. use Symfony\Component\Serializer\SerializerInterface;
  49. class PackageSubscriber implements EventSubscriberInterface
  50. {
  51.     /** @var SerializerInterface */
  52.     private $serializer;
  53.     /**
  54.      * @var AuthenticationService
  55.      */
  56.     private $authenticationService;
  57.     /** @var EventDispatcherInterface */
  58.     private $eventDispatcher;
  59.     /** @var PackageSongwriterRepository */
  60.     private $packageSongwriterRepository;
  61.     /** @var ProfileService */
  62.     private $profileService;
  63.     /** @var PackageMailer */
  64.     private $packageMailer;
  65.     /** @var PackageService */
  66.     private $packageService;
  67.     public function __construct(
  68.         SerializerInterface $serializer,
  69.         AuthenticationService $authenticationService,
  70.         EventDispatcherInterface $eventDispatcher,
  71.         PackageSongwriterRepository $packageSongwriterRepository,
  72.         ProfileService $profileService,
  73.         PackageMailer $packageMailer,
  74.         PackageService $packageService
  75.     )
  76.     {
  77.         $this->serializer $serializer;
  78.         $this->authenticationService $authenticationService;
  79.         $this->eventDispatcher $eventDispatcher;
  80.         $this->packageSongwriterRepository $packageSongwriterRepository;
  81.         $this->profileService $profileService;
  82.         $this->packageMailer $packageMailer;
  83.         $this->packageService $packageService;
  84.     }
  85.     /**
  86.      * @inheritDoc
  87.      */
  88.     public static function getSubscribedEvents(): array
  89.     {
  90.         return [
  91.             PackageCreatedEvent::class                              => 'onPackageCreatedEvent',
  92.             PackageUpdatedEvent::class                              => 'onPackageUpdatedEvent',
  93.             PackageDeletedEvent::class                              => 'onPackageDeletedEvent',
  94.             PackagePurchasedEvent::class                            => 'onPackagePurchasedEvent',
  95.             PackageTransactionApprovedEvent::class                  => 'onPackageTransactionApprovedEvent',
  96.             PackageTransactionSubscriptionCanceledEvent::class      => 'onPackageTransactionSubscriptionCanceledEvent',
  97.             PackageTransactionSubscriptionInactivatedEvent::class   => 'onPackageTransactionSubscriptionInactivatedEvent',
  98.             PackageTransactionSubscriptionReactivatedEvent::class   => 'onPackageTransactionSubscriptionReactivatedEvent',
  99.         ];
  100.     }
  101.     /**
  102.      * @param PackageCreatedEvent $event
  103.      * @return void
  104.      * @throws \GuzzleHttp\Exception\GuzzleException
  105.      * @throws \Stripe\Exception\ApiErrorException
  106.      */
  107.     public function onPackageCreatedEvent(PackageCreatedEvent $event): void
  108.     {
  109.         $type "";
  110.         if($event->getPackage()->getType() === PackageType::PRIMARY){
  111.             $type EventLog::TYPE_PACKAGE_CREATED;
  112.         }else if($event->getPackage()->getType() === PackageType::SUBSCRIPTION){
  113.             $type EventLog::TYPE_SUBSCRIPTION_CREATED;
  114.         }
  115.         $this->eventDispatcher->dispatch(new LogEvent($event->getPackage(), $this->authenticationService->getUser(), $type));
  116.     }
  117.     /**
  118.      * @param PackageUpdatedEvent $event
  119.      */
  120.     public function onPackageUpdatedEvent(PackageUpdatedEvent $event): void
  121.     {
  122.         $type "";
  123.         if($event->getPackage()->getType() === PackageType::PRIMARY){
  124.             $type EventLog::TYPE_PACKAGE_UPDATED;
  125.         }else if($event->getPackage()->getType() === PackageType::SUBSCRIPTION){
  126.             $type EventLog::TYPE_SUBSCRIPTION_UPDATED;
  127.         }
  128.         $this->eventDispatcher->dispatch(new LogEvent($event->getPackage(), $this->authenticationService->getUser(), $type));
  129.     }
  130.     /**
  131.      * @param PackageDeletedEvent $event
  132.      */
  133.     public function onPackageDeletedEvent(PackageDeletedEvent $event): void
  134.     {
  135.         $type "";
  136.         if($event->getPackage()->getType() === PackageType::PRIMARY){
  137.             $type EventLog::TYPE_PACKAGE_DELETED;
  138.         }else if($event->getPackage()->getType() === PackageType::SUBSCRIPTION){
  139.             $type EventLog::TYPE_SUBSCRIPTION_DELETED;
  140.         }
  141.         $this->eventDispatcher->dispatch(new LogEvent($event->getPackage(), $this->authenticationService->getUser(), $type));
  142.     }
  143.     /**
  144.      * @param PackagePurchasedEvent $event
  145.      */
  146.     public function onPackagePurchasedEvent(PackagePurchasedEvent $event): void
  147.     {
  148.         $type "";
  149.         if($event->getPackage()->getType() === PackageType::PRIMARY){
  150.             $type EventLog::TYPE_PACKAGE_PURCHASED;
  151.         }else if($event->getPackage()->getType() === PackageType::SUBSCRIPTION){
  152.             $type EventLog::TYPE_SUBSCRIPTION_PURCHASED;
  153.         }
  154.         $this->packageMailer->sendPackageSubcriptionPurchasedEmails($this->authenticationService->getUser(), $event->getMessage());
  155.         $this->eventDispatcher->dispatch(new LogEvent($event->getPackage(), $this->authenticationService->getUser(), $type));
  156.     }
  157.     /**
  158.      * @param PackageTransactionApprovedEvent $packageTransactionApprovedEvent
  159.      * @return void
  160.      * @throws \GuzzleHttp\Exception\GuzzleException
  161.      * @throws \Stripe\Exception\ApiErrorException
  162.      */
  163.     public function onPackageTransactionApprovedEvent(PackageTransactionApprovedEvent $packageTransactionApprovedEvent)
  164.     {
  165.         $packageTransaction $packageTransactionApprovedEvent->getPackageTransaction();
  166.         /** @var PackageSongWriter $packageSongwriter */
  167.         $packageSongwriter $this->packageSongwriterRepository->findOneBy(['packageTransaction' => $packageTransaction]);
  168.         if(is_null($packageSongwriter)){
  169.             throw new BadRequestHttpException("Package transaction {$packageTransaction->getId()} does not have a Songwriter");
  170.         }
  171.         $type "";
  172.         $invoiceType "";
  173.         if($packageTransaction->getPackage()->getType() === PackageType::PRIMARY){
  174.             $type EventLog::TYPE_PACKAGE_PURCHASED_CONFIRM;
  175.             $invoiceType "PAC";
  176.         }else if($packageTransaction->getPackage()->getType() === PackageType::SUBSCRIPTION){
  177.             $type EventLog::TYPE_SUBSCRIPTION_PURCHASED_CONFIRM;
  178.             $invoiceType "SUB";
  179.         }
  180.         $dataUser = [];
  181.         if($packageTransactionApprovedEvent->getFrom() === "web"){
  182.             $dataUser[] = $this->authenticationService->getUser();
  183.         }else{
  184.             /** @var ProfileRBAC $rbac */
  185.             foreach ($this->profileService->findAllUserForAProfile($packageTransaction->getProfile())  as $rbac){
  186.                 $dataUser[] = $rbac->getUser();
  187.             }
  188.         }
  189.         $messeges $this->buildMessages(
  190.             $type,
  191.             $packageTransaction,
  192.             $packageSongwriter,
  193.             $dataUser[0]
  194.         );
  195.         $this->packageMailer->sendPackageSubcriptionPurchasedEmails($dataUser,$messeges);
  196.         $this->eventDispatcher->dispatch(new LogEvent($packageTransaction$dataUser[0], $type));
  197.     }
  198.     /**
  199.      * @param PackageTransactionSubscriptionCanceledEvent $event
  200.      * @return void
  201.      */
  202.     public function onPackageTransactionSubscriptionCanceledEvent(PackageTransactionSubscriptionCanceledEvent $event)
  203.     {
  204.         $packageTransaction $event->getPackageTransaction();
  205.         $dataUser = [];
  206.         if($event->getFrom() === "web"){
  207.             $dataUser[] = $this->authenticationService->getUser();
  208.         }else{
  209.             /** @var ProfileRBAC $rbac */
  210.             foreach ($this->profileService->findAllUserForAProfile($packageTransaction->getProfile())  as $rbac){
  211.                 if(!in_array($rbac->getUser(), $dataUser)){
  212.                     $dataUser[] = $rbac->getUser();
  213.                 }
  214.             }
  215.         }
  216.         $this->eventDispatcher->dispatch(new LogEvent(
  217.             $packageTransaction,
  218.             $dataUser[0],
  219.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_CANCEL
  220.         ));
  221.         /** @var PackageSongWriter $packageSongWriter */
  222.         $packageSongWriter $this->packageSongwriterRepository->findOneBy(['packageTransaction' => $packageTransaction]);
  223.         $messeges $this->buildMessages(
  224.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_CANCEL,
  225.             $packageTransaction,
  226.             $packageSongWriter,
  227.             $dataUser[0]
  228.         );
  229.         $this->packageMailer->sendPackageSubscriptionCancelledEmails($dataUser,$messeges);
  230.     }
  231.     /**
  232.      * @param PackageTransactionSubscriptionInactivatedEvent $event
  233.      * @return void
  234.      * @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
  235.      */
  236.     public function onPackageTransactionSubscriptionInactivatedEvent(PackageTransactionSubscriptionInactivatedEvent $event)
  237.     {
  238.         $packageTransaction $event->getPackageTransaction();
  239.         $dataUser = [];
  240.         if($event->getFrom() === "web"){
  241.             $dataUser[] = $this->authenticationService->getUser();
  242.         }else{
  243.             /** @var ProfileRBAC $rbac */
  244.             foreach ($this->profileService->findAllUserForAProfile($packageTransaction->getProfile())  as $rbac){
  245.                 $dataUser[] = $rbac->getUser();
  246.             }
  247.         }
  248.         $this->eventDispatcher->dispatch(new LogEvent(
  249.             $packageTransaction,
  250.             $dataUser[0],
  251.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_INACTIVE
  252.         ));
  253.         /** @var PackageSongWriter $packageSongWriter */
  254.         $packageSongWriter $this->packageSongwriterRepository->findOneBy(['packageTransaction' => $packageTransaction]);
  255.         $messeges $this->buildMessages(
  256.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_INACTIVE,
  257.             $packageTransaction,
  258.             $packageSongWriter,
  259.             $dataUser[0]
  260.         );
  261.         $this->packageMailer->sendPackageSubscriptionInactivatedEmails($dataUser,$messeges);
  262.     }
  263.     public function onPackageTransactionSubscriptionReactivatedEvent(PackageTransactionSubscriptionReactivatedEvent $event)
  264.     {
  265.         $packageTransaction $event->getPackageTransaction();
  266.         $dataUser = [];
  267.         if($event->getFrom() === "web"){
  268.             $dataUser[] = $this->authenticationService->getUser();
  269.         }else{
  270.             /** @var ProfileRBAC $rbac */
  271.             foreach ($this->profileService->findAllUserForAProfile($packageTransaction->getProfile())  as $rbac){
  272.                 $dataUser[] = $rbac->getUser();
  273.             }
  274.         }
  275.         $this->eventDispatcher->dispatch(new LogEvent(
  276.             $packageTransaction,
  277.             $dataUser[0],
  278.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_REACTIVE
  279.         ));
  280.         /** @var PackageSongWriter $packageSongWriter */
  281.         $packageSongWriter $this->packageSongwriterRepository->findOneBy(['packageTransaction' => $packageTransaction]);
  282.         $message $this->buildMessages(
  283.             EventLog::TYPE_SUBSCRIPTION_PURCHASED_REACTIVE,
  284.             $packageTransaction,
  285.             $packageSongWriter,
  286.             $dataUser[0]
  287.         );
  288.         $this->packageMailer->sendPackageSubscriptionInactivatedEmails($dataUser$message);
  289.     }
  290.     /**
  291.      * @param Profile $profile
  292.      * @return array|mixed
  293.      */
  294.     private function getCredentialFOrPaymentGateway(Profile $profile)
  295.     {
  296.         $credentials = [];
  297.         if($profile->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER_ADMINISTRATOR){
  298.             $credentials $this->profileService->getParentPaymentGateways($profile);
  299.         }else if($profile->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER
  300.             || $profile->getProfileType()->getName() === Constants::PROFILE_TYPE_SONGWRITER){
  301.             $publisherAdministrator $this->profileService->findPublisherAdministratorForProfile($profile);
  302.             $credentials $this->profileService->getParentPaymentGateways($publisherAdministrator);
  303.         }
  304.         return $credentials;
  305.     }
  306.     /**
  307.      * @param string $event
  308.      * @param PackageTransaction $packageTransaction
  309.      * @param PackageSongWriter $packageSongWriter
  310.      * @param User $user
  311.      * @return array
  312.      */
  313.     private function buildMessages(
  314.         string $event,
  315.         PackageTransaction $packageTransaction,
  316.         PackageSongWriter $packageSongWriter,
  317.         User $user null
  318.     )
  319.     {
  320.         $invoiceType "";
  321.         if($packageTransaction->getPackage()->getType() === PackageType::PRIMARY){
  322.             $invoiceType "PAC";
  323.         }else if($packageTransaction->getPackage()->getType() === PackageType::SUBSCRIPTION){
  324.             $invoiceType "SUB";
  325.         }
  326.         /** @var User $user */
  327.         $user = (is_null($user)) ? $this->authenticationService->getUser() : $user;
  328.         $date date("Y-m-d");
  329.         $time date("H:i:s");
  330.         $message "";
  331.         $title "";
  332.         $dataForEmail = [];
  333.         $nameInTheEmail "";
  334.         if($packageSongWriter->getProfile()->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER){
  335.             $nameInTheEmail $packageSongWriter->getProfile()->getProfileInformation()->getName();
  336.         }else if($packageSongWriter->getProfile()->getProfileType()->getName() === Constants::PROFILE_TYPE_SONGWRITER){
  337.             $nameInTheEmail $user->getUserProfile()->getFirstName()." ".$user->getUserProfile()->getLastName();
  338.         }
  339.         switch($event){
  340.             case EventLog::TYPE_SUBSCRIPTION_PURCHASED_CANCEL:
  341.                 $dataForEmail['title'] = "Subscription Cancelled - ".$packageSongWriter->getProfile()->getProfileInformation()->getName();
  342.                 $dataForEmail['message'] = "The subscription of {$packageTransaction->getPackage()->getName()} has been cancelled for
  343.                 {$user->getUserProfile()->getFirstName()} {$user->getUserProfile()->getLastName()} on {$date} at {$time}";
  344.                 $dataForEmail['message2'] = "";
  345.                 $dataForEmail['message3'] = "";
  346.                 $dataForEmail['username'] = $nameInTheEmail;
  347.                 breaK;
  348.             case EventLog::TYPE_SUBSCRIPTION_PURCHASED_INACTIVE:
  349.                 $dateBegin $packageSongWriter->getAvialableOn()->format("Y/m/d");
  350.                 $dateEnd $packageSongWriter->getAvialableOff()->format("Y/m/d");
  351.                 $nextAttemptDate $this->packageService->getReactivationAttempts($packageTransaction)
  352.                     ->getNextAttemptDate()->format("Y/m/d");
  353.                 $dataForEmail['title'] = $packageSongWriter->getProfile()->getProfileInformation()->getName();
  354.                 $dataForEmail['title'] .= " Your renewal for subscription ".$packageTransaction->getPackage()->getName()." failed";
  355.                 $dataForEmail['message'] = "Your payment for subscription {$packageTransaction->getPackage()->getName()} - 
  356.                  Date {$dateBegin} to {$dateEnd} of {$packageSongWriter->getProfile()->getProfileInformation()->getName()}";
  357.                 $dataForEmail['message'] .= " at {$packageSongWriter->getPackage()->getProfile()->getParent()->getProfileInformation()->getName()}";
  358.                 $dataForEmail['message'] .= " failed using {$packageTransaction->getPaymentGateway()->getPaymentType()->getName()}";
  359.                 $dataForEmail['message2'] = "Your subscription has been suspended and its renewal will be tried again on";
  360.                 $dataForEmail['message2'] .= {$nextAttemptDate}. Make sure that there are enough funds in your";
  361.                 $dataForEmail['message2'] .= {$packageTransaction->getPaymentGateway()->getPaymentType()->getName()} account so";
  362.                 $dataForEmail['message2'] .= " the renewal can be completed and your subscription re-activated";
  363.                 $dataForEmail['message3'] = "Please note that until your subscription has been successfully renewed ";
  364.                 $dataForEmail['message3'] .= "your compositions will not be processed and you will not be able to submit compositions";
  365.                 $dataForEmail['username'] = $nameInTheEmail;
  366.                 break;
  367.             case EventLog::TYPE_SUBSCRIPTION_PURCHASED_REACTIVE:
  368.                 $dataForEmail['title'] = "Subscription Reactivated - ".$packageSongWriter->getProfile()->getProfileInformation()->getName();
  369.                 $dataForEmail['message'] = "The subscription of {$packageTransaction->getPackage()->getName()} has been reactivated
  370.                 on {$date} at {$time} for more information please contact with publishing@horusmusic.global";
  371.                 $dataForEmail['message2'] = "";
  372.                 $dataForEmail['message3'] = "";
  373.                 $dataForEmail['username'] = $nameInTheEmail;
  374.                 break;
  375.             case EventLog::TYPE_SUBSCRIPTION_PURCHASED_CONFIRM:
  376.                 $duration "";
  377.                 if($packageTransaction->getPackage()->isMonthly()){
  378.                     $duration "1 month";
  379.                 }else if($packageTransaction->getPackage()->isAnnual()){
  380.                     $duration "1 year";
  381.                 }
  382.                 $invoicesCounter $this->packageService->invoiceCounter($packageSongWriter"query");
  383.                 $dateBegin $packageSongWriter->getAvialableOn()->format("Y/m/d");
  384.                 $dateEnd $packageSongWriter->getAvialableOff()->format("Y/m/d");
  385.                 $dataForEmail['title'] = "New Subscription";
  386.                 $dataForEmail['message'] = "your payment for subscription {$packageTransaction->getPackage()->getName()} ({$duration})
  387.                 Date - {$dateBegin} - {$dateEnd} of {$packageTransaction->getProfile()->getProfileInformation()->getName()}
  388.                 at {$packageTransaction->getProfile()->getParent()->getProfileInformation()->getName()} was processed successfully using {$packageTransaction->getPaymentGateway()->getPaymentType()->getName()}.
  389.                  Please click below to view the invoice for the transaction.";
  390.                 $dataForEmail['invoiceUrl'] = $_ENV['MMPZ_API_DOMAIN']."/invoice?invoice_number={$packageTransaction->getId()}{$packageSongWriter->getId()}-{$invoicesCounter}";
  391.                 $dataForEmail['message2'] = "In case of issues, please mention the following transaction reference number #
  392.                 {$packageTransaction->getPaymentGatewayExternalId()} to the customer support team";
  393.                 $dataForEmail['username'] = $nameInTheEmail;
  394.                 break;
  395.             case EventLog::TYPE_PACKAGE_PURCHASED_CONFIRM:
  396.                 $invoicesCounter $this->packageService->invoiceCounter($packageSongWriter"query");
  397.                 $dataForEmail['title'] = "New Package";
  398.                 $dataForEmail['message'] = "your payment for Package {$packageTransaction->getPackage()->getName()}
  399.                 of {$packageTransaction->getProfile()->getProfileInformation()->getName()}
  400.                 at {$packageTransaction->getProfile()->getParent()->getProfileInformation()->getName()} was processed successfully using {$packageTransaction->getPaymentGateway()->getPaymentType()->getName()}.
  401.                  Please click below to view the invoice for the transaction";
  402.                 $dataForEmail['invoiceUrl'] = $_ENV['MMPZ_API_DOMAIN']."/invoice?invoice_number={$packageTransaction->getId()}{$packageSongWriter->getId()}-{$invoicesCounter}";
  403.                 $dataForEmail['message2'] = "In case of issues, please mention the following transaction reference number #
  404.                 {$packageTransaction->getPaymentGatewayExternalId()} to the customer support team";
  405.                 $dataForEmail['username'] = $nameInTheEmail;
  406.                 break;
  407.         }
  408.         $dataForEmail['profile'] = $packageSongWriter->getProfile();
  409.         return $dataForEmail;
  410.     }
  411. }