src/Subscriber/Balance/SettlementProvisionSubscriber.php line 51

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\Balance;
  3. use App\Dictionary\BalanceType;
  4. use App\Dictionary\PaymentType;
  5. use App\Event\Payment\PaymentCreatedEvent;
  6. use App\Service\Amateur\BalanceAmateurService;
  7. use App\Service\Payment\PaymentService;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. class SettlementProvisionSubscriber implements EventSubscriberInterface
  10. {
  11.     protected BalanceAmateurService $balanceAmateurService;
  12.     protected PaymentService $paymentService;
  13.     /**
  14.      * ChargebackProvisionSubscriber constructor.
  15.      */
  16.     public function __construct(BalanceAmateurService $balanceAmateurServicePaymentService $paymentService)
  17.     {
  18.         $this->balanceAmateurService $balanceAmateurService;
  19.         $this->paymentService $paymentService;
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             PaymentCreatedEvent::class => [
  25.                 ['settleAmateurProvision'0],
  26.             ],
  27.         ];
  28.     }
  29.     protected function getBalanceAmateurService(): BalanceAmateurService
  30.     {
  31.         return $this->balanceAmateurService;
  32.     }
  33.     protected function getPaymentService(): PaymentService
  34.     {
  35.         return $this->paymentService;
  36.     }
  37.     /**
  38.      * @throws \App\Exception\Commission\NotAnAmateurException
  39.      * @throws \Doctrine\ORM\ORMException
  40.      * @throws \Doctrine\ORM\OptimisticLockException
  41.      */
  42.     public function settleAmateurProvision(PaymentCreatedEvent $event)
  43.     {
  44.         $payment $event->getPayment();
  45.         if (PaymentType::SETTLEMENT !== $payment->getType()) {
  46.             return;
  47.         }
  48.         $paymentService $this->getPaymentService();
  49.         // Bei Teilzahlungen nach Chargebacks keine Provision, erst bei komplettem Ausgleich
  50.         if (== $paymentService->getOpenBookingAmountByPayment($payment)) {
  51.             // @TODO assignAmateurProvisionByPurchase
  52.             // search for the chargeback of the initial payment
  53.             $chargeback $paymentService->getOriginalPaymentOfType($paymentPaymentType::CHARGEBACK);
  54.             if (!$chargeback) {
  55.                 return;
  56.             }
  57.             $balanceService $this->getBalanceAmateurService();
  58.             // $chargebackBalances are the (negative) amateur provisions for the original chargeback
  59.             $chargebackBalances $balanceService->getAmateurBalancesOfTypeByPayment($chargebackBalanceType::CHARGEBACK);
  60.             foreach ($chargebackBalances as $balanceAmateur) {
  61.                 $member $balanceAmateur->getMember();
  62.                 $balance $balanceService->createProvisionByAmateur($memberBalanceType::SETTLEMENT);
  63.                 $balance->setAmount($balanceAmateur->getAmount() * -1); // negate the previous provision
  64.                 $balance->setBalanceDetail($balanceAmateur->getBalanceDetail());
  65.                 $balance->setPayment($payment); // the settlement from the event
  66.                 $balanceService->storeBalanceAmateur($balance);
  67.             }
  68.         }
  69.     }
  70. }