<?php
declare(strict_types=1);
namespace App\Shipping\Checker;
use App\Entity\Shipping\ShippingTableRate;
use Sylius\Component\Core\Model\ShipmentInterface;
use Sylius\Component\Shipping\Checker\ShippingMethodEligibilityCheckerInterface;
use Sylius\Component\Shipping\Model\ShippingMethodInterface;
use Sylius\Component\Shipping\Model\ShippingSubjectInterface;
use Webgriffe\SyliusTableRateShippingPlugin\Calculator\TableRateShippingCalculator;
use Webgriffe\SyliusTableRateShippingPlugin\Exception\RateNotFoundException;
use Webgriffe\SyliusTableRateShippingPlugin\Resolver\TableRateResolverInterface;
use Webmozart\Assert\Assert;
final class TableRateShippingMethodEligibilityChecker implements ShippingMethodEligibilityCheckerInterface{
private ShippingMethodEligibilityCheckerInterface $eligibilityChecker;
private TableRateResolverInterface $tableRateResolver;
public function __construct(
ShippingMethodEligibilityCheckerInterface $eligibilityChecker,
TableRateResolverInterface $tableRateResolver
) {
$this->eligibilityChecker = $eligibilityChecker;
$this->tableRateResolver = $tableRateResolver;
}
public function isEligible(
ShippingSubjectInterface $subject,
ShippingMethodInterface $method
): bool {
if (!$this->eligibilityChecker->isEligible($subject, $method)) {
return false;
}
if ($method->getCalculator() !== TableRateShippingCalculator::TYPE) {
return true;
}
Assert::isInstanceOf($subject, ShipmentInterface::class);
/** @var ShippingTableRate $tableRate */
$tableRate = $this->tableRateResolver->resolve($subject, $method->getConfiguration());
$value = 0;
if($tableRate->getType() === ShippingTableRate::TYPE_WEIGHT )
$value = $subject->getShippingWeight(); //weight
elseif($tableRate->getType() === ShippingTableRate::TYPE_PRICE)
$value = $subject->getOrder()->getItemsTotal(); //price
try {
$rate = $tableRate->getRate($value);
} catch (RateNotFoundException $e) {
return false;
}
return \is_int($rate);
}
}