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