/** * @inheritdoc */ public function calculateProduct(Struct\ListProduct $product, Struct\ProductContextInterface $context) { $tax = $context->getTaxRule($product->getTax()->getId()); $prices = []; foreach ($product->getPriceRules() as $rule) { $prices[] = $this->calculatePriceStruct($rule, $tax, $context); } $product->setPrices($prices); $rules = $product->getPriceRules(); if (!$product->getCheapestPriceRule() && !empty($rules)) { $product->setCheapestPriceRule(clone $rules[0]); } if ($product->getCheapestPriceRule()) { /** * Calculation with considering min purchase */ $rule = clone $product->getCheapestPriceRule(); $product->setCheapestPrice($this->calculateCheapestAvailablePrice($product, $rule, $context)); /** * Calculation without considering min purchase */ $rule = clone $product->getCheapestPriceRule(); $product->setCheapestUnitPrice($this->calculatePriceStruct($rule, $tax, $context)); } //add state to the product which can be used to check if the prices are already calculated. $product->addState(Struct\ListProduct::STATE_PRICE_CALCULATED); }
/** * @param ListProduct $listProduct * @param ListProduct $product */ public function assignProductData(ListProduct $listProduct, ListProduct $product) { $product->setShippingFree($listProduct->isShippingFree()); $product->setMainVariantId($listProduct->getMainVariantId()); $product->setAllowsNotification($listProduct->allowsNotification()); $product->setHighlight($listProduct->highlight()); $product->setUnit($listProduct->getUnit()); $product->setTax($listProduct->getTax()); $product->setPrices($listProduct->getPrices()); $product->setManufacturer($listProduct->getManufacturer()); $product->setCover($listProduct->getCover()); $product->setCheapestPrice($listProduct->getCheapestPrice()); $product->setName($listProduct->getName()); $product->setAdditional($listProduct->getAdditional()); $product->setCloseouts($listProduct->isCloseouts()); $product->setEan($listProduct->getEan()); $product->setHeight($listProduct->getHeight()); $product->setKeywords($listProduct->getKeywords()); $product->setLength($listProduct->getLength()); $product->setLongDescription($listProduct->getLongDescription()); $product->setMinStock($listProduct->getMinStock()); $product->setReleaseDate($listProduct->getReleaseDate()); $product->setShippingTime($listProduct->getShippingTime()); $product->setShortDescription($listProduct->getShortDescription()); $product->setStock($listProduct->getStock()); $product->setWeight($listProduct->getWeight()); $product->setWidth($listProduct->getWidth()); $product->setPriceGroup($listProduct->getPriceGroup()); $product->setCreatedAt($listProduct->getCreatedAt()); $product->setPriceRules($listProduct->getPriceRules()); $product->setCheapestPriceRule($listProduct->getCheapestPriceRule()); $product->setManufacturerNumber($listProduct->getManufacturerNumber()); $product->setMetaTitle($listProduct->getMetaTitle()); $product->setTemplate($listProduct->getTemplate()); $product->setHasConfigurator($listProduct->hasConfigurator()); $product->setSales($listProduct->getSales()); $product->setHasEsd($listProduct->hasEsd()); $product->setEsd($listProduct->getEsd()); $product->setIsPriceGroupActive($listProduct->isPriceGroupActive()); $product->setBlockedCustomerGroupIds($listProduct->getBlockedCustomerGroupIds()); $product->setVoteAverage($listProduct->getVoteAverage()); $product->setHasAvailableVariant($listProduct->hasAvailableVariant()); $product->setCheapestUnitPrice($listProduct->getCheapestUnitPrice()); $product->setFallbackPriceCount($listProduct->getFallbackPriceCount()); $product->setCustomerPriceCount($listProduct->getCustomerPriceCount()); foreach ($listProduct->getAttributes() as $name => $attribute) { $product->addAttribute($name, $attribute); } foreach ($listProduct->getStates() as $state) { $product->addState($state); } }