<?php
namespace App\Subscriber\Payment;
use App\Event\Payment\PaymentReleasedEvent;
use App\Event\User\PhoneNumberConfirmedEvent;
use App\Service\Payment\PaymentService;
use App\Service\User\BalanceMemberService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PaymentReleasedSubscriber implements EventSubscriberInterface
{
protected BalanceMemberService $service;
protected PaymentService $paymentService;
public function __construct(BalanceMemberService $balanceMemberService, PaymentService $paymentService)
{
$this->service = $balanceMemberService;
$this->paymentService = $paymentService;
}
public static function getSubscribedEvents(): array
{
return [
PaymentReleasedEvent::class => [
['onOnHoldPaymentReleased', 0],
],
PhoneNumberConfirmedEvent::class => [
['releaseWhenPhoneNumberConfirmed', 0],
],
];
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onOnHoldPaymentReleased(PaymentReleasedEvent $event)
{
$payment = $event->getPayment();
if ($payment->getOnHold()) {
return;
}
$member = $payment->getAccount()->getMember();
$balance = $this->service->createIncomeForMember($member);
$balance->setPayment($payment);
if ($process = $payment->getPaymentProcess()) {
$coins = $process->getTariffObject()->getTotalCoins();
} else {
$coins = $payment->getAmount() * 100;
$details = $payment->getDetails(true);
if (is_array($details) && isset($details['overrideCoins'])) {
$coins = (int) $details['overrideCoins'];
}
}
$balance->setAmount($coins);
$this->service->storeBalanceMember($balance);
}
public function releaseWhenPhoneNumberConfirmed(PhoneNumberConfirmedEvent $event)
{
$member = $event->getPhoneNumber()->getMember();
$payments = $this->paymentService->findOnHoldPayments($member->getAccount());
foreach ($payments as $payment) {
$this->paymentService->releaseOnHoldPayment($payment);
}
}
}