<?php
namespace App\Subscriber\Balance\Webmaster;
use App\Dictionary\BalanceType;
use App\Dictionary\PaymentType;
use App\Event\Balance\BalanceAmateurProvisionCreatedEvent;
use App\Event\Payment\PaymentCreatedEvent;
use App\Service\Payment\PaymentService;
use App\Service\Webmaster\BalanceWebmasterService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SettlementProvisionSubscriber implements EventSubscriberInterface
{
protected BalanceWebmasterService $balanceWebmasterService;
protected PaymentService $paymentService;
/**
* ChargebackProvisionSubscriber constructor.
*/
public function __construct(BalanceWebmasterService $balanceWebmasterService, PaymentService $paymentService)
{
$this->balanceWebmasterService = $balanceWebmasterService;
$this->paymentService = $paymentService;
}
public static function getSubscribedEvents(): array
{
return [
PaymentCreatedEvent::class => [
['settleWebmasterProvision', 0],
],
BalanceAmateurProvisionCreatedEvent::class => [
['settleWebmasterProvisionOnAmateurProvision', 0],
],
];
}
protected function getService(): BalanceWebmasterService
{
return $this->balanceWebmasterService;
}
protected function getPaymentService(): PaymentService
{
return $this->paymentService;
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function settleWebmasterProvision(PaymentCreatedEvent $event)
{
$settlement = $event->getPayment();
if (PaymentType::SETTLEMENT !== $settlement->getType()) {
return;
}
// Bei Teilzahlungen nach Chargebacks keine Provision, erst bei komplettem Ausgleich
if (0 == $this->getPaymentService()->getOpenBookingAmountByPayment($settlement)) {
$account = $settlement->getAccount();
$webmaster = $account->getAdvertisedBy();
if ($webmaster) {
$service = $this->getService();
$balance = $service->createProvisionByWebmaster($webmaster, BalanceType::SETTLEMENT);
$balance->setAmount($settlement->getAmount() * $webmaster->getProvisionPercent() / 100);
$balance->setPayment($settlement);
$service->storeBalanceWebmaster($balance);
}
}
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function settleWebmasterProvisionOnAmateurProvision(BalanceAmateurProvisionCreatedEvent $event)
{
$provisionSettlement = $event->getBalance();
if (BalanceType::SETTLEMENT !== $provisionSettlement->getType()) {
return;
}
$amateur = $provisionSettlement->getMember();
if (!$amateur->getAccount()->getAdvertisedBy()) {
return;
}
$service = $this->getService();
$advertiser = $amateur->getAccount()->getAdvertisedBy();
$settlement = $service->createProvisionByWebmaster($advertiser, BalanceType::SETTLEMENT);
$settlement->getBalanceDetail()->setSeller($amateur);
$amount = $provisionSettlement->getAmount() * $advertiser->getAmateurProvisionPercent() / 100;
$settlement->setAmount($amount);
if ($provisionSettlement->getPayment()) {
$settlement->setPayment($provisionSettlement->getPayment());
}
$service->storeEntity($settlement);
}
}