$compare2 = new Cart\DiscountConditionCompare(); $compare2->setOp('or')->setSourceEntityType('items')->addCondition($condition2); //create 'container' for conditions $compare3 = new Cart\DiscountConditionCompare(); $compare3->setOp('and')->setSourceEntityType('items')->addCondition($condition3)->addCondition($condition4); //create the discount, but don't add the discount unless the conditions are met //in this example, there is only a target criteria; no pre-requisite criteria $discountA = new Cart\Discount(); $discountA->setId(1)->setName('Free UPS Ground')->setValue('1.00')->setAs(Cart\Discount::$asPercent)->setIsPreTax(true)->setTo(Cart\Discount::$toSpecified)->setTargetConditionCompare($compare1); // Buy 2 ToothBrush, Get 1 ToothPaste free $discountB = new Cart\Discount(); $discountB->setId(2)->setName('Buy 2 ToothBrush, Get 1 ToothPaste free')->setTo(Cart\Discount::$toSpecified)->setValue('1.00')->setMaxQty(1)->setIsMaxPerItem(false)->setAs(Cart\Discount::$asPercent)->setIsPreTax(true)->setPreConditionCompare($compare3)->setTargetConditionCompare($compare2); //apply the automatic discount, if pre-conditions validate if ($compare1->isValid($shipmentA)) { $discountA->setShipment($shipmentA); $cart->setDiscount($discountA); } //check pre-conditions and target conditions if ($compare3->isValid($itemA) && $compare2->isValid($itemB)) { $discountB->setItem($itemB); $cart->setDiscount($discountB); } echo print_r($cart->getTotals(), 1); echo "==============" . PHP_EOL; echo print_r($cart->getDiscountedTotals(), 1); echo print_r($cart->getDiscountGrid()); $cart2 = new Cart\Cart(); $cart2->importJson($cart->toJson()); echo "\n{$cart2}\n"; echo print_r($cart2->getTotals(), 1); echo print_r($cart2->getDiscountedTotals(), 1);