src/Component/Order/EventListener/CalculateOrderCommissionListener.php line 25

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file has been created by developers from BitBag.
  4.  * Feel free to contact us once you face any issues or want to start
  5.  * You can find more information about us on https://bitbag.io and write us
  6.  * an email on hello@bitbag.io.
  7.  */
  8. declare(strict_types=1);
  9. namespace BitBag\OpenMarketplace\Component\Order\EventListener;
  10. use BitBag\OpenMarketplace\Component\Order\CommissionCalculator\VendorCommissionCalculatorInterface;
  11. use BitBag\OpenMarketplace\Component\Order\Entity\OrderInterface;
  12. use BitBag\OpenMarketplace\Component\Order\Event\PostSplitOrderEvent;
  13. final class CalculateOrderCommissionListener
  14. {
  15.     public function __construct(
  16.         private iterable $commissionCalculators
  17.     ) {
  18.     }
  19.     public function calculate(PostSplitOrderEvent $event): void
  20.     {
  21.         foreach ($event->getOrders() as $order) {
  22.             $commission $this->calculateCommission($order);
  23.             $order->setCommissionTotal($commission);
  24.         }
  25.         $primaryOrder $event->getPrimaryOrder();
  26.         if ($primaryOrder->isPrimary()) {
  27.             $primaryOrder->recalculateCommissionTotal();
  28.         }
  29.     }
  30.     private function calculateCommission(OrderInterface $order): int
  31.     {
  32.         /** @var VendorCommissionCalculatorInterface $commissionCalculator */
  33.         foreach ($this->commissionCalculators as $commissionCalculator) {
  34.             if ($commissionCalculator->supports($order)) {
  35.                 return $commissionCalculator->calculate($order);
  36.             }
  37.         }
  38.         throw new \RuntimeException(sprintf(
  39.             'No commission calculator found for order %s with mode %s',
  40.             $order->getId(),
  41.             $order->getMode()
  42.         ));
  43.     }
  44. }