Skip to content

Instantly share code, notes, and snippets.

@drmmr763
Created December 16, 2014 16:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drmmr763/143d334f8fc6d705b278 to your computer and use it in GitHub Desktop.
Save drmmr763/143d334f8fc6d705b278 to your computer and use it in GitHub Desktop.
v 3.9.3.1
<?php
/*
|
| This file and the source codes contained herein are the property
| of Interapptive, Inc. Use of this file is restricted to the specific
| terms and conditions in the License Agreement associated with this
| file. Distribution of this file or portions of this file for uses
| not covered by the License Agreement is not allowed without a written
| agreement signed by an officer of Interapptive, Inc.
|
| The code contained herein may not be reproduced, copied or
| redistributed in any form, as part of another product or otherwise.
| Modified versions of this code may not be sold or redistributed.
|
| Copyright 2009-2012 Interapptive, Inc. All rights reserved.
| http://www.interapptive.com/
|
|
*/
define('REQUIRE_SECURE', TRUE);
$moduleVersion = "3.9.3.1";
$schemaVersion = "1.0.0";
// include the Mage engine
require_once 'app/Mage.php';
umask(0);
// retrieve the store code
$storeCode = '';
if (isset($_REQUEST['storecode']))
{
$storeCode = $_REQUEST['storecode'];
}
// using output buffering to get around headers that magento is setting after we've started output
ob_start();
header("Content-Type: text/xml;charset=utf-8");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Tests the Magento version to see if it's greater than or equal to the targetVersion
function MagentoVersionGreaterOrEqualTo($targetVersion)
{
$mageVersion = Mage::getVersion();
$currentParts = preg_split('[\.]', $mageVersion);
$targetParts = preg_split('[\.]', $targetVersion);
$i = 0;
foreach ($currentParts as $currentPart)
{
if ($i >= count($targetParts))
{
// gotten this far, means that current version of 1.4.0.1 > target version 1.4.0
return true;
}
$targetPart = $targetParts[$i];
// if this iteration's target version part is greater than the magento version part, we're done.
if ((int)$targetPart > (int)$currentPart)
{
return false;
}
else if ((int)$targetPart < (int)$currentPart)
{
// the magento version part is greater, then we're done
return true;
}
// otherwise to this point the two are equal, continue
$i++;
}
// got this far means the two are equal
return true;
}
// write xml documenta declaration
function writeXmlDeclaration()
{
echo "<?xml version=\"1.0\" standalone=\"yes\" ?>";
}
function writeStartTag($tag, $attributes = null)
{
echo '<' . $tag;
if ($attributes != null)
{
echo ' ';
foreach ($attributes as $name => $attribValue)
{
echo $name. '="'. htmlspecialchars($attribValue). '" ';
}
}
echo '>';
}
// write closing xml tag
function writeCloseTag($tag)
{
echo '</' . $tag . '>';
}
// Output the given tag\value pair
function writeElement($tag, $value)
{
writeStartTag($tag);
echo htmlspecialchars($value);
writeCloseTag($tag);
}
// Outputs the given name/value pair as an xml tag with attributes
function writeFullElement($tag, $value, $attributes)
{
echo '<'. $tag. ' ';
foreach ($attributes as $name => $attribValue)
{
echo $name. '="'. htmlspecialchars($attribValue). '" ';
}
echo '>';
echo htmlspecialchars($value);
writeCloseTag($tag);
}
// Function used to output an error and quit.
function outputError($code, $error)
{
writeStartTag("Error");
writeElement("Code", $code);
writeElement("Description", $error);
writeCloseTag("Error");
}
$secure = false;
try
{
if (isset($_SERVER['HTTPS']))
{
$secure = ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == '1');
}
}
catch(Exception $e)
{
}
// Open the XML output and root
writeXmlDeclaration();
writeStartTag("ShipWorks", array("moduleVersion" => $moduleVersion, "schemaVersion" => $schemaVersion));
try
{
// start the mage engine
Mage::app($storeCode);
}
catch (Mage_Core_Model_Store_Exception $e)
{
outputError(100, "Invalid Store Code.");
writeCloseTag("ShipWorks");
exit;
}
// Enforse SSL
if (!$secure && REQUIRE_SECURE)
{
outputError(10, 'A secure (https://) connection is required.');
}
else
{
// If the admin module is installed, we make use of it
if (checkAdminLogin())
{
$action = (isset($_REQUEST['action']) ? $_REQUEST['action'] : '');
switch (strtolower($action))
{
case 'getmodule': Action_GetModule(); break;
case 'getstore': Action_GetStore(); break;
case 'getcount': Action_GetCount(); break;
case 'getorders': Action_GetOrders(); break;
case 'getstatuscodes': Action_GetStatusCodes(); break;
case 'updateorder': Action_UpdateOrder(); break;
default:
outputError(20, "'$action' is not supported.");
}
}
}
// Close the output
writeCloseTag("ShipWorks");
// Check to see if admin functions exist. And if so, determine if the user
// has access.
function checkAdminLogin()
{
$loginOK = false;
if (isset($_REQUEST['username']) && isset($_REQUEST['password']))
{
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$user = Mage::getSingleton('admin/session')->login($username, $password);
if ($user && $user->getId())
{
$loginOK = true;
}
}
if (!$loginOK)
{
outputError(50, "The username or password is incorrect.");
}
return $loginOK;
}
function Action_GetModule()
{
writeStartTag("Module");
writeElement("Platform", "Magento");
writeElement("Developer", "Interapptive, Inc. (support@interapptive.com)");
writeStartTag("Capabilities");
writeElement("DownloadStrategy", "ByModifiedTime");
writeFullElement("OnlineCustomerID", "", array("supported" => "true", "dataType" => "numeric"));
writeFullElement("OnlineStatus", "", array("supported" => "true", "dataType" => "text", "downloadOnly" => "true" ));
writeFullElement("OnlineShipmentUpdate", "", array("supported" => "false"));
writeCloseTag("Capabilities");
writeCloseTag("Module");
}
// Write store data
function Action_GetStore()
{
// get state name
$region_model = Mage::getModel('directory/region');
if (is_object($region_model))
{
$state = $region_model->load(Mage::getStoreConfig('shipping/origin/region_id'))->getDefaultName();
}
$name = Mage::getStoreConfig('system/store/name');
$owner = Mage::getStoreConfig('trans_email/ident_general/name');
$email = Mage::getStoreConfig('trans_email/ident_general/email');
$country = Mage::getStoreConfig('shipping/origin/country_id');
$website = Mage::getURL();
writeStartTag("Store");
writeElement("Name", $name);
writeElement("CompanyOrOwner", $owner);
writeElement("Email", $email);
writeElement("State", $state);
writeElement("Country", $country);
writeElement("Website", $website);
writeCloseTag("Store");
}
// Converts an xml datetime string to sql date time
function toLocalSqlDate($sqlUtc)
{
$pattern = "/^(\d{4})-(\d{2})-(\d{2})\T(\d{2}):(\d{2}):(\d{2})$/i";
if (preg_match($pattern, $sqlUtc, $dt))
{
$unixUtc = gmmktime($dt[4], $dt[5], $dt[6], $dt[2], $dt[3], $dt[1]);
return date("Y-m-d H:i:s", $unixUtc);
}
return $sqlUtc;
}
// Get the count of orders greater than the start ID
function Action_GetCount()
{
$start = 0;
$storeId = Mage::app()->getStore()->storeId;
if (isset($_REQUEST['start']))
{
$start = $_REQUEST['start'];
}
// only get orders through 2 seconds ago
$end = date("Y-m-d H:i:s", time() - 2);
// Convert to local SQL time
$start = toLocalSqlDate($start);
// Write the params for easier diagnostics
writeStartTag("Parameters");
writeElement("Start", $start);
writeCloseTag("Parameters");
$orders = Mage::getModel('sales/order')->getCollection();
$orders->addAttributeToSelect("updated_at")->getSelect()->where("(updated_at > '$start' AND updated_at <= '$end' AND store_id = $storeId)");
$count = $orders->count();
writeElement("OrderCount", $count);
}
// Get all orders greater than the given start id, limited by max count
function Action_GetOrders()
{
$storeId = Mage::app()->getStore()->storeId;
$start = 0;
$maxcount = 50;
if (isset($_REQUEST['start']))
{
$start = $_REQUEST['start'];
}
if (isset($_REQUEST['maxcount']))
{
$maxcount = $_REQUEST['maxcount'];
}
// Only get orders through 2 seconds ago.
$end = date("Y-m-d H:i:s", time() - 2);
// Convert to local SQL time
$start = toLocalSqlDate($start);
// Write the params for easier diagnostics
writeStartTag("Parameters");
writeElement("Start", $start);
writeElement("End", $end);
writeElement("MaxCount", $maxcount);
writeCloseTag("Parameters");
// setup the query
$orders = Mage::getModel('sales/order')->getCollection();
$orders->addAttributeToSelect("*")
->getSelect()
->where("(updated_at > '$start' AND updated_at <= '$end' AND store_id = $storeId)")
->order('updated_at', 'asc');
// configure paging
$orders->setCurPagE(1)
->setPageSize($maxcount)
->loadData();
writeStartTag("Orders");
$lastModified = null;
$processedIds = "";
foreach ($orders as $order)
{
// keep track of the ids we've downloaded
$lastModified = $order->getUpdatedAt();
if ($processedIds != "")
{
$processedIds .= ", ";
}
$processedIds .= $order->getEntityId();
WriteOrder($order);
}
// if we processed some orders we may have to get some more
if ($processedIds != "")
{
$orders = Mage::getModel('sales/order')->getCollection();
$orders->addAttributeToSelect("*")->getSelect()->where("updated_at = '$lastModified' AND entity_id not in ($processedIds) AND store_id = $storeId");
foreach ($orders as $order)
{
WriteOrder($order);
}
}
writeCloseTag("Orders");
}
// Output the order as xml
function WriteOrder($order)
{
global $secure;
writeStartTag("Order");
$incrementId = $order->getIncrementId();
$orderPrefix = '';
$orderPostfix = '';
$prefixParts = preg_split('/(?=\d)/', $incrementId,2);
$orderPrefix = $prefixParts[0];
$postfixParts = preg_split('[\-]', $prefixParts[1],2);
$incrementId = $postfixParts[0];
$orderPostfix = $postfixParts[1];
writeElement("OrderNumberPrefix", $orderPrefix);
writeElement("OrderNumber", $incrementId);
writeElement("OrderNumberPostfix", $orderPostfix);
writeElement("OrderDate", FormatDate($order->getCreatedAt()));
writeElement("LastModified", FormatDate($order->getUpdatedAt()));
writeElement("ShippingMethod", $order->getShippingDescription());
writeElement("StatusCode", $order->getStatus());
writeElement("CustomerID", $order->getCustomerId());
// check for order-level gift messages
if ($order->getGiftMessageId())
{
$message = Mage::helper('giftmessage/message')->getGiftMessage($order->getGiftMessageId());
$messageString = "Gift message for ". $message['recipient']. ": ". $message['message'];
writeStartTag("Notes");
writeFullElement("Note", $messageString, array("public" => "true"));
writeCloseTag("Notes");
}
$address = $order->getBillingAddress();
writeStartTag("BillingAddress");
writeElement("FullName", $address->getName());
writeElement("Company", $address->getCompany());
writeElement("Street1", $address->getStreet(1));
writeElement("Street2", $address->getStreet(2));
writeElement("Street3", $address->getStreet(3));
writeElement("City", $address->getCity());
writeElement("State", $address->getRegionCode());
writeElement("PostalCode", $address->getPostcode());
writeElement("Country", $address->getCountryId());
writeElement("Phone", $address->getTelephone());
writeElement("Email", $order->getCustomerEmail());
writeCloseTag("BillingAddress");
$billFullName = $address->getName();
$billStreet1 = $address->getStreet(1);
$billCity = $address->getCity();
$billZip = $address->getPostcode();
$address = $order->getShippingAddress();
if (!$address)
{
// sometimes the shipping address isn't specified, so use billing
$address = $order->getBillingAddress();
}
writeStartTag("ShippingAddress");
writeElement("FullName", $address->getName());
writeElement("Company", $address->getCompany());
writeElement("Street1", $address->getStreet(1));
writeElement("Street2", $address->getStreet(2));
writeElement("Street3", $address->getStreet(3));
writeElement("City", $address->getCity());
writeElement("State", $address->getRegionCode());
writeElement("PostalCode", $address->getPostcode());
writeElement("Country", $address->getCountryId());
writeElement("Phone", $address->getTelephone());
// if the addressses appear to be the same, use customer email as shipping email too
if ($address->getName() == $billFullName &&
$address->getStreet(1) == $billStreet1 &&
$address->getCity() == $billCity &&
$address->getPostcode() == $billZip)
{
writeElement("Email", $order->getCustomerEmail());
}
writeCloseTag("ShippingAddress");
$payment = $order->getPayment();
// CC info
if ($secure)
{
$cc_num = $payment->getCcNumber();
}
else
{
$cc_num = $payment->getCcLast4();
if (!empty($cc_num))
{
$cc_num = '************'.$payment->getCcLast4();
}
}
$cc_year = sprintf('%02u%s', $payment->getCcExpMonth(), substr($payment->getCcExpYear(), 2));
writeStartTag("Payment");
writeElement("Method", Mage::helper('payment')->getMethodInstance($payment->getMethod())->getTitle());
writeStartTag("CreditCard");
writeElement("Type", $payment->getCcType());
writeElement("Owner", $payment->getCcOwner());
writeElement("Number", $cc_num);
writeElement("Expires", $cc_year);
writeCloseTag("CreditCard");
writeCloseTag("Payment");
WriteOrderItems($order->getAllItems());
WriteOrderTotals($order);
writeStartTag("Debug");
writeElement("OrderID", $order->getEntityId());
writeElement("OrderNumberPostfix", $orderPostfix);
writeCloseTag("Debug");
writeCloseTag("Order");
}
// writes a single order total
function WriteOrderTotal($name, $value, $class, $impact = "add")
{
if ($value > 0)
{
writeFullElement("Total", $value, array("name" => $name, "class" => $class, "impact" => $impact));
}
}
// Write all totals lines for the order
function WriteOrderTotals($order)
{
writeStartTag("Totals");
WriteOrderTotal("Order Subtotal", $order->getSubtotal(), "ot_subtotal", "none");
WriteOrderTotal("Shipping and Handling", $order->getShippingAmount(), "shipping", "add");
if ($order->getTaxAmount() > 0)
{
WriteOrderTotal("Tax", $order->getTaxAmount(), "tax", "add");
}
// Magento 1.4 started storing discounts as negative values
if (MagentoVersionGreaterOrEqualTo('1.4.0') && $order->getDiscountAmount() < 0)
{
$couponcode = $order->getCouponCode();
WriteOrderTotal("Discount ($couponcode)", -1 * $order->getDiscountAmount(), "discount", "subtract");
}
if (!MagentoVersionGreaterOrEqualTo('1.4.0') && $order->getDiscountAmount() > 0)
{
$couponcode = $order->getCouponCode();
WriteOrderTotal("Discount ($couponcode)", $order->getDiscountAmount(), "discount", "subtract");
}
if ($order->getGiftcertAmount() > 0)
{
WriteOrderTotal("Gift Certificate", $order->getGiftcertAmount(), "giftcertificate", "subtract");
}
if ($order->getAdjustmentPositive())
{
WriteOrderTotal("Adjustment Refund", $order->getAdjustmentPositive(), "refund", "subtract");
}
if ($order->getAdjustmentNegative())
{
WriteOrderTotal("Adjustment Fee", $order->getAdjustmentPositive(), "fee", "add");
}
WriteOrderTotal("Grand Total", $order->getGrandTotal(), "total", "none");
writeCloseTag("Totals");
}
// Gets the price of an order item
function getCalculationPrice($item)
{
if ($item instanceof Mage_Sales_Model_Order_Item)
{
if (MagentoVersionGreaterOrEqualTo('1.3.0'))
{
return $item->getPrice();
}
else
{
if ($item->hasCustomPrice())
{
return $item->getCustomPrice();
}
else if ($item->hasOriginalPrice())
{
return $item->getOriginalPrice();
}
}
}
return 0;
}
// Write XML for all products for the given order
function WriteOrderItems($orderItems)
{
writeStartTag("Items");
$parentMap = Array();
// go through each item in the collection
foreach ($orderItems as $item)
{
// keep track of item Id and types
$parentMap[$item->getItemId()] = $item->getProductType();
// get the sku
if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE)
{
$sku = $item->getProductOptionByCode('simple_sku');
}
else
{
$sku = $item->getSku();
}
// weights are handled differently if the item is a bundle or part of a bundle
$weight = $item->getWeight();
if ($item->getIsVirtual())
{
$weight = 0;
}
if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE)
{
$name = $item->getName(). " (bundle)";
$unitPrice = getCalculationPrice($item);
}
else
{
$name = $item->getName();
// if it's part of a bundle
if (is_null($item->getParentItemId()))
{
$unitPrice = getCalculationPrice($item);
}
else
{
// need to see if the parent is a bundle or not
$isBundle = ($parentMap[$item->getParentItemId()] == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE);
if ($isBundle)
{
// it's a bundle member - price and weight come from the bundle definition itself
$unitPrice = 0;
$weight = 0;
}
else
{
// don't even want to include if the parent item is anything but a bundle
continue;
}
}
}
// Magento 1.4+ has Cost
$unitCost = 0;
if (MagentoVersionGreaterOrEqualTo('1.4.0') && $item->getBaseCost() > 0)
{
$unitCost = $item->getBaseCost();
}
else if (MagentoVersionGreaterOrEqualTo('1.3.0'))
{
// Magento 1.3 didn't seem to copy Cost to the item from the product
// fallback to the Cost defined on the product.
$product = Mage::getModel('catalog/product');
$productId = $item->getProductId();
$product->load($productId);
if ($product->getCost() > 0)
{
$unitCost = $product->getCost();
}
}
writeStartTag("Item");
writeElement("ItemID", $item->getItemId());
writeElement("ProductID", $item->getProductId());
writeElement("Code", $sku);
writeElement("SKU", $sku);
writeElement("Name", $name);
writeElement("Quantity", (int)$item->getQtyOrdered());
writeElement("UnitPrice", $unitPrice);
writeElement("UnitCost", $unitCost);
if (!$weight)
{
$weight = 0;
}
writeElement("Weight", $weight);
writeStartTag("Attributes");
$opt = $item->getProductOptions();
if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE)
{
if (is_array($opt) &&
isset($opt['attributes_info']) &&
is_array($opt['attributes_info']) &&
is_array($opt['info_buyRequest']) &&
is_array($opt['info_buyRequest']['super_attribute']))
{
$attr_id = $opt['info_buyRequest']['super_attribute'];
reset($attr_id);
foreach ($opt['attributes_info'] as $sub)
{
writeStartTag("Attribute");
writeElement("Name", $sub['label']);
writeElement("Value", $sub['value']);
writeCloseTag("Attribute");
next($attr_id);
}
}
}
if (is_array($opt) &&
isset($opt['options']) &&
is_array($opt['options']))
{
foreach ($opt['options'] as $sub)
{
writeStartTag("Attribute");
writeElement("Name", $sub['label']);
writeElement("Value", $sub['value']);
writeCloseTag("Attribute");
}
}
// Order-item level Gift Messages are created as item attributes in ShipWorks
if ($item->getGiftMessageId())
{
$message = Mage::helper('giftmessage/message')->getGiftMessage($item->getGiftMessageId());
// write the gift message as an attribute
writeStartTag("Attribute");
writeElement("Name", "Gift Message");
writeelement("Value", $message['message']);
writeCloseTag("Attribute");
// write the gift messgae recipient as an attribute
writeStartTag("Attribute");
writeElement("Name", "Gift Message, Recipient");
writeelement("Value", $message['recipient']);
writeCloseTag("Attribute");
}
// Uncomment the following lines to include a custom product attribute in the downloaded data.
// These will appear as Order Item Attributes in ShipWorks.
//$product = Mage::getModel('catalog/product');
//$productId = $product->getIdBySku($sku);
//$product->load($productId);
//$value = $product->getAttributeText("attribute_code_here");
//if ($value)
//{
// // write the gift message as an attribute
// writeStartTag("Attribute");
// writeElement("Name", "Attribute_title_here");
// writeelement("Value", $value);
// writeCloseTag("Attribute");
//}
writeCloseTag("Attributes");
writeCloseTag("Item");
}
writeCloseTag("Items");
}
// Returns the status codes for the store
function Action_GetStatusCodes()
{
writeStartTag("StatusCodes");
$statuses_node = Mage::getConfig()->getNode('global/sales/order/statuses');
foreach ($statuses_node->children() as $status)
{
writeStartTag("StatusCode");
writeElement("Code", $status->getName());
writeElement("Name", $status->label);
writeCloseTag("StatusCode");
}
writeCloseTag("StatusCodes");
}
// Update the status of an order
function Action_UpdateOrder()
{
// gather paramtetes
if (!isset($_REQUEST['order']) ||
!isset($_REQUEST['command']) || !isset($_REQUEST['comments']))
{
outputError(40, "Not all parameters supplied.");
return;
}
// newer version of ShipWorks, pull the entity id
$orderID = (int)$_REQUEST['order'];
$order = Mage::getModel('sales/order')->load($orderID);
$command = (string) $_REQUEST['command'];
$comments = $_REQUEST['comments'];
$tracking = $_REQUEST['tracking'];
$carrierData = $_REQUEST['carrier'];
ExecuteOrderCommand($order, $command, $comments, $carrierData, $tracking);
}
// Takes the actions necessary to get an order to Complete
function CompleteOrder($order, $comments, $carrierData, $tracking)
{
// first create a shipment
try
{
$shipment = $order->prepareShipment();
if ($shipment)
{
$shipment->register();
$shipment->addComment($comments, false);
$order->setIsInProcess(true);
// add tracking info if it was supplied
if (strlen($tracking) > 0)
{
$track = Mage::getModel('sales/order_shipment_track')->setNumber($tracking);
# carrier data is of the format code|title
$carrierData = preg_split("[\|]", $carrierData);
$track->setCarrierCode($carrierData[0]);
$track->setTitle($carrierData[1]);
$shipment->addTrack($track);
}
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($shipment)
->addObject($shipment->getOrder())
->save();
// send the email if it's requested
if (isset($_REQUEST['sendemail']) && $_REQUEST['sendemail'] == '1')
{
$shipment->sendEmail(true);
}
}
}
// Only one shipment can be created per order. Subsequent attempts will throw, but we ignore the error and move on to setting up the invoice.
catch (Exception $ex)
{
}
// invoice the order
if ($order->hasInvoices())
{
// select the last invoice to attach the note to
$invoice = $order->getInvoiceCollection()->getLastItem();
}
else
{
// prepare a brand-new invoice
$invoice = $order->prepareInvoice();
$invoice->register();
}
// capture the invoice if possible
if ($invoice->canCapture())
{
$invoice->Capture();
}
// some magento versions prevent multiple pay() calls from have impact,
// but others don't. If pay is called multiple times, Order.Total Paid is off.
if ($invoice->getState() != Mage_Sales_Model_Order_Invoice::STATE_PAID)
{
$invoice->pay();
}
// set the comment
$invoice->addComment($comments);
// save the new invoice
$transactionSave = Mage::getModel('core/resource_transaction')
->addObject($invoice)
->addObject($invoice->getOrder());
$transactionSave->save();
// Saving will force magento to move the state/status
$order->save();
}
// Changes the status of an order
function ExecuteOrderCommand($order, $command, $comments, $carrierData, $tracking)
{
try
{
// to change statuses, we need to unhold if necessary
if ($order->canUnhold())
{
$order->unhold();
$order->save();
}
switch (strtolower($command))
{
case "complete":
CompleteOrder($order, $comments, $carrierData, $tracking);
break;
case "cancel":
$order->cancel();
$order->addStatusToHistory($order->getStatus(), $comments);
$order->save();
break;
case "hold":
$order->hold();
$order->addStatusToHistory($order->getStatus(), $comments);
$order->save();
break;
default:
outputError(80, "Unknown order command '$command'.");
break;
}
writeStartTag("Debug");
writeElement("OrderStatus", $order->getStatus());
writeCloseTag("Debug");
}
catch (Exception $ex)
{
outputError(90, "Error Executing Command. ". $ex->getMessage());
}
}
// Converts a sql data string to xml date format
function FormatDate($dateSql)
{
$pattern = "/^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/i";
if (preg_match($pattern, $dateSql, $dt))
{
$dateUnix = mktime($dt[4], $dt[5], $dt[6], $dt[2], $dt[3], $dt[1]);
return gmdate("Y-m-d\TH:i:s", $dateUnix);
}
return $dateSql;
}
// end output
ob_end_flush();
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment