<?php
/*
* This file has been created by developers from BitBag.
* Feel free to contact us once you face any issues or want to start
* You can find more information about us on https://bitbag.io and write us
* an email on hello@bitbag.io.
*/
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Order\EventListener;
use BitBag\OpenMarketplace\Component\Order\CommissionCalculator\VendorCommissionCalculatorInterface;
use BitBag\OpenMarketplace\Component\Order\Entity\OrderInterface;
use BitBag\OpenMarketplace\Component\Order\Event\PostSplitOrderEvent;
final class CalculateOrderCommissionListener
{
public function __construct(
private iterable $commissionCalculators
) {
}
public function calculate(PostSplitOrderEvent $event): void
{
foreach ($event->getOrders() as $order) {
$commission = $this->calculateCommission($order);
$order->setCommissionTotal($commission);
}
$primaryOrder = $event->getPrimaryOrder();
if ($primaryOrder->isPrimary()) {
$primaryOrder->recalculateCommissionTotal();
}
}
private function calculateCommission(OrderInterface $order): int
{
/** @var VendorCommissionCalculatorInterface $commissionCalculator */
foreach ($this->commissionCalculators as $commissionCalculator) {
if ($commissionCalculator->supports($order)) {
return $commissionCalculator->calculate($order);
}
}
throw new \RuntimeException(sprintf(
'No commission calculator found for order %s with mode %s',
$order->getId(),
$order->getMode()
));
}
}