public function testCreate() { $coupon = $this->dummyData->getCoupon(); $cartPriceRule = $this->dummyData->getCartPriceRule(); $taxRate = $this->dummyData->getTaxRate(); $cartTotal = new CartTotal(); $cartTotal->origSubtotal = 1; $cartTotal->subtotal = 2; $cartTotal->taxSubtotal = 3; $cartTotal->discount = 4; $cartTotal->shipping = 5; $cartTotal->shippingDiscount = 6; $cartTotal->tax = 7; $cartTotal->total = 8; $cartTotal->savings = 9; $cartTotal->coupons = [$coupon]; $cartTotal->addCartPriceRule($cartPriceRule); $cartTotal->taxRate = $taxRate; $this->assertTrue($cartTotal instanceof CartTotal); $this->assertSame(1, $cartTotal->origSubtotal); $this->assertSame(2, $cartTotal->subtotal); $this->assertSame(3, $cartTotal->taxSubtotal); $this->assertSame(4, $cartTotal->discount); $this->assertSame(5, $cartTotal->shipping); $this->assertSame(6, $cartTotal->shippingDiscount); $this->assertSame(7, $cartTotal->tax); $this->assertSame(8, $cartTotal->total); $this->assertSame(9, $cartTotal->savings); $this->assertSame($taxRate, $cartTotal->taxRate); $this->assertSame($coupon, $cartTotal->coupons[0]); $this->assertSame($cartPriceRule, $cartTotal->getCartPriceRules()[0]); }
private function calculateCartPriceRules() { foreach ($this->pricing->getCartPriceRules() as $cartPriceRule) { if ($cartPriceRule->isValid($this->pricing->getDate(), $this->cart->getCartItems())) { $numberTimesToApply = $cartPriceRule->numberTimesToApply($this->cart->getCartItems()); foreach ($cartPriceRule->getCartPriceRuleDiscounts() as $discount) { $price = $this->pricing->getPrice($discount->getProduct(), $discount->getQuantity()); $discountValue = $price->quantityPrice; $discountValue *= $numberTimesToApply; $this->cartTotal->discount += $discountValue; if ($cartPriceRule->getReducesTaxSubtotal() and $discount->getProduct()->isTaxable()) { $this->cartTotal->taxSubtotal -= $discountValue; } $this->cartTotal->addCartPriceRule($cartPriceRule); } } } // No subtotal below zero! $this->cartTotal->subtotal = max(0, $this->cartTotal->subtotal); }
public function testGetTotalWithCartPriceRulesAndReducesTaxSubtotal() { $productShirt = new Product(); $productShirt->setSku('TS-NAVY-LG'); $productShirt->setName('Navy T-shirt (large)'); $productShirt->setUnitPrice(1200); $productShirt->setIsTaxable(true); $productPoster = new Product(); $productPoster->setSku('PST-CKN'); $productPoster->setName('Citizen Kane (1941) Poster'); $productPoster->setUnitPrice(500); $productPoster->setIsTaxable(true); $cartPriceRule = new CartPriceRule(); $cartPriceRule->setName('Buy a Shirt get a FREE poster'); $cartPriceRule->addItem(new CartPriceRuleProductItem($productShirt, 1)); $cartPriceRule->addItem(new CartPriceRuleProductItem($productPoster, 1)); $cartPriceRule->addDiscount(new CartPriceRuleDiscount($productPoster, 1)); $cartPriceRule->setReducesTaxSubtotal(true); $pricing = new Pricing(); $pricing->setCartPriceRules([$cartPriceRule]); $cartItem1 = new CartItem(); $cartItem1->setProduct($productShirt); $cartItem1->setQuantity(1); $cartItem2 = new CartItem(); $cartItem2->setProduct($productPoster); $cartItem2->setQuantity(1); $taxRate = new TaxRate(); $taxRate->setZip5(92606); $taxRate->setRate(8.0); $taxRate->setApplyToShipping(false); $cart = new Cart(); $cart->addCartItem($cartItem1); $cart->addCartItem($cartItem2); $cart->setTaxRate($taxRate); $expectedCartTotal = new CartTotal(); $expectedCartTotal->origSubtotal = 1700; $expectedCartTotal->subtotal = 1700; $expectedCartTotal->taxSubtotal = 1200; $expectedCartTotal->shipping = 0; $expectedCartTotal->discount = 500; $expectedCartTotal->tax = 96; $expectedCartTotal->total = 1296; $expectedCartTotal->savings = 500; $expectedCartTotal->addCartPriceRule($cartPriceRule); $expectedCartTotal->taxRate = $taxRate; $cartCalculator = new CartCalculator($pricing); $this->assertEquals($expectedCartTotal, $cartCalculator->getTotal($cart)); }