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