Page MenuHomeIn-Portal Phabricator

in-commerce
No OneTemporary

File Metadata

Created
Mon, Jun 16, 3:31 AM

in-commerce

Index: branches/5.1.x/units/shipping_quote_engines/usps.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/usps.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/usps.php (revision 13813)
@@ -1,1196 +1,1199 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
define('MODULE_SHIPPING_USPS_TEXT_TITLE', 'United States Postal Service');
define('MODULE_SHIPPING_USPS_TEXT_DESCRIPTION', 'You will need to have registered an account with USPS. Click <a target="_blank" href="https://secure.shippingapis.com/registration/"><strong>HERE</strong></a> for registration details. USPS expects you to use pounds as weight measure for your products.');
define('MODULE_SHIPPING_USPS_TEXT_ERROR', 'An error occured with the USPS shipping calculations.<br>If you prefer to use USPS as your shipping method, please contact the store owner.');
define('MODULE_SHIPPING_USPS_TEXT_DAY', 'Day');
define('MODULE_SHIPPING_USPS_TEXT_DAYS', 'Days');
define('MODULE_SHIPPING_USPS_TEXT_WEEKS', 'Weeks');
define('MODULE_SHIPPING_USPS_STATUS', 'True'); // Do you want to offer USPS shipping?
define('MODULE_SHIPPING_USPS_SERVER', 'production'); // An account at USPS is needed to use the Production server // production othervise value may be 'test'
define('MODULE_SHIPPING_USPS_HANDLING', '0'); // Handling fee for this shipping method
define('MODULE_SHIPPING_USPS_TAX_CLASS', '0'); // Use the following tax class on the shipping fee
define('MODULE_SHIPPING_USPS_ZONE', '0'); // If a zone is selected, only enable this shipping method for that zone.
define('MODULE_SHIPPING_USPS_SORT_ORDER', '0'); // Sort order of display.
define('MODULE_SHIPPING_USPS_TYPES', 'PRIORITY, PARCEL'); // EXPRESS, FIRST CLASS, BMP, MEDIA 'Select the domestic services to be offered:
define('MODULE_SHIPPING_USPS_TYPES_INTL', 'EXPRESS MAIL INTERNATIONAL (EMS), EXPRESS MAIL INT, EXPRESS MAIL INT FLAT RATE ENV, PRIORITY MAIL INT, PRIORITY MAIL INT FLAT RATE ENV, PRIORITY MAILINT FLAT RATE BOX, FIRST-CLASS MAIL INT');// 'GLOBAL EXPRESS, GLOBAL EXPRESS NON-DOC RECT, GLOBAL EXPRESS NON-DOC NON-RECT, Select the international services to be offered:
define('MODULE_SHIPPING_USPS_OPTIONS', 'Display weight, Display transit time'); //
//configuration values for insurance
define('MODULE_SHIPPING_USPS_INS1', '1.65');// 'US/Canada insurance for totals $.01-$50.00
define('MODULE_SHIPPING_USPS_INS2', '2.05');// 'US/Canada insurance for totals $50.01-$100
define('MODULE_SHIPPING_USPS_INS3', '2.45');// 'US/Canada insurance for totals $100.01-$200
define('MODULE_SHIPPING_USPS_INS4', '4.60');// 'US/Canada insurance for totals $200.01-$300
define('MODULE_SHIPPING_USPS_INS5', '.90');// 'US/Canada insurance for every $100 over $300 (add)
define('MODULE_SHIPPING_USPS_INS6', '2.40');// 'International insurance for totals $.01-$50.00
define('MODULE_SHIPPING_USPS_INS7', '3.30');// 'International insurance for totals $50.01-$100
define('MODULE_SHIPPING_USPS_INS8', '4.20');// 'International insurance for totals $100.01-$200
define('MODULE_SHIPPING_USPS_INS9', '5.10');// 'International insurance for totals $200.01-$300
define('MODULE_SHIPPING_USPS_INS10', '.90');// 'International insurance for every $100 over $300 (add)
define('MODULE_SHIPPING_USPS_INSURE', 'True');// 'Insure packages shipped by USPS?
define('MODULE_SHIPPING_USPS_INSURE_TAX', 'True');// 'Insure tax on packages shipped by USPS?
define('USPS_LOG_FILE', WRITEABLE .'/user_files/usps.log');
class USPS extends ShippingQuoteEngine
{
var $countries, $pounds, $ounces, $insurance_cost = 0, $shipping_origin_country, $store_first_name, $store_last_name, $company_name, $store_name, $store_address1, $store_address2, $store_city, $store_state, $store_zip5, $store_zip4, $store_phone, $usps_userid;
var $order = Array();
var $types = Array();
var $intl_types = Array();
-
function USPS()
{
parent::kBase();
// EXPRESS, FIRST CLASS, PRIORITY, PARCEL, BMP, MEDIA
$this->types = Array(
'EXPRESS' => 'Express Mail',
'FIRST CLASS' => 'First Class Mail',
'PRIORITY' => 'Priority Mail',
'PARCEL' => 'Parcel Post',
'BPM' => 'Bound Printed Matter',
'MEDIA' => 'Media Mail'
);
$this->intl_types = Array(
// 'GLOBAL EXPRESS' => 'Global Express Guaranteed',
// 'GLOBAL EXPRESS NON-DOC RECT' => 'Global Express Guaranteed Non-Document Rectangular',
// 'GLOBAL EXPRESS NON-DOC NON-RECT' => 'Global Express Guaranteed Non-Document Non-Rectangular',
'EXPRESS MAIL INT' => 'Express Mail International (EMS)',
'EXPRESS MAIL INT FLAT RATE ENV' => 'Express Mail International (EMS) Flat Rate Envelope',
'PRIORITY MAIL INT' => 'Priority Mail International',
'PRIORITY MAIL INT FLAT RATE ENV' => 'Priority Mail International Flat Rate Envelope',
'PRIORITY MAIL INT FLAT RATE BOX' => 'Priority Mail International Flat Rate Box',
'FIRST-CLASS MAIL INT' => 'First-Class Mail International'
);
// get 2-symbol country code
$country = $this->Application->ConfigValue('Comm_Shipping_Country');
if ($country != '') {
$this->shipping_origin_country = $this->GetUSPSCountry($country, '');
}
$contact_name = trim($this->_prepare_xml_param($this->Application->ConfigValue('Comm_Contacts_Name')));
$split_pos = strpos($contact_name, ' ');
if ($split_pos === false) {
$this->store_first_name = $contact_name;
$this->store_last_name = '';
} else {
$this->store_first_name = substr($contact_name, 0, $split_pos);
$this->store_last_name = trim(substr($contact_name, $split_pos));
}
$this->company_name = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_CompanyName'));
$this->store_name = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_StoreName'));
$this->store_address1 = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Shipping_AddressLine1'));
$this->store_address2 = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Shipping_AddressLine2'));
if ($this->store_address2 == '') {
$this->store_address2 = $this->store_address1;
$this->store_address1 = '';
}
$this->store_city = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Shipping_City'));
$this->store_state = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Shipping_State'));
$zip = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Shipping_ZIP'));
$this->store_zip5 = substr($zip, 0, 5);
$this->store_zip4 = trim(substr($zip, 6), '-');
$this->store_phone = $this->_prepare_xml_param($this->Application->ConfigValue('Comm_Contacts_Phone'));
// get username and password fron config.
$a_params = $this->LoadParams();
$this->usps_userid = $a_params['AccountLogin'];
// Note by Erik: DO NOT CHANGE THIS ARRAY. It's values are sent to USPS service and any changes may impact class main functionality.
$this->countries = array(
'AF' => 'Afghanistan',
'AL' => 'Albania',
'DZ' => 'Algeria',
'AD' => 'Andorra',
'AO' => 'Angola',
'AI' => 'Anguilla',
'AG' => 'Antigua and Barbuda',
'AR' => 'Argentina',
'AM' => 'Armenia',
'AW' => 'Aruba',
'AU' => 'Australia',
'AT' => 'Austria',
'AZ' => 'Azerbaijan',
'BS' => 'Bahamas',
'BH' => 'Bahrain',
'BD' => 'Bangladesh',
'BB' => 'Barbados',
'BY' => 'Belarus',
'BE' => 'Belgium',
'BZ' => 'Belize',
'BJ' => 'Benin',
'BM' => 'Bermuda',
'BT' => 'Bhutan',
'BO' => 'Bolivia',
'BA' => 'Bosnia-Herzegovina',
'BW' => 'Botswana',
'BR' => 'Brazil',
'VG' => 'British Virgin Islands',
'BN' => 'Brunei Darussalam',
'BG' => 'Bulgaria',
'BF' => 'Burkina Faso',
'MM' => 'Burma',
'BI' => 'Burundi',
'KH' => 'Cambodia',
'CM' => 'Cameroon',
'CA' => 'Canada',
'CV' => 'Cape Verde',
'KY' => 'Cayman Islands',
'CF' => 'Central African Republic',
'TD' => 'Chad',
'CL' => 'Chile',
'CN' => 'China',
'CX' => 'Christmas Island (Australia)',
'CC' => 'Cocos Island (Australia)',
'CO' => 'Colombia',
'KM' => 'Comoros',
'CG' => 'Congo (Brazzaville),Republic of the',
'ZR' => 'Congo, Democratic Republic of the',
'CK' => 'Cook Islands (New Zealand)',
'CR' => 'Costa Rica',
'CI' => 'Cote d\'Ivoire (Ivory Coast)',
'HR' => 'Croatia',
'CU' => 'Cuba',
'CY' => 'Cyprus',
'CZ' => 'Czech Republic',
'DK' => 'Denmark',
'DJ' => 'Djibouti',
'DM' => 'Dominica',
'DO' => 'Dominican Republic',
'TP' => 'East Timor (Indonesia)',
'EC' => 'Ecuador',
'EG' => 'Egypt',
'SV' => 'El Salvador',
'GQ' => 'Equatorial Guinea',
'ER' => 'Eritrea',
'EE' => 'Estonia',
'ET' => 'Ethiopia',
'FK' => 'Falkland Islands',
'FO' => 'Faroe Islands',
'FJ' => 'Fiji',
'FI' => 'Finland',
'FR' => 'France',
'GF' => 'French Guiana',
'PF' => 'French Polynesia',
'GA' => 'Gabon',
'GM' => 'Gambia',
'GE' => 'Georgia, Republic of',
'DE' => 'Germany',
'GH' => 'Ghana',
'GI' => 'Gibraltar',
'GB' => 'Great Britain and Northern Ireland',
'GR' => 'Greece',
'GL' => 'Greenland',
'GD' => 'Grenada',
'GP' => 'Guadeloupe',
'GT' => 'Guatemala',
'GN' => 'Guinea',
'GW' => 'Guinea-Bissau',
'GY' => 'Guyana',
'HT' => 'Haiti',
'HN' => 'Honduras',
'HK' => 'Hong Kong',
'HU' => 'Hungary',
'IS' => 'Iceland',
'IN' => 'India',
'ID' => 'Indonesia',
'IR' => 'Iran',
'IQ' => 'Iraq',
'IE' => 'Ireland',
'IL' => 'Israel',
'IT' => 'Italy',
'JM' => 'Jamaica',
'JP' => 'Japan',
'JO' => 'Jordan',
'KZ' => 'Kazakhstan',
'KE' => 'Kenya',
'KI' => 'Kiribati',
'KW' => 'Kuwait',
'KG' => 'Kyrgyzstan',
'LA' => 'Laos',
'LV' => 'Latvia',
'LB' => 'Lebanon',
'LS' => 'Lesotho',
'LR' => 'Liberia',
'LY' => 'Libya',
'LI' => 'Liechtenstein',
'LT' => 'Lithuania',
'LU' => 'Luxembourg',
'MO' => 'Macao',
'MK' => 'Macedonia, Republic of',
'MG' => 'Madagascar',
'MW' => 'Malawi',
'MY' => 'Malaysia',
'MV' => 'Maldives',
'ML' => 'Mali',
'MT' => 'Malta',
'MQ' => 'Martinique',
'MR' => 'Mauritania',
'MU' => 'Mauritius',
'YT' => 'Mayotte (France)',
'MX' => 'Mexico',
'MD' => 'Moldova',
'MC' => 'Monaco (France)',
'MN' => 'Mongolia',
'MS' => 'Montserrat',
'MA' => 'Morocco',
'MZ' => 'Mozambique',
'NA' => 'Namibia',
'NR' => 'Nauru',
'NP' => 'Nepal',
'NL' => 'Netherlands',
'AN' => 'Netherlands Antilles',
'NC' => 'New Caledonia',
'NZ' => 'New Zealand',
'NI' => 'Nicaragua',
'NE' => 'Niger',
'NG' => 'Nigeria',
'KP' => 'North Korea (Korea, Democratic People\'s Republic of)',
'NO' => 'Norway',
'OM' => 'Oman',
'PK' => 'Pakistan',
'PA' => 'Panama',
'PG' => 'Papua New Guinea',
'PY' => 'Paraguay',
'PE' => 'Peru',
'PH' => 'Philippines',
'PN' => 'Pitcairn Island',
'PL' => 'Poland',
'PT' => 'Portugal',
'QA' => 'Qatar',
'RE' => 'Reunion',
'RO' => 'Romania',
'RU' => 'Russia',
'RW' => 'Rwanda',
'SH' => 'Saint Helena',
'KN' => 'Saint Kitts (St. Christopher and Nevis)',
'LC' => 'Saint Lucia',
'PM' => 'Saint Pierre and Miquelon',
'VC' => 'Saint Vincent and the Grenadines',
'SM' => 'San Marino',
'ST' => 'Sao Tome and Principe',
'SA' => 'Saudi Arabia',
'SN' => 'Senegal',
'YU' => 'Serbia-Montenegro',
'SC' => 'Seychelles',
'SL' => 'Sierra Leone',
'SG' => 'Singapore',
'SK' => 'Slovak Republic',
'SI' => 'Slovenia',
'SB' => 'Solomon Islands',
'SO' => 'Somalia',
'ZA' => 'South Africa',
'GS' => 'South Georgia (Falkland Islands)',
'KR' => 'South Korea (Korea, Republic of)',
'ES' => 'Spain',
'LK' => 'Sri Lanka',
'SD' => 'Sudan',
'SR' => 'Suriname',
'SZ' => 'Swaziland',
'SE' => 'Sweden',
'CH' => 'Switzerland',
'SY' => 'Syrian Arab Republic',
'TW' => 'Taiwan',
'TJ' => 'Tajikistan',
'TZ' => 'Tanzania',
'TH' => 'Thailand',
'TG' => 'Togo',
'TK' => 'Tokelau (Union) Group (Western Samoa)',
'TO' => 'Tonga',
'TT' => 'Trinidad and Tobago',
'TN' => 'Tunisia',
'TR' => 'Turkey',
'TM' => 'Turkmenistan',
'TC' => 'Turks and Caicos Islands',
'TV' => 'Tuvalu',
'UG' => 'Uganda',
'UA' => 'Ukraine',
'AE' => 'United Arab Emirates',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistan',
'VU' => 'Vanuatu',
'VA' => 'Vatican City',
'VE' => 'Venezuela',
'VN' => 'Vietnam',
'WF' => 'Wallis and Futuna Islands',
'WS' => 'Western Samoa',
'YE' => 'Yemen',
'ZM' => 'Zambia',
'ZW' => 'Zimbabwe'
);
$this->countryinsure = array(
'AF' => 0,
'AL' => 0,
'DZ' => 2185,
'AD' => 5000,
'AO' => 0,
'AI' => 415,
'AG' => 60,
'AR' => 5000,
'AM' => 1350,
'AW' => 830,
'AU' => 3370,
'AT' => 5000,
'AZ' => 5000,
'BS' => 2795,
'BH' => 0,
'BD' => 5000,
'BB' => 220,
'BY' => 1323,
'BE' => 5000,
'BZ' => 1600,
'BJ' => 170,
'BM' => 440,
'BT' => 440,
'BO' => 0,
'BA' => 5000,
'BW' => 145,
'BR' => 5000,
'VG' => 165,
'BN' => 4405,
'BG' => 1030,
'BF' => 530,
'MM' => 4045,
'BI' => 790,
'KH' => 0,
'CM' => 5000,
'CA' => 675,
'CV' => 0,
'KY' => 0,
'CF' => 4405,
'TD' => 440,
'CL' => 0,
'CN' => 1130,
'CX' => 3370,
'CC' => 3370,
'CO' => 0,
'KM' => 690,
'CG' => 1685,
'ZR' => 0,
'CK' => 980,
'CR' => 0,
'CI' => 5000,
'HR' => 5000,
'CU' => 0,
'CY' => 5000,
'CZ' => 5000,
'DK' => 5000,
'DJ' => 880,
'DM' => 0,
'DO' => 0,
'TP' => 0,
'EC' => 0,
'EG' => 1685,
'SV' => 0,
'GQ' => 0,
'ER' => 0,
'EE' => 2020,
'ET' => 1000,
'FK' => 510,
'FO' => 5000,
'FJ' => 600,
'FI' => 5000,
'FR' => 5000,
'GF' => 5000,
'PF' => 1015,
'GA' => 485,
'GM' => 2575,
'GE' => 1350,
'DE' => 5000,
'GH' => 5000,
'GI' => 5000,
'GB' => 857,
'GR' => 5000,
'GL' => 5000,
'GD' => 350,
'GP' => 5000,
'GT' => 0,
'GN' => 875,
'GW' => 21,
'GY' => 10,
'HT' => 0,
'HN' => 0,
'HK' => 5000,
'HU' => 5000,
'IS' => 5000,
'IN' => 2265,
'ID' => 0,
'IR' => 0,
'IQ' => 0,
'IE' => 5000,
'IL' => 0,
'IT' => 5000,
'JM' => 0,
'JP' => 5000,
'JO' => 0,
'KZ' => 5000,
'KE' => 815,
'KI' => 0,
'KW' => 1765,
'KG' => 1350,
'LA' => 0,
'LV' => 1350,
'LB' => 440,
'LS' => 440,
'LR' => 440,
'LY' => 0,
'LI' => 5000,
'LT' => 5000,
'LU' => 5000,
'MO' => 4262,
'MK' => 2200,
'MG' => 675,
'MW' => 50,
'MY' => 1320,
'MV' => 0,
'ML' => 950,
'MT' => 5000,
'MQ' => 5000,
'MR' => 635,
'MU' => 270,
'YT' => 5000,
'MX' => 0,
'MD' => 1350,
'MC' => 5000,
'MN' => 440,
'MS' => 2200,
'MA' => 5000,
'MZ' => 0,
'NA' => 4405,
'NR' => 220,
'NP' => 0,
'NL' => 5000,
'AN' => 830,
'NC' => 1615,
'NZ' => 980,
'NI' => 440,
'NE' => 810,
'NG' => 205,
'KP' => 0,
'NO' => 0,
'OM' => 575,
'PK' => 270,
'PA' => 0,
'PG' => 445,
'PY' => 0,
'PE' => 0,
'PH' => 270,
'PN' => 0,
'PL' => 1350,
'PT' => 5000,
'QA' => 2515,
'RE' => 5000,
'RO' => 5000,
'RU' => 5000,
'RW' => 0,
'SH' => 170,
'KN' => 210,
'LC' => 400,
'PM' => 5000,
'VC' => 130,
'SM' => 5000,
'ST' => 440,
'SA' => 0,
'SN' => 865,
'YU' => 5000,
'SC' => 0,
'SL' => 0,
'SG' => 4580,
'SK' => 5000,
'SI' => 4400,
'SB' => 0,
'SO' => 440,
'ZA' => 1760,
'GS' => 510,
'KR' => 5000,
'ES' => 5000,
'LK' => 35,
'SD' => 0,
'SR' => 535,
'SZ' => 560,
'SE' => 5000,
'CH' => 5000,
'SY' => 3080,
'TW' => 1350,
'TJ' => 1350,
'TZ' => 230,
'TH' => 1350,
'TG' => 2190,
'TK' => 295,
'TO' => 515,
'TT' => 930,
'TN' => 2200,
'TR' => 880,
'TM' => 675,
'TC' => 0,
'TV' => 4715,
'UG' => 0,
'UA' => 5000,
'AE' => 5000,
'UY' => 0,
'UZ' => 5000,
'VU' => 0,
'VA' => 5000,
'VE' => 0,
'VN' => 0,
'WF' => 1615,
'WS' => 295,
'YE' => 0,
'ZM' => 540,
'ZW' => 600,
'US' => 5000
);
}
function SetInsurance()
{
$this->insurance_cost = 0;
// Insurance module by Kevin Shelton
// divide the value of the order among the packages based on the order total or subtotal depending on whether or not you have configured to insure tax
$shipping_weight = $this->order['ShippingWeight'];
$shipping_num_boxes = $this->order['ShippingNumBoxes'];
$costperpkg = $this->order['SubTotal'] / $shipping_num_boxes;
// retrieve the maximum allowed insurance for the destination country and if the package value exceeds it then set package value to the maximum allowed
$maxins = $this->countryinsure[$this->order['ShippingCountry']];
if ($costperpkg > $maxins) $costperpkg = $maxins;
// if insurance not allowed for destination or insurance is turned off add nothing to shipping cost
if (($maxins == 0) || (MODULE_SHIPPING_USPS_INSURE == 'False')) {
$insurance = 0;
}
// US and Canada share the same insurance calculation (though not the same maximum)
else if (($this->order['ShippingCountry'] == 'US') || ($this->order['ShippingCountry'] == 'CA'))
{
if ($costperpkg<=50) {
$insurance=MODULE_SHIPPING_USPS_INS1;
}
else if ($costperpkg<=100) {
$insurance=MODULE_SHIPPING_USPS_INS2;
}
else if ($costperpkg<=200) {
$insurance=MODULE_SHIPPING_USPS_INS3;
}
else if ($costperpkg<=300) {
$insurance=MODULE_SHIPPING_USPS_INS4;
}
else {
$insurance = MODULE_SHIPPING_USPS_INS4 + ((ceil($costperpkg/100) -3) * MODULE_SHIPPING_USPS_INS5);
}
}
// if insurance allowed and is not US or Canada then calculate international insurance
else {
if ($costperpkg<=50) {
$insurance=MODULE_SHIPPING_USPS_INS6;
}
else if ($costperpkg<=100) {
$insurance=MODULE_SHIPPING_USPS_INS7;
}
else if ($costperpkg<=200) {
$insurance=MODULE_SHIPPING_USPS_INS8;
}
else if ($costperpkg<=300) {
$insurance=MODULE_SHIPPING_USPS_INS9;
}
else {
$insurance = MODULE_SHIPPING_USPS_INS9 + ((ceil($costperpkg/100) - 3) * MODULE_SHIPPING_USPS_INS10);
}
}
// usps doesnt accept zero weight
$shipping_weight = ($shipping_weight < 0.1 ? 0.1 : $shipping_weight);
$shipping_pounds = floor ($shipping_weight);
$shipping_ounces = round(16 * ($shipping_weight - floor($shipping_weight)));
$this->_setWeight($shipping_pounds, $shipping_ounces);
// Added by Kevin Chen (kkchen@uci.edu); Fixes the Parcel Post Bug July 1, 2004
// Refer to http://www.usps.com/webtools/htm/Domestic-Rates.htm documentation
// Thanks Ryan
if($shipping_pounds > 35 || ($shipping_pounds == 0 && $shipping_ounces < 6)){
$this->_setMachinable('False');
}
else{
$this->_setMachinable('True');
}
$this->insurance_cost = $insurance;
// End Kevin Chen July 1, 2004
}
function _setService($service)
{
$this->service = $service;
}
function _setWeight($pounds, $ounces=0)
{
$this->pounds = $pounds;
$this->ounces = $ounces;
}
function _setContainer($container)
{
$this->container = $container;
}
function _setSize($size)
{
$this->size = $size;
}
function _setMachinable($machinable)
{
$this->machinable = $machinable;
}
function PhoneClean($phone)
{
$res = preg_replace('/[(]|[)]|[\-]|[ ]|[#]|[\.]|[a-z](.*)|[A-Z](.*)/g', '', $phone);
if ( strlen($res) > 10 ) {
$res = substr($res, 0, 10);
}
return $res != '' ? $res : $phone;
}
function GetQuote($method = '')
{
if ( isset($this->types[$method]) || in_array($method, $this->intl_types)) {
$this->_setService($method);
}
$this -> _setContainer('None');
$this -> _setSize('REGULAR');
$this -> SetInsurance(); // ???
if ($this->order['ShippingCountry'] == $this->shipping_origin_country) {
$request='<?xml version="1.0"?>';
// PASSWORD="'.$this->usps_password.'"
$request.= '<RateV3Request USERID="'.$this->usps_userid.'">';
$services_count = 0;
if (isset($this->service)) {
$this->types = array($this->service => $this->types[$this->service]);
}
$dest_zip = str_replace(' ', '', $this->order['ShippingZip']);
$dest_zip = substr($dest_zip, 0, 5);
reset($this->types);
$allowed_types = explode(", ", MODULE_SHIPPING_USPS_TYPES);
while (list($key, $value) = each($this->types))
{
if ( !in_array($key, $allowed_types) ) continue;
$request .= '<Package ID="'.$services_count.'">'.
'<Service>'.$key.'</Service>'.
'<ZipOrigination>'.$this->store_zip5.'</ZipOrigination>'.
'<ZipDestination>'.$dest_zip.'</ZipDestination>'.
'<Pounds>'.$this->pounds.'</Pounds>'.
'<Ounces>'.$this->ounces.'</Ounces>'.
'<Size>'.$this->size.'</Size>'.
'<Machinable>'.$this->machinable.'</Machinable>'.
'</Package>';
$services_count++;
}
$request .= '</RateV3Request>';
$api_query = 'RateV3';
}
else {
$request = '<IntlRateRequest USERID="'.$this->usps_userid.'">'.
'<Package ID="0">'.
'<Pounds>'.$this->pounds.'</Pounds>'.
'<Ounces>'.$this->ounces.'</Ounces>'.
'<MailType>Package</MailType>'.
'<Country>'.$this->countries[$this->order['ShippingCountry']].'</Country>'.
'</Package>'.
'</IntlRateRequest>';
$api_query = 'IntlRate';
}
$request = 'API='.$api_query.'&XML=' . urlencode($request);
$body = $this->PostQuery($request);
$body = str_replace(chr(146), '', $body); // for bad `
// check for errors
if (strpos($body, '<Error>') !== false) {
$errors = Array ();
preg_match_all('/<Number>(.*?)<\/Number>/s', $body, $error_numbers);
preg_match_all('/<Description>(.*?)<\/Description>/s', $body, $error_descriptions);
foreach ($error_numbers[1] as $index => $error_number) {
$errors[$index] = $error_descriptions[1][$index];
if ($this->Application->isDebugMode()) {
$errors[$index] .= ' (' . $error_number . ')';
}
}
$errors = array_unique($errors); // we may have same errors on many packages, so don't show duplicates
return Array('error' => implode('<br/>', $errors));
}
// parse response
-
$xml_helper =& $this->Application->recallObject('kXMLHelper');
/* @var $xml_helper kXMLHelper */
$root_node =& $xml_helper->Parse($body);
/* @var $root_node kXMLNode */
$rates = Array();
// Domestic shipping
if ($this->order['ShippingCountry'] == $this->shipping_origin_country) {
$i = 0;
$postage_node =& $root_node->FindChild('Package');
do {
// $parcel_node =& $postage_node->firstChild;
$service = $postage_node->FindChildValue('MailService');
if ( $service != '' ) {
$i++;
$rates[$i] = Array();
$rates[$i]['Title'] = $service;
$rates[$i]['Rate'] = $this->insurance_cost + $postage_node->FindChildValue('Rate');
}
}
while ( $postage_node =& $postage_node->NextSibling());
}
else {
// for International Rates !!!
$allowed_types = array();
foreach( explode(", ", MODULE_SHIPPING_USPS_TYPES_INTL) as $value ) {
$allowed_types[$value] = $this->intl_types[$value];
}
$i = 0;
$service_node =& $root_node->FindChild('Service');
do {
$service = trim($service_node->FindChildValue('SvcDescription'));
if( !in_array($service, $allowed_types) ) continue;
$i++;
if ( $service_node->FindChildValue('MaxWeight') >= $this->pounds ) {
$rates[$i] = Array();
$rates[$i]['Title'] = $service;
$rates[$i]['MaxDimensions'] = $service_node->FindChildValue('MaxDimensions');
$rates[$i]['MaxWeight'] = $service_node->FindChildValue('MaxWeight');
$rates[$i]['SvcCommitments'] = $service_node->FindChildValue('SvcCommitments');
$rates[$i]['Rate'] = $this->insurance_cost + $service_node->FindChildValue('Postage');
}
}
while ( $service_node =& $service_node->NextSibling());
}
// print_r($rates);
// die('here');
return $rates;
}
function PostOrder()
{
$request='';
$base_request = '';
$this->SetInsurance();
// $this->order['ShippingCountry'] = $this->GetUSPSCountry($this->order['ShippingCountry']);
// Domestic Order
if ($this->order['ShippingCountry'] == $this->shipping_origin_country) {
// $dest_zip = str_replace(' ', '', $this->order['ShippingZip5']);
$this->order['ShippingZip5'] = substr($this->order['ShippingZip5'], 0, 5);
$WeightInOunces = floor($this->pounds * 16 + $this->ounces);
$base_request ='
<Option>1</Option>
<ImageParameters></ImageParameters>
<FromName>'.$this->store_name.'</FromName>
<FromFirm>'.$this->company_name.'</FromFirm>
<FromAddress1>'.$this->store_address1.'</FromAddress1>
<FromAddress2>'.$this->store_address2.'</FromAddress2>
<FromCity>'.$this->store_city.'</FromCity>
<FromState>'.$this->store_state.'</FromState>
<FromZip5>'.$this->store_zip5.'</FromZip5>
<FromZip4>'.$this->store_zip4.'</FromZip4>
<ToName>'.$this->order['FirstName'].' '.$this->order['LastName'].'</ToName>
<ToFirm>'.$this->order['ShippingCompany'].'</ToFirm>
<ToAddress1>'.$this->order['ShippingAddress2'].'</ToAddress1>
<ToAddress2>'.$this->order['ShippingAddress1'].'</ToAddress2>
<ToCity>'.$this->order['ShippingCity'].'</ToCity>
<ToState>'.$this->order['ShippingState'].'</ToState>
<ToZip5>'.$this->order['ShippingZip5'].'</ToZip5>
<ToZip4>'.$this->order['ShippingZip4'].'</ToZip4>
<WeightInOunces>'.$WeightInOunces.'</WeightInOunces>
<ServiceType>'.$this->order['ShippingService'].'</ServiceType>
<ImageType>PDF</ImageType>
<LabelDate>'.date('m/d/Y',time()).'</LabelDate>
<CustomerRefNo></CustomerRefNo>
<AddressServiceRequested></AddressServiceRequested>
<SenderName></SenderName><SenderEMail></SenderEMail>
<RecipientName></RecipientName>
<RecipientEMail></RecipientEMail>
';
$api_query = 'DeliveryConfirmationV3';
$xml_request = 'DeliveryConfirmationV3.0Request';
}
else {
// International Order(s)
$shipping_service = strtolower($this->order['ShippingService']);
$base_request = '<Option/>
<ImageParameters/>
<FromFirstName>'.$this->store_first_name.'</FromFirstName>
<FromLastName>'.$this->store_last_name.'</FromLastName>
<FromFirm>'.$this->company_name.'</FromFirm>
<FromAddress1>'.$this->store_address1.'</FromAddress1>
<FromAddress2>'.$this->store_address2.'</FromAddress2>
<FromCity>'.$this->store_city.'</FromCity>
<FromState>'.$this->store_state.'</FromState>
<FromZip5>'.$this->store_zip5.'</FromZip5>
<FromPhone>'.$this->PhoneClean($this->store_phone).'</FromPhone>
<ToName>'.$this->order['FirstName'].' '.$this->order['LastName'].'</ToName>
<ToFirm>'.$this->order['ShippingCompany'].'</ToFirm>
<ToAddress1></ToAddress1>
<ToAddress2>'.$this->order['ShippingAddress2'].'</ToAddress2>
<ToAddress3>'.$this->order['ShippingAddress1'].'</ToAddress3>
<ToCity>'.$this->order['ShippingCity'].'</ToCity>';
if ( $this->order['ShippingProvince'] != '' ) {
$base_request.='
<ToProvince>'.$this->order['ShippingProvince'].'</ToProvince>';
}
$base_request.='
<ToCountry>'.$this->countries[$this->order['ShippingCountry']].'</ToCountry>
<ToPostalCode>'.$this->order['ShippingZip'].'</ToPostalCode>
<ToPOBoxFlag>N</ToPOBoxFlag>
<ToPhone>'.$this->PhoneClean($this->order['ShippingPhone']).'</ToPhone>
<ToFax>'.$this->PhoneClean($this->order['ShippingFax']).'</ToFax>
<ToEmail>'.$this->order['Email'].'</ToEmail>
<ShippingContents>';
// add items
foreach ( $this->order['Items'] as $k => $value ) {
$base_request.='
<ItemDetail>
<Description>Computer Parts</Description>
<Quantity>'.$value['Qty'].'</Quantity>
<Value>'.($value['Price'] * $value['Qty']).'</Value>
<NetPounds>'.$value['NetPounds'].'</NetPounds>
<NetOunces>'.$value['NetOunces'].'</NetOunces>
<HSTariffNumber>123456</HSTariffNumber>
<CountryOfOrigin>United States</CountryOfOrigin>
</ItemDetail>';
}
// end add items
$base_request.='
</ShippingContents>
<GrossPounds>'.$this->pounds.'</GrossPounds>
<GrossOunces>'.$this->ounces.'</GrossOunces>
<ContentType>MERCHANDISE</ContentType>
<Agreement>Y</Agreement>
<InvoiceNumber>'.$this->order['InvoiceNumber'].'</InvoiceNumber>
<ImageType>PDF</ImageType>
<ImageLayout>ALLINONEFILE</ImageLayout>
<LabelDate>'.date('m/d/Y',time()).'</LabelDate>
';
if (strpos($shipping_service, 'express') !== false) {
$xml_request = 'ExpressMailIntlRequest';
$api_query = 'ExpressMailIntl';
}
elseif (strpos($shipping_service, 'priority') !== false) {
$xml_request = 'PriorityMailIntlRequest';
$api_query = 'PriorityMailIntl';
}
else {
$xml_request = 'FirstClassMailIntlRequest';
$api_query = 'FirstClassMailIntl';
}
}
$request.= '<'.$xml_request.' USERID="'.$this->usps_userid.'">';
$request.= $base_request;
$request.= '</'.$xml_request.'>';
// die($request);
$request = 'API='.$api_query.'&XML='.urlencode($request);
$body = $this->PostQuery($request, 1);
// check for errors
if (strpos($body, '<Error>') !== false) {
$errors = Array ();
preg_match_all('/<Number>(.*?)<\/Number>/s', $body, $error_numbers);
preg_match_all('/<Description>(.*?)<\/Description>/s', $body, $error_descriptions);
foreach ($error_numbers[1] as $index => $error_number) {
$errors[$index] = Array ('error_number' => $error_number, 'error_description' => $error_descriptions[1][$index]);
}
// TODO: find a way to return other error messages in same package as well
return $errors[0];
}
// parse response
$xml_helper =& $this->Application->recallObject('kXMLHelper');
$root_node =& $xml_helper->Parse($body);
/* @var $root_node kXMLNode */
$Postage = 0;
$label_file = $TrackingNumber = $PostnetBarCode = '';
// Domestic shipping
if ($this->order['ShippingCountry'] == $this->shipping_origin_country ) {
$delivery_node =& $root_node->FindChild('DeliveryConfirmationV3.0Response');
do {
$TrackingNumber = $delivery_node->FindChildValue('DeliveryConfirmationNumber');
$PostnetBarCode = $delivery_node->FindChildValue('Postnet');
$DeliveryConfirmationLabel = base64_decode($delivery_node->FindChildValue('DeliveryConfirmationLabel'));
}
while ( $delivery_node =& $delivery_node->NextSibling());
}
else {
if (strpos($shipping_service, 'express') !== false) {
$node_title = 'ExpressMailIntlResponse';
}
elseif (strpos($shipping_service, 'priority') !== false) {
$node_title = 'PriorityMailIntlResponse';
}
else {
$node_title = 'FirstClassMailIntlResponse';
}
$delivery_node =& $root_node->FindChild($node_title);
$PostnetBarCode = $delivery_node->FindChildValue('BarcodeNumber');
$Postage = $delivery_node->FindChildValue('Postage');
$DeliveryConfirmationLabel = base64_decode($delivery_node->FindChildValue('LabelImage'));
}
if ( $TrackingNumber != '' ) {
$label_file = USPS_LABEL_FOLDER.$TrackingNumber.".pdf";
}
elseif ( $PostnetBarCode != '' ) {
$label_file = USPS_LABEL_FOLDER.$PostnetBarCode.".pdf";
}
if ( $label_file != '' ) {
$file_helper =& $this->Application->recallObject('FileHelper');
/* @var $file_helper FileHelper */
$file_helper->CheckFolder(USPS_LABEL_FOLDER);
if (!$handle = fopen($label_file, 'a')) echo "Cannot open file ($label_file)";
if ( @fwrite($handle, $DeliveryConfirmationLabel) === FALSE) echo "Cannot write to file ($label_file)";
}
return array('TrackingNumber' => $TrackingNumber, 'PostnetBarCode' => $PostnetBarCode, 'Postage' => $Postage);
}
function GetUSPSCountry($country, $default = 'US')
{
$cs_helper =& $this->Application->recallObject('CountryStatesHelper');
/* @var $cs_helper kCountryStatesHelper */
$country = $cs_helper->getCountryIso($country);
return $country == '' ? $default : $country;
}
function GetShippingQuotes($params = null)
{
$weights = Kg2Pounds($params['packages']['0']['weight']);
$weight = '';
$weight = $weights[0];
if ( $weights[1] != '' ) {
$weight.='.'.$weights[1];
}
$country = $this->GetUSPSCountry($params['dest_country']);
$this->order = Array();
$this->order['ShippingWeight'] = $weight;
$this->order['ShippingNumBoxes'] = 1;
$this->order['ShippingZip'] = $params['dest_postal'];
$this->order['SubTotal'] = $params['amount'];
$this->order['ShippingCountry'] = $country;
$shipping_types = Array();
$rates = $this->GetQuote();
if ( !isset($rates['error']) ) {
$this->Application->RemoveVar('usps_errors');
$i = 1;
foreach ($rates as $k => $rate ) {
$shipping_types['USPS_'.$i] = Array(
'ShippingId' => 'USPS_'.$i,
'TotalCost' => $rate['Rate'],
'ShippingName' => $rate['Title'],
'Type' => '1',
'CODFlat' => '0',
'CODPercent' => '0',
'PortalGroups' => ',15,',
'InsuranceFee' => '',
'COD' => '0',
'SelectedOnly' => '0',
'Code' => $rate['Title']
);
$i++;
}
}
else {
// for Front-End (shipping screen) and Admin (Shipping Tab on editing order)
$this->Application->StoreVar('usps_errors', $rates['error']);
}
$this->Application->StoreVar('current_usps_shipping_types', serialize($shipping_types));
return $shipping_types;
}
function TrackOrder($TrackingNumber='')
{
if ( $TrackingNumber != '' ) {
// http://testing.shippingapis.com/ShippingAPITest.dll?API=TrackV2&XML=<TrackFieldRequest USERID="402INTEC7634"><TrackID ID="EJ958083578US"></TrackID></TrackFieldRequest>
$request = '<TrackRequest USERID="'.$this->usps_userid.'"><TrackID ID="'.$TrackingNumber.'"></TrackID></TrackRequest>';
$api_query = 'TrackV2';
$request = 'API='.$api_query.'&XML='.urlencode($request);
$body = $this->PostQuery($request);
// check for errors
if (strpos($body, '<Error>') !== false) {
$errors = Array ();
preg_match_all('/<Number>(.*?)<\/Number>/s', $body, $error_numbers);
preg_match_all('/<Description>(.*?)<\/Description>/s', $body, $error_descriptions);
foreach ($error_numbers[1] as $index => $error_number) {
$errors[$index] = $error_descriptions[1][$index];
if ($this->Application->isDebugMode()) {
$errors[$index] .= ' (' . $error_number . ')';
}
}
$errors = array_unique($errors); // we may have same errors on many packages, so don't show duplicates
return Array('error' => implode('<br/>', $errors));
}
-
-
-
-
$xml_helper =& $this->Application->recallObject('kXMLHelper');
$root_node =& $xml_helper->Parse($body);
/* @var $root_node kXMLNode */
// Tracking Shipping
$delivery_node =& $root_node->FindChild('TrackInfo');
$TrackSummary = $delivery_node->FindChildValue('TrackSummary');
// echo ' TrackSummary ('.$TrackingNumber.') = '.$TrackSummary.'<br>';
return strpos($TrackSummary, 'delivered') !== false ? 1 : 0;
}
else
return false;
}
function ProcessTrackOrders()
{
$sql = sprintf('SELECT `OrderId`, `ShippingTracking` FROM %s WHERE `Status` > 3 AND `Delivered` = 0', TABLE_PREFIX.'Orders');
$orders = $this->Application->Conn->Query($sql);
foreach ( $orders as $k => $order ) {
// try to track order
if ( $order['ShippingTracking'] != '' && $this->TrackOrder($order['ShippingTracking']) ) {
$update_order = sprintf("UPDATE %s SET `Delivered` = 1 WHERE %s = %s",
TABLE_PREFIX.'Orders',
$this->Application->getUnitOption('ord', 'IDField'),
$order[$this->Application->getUnitOption('ord', 'IDField')]
);
$this->Application->Conn->Query($update_order);
}
}
}
function PostQuery($request, $secure=0)
{
switch (MODULE_SHIPPING_USPS_SERVER) {
case 'production':
$usps_server = $secure > 0 ? 'https://secure.shippingapis.com' : 'http://production.shippingapis.com' ;
$api_dll = 'ShippingAPI.dll';
break;
case 'test':
$usps_server = $secure > 0 ? 'https://secure.shippingapis.com' : 'http://testing.shippingapis.com';
$api_dll = 'ShippingAPITest.dll';
break;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $usps_server.'/'.$api_dll.'?'.$request);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($curl);
curl_close($curl);
if (defined('USPS_LOG_FILE')) {
$filename = USPS_LOG_FILE;
if ( !$fp = fopen($filename, "a") ) echo("Failed opening file $filename");
}
$request_url = sprintf("Date %s : IP %s\n\nPost\n\n%s\n\nReplay\n\n%s\n\n",
date("m/d/Y H:i:s",time()),
$_SERVER['REMOTE_ADDR'],
$usps_server.'/'.$api_dll.'?'.urldecode($request),
$body
);
if (defined('USPS_LOG_FILE')) {
if (!fwrite($fp, $request_url)) echo("Failed writing to file $filename");
fclose($fp);
}
return $body;
}
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;
}
function LoadParams()
{
$sql = 'SELECT Properties FROM '.$this->Application->getUnitOption('sqe', 'TableName').'
WHERE ClassName="USPS"';
$db =& $this->Application->GetADODBConnection();
return unserialize($db->GetOne($sql));
}
function _prepare_xml_param($value) {
return strip_tags($value);
}
+ /**
+ * Returns virtual field names, that will be saved as properties
+ *
+ * @return Array
+ */
+ function GetEngineFields()
+ {
+ return Array ('AccountLogin');
+ }
}
\ No newline at end of file
Index: branches/5.1.x/units/shipping_quote_engines/shipping_quote_engines_config.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/shipping_quote_engines_config.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/shipping_quote_engines_config.php (revision 13813)
@@ -1,208 +1,212 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
$config = Array (
'Prefix' => 'sqe',
'ItemClass' => Array ('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'),
'ListClass' => Array ('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'),
'EventHandlerClass' => Array ('class' => 'ShippingQuoteEngineEventHandler', 'file' => 'shipping_quote_engine_event_handler.php', 'build_event' => 'OnBuild'),
'TagProcessorClass' => Array ('class' => 'kDBTagProcessor', 'file' => '', 'build_event' => 'OnBuild'),
'RegisterClasses' => Array (
Array ('pseudo' => 'ShippingQuoteEngine', 'class' => 'ShippingQuoteEngine', 'file' => 'shipping_quote_engine.php', 'build_event' => ''),
- Array ('pseudo' => 'CustomShippingQuoteEngine', 'class' => 'CustomShippingQuoteEngine', 'file' => 'custom_shipping_quote_engine.php', 'build_event' => ''),
- Array ('pseudo' => 'Intershipper', 'class' => 'Intershipper', 'file' => 'intershipper.php', 'build_event' => ''),
- Array ('pseudo' => 'USPS', 'class' => 'USPS', 'file' => 'usps.php', 'build_event' => ''),
+ Array ('pseudo' => 'CustomShippingQuoteEngine', 'class' => 'CustomShippingQuoteEngine', 'file' => 'custom_shipping_quote_engine.php', 'require_classes' => 'ShippingQuoteEngine', 'build_event' => ''),
+ Array ('pseudo' => 'Intershipper', 'class' => 'Intershipper', 'file' => 'intershipper.php', 'require_classes' => 'ShippingQuoteEngine', 'build_event' => ''),
+ Array ('pseudo' => 'USPS', 'class' => 'USPS', 'file' => 'usps.php', 'require_classes' => 'ShippingQuoteEngine', 'build_event' => ''),
Array ('pseudo' => 'ShippingQuoteCollector', 'class' => 'ShippingQuoteCollector', 'file' => 'shipping_quote_collector.php', 'build_event' => '', 'require_classes' => 'ShippingQuoteEngine'),
),
'AutoLoad' => true,
'Hooks' => Array (
),
'QueryString' => Array (
1 => 'id',
2 => 'Page',
3 => 'PerPage',
4 => 'event',
5 => 'mode',
),
'IDField' => 'EngineId',
'StatusField' => Array ('Status'),
'TitleField' => 'Name',
'TitlePresets' => Array (
'default' => Array ( 'edit_status_labels' => Array ('sqe' => '!la_title_EditingShippingQuoteEngine!'),
),
'engine_list' =>Array ( 'prefixes' => Array ('sqe_List'),
'format' => "!la_title_ShippingQuoteEngines!",
),
'engine_edit' =>Array ( 'prefixes' => Array ('sqe'),
'format' => "#sqe_status# '#sqe_titlefield#' - !la_title_General!",
),
),
'PermSection' => Array ('main' => 'in-commerce:shipping_quote_engines'),
'Sections' => Array (
'in-commerce:shipping_quote_engines' => Array (
'parent' => 'in-commerce:shipping_folder',
'icon' => 'conf_shipping',
'label' => 'la_tab_ShippingQuoteEngines',
'url' => Array ('t' => 'in-commerce/shipping/shipping_list', 'pass' => 'm'),
'permissions' => Array ('view', 'edit', 'advanced:approve', 'advanced:decline'),
'priority' => 4.2,
'type' => stTAB,
),
),
'TableName' => TABLE_PREFIX.'ShippingQuoteEngines',
'FilterMenu' => Array (
'Groups' => Array (
Array ('mode' => 'AND', 'filters' => Array ('show_active', 'show_disabled'), 'type' => WHERE_FILTER),
),
'Filters' => Array (
'show_active' => Array ('label' => 'la_Active', 'on_sql' => '', 'off_sql' => '%1$s.Status != 1' ),
'show_disabled' => Array ('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Status != 0' ),
)
),
'ListSQLs' => Array ( '' => 'SELECT * FROM %s'),
// key - special, value - list select sql
'ItemSQLs' => Array ( '' => 'SELECT * FROM %s'),
'ListSortings' => Array (
'' => Array (
'Sorting' => Array ('Name' => 'asc'),
)
),
'Fields' => Array (
'EngineId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'Name' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'FlatSurcharge' => Array ('type' => 'double', 'not_null' => 1, 'default' => '0'),
'PercentSurcharge' => Array ('type' => 'double', 'not_null' => 1, 'default' => '0'),
'Status' => Array (
'type' => 'int',
- 'formatter' => 'kOptionsFormatter',
- 'options' => Array ( 1 => 'la_Enabled', 0 => 'la_Disabled' ), 'use_phrases' => 1,
+ 'formatter' => 'kOptionsFormatter',
+ 'options' => Array (1 => 'la_Enabled', 0 => 'la_Disabled'), 'use_phrases' => 1,
+ 'error_msgs' => Array (
+ 'curl_not_present' => '!la_error_EnableCurlFirst!',
+ 'from_info_not_filled_in' => '!la_error_FillInShippingFromAddress!',
+ ),
'default' => 0, 'not_null' => 1,
),
'Properties' => Array ('type' => 'string', 'default' => NULL),
'ClassName' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
),
'VirtualFields' => Array (
'AccountLogin' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'AccountPassword' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'UPSEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'UPSAccount' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'UPSInvoiced' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Invoiced', 0 => 'NotInvoiced'),
),
'FDXEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'FDXAccount' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'FDXInvoiced' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Invoiced', 0 => 'NotInvoiced'),
),
'DHLEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'DHLAccount' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'DHLInvoiced' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Invoiced', 0 => 'NotInvoiced'),
),
'USPEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'USPAccount' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'USPInvoiced' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Invoiced', 0 => 'NotInvoiced'),
),
'ARBEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'ARBAccount' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'ARBInvoiced' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Invoiced', 0 => 'NotInvoiced'),
),
'1DYEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'2DYEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'3DYEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'GNDEnabled' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter',
'options' => Array (1 => 'Enabled', 0 => 'Disabled'),
),
'ShipMethod' => Array (
'type' => 'string',
'formatter' => 'kOptionsFormatter',
'options' => Array (
'DRP' => 'Drop-Off At Carrier Location',
'PCK' => 'Schedule A Special Pickup',
'SCD' => 'Regularly Scheduled Pickup'),
),
),
'Grids' => Array (
'Default' => Array (
'Icons' => Array (
'default' => 'icon16_item.png',
0 => 'icon16_disabled.png',
1 => 'icon16_item.png',
'module' => 'core',
),
'Fields' => Array (
'EngineId' => Array ( 'title' => 'la_col_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter', 'width' => 50, ),
'Name' => Array ( 'title' => 'la_col_ShippingQuoteEngineName', 'filter_block' => 'grid_like_filter', 'width' => 250, ),
'FlatSurcharge' => Array ( 'title' => 'la_col_FlatSurcharge', 'filter_block' => 'grid_float_range_filter', 'width' => 150, ),
'PercentSurcharge' => Array ( 'title' => 'la_col_PercentSurcharge', 'filter_block' => 'grid_float_range_filter', 'width' => 150, ),
'Status' => Array ( 'title' => 'la_col_Status', 'filter_block' => 'grid_options_filter', 'width' => 150, ),
),
),
),
);
\ No newline at end of file
Index: branches/5.1.x/units/shipping_quote_engines/intershipper.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/intershipper.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/intershipper.php (revision 13813)
@@ -1,502 +1,516 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class Intershipper extends ShippingQuoteEngine {
var $state = Array();
var $quote = Array();
var $quotes = Array();
var $package_id;
var $box_id;
var $shipment_id;
var $FlatSurcharge = 0;
var $PercentSurcharge = 0;
function _stripTags($params)
{
foreach ($params as $param_name => $param_value) {
if (is_array($param_value)) {
$params[$param_name] = $this->_stripTags($param_value);
}
else {
$params[$param_name] = strip_tags($param_value);
}
}
return $params;
}
function BuildUrl($params = null)
{
$params = $this->_stripTags($params);
$this->shipment_id = isset($params['shipment_id']) ? $params['shipment_id'] : $this->GenerateId();
$url = 'www.intershipper.com/Interface/Intershipper/XML/v2.0/HTTP.jsp';
$uri = 'Username='. $params['AccountLogin'].
'&Password='. $params['AccountPassword'].
'&Version='. '2.0.0.0'.
'&ShipmentID='. $this->shipment_id.
'&QueryID='. $this->shipment_id.
'&TotalCarriers='. count($params['carriers']);
$i = 0;
foreach($params['carriers'] as $carrier)
{
$i++;
$uri .= '&CarrierCode'.$i.'='. rawurlencode($carrier['name']).
'&CarrierAccount'.$i.'='. rawurlencode($carrier['account']).
'&CarrierInvoiced'.$i.'='. $carrier['invoiced'];
}
$uri .= '&TotalClasses='. count($params['classes']);
$i = 0;
foreach($params['classes'] as $class)
{
$i++;
$uri .= '&ClassCode'.$i.'='. $class;
}
$uri .= '&DeliveryType='. 'COM'.
'&ShipMethod='. $params['ShipMethod'].
'&OriginationName='. rawurlencode( $params['orig_name'] ).
'&OriginationAddress1='.rawurlencode( $params['orig_addr1'] ).
'&OriginationAddress2='.rawurlencode( $params['orig_addr2'] ).
'&OriginationCity='. rawurlencode( $params['orig_city'] ).
'&OriginationState='. rawurlencode( $params['orig_state'] ).
'&OriginationPostal='. rawurlencode( $params['orig_postal'] ).
'&OriginationCountry='. rawurlencode( $params['orig_country'] ).
'&DestinationName='. rawurlencode( $params['dest_name'] ).
'&DestinationAddress1='.rawurlencode( $params['dest_addr1'] ).
'&DestinationAddress2='.rawurlencode( $params['dest_addr2'] ).
'&DestinationCity='. rawurlencode( $params['dest_city'] ).
'&DestinationState='. rawurlencode( $params['dest_state'] ).
'&DestinationPostal='. rawurlencode( $params['dest_postal'] ).
'&DestinationCountry='. rawurlencode( $params['dest_country'] ).
'&Currency='. 'USD'.
'&TotalPackages='. count($params['packages']);
$i = 0;
foreach($params['packages'] as $package)
{
$i++;
$uri .= '&BoxID'.$i.'='. urlencode( $package['package_key'] ).
'&Weight'.$i.'='. $package['weight'].
'&WeightUnit'.$i.'='. $package['weight_unit'].
'&Length'.$i.'='. $package['length'].
'&Width'.$i.'='. $package['width'].
'&Height'.$i.'='. $package['height'].
'&DimensionalUnit'.$i.'='. $package['dim_unit'].
'&Packaging'.$i.'='. $package['packaging'].
'&Contents'.$i.'='. $package['contents'].
'&Insurance'.$i.'='. $package['insurance'];
}
return Array('url' => $url, 'uri' => $uri);
}
function MergeParams($custom_params)
{
$params = $this->LoadParams();
$db = $this->Application->GetADODBConnection();
$this->FlatSurcharge = $params['FlatSurcharge'];
$this->PercentSurcharge = $params['PercentSurcharge'];
if($custom_params['carriers'])
{
$params['carriers'] = $custom_params['carriers'];
}
else
{
$carrier_codes = Array('UPS', 'FDX', 'DHL', 'USP', 'ARB');
$i = 0;
foreach($carrier_codes as $carrier)
{
if(isset($params[$carrier.'Enabled']) && $params[$carrier.'Enabled'])
{
$i++;
$params['carriers'][$i]['name'] = $carrier;
$params['carriers'][$i]['account'] = $params[$carrier.'Account'];
$params['carriers'][$i]['invoiced'] = (int) $params[$carrier.'Invoiced'];
}
}
}
if($custom_params['classes'])
{
$params['classes'] = $custom_params['classes'];
}
else
{
$classes = Array('1DY', '2DY', '3DY', 'GND');
foreach($classes as $class)
{
if(isset($params[$class.'Enabled']) && $params[$class.'Enabled'])
{
$params['classes'][] = $class;
}
}
}
if (isset($custom_params['orig_addr1'])) {
$params['orig_name'] = $custom_params['orig_name'];
$params['orig_addr1'] = $custom_params['orig_addr1'];
$params['orig_addr2'] = $custom_params['orig_addr2'];
$params['orig_city'] = $custom_params['orig_city'];
$params['orig_state'] = $custom_params['orig_state'];
$params['orig_postal'] = $custom_params['orig_postal'];
$params['orig_country'] = $custom_params['orig_country'];
}
else {
$params['orig_name'] = $this->Application->ConfigValue('Comm_StoreName');
$params['orig_addr1'] = $this->Application->ConfigValue('Comm_Shipping_AddressLine1');
$params['orig_addr2'] = $this->Application->ConfigValue('Comm_Shipping_AddressLine2');
$params['orig_city'] = $this->Application->ConfigValue('Comm_Shipping_City');
$params['orig_state'] = $this->Application->ConfigValue('Comm_Shipping_State');
$params['orig_postal'] = $this->Application->ConfigValue('Comm_Shipping_ZIP');
$params['orig_country'] = $this->Application->ConfigValue('Comm_Shipping_Country');
}
$cs_helper =& $this->Application->recallObject('CountryStatesHelper');
/* @var $cs_helper kCountryStatesHelper */
if (strlen($params['orig_country']) == 3) {
// got 3symbol ISO code -> resolve to 2symbol ISO code
$params['orig_country'] = $cs_helper->getCountryIso( $params['orig_country'] );
}
if (strlen($params['orig_state']) != 2) {
// got state name instead of ISO code -> resolve it to ISO code
$country_iso = $cs_helper->getCountryIso($params['orig_country'], true);
$params['orig_state'] = $cs_helper->getStateIso($params['orig_state'], $country_iso);
}
if (isset($custom_params['ShipMethod'])) {
$params['ShipMethod'] = $custom_params['ShipMethod'];
}
$params['packages'] = $custom_params['packages'];
$params['dest_name'] = $custom_params['dest_name'];
$params['dest_addr1'] = $custom_params['dest_addr1'];
$params['dest_addr2'] = $custom_params['dest_addr2'];
$params['dest_city'] = $custom_params['dest_city'];
$params['dest_state'] = $custom_params['dest_state'];
$params['dest_postal'] = $custom_params['dest_postal'];
$params['dest_country'] = $custom_params['dest_country'];
if (strlen($params['dest_country']) == 3) {
// got 3symbol ISO code -> resolve to 2symbol ISO code
$params['dest_country'] = $cs_helper->getCountryIso( $params['dest_country'] );
}
if(!$params['dest_city'] || !$params['dest_country'] ||
(($params['dest_country'] == 'US' || $params['dest_country'] == 'CA') && !$params['dest_state']) ||
!$params['dest_postal'] || !$params['packages'])
{
$valid = false;
}
else
{
$valid = true;
}
return $valid ? $params : false;
}
function GenerateId()
{
static $id;
if(!$id)
{
$id = rand(0, 1000000);
}
return $id;
}
function getShipmentId()
{
return $this->shipment_id;
}
function GetShippingQuotes($params = null)
{
if(!is_array($params)) $params = unserialize($params);
$params = $this->MergeParams($params);
// print_pre($params);
if($params == false)
{
trigger_error('Incorrect params given to <em>intershipper</em> engine', E_USER_WARNING);
return;
}
$target_url = $this->BuildUrl($params);
// print_r($target_url);
$depth = Array();
$xml_parser = xml_parser_create();
xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') );
xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') );
$newdata = curl_post($target_url['url'], $target_url['uri']);
$newdata = substr($newdata, strpos($newdata, '<'));
if (!xml_parse($xml_parser, $newdata, 1)) {
trigger_error(sprintf('XML error: %s at line %d'),
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser), E_USER_WARNING);
}
xml_parser_free($xml_parser);
return array_shift($this->quotes); // array_shift must be removed after!!!
}
function startElement(&$Parser, &$Elem, $Attr)
{
array_push($this->state, $Elem);
$states = implode(' ',$this->state);
//check what state we are in
if($states == 'SHIPMENT PACKAGE') {
$this->package_id = $Attr['ID'];
}
elseif($states == 'SHIPMENT PACKAGE QUOTE') {
$quote = Array('package_id' => $this->package_id, 'id' => $Attr['ID']);
}
}
function characterData($Parser, $Line)
{
$states = join (' ',$this->state);
switch($states)
{
case 'SHIPMENT ERROR':
trigger_error($error = $Line, E_USER_WARNING);
break;
case 'SHIPMENT SHIPMENTID':
$this->shipment_id = $Line;
break;
case 'SHIPMENT PACKAGE BOXID':
$this->box_id = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE CARRIER NAME':
$this->quote['carrier_name'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE CARRIER CODE':
$this->quote['carrier_code'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE CLASS NAME':
$this->quote['class_name'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE CLASS CODE':
$this->quote['class_code'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE SERVICE NAME':
$this->quote['service_name'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE SERVICE CODE':
$this->quote['service_code'] = $Line;
break;
case 'SHIPMENT PACKAGE QUOTE RATE AMOUNT':
$this->quote['amount'] = $Line / 100;
break;
default:
}
}
function endElement($Parser, $Elem)
{
$states = implode(' ',$this->state);
if ($states == 'SHIPMENT PACKAGE QUOTE') {
unset($this->quote['id']);
unset($this->quote['package_id']);
// the $key is a combo of the carrier_code and service_code
// this is the logical way to key each quote returned
$this->quote['amount'] = $this->quote['amount']*(1+$this->PercentSurcharge/100) + $this->FlatSurcharge;
$amount_plain = $this->quote['amount'] * 100;
$key = 'INTSH_'.$this->quote['carrier_code'].'_'.$this->quote['class_code'].'_'.$amount_plain;
$this->quote['ShippingId'] = $key;
$this->quote['ShippingName'] = $this->quote['carrier_code'].' - '.$this->quote['service_name'];
$this->quote['TotalCost'] = $this->quote['amount'];
$this->quotes[$this->box_id][$key] = $this->quote;
}
array_pop($this->state);
}
function LoadParams()
{
$sql = 'SELECT Properties, FlatSurcharge, PercentSurcharge FROM '.$this->Application->getUnitOption('sqe', 'TableName').'
WHERE Name="Intershipper.com"';
$db = $this->Application->GetADODBConnection();
$data = $db->GetRow($sql);
$params = unserialize(getArrayValue($data, 'Properties'));
return array_merge($params, array('FlatSurcharge' => $data['FlatSurcharge'], 'PercentSurcharge' => $data['PercentSurcharge']));
}
function GetAvailableTypes()
{
$params = $this->LoadParams();
$carrier_codes = Array('UPS', 'FDX', 'DHL', 'USP', 'ARB');
$classes = Array('1DY', '2DY', '3DY', 'GND');
$i = 0;
foreach($carrier_codes as $carrier)
{
if(isset($params[$carrier.'Enabled']) && $params[$carrier.'Enabled'])
{
foreach($classes as $class)
{
if(isset($params[$class.'Enabled']) && $params[$class.'Enabled'])
{
$a_type['_ClassName'] = get_class($this);
$a_type['_Id'] = 'INTSH_'.$carrier.'_'.$class;
- $a_type['_Name'] = '(Intershipper)'.$carrier.' '.$class;
+ $a_type['_Name'] = '(Intershipper) '.$carrier.' '.$class;
$ret[] = $a_type;
}
}
}
}
return $ret;
}
-
+ /**
+ * Returns virtual field names, that will be saved as properties
+ *
+ * @return Array
+ */
+ function GetEngineFields()
+ {
+ return Array (
+ 'AccountLogin',
+ 'UPSEnabled', 'UPSAccount', 'UPSInvoiced', 'FDXEnabled', 'FDXAccount', 'FDXInvoiced',
+ 'DHLEnabled', 'DHLAccount', 'DHLInvoiced', 'USPEnabled', 'USPAccount', 'USPInvoiced',
+ 'ARBEnabled', 'ARBAccount', 'ARBInvoiced', '1DYEnabled', '2DYEnabled', '3DYEnabled',
+ 'GNDEnabled', 'ShipMethod',
+ );
+ }
}
/*$params = Array(
'AccountLogin' => 'login',
'AccountPassword' => 'password',
'carriers' => Array(
Array(
'name' => 'UPS',
'account' => '',
'invoiced' => '0'
),
Array(
'name' => 'DHL',
'account' => '',
'invoiced' => '0'
),
Array(
'name' => 'FDX',
'account' => '',
'invoiced' => '0'
),
Array(
'name' => 'USP',
'account' => '',
'invoiced' => '0'
),
Array(
'name' => 'ARB',
'account' => '',
'invoiced' => '0'
),
),
'classes' => Array('1DY', '2DY', '3DY', 'GND'),
'ShipMethod' => 'DRP',
'orig_name' => 'John%20Smith',
'orig_addr1' => '2275%20Union%20Road',
'orig_city' => 'Cheektowaga',
'orig_state' => 'NY',
'orig_postal' => '14227',
'orig_country' => 'US',
// this section is required
'dest_name' => 'Vasya%20Pupkin',
'dest_addr1' => '175%20E.Hawthorn%20pkwy.',
'dest_city' => 'Vernon%20Hills',
'dest_state' => 'IL',
'dest_postal' => '60061',
'dest_country' => 'US',
// this section is required
'packages' => Array(
Array(
'package_key' => 'package1',
'weight' => '50',
'weight_unit' => 'LB',
'length' => '25',
'width' => '15',
'height' => '15',
'dim_unit' => 'IN',
'packaging' => 'BOX',
'contents' => 'OTR',
'insurance' => '0'
),
Array(
'package_key' => 'package2',
'weight' => '50',
'weight_unit' => 'LB',
'length' => '25',
'width' => '15',
'height' => '15',
'dim_unit' => 'IN',
'packaging' => 'BOX',
'contents' => 'OTR',
'insurance' => '0'
),
),
'shipment_id' => 1234;
);
*/
/*
Returns:
$quotes = Array(
'package1' =>
Array(
Array(
'id' => 'INTSH_FDX_2DY',
'type' => 'FDX',
..
'amount' => 24.24,
)
Array(
'type' => 'FDX',
..
'amount' => 24.24,
)
),
'package2' =>
Array(
Array(
'id' => 'INTSH_FDX_3DY',
'type' => 'FDX',
..
'amount' => 24.24,
)
Array(
'type' => 'FDX',
..
'amount' => 24.24,
)
),
)
*/
\ No newline at end of file
Index: branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine_event_handler.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine_event_handler.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine_event_handler.php (revision 13813)
@@ -1,131 +1,148 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class ShippingQuoteEngineEventHandler extends kDBEventHandler {
/**
* Enter description here...
*
* @param kEvent $event
*/
function OnBeforeItemUpdate(&$event)
{
+ parent::OnBeforeItemUpdate($event);
+
$object =& $event->getObject();
- if($object->GetDBField('AccountPassword') == '')
- {
- $sql = 'SELECT Properties FROM '.$object->TableName.'
- WHERE EngineId = '.$object->GetDBField('EngineId');
- $properties = unserialize( $this->Conn->GetOne($sql) );
- $object->SetDBField('AccountPassword', $properties['AccountPassword']);
- }
- $properties = Array(
- 'AccountLogin' => $object->GetDBField('AccountLogin'),
- 'AccountPassword' => $object->GetDBField('AccountPassword'),
- 'UPSEnabled' => $object->GetDBField('UPSEnabled'),
- 'UPSAccount' => $object->GetDBField('UPSAccount'),
- 'UPSInvoiced' => $object->GetDBField('UPSInvoiced'),
- 'FDXEnabled' => $object->GetDBField('FDXEnabled'),
- 'FDXAccount' => $object->GetDBField('FDXAccount'),
- 'DHLEnabled' => $object->GetDBField('DHLEnabled'),
- 'DHLAccount' => $object->GetDBField('DHLAccount'),
- 'DHLInvoiced' => $object->GetDBField('DHLInvoiced'),
- 'USPEnabled' => $object->GetDBField('USPEnabled'),
- 'USPAccount' => $object->GetDBField('USPAccount'),
- 'USPInvoiced' => $object->GetDBField('USPInvoiced'),
- 'ARBEnabled' => $object->GetDBField('ARBEnabled'),
- 'ARBAccount' => $object->GetDBField('ARBAccount'),
- 'ARBInvoiced' => $object->GetDBField('ARBInvoiced'),
- '1DYEnabled' => $object->GetDBField('1DYEnabled'),
- '2DYEnabled' => $object->GetDBField('2DYEnabled'),
- '3DYEnabled' => $object->GetDBField('3DYEnabled'),
- 'GNDEnabled' => $object->GetDBField('GNDEnabled'),
- 'ShipMethod' => $object->GetDBField('ShipMethod'),
- );
- $properties = serialize($properties);
- $object->SetDBField('Properties', $properties);
+ /* @var $object kDBItem */
- $from_country = $this->Application->ConfigValue('Comm_Shipping_Country');
- if (strlen($from_country) == 3) {
- $cs_helper =& $this->Application->recallObject('CountryStatesHelper');
- /* @var $cs_helper kCountryStatesHelper */
+ $engine =& $this->Application->recallObject( $object->GetDBField('ClassName') );
+ /* @var $engine ShippingQuoteEngine */
- // get 2symbol ISO code from 3symbol ISO code
- $from_country = $cs_helper->getCountryIso($from_country);
+ $engine_fields = $engine->GetEngineFields();
+ $properties = $object->GetDBField('Properties');
+ $properties = $properties ? unserialize($properties) : Array ();
+
+ // common fields for all shipping quote engines
+ if ($object->GetDBField('AccountPassword') != '') {
+ // don't erase password by accident
+ $engine_fields[] = 'AccountPassword';
}
- if( !function_exists('curl_init') )
- {
- $object->FieldErrors['Status']['pseudo'] = 'curl_not_present';
- $object->ErrorMsgs['curl_not_present'] = $this->Application->Phrase('la_error_EnableCurlFirst');
- }
- elseif( $object->GetDBField('Status') == 1 && (!$this->Application->ConfigValue('Comm_Shipping_City') || !$from_country ||
- ( ($from_country == 'US' || $from_country == 'CA') && !$this->Application->ConfigValue('Comm_Shipping_State') ) ||
- !$this->Application->ConfigValue('Comm_Shipping_ZIP') ) )
- {
- $object->FieldErrors['Status']['pseudo'] = 'from_info_not_filled_in';
- $object->ErrorMsgs['from_info_not_filled_in'] = $this->Application->Phrase('la_error_FillInShippingFromAddress');
+ // save shipping quote specific fields
+ foreach ($engine_fields as $engine_field) {
+ $properties[$engine_field] = $object->GetDBField($engine_field);
}
+ $object->SetDBField('Properties', serialize($properties));
+
+ $cs_helper =& $this->Application->recallObject('CountryStatesHelper');
+ /* @var $cs_helper kCountryStatesHelper */
+
+ $from_country = $this->Application->ConfigValue('Comm_Shipping_Country');
+ $has_states = strlen($from_country) == 3 ? $cs_helper->CountryHasStates($from_country) : false;
+
+ $valid_address = $from_country && ($has_states && $this->Application->ConfigValue('Comm_Shipping_State') || !$has_states) &&
+ $this->Application->ConfigValue('Comm_Shipping_City') && $this->Application->ConfigValue('Comm_Shipping_ZIP');
+
+ if (!function_exists('curl_init')) {
+ $object->SetError('Status', 'curl_not_present');
+ }
+ elseif (($object->GetDBField('Status') == STATUS_ACTIVE) && !$valid_address) {
+ $object->SetError('Status', 'from_info_not_filled_in');
+ }
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function iterateItems(&$event)
{
// $event->setEventParam('SkipProcessing', 1);
parent::iterateItems($event);
if($event->Name == 'OnMassApprove')
{
$event->status = erSUCCESS;
$event->redirect = true;
}
}
/**
- * Enter description here...
+ * Sets virtual fields from serialized properties array
*
* @param kEvent $event
*/
function OnAfterItemLoad(&$event)
{
+ parent::OnAfterItemLoad($event);
+
$object =& $event->getObject();
- $properties = unserialize( $object->GetDBField('Properties') );
- $object->SetDBFieldsFromHash($properties);
+ /* @var $object kDBItem */
+
+ $properties = $object->GetDBField('Properties');
+
+ if ($properties) {
+ $object->SetDBFieldsFromHash( unserialize($properties) );
+ }
}
+ /**
+ * Deletes cached shipping quotes on any setting change
+ *
+ * @param kEvent $event
+ */
function OnAfterItemCreate(&$event)
{
- $event->CallSubEvent('OnAnyChange');
+ parent::OnAfterItemCreate($event);
+
+ $this->_deleteQuoteCache();
}
+ /**
+ * Deletes cached shipping quotes on any setting change
+ *
+ * @param kEvent $event
+ */
function OnAfterItemUpdate(&$event)
{
- $event->CallSubEvent('OnAnyChange');
+ parent::OnAfterItemUpdate($event);
+
+ $this->_deleteQuoteCache();
}
+ /**
+ * Deletes cached shipping quotes on any setting change
+ *
+ * @param kEvent $event
+ */
function OnAfterItemDelete(&$event)
{
- $event->CallSubEvent('OnAnyChange');
+ parent::OnAfterItemDelete($event);
+
+ $this->_deleteQuoteCache();
}
- function OnAnyChange(&$event)
+ /**
+ * Deletes cached shipping quotes
+ *
+ */
+ function _deleteQuoteCache()
{
- $sql = 'DELETE FROM ' . TABLE_PREFIX . 'Cache WHERE VarName LIKE "ShippingQuotes%"';
+ $sql = 'DELETE FROM ' . TABLE_PREFIX . 'Cache
+ WHERE VarName LIKE "ShippingQuotes%"';
$this->Conn->Query($sql);
}
}
\ No newline at end of file
Index: branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/shipping_quote_engine.php (revision 13813)
@@ -1,139 +1,197 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
-class ShippingQuoteEngine extends kBase {
+class ShippingQuoteEngine extends kHelper {
+
+ /**
+ * Quote engine specific properties
+ *
+ * @var Array
+ */
+ var $properties = Array ();
+
+ function ShippingQuoteEngine()
+ {
+ parent::kHelper();
+
+ $this->initProperties();
+ }
/**
* $params = Array(
* 'AccountLogin' => 'login',
* 'AccountPassword' => 'pass',
* 'carriers' => Array(
* Array(
* 'name' => 'UPS',
* 'account' => '',
* 'invoiced' => '0'
* ),
* Array(
* 'name' => 'DHL',
* 'account' => '',
* 'invoiced' => '0'
* ),
* Array(
* 'name' => 'FDX',
* 'account' => '',
* 'invoiced' => '0'
* ),
* Array(
* 'name' => 'USP',
* 'account' => '',
* 'invoiced' => '0'
* ),
* Array(
* 'name' => 'ARB',
* 'account' => '',
* 'invoiced' => '0'
* ),
* ),
* 'classes' => Array('1DY', '2DY', '3DY', 'GND'),
*
* 'ShipMethod' => 'DRP',
*
* 'orig_name' => 'John%20Smith',
* 'orig_addr1' => '2275%20Union%20Road',
* 'orig_city' => 'Cheektowaga',
* 'orig_state' => 'NY',
* 'orig_postal' => '14227',
* 'orig_country' => 'US',
*
* // this section is required
* 'dest_name' => 'Vasya%20Pupkin',
* 'dest_addr1' => '175%20E.Hawthorn%20pkwy.',
* 'dest_city' => 'Vernon%20Hills',
* 'dest_state' => 'IL',
* 'dest_postal' => '60061',
* 'dest_country' => 'US',
*
* // this section is required
* 'packages' => Array(
* Array(
* 'package_key' => 'package1',
* 'weight' => '50',
* 'weight_unit' => 'LB',
* 'length' => '25',
* 'width' => '15',
* 'height' => '15',
* 'dim_unit' => 'IN',
* 'packaging' => 'BOX',
* 'contents' => 'OTR',
* 'insurance' => '0'
* ),
* Array(
* 'package_key' => 'package2',
* 'weight' => '50',
* 'weight_unit' => 'LB',
* 'length' => '25',
* 'width' => '15',
* 'height' => '15',
* 'dim_unit' => 'IN',
* 'packaging' => 'BOX',
* 'contents' => 'OTR',
* 'insurance' => '0'
* ),
* ),
*
* 'shipment_id' => 1234;
* );
*
*
* Returns:
*
* $quotes = Array(
* 'package1' =>
* Array(
* Array(
* 'id' => 'INTSH_FDX_2DY',
* 'type' => 'FDX',
* ..
* 'amount' => 24.24,
* )
* Array(
* 'type' => 'FDX',
* ..
* 'amount' => 24.24,
* )
* ),
* 'package2' =>
* Array(
* Array(
* 'id' => 'INTSH_FDX_3DY',
* 'type' => 'FDX',
* ..
* 'amount' => 24.24,
* )
* Array(
* 'type' => 'FDX',
* ..
* 'amount' => 24.24,
* )
* ),
* )
*
* @param Array $params
*/
function GetShippingQuotes($params)
{
}
+
+ /**
+ * Returns list of shipping types, that can be selected on product editing page
+ *
+ * @return Array
+ */
+ function GetAvailableTypes()
+ {
+ return Array ();
+
+ }
+
+ /**
+ * Returns virtual field names, that will be saved as properties
+ *
+ * @return Array
+ */
+ function GetEngineFields()
+ {
+ return Array ();
+ }
+
+ /**
+ * Loads properties of shipping quote engine
+ *
+ */
+ function initProperties()
+ {
+ $sql = 'SELECT Properties, FlatSurcharge, PercentSurcharge
+ FROM ' . $this->Application->getUnitOption('sqe', 'TableName') . '
+ WHERE LOWER(ClassName) = ' . $this->Conn->qstr( strtolower( get_class($this) ) );
+ $data = $this->Conn->GetRow($sql);
+
+ if (is_array($data)) {
+ $properties = $data['Properties'] ? unserialize($data['Properties']) : Array ();
+ $properties['FlatSurcharge'] = $data['FlatSurcharge'];
+ $properties['PercentSurcharge'] = $data['PercentSurcharge'];
+
+ $this->properties = $properties;
+ }
+ else {
+ $this->properties = Array ();
+ }
+ }
}
\ No newline at end of file
Index: branches/5.1.x/units/shipping_quote_engines/shipping_quote_collector.php
===================================================================
--- branches/5.1.x/units/shipping_quote_engines/shipping_quote_collector.php (revision 13812)
+++ branches/5.1.x/units/shipping_quote_engines/shipping_quote_collector.php (revision 13813)
@@ -1,133 +1,156 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class ShippingQuoteCollector extends ShippingQuoteEngine {
function GetShippingQuotes($params)
{
- if(!$params['dest_city'] || !$params['dest_country'] ||
- (($params['dest_country'] == 'US' || $params['dest_country'] == 'CA') && !$params['dest_state']) ||
- !$params['dest_postal'] || !$params['packages'])
- {
- return Array();
- }
+ $cs_helper =& $this->Application->recallObject('CountryStatesHelper');
+ /* @var $cs_helper kCountryStatesHelper */
+
+ $has_states = $cs_helper->CountryHasStates( $cs_helper->getCountryIso($params['dest_country'], true) );
- $db =& $this->Application->GetADODBConnection();
+ if (
+ !$params['dest_city'] || !$params['dest_country'] ||
+ ($has_states && !$params['dest_state']) ||
+ !$params['dest_postal'] || !$params['packages']
+ ) {
+ return Array ();
+ }
- $cached_var_name = 'ShippingQuotes'.crc32(serialize($params));
+ $cached_var_name = 'ShippingQuotes' . crc32(serialize($params));
$shipping_types = $this->Application->getDBCache($cached_var_name);
if ($shipping_types) {
return unserialize($shipping_types);
}
- $sql = 'SELECT Classname FROM '.$this->Application->getUnitOption('sqe', 'TableName').' WHERE Status = 1';
- $classes = $db->GetCol($sql);
- $classes[] = 'CustomShippingQuoteEngine'; // always persists
$shipping_types = Array();
- foreach($classes as $class)
- {
+ $classes = $this->getEngineClasses();
+
+ foreach ($classes as $class) {
$object =& $this->Application->recallObject($class);
+ /* @var $object ShippingQuoteEngine */
+
$new_shipping_types = $object->GetShippingQuotes($params);
$shipping_types = array_merge($shipping_types, $new_shipping_types);
}
+
uasort($shipping_types, Array(&$this, 'price_sort'));
- //exclude not available shipping quotes by products
+ // exclude not available shipping quotes by products
$limit_types = unserialize($params['limit_types']);
+
if (is_array($limit_types) && !in_array('ANY', $limit_types)) {
- if (count($limit_types) == 0) break;
- $available_types = array();
- foreach ($shipping_types as $a_type)
- {
- $include = false; //exclude by default
- foreach ($limit_types as $limit)
- {
+ if (count($limit_types) == 0) {
+ break;
+ }
+
+ $available_types = Array ();
+ foreach ($shipping_types as $a_type) {
+ $include = false; // exclude by default
+
+ foreach ($limit_types as $limit) {
$include = $include || preg_match("/^$limit/", $a_type['ShippingId']);
- if ($include) break;
+ if ($include) {
+ break;
+ }
+ }
+
+ if (!$include) {
+ continue;
}
- if (!$include) continue;
- $available_types[$a_type['ShippingId']] = $a_type;
+
+ $available_types[ $a_type['ShippingId'] ] = $a_type;
}
+
$shipping_types = $available_types;
}
- //exclude Selected Products Only shipping types, not matching products
- $available_types = array();
+ // exclude Selected Products Only shipping types, not matching products
+ $available_types = Array();
+
foreach ($shipping_types as $a_type) {
if (getArrayValue($a_type, 'SelectedOnly')) {
- if (!is_array($limit_types) || !in_array($a_type['ShippingId'], $limit_types)) continue;
+ if (!is_array($limit_types) || !in_array($a_type['ShippingId'], $limit_types)) {
+ continue;
+ }
}
- $available_types[$a_type['ShippingId']] = $a_type;
+
+ $available_types[ $a_type['ShippingId'] ] = $a_type;
}
+
$shipping_types = $available_types;
$this->Application->setDBCache($cached_var_name, serialize($shipping_types), 24 * 3600);
return $shipping_types;
}
function GetAvailableShippingTypes()
{
- $db =& $this->Application->GetADODBConnection();
- $sql = 'SELECT Classname FROM '.$this->Application->getUnitOption('sqe', 'TableName').' WHERE Status = 1';
- $classes = $db->GetCol($sql);
- $classes[] = 'CustomShippingQuoteEngine'; // always persists
- $shipping_types = Array();
- foreach($classes as $class)
- {
+ $shipping_types = Array ();
+ $classes = $this->getEngineClasses();
+
+ foreach ($classes as $class) {
$object =& $this->Application->recallObject($class);
+ /* @var $object ShippingQuoteEngine */
+
$new_shipping_types = $object->GetAvailableTypes();
$shipping_types = array_merge($shipping_types, $new_shipping_types);
}
+
uasort($shipping_types, Array(&$this, 'SortShippingTypes'));
return $shipping_types;
}
+ /**
+ * Returns all enabled shipping quote engine classes
+ *
+ * @return Array
+ */
+ function getEngineClasses()
+ {
+ $sql = 'SELECT Classname
+ FROM ' . $this->Application->getUnitOption('sqe', 'TableName') . '
+ WHERE Status = ' . STATUS_ACTIVE;
+ $classes = $this->Conn->GetCol($sql);
+
+ // always persists
+ $classes[] = 'CustomShippingQuoteEngine';
+
+ return $classes;
+ }
+
function SortShippingTypes($elem1, $elem2)
{
- if($elem1['_Name'] < $elem2['_Name'])
- {
- return -1;
- }
- elseif($elem1['_Name'] > $elem2['_Name'])
- {
- return 1;
- }
- else
- {
+ if ($elem1['_Name'] == $elem2['_Name']) {
return 0;
}
+
+ return $elem1['_Name'] < $elem2['_Name'] ? -1 : 1;
}
function price_sort($elem1, $elem2)
{
- if($elem1['TotalCost'] < $elem2['TotalCost'])
- {
- return -1;
- }
- elseif($elem1['TotalCost'] > $elem2['TotalCost'])
- {
- return 1;
- }
- else
- {
+ if ($elem1['TotalCost'] == $elem2['TotalCost']) {
return 0;
}
+ return $elem1['TotalCost'] < $elem2['TotalCost'] ? -1 : 1;
}
}
\ No newline at end of file
Index: branches/5.1.x/units/shipping/shipping_tag_processor.php
===================================================================
--- branches/5.1.x/units/shipping/shipping_tag_processor.php (revision 13812)
+++ branches/5.1.x/units/shipping/shipping_tag_processor.php (revision 13813)
@@ -1,307 +1,308 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class ShippingTagProcessor extends kDBTagProcessor {
function CostInputSize($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial() );
$prec_before_sep = $object->GetDBField('PrecisionBeforeSep');
$prec_after_sep = $object->GetDBField('PrecisionAfterSep');
return $prec_before_sep + $prec_after_sep + 1 + ($prec_before_sep > 3 ? 1:0);
}
function ShowCostsTable($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial() );
$zones_object =& $this->Application->recallObject('z');
$brackets_object =& $this->Application->recallObject('br');
$costs_object =& $this->Application->recallObject('sc');
$main_processor =& $this->Application->recallObject('m_TagProcessor');
$zones_sql = 'SELECT * FROM '.$zones_object->TableName.' WHERE ShippingTypeID='.$this->Application->GetVar('s_id').' ORDER BY Name ASC';
$brackets_sql = 'SELECT * FROM '.$brackets_object->TableName.' WHERE ShippingTypeID='.$this->Application->GetVar('s_id').' ORDER BY Start ASC';
$sql = 'SELECT * FROM '.$costs_object->TableName;
$costs_array = $this->Conn->Query($sql, 'ShippingCostId');
$zones = $this->Conn->Query($zones_sql, 'ZoneID');
$brackets = $this->Conn->Query($brackets_sql, 'BracketId');
$oddevenparam['odd'] = 'table-color1';
$oddevenparam['even'] = 'table-color2';
if(!$zones || !$brackets)
{
return '<tr class="'.$main_processor->Odd_Even($oddevenparam).'"><td>'.$this->Application->Phrase('la_NoZonesOrBrackets').'</td></tr>';
}
uasort($brackets, 'bracket_comp');
if( $this->Application->GetLinkedVar('CostsTableAligment') )
{
$column_items = $brackets;
$column_object =& $brackets_object;
$column_params['header_caption'] = 'bracket_caption';
$column_params['IdField'] = 'BracketId';
$column_params['prefix'] = 'br';
$row_items = $zones;
$row_object =& $zones_object;
$row_params['header_caption'] = 'zone_caption';
$row_params['IdField'] = 'ZoneID';
$row_params['prefix'] = 'z';
}
else
{
$column_items = $zones;
$column_object =& $zones_object;
$column_params['header_caption'] = 'zone_caption';
$column_params['IdField'] = 'ZoneID';
$column_params['prefix'] = 'z';
$row_items = $brackets;
$row_object =& $brackets_object;
$row_params['header_caption'] = 'bracket_caption';
$row_params['IdField'] = 'BracketId';
$row_params['prefix'] = 'br';
}
$costs_table = '<tr class="'.$main_processor->Odd_Even($oddevenparam).'"><td>&nbsp;</td>';
foreach($column_items as $id => $record)
{
$column_object->Load($id);
$head_row_params = $column_params;
$head_row_params['name'] = 'column_header';
$costs_table .= $this->Application->ParseBlock($head_row_params);
}
$costs_table .= '</tr>';
$cost_ids = Array();
foreach($row_items as $id =>$record)
{
$costs_table .= '<tr class="'.$main_processor->Odd_Even($oddevenparam).'">';
$row_object->Load($id);
$head_row_params = $row_params;
$head_row_params['name'] = 'row_header';
$costs_table .= $this->Application->ParseBlock($head_row_params);
foreach($column_items as $col_id => $col_record)
{
$res = false;
foreach($costs_array as $cost_id => $cost_record)
{
if($cost_record[$row_params['IdField']] == $id && $cost_record[$column_params['IdField']] == $col_id)
{
$costs_object->SetDBFieldsFromHash($cost_record);
$res = true;
break;
}
}
if($res == false)
{
$costs_object->SetDefaultValues();
$sql = 'SELECT MIN(ShippingCostId) FROM '.$costs_object->TableName;
$new_id = $cost_ids ? min( $this->Conn->GetOne($sql) - 1, min($cost_ids) - 1 ) : 0;
$costs_object->SetDBField( 'ShippingCostId', $new_id );
$cost_ids[] = $new_id;
}
$column_object->Load($col_id);
$costs_object->SetID($costs_object->GetDBField('ShippingCostId'));
$cost_cell_params['name'] = 'cost_cell';
$costs_table .= $this->Application->ParseBlock($cost_cell_params);
}
$costs_table .= '</tr>';
}
return $costs_table;
}
function HiddenSelection($params)
{
// $object = $this->getPrefixSpecial();
$zones = $this->Application->GetVar('z');
$brackets = $this->Application->GetVar('br');
$ret = '';
foreach($zones as $id => $record)
{
$ret .= '<input type="hidden" name="z['.$id.'][ZoneID]" value="'.$id.'">'."\n";
}
foreach ($brackets as $id => $record)
{
$ret .= '<input type="hidden" name="br['.$id.'][BracketId]" value="'.$id.'">'."\n";
}
return $ret;
}
function Order_PrintShippingTypes($params)
{
$weight = $this->Application->Parser->GetParam('weight_metric');
$items = $this->Application->Parser->GetParam('items');
$amount = $this->Application->Parser->GetParam('amount');
$selected_id = $this->Application->Parser->GetParam('selected_id');
$package_id = $this->Application->Parser->GetParam('package_num');
// free promo shipping params if applicable, if not then the same as standard
$promo_items = $this->Application->Parser->GetParam('promo_items');
$promo_amount = $this->Application->Parser->GetParam('promo_amount');
$promo_weight = $this->Application->Parser->GetParam('promo_weight_metric');
$user_country_id = $this->Application->Parser->GetParam('user_country_id');
$user_state_id = $this->Application->Parser->GetParam('user_state_id');
$user_zip = $this->Application->Parser->GetParam('user_zip');
$user_city = $this->Application->Parser->GetParam('user_city');
$user_addr1 = $this->Application->Parser->GetParam('user_addr1');
$user_addr2 = $this->Application->Parser->GetParam('user_addr2');
$user_name = $this->Application->Parser->GetParam('user_name');
$limit_types = $this->Application->Parser->GetParam('limit_types');
$this->Application->recallObject('ShippingQuoteEngine');
$quote_engine_collector =& $this->Application->recallObject('ShippingQuoteCollector');
$shipping_quote_params = Array(
'dest_country' => $user_country_id,
'dest_state' => $user_state_id,
'dest_postal' => $user_zip,
'dest_city' => $user_city,
'dest_addr1' => $user_addr1,
'dest_addr2' => $user_addr2,
'dest_name' => $user_name,
'packages' => Array(
Array(
'package_key' => 'package1',
'weight' => $weight,
'weight_unit' => 'KG',
'length' => '',
'width' => '',
'height' => '',
'dim_unit' => 'IN',
'packaging' => 'BOX',
'contents' => 'OTR',
'insurance' => '0'
),
),
'amount' => $amount,
'items' => $items,
'limit_types' => $limit_types,
'promo_params' => Array (
'items' => $promo_items,
'amount' => $promo_amount,
'weight' => $promo_weight,
)
);
$shipping_types = $quote_engine_collector->GetShippingQuotes($shipping_quote_params);
$last_shippings = $this->Application->RecallVar('LastShippings');
if($last_shippings)
{
$last_shippings = unserialize($last_shippings);
}
$order_object =& $this->Application->recallObject('ord');
$original_shipping = $order_object->GetDBField('ShippingInfo');
$original_shipping = unserialize($original_shipping);
$shipping_type_keys = array_keys($shipping_types);
if( getArrayValue($original_shipping, $package_id, 'ShippingId') &&
( $this->Application->isAdminUser || in_array( $original_shipping[$package_id]['ShippingId'], $shipping_type_keys ) ) )
{
$original_shipping = $original_shipping[$package_id];
$key = $original_shipping['ShippingId'];
$shipping_types[$key]['TotalCost'] = $this->Application->isAdminUser ? $original_shipping['TotalCost'] : $shipping_types[$key]['TotalCost'];
$shipping_types[$key]['ShippingName'] = $this->Application->isAdminUser ? 'Original: '.$original_shipping['ShippingName'] : $shipping_types[$key]['ShippingName'];
$shipping_types[$key]['ShippingId'] = $key;
$selected_id = $key;
}
$last_shippings[$package_id] = $shipping_types;
if( $this->Application->isAdminUser && $key)
{
$orig_name = ltrim($last_shippings[$package_id][$key]['ShippingName'], 'Original: ');
$last_shippings[$package_id][$key]['ShippingName'] = $orig_name;
}
$this->Application->StoreVar('LastShippings', serialize($last_shippings));
$o = '';
$def_block_params = Array();
$def_block_params['name'] = $this->SelectParam($params, 'render_as,block');
if(!count($shipping_types))
{
$this->Application->SetVar('ItemShipmentsExists', 0);
$o = '';
}
else
{
$lang =& $this->Application->recallObject('lang.current');
foreach ($shipping_types as $shipping_type) {
$shipping_type['ShippingFree'] = ($shipping_type['TotalCost'] == 0)? 1 : 0;
$iso = $this->GetISO($params['currency']);
$amount = $this->ConvertCurrency($shipping_type['TotalCost'], $iso);
$amount = $lang->formatNumber($amount,2);
$shipping_type['TotalCost'] = $this->AddCurrencySymbol($amount, $iso);
$block_params = array_merge($def_block_params, $shipping_type);
$block_params['selected'] = $shipping_type['ShippingId'] == $selected_id ? 'selected' : '';
if (isset($params['selected_only']) && $block_params['selected'] == '') continue;
$o .= $this->Application->ParseBlock($block_params);
}
}
return $o;
}
function AvailableTypes($params)
{
$quote_engine_collector =& $this->Application->recallObject('ShippingQuoteCollector');
+ /* @var $quote_engine_collector ShippingQuoteCollector */
+
$types = $quote_engine_collector->GetAvailableShippingTypes();
$o;
foreach ($types as $a_type)
{
$block_params = $a_type;
$block_params['name'] = $params['render_as'];
$o .= $this->Application->ParseBlock($block_params);
}
return $o;
}
function ListGroups($params)
{
$object =& $this->getObject($params);
$selected = trim($object->GetDBField('PortalGroups'), ',');
$selected_arr = explode(',', $selected);
$all_groups = $this->Conn->Query('SELECT GroupId, Name FROM '.TABLE_PREFIX.'PortalGroup ORDER BY NAME', 'GroupId');
-
$o = '';
foreach ($all_groups as $a_group)
{
$is_selected = in_array($a_group['GroupId'], $selected_arr);
$continue = $params['mode'] == 'selected' ? !$is_selected : $is_selected;
if ($continue) continue;
$block_params = $a_group;
$block_params['name'] = $params['render_as'];
$o .= $this->Application->ParseBlock($block_params);
}
return $o;
}
}
\ No newline at end of file
Index: branches/5.1.x/units/products/products_tag_processor.php
===================================================================
--- branches/5.1.x/units/products/products_tag_processor.php (revision 13812)
+++ branches/5.1.x/units/products/products_tag_processor.php (revision 13813)
@@ -1,772 +1,773 @@
<?php
/**
* @version $Id$
* @package In-Commerce
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license Commercial License
* This software is protected by copyright law and international treaties.
* Unauthorized reproduction or unlicensed usage of the code of this program,
* or any portion of it may result in severe civil and criminal penalties,
* and will be prosecuted to the maximum extent possible under the law
* See http://www.in-portal.org/commercial-license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class ProductsTagProcessor extends kCatDBTagProcessor {
function Rating($params)
{
$object =& $this->getObject($params);
$rating = round($object->GetDBField('CachedRating') );
$o = '';
for ($i = 0; $i < $rating; $i++) {
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'star_on_render_as,block_star_on')) );
}
for ($i = 0; $i < 5 - $rating; $i++) {
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'star_off_render_as,block_star_off')) );
}
return $o;
}
function NewMark($params)
{
$object =& $this->getObject($params);
$o = '';
if($object->GetDBField('IsNew'))
{
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'render_as,block')) );
}
return $o;
}
function HotMark($params)
{
$object =& $this->getObject($params);
$o = '';
if($object->GetDBField('IsHot'))
{
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'render_as,block')) );
}
return $o;
}
function TopSellerMark($params)
{
return $this->HotMark($params);
}
function PopMark($params)
{
$object =& $this->getObject($params);
$o = '';
if($object->GetDBField('IsPop'))
{
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'render_as,block')) );
}
return $o;
}
function EdPickMark($params)
{
$object =& $this->getObject($params);
$o = '';
if($object->GetDBField('EditorsPick'))
{
$o .= $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'render_as,block')) );
}
return $o;
}
/**
* Parses block only if item is favorite
*
* @param Array $params
* @return string
* @deprecated used only in default,onlinestore
*/
function FavoriteMark($params)
{
if ($this->IsFavorite($params)) {
return $this->Application->ParseBlock( Array( 'name' => $this->SelectParam($params, 'render_as,block') ) );
}
return '';
}
function CurrentCategory($params){
$conn=$this->Application->GetADODBConnection();
return $conn->GetOne("SELECT Name FROM ".TABLE_PREFIX."Category WHERE CategoryId=".$this->Application->GetVar("m_cat_id"));
}
function RateForm($params)
{
$params['name'] = $this->SelectParam($params, 'render_as,block');
$labels = explode(',', $params['labels']);
$o = '';
$star_block = $this->SelectParam($params, 'star_render_as,star_block');
for($i = 5; $i >= 0; $i--)
{
$params['rating'] = $i;
$params['label'] = $this->Application->Phrase($labels[5 - $i]);
$params['stars'] = '';
for($j = $i; $j > 0; $j--)
{
$params['stars'] .= $this->Application->ParseBlock(Array('name' => $star_block));
}
$o .= $this->Application->ParseBlock($params);
}
return $o;
}
/**
* Parses block for changing favorite status
*
* @param Array $params
* @return string
* @deprecated used only in default,onlinestore
*/
function FavoriteToggle($params)
{
$block_params = Array ();
$block_names = $this->IsFavorite($params) ? 'remove_favorite_render_as,block_remove_favorite' : 'add_favorite_render_as,block_add_favorite';
$block_params['name'] = $this->SelectParam($params, $block_names);
$params['template'] = $params[$this->IsFavorite($params) ? 'template_on_remove' : 'template_on_add'];
$remove_params = Array (
'remove_favorite_render_as', 'block_remove_favorite', 'add_to_wish_list_render_as', 'block_add_to_wish_list',
'add_favorite_render_as', 'block_add_favorite', 'remove_from_wish_list_render_as', 'block_remove_from_wish_list',
'template_on_remove', 'template_on_add'
);
foreach ($params as $param_name => $param_value) {
if (in_array($param_name, $remove_params)) {
unset($params[$param_name]);
}
}
$block_params['wish_list_toggle_link'] = $this->FavoriteToggleLink($params);
return $this->Application->ParseBlock($block_params);
}
function WishListToggleLink($params)
{
$params['block_add_favorite'] = $this->SelectParam($params, 'add_to_wish_list_render_as,block_add_to_wish_list');
$params['block_remove_favorite'] = $this->SelectParam($params, 'remove_from_wish_list_render_as,block_remove_from_wish_list');
return $this->FavoriteToggle($params);
}
function AddReviewLink($params)
{
$o = $this->Application->ParseBlock( Array('name' => $this->SelectParam($params, 'render_as,block')) );
return $o;
}
function ListProducts($params)
{
return $this->PrintList2($params);
}
function ListRelatedProducts($params)
{
// $related = &$this->Application->recallObject('rel');
return $this->PrintList2($params);
}
function BuildListSpecial($params)
{
if ($this->Special != '') return $this->Special;
if ( isset($params['parent_cat_id']) ) {
$parent_cat_id = $params['parent_cat_id'];
}
else {
$parent_cat_id = $this->Application->GetVar('c_id');
if (!$parent_cat_id) {
$parent_cat_id = $this->Application->GetVar('m_cat_id');
}
}
if ( isset($params['manufacturer']) ) {
$manufacturer = $params['manufacturer'];
}
else {
$manufacturer = $this->Application->GetVar('manuf_id');
}
$recursive = isset($params['recursive']);
$list_unique_key = $this->getUniqueListKey($params).$recursive;
if ($list_unique_key == '') {
return parent::BuildListSpecial($params);
}
return crc32($parent_cat_id.$list_unique_key.$manufacturer);
}
function ProductList($params)
{
if($params['shortlist'])
{
$params['per_page'] = $this->Application->ConfigValue('Comm_Perpage_Products_Short');
}
$object =& $this->Application->recallObject( $this->getPrefixSpecial() , $this->Prefix.'_List', $params );
switch($params['ListType'])
{
case 'favorites':
return $this->PrintList($params);
break;
case 'search':
default:
if(isset($params['block']))
{
return $this->PrintList($params);
}
else
{
$params['block'] = $params['block_main'];
$params['row_start_block'] = $params['block_row_start'];
$params['row_end_block'] = $params['block_row_end'];
return $this->PrintList2($params);
}
}
}
/**
* Adds product to recently viewed list (only in case, when not already there)
*
* @param Array $params
*/
function AddToRecent($params)
{
$recent_products = $this->Application->RecallVar('recent_products');
if (!$recent_products) {
$recent_products = Array();
}
else {
$recent_products = unserialize($recent_products);
}
$product_id = $this->Application->GetVar('p_id');
if (!in_array($product_id, $recent_products)) {
array_push($recent_products, $product_id);
$this->Application->StoreVar('recent_products', serialize($recent_products));
}
}
function SearchMoreLink($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial() , $this->Prefix.'_List', $params );
$o = '';
if($object->PerPage < $this->SearchResultsCount())
{
$o = $this->Application->ParseBlock( Array('name' => $params['block']) );
}
return $o;
}
function AddToCartLink($params)
{
$object =& $this->getObject($params);
if ($object->GetDBField('HasRequiredOptions')) {
$t = $params['product_template'];
if (!$t) {
$theme =& $this->Application->recallObject('theme.current');
if ($theme->GetDBField('Name') == 'onlinestore') {
$t = 'in-commerce/product/details';
}
elseif ($theme->GetDBField('Name') == 'default') {
$t = 'in-commerce/product';
}
}
$link_params = Array('m_cat_id' => $object->GetDBField('CategoryId'), 'pass' => 'm,p');
}
else {
$t = $params['template'];
$link_params = Array('m_cat_id' => $object->GetDBField('CategoryId'), 'pass' => 'm,p,ord', 'ord_event' => 'OnAddToCart');
}
$this->Application->SetVar('p_id', $this->Application->GetVar($this->getPrefixSpecial().'_id'));
return $this->Application->HREF($t, '', $link_params);
}
function SearchResultsCount($params)
{
$search_results_table = TABLE_PREFIX.'ses_'.$this->Application->GetSID().'_'.TABLE_PREFIX.'Search';
$sql = ' SELECT COUNT(ResourceId)
FROM '.$search_results_table.'
WHERE ItemType=11';
return $this->Conn->GetOne($sql);
}
function DetailsLink($params)
{
$this->Application->SetVar( $this->Prefix.'_id', $this->Application->GetVar($this->getPrefixSpecial().'_id') );
$ret = $this->Application->HREF('in-commerce/details', '', Array('pass' => 'all,p'));
return $ret;
}
function ProductLink($params)
{
return $this->ItemLink($params, 'product');
}
function ProductFileLink($params)
{
// 'p_id'=>'0', ??
$params = array_merge($params, Array('pass'=>'all,m,p,file.downl'));
$product_id = getArrayValue($params,'product_id');
if (!$product_id) {
$product_id = $this->Application->GetVar($this->Prefix.'_id');
}
$params['p_id'] = $product_id;
$product =& $this->Application->recallObject($this->getPrefixSpecial());
$params['m_cat_id'] = $product->GetDBField('CategoryId');
$main_processor =& $this->Application->recallObject('m_TagProcessor');
return $main_processor->T($params);
}
/*
function MoreLink($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial() , $this->Prefix.'_List', $params );
$favorites_tag_processor =& $this->Application->recallObject('fav_TagProcessor');
$o = '';
if($object->PerPage < $favorites_tag_processor->FavoriteProductCount( Array('filter' => 'all') ))
{
$o = $this->Application->ParseBlock( Array('name' => $params['block']) );
}
return $o;
}
*/
function GetMarkedVal($params)
{
$list =& $this->GetList($params);
return $this->Application->RecallVar($list->getPrefixSpecial().$params['name']);
}
function SortingOptions($params)
{
$list =& $this->GetList($params);
$sorting_field_selected = $this->Application->RecallVar($list->getPrefixSpecial().$params['sorting_select_name']);
if (!$sorting_field_selected){
$sorting_field_selected = $this->Application->ConfigValue('product_OrderProductsBy');
}
$sql = 'SELECT ValueList
FROM ' . TABLE_PREFIX . 'ConfigurationValues
WHERE VariableName = "product_OrderProductsBy"';
$field_list_plain = $this->Conn->GetOne($sql);
$field_list = explode(',', $field_list_plain);
$o = '';
foreach ($field_list as $key=>$field){
list($fieldname, $fieldlabel) = explode('=', $field);
$option_params = $this->prepareTagParams($params);
$option_params['fieldname'] = $fieldname;
$option_params['fieldlabel'] = $this->Application->Phrase($fieldlabel);
$option_params['name'] = $params['block_options'];
if ($fieldname == $sorting_field_selected){
$option_params['selected'] = 'selected';
}else{
$option_params['selected'] = '';
}
$o .= $this->Application->ParseBlock($option_params);
}
return $o;
}
function SortingDirectionOptions($params)
{
$list =& $this->GetList($params);
$sorting_dir_selected = $this->Application->RecallVar($list->getPrefixSpecial().$params['sorting_select_name']);
if (!$sorting_dir_selected){
$sorting_dir_selected = $this->Application->ConfigValue('product_OrderProductsByDir');
}
$o = '';
$field_list = array('asc' => 'lu_Ascending', 'desc' => 'lu_Descending');
foreach ($field_list as $fieldname=>$fieldlabel){
$option_params = $this->prepareTagParams($params);
$option_params['fieldname'] = $fieldname;
$option_params['fieldlabel'] = $this->Application->Phrase($fieldlabel);
$option_params['name'] = $params['block_options'];
if ($fieldname == $sorting_dir_selected){
$option_params['selected'] = 'selected';
}else{
$option_params['selected'] = '';
}
$o .= $this->Application->ParseBlock($option_params);
}
return $o;
}
function ErrorMessage($params)
{
if( $this->Application->GetVar('keywords_too_short') )
{
$ret = $this->Application->ParseBlock(Array('name' => $this->SelectParam($params, 'keywords_too_short_render_as,block_keywords_too_short')));
}
elseif( $this->Application->GetVar('adv_search_error') )
{
$ret = $this->Application->ParseBlock(Array('name' => $this->SelectParam($params, 'adv_search_error_render_as,block_adv_search_error')));
}
else
{
$ret = $this->Application->ParseBlock(Array('name' => $this->SelectParam($params, 'no_found_render_as,block_no_found')));
}
return $ret;
}
function ListReviews($params)
{
$review_tag_processor =& $this->Application->recallObject('rev.product_TagProcessor');
return $review_tag_processor->PrintList($params);
}
function ReviewCount($params)
{
$review_tag_processor =& $this->Application->recallObject('rev.product_TagProcessor');
return $review_tag_processor->TotalRecords($params);
}
function InitList($params){
$passed_manuf_id = $this->Application->GetVar('manuf_id');
if ($passed_manuf_id && !isset($params['manufacturer'])){
$params['manufacturer'] = $passed_manuf_id;
}
parent::InitList($params);
}
/**
* Builds link to manufacturer page
*
* @param Array $params
* @return string
*/
function ManufacturerLink($params)
{
if ( array_key_exists('manufacturer_id', $params) ) {
// use direct manufacturer from tag
$params['manuf_id'] = $params['manufacturer_id'];
unset($params['manufacturer_id']);
}
else {
// use product's manufacturer
$object =& $this->getObject($params);
$item_manufacturer_id = $object->GetDBField('ManufacturerId');
if ($item_manufacturer_id){
$params['manuf_id'] = $item_manufacturer_id;
}
}
$params['pass'] = 'm,manuf';
$params['m_cat_id'] = 0;
return $this->Application->ProcessParsedTag('m', 'Link', $params);
}
function AlreadyReviewed($params)
{
$rev_tag_processor =& $this->Application->recallObject('rev_TagProcessor');
return $rev_tag_processor->AlreadyReviewed($params);
}
function PrepareSearchResults($params)
{
$names_mapping = $this->Application->GetVar('NamesToSpecialMapping');
if($this->Application->GetVar('search_type') == 'advanced' || !getArrayValue($names_mapping, $this->Prefix, 'search_results'))
{
$params = Array('list_name' => 'search_results',
'types' => 'search',
'parent_cat_id' => 'any',
'recursive' => 'true',
'per_page' => 'short_list'
);
$this->InitList($params);
}
return '';
}
function Available($params)
{
$object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params);
if (!$object->GetDBField('InventoryStatus')) return true;
$backordering = $this->Application->ConfigValue('Comm_Enable_Backordering');
if ($object->GetDBField('InventoryStatus') == 2) {
$poc_table = $this->Application->getUnitOption('poc', 'TableName');
$sql = 'SELECT SUM(IF(QtyInStock > '.$object->GetDBField('QtyInStockMin').', 1, 0))
FROM '.$poc_table.'
WHERE (ProductId = '.$object->GetID().') AND (Availability = 1)';
$stock_available = $this->Conn->GetOne($sql) > 0; // at least one option combination present
}
else {
$stock_available = $object->GetDBField('QtyInStock') > $object->GetDBField('QtyInStockMin');
}
$prod_backordering = $object->GetDBField('BackOrder');
if ($stock_available) return true;
// stock is NOT available:
if (!$backordering || $prod_backordering == 0) return false; // if backordering is generaly disabled or disabled for product (Never)
// backordering enabled; (auto or always mode)
return true;
}
function IsSubscription($params)
{
$object = &$this->Application->recallObject($this->getPrefixSpecial());
return ($object->GetDBField('Type') == 2);
}
function IsTangible($params)
{
$object = &$this->Application->recallObject($this->getPrefixSpecial());
return ($object->GetDBField('Type') == 1);
}
function HasFiles($params)
{
$sql = 'SELECT COUNT(FileId) FROM '.$this->Application->getUnitOption('file', 'TableName').'
WHERE ProductId = '.$this->Application->GetVar('p_id').' AND Status = 1';
return $this->Conn->GetOne($sql) ? 1 : 0;
}
function UniqueFileName($params)
{
$file_object =& $this->Application->recallObject('file.downl');
return ($file_object->GetDBField('Name') &&
$file_object->GetDBField('Name') != $file_object->GetDBField('FilePath'))
? 1 : 0;
}
function FileDownload($params)
{
$file_id = $this->Application->GetVar('file.downl_id');
$product_id = $file_id ? $this->Conn->GetOne('SELECT ProductId
FROM '.$this->Application->getUnitOption('file', 'TableName').'
WHERE FileId = '.$file_id) :
$this->Application->GetVar($this->getPrefixSpecial().'_id');
$download_helper_class = $this->Application->getUnitOption($this->Prefix, 'DownloadHelperClass');
if (!$download_helper_class) {
$download_helper_class = 'DownloadHelper';
}
$download_helper =& $this->Application->recallObject($download_helper_class);
if (!$download_helper->CheckAccess($file_id, $product_id)) {
$this->Application->ApplicationDie('File Access permission check failed!');
}
$file_info = $download_helper->SendFile($file_id, $product_id);
$download_helper->LogDownload($product_id, $file_info);
define('DBG_SKIP_REPORTING', 1);
$this->Application->ApplicationDie();
}
function PictureLink($params)
{
if (getArrayValue($params, 'picture_list')) {
$params['img_id'] = $this->Application->GetVar('img_id');
$params['pass'] = 'all,p,img';
unset($params['picture_list']);
}
else {
$params['pass'] = 'all,p';
}
return $this->Application->ProcessParsedTag('m', 'Link', $params);
}
function ShouldListOptions($params)
{
$object =& $this->getObject($params);
$req_filter = '';
if (getArrayValue($params, 'required_only')) {
$req_filter = ' AND Required = 1';
}
$query = 'SELECT COUNT(*) FROM '.TABLE_PREFIX.'ProductOptions WHERE ProductId = '.$object->GetID().$req_filter;
$res = $this->Conn->GetOne($query);
return $res > 0;
}
function CountOptions($params)
{
$object =& $this->getObject($params);
$query = 'SELECT COUNT(*) FROM '.TABLE_PREFIX.'ProductOptions WHERE ProductId = '.$object->GetID();
$res = $this->Conn->GetOne($query);
$max = $this->SelectParam($params, 'greater');
if (!$max) $max = 0;
return $res > $max;
}
function OptionsUpdateMode($params)
{
return $this->Application->GetVar('orditems_id') !== false;
}
function OptionsHaveError($params)
{
return $this->Application->GetVar('opt_error') > 0;
}
function OptionsError($params)
{
switch ($this->Application->GetVar('opt_error')) {
case 1:
return $this->Application->Phrase($params['required']);
case 2:
return $this->Application->Phrase($params['not_available']);
}
}
-
function ListShippingTypes($params)
{
$quote_engine_collector =& $this->Application->recallObject('ShippingQuoteCollector');
+ /* @var $quote_engine_collector ShippingQuoteCollector */
+
$types = $quote_engine_collector->GetAvailableShippingTypes();
$object =& $this->getObject($params);
$selected = $object->GetDBField('ShippingLimitation');
$selected = explode('|', substr($selected, 1, -1));
$o = '';
foreach ($types as $a_type)
{
$is_selected = in_array($a_type['_Id'], $selected);
$continue = $params['mode'] == 'selected' ? !$is_selected : $is_selected;
if ($continue) continue;
$block_params = $a_type;
$block_params['name'] = $params['render_as'];
$o .= $this->Application->ParseBlock($block_params);
}
return $o;
}
function PageLink($params)
{
$manufacturer_id = $this->Application->GetVar('manuf_id');
if ($manufacturer_id) {
$params['pass'] = 'm,'.$this->getPrefixSpecial().',manuf';
}
return parent::PageLink($params);
}
/**
* Calculate savings based on price & market price relationship
*
* @param Array $params
* @return int
*/
function Savings($params)
{
$object =& $this->getObject($params);
/* @var $object kDBItem */
$price = $object->GetDBField('Price');
$msrp = $object->GetDBField('MSRP');
$value = 0;
if (isset($params['type']) && ($params['type'] == 'percent')) {
if ($msrp > 0) {
return 100 - round($price * 100 / $msrp);
}
}
else {
if ($msrp > $price) {
$value = $msrp - $price;
}
}
if (isset($params['currency'])) {
$lang =& $this->Application->recallObject('lang.current');
/* @var $lang LanguagesItem */
$iso = $this->GetISO($params['currency']);
$value = $this->ConvertCurrency($value, $iso);
$value = $lang->formatNumber( sprintf('%.2f', $value) );
$value = $this->AddCurrencySymbol($value, $iso);
}
return $value;
}
/**
* Hides permission tab, when it's not allowed by configuration settings
*
* @param Array $params
*/
function ModifyUnitConfig($params)
{
$edit_tab_presets = $this->Application->getUnitOption($this->Prefix, 'EditTabPresets');
$edit_tab_preset = $edit_tab_presets['Default'];
$object =& $this->getObject($params);
/* @var $object kDBItem */
$product_type = $object->GetDBField('Type');
if ($product_type != PRODUCT_TYPE_TANGIBLE) {
unset($edit_tab_preset['inventory']);
}
if ($product_type == PRODUCT_TYPE_SUBSCRIPTION) {
unset($edit_tab_preset['options']);
}
else {
unset($edit_tab_preset['access_and_pricing']);
}
if ($product_type != PRODUCT_TYPE_TANGIBLE && $product_type != PRODUCT_TYPE_PACKAGE) {
unset($edit_tab_preset['pricing']);
}
else {
unset($edit_tab_preset['pricing2']);
}
if ($product_type != PRODUCT_TYPE_DOWNLOADABLE) {
unset($edit_tab_preset['files_and_pricing']);
}
if ($product_type != PRODUCT_TYPE_PACKAGE) {
unset($edit_tab_preset['package_content']);
}
$edit_tab_presets['Default'] = $edit_tab_preset;
$this->Application->setUnitOption($this->Prefix, 'EditTabPresets', $edit_tab_presets);
}
}
\ No newline at end of file

Event Timeline