Source of file ProductDataExtension.php
Size: 3,632 Bytes - Last Modified: 2021-12-24T06:46:11+00:00
/var/www/docs.ssmods.com/process/src/src/Extension/ProductDataExtension.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | <?php namespace Dynamic\Foxy\Discounts\Extension; use Dynamic\Foxy\Discounts\DiscountHelper; use Dynamic\Foxy\Discounts\Model\Discount; use SilverStripe\ORM\DataExtension; use SilverStripe\ORM\HasManyList; /** * Class ProductDataExtension * @package Dynamic\Foxy\Discounts\Extension */ class ProductDataExtension extends DataExtension { /** * @var DiscountHelper */ private $best_discount; /** * @var array */ private static $belongs_many_many = [ 'Discounts' => Discount::class, ]; /** * @return mixed */ private function getDiscountsList() { $list = Discount::get()->filter([ 'StartTime:LessThanOrEqual' => date("Y-m-d H:i:s", strtotime('now')), 'EndTime:GreaterThanOrEqual' => date("Y-m-d H:i:s", strtotime('now')), ]); $strict = $list->filter([ 'Products.Count():GreaterThan' => 0, 'Products.ID' => $this->owner->ID, ]); $global = $list->filter('Products.Count()', 0); $merge = array_merge(array_values($strict->column()), array_values($global->column())); return (!empty($merge)) ? Discount::get()->byIDs($merge) : null; } /** * @param int $quantity * @param null $optionKey * @return $this */ public function setBestDiscount($quantity = 1, $optionKey = null) { /** @var HasManyList $filtered */ if ($filtered = $this->getDiscountsList()) { $filtered = $filtered->filter('DiscountTiers.Quantity:LessThanOrEqual', $quantity); if ($filtered->count() == 1) { $this->best_discount = DiscountHelper::create($this->owner, $filtered->first(), $optionKey); return $this; } $bestDiscount = null; /** @var Discount $discount */ foreach ($filtered as $discount) { if ($bestDiscount === null) { $bestDiscount = DiscountHelper::create($this->owner, $discount, $optionKey); continue; } $testDiscount = DiscountHelper::create($this->owner, $discount, $optionKey); $bestDiscount = (float)$bestDiscount->getDiscountedPrice() > (float)$testDiscount->getDiscountedPrice() ? $testDiscount : $bestDiscount; } $this->best_discount = $bestDiscount; } else { $this->best_discount = null; } return $this; } /** * @return DiscountHelper */ public function getBestDiscount() { //if (!$this->best_discount) { $this->setBestDiscount(); //} return $this->best_discount; } /** * @param int $quantity * @param null $optionKey * @return bool|mixed */ public function getDiscountPrice($quantity = 1, $optionKey = null) { if ($discount = $this->getBestDiscount()) { return $discount->getDiscountedPrice(); } return false; } /** * @return bool */ public function getHasDiscount() { if ($discount = $this->getBestDiscount()) { $discount = $discount->getDiscount(); $restrictions = $discount->hasMethod('getRestrictions') ? $discount->getRestrictions() : []; return $this->getBestDiscount() instanceof DiscountHelper && (empty($restrictions) || in_array($this->owner->ID, $restrictions)); } return false; } } |