src/Subscriber/Balance/Webmaster/SettlementProvisionSubscriber.php line 80

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\Balance\Webmaster;
  3. use App\Dictionary\BalanceType;
  4. use App\Dictionary\PaymentType;
  5. use App\Event\Balance\BalanceAmateurProvisionCreatedEvent;
  6. use App\Event\Payment\PaymentCreatedEvent;
  7. use App\Service\Payment\PaymentService;
  8. use App\Service\Webmaster\BalanceWebmasterService;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class SettlementProvisionSubscriber implements EventSubscriberInterface
  11. {
  12.     protected BalanceWebmasterService $balanceWebmasterService;
  13.     protected PaymentService $paymentService;
  14.     /**
  15.      * ChargebackProvisionSubscriber constructor.
  16.      */
  17.     public function __construct(BalanceWebmasterService $balanceWebmasterServicePaymentService $paymentService)
  18.     {
  19.         $this->balanceWebmasterService $balanceWebmasterService;
  20.         $this->paymentService $paymentService;
  21.     }
  22.     public static function getSubscribedEvents(): array
  23.     {
  24.         return [
  25.             PaymentCreatedEvent::class => [
  26.                 ['settleWebmasterProvision'0],
  27.             ],
  28.             BalanceAmateurProvisionCreatedEvent::class => [
  29.                 ['settleWebmasterProvisionOnAmateurProvision'0],
  30.             ],
  31.         ];
  32.     }
  33.     protected function getService(): BalanceWebmasterService
  34.     {
  35.         return $this->balanceWebmasterService;
  36.     }
  37.     protected function getPaymentService(): PaymentService
  38.     {
  39.         return $this->paymentService;
  40.     }
  41.     /**
  42.      * @throws \Doctrine\ORM\ORMException
  43.      * @throws \Doctrine\ORM\OptimisticLockException
  44.      */
  45.     public function settleWebmasterProvision(PaymentCreatedEvent $event)
  46.     {
  47.         $settlement $event->getPayment();
  48.         if (PaymentType::SETTLEMENT !== $settlement->getType()) {
  49.             return;
  50.         }
  51.         // Bei Teilzahlungen nach Chargebacks keine Provision, erst bei komplettem Ausgleich
  52.         if (== $this->getPaymentService()->getOpenBookingAmountByPayment($settlement)) {
  53.             $account $settlement->getAccount();
  54.             $webmaster $account->getAdvertisedBy();
  55.             if ($webmaster) {
  56.                 $service $this->getService();
  57.                 $balance $service->createProvisionByWebmaster($webmasterBalanceType::SETTLEMENT);
  58.                 $balance->setAmount($settlement->getAmount() * $webmaster->getProvisionPercent() / 100);
  59.                 $balance->setPayment($settlement);
  60.                 $service->storeBalanceWebmaster($balance);
  61.             }
  62.         }
  63.     }
  64.     /**
  65.      * @throws \Doctrine\ORM\ORMException
  66.      * @throws \Doctrine\ORM\OptimisticLockException
  67.      */
  68.     public function settleWebmasterProvisionOnAmateurProvision(BalanceAmateurProvisionCreatedEvent $event)
  69.     {
  70.         $provisionSettlement $event->getBalance();
  71.         if (BalanceType::SETTLEMENT !== $provisionSettlement->getType()) {
  72.             return;
  73.         }
  74.         $amateur $provisionSettlement->getMember();
  75.         if (!$amateur->getAccount()->getAdvertisedBy()) {
  76.             return;
  77.         }
  78.         $service $this->getService();
  79.         $advertiser $amateur->getAccount()->getAdvertisedBy();
  80.         $settlement $service->createProvisionByWebmaster($advertiserBalanceType::SETTLEMENT);
  81.         $settlement->getBalanceDetail()->setSeller($amateur);
  82.         $amount $provisionSettlement->getAmount() * $advertiser->getAmateurProvisionPercent() / 100;
  83.         $settlement->setAmount($amount);
  84.         if ($provisionSettlement->getPayment()) {
  85.             $settlement->setPayment($provisionSettlement->getPayment());
  86.         }
  87.         $service->storeEntity($settlement);
  88.     }
  89. }