/**
  * @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);
 }
Example #3
0
 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;
 }
Example #4
0
 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));
 }
Example #5
0
 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);
 }
Example #6
0
 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));
 }