Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/joomla4/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/joomla4/usps.tar

index.html000064400000000054151161642360006545 0ustar00<html><body
bgcolor="#FFFFFF"></body></html>usps.php000064400000111771151161642360006264
0ustar00<?php
/**
 * @package	HikaShop for Joomla!
 * @version	4.4.1
 * @author	hikashop.com
 * @copyright	(C) 2010-2021 HIKARI SOFTWARE. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php
class plgHikashopshippingUSPS extends hikashopShippingPlugin {
	var $multiple = true;
	var $name = 'usps';
	var $doc_form = 'usps';
	var $pluginConfig = array(
		'usps_user_id' => array('USPS WebTools User ID',
'input'),
		'post_code' => array('POST_CODE',
'input'),
		'services' => array('SHIPPING_SERVICES',
'checkbox',array(
			'PRIORITY' => 'Priority Mail',
			'MEDIA' => 'Media Mail',
			'EXPRESS' => 'Express Mail',
			'EXPRESSINT' => 'Priority Mail Express International
(International)',
			'EXPRESSINTBOX' => 'Priority Mail Express
International Flat Rate Boxes (International)',
			'FIRST CLASS' => 'First Class Mail',
			'FIRSTCLASSINT' => 'First Class Mail
(International)',
			'INTERNATIONAL' => 'Priority Mail International
(International)',
			'PRIORITYINTSMALL' => 'Priority Mail International
Small Flat Rate Box (International)',
			'PRIORITYINTDVD' => 'Priority Mail International DVD
Flat Rate priced box (International)',
			'PRIORITYINTLARGEVIDEO' => 'Priority Mail
International Large Video Flat Rate priced box (International)',
			'PRIORITYINTMEDIUM' => 'Priority Mail International
Medium Flat Rate Box (International)',
			'PRIORITYINTLARGE' => 'Priority Mail International
Large Flat Rate Box (International)',
			'ENVELOPE' => 'USPS GXG Envelopes
(International)',
			'RETAIL GROUND' => 'Retail Ground',
		)),
		'weight_approximation' => array('Weight approximation
(%)', 'input'),
		'dim_approximation' => array('Dimension approximation
(%)', 'input'),
		'machinableCheck' => array(
			'Machinable Shipments', 'checkbox', array(
				'MACHINABLE' => 'Are most of your packages <a
href="http://pe.usps.com/text/dmm300/101.htm">machinable</a>?',
			)
		),
		'sort_by_price' => array('Sort by shipping price',
'list',array(
			'NO' => 'No',
			'ASC' => 'Ascending',
			'DESC' => 'Descending',
		)),
		'with_dimension' => array('Use product dimension',
'boolean'),
		'firstclass_mail_type' => array('First class mail
type', 'list',array(
			'PARCEL' => 'Parcel',
			'LETTER' => 'Letter',
			'FLAT' => 'Flat',
			'POSTCARD' => 'Postcard',
			'PACKAGE SERVICE' => 'Package service',
		)),
		'container' => array('Container',
'list',array(
			'VARIABLE' => 'Variable',
			'FLAT RATE ENVELOPE' => 'Flat rate envelope',
			'PADDED FLAT RATE ENVELOPE' => 'Padded flat rate
envelope',
			'LEGAL FLAT RATE ENVELOPE' => 'Legal flat rate
envelope',
			'SM FLAT RATE ENVELOPE' => 'Small flat rate
envelope',
			'WINDOW FLAT RATE ENVELOPE' => 'Window flat rate
envelope',
			'GIFT CARD FLAT RATE ENVELOPE' => 'Gift cart flat rate
envelope',
			'FLAT RATE BOX' => 'Flat rate box',
			'SM FLAT RATE BOX' => 'Small flat rate box',
			'MD FLAT RATE BOX' => 'Medium flat rate box',
			'LG FLAT RATE BOX' => 'Large flat rate box',
			'RECTANGULAR' => 'Rectangular',
			'NONRECTANGULAR' => 'Non rectangular',
			'REGIONALRATEBOXA' => 'Regional box A',
			'REGIONALRATEBOXB' => 'Regional box B',
		))
		,'debug' => array('debug', 'boolean')
	);
	var $methods = array(
		'PRIORITY' => 1,
		'PRIORITYINTSMALL' => 2,
		'PRIORITYINTDVD' => 3,
		'PRIORITYINTLARGEVIDEO' => 4,
		'PRIORITYINTMEDIUM' => 5,
		'PRIORITYINTLARGE' => 6,
		'EXPRESS' => 7,
		'EXPRESSINT' => 8,
		'EXPRESSINTBOX' => 9,
		'FIRST CLASS' => 11,
		'FIRSTCLASSINT' => 12,
		'INTERNATIONAL' => 13,
		'ENVELOPE' => 14,
		'MEDIA' => 15,
		'RETAIL GROUND' => 16,
	);

	var $use_cache = true;

	function shippingMethods(&$main){
		$methods = array();
		if(empty($main->shipping_params->services))
			return $methods;

		foreach($main->shipping_params->services as $service) {
			$selected = null;
			foreach($this->methods as $name => $key) {
				if($name == $service) {
					$selected = array('name' =>
$this->pluginConfig['services'][2][$name], 'key'
=> $key);
					break;
				}
			}
			if($selected) {
				$methods[$main->shipping_id . '-' .
$selected['key']] = $selected['name'];
			}
		}
		return $methods;
	}

	function onShippingDisplay(&$order, &$dbrates, &$usable_rates,
&$messages) {
		if(empty($order->shipping_address))
			return false;

		if($this->loadShippingCache($order, $usable_rates, $messages))
			return true;

		$local_usable_rates = array();
		$local_messages = array();
		$ret = parent::onShippingDisplay($order, $dbrates, $local_usable_rates,
$local_messages);
		if($ret === false)
			return false;

		if(!function_exists('curl_init')) {
			$app = JFactory::getApplication();
			$app->enqueueMessage('The USPS shipping plugin needs the CURL
library installed but it seems that it is not available on your server.
Please contact your web hosting to set it up.','error');
			return false;
		}

		$cache_rates = array();
		$cache_messages = array();
		$found = false;

		$currentShippingZone = null;
		$currentCurrencyId = null;
		$currencyClass = hikashop_get('class.currency');
		foreach($local_usable_rates as $rate) {
			if($rate->shipping_type != 'usps')
				continue;

			$found = true;
			$zones = null;

			if(!empty($rate->shipping_zone_namekey)) {
				if(empty($zones)) {
					$zoneClass = hikashop_get('class.zone');
					$zones = $zoneClass->getOrderZones($order);
				}

				if(!in_array($rate->shipping_zone_namekey,$zones)) {
					$messages['no_shipping_to_your_zone'] =
JText::_('NO_SHIPPING_TO_YOUR_ZONE');
					continue;
				}
			}

			$check = false;
			if(empty($order->shipping_address->address_post_code)) {
				$check = true;
				$message = 'The USPS shipping plugin requires the user to enter a
postal code when goods are shipped within the United States. Please go to
"Display->Custom fields" and set the post code field to
required.';
			}
elseif(!preg_match('#^[0-9]{5}(-?[0-9]{4})?$#',$order->shipping_address->address_post_code))
{
				$check = true;
				$message = 'The post code entered is not valid';
			}

			if($check) {
				if(empty($zones)) {
					$zoneClass = hikashop_get('class.zone');
					$zones = $zoneClass->getOrderZones($order);
				}

				$db = JFactory::getDBO();
				$db->setQuery('SELECT zone_namekey FROM
'.hikashop_table('zone').' WHERE
zone_code_3='.$db->Quote('USA'));
				$usa_zone = $db->loadResult();
				if(in_array($usa_zone, $zones)) {
					$messages['post_code_missing'] = $message;
					continue;
				}
			}

			foreach($order->products as $product) {
				if (!empty($rate->shipping_params->weight_approximation)) {
					if (isset($product->product_weight)) $product->product_weight =
$product->product_weight + $product->product_weight *
$rate->shipping_params->weight_approximation / 100;
					if (isset($product->product_weight_orig))
$product->product_weight_orig = $product->product_weight_orig +
$product->product_weight_orig *
$rate->shipping_params->weight_approximation / 100;
				}
				if (!empty($rate->shipping_params->dim_approximation)) {
					if (isset($product->product_height)) $product->product_height =
$product->product_height + $product->product_height *
$rate->shipping_params->dim_approximation / 100;
					if (isset($product->product_length)) $product->product_length =
$product->product_length + $product->product_length *
$rate->shipping_params->dim_approximation / 100;
					if (isset($product->product_width)) $product->product_width =
$product->product_width + $product->product_width *
$rate->shipping_params->dim_approximation / 100;
					if (isset($product->product_total_volume))
$product->product_total_volume = $product->product_total_volume +
$product->product_total_volume *
$rate->shipping_params->dim_approximation / 100;
					if (isset($product->product_total_volume_orig))
$product->product_total_volume_orig =
$product->product_total_volume_orig +
$product->product_total_volume_orig *
$rate->shipping_params->dim_approximation / 100;
				}
				if (isset($product->variants)) {
					foreach($product->variants as $variant) {
						if (!empty($rate->shipping_params->weight_approximation)) {
							if (isset($variant->product_weight)) $variant->product_weight
= $variant->product_weight + $variant->product_weight *
$rate->shipping_params->weight_approximation / 100;
							if (isset($variant->product_weight_orig))
$variant->product_weight_orig = $variant->product_weight_orig +
$variant->product_weight_orig *
$rate->shipping_params->weight_approximation / 100;
						}
						if (!empty($rate->shipping_params->dim_approximation)) {
							if (isset($variant->product_height)) $variant->product_height
= $variant->product_height + $variant->product_height *
$rate->shipping_params->dim_approximation / 100;
							if (isset($variant->product_length)) $variant->product_length
= $variant->product_length + $variant->product_length *
$rate->shipping_params->dim_approximation / 100;
							if (isset($variant->product_width)) $variant->product_width =
$variant->product_width + $variant->product_width *
$rate->shipping_params->dim_approximation / 100;
							if (isset($variant->product_total_volume))
$variant->product_total_volume = $variant->product_total_volume +
$variant->product_total_volume *
$rate->shipping_params->dim_approximation / 100;
							if (isset($variant->product_total_volume_orig))
$variant->product_total_volume_orig =
$variant->product_total_volume_orig +
$variant->product_total_volume_orig *
$rate->shipping_params->dim_approximation / 100;
						}
					}
				}
			}

			if(!isset($rate->shipping_params->with_dimension))
				$rate->shipping_params->with_dimension = 1;
			if($rate->shipping_params->with_dimension)
				$required_dimensions =
array('w','x','y','z');
			else
				$required_dimensions = array('w');
			$limit = array();

			$envelope = array(
				'FLAT RATE ENVELOPE',
				'PADDED FLAT RATE ENVELOPE',
				'LEGAL FLAT RATE ENVELOPE',
				'SM FLAT RATE ENVELOPE',
				'WINDOW FLAT RATE ENVELOPE',
				'GIFT CARD FLAT RATE ENVELOPE'
			);
			$variable = array(
				'VARIABLE',
				'FLAT RATE BOX',
				'SM FLAT RATE BOX',
				'MD FLAT RATE BOX',
				'RECTANGULAR',
				'NONRECTANGULAR'
			);

			$country =
@$order->shipping_address_full->shipping_address->address_country->zone_code_2;
			if(empty($country))
				$country = 'US';
			if(in_array($rate->shipping_params->container, $variable)) {
				$limit['w'] = 1120;
				if($rate->shipping_params->with_dimension)
					$limit['length_girth'] = 108;
			} elseif(in_array($rate->shipping_params->container, $envelope))
{
				if($rate->shipping_params->with_dimension) {
					$limit = array(
						'x' => 0.75,
						'y' => 12,
						'z' => 15
					);
				} else
					$limit['unit'] = 1;
			} elseif($rate->shipping_params->container == 'LG FLAT RATE
BOX'){
				$limit['w'] = 1120;
				if($rate->shipping_params->with_dimension)
					$limit['length_girth'] = 130;
			} elseif($rate->shipping_params->container ==
'REGIONALRATEBOXA'){
				$limit = array(
					'x' => 4.75,
					'y' => 7,
					'z' => 10
				);
				if($country == 'US')
					$limit['w'] = 240;
				else
					$limit['w'] = 160;
			} elseif($rate->shipping_params->container ==
'REGIONALRATEBOXB'){
				$limit = array(
					'x' => 5,
					'y' => 10.25,
					'z' => 12
				);
				$limit['w'] = 320;
			} else
				$limit['unit'] = 1;

			$packages = $this->getOrderPackage($order,
array('weight_unit' => 'oz', 'volume_unit'
=> 'in', 'limit' => $limit,
'required_dimensions' => $required_dimensions));

			if(empty($packages))
				return true;

			$max_weight = 1120;
			$parcels = array();
			if(empty($order->shipping_address_full)) {
				$cart = hikashop_get('class.cart');
				if(isset($order->shipping_address->address_id))
					$cart->loadAddress($order->shipping_address_full,
$order->shipping_address->address_id, 'object',
'shipping');
			}

			if(isset($packages['w']) && $packages['w']
> 0){
				if($packages['w'] > $max_weight) {
					$messages['items_weight_over_limit'] =
JText::_('ITEMS_WEIGHT_TOO_BIG_FOR_SHIPPING_METHODS');
					$cache_messages['items_weight_over_limit'] =
JText::_('ITEMS_WEIGHT_TOO_BIG_FOR_SHIPPING_METHODS');
					$this->setShippingCache($order, null, $cache_messages);
					return true;
				}

				if($packages['w'] < 1)
					$packages['w'] = 1; // Minimum 1oz
				$parcel = new stdClass();
				$parcel->Country =
@$order->shipping_address_full->shipping_address->address_country->zone_code_2;
				if(empty($parcel->Country))
					$parcel->Country = 'US';
				$parcel->Pickup_Postcode =
substr(preg_replace('#[^a-z0-9]#i', '',
@$rate->shipping_params->post_code), 0, 5);
				$parcel->Destination_Postcode =
substr(preg_replace('#[^a-z0-9]#i', '',
$order->shipping_address->address_post_code), 0, 5);

				if($rate->shipping_params->with_dimension == 1){
					$girth = array($packages['y'], $packages['x'],
$packages['z']);
					sort($girth);

					$parcel->Length = $girth[2];
					$parcel->Width = $girth[1];
					$parcel->Height = $girth[0];
					$parcel->Girth = (($parcel->Height + $parcel->Width) * 2) +
$parcel->Length;
				} else {
					$parcel->Length = '';
					$parcel->Width = '';
					$parcel->Height = '';
					$parcel->Girth = '';
				}

				$parcel->Quantity = 1;
				$parcel->Weight = round($packages['w'], 2);
				$parcels[] = $parcel;
			}else{
				foreach($packages as $package){
					if((!isset($package['w']) || $package['w'] <=
0))
						continue;

					if($package['w'] > $max_weight) {
						$messages['items_weight_over_limit'] =
JText::_('ITEMS_WEIGHT_TOO_BIG_FOR_SHIPPING_METHODS');
						$cache_messages['items_weight_over_limit'] =
JText::_('ITEMS_WEIGHT_TOO_BIG_FOR_SHIPPING_METHODS');
						$this->setShippingCache($order, null, $cache_messages);
						return true;
					}

					if($package['w'] < 1)
						$package['w'] = 1; // Minimum 1oz
					$parcel = new stdClass();
					$parcel->Country =
@$order->shipping_address_full->shipping_address->address_country->zone_code_2;
					if(empty($parcel->Country))
						$parcel->Country = 'US';
					$parcel->Pickup_Postcode =
substr(preg_replace('#[^a-z0-9]#i', '',
@$rate->shipping_params->post_code), 0, 5);
					$parcel->Destination_Postcode =
substr(preg_replace('#[^a-z0-9]#i', '',
$order->shipping_address->address_post_code), 0, 5);

					if($rate->shipping_params->with_dimension == 1){
						$girth = array($package['y'], $package['x'],
$package['z']);
						sort($girth);

						$parcel->Length = $girth[2];
						$parcel->Width = $girth[1];
						$parcel->Height = $girth[0];
						$parcel->Girth = (($parcel->Height + $parcel->Width) * 2) +
$parcel->Length;
					} else {
						$parcel->Length = '';
						$parcel->Width = '';
						$parcel->Height = '';
						$parcel->Girth = '';
					}

					$parcel->Quantity = 1;
					$parcel->Weight = round($package['w'], 2);
					$parcels[] = $parcel;
				}
			}

			$query = 'SELECT currency_id FROM
'.hikashop_table('currency').' WHERE
currency_code=\'USD\'';
			$db = JFactory::getDBO();
			$db->setQuery($query);
			$currency = $db->loadResult();

			$rates = array();
			if($parcels[0]->Country == 'US') {
				$modes = array('PRIORITY', 'MEDIA',
'EXPRESS', 'FIRST CLASS', 'RETAIL GROUND');
				foreach($modes as $mode) {
					if(!empty($rate->shipping_params->$mode))
						$this->addRate($rates, $mode, $parcels, $rate, $currency, false);
				}
			} else {
				$modes = array('INTERNATIONAL', 'PRIORITYINTSMALL',
'PRIORITYINTDVD', 'PRIORITYINTLARGEVIDEO',
'PRIORITYINTMEDIUM', 'PRIORITYINTLARGE',
'EXPRESSINTBOX', 'EXPRESSINT',
'FIRSTCLASSINT', 'ENVELOPE');
				foreach($modes as $mode) {
					if(!empty($rate->shipping_params->$mode))
						$this->addRate($rates, $mode, $parcels, $rate, $currency, true);
				}
			}

			if($rate->shipping_params->sort_by_price == 'DESC')
				$rates = $this->array_sort($rates, 'shipping_price',
'usps', SORT_DESC);
			else if($rate->shipping_params->sort_by_price == 'ASC')
				$rates = $this->array_sort($rates, 'shipping_price',
'usps', SORT_ASC);

			$i = 0;

			if(empty($rates)) {
				$messages['no_shipping_quotes'] = 'Failed to obtain
shipping quotes.';
				$cache_messages['no_shipping_quotes'] = 'Failed to
obtain shipping quotes.';
				continue;
			}

			foreach($rates as $finalRate) {
				if(isset($finalRate->shipping_price_orig) ||
isset($finalRate->shipping_currency_id_orig)){
					if($finalRate->shipping_currency_id_orig ==
$finalRate->shipping_currency_id)
						$finalRate->shipping_price_orig = $finalRate->shipping_price;
					else
						$finalRate->shipping_price_orig =
$currencyClass->convertUniquePrice($finalRate->shipping_price,
$finalRate->shipping_currency_id,
$finalRate->shipping_currency_id_orig);
				}

				$finalRate->shipping_ordering .= '_' . $i++;
				$usable_rates[$finalRate->shipping_id] = $finalRate;
				$cache_rates[$finalRate->shipping_id] = $finalRate;
			}
		}

		if(!$found) {
			$messages['no_rates'] =
JText::_('NO_SHIPPING_METHOD_FOUND');
			$cache_messages['no_rates'] =
JText::_('NO_SHIPPING_METHOD_FOUND');
		}

		$this->setShippingCache($order, $cache_rates, $cache_messages);

		return true;
	}

	function addRate(&$rates, $type, $parcels, &$rate, $currency,
$isInternational) {
		$app = JFactory::getApplication();
		$usps_user_id = $rate->shipping_params->usps_user_id;

		$origin_zip = $parcels[0]->Pickup_Postcode;
		$destination_zip = $parcels[0]->Destination_Postcode;
		$this->countries = $this->USPS_country_list();
		$destination_country = $this->countries[$parcels[0]->Country];
		$machinable = 'false';
		$package_id = 1; //will change this when setting up for multiple
packages.

		if (isset($rate->shipping_params->MACHINABLE)) {
			$machinable = "true";
		}

		if($isInternational) {
			$request = '<'.'?xml
version="1.0"?'.'>'.
				'<IntlRateV2Request USERID="' . $usps_user_id .
'">';

			if($parcels[0]->Country == 'CA')
				$request .= '<Revision>2</Revision>';
			else
				$request .= '<Revision />';

			foreach($parcels as $parcel){
				$package_weight_arr =
$this->getUSPSweightDimensions($parcel->Weight);
				$package_weight_lb = $package_weight_arr['Pounds'];
				$package_weight_oz = $package_weight_arr['Ounces'];
				$package_weight_oz = round($package_weight_oz,2);

				$request .=	'<Package ID="' . $package_id .
'">'.
					'<Pounds>' . $package_weight_lb .
'</Pounds>'.
					'<Ounces>' . $package_weight_oz .
'</Ounces>'.
					'<Machinable>' . $machinable .
'</Machinable>'.
					'<MailType>Package</MailType>'.
					'<ValueOfContents>100</ValueOfContents>'.
					'<Country>' . $destination_country .
'</Country>'.
					'<Container>' .
$rate->shipping_params->container . '</Container>'.
					'<Size>Regular</Size>'.
					'<Width>'.$parcel->Width.'</Width>'.
					'<Length>'.$parcel->Length.'</Length>'.
					'<Height>'.$parcel->Height.'</Height>'.
					'<Girth>'.$parcel->Girth.'</Girth>';

				if($parcels[0]->Country == 'CA')
					$request .= '<OriginZip>' . $origin_zip .
'</OriginZip>';

				$request .=	'</Package>';
				$package_id++;
			}

			$request .= '</IntlRateV2Request>';
		}
		else {
			$request = '<'.'?xml
version="1.0"?'.'>'.
				'<RateV4Request USERID="' . $usps_user_id .
'">'.
				'<Revision />';

			foreach($parcels as $parcel){
				if($parcel->Weight > 13 && $type =='FIRST
CLASS' &&
isset($rate->shipping_params->firstclass_mail_type) &&
$rate->shipping_params->firstclass_mail_type == 'PARCEL')
					return;

				$request.='<Package ID="' . $package_id .
'">'.
					'<Service>' . $type . '</Service>';

				if($type =='FIRST CLASS'){
					if(!empty($rate->shipping_params->firstclass_mail_type)){
						$request .= '<FirstClassMailType>' .
$rate->shipping_params->firstclass_mail_type .
'</FirstClassMailType>';
					}
					else{
						$request .=
'<FirstClassMailType>Parcel</FirstClassMailType>';
					}
				}
				$package_weight_arr =
$this->getUSPSweightDimensions($parcel->Weight);
				$package_weight_lb = $package_weight_arr['Pounds'];
				$package_weight_oz = $package_weight_arr['Ounces'];
				$package_weight_oz = round($package_weight_oz,2);
				$request .= '<ZipOrigination>' . $origin_zip .
'</ZipOrigination>'.
					'<ZipDestination>' . $destination_zip .
'</ZipDestination>'.
					'<Pounds>' . $package_weight_lb .
'</Pounds>'.
					'<Ounces>' . $package_weight_oz .
'</Ounces>'.
					'<Container>' .
$rate->shipping_params->container . '</Container>'.
					'<Size>Regular</Size>'.
					'<Width>'.$parcel->Width.'</Width>'.
					'<Length>'.$parcel->Length.'</Length>'.
					'<Height>'.$parcel->Height.'</Height>'.
					'<Girth>'.$parcel->Girth.'</Girth>'.
					'<Machinable>' . $machinable .
'</Machinable>'.
					'</Package>';
				$package_id++;
			}
			$request.='</RateV4Request>';
		}

		$ctrl = hikaInput::get()->getString('ctrl','');
		if(!empty($rate->shipping_params->debug) && $ctrl ==
'checkout')
			echo '<!--' . "\r\n" . 'USPS DEBUG' .
"\r\n" . $request . "\r\n" . '-->';

		$responseError = false;
		$response_xml = $this->doUSPS($request, !$isInternational);

		if(!$response_xml)
			return false;

		if($response_xml->Number) {
			if(!empty($rate->shipping_params->debug) && $ctrl ==
'checkout')
				$app->enqueueMessage( 'USPS error: ' .
$response_xml->Number . ' ' . $response_xml->Description);
			$responseError = true;
		}

		if($response_xml->Package->Error) {
			if(!empty($rate->shipping_params->debug) && $ctrl ==
'checkout')
				$app->enqueueMessage( 'USPS error: ' .
$response_xml->Package->Error->Number . ' ' .
$response_xml->Package->Error->Description);
			$responseError = true;
		}

		if($isInternational) {
			$rateResult = $response_xml->xpath('Package/Service');
			$usps_rate_arr = $this->xml2array($rateResult);

			$decoding = array(
				2 => 'INTERNATIONAL',
				16 => 'PRIORITYINTSMALL',
				24 => 'PRIORITYINTDVD',
				25 => 'PRIORITYINTLARGEVIDEO',
				9 => 'PRIORITYINTMEDIUM',
				11 => 'PRIORITYINTLARGE',
				15 => 'FIRSTCLASSINT',
				16 => 'PRIORITYINTSMALL',
				24 => 'PRIORITYINTDVD',
				25 => 'PRIORITYINTLARGEVIDEO',
				9 => 'PRIORITYINTMEDIUM',
				11 => 'PRIORITYINTLARGE',
				26 => 'EXPRESSINTBOX',
				1 => 'EXPRESSINT',
				12 => 'ENVELOPE'
			);

			$usps_rates = array();
			foreach($usps_rate_arr as $k) {
				$id = (int)$k['@attributes']['ID'];
				if(isset($decoding[$id]) && strcmp($type, $decoding[$id]) == 0)
{
					if(isset($k['ServiceErrors']) || $k['Postage'] ==
0)
						continue;

					$usps_rates[] = array(
						'Service' =>
html_entity_decode($k['SvcDescription']),
						'Rate' => $k['Postage']
					);
				}
			}
		} else {
			$rateResult = $response_xml->xpath('Package/Postage');
			$usps_rate_arr = $this->xml2array($rateResult);

			$usps_rates = array();
			foreach($usps_rate_arr as $k => $v) {
				$usps_rates[] = array(
					'Service' =>
html_entity_decode($v['MailService']),
					'Rate' => $v['Rate']
				);
			}

			if(empty($usps_rates)) {
				$responseError = true;
			}
		}

		if($responseError == false && !empty($usps_rates)) {
			if(empty($rates[$type])) {
				$info = new stdClass();
				$info = clone($rate);

				$typeKey = str_replace(' ','_', $type);
				$shipping_name = JText::_($typeKey);

				if($shipping_name != $typeKey)
					$info->shipping_name = $shipping_name;
				else
				$info->shipping_name = preg_replace('#sup.*?sup#',
'', $info->shipping_name.' : '.
$this->pluginConfig['services'][2][$type]);

				$shipping_description = JText::_($type.'_DESCRIPTION');
				if($shipping_description != $type.'_DESCRIPTION') {
					$info->shipping_description .= $shipping_description;
				}
				$info->shipping_id .= '-'.$this->methods[$type];
				$rates[$type] = $info;
			}

			$currencyClass = hikashop_get('class.currency');

			foreach($usps_rates as $usps_rate){
				if(!isset($usps_rate['Rate']))
					continue;
				if(isset($currency) && $currency !=
$rates[$type]->shipping_currency_id)
					$rates[$type]->shipping_price +=
$currencyClass->convertUniquePrice($usps_rate['Rate'],
$currency, $rates[$type]->shipping_currency_id);
				else
					$rates[$type]->shipping_price += $usps_rate['Rate'];

			}
		}
	}

	function getShippingDefaultValues(&$element){
		$element->shipping_name='United States Postal Service';
		$element->shipping_description='';
		$element->shipping_images='usps';
		$element->shipping_params->PRIORITY='Priority Mail';
		$element->shipping_params->MEDIA='Media Mail';
		$element->shipping_params->EXPRESS='Express Mail';
		$FIRSTCLASS = 'FIRST CLASS';
		$element->shipping_params->$FIRSTCLASS='First Class
Mail';
		$element->shipping_params->INTERNATIONAL='Priority Mail
International (International)';
		$element->shipping_params->PRIORITYINTSMALL='Priority Mail
International Small Flat Rate Box (International)';
		$element->shipping_params->PRIORITYINTDVD='Priority Mail
International DVD Flat Rate priced box (International)';
		$element->shipping_params->PRIORITYINTLARGEVIDEO='Priority
Mail International Large Video Flat Rate priced box (International)';
		$element->shipping_params->PRIORITYINTMEDIUM='Priority Mail
International Medium Flat Rate Box (International)';
		$element->shipping_params->PRIORITYINTLARGE='Priority Mail
International Large Flat Rate Box (International)';
		$element->shipping_params->EXPRESSINTBOX='Express Mail
International Flat Rate Boxes (International)';
		$element->shipping_params->EXPRESSINT='Express Mail
International (International)';
		$element->shipping_params->FIRSTCLASSINT='First Class Mail
(International)';
		$element->shipping_params->ENVELOPE='USPS GXG Envelopes
(International)';
		$element->shipping_params->post_code='';
		$element->shipping_params->firstclass_mail_type='PARCEL';
		$element->shipping_params->container='RECTANGULAR';
		$element->shipping_params->MACHINABLE=true;
	}

	function onShippingConfiguration(&$element){
		$config = &hikashop_config();
		$this->usps =
hikaInput::get()->getCmd('name','usps');
		$this->main_currency = $config->get('main_currency', 1);

		$currencyClass = hikashop_get('class.currency');
		$currency = $currencyClass->get($this->main_currency);
		$this->currencyCode = $currency->currency_code;
		$this->currencySymbol = $currency->currency_symbol;

		$this->categoryType = hikashop_get('type.categorysub');
		$this->categoryType->type = 'tax';
		$this->categoryType->field = 'category_id';

		parent::onShippingConfiguration($element);
		$elements = array($element);
	}

	function onShippingConfigurationSave(&$element) {
		$app = JFactory::getApplication();
		if(empty($element->shipping_params->usps_user_id)){
			$app->enqueueMessage(JText::sprintf('ENTER_INFO',
'USPS', ' WebTools User ID'));
		}
		if(empty($element->shipping_params->post_code)){
			$app->enqueueMessage(JText::sprintf('ENTER_INFO',
'USPS', JText::_('POST_CODE')));
		}

		if(isset($element->shipping_params->services) &&
!empty($element->shipping_params->services)){
			$element->shipping_params->PRIORITY=in_array('PRIORITY',$element->shipping_params->services);
			$element->shipping_params->MEDIA=in_array('MEDIA',$element->shipping_params->services);
			$element->shipping_params->EXPRESS=in_array('EXPRESS',$element->shipping_params->services);
			$FIRSTCLASS = 'FIRST CLASS';
			$element->shipping_params->$FIRSTCLASS=in_array('FIRST
CLASS',$element->shipping_params->services);
			$RETAILGROUND = 'RETAIL GROUND';
			$element->shipping_params->$RETAILGROUND=in_array('RETAIL
GROUND',$element->shipping_params->services);
			$element->shipping_params->INTERNATIONAL=in_array('INTERNATIONAL',$element->shipping_params->services);
			$element->shipping_params->PRIORITYINTSMALL=in_array('PRIORITYINTSMALL',$element->shipping_params->services);
			$element->shipping_params->PRIORITYINTDVD=in_array('PRIORITYINTDVD',$element->shipping_params->services);
			$element->shipping_params->PRIORITYINTLARGEVIDEO=in_array('PRIORITYINTLARGEVIDEO',$element->shipping_params->services);
			$element->shipping_params->PRIORITYINTMEDIUM=in_array('PRIORITYINTMEDIUM',$element->shipping_params->services);
			$element->shipping_params->PRIORITYINTLARGE=in_array('PRIORITYINTLARGE',$element->shipping_params->services);
			$element->shipping_params->EXPRESSINTBOX=in_array('EXPRESSINTBOX',$element->shipping_params->services);
			$element->shipping_params->EXPRESSINT=in_array('EXPRESSINT',$element->shipping_params->services);
			$element->shipping_params->FIRSTCLASSINT=in_array('FIRSTCLASSINT',$element->shipping_params->services);
			$element->shipping_params->ENVELOPE=in_array('ENVELOPE',$element->shipping_params->services);
		}else {
			$app->enqueueMessage(JText::sprintf('CHOOSE_SHIPPING_SERVICE'));
		}
		if(!empty($element->shipping_params->machinableCheck))
			$element->shipping_params->MACHINABLE =
in_array('MACHINABLE',$element->shipping_params->machinableCheck);
		parent::onShippingConfigurationSave($element);
	}

	function onAfterOrderConfirm(&$order, &$methods, $method_id) {
		return true;
	}

	function doUSPS($XMLRequest, $domesticShipment) {
		$apiName = 'RateV4';

		if($domesticShipment == false)
			$apiName = 'IntlRateV2';

		$url =
'http://production.shippingapis.com/ShippingAPI.dll?API=' .
$apiName . '&XML=' . urlencode($XMLRequest);

		$session = curl_init();
		curl_setopt($session, CURLOPT_FRESH_CONNECT,  true);
		curl_setopt($session, CURLOPT_POST,           false);
		curl_setopt($session, CURLOPT_FOLLOWLOCATION, false);
		curl_setopt($session, CURLOPT_FAILONERROR,    true);
		curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($session, CURLOPT_COOKIEFILE,     '');
		curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false);
		curl_setopt($session, CURLOPT_ENCODING,       'UTF-8');
		curl_setopt($session, CURLOPT_URL,            $url);
		$result = curl_exec($session);
		$error = curl_error($session);

		if(empty($result)) {
			$app = JFactory::getApplication();
			$app->enqueueMessage( 'Cannot connect to USPS web service. You
hosting company might be blocking outbound
connections.<br/>'.$error);
			return false;
		}

		$responseDoc = simplexml_load_string($result);
		if($responseDoc === false) {
			$app = JFactory::getApplication();
			$app->enqueueMessage('Cannot dialog with USPS web
service.<br/>'.$result);
			return false;
		}
		return $responseDoc;
	}

	function processPackageLimit($limit_key, $limit_value, $product, $qty,
$package, $units) {
		switch($limit_key) {
			case 'length_girth':
				$divide = $product['z'] + ($product['x'] +
$product['y']) * 2;
				if(!$divide || $divide > $limit_value)
					return false;
				$current_limit_value = max(0.0, $limit_value -
(float)(($package['x'] + $package['y']) * 2 +
$package['z']));
				return (int)floor($current_limit_value / $divide);
				break;
		}
		return parent::processPackageLimit($limit_key, $limit_value , $product,
$qty, $package, $units);
	}

	function getResponseXML($httpResponse) {
		$lines = preg_split('/(\r\n|\r|\n)/', $httpResponse);
		$responseBody = '';
		$lineCount = count($lines);
		for($i = 0; $i < $lineCount; $i++) {
			if($lines[$i] == '')
				break;
		}

		for($j = $i + 1; $j < $lineCount; $j++) {
			$responseBody .= $lines[$j] . "\n";
		}
		return $responseBody;
	}

	function getUSPSweightDimensions($ounces) {
		if($ounces < 16)
			return array('Pounds' => 0, 'Ounces' =>
$ounces);
		$pounds = floor($ounces / 16);
		$ounces =  fmod($ounces, $pounds * 16);
		return array('Pounds' => $pounds, 'Ounces' =>
$ounces);
	}

	function USPS_Country_List() {
		return array(
'AF' => 'Afghanistan', 'AL' =>
'Albania', 'AX' => 'Aland Island
(Finland)', 'DZ' => 'Algeria', 'AD'
=> 'Andorra', 'AO' => 'Angola',
'AI' => 'Anguilla', 'AG' =>
'Antigua and Barbuda',
'AR' => 'Argentina', 'AM' =>
'Armenia', 'AW' => 'Aruba', 'AU'
=> 'Australia', 'AT' => 'Austria',
'AZ' => 'Azerbaijan', 'BC' =>
'Canada', '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, Republic of the', 'CD'
=> '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',
'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', 'FX' => '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', 'FM' =>
'Micronesia, Federated States of', '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', 'RS' =>
'Serbia', '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',
'TL' => 'East Timor (Indonesia)', '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', 'US' => 'United States',
'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'
		);
	}

	function xml2array( $xmlObject, $out = array())
	{
		foreach( (array) $xmlObject as $index => $node)
			$out[$index] = ( is_object ( $node ) ) ? $this->xml2array ( $node ) :
$node;
		return $out;
	}

	function array_sort($array, $on, $type, $order = SORT_ASC)
	{
		if(empty($array))
			return array();

		$new_array = array();
		$sortable_array = array();
		foreach ($array as $key => $value) {
			if($value->shipping_type == $type)
				$sortable_array[$key] = $value->shipping_price;
		}

		switch ($order) {
			case SORT_ASC:
				asort($sortable_array);
			break;
			case SORT_DESC:
				arsort($sortable_array);
			break;
		}

		foreach ($sortable_array as $k => $v) {
			$new_array[$k] = $array[$k];
		}
		return $new_array;
	}
}
usps.xml000064400000002225151161642360006266 0ustar00<?xml
version="1.0" encoding="utf-8"?>
<extension type="plugin" version="2.5"
method="upgrade" group="hikashopshipping">
	<name>Hikashop USPS Shipping Plugin</name>
	<creationDate>12 février 2021</creationDate>
	<version>4.4.1</version>
	<author>Jeff Johnson</author>
	<authorEmail>jeffcj@gmail.com</authorEmail>
	<authorUrl>http://www.ututech.com</authorUrl>
	<copyright>Copyright (C) 2011 Jeff Johnson - All rights
reserved.</copyright>
	<license>http://www.gnu.org/licenses/gpl-2.0.html
GNU/GPL</license>
	<description>This plugin enables you to setup handle United States
Postal Service Rate Quotes</description>
	<files>
		<filename plugin="usps">usps.php</filename>
	</files>
	<params addpath="/components/com_hikashop/params">
		<param name="pluginoptions" type="pluginoptions"
default="plugin" label="hikashop"
description="HikaShop options" />
	</params>
	<config>
		<fields name="params"
addfieldpath="/components/com_hikashop/fields">
			<fieldset name="basic">
				<field id="pluginoptions" name="pluginoptions"
type="pluginoptions" label="hikashop"
description="HikaShop options" />
			</fieldset>
		</fields>
	</config>
</extension>