public function run()
 {
     $unit = 1;
     $country = $this->CheckoutForm->shippingCountryCode;
     $state = $this->CheckoutForm->shippingStateCode;
     $zipcode = $this->CheckoutForm->shippingPostal;
     // We can't do a lookup if the country is blank
     if (empty($country)) {
         Yii::log('DESTINATION TABLE: insufficient details for destination shipping. Shipping Country is blank.', 'info', 'application.' . __CLASS__ . '.' . __FUNCTION__);
         return false;
     }
     Yii::log("DESTINATION TABLE: searching for {$country}/{$state}/{$zipcode}", 'info', 'application.' . __CLASS__ . "." . __FUNCTION__);
     if (!isset($this->config['per'])) {
         Yii::log("DESTINATION TABLE: could not get destination shipping unit.", 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
         return false;
     }
     // Get the best matching destination
     $model = Destination::LoadMatching($country, $state, $zipcode);
     if ($model === null) {
         Yii::log("DESTINATION TABLE: No matching entry found for {$country} {$state} {$zipcode} .", 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
         return false;
     }
     if ($this->config['per'] == 'item') {
         $unit = $this->objCart->TotalItemCount;
     } elseif ($this->config['per'] == 'weight') {
         $unit = $this->objCart->Weight;
     } elseif ($this->config['per'] == 'volume') {
         $unit = $this->objCart->Length * $this->objCart->Width * $this->objCart->Height;
     }
     if ($unit >= $model->ship_free) {
         $unit -= $model->ship_free;
     }
     if ($unit < 0) {
         $unit = 0;
     }
     // If the Base Charge is unset or lesser than 0, don't apply this module
     if ($model->base_charge == '' || $model->base_charge == null) {
         $label = Country::CodeById($model->country) . "/" . State::CodeById($model->state);
         Yii::log("DESTINATION TABLE: Base charge not set for entry '" . $label . "'", 'error', 'application.' . __CLASS__ . "." . __FUNCTION__);
         return false;
     }
     $desc = isset($this->config['offerservices']) ? $this->config['offerservices'] : Yii::t('global', 'Standard 3-5 Business Days');
     $ret[$desc] = $model->base_charge + $unit * $model->ship_rate;
     return $this->convertRetToDisplay($ret);
 }
Ejemplo n.º 2
0
 /**
  * Based on passed address information, calculates the total shipping cost
  *
  * @param $fields
  * @param $cart
  * @param string $country
  * @param string $zipcode
  * @param string $state
  * @param string $city
  * @param string $address2
  * @param string $address1
  * @param string $company
  * @param string $lname
  * @param string $fname
  * @return array|bool
  */
 public function total($fields, $cart, $country = '', $zipcode = '', $state = '', $city = '', $address2 = '', $address1 = '', $company = '', $lname = '', $fname = '')
 {
     $config = $this->getConfigValues(get_class($this));
     $weight = $cart->Weight;
     if (_xls_get_conf('WEIGHT_UNIT', 'lb') != 'lb') {
         $weight = $weight * 2.2;
     }
     // one KG is 2.2 pounds
     $length = $cart->Length;
     $width = $cart->Width;
     $height = $cart->Height;
     if (_xls_get_conf('DIMENSION_UNIT', 'in') != 'in') {
         $length = round($length / 2.54);
         $width = round($width / 2.54);
         $height = round($height / 2.54);
     }
     if ($length < 1 && $length > 0) {
         $length = 1;
     }
     if ($width < 1 && $width > 0) {
         $width = 1;
     }
     if ($height < 1 && $height > 0) {
         $height = 1;
     }
     if (empty($config['securitycode']) || empty($config['accnumber']) || empty($config['meternumber'])) {
         return FALSE;
     }
     $ret = array();
     $newline = "<br />";
     //The WSDL is not included with the sample code.
     //Please include and reference in $path_to_wsdl variable.
     $path_to_wsdl = dirname(__FILE__) . "/RateService_v7.wsdl";
     ini_set("soap.wsdl_cache_enabled", "0");
     $client = new SoapClient($path_to_wsdl, array('trace' => 1));
     $request['WebAuthenticationDetail'] = array('UserCredential' => array('Key' => $config['authkey'], 'Password' => $config['securitycode']));
     $request['ClientDetail'] = array('AccountNumber' => $config['accnumber'], 'MeterNumber' => $config['meternumber']);
     $request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Rate Request v7 using PHP ***');
     $request['Version'] = array('ServiceId' => 'crs', 'Major' => '7', 'Intermediate' => '0', 'Minor' => '0');
     $request['ReturnTransitAndCommit'] = true;
     $request['RequestedShipment']['DropoffType'] = 'REGULAR_PICKUP';
     // valid values REGULAR_PICKUP, REQUEST_COURIER, ...
     $request['RequestedShipment']['ShipTimestamp'] = date('c');
     //Uncomment these additional options below if they are needed for your shipments
     //$request['RequestedShipment']['SpecialServicesRequested'] = array( 'SpecialServiceTypes' => array('SIGNATURE_OPTION'), 'SignatureOptionDetail' => array('OptionType' => 'ADULT'));
     //$request['RequestedShipment']['SignatureOptionDetail']['OptionType'] = 'ADULT';
     //$request['RequestedShipment']['ServiceType'] = 'PRIORITY_OVERNIGHT'; // valid values STANDARD_OVERNIGHT, PRIORITY_OVERNIGHT, FEDEX_GROUND, ...
     $config['origincountry'] = Country::CodeById($config['origincountry']);
     $config['originstate'] = State::CodeById($config['originstate']);
     if ($config['origincountry'] != "CA" && $config['origincountry'] != "US") {
         //Only required for these countries
         $config['originstate'] = "";
     }
     $request['RequestedShipment']['PackagingType'] = $config['packaging'];
     $request['RequestedShipment']['Shipper'] = array('Address' => array('StreetLines' => array($config['originadde']), 'City' => $config['origincity'], 'StateOrProvinceCode' => $config['originstate'], 'PostalCode' => $config['originpostcode'], 'CountryCode' => $config['origincountry']));
     if ($country != "CA" && $country != "US") {
         //Only required for these countries
         $state = "";
     }
     $request['RequestedShipment']['Recipient'] = array('Address' => array('StreetLines' => array($address1, $address2), 'City' => $city, 'StateOrProvinceCode' => $state, 'PostalCode' => $zipcode, 'CountryCode' => $country, 'Residential' => $this->CheckoutForm->shippingResidential == 1 ? 1 : 0));
     $request['RequestedShipment']['ShippingChargesPayment'] = array('PaymentType' => 'SENDER', 'Payor' => array('AccountNumber' => $config['accnumber'], 'CountryCode' => $config['origincountry']));
     $request['RequestedShipment']['RateRequestTypes'] = 'ACCOUNT';
     $request['RequestedShipment']['RateRequestTypes'] = 'LIST';
     if ($config['origincountry'] != $country && $config['customs'] == "CLEARANCEFEE") {
         $request['RequestedShipment']['InternationalDetail'] = array('CustomsValue' => array('Amount' => $cart->subtotal, 'Currency' => _xls_get_conf('CURRENCY_DEFAULT', 'USD')));
     }
     $request['RequestedShipment']['PackageCount'] = '1';
     $request['RateRequest']['CurrencyType'] = _xls_get_conf('CURRENCY_DEFAULT', 'USD');
     $request['RequestedShipment']['PackageDetail'] = 'INDIVIDUAL_PACKAGES';
     if ($length + $width + $height == 0) {
         $request['RequestedShipment']['RequestedPackageLineItems'] = array('0' => array('SequenceNumber' => '1', 'InsuredValue' => array('Amount' => $cart->subtotal, 'Currency' => _xls_get_conf('CURRENCY_DEFAULT', 'USD')), 'ItemDescription' => 'Ordered items', 'Weight' => array('Value' => $weight, 'Units' => 'LB'), 'CustomerReferences' => array('CustomerReferenceType' => 'CUSTOMER_REFERENCE', 'Value' => _xls_get_conf('STORE_NAME', 'Web Order'))));
     } else {
         $request['RequestedShipment']['RequestedPackageLineItems'] = array('0' => array('SequenceNumber' => '1', 'InsuredValue' => array('Amount' => $cart->subtotal, 'Currency' => _xls_get_conf('CURRENCY_DEFAULT', 'USD')), 'ItemDescription' => 'Ordered items', 'Weight' => array('Value' => $weight, 'Units' => 'LB'), 'Dimensions' => array('Length' => $length, 'Width' => $width, 'Height' => $height, 'Units' => 'IN'), 'CustomerReferences' => array('CustomerReferenceType' => 'CUSTOMER_REFERENCE', 'Value' => _xls_get_conf('STORE_NAME', 'Web Order'))));
     }
     try {
         $response = $client->getRates($request);
         Yii::log(get_class($this) . " sending " . print_r($request, true), $this->logLevel, 'application.' . __CLASS__ . "." . __FUNCTION__);
         Yii::log(get_class($this) . " receiving " . print_r($response, true), $this->logLevel, 'application.' . __CLASS__ . "." . __FUNCTION__);
         if ($response->HighestSeverity != 'FAILURE' && $response->HighestSeverity != 'ERROR') {
             if (isset($response->RateReplyDetails)) {
                 if (is_array($response->RateReplyDetails) === false) {
                     $response->RateReplyDetails = array($response->RateReplyDetails);
                 }
                 foreach ($response->RateReplyDetails as $rateReply) {
                     if (isset($rateReply->RatedShipmentDetails)) {
                         foreach ($rateReply->RatedShipmentDetails as $choice) {
                             if ($choice->ShipmentRateDetail->RateType == $config['ratetype']) {
                                 $ret[$rateReply->ServiceType] = $choice->ShipmentRateDetail->TotalNetCharge->Amount;
                             } elseif ($rateReply->ServiceType == "FEDEX_GROUND" || $rateReply->ServiceType == "GROUND_HOME_DELIVERY") {
                                 $ret[$rateReply->ServiceType] = $rateReply->RatedShipmentDetails[1]->ShipmentRateDetail->TotalNetCharge->Amount;
                             }
                         }
                     }
                 }
             }
         }
     } catch (SoapFault $exception) {
         _xls_log("FedEx Soap Fault : " . $exception . " ");
         $response = $exception;
     }
     if (count($ret) <= 0) {
         _xls_log("FedEx could not get rate for {$country}, {$state}, {$zipcode} .  ");
         _xls_log("FedEx request: " . print_r($request, true));
         _xls_log("FedEx Response: " . print_r($response, true));
         return false;
     }
     asort($ret);
     Yii::log(get_class($this) . " received shipping array " . print_r($ret, true), $this->logLevel, 'application.' . __CLASS__ . "." . __FUNCTION__);
     return $this->convertRetToDisplay($ret);
 }
Ejemplo n.º 3
0
 /**
  * For a product, returns tax rate for all defined destinations
  * Useful for RSS exports
  * @return TaxGrid[]
  */
 public function GetTaxRateGrid()
 {
     $arrGrid = array();
     $intTaxStatus = $this->tax_status_id;
     $objStatus = TaxStatus::LoadByLS($intTaxStatus);
     $objDestinations = Destination::model()->findAll();
     foreach ($objDestinations as $objDestination) {
         //Because of differences in how Google defines zip code ranges, we can't convert our ranges
         //to theirs. At this time we won't be able to support zip code ranges
         if (!is_null($objDestination->country) && $objDestination->Zipcode1 == '') {
             $objTaxCode = TaxCode::LoadByLS($objDestination->taxcode);
             //print_r($objTaxCode);
             $fltRate = 0.0;
             for ($x = 1; $x <= 5; $x++) {
                 $statusstring = "tax" . $x . "_status";
                 $codestring = "tax" . $x . "_rate";
                 if ($objStatus->{$statusstring} == 0) {
                     $fltRate += $objTaxCode->{$codestring};
                 }
             }
             //Our four elements
             $strCountry = Country::CodeById($objDestination->country);
             if (!is_null($objDestination->state)) {
                 $strState = State::CodeById($objDestination->state);
             } else {
                 $strState = '';
             }
             //$fltRate -- built above
             $strTaxShip = Yii::app()->params['SHIPPING_TAXABLE'] == '1' ? "y" : "n";
             $arrGrid[] = array($strCountry, $strState, $fltRate, $strTaxShip);
         }
     }
     return $arrGrid;
 }
Ejemplo n.º 4
0
 public function __get($strName)
 {
     switch ($strName) {
         case 'state':
             return State::CodeById($this->state_id);
         case 'country':
             return Country::CodeById($this->country_id);
         case 'mainname':
         case 'full_name':
             return $this->first_name . " " . $this->last_name;
         case 'block':
             return $this->address1 . chr(13) . $this->address2 . chr(13) . $this->city . chr(13) . $this->state . chr(13) . " " . $this->postal . chr(13) . $this->country;
         case 'shipblock':
             return $this->first_name . " " . $this->last_name . (!empty($this->company) ? chr(13) . $this->company : "") . $this->company . chr(13) . $this->address1 . chr(13) . $this->address2 . chr(13) . $this->city . chr(13) . $this->state . chr(13) . " " . $this->postal . chr(13) . $this->country;
         default:
             return parent::__get($strName);
     }
 }
Ejemplo n.º 5
0
 public function __get($strName)
 {
     switch ($strName) {
         case 'state':
             if ($this->state_id) {
                 return State::CodeById($this->state_id);
             } else {
                 return null;
             }
         case 'country':
             if ($this->country_id) {
                 return Country::CodeById($this->country_id);
             } else {
                 return null;
             }
         case 'country_name':
             if ($this->country_id) {
                 return Country::CountryById($this->country_id);
             } else {
                 return null;
             }
         case 'mainname':
         case 'fullname':
             return $this->first_name . " " . $this->last_name;
         case 'block':
             return $this->address1 . chr(13) . $this->address2 . chr(13) . $this->city . chr(13) . $this->state . chr(13) . $this->postal . chr(13) . $this->country;
         case 'htmlblock':
             return $this->address1 . '<br>' . (!empty($this->address2) ? $this->address2 . "<br>" : "") . $this->city . ' ' . $this->state . " " . $this->postal . '<br>' . $this->country_name;
         case 'shipblock':
             return $this->first_name . " " . $this->last_name . chr(13) . $this->address1 . chr(13) . (!empty($this->company) ? $this->company . " " . $this->address2 : $this->address2) . chr(13) . $this->city . chr(13) . $this->state . " " . $this->postal . chr(13) . $this->country;
         case 'formattedblock':
             if ($this->customer_id == Yii::app()->user->id) {
                 return $this->first_name . " " . $this->last_name . '<br>' . $this->address1 . '<br>' . (!empty($this->company) ? $this->company . "<br>" : "") . (!empty($this->address2) ? $this->address2 . "<br>" : "") . $this->city . ' ' . $this->state . " " . $this->postal . '<br>' . (_xls_country() != $this->country ? $this->country : "");
             } else {
                 return Yii::t('global', 'Directly to gift recipient') . '<br>' . $this->first_name . " " . $this->last_name;
             }
         case 'formattedblockcountry':
             return $this->first_name . " " . $this->last_name . '<br>' . $this->address1 . '<br>' . (!empty($this->company) ? $this->company . "<br>" : "") . (!empty($this->address2) ? $this->address2 . "<br>" : "") . $this->city . ' ' . $this->state . " " . $this->postal . '<br>' . (_xls_country() != $this->country ? $this->country_name : "");
         default:
             return parent::__get($strName);
     }
 }
Ejemplo n.º 6
0
 /**
  * Match a given address to the most accurate Destination
  * @param string $country
  * @param string $state
  * @param string $zip
  * @return object :: The matching destination
  */
 public static function LoadMatching($country, $state, $zip)
 {
     //We may get id numbers instead of text strings so convert here
     if (is_numeric($country)) {
         $country = Country::CodeById($country);
     }
     if (is_numeric($state)) {
         $state = State::CodeById($state);
     }
     $arrDestinations = Destination::LoadByCountry($country);
     if (is_array($arrDestinations) === false && $arrDestinations instanceof Traversable === false) {
         return null;
     }
     $objState = State::LoadByCode($state, $country);
     $zip = preg_replace('/[^A-Z0-9]/', '', strtoupper($zip));
     foreach ($arrDestinations as $objDestination) {
         if ($objDestination->state == null || $objState !== null && $objState->id == $objDestination->state) {
             $zipStart = $objDestination->Zipcode1;
             $zipEnd = $objDestination->Zipcode2;
             if ($zipStart <= $zip && $zipEnd >= $zip || $zipStart == '' || $zipStart == '*' || $zip == '') {
                 return $objDestination;
             }
         }
     }
     return null;
 }
Ejemplo n.º 7
0
function _xls_html_billingaddress($objCart)
{
    if ($objCart === null) {
        $objCart = Yii::app()->shoppingcart;
    }
    if ($objCart->billaddress_id === null) {
        return '';
    }
    if ($objCart->shipaddress_id == $objCart->billaddress_id) {
        return _xls_html_shippingaddress($objCart);
    }
    $str = '';
    $str .= $objCart->billaddress->address1 . '<br>';
    $str .= $objCart->billaddress->address2 ? $objCart->billaddress->address2 . '<br>' : '';
    $str .= $objCart->billaddress->city . ', ';
    $str .= $objCart->billaddress->state_id ? State::CodeById($objCart->billaddress->state_id) . ', ' : '';
    $str .= $objCart->billaddress->postal ? $objCart->billaddress->postal . '<br>' : '';
    if (_xls_get_conf('DEFAULT_COUNTRY') != $objCart->billaddress->country_id) {
        $str .= Country::CountryById($objCart->billaddress->country_id);
    }
    return $str;
}