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); }
/** * 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 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()); }