<?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\Webmaster\BalanceWebmasterService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ChargebackProvisionSubscriber implements EventSubscriberInterface
{
protected BalanceWebmasterService $balanceWebmasterService;
/**
* ChargebackProvisionSubscriber constructor.
*/
public function __construct(BalanceWebmasterService $balanceWebmasterService)
{
$this->balanceWebmasterService = $balanceWebmasterService;
}
public static function getSubscribedEvents(): array
{
return [
PaymentCreatedEvent::class => [
['revokeWebmasterProvision', 0],
],
BalanceAmateurProvisionCreatedEvent::class => [
['revokeAdvertisedWebmasterProvisionOnChargeback', 0],
],
];
}
protected function getService(): BalanceWebmasterService
{
return $this->balanceWebmasterService;
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function revokeWebmasterProvision(PaymentCreatedEvent $event)
{
$chargeback = $event->getPayment();
if (PaymentType::CHARGEBACK !== $chargeback->getType()) {
return;
}
// account has not been advertised by a webmaster
$advertiser = $chargeback->getAccount()->getAdvertisedBy();
if (!$advertiser) {
return;
}
$service = $this->getService();
$payment = $event->getPayment();
$balance = $service->createProvisionByWebmaster($advertiser, BalanceType::CHARGEBACK);
$balance->setPayment($payment);
$balance->setAmount($payment->getAmount() * $advertiser->getProvisionPercent() / 100);
$service->storeBalanceWebmaster($balance);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function revokeAdvertisedWebmasterProvisionOnChargeback(BalanceAmateurProvisionCreatedEvent $event)
{
$provisionChargeback = $event->getBalance();
if (BalanceType::CHARGEBACK !== $provisionChargeback->getType()) {
return;
}
$amateur = $provisionChargeback->getMember()->getAccount();
if (!$amateur->getAdvertisedBy()) {
return;
}
$service = $this->getService();
$advertiser = $amateur->getAdvertisedBy();
$chargeback = $service->createProvisionByWebmaster($advertiser, BalanceType::CHARGEBACK);
$chargeback->getBalanceDetail()->setSeller($provisionChargeback->getMember());
$amount = $provisionChargeback->getAmount() * $advertiser->getAmateurProvisionPercent() / 100;
$chargeback->setAmount($amount);
if ($provisionChargeback->getPayment()) {
$chargeback->setPayment($provisionChargeback->getPayment());
}
$service->storeEntity($chargeback);
}
}