Index: branches/5.1.x/units/shipping_quote_engines/usps.php =================================================================== diff -u -N -r13813 -r13985 --- branches/5.1.x/units/shipping_quote_engines/usps.php (.../usps.php) (revision 13813) +++ branches/5.1.x/units/shipping_quote_engines/usps.php (.../usps.php) (revision 13985) @@ -1,6 +1,6 @@ GetQuote(); if ( !isset($rates['error']) ) { - $this->Application->RemoveVar('usps_errors'); + $this->Application->RemoveVar('sqe_error'); $i = 1; foreach ($rates as $k => $rate ) { @@ -1054,7 +1054,7 @@ } else { // for Front-End (shipping screen) and Admin (Shipping Tab on editing order) - $this->Application->StoreVar('usps_errors', $rates['error']); + $this->Application->StoreVar('sqe_error', $rates['error']); } $this->Application->StoreVar('current_usps_shipping_types', serialize($shipping_types)); @@ -1158,21 +1158,21 @@ return $body; } + /** + * Returns available shipping types + * + * @return Array + * @todo Get possible shipping types based on MODULE_SHIPPING_USPS_TYPES and MODULE_SHIPPING_USPS_TYPES_INTL consntants + */ function GetAvailableTypes() { - return array(); - $conn =& $this->Application->GetADODBConnection(); - $types = $conn->Query('SELECT * FROM '.TABLE_PREFIX.'ShippingType'); - - $ret = array(); - foreach ($types as $a_type) { - $a_type['_ClassName'] = get_class($this); - $a_type['_Id'] = 'CUST_'.$a_type['ShippingID']; - $a_type['_Name'] = '(Custom) '.$a_type['Name']; - $ret[] = $a_type; - } - return $ret; - + return Array ( + Array ( + '_ClassName' => get_class($this), + '_Id' => 'USPS', + '_Name' => 'USPS (Default)' + ) + ); } function LoadParams() @@ -1196,4 +1196,130 @@ { return Array ('AccountLogin'); } + + /** + * Creates new USPS order + * + * @param OrdersItem $object + * @param bool $dry_run + * @return Array + */ + function MakeOrder(&$object, $dry_run = false) + { + $ShippingInfo = unserialize($object->GetDBField('ShippingInfo')); + $ShippingCode = $USPSMethod = ''; + $ShippingCountry = $this->GetUSPSCountry($object->GetDBField('ShippingCountry')); + + $UserName = explode(" ", $object->GetDBField('ShippingTo')); + + $item_table = TABLE_PREFIX.'OrderItems'; + if ($this->Application->isAdminUser) { + // this strange contraption actually uses temp table from object (when in temp mode) + $order_table = $object->TableName; + $item_table = str_replace('Orders', 'OrderItems', $order_table); + } + + $sOrder = Array ( + 'FirstName' => $UserName[0], + 'LastName' => $UserName[1], + 'ShippingCompany' => $object->GetDBField('ShippingCompany'), + 'ShippingAddress1' => $object->GetDBField('ShippingAddress1'), + 'ShippingAddress2' => $object->GetDBField('ShippingAddress2'), + 'ShippingCity' => $object->GetDBField('ShippingCity'), + 'ShippingZip' => $object->GetDBField('ShippingZip'), + 'ShippingCountry' => $ShippingCountry, + 'ShippingPhone' => $this->PhoneClean($object->GetDBField('ShippingPhone')), + 'ShippingFax' => $this->PhoneClean($object->GetDBField('ShippingFax')), + 'ShippingNumBoxes' => '1', + ); + + $sql = 'SELECT SUM(`Quantity` * `Weight`) + FROM ' . $item_table . ' + WHERE ' . $object->IDField . ' = ' . $object->GetID(); + $weight = $this->Application->Conn->GetOne($sql); + + $f_weight = Kg2Pounds($weight); + $sOrder['ShippingWeight'] = $f_weight[0].'.'.$f_weight[1]; + + foreach ($ShippingInfo as $k => $ShippingRow) { + $ShippingCode = $ShippingRow['Code']; + } + + if ( $object->GetDBField('ShippingCountry') == 'USA' ) { + $sOrder['ShippingState'] = $object->GetDBField('ShippingState'); + $USPSMethod = $ShippingCode; + unset($sOrder['ShippingZip']); + + $sOrder['ShippingZip5'] = substr(trim($object->GetDBField('ShippingZip')), 0, 5); + $sOrder['ShippingZip4'] = ''; + $sOrder['SubTotal'] = $object->GetDBField('SubTotal'); + } + else { + $USPSMethod = array_search($ShippingCode, $this->intl_types); + $sOrder['ShippingProvince'] = ''; + + if ( $ShippingCountry == 'CA' ) { + $sOrder['ShippingProvince'] = $object->GetField('ShippingState'); + } + + // add items + $sql = 'SELECT `Quantity`, `Weight`, `Price` + FROM ' . $item_table . ' + WHERE ' . $object->IDField . ' = ' . $object->GetID(); + $order_items = $this->Application->Conn->Query($sql); + + $i = 1; + $Items = Array(); + + foreach ($order_items as $k => $order_item) { + $p_weight = Array(); + $p_weight = Kg2Pounds($order_item['Weight']); + $Items[$i] = Array('Qty' => $order_item['Quantity'], 'Price' => $order_item['Price'], 'NetPounds' => $p_weight[0], 'NetOunces' => $p_weight[1]); + $i++; + } + + $sOrder['Items'] = $Items; + $sOrder['InvoiceNumber'] = $object->GetDBField('OrderNumber'); + } + + $sOrder['ShippingService'] = $USPSMethod; + + // make USPS order + $this->order = $sOrder; + $usps_data = $this->PostOrder(); + + // if errors + if ( array_key_exists('error_number', $usps_data) ) { + return $usps_data; + } + + if ( array_key_exists('Postage', $usps_data) ) { + $ShippingPrice = ''; + $ShippingPrice = $usps_data['Postage']; + } + + $ShippingTracking = ''; + + if ( isset($usps_data['TrackingNumber']) && $usps_data['TrackingNumber'] != '' ) { + $ShippingTracking = $usps_data['TrackingNumber']; + } + + if ( isset($usps_data['PostnetBarCode']) && $usps_data['PostnetBarCode'] != '' && $ShippingTracking == '' ) { + $ShippingTracking = $usps_data['PostnetBarCode']; + } + + if ($dry_run == false) { + $object->SetDBField('ShippingTracking', $ShippingTracking); + $object->Update(); + } + else { + $full_path = USPS_LABEL_FOLDER . $ShippingTracking . ".pdf"; + + if (file_exists($full_path)) { + unlink($full_path); + } + } + + return $usps_data; + } } \ No newline at end of file Index: branches/5.1.x/units/orders/orders_event_handler.php =================================================================== diff -u -N -r13933 -r13985 --- branches/5.1.x/units/orders/orders_event_handler.php (.../orders_event_handler.php) (revision 13933) +++ branches/5.1.x/units/orders/orders_event_handler.php (.../orders_event_handler.php) (revision 13985) @@ -1,6 +1,6 @@ GetDBField('ShippingInfo'); + if ($shipping_info) { + $quote_engine_collector =& $this->Application->recallObject('ShippingQuoteCollector'); + /* @var $quote_engine_collector ShippingQuoteCollector */ + + $shipping_info = unserialize($shipping_info); + $shipping_quote_engine = $quote_engine_collector->GetClassByType($shipping_info, 1); + } + // try to create usps order - if ( $object->GetDBField('ShippingType') == 0 && strpos($object->GetDBField('ShippingInfo'), 'USPS')) { - $ses_usps_erros = Array(); - $ret = $this->MakeUSPSOrder($object); + if (($object->GetDBField('ShippingType') == 0) && ($shipping_quote_engine !== false)) { + $shipping_quote_engine =& $this->Application->recallObject($shipping_quote_engine); + /* @var $shipping_quote_engine ShippingQuoteEngine */ + + $ret = $shipping_quote_engine->MakeOrder($object); } if ( !array_key_exists('error_number', $ret) ) { @@ -1824,15 +1835,12 @@ $gateway_object->OrderShipped($object->FieldValues, $gw_data['gw_params']); } else { - $usps_errors[$object->GetField('OrderNumber')] = $ret['error_description']; - $ses_usps_erros = Array(); - $ses_usps_erros = unserialize($this->Application->RecallVar('usps_errors')); - if ( is_array($ses_usps_erros) ) { - $usps_errors = array_merge($usps_errors, $ses_usps_erros); - } - $this->Application->StoreVar('usps_errors', serialize($usps_errors)); - } + $sqe_errors = $this->Application->RecallVar('sqe_errors'); + $sqe_errors = $sqe_errors ? unserialize($sqe_errors) : Array (); + $sqe_errors[ $object->GetField('OrderNumber') ] = $ret['error_description']; + $this->Application->StoreVar('sqe_errors', serialize($sqe_errors)); + } break; case 'OnMassOrderProcess': @@ -3484,50 +3492,71 @@ } } + /** + * Updates shipping types + * + * @param kEvent $event + * @return bool + */ function UpdateShippingTypes(&$event) { - $object =& $this->Application->recallObject($event->getPrefixSpecial()); - $ord_id = $object->GetId(); + $object =& $event->getObject(); + /* @var $object OrdersItem */ + $ord_id = $object->GetID(); + $order_info = $this->Application->GetVar('ord'); $shipping_ids = getArrayValue($order_info, $ord_id, 'ShippingTypeId'); - if (!$shipping_ids) - { + if (!$shipping_ids) { return; } - $last_shippings = unserialize($this->Application->RecallVar('LastShippings')); + $ret = true; $shipping_types = Array(); + $last_shippings = unserialize( $this->Application->RecallVar('LastShippings') ); - $ret = true; - foreach($shipping_ids as $package => $id) - { + $template = $this->Application->GetVar('t'); + $shipping_templates = Array ('in-commerce/checkout/shipping', 'in-commerce/orders/orders_edit_shipping'); + + $quote_engine_collector =& $this->Application->recallObject('ShippingQuoteCollector'); + /* @var $quote_engine_collector ShippingQuoteCollector */ + + foreach ($shipping_ids as $package => $id) { // try to validate - if ( $object->GetDBField('ShippingType') == 0 && (strpos($id, 'USPS') !== false) && in_array($this->Application->GetVar('t'), Array('in-commerce/checkout/shipping','in-commerce/orders/orders_edit_shipping'))) { + $shipping_types[$package] = $last_shippings[$package][$id]; + $shipping_quote_engine = $quote_engine_collector->GetClassByType($shipping_types, $package); + + if (($object->GetDBField('ShippingType') == 0) && ($shipping_quote_engine !== false) && in_array($template, $shipping_templates)) { + $shipping_quote_engine =& $this->Application->recallObject($shipping_quote_engine); + /* @var $shipping_quote_engine ShippingQuoteEngine */ + + // set first of found shippings just to check if any errors are returned $current_usps_shipping_types = unserialize($this->Application->RecallVar('current_usps_shipping_types')); - $object->SetDBField('ShippingInfo', serialize(Array($package => $current_usps_shipping_types[$id]))); - $usps_data = $this->MakeUSPSOrder($object, true); - if ( !isset($usps_data['error_number']) ) { + $object->SetDBField('ShippingInfo', serialize( Array($package => $current_usps_shipping_types[$id])) ); + + $sqe_data = $shipping_quote_engine->MakeOrder($object, true); + + if ( !isset($sqe_data['error_number']) ) { // update only international shipping if ( $object->GetDBField('ShippingCountry') != 'USA') { - $last_shippings[$package][$id]['TotalCost'] = $usps_data['Postage']; + $shipping_types[$package]['TotalCost'] = $sqe_data['Postage']; } } else { - $this->Application->SetVar('usps_errors', $usps_data['error_description']); $ret = false; + $this->Application->StoreVar('sqe_error', $sqe_data['error_description']); } + $object->SetDBField('ShippingInfo', ''); } - $shipping_types[$package] = $last_shippings[$package][$id]; } + $object->SetDBField('ShippingInfo', serialize($shipping_types)); return $ret; } - /*function shipOrder(&$order_items) { $product_object =& $this->Application->recallObject('p', null, Array('skip_autoload' => true)); @@ -4054,137 +4083,6 @@ } /** - * Creates new USPS order - * - * @param OrdersItem $object - * @param bool $fake_mode - * @return Array - */ - function MakeUSPSOrder(&$object, $fake_mode = false) - { - $this->Application->recallObject('ShippingQuoteEngine'); - - $aUSPS = $this->Application->recallObject('USPS', 'USPS'); - /* @var $aUSPS USPS */ - - $ShippingInfo = unserialize($object->GetDBField('ShippingInfo')); - $ShippingCode = $USPSMethod = ''; - $ShippingCountry = $aUSPS->GetUSPSCountry($object->GetDBField('ShippingCountry')); - - $UserName = explode(" ", $object->GetDBField('ShippingTo')); - - $item_table = TABLE_PREFIX.'OrderItems'; - if ($this->Application->isAdminUser) { - // this strange contraption actually uses temp table from object (when in temp mode) - $order_table = $object->TableName; - $item_table = str_replace('Orders', 'OrderItems', $order_table); - } - - $sOrder = Array ( - 'FirstName' => $UserName[0], - 'LastName' => $UserName[1], - 'ShippingCompany' => $object->GetDBField('ShippingCompany'), - 'ShippingAddress1' => $object->GetDBField('ShippingAddress1'), - 'ShippingAddress2' => $object->GetDBField('ShippingAddress2'), - 'ShippingCity' => $object->GetDBField('ShippingCity'), - 'ShippingZip' => $object->GetDBField('ShippingZip'), - 'ShippingCountry' => $ShippingCountry, - 'ShippingPhone' => $aUSPS->PhoneClean($object->GetDBField('ShippingPhone')), - 'ShippingFax' => $aUSPS->PhoneClean($object->GetDBField('ShippingFax')), - 'ShippingNumBoxes' => '1', - ); - - $sql = 'SELECT SUM(`Quantity` * `Weight`) - FROM ' . $item_table . ' - WHERE ' . $object->IDField . ' = ' . $object->GetID(); - $weight = $this->Application->Conn->GetOne($sql); - - $f_weight = Kg2Pounds($weight); - $sOrder['ShippingWeight'] = $f_weight[0].'.'.$f_weight[1]; - - foreach ($ShippingInfo as $k => $ShippingRow) { - $ShippingCode = $ShippingRow['Code']; - } - - if ( $object->GetDBField('ShippingCountry') == 'USA' ) { - $sOrder['ShippingState'] = $object->GetDBField('ShippingState'); - $USPSMethod = $ShippingCode; - unset($sOrder['ShippingZip']); - - $sOrder['ShippingZip5'] = substr(trim($object->GetDBField('ShippingZip')), 0, 5); - $sOrder['ShippingZip4'] = ''; - $sOrder['SubTotal'] = $object->GetDBField('SubTotal'); - } - else { - $USPSMethod = array_search($ShippingCode, $aUSPS->intl_types); - $sOrder['ShippingProvince'] = ''; - - if ( $ShippingCountry == 'CA' ) { - $sOrder['ShippingProvince'] = $object->GetField('ShippingState'); - } - - // add items - $sql = 'SELECT `Quantity`, `Weight`, `Price` - FROM ' . $item_table . ' - WHERE ' . $object->IDField . ' = ' . $object->GetID(); - $order_items = $this->Application->Conn->Query($sql); - - $i = 1; - $Items = Array(); - - foreach ($order_items as $k => $order_item) { - $p_weight = Array(); - $p_weight = Kg2Pounds($order_item['Weight']); - $Items[$i] = Array('Qty' => $order_item['Quantity'], 'Price' => $order_item['Price'], 'NetPounds' => $p_weight[0], 'NetOunces' => $p_weight[1]); - $i++; - } - - $sOrder['Items'] = $Items; - $sOrder['InvoiceNumber'] = $object->GetDBField('OrderNumber'); - } - - $sOrder['ShippingService'] = $USPSMethod; - - // make USPS order - $aUSPS->order = $sOrder; - $usps_data = $aUSPS->PostOrder(); - - // if errors - if ( array_key_exists('error_number', $usps_data) ) { - return $usps_data; - } - - if ( array_key_exists('Postage', $usps_data) ) { - $ShippingPrice = ''; - $ShippingPrice = $usps_data['Postage']; - } - - $ShippingTracking = ''; - - if ( isset($usps_data['TrackingNumber']) && $usps_data['TrackingNumber'] != '' ) { - $ShippingTracking = $usps_data['TrackingNumber']; - } - - if ( isset($usps_data['PostnetBarCode']) && $usps_data['PostnetBarCode'] != '' && $ShippingTracking == '' ) { - $ShippingTracking = $usps_data['PostnetBarCode']; - } - - if ($fake_mode == false) { - $object->SetDBField('ShippingTracking', $ShippingTracking); - $object->Update(); - } - else { - $full_path = USPS_LABEL_FOLDER . $ShippingTracking . ".pdf"; - - if (file_exists($full_path)) { - unlink($full_path); - } - } - - return $usps_data; - } - - /** * Downloads shipping tracking bar code, that was already generated by USPS service * * @param kEvent $event Index: branches/5.1.x/admin_templates/orders/orders_edit_shipping.tpl =================================================================== diff -u -N -r13946 -r13985 --- branches/5.1.x/admin_templates/orders/orders_edit_shipping.tpl (.../orders_edit_shipping.tpl) (revision 13946) +++ branches/5.1.x/admin_templates/orders/orders_edit_shipping.tpl (.../orders_edit_shipping.tpl) (revision 13985) @@ -69,12 +69,9 @@ - - - - - - + @@ -241,4 +238,13 @@ + + + + \ No newline at end of file Index: branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php =================================================================== diff -u -N -r13813 -r13985 --- branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php (.../shipping_quote_engine.php) (revision 13813) +++ branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php (.../shipping_quote_engine.php) (revision 13985) @@ -1,6 +1,6 @@ - - Order: . USPS error:
+ + Order: . Error:
- - - + + + + +