/** * @return static */ public function withProductQuantityDiscounts() { $productQuantityDiscounts = $this->entity->getProductQuantityDiscounts(); if ($productQuantityDiscounts !== null) { foreach ($productQuantityDiscounts as $productQuantityDiscount) { $this->entityDTO->productQuantityDiscounts[] = $this->dtoBuilderFactory->getProductQuantityDiscountDTOBuilder($productQuantityDiscount)->build(); } } return $this; }
private function calculateCatalogPromotions() { foreach ($this->pricing->getCatalogPromotions() as $catalogPromotion) { if ($catalogPromotion->isValid($this->pricing->getDate(), $this->product)) { $this->price->unitPrice = $catalogPromotion->getUnitPrice($this->price->unitPrice); $this->price->addCatalogPromotion($catalogPromotion); } } // No prices below zero! $this->price->unitPrice = max(0, $this->price->unitPrice); }
public static function add(Price $a, Price $b) { $price = clone $a; $price->unitPrice += $b->unitPrice; $price->origUnitPrice += $b->origUnitPrice; $price->quantityPrice += $b->quantityPrice; $price->origQuantityPrice += $b->origQuantityPrice; foreach ($b->getCatalogPromotions() as $catalogPromotion) { $price->addCatalogPromotion($catalogPromotion); } foreach ($b->getProductQuantityDiscounts() as $productQuantityDiscount) { $price->addProductQuantityDiscount($productQuantityDiscount); } return $price; }
public function testAddPreventsDuplicates() { $catalogPromotion = $this->dummyData->getCatalogPromotion(); $productQuantityDiscount = $this->dummyData->getProductQuantityDiscount(); $one = new Price(); $one->addCatalogPromotion($catalogPromotion); $one->addProductQuantityDiscount($productQuantityDiscount); $two = new Price(); $two->addCatalogPromotion($catalogPromotion); $two->addProductQuantityDiscount($productQuantityDiscount); $three = new Price(); $three->unitPrice = 0; $three->origUnitPrice = 0; $three->quantityPrice = 0; $three->origQuantityPrice = 0; $three->addCatalogPromotion($catalogPromotion); $three->addProductQuantityDiscount($productQuantityDiscount); $this->assertEquals($three, Price::add($one, $two)); }
private function setDiscountNames() { $discountNames = []; foreach ($this->price->getCatalogPromotions() as $catalogPromotion) { $this->addCatalogPromotion($catalogPromotion); $discountNames[] = $catalogPromotion->getName(); } foreach ($this->price->getProductQuantityDiscounts() as $productQuantityDiscount) { $this->addProductQuantityDiscount($productQuantityDiscount); $discountNames[] = $productQuantityDiscount->getName(); } $this->discountNames = implode(', ', $discountNames); }
public function getPrice(PricingInterface $pricing) { $price = $this->getProduct()->getPrice($pricing, $this->getQuantity()); foreach ($this->getCartItemOptionProducts() as $cartItemOptionProduct) { $optionPrice = $cartItemOptionProduct->getPrice($pricing, $this->getQuantity()); $price = Price::add($price, $optionPrice); } foreach ($this->getCartItemOptionValues() as $cartItemOptionValue) { $optionPrice = $cartItemOptionValue->getPrice($this->getQuantity()); $price = Price::add($price, $optionPrice); } // No price for cartItemTextOptionValues return $price; }
public function testGetPriceWithProductQuantityDiscountPercent() { $product = new Product(); $product->setUnitPrice(500); $productQuantityDiscount6 = new ProductQuantityDiscount($product); $productQuantityDiscount6->setType(PromotionType::percent()); $productQuantityDiscount6->setQuantity(6); $productQuantityDiscount6->setValue(5); $productQuantityDiscount12 = new ProductQuantityDiscount($product); $productQuantityDiscount12->setType(PromotionType::percent()); $productQuantityDiscount12->setQuantity(12); $productQuantityDiscount12->setValue(30); $productQuantityDiscount24 = new ProductQuantityDiscount($product); $productQuantityDiscount24->setType(PromotionType::percent()); $productQuantityDiscount24->setQuantity(24); $productQuantityDiscount24->setValue(35); $productQuantityDiscounts = $product->getProductQuantityDiscounts(); $this->pricing->setProductQuantityDiscounts($productQuantityDiscounts); $expectedPrice = new Price(); $expectedPrice->unitPrice = 500; $expectedPrice->origUnitPrice = 500; $expectedPrice->quantityPrice = 500; $expectedPrice->origQuantityPrice = 500; $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 1)); $expectedPrice = new Price(); $expectedPrice->unitPrice = 475; $expectedPrice->origUnitPrice = 500; $expectedPrice->quantityPrice = 2850; $expectedPrice->origQuantityPrice = 3000; $expectedPrice->addProductQuantityDiscount($productQuantityDiscount6); $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 6)); $expectedPrice = new Price(); $expectedPrice->unitPrice = 350; $expectedPrice->origUnitPrice = 500; $expectedPrice->quantityPrice = 4200; $expectedPrice->origQuantityPrice = 6000; $expectedPrice->addProductQuantityDiscount($productQuantityDiscount12); $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 12)); $expectedPrice = new Price(); $expectedPrice->unitPrice = 325; $expectedPrice->origUnitPrice = 500; $expectedPrice->quantityPrice = 7800; $expectedPrice->origQuantityPrice = 12000; $expectedPrice->addProductQuantityDiscount($productQuantityDiscount24); $this->assertEquals($expectedPrice, $this->pricingCalculator->getPrice($product, 24)); }