src/Subscriber/Payment/Purchase/PurchaseBalanceAmateurSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\Payment\Purchase;
  3. use App\Dictionary\BalanceType;
  4. use App\Dictionary\PaymentType;
  5. use App\Event\Payment\PurchaseCreatedEvent;
  6. use App\Service\Amateur\BalanceAmateurService;
  7. use App\Service\Payment\PaymentService;
  8. use App\Service\User\BalanceMemberService;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class PurchaseBalanceAmateurSubscriber implements EventSubscriberInterface
  11. {
  12.     protected BalanceAmateurService $service;
  13.     protected BalanceMemberService $balanceMemberService;
  14.     protected PaymentService $paymentService;
  15.     /**
  16.      * PurchaseBalanceAmateurSubscriber constructor.
  17.      */
  18.     public function __construct(BalanceAmateurService $serviceBalanceMemberService $balanceMemberService,
  19.         PaymentService $paymentService)
  20.     {
  21.         $this->service $service;
  22.         $this->balanceMemberService $balanceMemberService;
  23.         $this->paymentService $paymentService;
  24.     }
  25.     public static function getSubscribedEvents(): array
  26.     {
  27.         return [
  28.             PurchaseCreatedEvent::class => [
  29.                 ['onPurchaseCreateBalanceAmateur'0],
  30.             ],
  31.         ];
  32.     }
  33.     /**
  34.      * @throws \App\Exception\Commission\NotAnAmateurException
  35.      * @throws \Doctrine\ORM\ORMException
  36.      * @throws \Doctrine\ORM\OptimisticLockException
  37.      */
  38.     public function onPurchaseCreateBalanceAmateur(PurchaseCreatedEvent $event)
  39.     {
  40.         if ($event->getPurchasable()->useDelayedProvision()) {
  41.             return;
  42.         }
  43.         $purchase $event->getPurchase();
  44.         $seller $purchase->getSeller();
  45.         if (!$seller || !$seller->getIsAmateur()) {
  46.             return;
  47.         }
  48.         $balances $this->balanceMemberService->findByIds($purchase->getBalanceMember());
  49.         foreach ($balances as $balanceMember) {
  50.             $income $this->service->createProvisionForAmateurByBalanceMember($seller$balanceMember);
  51.             // triggers event
  52.             $this->service->storeBalanceAmateur($income);
  53.             if ($payment $balanceMember->getPayment()) {
  54.                 $latest $this->paymentService->getLatestItemByPayment($payment);
  55.                 if ($latest && $latest->isType(PaymentType::CHARGEBACK)) {
  56.                     $cb $this->service->createProvisionByAmateur($income->getMember(), BalanceType::CHARGEBACK);
  57.                     $cb->setBalanceDetail($income->getBalanceDetail());
  58.                     $cb->setAmount($income->getAmount() * -1);
  59.                     $cb->setPayment($latest);
  60.                     $this->service->storeBalanceAmateur($cb);
  61.                 }
  62.             }
  63.         }
  64.         $purchase->setProvisionAssigned(true);
  65.         $this->service->storeEntity($purchase);
  66.     }
  67. }