The followings are the available columns in table '{{store_order_coupon}}':
Inheritance: extends yupe\models\YModel
コード例 #1
0
 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());
 }
コード例 #6
0
 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);
 }
コード例 #7
0
 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");
 }
コード例 #9
0
 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;
 }
コード例 #10
0
ファイル: OrderCouponApi.php プロジェクト: saiber/www
 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);
 }
コード例 #11
0
ファイル: Order.php プロジェクト: syrexby/domovoishop.by
 /**
  * @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;
     }
 }
コード例 #12
0
 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)));
 }
コード例 #13
0
 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());
 }
コード例 #14
0
ファイル: Coupon.php プロジェクト: yupe/yupe
 /**
  * @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]);
 }
コード例 #15
0
 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
 }
コード例 #16
0
ファイル: OrderController.php プロジェクト: saiber/www
 /**
  *  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')));
 }
コード例 #17
0
ファイル: Order.php プロジェクト: RonLab1987/43berega
 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;
 }