<?php
namespace App\Subscriber\Balance\Webmaster;
use App\Dictionary\BalanceType;
use App\Event\Balance\BalanceAmateurProvisionCreatedEvent;
use App\Event\Balance\BalanceWebmasterProvisionCreatedEvent;
use App\Event\Payment\PaymentReleasedEvent;
use App\Lib\Payment\PayMethod\AdminBonusMethod;
use App\Service\Webmaster\BalanceWebmasterService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/*
* Provisionen für Einnahmen
*/
class IncomeProvisionSubscriber implements EventSubscriberInterface
{
protected BalanceWebmasterService $balanceWebmasterService;
/**
* IncomeProvisionSubscriber constructor.
*/
public function __construct(BalanceWebmasterService $balanceWebmasterService)
{
$this->balanceWebmasterService = $balanceWebmasterService;
}
public static function getSubscribedEvents(): array
{
return [
BalanceWebmasterProvisionCreatedEvent::class => [
['createProvisionOnBalanceWebmasterProvision', 0],
],
BalanceAmateurProvisionCreatedEvent::class => [
['createProvisionOnBalanceAmateurProvision', 0],
],
PaymentReleasedEvent::class => [
['onOnHoldPaymentReleased', 0],
],
];
}
protected function getService(): BalanceWebmasterService
{
return $this->balanceWebmasterService;
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function createProvisionOnBalanceWebmasterProvision(BalanceWebmasterProvisionCreatedEvent $event)
{
$income = $event->getBalance();
if (BalanceType::INCOME !== $income->getType()) {
return;
}
$originWebmaster = $income->getWebmaster();
$advertisedBy = $originWebmaster->getAccount()->getAdvertisedBy();
// webmaster. who received a provision (origin), was not advertised by -another- webmaster
if (!$advertisedBy) {
return;
}
$service = $this->getService();
$provision = $service->createProvisionForWebmasterByBalanceWebmaster($advertisedBy, $income);
$service->storeEntity($provision);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function createProvisionOnBalanceAmateurProvision(BalanceAmateurProvisionCreatedEvent $event)
{
$income = $event->getBalance();
if (BalanceType::INCOME !== $income->getType()) {
return;
}
$amateur = $income->getMember();
$webmaster = $amateur->getAccount()->getAdvertisedBy();
if (!$webmaster) {
return;
}
$service = $this->getService();
$provision = $service->createProvisionForWebmasterByBalanceAmateur($webmaster, $income);
$service->storeEntity($provision);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onOnHoldPaymentReleased(PaymentReleasedEvent $event)
{
$payment = $event->getPayment();
if ($payment->getOnHold() || AdminBonusMethod::NAME == $payment->getMethod()) {
return;
}
if ($webmaster = $payment->getAccount()->getAdvertisedBy()) {
$service = $this->getService();
$income = $service->createProvisionForWebmasterByPayment($webmaster, $payment);
$service->storeBalanceWebmaster($income);
}
}
}