public function testInactiveCoupon() { $inactivecoupon = OrderCoupon::create(array("Title" => "Not active", "Code" => "EE891574D6", "Type" => "Amount", "Amount" => 10, "Active" => 0)); $inactivecoupon->write(); $context = array("CouponCode" => $inactivecoupon->Code); $this->assertFalse($inactivecoupon->validateOrder($this->cart, $context), "Coupon is not set to active"); }
public function testMemberGroup() { $coupon = OrderCoupon::create(array("Title" => "Special Members Coupon", "Code" => "GROUPED", "Type" => "Percent", "Percent" => 0.9, "Active" => 1, "GroupID" => $this->objFromFixture("Group", "resellers")->ID)); $coupon->write(); $context = array("CouponCode" => $coupon->Code); $this->assertFalse($coupon->validateOrder($this->cart, $context), "Invalid for memberless order"); $context = array("CouponCode" => $coupon->Code, "Member" => $this->objFromFixture("Member", "bobjones")); $this->assertTrue($coupon->validateOrder($this->othercart, $context), "Valid because member is in resellers group"); }
public function testDates() { $unreleasedcoupon = OrderCoupon::create(array("Title" => "Unreleased \$10 off", "Code" => '0444444440', "Type" => "Amount", "Amount" => 10, "StartDate" => "2200-01-01 12:00:00")); $unreleasedcoupon->write(); $context = array("CouponCode" => $unreleasedcoupon->Code); $this->assertFalse($unreleasedcoupon->validateOrder($this->cart, $context), "Coupon is un released (start date has not arrived)"); $expiredcoupon = OrderCoupon::create(array("Title" => "Save lots", "Code" => "04994C332A", "Type" => "Percent", "Percent" => 0.8, "Active" => 1, "StartDate" => "", "EndDate" => "12/12/1990")); $expiredcoupon->write(); $context = array("CouponCode" => $expiredcoupon->Code); $this->assertFalse($expiredcoupon->validateOrder($this->cart, $context), "Coupon has expired (end date has passed)"); }
public function testProductsCoupon() { $coupon = OrderCoupon::create(array("Title" => "Selected products", "Code" => "PRODUCTS", "Percent" => 0.2)); $coupon->write(); $coupon->Products()->add($this->objFromFixture("Product", "tshirt")); $calculator = new Calculator($this->placedorder, array("CouponCode" => $coupon->Code)); $this->assertEquals($calculator->calculate(), 20); //add another product to coupon product list $coupon->Products()->add($this->objFromFixture("Product", "mp3player")); $this->assertEquals($calculator->calculate(), 100); $this->markTestIncomplete("Test variations also"); }
public function testMinOrderValue() { $coupon = OrderCoupon::create(array("Title" => "Orders 200 and more", "Code" => "200PLUS", "Type" => "Amount", "Amount" => 35, "ForItems" => 0, "ForCart" => 1, "MinOrderValue" => 200)); $coupon->write(); $context = array("CouponCode" => $coupon->Code); $this->assertFalse($coupon->validateOrder($this->cart, $context), "\$8 order isn't enough"); $this->assertTrue($coupon->validateOrder($this->othercart, $context), "\$200 is enough"); $this->assertTrue($coupon->validateOrder($this->placedorder, $context), "\$500 order is enough"); $calculator = new Calculator($this->cart, $context); $this->assertEquals(0, $calculator->calculate()); $calculator = new Calculator($this->othercart, $context); $this->assertEquals(35, $calculator->calculate()); $calculator = new Calculator($this->placedorder, $context); $this->assertEquals(35, $calculator->calculate()); }
function testCouponForm() { OrderCoupon::create(array("Title" => "40% off each item", "Code" => "5B97AA9D75", "Type" => "Percent", "Percent" => 0.4))->write(); $checkoutpage = $this->objFromFixture("CheckoutPage", "checkout"); $checkoutpage->publish("Stage", "Live"); $controller = new CheckoutPage_Controller($checkoutpage); $order = $this->objFromFixture("Order", "cart"); $form = new CouponForm($controller, "CouponForm", $order); $data = array("Code" => "5B97AA9D75"); $form->loadDataFrom($data); $this->assertTrue($form->validate()); $form->applyCoupon($data, $form); $this->assertEquals("5B97AA9D75", Session::get("cart.couponcode")); $form->removeCoupon(array(), $form); }
public function generate($data, $form) { $count = 1; if (isset($data['Number']) && is_numeric($data['Number'])) { $count = (int) $data['Number']; } $prefix = isset($data['Prefix']) ? $data['Prefix'] : ""; $length = isset($data['Length']) ? (int) $data['Length'] : 10; for ($i = 0; $i < $count; $i++) { $coupon = new OrderCoupon(); $form->saveInto($coupon); $coupon->Code = OrderCoupon::generate_code(OrderCoupon::config()->generated_code_length, $prefix); $coupon->write(); } $this->redirect($this->Link()); }
public function testZoneDiscount() { $coupon = OrderCoupon::create(array("Title" => "Zoned Coupon", "Type" => "Percent", "Percent" => 0.16)); $coupon->write(); $coupon->Zones()->add($this->objFromFixture('Zone', 'transtasman')); $coupon->Zones()->add($this->objFromFixture('Zone', 'special')); $address = $this->objFromFixture("Address", 'bukhp193eq'); $context = array("CouponCode" => $coupon->Code); $this->cart->ShippingAddressID = $address->ID; //set address $this->assertFalse($coupon->validateOrder($this->cart, $context), "check order is out of zone"); $address = $this->objFromFixture("Address", 'sau5024'); $this->othercart->ShippingAddressID = $address->ID; //set address $valid = $coupon->validateOrder($this->othercart, $context); $this->assertTrue($valid, "check order is in zone"); }
public function validateData(Order $order, array $data) { $result = new ValidationResult(); $code = $data['Code']; if ($this->validwhenblank && !$code) { return $result; } //check the coupon exists, and can be used if ($coupon = OrderCoupon::get_by_code($code)) { if (!$coupon->validateOrder($order, array("CouponCode" => $code))) { $result->error($coupon->getMessage(), "Code"); throw new ValidationException($result); } } else { $result->error(_t("OrderCouponModifier.NOTFOUND", "Coupon could not be found"), "Code"); throw new ValidationException($result); } return $result; }
public function add_coupon() { $request = $this->application->getRequest(); $code = $request->get('couponCode'); $orderID = $request->get('orderID'); $response = new LiveCartSimpleXMLElement('<response datetime="' . date('c') . '"></response>'); if (strlen($code)) { $order = CustomerOrder::getInstanceByID($orderID, CustomerOrder::LOAD_DATA); $condition = DiscountCondition::getInstanceByCoupon($code); if ($condition) { if (!$order->hasCoupon($code)) { $coupon = OrderCoupon::getNewInstance($order, $code); $coupon->save(); $order->getCoupons(true); if ($order->hasCoupon($code)) { $order->loadAll(); $order->getTotal(true); $order->totalAmount->set($order->getTotal(true)); $order->getTaxAmount(); $order->save(); $response->addChild('message', 'Coupon ' . $code . ' was successfully added'); } else { throw new Exception("Cant add coupon " . $code); } } else { throw new Exception("The coupon " . $code . " already added"); } } else { throw new Exception("Cant add coupon " . $code); } $order->getCoupons(true); } else { throw new Exception("Incorrect coupon code" . $code); } return new SimpleXMLResponse($response); }
/** * @param array $coupons * @return bool */ public function applyCoupons(array $coupons) { if (!$this->isCouponsAvailable()) { return true; } $coupons = $this->getValidCoupons($coupons); $transaction = Yii::app()->getDb()->beginTransaction(); try { foreach ($coupons as $coupon) { $model = new OrderCoupon(); $model->setAttributes(['order_id' => $this->id, 'coupon_id' => $coupon->id, 'create_time' => new CDbExpression('NOW()')]); $model->save(); $coupon->decreaseQuantity(); } $this->coupon_discount = $this->getCouponDiscount($coupons); $this->delivery_price = $this->getDeliveryCost(); $this->update(['coupon_discount', 'delivery_price']); $transaction->commit(); return true; } catch (Exception $e) { $transaction->rollback(); return false; } }
public function addCoupon() { ClassLoader::import('application.model.discount.DiscountCondition'); $response = $this->getRequest(); $code = $this->request->get('coupon'); $msg = '_coupon_not_found'; $error = true; if (strlen($code)) { $order = CustomerOrder::getInstanceByID($response->get('id'), CustomerOrder::LOAD_DATA); $condition = DiscountCondition::getInstanceByCoupon($code); if ($condition) { if (!$order->hasCoupon($code)) { $coupon = OrderCoupon::getNewInstance($order, $code); $coupon->save(); $order->getCoupons(true); if ($order->hasCoupon($code)) { $msg = '_coupon_added'; $this->recalculateDiscounts(); $error = false; } else { $msg = '_cant_add_coupon'; } } else { $msg = '_coupon_already_added'; } } $order->getCoupons(true); } $this->loadLanguageFile('Order'); return new JSONResponse(null, $error ? 'failure' : 'success', $this->makeText($msg, array($code))); }
public function testLimitedCoupon() { $code = 'unit test coupon'; $condition = DiscountCondition::getNewInstance(); $condition->isEnabled->set(true); $condition->couponCode->set($code); $condition->couponLimitCount->set(1); $condition->save(); $someUser = User::getNewInstance('discount...condition@test'); $someUser->save(); $this->order->addProduct($this->product1, 1, true); $this->order->save(); OrderCoupon::getNewInstance($this->order, $code)->save(); $this->assertEquals(1, $this->order->getCoupons(true)->size()); $this->order->save(); $this->order->finalize(); $newOrder = CustomerOrder::getNewInstance($someUser); $newOrder->addProduct($this->product1, 1, true); $newOrder->save(); OrderCoupon::getNewInstance($newOrder, $code)->save(); $newOrder->getCoupons(true); $this->assertEquals(0, $newOrder->getCoupons(true)->size()); // increase limit - will pass $condition->couponLimitCount->set(2); OrderCoupon::getNewInstance($newOrder, $code)->save(); $this->assertEquals(1, $newOrder->getCoupons(true)->size()); // remove coupon $condition->couponLimitCount->set(1); $this->assertEquals(0, $newOrder->getCoupons(true)->size()); // change limit type to per user and change order user $otherUser = User::getNewInstance('discount...otheruser@test'); $otherUser->save(); $newOrder->user->set($otherUser); $condition->couponLimitCount->set(1); $condition->couponLimitType->set(DiscountCondition::COUPON_LIMIT_USER); OrderCoupon::getNewInstance($newOrder, $code)->save(); $this->assertEquals(1, $newOrder->getCoupons(true)->size()); }
/** * @return string */ public function getNumberUsagesByUser($userId) { return OrderCoupon::model()->with(['order'])->count('t.coupon_id = :id and order.user_id = :user_id', [':id' => $this->id, 'user_id' => (int) $userId]); }
function testCouponAndDiscountItemLevel() { OrderDiscount::create(array("Title" => "10% off", "Type" => "Percent", "Percent" => 0.1))->write(); OrderCoupon::create(array("Title" => "\$10 off each item", "Code" => "TENDOLLARSOFF", "Type" => "Amount", "Amount" => 10))->write(); //total discount calculation //20 * socks($8) = 160 ...$10 off each ($8max) = 160 //10 * tshirt($25) = 250 ..$10 off each = 100 //2 * mp3player($200) = 400 ..10% off each = 40 //total discount: 300 $calculator = new Calculator($this->megacart, array('CouponCode' => 'TENDOLLARSOFF')); $this->assertEquals(300, $calculator->calculate(), "complex savings example"); //no coupon in context $calculator = new Calculator($this->megacart); $this->assertEquals(81, $calculator->calculate(), "complex savings example"); //write a test that combines discounts which sum to a greater discount than //the order subtotal }
/** * Update product quantities */ public function update() { // TOS if ($this->isTosInCartPage()) { $this->session->set('tos', $this->request->get('tos')); } // coupon code if ($this->request->get('coupon')) { $code = $this->request->get('coupon'); if ($condition = DiscountCondition::getInstanceByCoupon($code)) { if (!$this->order->hasCoupon($code)) { $coupon = OrderCoupon::getNewInstance($this->order, $code); $coupon->save(); $this->order->getCoupons(true); if ($this->order->hasCoupon($code)) { $this->setMessage($this->makeText('_coupon_added', array($code))); } } } else { $this->setErrorMessage($this->makeText('_coupon_not_found', array($code))); } $this->order->getCoupons(true); } $this->updateEstimateAddress(); $this->order->loadItemData(); $validator = $this->buildCartValidator($this->order, $this->getItemOptions()); if (!$validator->isValid()) { return new ActionRedirectResponse('order', 'index'); } $this->order->loadRequestData($this->request); foreach ($this->order->getOrderedItems() as $item) { if ($this->request->isValueSet('item_' . $item->getID())) { foreach ($item->getProduct()->getOptions(true) as $option) { $this->modifyItemOption($item, $option, $this->request, $this->getFormFieldName($item, $option)); } $item->save(); $this->order->updateCount($item, $this->request->get('item_' . $item->getID(), 0)); } } if ($this->order->isMultiAddress->get()) { $addresses = $this->user->getShippingAddressSet(); $this->order->getShipments(); foreach ($this->order->getOrderedItems() as $item) { if ($addressId = $this->request->get('address_' . $item->getID())) { if (!$item->shipment->get() || !$item->shipment->get()->shippingAddress->get() || $item->shipment->get()->shippingAddress->get()->getID() != $addressId) { foreach ($this->order->getShipments() as $shipment) { if ($shipment->shippingAddress->get() && $shipment->shippingAddress->get()->getID() == $addressId) { if (!$item->shipment->get() || $item->shipment->get()->getID() != $shipment->getID()) { if ($item->shipment->get()) { $item->shipment->get()->removeItem($item); } $shipment->addItem($item); break; } } $shipment = null; } if (!isset($shipment) || !$shipment) { $address = ActiveRecordModel::getInstanceById('UserAddress', $addressId, true); $shipment = Shipment::getNewInstance($this->order); $shipment->shippingAddress->set($address); $shipment->save(); $this->order->addShipment($shipment); $shipment->addItem($item); } $item->save(); } } if ($item->shipment->get()) { $item->shipment->get()->shippingAmount->set(0); $item->shipment->get()->shippingServiceData->set(null); $item->shipment->get()->save(); } } } $this->order->mergeItems(); SessionOrder::save($this->order); // proceed with the checkout if ($this->request->get('proceed')) { return new ActionRedirectResponse('checkout', 'index'); } // redirect to payment gateway if ($url = $this->request->get('redirect')) { return new RedirectResponse($url); } return new ActionRedirectResponse('order', 'index', array('query' => 'return=' . $this->request->get('return'))); }
public function applyCoupons(array $coupons) { if (!$this->isCouponsAvailable()) { return true; } $coupons = $this->getValidCoupons($coupons); foreach ($coupons as $coupon) { $model = new OrderCoupon(); $model->setAttributes(['order_id' => $this->id, 'coupon_id' => $coupon->id, 'create_time' => new CDbExpression('NOW()')]); $model->save(); if ($this->getIsNewRecord()) { $coupon->decreaseQuantity(); } } $this->coupon_discount = $this->getCouponDiscount($coupons); $this->delivery_price = $this->getDeliveryCost(); return true; }