Esempio n. 1
0
		protected function editOrderDeleteShippingDestinationAction()
		{
			if(empty($_POST['quoteSession']) || empty($_POST['addressId'])) {
				exit;
			}

			/** @var ISC_QUOTE */
			$quote = getClass('ISC_ADMIN_ORDERS')->getQuoteSession($_POST['quoteSession']);
			if(!$quote) {
				$this->sendEditOrderNoQuoteResponse();
			}

			/** @var ISC_QUOTE_ADDRESS */
			$address = $quote->getAddressById($_POST['addressId']);
			if (!$address || $address->getType() == ISC_QUOTE_ADDRESS::TYPE_BILLING) {
				exit;
			}

			$createdUnallocated = false;
			$unallocatedAddress = $quote->getAddressById(ISC_QUOTE_ADDRESS::ID_UNALLOCATED);
			if(!$unallocatedAddress) {
				$unallocatedAddress = new ISC_QUOTE_ADDRESS_SHIPPING;
				$unallocatedAddress
					->setQuote($quote)
					->setId(ISC_QUOTE_ADDRESS::ID_UNALLOCATED);
				$quote->addShippingAddress($unallocatedAddress);
				$createdUnallocated = true;
			}

			$address->moveAllItemsToAddress($unallocatedAddress);
			$quote->removeShippingAddress($address->getId());

			$response = array(
				'itemsTable' => getClass('ISC_ADMIN_ORDERS')->generateEditOrderItemsTable($quote),
				'multiShippingTable' => getClass('ISC_ADMIN_ORDERS')->renderMultiShippingTable($quote),
				'isDigital' => $quote->isDigital(),
			);

			$this->sendEditOrderResponse($response);
		}
Esempio n. 2
0
	/**
	* Creates a new ISC_QUOTE_ADDRESS_SHIPPING instance for this ISC_QUOTE and returns it.
	*
	* @param string $id specific id to create this address with otherwise leave it to random id generator
	* @return ISC_QUOTE_ADDRESS_SHIPPING
	*/
	public function createShippingAddress($id = null)
	{
		$address = new ISC_QUOTE_ADDRESS_SHIPPING;
		if ($id !== null) {
			$address->setId($id);
		}
		$address->setQuote($this);
		$this->addShippingAddress($address);
		return $address;
	}
Esempio n. 3
0
	/**
	 * Save one or more selected addresses for split-shipping.
	 */
	private function SaveMultipleShippingAddresses()
	{
		//  Split shipping only works for signed in users
		if(!CustomerIsSignedIn()) {
			redirect(getConfig('ShopPath').'/checkout.php?action=checkout');
		}

		// If split shipping is not available, take the customer back to the shipping address selection page
		if(!gzte11(ISC_MEDIUMPRINT) || !GetConfig('MultipleShippingAddresses') || !isset($_POST['multiaddress'])) {
			redirect(getConfig('ShopPath').'/checkout.php?action=choose_shipping_address&type=single');
		}

		$silent = false;
		if(isset($_POST['addAnotherAddress'])) {
			$silent = true;
		}

		$customerAddresses = getClass('ISC_CUSTOMER')
			->getCustomerShippingAddresses();

		$quoteItems = $this->getQuote()->getItems();
		$addressItems = array();
		foreach($quoteItems as $item) {
			// Digital items aren't shipped
			if($item->isDigital()) {
				continue;
			}

			// If we don't have an address for this product, we need to throw back to the address
			// selection page, as they've done something dodgy.
			$quantity = $item->getQuantity();
			$itemId = $item->getId();
			for($i = 1; $i <= $quantity; ++$i) {
				$id = $itemId.'_'.$i;
				if(!isset($_POST['multiaddress'][$id]) ||
					!isset($customerAddresses[$_POST['multiaddress'][$id]]) && $silent == false) {
						redirect(GetConfig('ShopPath').'/checkout.php?action=choose_shipping_address&type=single');
				}

				$customerAddressId = $customerAddresses[$_POST['multiaddress'][$id]]['shipid'];
				if(!isset($addressItems[$customerAddressId])) {
					$addressItems[$customerAddressId] = array();
				}
				if(!isset($addressItems[$customerAddressId][$itemId])) {
					$addressItems[$customerAddressId][$itemId] = 0;
				}
				++$addressItems[$customerAddressId][$itemId];
			}
		}

		// Remove all shipping addresses on the order and start fresh
		$this->getQuote()->setIsSplitShipping(true);
		$this->getQuote()->removeAllShippingAddresses();

		$updatedItems = array();
		$first = true;
		foreach($addressItems as $addressId => $items) {
			$address = getClass('ISC_ACCOUNT')->getShippingAddress($addressId,
				getClass('ISC_CUSTOMER')->getCustomerId()
			);

			// Invalid address was selected
			if(!$address) {
				redirect(GetConfig('ShopPath').'/checkout.php?action=choose_shipping_address&type=single');
			}

			// First iteration should use existing shipping address
			if($first) {
				$quoteShippingAddress = $this->getQuote()->getShippingAddress();
				$first = false;
			}
			else {
				$quoteShippingAddress = new ISC_QUOTE_ADDRESS_SHIPPING;
				$quoteShippingAddress->setQuote($this->getQuote());
				$this->getQuote()->addShippingAddress($quoteShippingAddress);
			}

			$quoteShippingAddress->setAddressByArray($address);

			// If the address has custom fields, load those in too
			if($address['shipformsessionid']) {
				$formFields = $GLOBALS['ISC_CLASS_FORM']->getSavedSessionData(
					$address['shipformsessionid'],
					array(),
					FORMFIELDS_FORM_ADDRESS
				);
				$quoteShippingAddress->setCustomFields($formFields);
			}

			$quoteAddressId = $quoteShippingAddress->getId();
			foreach($items as $itemId => $qty) {
				$item = $this->getQuote()->getItemById($itemId);
				if(!in_array($itemId, $updatedItems)) {
					$item->setAddressId($quoteAddressId);
					$item->setQuantity($qty, false);
					$updatedItems[] = $itemId;
				}
				else {
					$newItem = clone $item;
					$newItem->setQuantity($qty, false);
					$newItem->setAddressId($quoteAddressId);
					$this->getQuote()->addItem($newItem, false);
				}
			}
		}

		// Do we need to go to the add address page?
		if(isset($_POST['addAnotherAddress'])) {
			$this_page = urlencode("checkout.php?action=choose_shipping_address");
			redirect(getConfig('ShopPath').'/account.php?action=add_shipping_address&from='.$this_page);
		}

		// OK, the shipping method has been set, move on to the next step
		redirect(getConfig('ShopPath').'/checkout.php?action=choose_shipper');
	}
Esempio n. 4
0
	/**
	 * Given an order ID, load the order and convert it in to a quote based off
	 * the ISC_QUOTE class.
	 *
	 * @param int $orderId The order ID to load in to a quote.
	 * @return ISC_QUOTE Quote object for the order.
	 */
	public function convertOrderToQuote($orderId, $enableDiscounts = true)
	{
		$order = GetOrder($orderId, null, null, true);
		if(!$order) {
			 return false;
		}

		$quote = new ISC_QUOTE;
		$quote
			->setDiscountsEnabled($enableDiscounts)
			->setOrderId($orderId)
			->setCustomerId($order['ordcustid'])
			->setAppliedStoreCredit($order['ordstorecreditamount'])
			->setCustomerMessage($order['ordcustmessage'])
			->setStaffNotes($order['ordnotes'])
			->setOrderStatus($order['ordstatus']);

		$billingCustomFields = array();
		if($order['ordformsessionid']) {
			$billingCustomFields = $GLOBALS['ISC_CLASS_FORM']->getSavedSessionData(
				$order['ordformsessionid'],
				array(),
				FORMFIELDS_FORM_BILLING,
				true
			);
		}

		$quote->getBillingAddress()
			->setFirstName($order['ordbillfirstname'])
			->setLastName($order['ordbilllastname'])
			->setCompany($order['ordbillcompany'])
			->setEmail($order['ordbillemail'])
			->setPhone($order['ordbillphone'])
			->setAddress1($order['ordbillstreet1'])
			->setAddress2($order['ordbillstreet2'])
			->setCity($order['ordbillsuburb'])
			->setZip($order['ordbillzip'])
			->setCountryByName($order['ordbillcountry'])
			->setStateByName($order['ordbillstate'])
			->setCustomFields($billingCustomFields);

		if($order['shipping_address_count'] > 1) {
			$quote->setIsSplitShipping(true);
		}

		// Set the shipping addresses on the quote
		$query = "
			SELECT *
			FROM [|PREFIX|]order_addresses a
			LEFT JOIN [|PREFIX|]order_shipping s ON (s.order_address_id = a.id)
			WHERE a.order_id='".$order['orderid']."'
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		while($address = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$shippingCustomFields = array();
			if($address['form_session_id']) {
				$shippingCustomFields = $GLOBALS['ISC_CLASS_FORM']->getSavedSessionData(
					$address['form_session_id'],
					array(),
					FORMFIELDS_FORM_SHIPPING,
					true
				);
			}
			$quoteAddress = new ISC_QUOTE_ADDRESS_SHIPPING;
			$quoteAddress
				->setQuote($quote)
				->setId($address['order_address_id'])
				->setFirstName($address['first_name'])
				->setLastName($address['last_name'])
				->setCompany($address['company'])
				->setEmail($address['email'])
				->setPhone($address['phone'])
				->setAddress1($address['address_1'])
				->setAddress2($address['address_2'])
				->setCity($address['city'])
				->setZip($address['zip'])
				->setCountryByName($address['country'])
				->setStateByName($address['state'])
				->setCustomFields($shippingCustomFields)
				->setShippingMethod($address['base_cost'], $address['method'], $address['module'], true)
				->setHandlingCost($address['base_handling_cost'], true);
			$quote->addShippingAddress($quoteAddress);
		}

		// Load any configurable fields for items on this order
		$configurableFields = array();
		$query = "
			SELECT *
			FROM [|PREFIX|]order_configurable_fields
			WHERE orderid='".$order['orderid']."'
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		while($configurableField = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$quoteField = array(
				'name' => $configurableField['fieldname'],
				'type' => $configurableField['fieldtype'],
				'fileType' => $configurableField['filetype'],
				'fileOriginalName' => $configurableField['originalfilename'],
				'value' => $configurableField['textcontents']
			);
			if($quoteField['type'] == 'file') {
				$quoteField['value'] = $configurableField['filename'];
				$quoteField['isExistingFile'] = true;
			}

			$configurableFields[$configurableField['ordprodid']][$configurableField['fieldid']] = $quoteField;
		}

		// Loop through all of the items and add them to the quote
		$query = "
			SELECT *
			FROM [|PREFIX|]order_products
			WHERE orderorderid='".$order['orderid']."'
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		while($product = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$variationOptions = array();
			if($product['ordprodoptions']) {
				$variationOptions = unserialize($product['ordprodoptions']);
			}

			$configuration = array();
			if(isset($configurableFields[$product['orderprodid']])) {
				$configuration = $configurableFields[$product['orderprodid']];
			}

			$itemClass = 'ISC_QUOTE_ITEM';
			$type = PT_PHYSICAL;
			if($product['ordprodtype'] == 'digital') {
				$type = PT_DIGITAL;
			}
			else if($product['ordprodtype'] == 'giftcertificate') {
				$type = PT_GIFTCERTIFICATE;
				$itemClass = 'ISC_QUOTE_ITEM_GIFTCERTIFICATE';
			}
			else if (!$product['ordprodid']) {
				$type = PT_VIRTUAL;
			}

			$quoteItem = new $itemClass;
			$quoteItem
				->setQuote($quote)
				->setName($product['ordprodname'])
				->setSku($product['ordprodsku'])
				->setId($product['orderprodid'])
				->setProductId($product['ordprodid'])
				->setQuantity($product['ordprodqty'], false)
				->setOriginalOrderQuantity($product['ordprodqty'])
				->setConfiguration($configuration)
				->setVariationId($product['ordprodvariationid'])
				->setVariationOptions($variationOptions)
				->setType($type)
				->setEventName($product['ordprodeventname'])
				->setAddressId($product['order_address_id'])
				->setBasePrice($product['base_price'], true)
				->setFixedShippingCost($product['ordprodfixedshippingcost'])
				->setWeight($product['ordprodweight'])
				->setInventoryCheckingEnabled(false);

			if ($product['applied_discounts']) {
				$appliedDiscounts = unserialize($product['applied_discounts']);
				if (!empty($appliedDiscounts)) {
					foreach ($appliedDiscounts as $discountId => $discountValue) {
						$quoteItem->addDiscount($discountId, $discountValue);
					}
				}
			}

			if($product['ordprodwrapid']) {
				$quoteItem->setGiftWrapping(
					$product['ordprodwrapid'],
					$product['base_wrapping_cost'],
					$product['ordprodwrapname'],
					$product['ordprodwrapmessage']
				);
			}

			if($product['ordprodeventdate']) {
				list($day, $month, $year) = explode('-', isc_date('d-m-Y', $product['ordprodeventdate']));
				$quoteItem->setEventDate($month, $day, $year);
			}

			$quote->addItem($quoteItem, false);
			$quoteItem->setInventoryCheckingEnabled(true);
		}

		// Add any applied coupon codes
		$query = "
			SELECT *
			FROM [|PREFIX|]order_coupons
			WHERE ordcouporderid='".$order['orderid']."'
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		while($coupon = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$quoteCoupon = array(
				'id' => 0,
				'code' => $coupon['ordcouponcode'],
				'discountType' => $coupon['ordcoupontype'],
				'discountAmount' => $coupon['ordcouponamount'],
				'totalDiscount' => $coupon['applied_discount'],
			);
			$quote->addCoupon($quoteCoupon);
		}

		// Add any applied gift certificates
		$query = "
			SELECT h.*, g.giftcertcode
			FROM [|PREFIX|]gift_certificate_history h
			LEFT JOIN [|PREFIX|]gift_certificates g ON (g.giftcertid = h.histgiftcertid)
			WHERE historderid='".$order['orderid']."'
		";
		$result = $GLOBALS['ISC_CLASS_DB']->query($query);
		while($giftCertificate = $GLOBALS['ISC_CLASS_DB']->fetch($result)) {
			$quoteGiftCertificate = array(
				'code' => $giftCertificate['giftcertcode'],
				'id' => 0,
				'amount' => $giftCertificate['histbalanceused']
			);
			$quote->addGiftCertificate($quoteGiftCertificate);
		}

		if($order['orddiscountamount'] > 0) {
			$quote->addDiscount('existing-discount', $order['orddiscountamount']);
		}

		return $quote;
	}