/** * testCreate * * @return void * @access public * @see ____func_see____ * @since 1.0.0 */ public function testCreate() { // Prepare data for rate $method = $this->getMethodByName('Courier'); $methodName = $method->getName(); $markups = \XLite\Core\Database::getRepo('XLite\\Model\\Shipping\\Markup')->findAll(); $this->assertTrue(0 < count($markups), 'markups list length checking'); $markup = array_shift($markups); $markupId = $markup->getMarkupId(); unset($markups); $extraData = new \XLite\Core\CommonCell(); $extraData->testparam1 = 'test value 1'; $extraData->testparam2 = 'test value 2'; $newRate = new \XLite\Model\Shipping\Rate(); $newRate->setMethod($method); $newRate->setBaseRate(100); $newRate->setMarkup($markup); $newRate->setMarkupRate(200); $newRate->setExtraData($extraData); // Check all parameters $this->assertEquals($markupId, $newRate->getMarkup()->getMarkupId(), 'Markup wrong'); $this->assertEquals(100, $newRate->getBaseRate(), 'Base rate wrong'); $this->assertEquals(200, $newRate->getMarkupRate(), 'Markup rate wrong'); $this->assertEquals(300, $newRate->getTotalRate(), 'Total rate wrong'); $this->assertEquals('test value 1', $newRate->getExtraData()->testparam1, 'Extra data #1 wrong'); $this->assertEquals('test value 2', $newRate->getExtraData()->testparam2, 'Extra data #2 wrong'); $this->assertEquals($methodName, $newRate->getMethodName(), 'getMethodName() returned wrong value'); }
/** * Performs request to FedEx server and returns array of rates * * @param array $data Array of request parameters * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return \XLite\Model\Shipping\Rate[] */ protected function performRequest($data, $ignoreCache) { $rates = array(); $packageRates = array(); $config = $this->getConfiguration(); $currencyRate = $this->getCurrencyConversionRate(); foreach ($data['packages'] as $pid => $package) { // Get services list $requestType = $package['shipment_type'] . $package['package_type'] . 'Service'; $services = $this->doRequest($requestType, $package, $ignoreCache); // Get postage rates for specific services $services = isset($services['services']['service']) && is_array($services['services']['service']) ? $services['services']['service'] : array(); foreach ($services as $service) { $requestType = $package['shipment_type'] . $package['package_type'] . 'Postage'; $package['service_code'] = $service['code']; $package['options'] = array(); if (!empty($service['options']['option'])) { // Additional service options available if (!empty($service['options']['option']['code'])) { // Single option available $option = array(); $option['code'] = $service['options']['option']['code']; if (!empty($service['options']['option']['suboptions'])) { $option['suboptions'] = $this->getSuboptions($service['options']['option']['suboptions']['option']); } $package['options'][] = $option; } else { // Multiple options available foreach ($service['options']['option'] as $o) { $option = array(); $option['code'] = $o['code']; if (!empty($o['suboptions'])) { $option['suboptions'] = $this->getSuboptions($o['suboptions']['option']); } $package['options'][] = $option; } } } $serviceRates = $this->doRequest($requestType, $package, $ignoreCache); // Prepare rates for package if (!empty($serviceRates['postage_result'])) { $rate = new \XLite\Model\Shipping\Rate(); $rate->setBaseRate($serviceRates['postage_result']['total_cost'] * $currencyRate); if (!empty($serviceRates['postage_result']['delivery_time'])) { $extraData = new \XLite\Core\CommonCell(); $extraData->deliveryDays = $serviceRates['postage_result']['delivery_time']; $rate->setExtraData($extraData); } // Save rates for each package $packageRates[$service['code']]['packages'][$pid] = $rate; // Save service name $packageRates[$service['code']]['name'] = $serviceRates['postage_result']['service']; // Save common rate (sum of rate totals of all packages) if (!isset($packageRates[$service['code']]['rate'])) { $packageRates[$service['code']]['rate'] = $rate; } else { $packageRates[$service['code']]['rate']->setBaseRate($packageRates[$service['code']]['rate']->getBaseRate() + $rate->getBaseRate()); } } } } // Prepare final rates if ($packageRates) { foreach ($packageRates as $code => $info) { if (count($info['packages']) === count($data['packages'])) { $method = $this->getMethodByCode($code, static::STATE_ALL); if (!$method) { // Create shipping method if it's does not exist $method = $this->createMethod($code, 'Australia Post ' . $info['name'], $config->enable_new_methods); } if ($method->getEnabled()) { $info['rate']->setMethod($method); $rates[] = $info['rate']; } } } } return $rates; }
/** * Performs request to USPS server and returns array of rates * * @param array $data Array of request parameters * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return array */ protected function doQuery($data, $ignoreCache) { $result = null; $rates = array(); $availableMethods = \XLite\Core\Database::getRepo('XLite\\Model\\Shipping\\Method')->findMethodsByProcessor($this->getProcessorId()); if ($availableMethods) { $xmlData = $this->getXMLData($data); $currencyRate = doubleval(\XLite\Core\Config::getInstance()->CDev->USPS->currency_rate); $currencyRate = 0 < $currencyRate ? $currencyRate : 1; $postURL = $this->getApiURL() . '?API=' . $this->getApiName() . '&XML=' . urlencode(preg_replace('/>(\\s+)</', '><', $xmlData)); try { if (!$ignoreCache) { $cachedRate = $this->getDataFromCache($postURL); } if (isset($cachedRate)) { // Get rates from cache $result = $cachedRate; } elseif (\XLite\Model\Shipping::isIgnoreLongCalculations()) { // Ignore rates calculation return array(); } else { // Calculate rate $bouncer = new \XLite\Core\HTTP\Request($postURL); $bouncer->requestTimeout = 5; $response = $bouncer->sendRequest(); if ($response && 200 == $response->code) { $result = $response->body; $this->saveDataInCache($postURL, $result); if (\XLite\Core\Config::getInstance()->CDev->USPS->debug_enabled) { \XLite\Logger::logCustom('USPS', var_export(array('Request URL' => $postURL, 'Request XML' => $xmlData, 'Response' => \XLite\Core\XML::getInstance()->getFormattedXML($result)), true)); } } else { $this->errorMsg = sprintf('Error while connecting to the USPS host (%s)', $this->getApiURL()); } } $response = isset($this->errorMsg) ? array() : $this->parseResponse($result); $this->apiCommunicationLog[] = array('request' => $postURL, 'xml' => htmlentities(preg_replace('/(USERID=")([^"]+)/', '\\1***', $xmlData)), 'response' => htmlentities(\XLite\Core\XML::getInstance()->getFormattedXML($result))); if (!isset($this->errorMsg) && !isset($response['err_msg']) && !empty($response['postage'])) { foreach ($response['postage'] as $postage) { $rate = new \XLite\Model\Shipping\Rate(); $method = $this->getShippingMethod($postage['CLASSID'], $availableMethods); if (!isset($method)) { // Unknown method received: add this to the database with disabled status $method = $this->addShippingMethod($postage); } if ($method && $method->getEnabled()) { // Method is registered and enabled $rate->setMethod($method); $codPrice = 0; $rateValue = doubleval($postage['Rate']); if (!$this->isStaticCODPrice() && isset($postage['SpecialServices'])) { if (isset($postage['SpecialServices'][6]) && 'true' == $postage['SpecialServices'][6]['Available']) { // Shipping service supports COD $extraData = new \XLite\Core\CommonCell(); $extraData->cod_supported = true; $extraData->cod_rate = ($rateValue + doubleval($postage['SpecialServices'][6]['Price'])) * $currencyRate; $rate->setExtraData($extraData); if ($data['cod_enabled']) { // Calculate COD fee if COD payment method is selected $codPrice = doubleval($postage['SpecialServices'][6]['Price']); } } } elseif ($this->isStaticCODPrice() && $this->isMethodSupportCOD($method)) { $codStaticPrice = doubleval(\XLite\Core\Config::getInstance()->CDev->USPS->cod_price); if (0 < $codStaticPrice) { // Shipping service supports COD $extraData = new \XLite\Core\CommonCell(); $extraData->cod_supported = true; $extraData->cod_rate = ($rateValue + $codStaticPrice) * $currencyRate; $rate->setExtraData($extraData); if ($data['cod_enabled']) { // Calculate COD fee if COD payment method is selected $codPrice = $codStaticPrice; } } } // Base rate is a sum of base rate and COD fee $rate->setBaseRate(($rateValue + $codPrice) * $currencyRate); if (isset($rates[$postage['MailService']])) { // Multipackaging: sum base rate and COD fee for each rated packages $rates[$postage['MailService']]->setBaseRate($rates[$postage['MailService']]->getBaseRate() + $rate->getBaseRate()); if ($rate->getExtraData()->cod_rate) { $extra = $rates[$postage['MailService']]->getExtraData(); $extra->cod_rate = $extra->cod_rate + $rate->getExtraData()->cod_rate; $rates[$postage['MailService']]->setExtraData($extra); } } else { $rates[$postage['MailService']] = $rate; } } } } elseif (!isset($this->errorMsg)) { $this->errorMsg = isset($response['err_msg']) ? $response['err_msg'] : 'Unknown error'; } } catch (\Exception $e) { $this->errorMsg = 'Exception: ' . $e->getMessage(); } } return $rates; }
/** * Performs request to carrier server and returns array of rates * * @param array $data Array of request parameters * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return \XLite\Model\Shipping\Rate[] */ protected function performRequest($data, $ignoreCache) { $rates = array(); $config = $this->getConfiguration(); $xmlData = $this->getXMLData($data); try { if (!$ignoreCache) { $cachedRate = $this->getDataFromCache($xmlData); } $postURL = $this->getApiURL(); $result = null; if (isset($cachedRate)) { $result = $cachedRate; } elseif (\XLite\Model\Shipping::isIgnoreLongCalculations()) { // Ignore rates calculation return array(); } else { $bouncer = new \XLite\Core\HTTP\Request($postURL); $bouncer->body = $xmlData; $bouncer->verb = 'POST'; $bouncer->requestTimeout = 5; $response = $bouncer->sendRequest(); if (200 == $response->code || !empty($response->body)) { $result = $response->body; if (200 == $response->code) { $this->saveDataInCache($xmlData, $result); } if ($config->debug_enabled) { $this->log(array('request_url' => $postURL, 'request_data' => $this->filterRequestData($xmlData), 'response' => \XLite\Core\XML::getInstance()->getFormattedXML($result))); } } else { $this->setError(sprintf('Error while connecting to the FedEx host (%s)', $postURL)); } } $response = !$this->hasError() ? $this->parseResponse($result) : array(); //save communication log for test request only (ignoreCache is set for test requests only) if ($ignoreCache === true) { $this->addApiCommunicationMessage(array('request_url' => $postURL, 'request_data' => $xmlData, 'response' => $result)); } if (!$this->hasError() && !isset($response['err_msg'])) { foreach ($response as $code => $_rate) { $rate = new \XLite\Model\Shipping\Rate(); $method = $this->getMethodByCode($code, static::STATE_ALL); if ($method && $method->getEnabled()) { // Method is registered and enabled $rate->setMethod($method); $rate->setBaseRate($_rate['amount']); if (!empty($data['cod_enabled'])) { $extraData = new \XLite\Core\CommonCell(); $extraData->cod_supported = true; $extraData->cod_rate = $rate->getBaseRate(); $rate->setExtraData($extraData); } $rates[] = $rate; } } } elseif (!$this->hasError()) { $this->setError(isset($response['err_msg']) ? $response['err_msg'] : 'Unknown error'); } } catch (\Exception $e) { $this->setError('Exception: ' . $e->getMessage()); } return $rates; }
/** * doQuery * * @param mixed $data Can be either \XLite\Model\Order instance or an array * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return void */ protected function doQuery($data, $ignoreCache) { $rates = array(); // Get all available rates $availableMethods = \XLite\Core\Database::getRepo('XLite\\Model\\Shipping\\Method')->findMethodsByProcessor($this->getProcessorId(), !$ignoreCache); if ($availableMethods) { // Do rates calculation if there are enabled shipping methods or calculation test is running $xmlData = $this->getXMLData($data); $postData = preg_split("/(\r\n|\r|\n)/", $xmlData, -1, PREG_SPLIT_NO_EMPTY); $postURL = $this->getApiURL(); try { if (!$ignoreCache) { $cachedRate = $this->getDataFromCache($xmlData); } if (isset($cachedRate)) { $result = $cachedRate; } elseif (\XLite\Model\Shipping::isIgnoreLongCalculations()) { // Ignore rates calculation return array(); } else { // Prepare request XML for logging $xmlDataLog = preg_replace('|<AccessLicenseNumber>.+</AccessLicenseNumber>|i', '<AccessLicenseNumber>xxx</AccessLicenseNumber>', $xmlData); $xmlDataLog = preg_replace('|<UserId>.+</UserId>|i', '<UserId>xxx</UserId>', $xmlDataLog); $xmlDataLog = preg_replace('|<Password>.+</Password>|i', '<Password>xxx</Password>', $xmlDataLog); $xmlDataLog = preg_replace('|<ShipperNumber>.+</ShipperNumber>|i', '<ShipperNumber>xxx</ShipperNumber>', $xmlDataLog); // Do request $bouncer = new \XLite\Core\HTTP\Request($postURL . '/Rate'); $bouncer->body = $xmlData; $bouncer->verb = 'POST'; $bouncer->requestTimeout = 5; $response = $bouncer->sendRequest(); if (200 == $response->code || !empty($response->body)) { $result = $response->body; if (200 == $response->code) { $this->saveDataInCache($xmlData, $result); } if (\XLite\Core\Config::getInstance()->XC->UPS->debug_enabled) { \XLite\Logger::logCustom('UPS', var_export(array('Request URL' => $postURL, 'Request XML' => $xmlDataLog, 'Response XML' => \XLite\Core\XML::getInstance()->getFormattedXML($result)), true)); } } else { $this->errorMsg = sprintf('Error while connecting to the UPS server (%s)', $this->getApiURL()); } } if (!isset($this->errorMsg)) { $response = $this->parseResponse($result); } else { $response = array(); } // Save communication log for test request only (ignoreCache is set for test requests only) if ($ignoreCache === true) { $this->apiCommunicationLog[] = array('post URL' => $postURL, 'request' => htmlentities($xmlDataLog), 'response' => htmlentities(\XLite\Core\XML::getInstance()->getFormattedXML($result))); } if (!isset($this->errorMsg) && !isset($response['err_msg'])) { foreach ($response as $row) { $method = $this->getShippingMethod($row['serviceCode'], $data['srcAddress']['country'], $availableMethods); if ($method) { $rate = new \XLite\Model\Shipping\Rate(); $rate->setBaseRate($row['totalCharges']); $rate->setMethod($method); $extraData = null; if (!empty($row['deliveryTime'])) { $extraData = new \XLite\Core\CommonCell(); $extraData->deliveryDays = $row['deliveryTime']; $rate->setExtraData($extraData); } if ($data['cod_enabled'] && $this->isCODAllowed('all', $data['srcAddress']['country'], $data['dstAddress']['country'])) { $extraData = $extraData ?: new \XLite\Core\CommonCell(); $extraData->cod_supported = true; $extraData->cod_rate = $rate->getBaseRate(); $rate->setExtraData($extraData); } $rates[] = $rate; } } } elseif (!isset($this->errorMsg)) { $this->errorMsg = isset($response['err_msg']) ? $response['err_msg'] : 'Unknown error'; } } catch (\Exception $e) { $this->errorMsg = 'Exception: ' . $e->getMessage(); } } return $rates; }
/** * doQuery * * @param mixed $data Can be either \XLite\Model\Order instance or an array * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return array */ protected function doQuery($data, $ignoreCache) { $rates = array(); $packageRates = array(); $currencyRate = $this->getCurrencyConversionRate(); foreach ($data['packages'] as $pid => $package) { // Get services list $requestType = $package['shipment_type'] . $package['package_type'] . 'Service'; $services = $this->doRequest($requestType, $package, $ignoreCache); // Get postage rates for specific services $services = isset($services['services']['service']) && is_array($services['services']['service']) ? $services['services']['service'] : array(); foreach ($services as $service) { $requestType = $package['shipment_type'] . $package['package_type'] . 'Postage'; $package['service_code'] = $service['code']; $package['options'] = array(); if (!empty($service['options']['option'])) { // Additional service options available if (!empty($service['options']['option']['code'])) { // Single option available $option = array(); $option['code'] = $service['options']['option']['code']; if (!empty($service['options']['option']['suboptions'])) { $option['suboptions'] = $this->getSuboptions($service['options']['option']['suboptions']['option']); } $package['options'][] = $option; } else { // Multiple options available foreach ($service['options']['option'] as $o) { $option = array(); $option['code'] = $o['code']; if (!empty($o['suboptions'])) { $option['suboptions'] = $this->getSuboptions($o['suboptions']['option']); } $package['options'][] = $option; } } } $serviceRates = $this->doRequest($requestType, $package, $ignoreCache); // Prepare rates for package if (!empty($serviceRates['postage_result'])) { $rate = new \XLite\Model\Shipping\Rate(); $rate->setBaseRate($serviceRates['postage_result']['total_cost'] * $currencyRate); if (!empty($serviceRates['postage_result']['delivery_time'])) { $extraData = new \XLite\Core\CommonCell(); $extraData->deliveryDays = $serviceRates['postage_result']['delivery_time']; $rate->setExtraData($extraData); } // Save rates for each package $packageRates[$service['code']]['packages'][$pid] = $rate; // Save service name $packageRates[$service['code']]['name'] = $serviceRates['postage_result']['service']; // Save common rate (sum of rate totals of all packages) if (!isset($packageRates[$service['code']]['rate'])) { $packageRates[$service['code']]['rate'] = $rate; } else { $packageRates[$service['code']]['rate']->setBaseRate($packageRates[$service['code']]['rate']->getBaseRate() + $rate->getBaseRate()); } } } } // Prepare final rates if ($packageRates) { $availableMethods = \XLite\Core\Database::getRepo('XLite\\Model\\Shipping\\Method')->findMethodsByProcessor($this->getProcessorId(), false); foreach ($packageRates as $code => $info) { if (count($info['packages']) == count($data['packages'])) { $method = null; foreach ($availableMethods as $m) { if ($m->getCode() == $code) { $method = $m; break; } } if (!$method) { // Create shipping method if it's does not exist $method = \XLite\Core\Database::getRepo('XLite\\Model\\Shipping\\Method')->createShippingMethod(array('processor' => 'aupost', 'carrier' => 'aupost', 'code' => $code, 'enabled' => \XLite\Core\Config::getInstance()->CDev->AustraliaPost->enable_new_methods, 'position' => 0, 'name' => 'Australia Post ' . $info['name'])); } if ($method->getEnabled()) { $info['rate']->setMethod($method); $rates[] = $info['rate']; } } } } return $rates; }
/** * doQuery * * @param mixed $data Can be either \XLite\Model\Order instance or an array * @param boolean $ignoreCache Flag: if true then do not get rates from cache * * @return array */ protected function doQuery($data, $ignoreCache) { $rates = array(); $config = $this->getConfiguration(); if ($this->getMethods()) { // Do rates calculation if there are enabled shipping methods or calculation test is running $xmlData = $this->getXMLData($data); $postURL = $this->getApiURL(); try { if (!$ignoreCache) { $cachedRate = $this->getDataFromCache($xmlData); } if (isset($cachedRate)) { $result = $cachedRate; } elseif (\XLite\Model\Shipping::isIgnoreLongCalculations()) { // Ignore rates calculation return array(); } else { // Prepare request XML for logging $xmlDataLog = preg_replace('|<AccessLicenseNumber>.+</AccessLicenseNumber>|i', '<AccessLicenseNumber>xxx</AccessLicenseNumber>', $xmlData); $xmlDataLog = preg_replace('|<UserId>.+</UserId>|i', '<UserId>xxx</UserId>', $xmlDataLog); $xmlDataLog = preg_replace('|<Password>.+</Password>|i', '<Password>xxx</Password>', $xmlDataLog); $xmlDataLog = preg_replace('|<ShipperNumber>.+</ShipperNumber>|i', '<ShipperNumber>xxx</ShipperNumber>', $xmlDataLog); // Do request $bouncer = new \XLite\Core\HTTP\Request($postURL . '/Rate'); $bouncer->body = $xmlData; $bouncer->verb = 'POST'; $bouncer->requestTimeout = 5; $response = $bouncer->sendRequest(); if (200 == $response->code || !empty($response->body)) { $result = $response->body; if (200 == $response->code) { $this->saveDataInCache($xmlData, $result); } if ($config->debug_enabled) { $this->log(array('request_url' => $postURL, 'request_data' => $this->filterRequestData($xmlDataLog), 'response' => \XLite\Core\XML::getInstance()->getFormattedXML($result))); } } else { $this->setError(sprintf('Error while connecting to the UPS server (%s)', $this->getApiURL())); } } $response = array(); if (!$this->hasError()) { $response = $this->parseResponse($result); } // Save communication log for test request only (ignoreCache is set for test requests only) if ($ignoreCache === true) { $this->addApiCommunicationMessage(array('request_url' => $postURL, 'request_data' => $xmlDataLog, 'response' => $result)); } if (!$this->hasError() && !isset($response['err_msg'])) { foreach ($response as $row) { $method = $this->getMethodByServiceCodeAndCountry($row['serviceCode'], $data['srcAddress']['country']); if ($method) { $rate = new \XLite\Model\Shipping\Rate(); $rate->setBaseRate($row['totalCharges']); $rate->setMethod($method); $extraData = null; if (!empty($row['deliveryTime'])) { $extraData = new \XLite\Core\CommonCell(); $extraData->deliveryDays = $row['deliveryTime']; $rate->setExtraData($extraData); } if ($data['cod_enabled'] && $this->isCODAllowed('all', $data['srcAddress']['country'], $data['dstAddress']['country'])) { $extraData = $extraData ?: new \XLite\Core\CommonCell(); $extraData->cod_supported = true; $extraData->cod_rate = $rate->getBaseRate(); $rate->setExtraData($extraData); } $rates[] = $rate; } } } elseif (!$this->hasError()) { $this->setError(isset($response['err_msg']) ? $response['err_msg'] : 'Unknown error'); } } catch (\Exception $e) { $this->setError('Exception: ' . $e->getMessage()); } } return $rates; }