Starting from version 1.01, the following changes have been
made to each version, to help with updating between versions
if you should have already installed this product.

Changes from 1.01 to 1.02
-------------------------------

    1.  Modified the install_upsxml.sql file to include the missing line:    
        package_empty_weight DECIMAL(6,2) DEFAULT '0' NOT NULL,    
        To amend an existing table, use:    
        alter table packaging add package_empty_weight DECIMAL(6,2) DEFAULT '0' NOT NULL;    
    2.  Modified the admin/categories.php file. Changed the line from:    
        tep_db_query("insert into " . TABLE_PRODUCTS . " (products_quantity, products_model, products_image, products_price, products_date_added, products_date_available, products_weight, products_length, products_width, products_height, products_ready_to_ship, products_status, products_tax_class_id, manufacturers_id) values ('" . $product['products_quantity'] . "', '" . $product['products_model'] . "', '" . $product['products_image'] . "', '" . $product['products_price'] . "',  now(), '" . $product['products_date_available'] . "', '" . $product['products_weight'] . "', '" . $product['products_length'] . "', '" . $product['products_width'] . "', '" . $product['products_height']. "', '0', '" . $product['products_tax_class_id'] . "', '" . $product['manufacturers_id'] . "')");
        to
        tep_db_query("insert into " . TABLE_PRODUCTS . " (products_quantity, products_model, products_image, products_price, products_date_added, products_date_available, products_weight, products_length, products_width, products_height, products_ready_to_ship, products_status, products_tax_class_id, manufacturers_id) values ('" . $product['products_quantity'] . "', '" . $product['products_model'] . "', '" . $product['products_image'] . "', '" . $product['products_price'] . "',  now(), '" . $product['products_date_available'] . "', '" . $product['products_weight'] . "', '" . $product['products_length'] . "', '" . $product['products_width'] . "', '" . $product['products_height']. "', '" . $product['products_ready_to_ship'] . "', '0', '" . $product['products_tax_class_id'] . "', '" . $product['manufacturers_id'] . "')");
    3.  Updated the admin/packaging.php file (too many changes to list here)
        (do a diff, if you like, but just copy the file.)
    4.  Updated admin/includes/languages/english.php, added the declaration:
        define('BOX_TOOLS_PACKAGING', 'Packaging');
    5.  Modified catalog/inclues/modules/shipping/upsxml.php
        Corrected the European union service codes. The last two were mistakenly
        enumerated 68 and 69, instead of 64, 65.
    6.  Enabled commercial/residential quoting. Unfortunately, this will be
        permanently set to one or the other (i.e. Not selectable at shipping time
        by the customer, since, who else knows best whether they're a commercial
        or residential quote!)
    7.  Enabled Customer Classification. This allows you to specify what type of
        outlet you are shipping from (I suppose this is the same as above, but for
        the shipper...)

Changes from 1.02 to 1.03
-------------------------------

    1.  Removed &reg; and <sup>SM</sup> from catalog/includes/languages/modules/shipping/upsxml.php
        This caused a bug that increased shipping costs when anything other than UPS Ground was chosen.    
    2.  Added Ground Time in Transit Capability to /catalog/includes/modules/shipping/upsxml.php
        Just copy over the file.  There are too many changes to enumerate.

*PRELIM* Changes for 1.03.02
-----------------------------------

    1.  Adjusted ZIP package layout so files/directories are in their proper places. 
    2.  Modified the two 'xmldocument.php' script to prevent the warning messages:
        Warning: Call-time pass-by-reference has been deprecated - argument passed by value;
        If you would like to pass it by reference, modify the declaration of 
        [runtime function name](). If you would like to enable call-time
        pass-by-reference, you can set allow_call_time_pass_reference to true in your
        INI file. However, future versions may not support this any longer.
    3.  Modified the upsxml.php script to defaut DIMENSIONS_SUPPORTED to '0' instead of '1' to
        work 'out-of-the-box', as instructions imply.
    4.  Modified the upsxml.php script to comment out logfile. It was enabled, and very few (read: 1)
        folks have the default logfile path.

Changes from 1.03.02 to 1.04
----------------------------------

    1.  Added selectable services to be offered from Admin interface
    2.  Added missing fields to Time In Transit request which were causing errors to be shown for international shipments
        (No times are shown for international, but the error is gone - Put that on the to-do list)
    3.  Updated installation instructions for both the shipping module and the packaging module

Changes from 1.04 (and 1.04.1) to 1.1
---------------------------------------------

    1.  Reformatted files. Line numbers may not match previous versions. Functionality unchanged
    2.  Set Time In Transit to be disabled by default - Simple change to 4 lines required in upsxml.php in order to enable
        explained in readme.txt
    3.  Fixed bug that would yield inaccurate package count (and rates) in certain circumstances where a cart had mixed
        "ready-to-ship" and non "ready-to-ship" products.
    4.  Removed "include(DIR_WS_CLASSES . 'htaccess.php');" from catalog/admin/packaging.php
        (no one has ever figured out why it was there in the first place)

Changes from 1.1 to 1.1.1
------------------------------
    1.  Corrected misspelling in catalog/includes/modules/shipping/upsxml.php line 647:
        $sheduledTime = $ratedShipments[$i]->getValueByPath("/ScheduledDeliveryTime");
        corrected to read
        $scheduledTime = $ratedShipments[$i]->getValueByPath("/ScheduledDeliveryTime");
    2.  In catalog/admin/packaging.php, there were 2 instances where a "$error" had somehow crept into the code:
        Line 196
        function showNewPackageForm($error) {
        corrected to read
        function showNewPackageForm() {
        and line 225
        function showUpdatePackageForm($error) {
        corrected to read
        function showUpdatePackageForm() {

Changes from 1.1.1 to 1.1.2
------------------------------
    1.  Added the Time in Transit patch v2 by Greg MacLellan to the complete package.
        The install query is now added to upsxml.php, no need to do that manually,
        uninstall query works also. A "define" added to 
        /catalog/includes/english/languages/modules/shipping/upsxml.php
    2.  Added two curl_setopt lines (around line 617): 
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        On certain servers upsxml doesn't work without these two lines. Might be related
        to Apache2 versus Apache1. See for the "source" of the fix:
        forums.oscommerce.com/index.php?showtopic=49832&st=100
    3.  Fixed a bug that would cause checkout_shipping to reload on submit with often
        wrong amounts for shipping (around line 231, changing $type to 
        "$type = $type, deliverydate" caused the error).
    4.  Small changes to the readme.txt to include the Shipping Delay option and
        hopefully clarifying a few more points.

Changes from 1.1.2 to 1.1.3
------------------------------
    1.  Corrected a logic error in the fix described under 3, above. $_type would be
	undeclared if the Time in Transit module didn't return anything.

Changes from 1.1.3 to 1.1.3a
-------------------------------
Modified catalog/includes/modules/shipping/upsxml.php
LINE 201: $this->items_qty = 0; //reset quantities

Changes from 1.1.3 to 1.1.4
-------------------------------
Modification of catalog/includes/modules/shipping/upsxml.php in function _post to 
1. also log cURL errors if they occur 
2. add the date and time of the UPS request to the log file. 
3. The two lines:
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
are commented out again. These need only be uncommented if you get curl error 60: 
"error setting certificate verify locations" and likely only the first one.
Search the cURL website (http://curl.haxx.se) for more details on this error. 
For a list of the cURL options and a list of errors, see http://curl.haxx.se/docs/manpage.html.
4. As default, cURL is assumed to be compiled into PHP. If not (some Linux users and apparently
Windows users) you can try setting line 74 to: $this->use_exec = '1';
Code for checking if exec() can be called and using it to execute cURL was taken from the file authorizenet_direct.php from the contribution Authorize.Net Consolidated 1.7b with Curl Fix
(contribution 2184). Without using addslashes() on the xmlRequest before using it in the exec() statement would give a 100001 error from UPS: The XML document is not well formed.
5. Editing of some comments regarding the Time in Transit code


Changes from 1.1.4 to 1.1.5
-------------------------------
Changes by Joe McFrederick jomcfred@oldeparsonage.com

Support to enable insurance added. Only modified /catalog/includes/modules/shipping/upsxml.php



Changes from 1.1.5 to 1.2
-------------------------------


In includes/modules/shipping/upsxml.php


Changed the packing algorithm such that there are no longer disappearing items (and therefore quotes are received for less weight than the actual one). Added some more checks on the sizes (if an item is bigger than the largest box the program would get into a loop, it avoids that now by declaring it a ready-to-ship item when that happens).
Removed the define for DIMENSIONS_SUPPORTED -> is an admin setting now.

Corrected the setting of $this->host (line 59). The test server would be used whatever setting chosen in the admin.

Changed the $this->pickup_methods (line 100) in accordance with the UPS info of January 2006 (and added "Suggested Retail Rates (UPS Store)").

Removed the package type: 'Unknown' => '00' since it is no longer accepted by UPS (was not selectable in the admin anyway).

Changed the input of the Customer Classification Code to radio buttons (admin settings).

Changed the excluding of shipping options from having the allowed options stored in the database to having the disallowed options stored (this makes installation less sensitive to operator error, the module does not depend on correct installation of the things needed for that). 
Added more options (in particular several used outside the US).


**IMPORTANT** 
When upgrading from a version before this one, you *HAVE* to go into the admin, modules shipping, make a note of the settings (especially Access Key, Username and Password) and "remove" UPSXML and then install. Otherwise the shipping options you did not wanted to offer are now the only ones offered!


According to UPS the CustomerClassification and PickupType containers should not be present when the origin country is non-US (http://forums.oscommerce.com/index.php?s=&showtopic=49382&view=findpost&p=730947). This is now implemented in the Rating request (left out when the origin is not the US).
Added another option for the dimensions support: only provide sizes for the package with ready-to-ship items and calculate the number of packages for the other articles in a shipment the standard osC way (see dimensions.txt for more information).
Added the possibility to only log errors received from UPS to a separate log file and the possibility to have any errors emailed to the shop owner right away (disable in the admin).
Added a bit more code to make sure the pickup date is not a Saturday or a Sunday (UPS would have corrected for that anyway, so no big deal).
Rounded the total weight shown to the customer down to a whole number (see around line 298 and 300).
Added the 1.1.5a bug fix for admin/categories.php to the instructions.

In includes/languages/english/modules/shipping/upsxml.php

Updated the services according to the latest (January 2006) developer info of UPS.
Removed the &reg; in one of the Puerto Rico options.

Changes from 1.2 to 1.2.1
-------------------------------
Changes by mucter

- added the ability to choose the time in transit display being either the raw style or the more readable version from the admin tool instead of having to edit the code.
- created a workaround for when the total weight of all boxes is greater than the maximum weight for time in transit in either lbs (150) or kgs (70). It will limit the weight to the maximum just for time in transit (will not affect shipping wieght).
- Added the ability to define handling fee as either a Flat Fee or a Percentage throught the admin screen.

Changes from 1.2.1 to 1.2.2
-------------------------------
Correction of an error in the function getPackagesByVol() (includes/modules/shipping/upsxml.php) where the volume was queried as length*width*length where it should have been length*width*height.

Changes from 1.2.2/3 to 1.2.4
-------------------------------
The services were updated according to Version 1.0, Volume 7, Number 1, Revision Date: December 17, 2006 of the Rates and Services XML Programming Information. Biggest change: Express Saver is now called Saver and is available world wide. Also UPS is charging more according to volume instead of weight only, so using dimensions support might become more interesting for a number of shops.
The option to ask UPS to quote your negotiated rates (if you have those!) was built in (two more upsxml keys are needed for this in configuration so remove - upload new files - install is needed for all upgrades to this version).
The insured value is now divided over the packages instead of the total insured value on each package (causes over charging).
Internally both items and boxes are sorted x,y,z where x < y < z to cut down on the calculations to see if an item fits in a box (instead of calculating the diagonal of the item and the box each time).
The function function exclude_choices is now a class function, a new function was added called more_dimensions_to_productsArray (to help cut down on calculations)

Changes from 1.2.4 to 1.2.5
-------------------------------
Bugfix on line 248 in /shipping/upsxml.php
usort($productsArray, $this->ready_to_shipCmp); should have been:
usort($productsArray, ready_to_shipCmp);
Changes in the packaging algorithms to deal with products that do not fit the largest box you have, but do fit in one of the smaller boxes (for example long, thin items). This used to result in becoming them ready-to-ship items.

Bugfix in admin/packaging.php: in the function DisplayPackages $activeid['id'] was used on line 193 and 194 where is should have been $activeid. This resulted in not being able to edit or delete certain boxes.
Added a bit more text in the readme.txt with respect to removing shipping methods to make things fit in 255 characters (step 5). 

Changes from 1.2.5 to 1.2.6
-------------------------------
Bugfix in function packProducts (line 529 and further) in /shipping/upsxml.php where the sanity check on product dimensions ignored packages that were declared ready-to-ship.
Added an example UPS response (rates) and instructions to use that in testing the module plus a screenshot of how that shows up in checkout_shipping.php.
With thanks to John Wisdom for testing.

Changes from 1.2.6 to 1.2.7
---------------------------
Bugfix in admin/packaging.php: $Action was not "register globals proof". Should have been $_GET['Action'].

Change in function _transitparseResult. In the admin configuration "Saver" is used as the name for excluding that shipping option. However, the time_in_transit response uses UPS Worldwide Saver. That wouldn't be recognized when excluding choices, so the name is changed in that function.
You can change the name of UPS Saver in catalog/includes/languages/your_language/modules/shipping/upsxml.php to for example UPS Worldwide Saver, but be aware that the exclude choices function will not catch it then.

Bugfix in the function packProducts. In certain, rather special circumstances, the program could get into a loop if the cart contained enough items products that would fit only in a smaller box but would not fit in only one of those boxes. The code would try to use a larger box which obviously wouldn't work. For this the function fitProductsInBox was adapted too.
The function packProducts also had a bug in the sanity check on the product. It would look for the string '0' in $product['ready_to_ship'] but if this was empty due to a faulty install, it would get into a loop. Now it will first cast it to an integer so an empty string would be zero too.

Last but not least additional instructions and admin pages have been added for splitting a product in several items. Probably not many shops will need this, so it is added as a mod, after you have added the dimensions support. The shipping file upsxml.php need no changes for it, the splitting is done in a new function that needs to be added to the class shopping_cart.php (get_products_for_packaging). The upsxml.php looks if that function is in that class but if not it will use the regular get_products instead.

Changes from 1.2.7 to 1.2.8
---------------------------
Bug fix in categories.php for the split_products modification. Displayed errors while adding a new product to the shop.
In the popup window admin/split_product.php some debug code was left which prevented the display of results of the (second or more) newly inserted split product.



Changes from 1.2.8 to 1.2.8.1

-----------------------------

Added configuration value to allow choosing whether or not to display time in transit from the admin control panel.

Changes from 1.2.8.1 to 1.2.9
---------------------------
Added support to store the results of the packaging algorithm in the database. Two pieces of code were added to upsxml.php for that:

After line 98:        $this->use_exec = '0';

        $this->store_boxes_used = 0;

After line 238:            $boxesToShip = $this->packProducts($productsArray);

            if (isset($this->store_boxes_used) && $this->store_boxes_used == 1) {
            $storeBoxesToShip = base64_encode(serialize($boxesToShip));
            $storeQueryArray = array('date' => 'now()', 'customers_id' => $_SESSION['customer_id'], 'boxes' => $storeBoxesToShip);
            tep_db_perform(TABLE_UPS_BOXES_USED, $storeQueryArray);
            }
            
The rest of the modification is described in the file store_ups_boxes_used_instructions.txt. If you want to upgrade to this version, there is *no* need for a de-install and install in the admin. Just follow the directions in store_ups_boxes_used_instructions.txt, change the zero in line 99 of upsxml.php to a one and upload the new file to replace the old file upsml.php.

Changes from 1.2.9 to 1.3.0
---------------------------

- Moved settings for unit weight, unit length and dimensional support to the configuration of Shipping/Packaging. 
- Moved the packaging algorithms for dimensional support to a separate class (packing) so that other shipping modules which want to use dimensional support don't need to implement everything in that module again (not to mention the multiple queries for the product dimensions). 
- Moved away from the xmldocument.php that was used to parse the XML from UPS to a small xml library from Keith Devens: http://keithdevens.com/software/phpxml. This is also used by the BAXGlobal Shipping Module  v2.0 (http://addons.oscommerce.com/info/2948 by kymation). The version for PHP 5 was directly taken from it. If you also use that module be sure to change the require (DIR_WS_CLASSES . 'xml.php'); in that shipping module to: require_once (DIR_WS_CLASSES . 'xml.php'); (ditto for the xml_5.php). The change of xml parser made it possible to check if negotiated rates are returned. If not then the list rates are used.
- Changed the way how the types of shipping methods UPS offers (to select the ones *you* don't want to offer) are stored in the database. Before it needed the field set_function in the table configuration to be enlarged from varchar(255) to text. Inevitably there were people who forgot to do that or too late or didn't know how so got in trouble.
- Another stumbling block was the addition of the function tep_cfg_select_multioption to the admin/included/functions/general.php. Since the change of how the shipping methods are stored also needed two new functions that can only be used for the UPSXML module these functions were added to the shipping module itself (outside of the class). They are get_multioption_upsxml and upsxml_cfg_select_multioption_indexed and can be moved to admin/included/functions/general.php. Don't forget to remove them from a new version of the shipping module upsxml.php in case of a future update!
- If you don't want to show transit times (expected day of delivery) you can simply choose that in the admin now instead of commenting out a piece of code in the shipping module.
- In case you don't want to show the number of packages and the weight you can choose that in the admin too now.
- In case transit times were not returned due to an error or something the module doesn't show them instead of producing an error.
- Fixed a few small bugs in the ups_boxes_used.php file (addon for when you use dimensional support).
- Fixed a bug in the included admin/categories.php in the query used when copying an item. Updated the file to RC1.
- Removed the (XML) behind United Parcel Service as shown on checkout_shipping.php and in the admin since the original UPS module was removed from osC already a number of years ago so the majority of users will not be confused in the admin by seeing two shipping modules "United Parcel Service" (one the original and one the UPSXML).

Changes from 1.3.0 to 1.3.1
---------------------------

- Forgot to add a fix for Brazilian postcodes and outlying US territories by Steve Lionel (http://forums.oscommerce.com/index.php?s=&showtopic=49382&view=findpost&p=1172541) which is dealt with by changing the function _upsDest($city, $stateprov, $country, $postal). Only file changed is catalog/includes/modules/shipping/upsxml.php.

Changes from 1.3.1 to 1.3.2
---------------------------

- With directions of Steve Lionel (stevel) a sort function (as a class method) was added to catalog/includes/modules/shipping/upsxml.php. Up until 1.3.2 the rates were shown in the order as they are received from UPS. Now they are sorted on cost (low to high, see line 309 and 316 inside the function quote). If you want to have the high rates first, go to the function rate_sort_func that starts on line 983 and comment out one line and uncomment another (990 <-> 991).

Changes from 1.3.2 to 1.3.3
---------------------------

In the function quote the $zone_query (around line 234 in version 1.3.2) does not use the function tep_db_input to "add slashes" to the state. With a state that has an apostrophe in the name (an example of a country would be Cote D'Ivoire) this would result in a MySQL error.

**CHANGE**

        $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_name = '" .  $order->delivery['state'] . "'");

**TO**

        $zone_query = tep_db_query("select zone_code from " . TABLE_ZONES . " where zone_name = '" .  tep_db_input($order->delivery['state']) . "'");

Changes from 1.3.3 to 1.3.4
---------------------------

Updates to the shipping module and the language module because a number of shipping options were added for some origins. In Europe Expedited was added, for Poland (domestic only) two new services were added and "other origins" had Standard added as a shipping option (for instructions on how to upgrade see a little further).
Shippers from Mexico, USA, and Canada do not need to upgrade.

Changes from 1.3.5 to 1.3.6
---------------------------

Moved the sql for "Manual Negotiated Rate" from configuration_shipping.sql to within upsxml.php as all others are. Moved the place to where it does it's job to the function _parseResult($xmlResult).

Adapted the code for when using exec with curl because of a small change in the UPS API for Rates. When a line break was added after <?xml version="1.0"?> in the Rates reply suddenly the array that curl using exec returns contained in array[0] the <?xml version="1.0"?> and in array[1] the rest of the message. Using an implode to paste them together again fixed that (see http://forums.oscommerce.com/index.php?showtopic=340792 for the post of member Thomas Dorris who ran into this issue).

Removed the hard coded pkgValue when no insurance was needed to do it the right way and not include it in the xml request (in a section <PackageServiceOptions>) instead of using a value that (hopefully) not triggered an insurance fee. It would trigger an error anyway in countries where insurance is not possible.
Added UPS Worldwide Express Plus (code 54) as a shipping option for Canada in both upsxml.php files. This was added by UPS as a shipping options somewhere around July 2008.
Added missing:

define('TEXT_DISPLAY_NUMBER_OF_SHIPMENTS', 'Displaying <b>%d</b> to <b>%d</b> (of <b>%d</b> shipments)');

to admin/includes/languages/english/ups_boxes_used.php

Fixed admin/categories.php in the section copy/duplicate where dimensions of a product were not copied to the new product (must have given errors). Updated the instructions for the version of RC2a and the included file too.

Moved the instructions for installing upsxml to a new file: install.txt and all the things for dimensional support to a folder dimensional_support to make things clearer.

Changes from 1.3.6 to 1.3.7 by Kevin L. Shelton
---------------------------

Fixed a bug where UPSXML was changing the value of $shipping_num_boxes provided by osCommerce without ever using the changed value. This was causing problems with the USPS shipping module.

In testing the packaging with an order for a large number of "ready to ship" products I discovered that the UPS rates tool cannot process a shipment with more than 50 boxes. While it isn't likely that anyone will actually place an order that will be divided into more than 50 boxes we still don't want an error message returned if such an order does get placed. I therefore added code to the _upsGetQuote routine to split such orders into groups of 50 boxes in order to retrieve all of the quotes and then more code in the parseResult routine to combine the multiple shipment quotes into a single set of rate quotes so that service types aren't listed more than once.

Added code to display the billed weight for each service (the dimensional weight) if weights are being displayed.

Changes from 1.3.7 to 1.3.8 by Cooler Dude
---------------------------
Incorporated fix submitted by markbmorgan
Fixed bug introduced into the install() function. An install query was trying to insert into the "configuration_id" column of the "configuration" table, causing the install to fail.
Removed unnecessary DS_STORE files

Changes 1.3.9 to 1.4.0
---------------------------
Updated for 2.3.1 only.  All previous changes maintained from 1.3.9
Major alterations to the admin/includes/functions/general.php file to include new subroutines added in OSC 2.3.1
Changed Step 3 in install.txt to match the new format of Modules.php.

Changes to 1.5 by Kevin L. Shelton
------------------------------------------
Updated admin files to osCommcerce 2.3 standards.
Consolidated XML class files into one file with appropriate code depending upon PHP version.

Changes in version 1.6.1 by Kevin L. Shelton
---------------------------------------------------
1) This module has been completely updated to use the new shoptimeintransit method introduced by UPS in January 2017. This allows both rate information and time in transit to be retrieved with a single call to the UPS API rather than the two call system required by previous versions of the module when displaying time in transit.
2) Because of the preceding change the module will now include quotes for Saturday Delivery services where available unless you have specifically disabled the services to which Saturday Delivery can be added.
3) The complete delivery address is now sent with the request for rates in order to provide the most accurate rate quotes possible. Providing the complete address will in most cases allow UPS to automatically determine if the address is residential or commercial and therefore return the correct type of quote. For those cases where the type of address can't be automatically determined the quote will be based on the residential/commercial setting of the module.
4) The module is now capable of returning quotes for UPS SurePost which will add an extra call to the UPS API when SurePost is an option. To use SurePost your UPS account MUST first be enabled to use UPS SurePost by your UPS account manager. This module will not even attempt to retrieve a SurePost quote unless the shipment meets all of the following criteria:
  a) SurePost has been enabled in the module
  b) The UPS account number has been entered into the module
  c) There is only one package to ship and it is valued at no more than the amount set by the module configuration (since SurePost cannot be insured I recommend leaving this at the default $100 which is the default UPS insurance).
  d) The package is going to the United States or a US territory
  e) The package is being shipped from the United States
  f) The package weighs no more than 70 pounds (the weight limit for the Postal Service who will ultimately deliver the package).
Please note that the UPS API will return an error message if a SurePost quote is requested and the given UPS account number has not been enabled to use SurePost. This error message would only be presented to the user if no other UPS methods are available to the destination, which would pretty much have to be because all other methods have been blocked in the module configuration. Note that this module will not attempt to quote SurePost BPM or SurePost Media since it has no way of knowing if all items in the package are Bound Printed Matter or Media respectively.
5) The XML class files have been stripped of all code intended for PHP versions prior to 5. Since any server used by ecommerce can be expected to be using PHP version 5 or later the older code was deemed unnecessary.
6) The packaging class was updated with a bit of code meant for better handling of non-ready-to-ship products that will not fit in any defined package. In such cases an inch is added to all dimensions and weight based on product volume is added to help account for the fact that, since the product will most likely be packed in a box of some kind with some added packing material which adds both a bit of size and weight or it would have been marked ready-to-ship, we need to adjust what is going to be said to be a ready-to-ship package in order to get a better shipping quote. Also incorrect and unneeded value type casting was removed from the add_item function of the packaging class.
7) The Shipping Boxes Used utility was updated with a button that allows you to delete all records older that the entered date (a date one month in the past is automatically entered but this can be changed). An error in </form> tag locations was corrected to allow the changing of pages using the drop down menu to work properly.

Changes in version 1.72 by Kevin L. Shelton
---------------------------------------------------
Changed production server address from www.ups.com to onlinetools.ups.com as the original production server location is being deprecated as of December 31, 2018.
Updated API subversion to 1801.

Changes in version 1.73 by Kevin L. Shelton
---------------------------------------------------
Updated destination post office box check to test more abbreviations people use for a PO Box including if they spell it out completely.
