<?phpnamespace App\Utils\Shipping\ShippingCosts\Service;use App\Entity\Gos\PortalSettings;use Symfony\Component\HttpFoundation\RequestStack;class FreeShippingChecker{ private $request; public function __construct(RequestStack $requestStack) { $this->request = $requestStack->getCurrentRequest(); } public function checkFreeShippingBasedOnPortal(&$price, &$totalShippingCosts, $portal, $skipPortalDiscount = false): void { if ($portal instanceof PortalSettings) { $price['missingPriceForPortalFreeShipping'] = null; $price['missingPriceForPortalFreeShippingType'] = 'brutto'; $price['enabledFreePostalCostByPortal'] = false; $priceAfterFreePostageCost = $this->getPriceAfterFreePostageCost($portal); if ($priceAfterFreePostageCost !== null && ( (isset($totalShippingCosts['net']) && $totalShippingCosts['net'] > 0) || (isset($totalShippingCosts['PostageCostNet']) && $totalShippingCosts['PostageCostNet'] > 0) ) && $skipPortalDiscount === false ) { $price['enabledFreePostalCostByPortal'] = true; if (!$portal->getShowGrossPrice()) { $priceToCheck = $price['totalPriceAfterCouponNet']; $price['missingPriceForPortalFreeShippingType'] = 'netto'; } else { $priceToCheck = $price['totalPriceAfterCouponGross']; } if ($priceToCheck >= $priceAfterFreePostageCost) { if (isset($totalShippingCosts['net'])) { $totalShippingCosts['net'] = $this->setFreeShippingCost($portal, 'net'); $totalShippingCosts['gross'] = $this->setFreeShippingCost($portal, 'gross'); } else { $totalShippingCosts['PostageCostNet'] = $this->setFreeShippingCost($portal, 'net'); $totalShippingCosts['PostageCostGross'] = $this->setFreeShippingCost($portal, 'gross'); } } else { $price['missingPriceForPortalFreeShipping'] = round($priceAfterFreePostageCost - $priceToCheck, 2); } } } } private function getPriceAfterFreePostageCost(PortalSettings $portal): ?float { $priceAfterFreePostageCost = $portal->getPriceAfterFreePostageCost(); //START A/B TESTS if ($this->request !== null && $this->request->getSession()->get('lab') === 'dlvr') { $priceAfterFreePostageCost = $portal->getTestPriceAfterFreePostageCost(); } //END OF A/B TESTS return $priceAfterFreePostageCost; } /** * Free shipping on CMS is not as free as it might seem * * @return void * @throws \Exception */ private function setFreeShippingCost(PortalSettings $portalSettings, string $type): float { if (!$portalSettings->getIsCmsPortal()) { return 0; } switch ($type) { case 'net': return 1; case 'gross': return 1.23; default: return 0; } }}