<?php
namespace App\Subscriber\Payment\Purchase;
use App\Dictionary\BalanceType;
use App\Dictionary\PaymentType;
use App\Event\Payment\PurchaseCreatedEvent;
use App\Service\Amateur\BalanceAmateurService;
use App\Service\Payment\PaymentService;
use App\Service\User\BalanceMemberService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PurchaseBalanceAmateurSubscriber implements EventSubscriberInterface
{
protected BalanceAmateurService $service;
protected BalanceMemberService $balanceMemberService;
protected PaymentService $paymentService;
/**
* PurchaseBalanceAmateurSubscriber constructor.
*/
public function __construct(BalanceAmateurService $service, BalanceMemberService $balanceMemberService,
PaymentService $paymentService)
{
$this->service = $service;
$this->balanceMemberService = $balanceMemberService;
$this->paymentService = $paymentService;
}
public static function getSubscribedEvents(): array
{
return [
PurchaseCreatedEvent::class => [
['onPurchaseCreateBalanceAmateur', 0],
],
];
}
/**
* @throws \App\Exception\Commission\NotAnAmateurException
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onPurchaseCreateBalanceAmateur(PurchaseCreatedEvent $event)
{
if ($event->getPurchasable()->useDelayedProvision()) {
return;
}
$purchase = $event->getPurchase();
$seller = $purchase->getSeller();
if (!$seller || !$seller->getIsAmateur()) {
return;
}
$balances = $this->balanceMemberService->findByIds($purchase->getBalanceMember());
foreach ($balances as $balanceMember) {
$income = $this->service->createProvisionForAmateurByBalanceMember($seller, $balanceMember);
// triggers event
$this->service->storeBalanceAmateur($income);
if ($payment = $balanceMember->getPayment()) {
$latest = $this->paymentService->getLatestItemByPayment($payment);
if ($latest && $latest->isType(PaymentType::CHARGEBACK)) {
$cb = $this->service->createProvisionByAmateur($income->getMember(), BalanceType::CHARGEBACK);
$cb->setBalanceDetail($income->getBalanceDetail());
$cb->setAmount($income->getAmount() * -1);
$cb->setPayment($latest);
$this->service->storeBalanceAmateur($cb);
}
}
}
$purchase->setProvisionAssigned(true);
$this->service->storeEntity($purchase);
}
}