/** * Return ISO-Code for Magento address * * @param Varien_Object $address * * @return null|string */ public function getIsoStateByMagentoRegion(Varien_Object $address) { $map = $this->_getIsoToMagentoMapping(); $sIsoCode = null; if ($address->getCountryId() && $address->getRegionCode()) { $sIsoCode = $address->getCountryId() . "-" . $address->getRegionCode(); } if (isset($map[$address->getCountryId()])) { foreach ($map[$address->getCountryId()] as $isoCode => $mageCode) { if ($mageCode === $address->getRegionCode()) { $sIsoCode = $address->getCountryId() . "-" . $isoCode; break; } } } return $sIsoCode; }
/** * Prepare object for save * * @param Varien_Object $object * @return Mage_Customer_Model_Resource_Address_Attribute_Backend_Region */ public function beforeSave($object) { $region = $object->getData('region'); if (is_numeric($region)) { $regionModel = Mage::getModel('directory/region')->load($region); if ($regionModel->getId() && $object->getCountryId() == $regionModel->getCountryId()) { $object->setRegionId($regionModel->getId())->setRegion($regionModel->getName()); } } return $this; }
/** * Returns tax rates for request and when US only uses five digit zip code lookups * * @param Varien_Object $request * @return array */ protected function _getRates($request) { // Grab each current value $countryId = $request->getCountryId(); $currentPostcode = $request->getPostcode(); if ($countryId == 'US') { // Trim whitespace $newPostcode = preg_replace('/\\s+/', '', $request->getPostcode()); // Snatch only the first five characters $newPostcode = substr($newPostcode, 0, 5); // Replace the request's zip code with one that now has 5 digits $request->setPostcode($newPostcode); // Find rates by the new 5-digit zip $rates = parent::_getRates($request); // Reset the request's postcode to what it was $request->setPostcode($currentPostcode); } else { // Non-US should just work normally $rates = parent::_getRates($request); } return $rates; }
public function collectRatesByAddress(Varien_Object $address, $limitCarrier = null) { $request = Mage::getModel('shipping/rate_request'); $request->setDestCountryId($address->getCountryId()); $request->setDestRegionId($address->getRegionId()); $request->setDestPostcode($address->getPostcode()); $request->setPackageValue($address->getSubtotal()); $request->setPackageWeight($address->getWeight()); $request->setPackageQty($address->getItemQty()); $request->setStoreId(Mage::app()->getStore()->getId()); $request->setWebsiteId(Mage::app()->getStore()->getWebsiteId()); $request->setBaseCurrency(Mage::app()->getStore()->getBaseCurrency()); $request->setPackageCurrency(Mage::app()->getStore()->getCurrentCurrency()); $request->setLimitCarrier($limitCarrier); return $this->collectRates($request); }
/** * Compare data and rates for two tax rate requests for same products (product tax class ids). * Returns true if requests are similar (i.e. equal taxes rates will be applied to them) * * Notice: * a) productClassId MUST be identical for both requests, because we intend to check selling SAME products to DIFFERENT locations * b) due to optimization productClassId can be array of ids, not only single id * * @param Varien_Object $first * @param Varien_Object $second * @return bool */ public function compareRequests($first, $second) { $country = $first->getCountryId() == $second->getCountryId(); // "0" support for admin dropdown with --please select-- $region = (int) $first->getRegionId() == (int) $second->getRegionId(); $postcode = $first->getPostcode() == $second->getPostcode(); $taxClass = $first->getCustomerClassId() == $second->getCustomerClassId(); if ($country && $region && $postcode && $taxClass) { return true; } /** * Compare available tax rates for both requests */ $firstReqRates = $this->_getResource()->getRateIds($first); $secondReqRates = $this->_getResource()->getRateIds($second); if ($firstReqRates === $secondReqRates) { return true; } /** * If rates are not equal by ids then compare actual values * All product classes must have same rates to assume requests been similar */ $productClassId1 = $first->getProductClassId(); // Save to set it back later $productClassId2 = $second->getProductClassId(); // Save to set it back later // Ids are equal for both requests, so take any of them to process $ids = is_array($productClassId1) ? $productClassId1 : array($productClassId1); $identical = true; foreach ($ids as $productClassId) { $first->setProductClassId($productClassId); $rate1 = $this->getRate($first); $second->setProductClassId($productClassId); $rate2 = $this->getRate($second); if ($rate1 != $rate2) { $identical = false; break; } } $first->setProductClassId($productClassId1); $second->setProductClassId($productClassId2); return $identical; }
/** * Returns tax rates for request - either pereforms SELECT from DB, or returns already cached result * Notice that productClassId due to optimization can be array of ids * * @param Varien_Object $request * @return array */ protected function _getRates($request) { // Extract params that influence our SELECT statement and use them to create cache key $storeId = Mage::app()->getStore($request->getStore())->getId(); $customerClassId = $request->getCustomerClassId(); $countryId = $request->getCountryId(); $regionId = $request->getRegionId(); $postcode = $request->getPostcode(); // Process productClassId as it can be array or usual value. Form best key for cache. $productClassId = $request->getProductClassId(); $ids = is_array($productClassId) ? $productClassId : array($productClassId); foreach ($ids as $key => $val) { $ids[$key] = (int) $val; // Make it integer for equal cache keys even in case of null/false/0 values } $ids = array_unique($ids); sort($ids); $productClassKey = implode(',', $ids); // Form cache key and either get data from cache or from DB $cacheKey = implode('|', array($storeId, $customerClassId, $productClassKey, $countryId, $regionId, $postcode)); if (!isset($this->_ratesCache[$cacheKey])) { // Make SELECT and get data $select = $this->_getReadAdapter()->select(); $select->from(array('main_table' => $this->getMainTable()), array('tax_calculation_rate_id', 'tax_calculation_rule_id', 'customer_tax_class_id', 'product_tax_class_id'))->where('customer_tax_class_id = ?', (int) $customerClassId); if ($productClassId) { $select->where('product_tax_class_id IN (?)', $productClassId); } $ifnullTitleValue = $this->_getReadAdapter()->getCheckSql('title_table.value IS NULL', 'rate.code', 'title_table.value'); $ruleTableAliasName = $this->_getReadAdapter()->quoteIdentifier('rule.tax_calculation_rule_id'); $select->join(array('rule' => $this->getTable('tax/tax_calculation_rule')), $ruleTableAliasName . ' = main_table.tax_calculation_rule_id', array('rule.priority', 'rule.position'))->join(array('rate' => $this->getTable('tax/tax_calculation_rate')), 'rate.tax_calculation_rate_id = main_table.tax_calculation_rate_id', array('value' => 'rate.rate', 'rate.tax_country_id', 'rate.tax_region_id', 'rate.tax_postcode', 'rate.tax_calculation_rate_id', 'rate.code'))->joinLeft(array('title_table' => $this->getTable('tax/tax_calculation_rate_title')), "rate.tax_calculation_rate_id = title_table.tax_calculation_rate_id " . "AND title_table.store_id = '{$storeId}'", array('title' => $ifnullTitleValue))->where('rate.tax_country_id = ?', $countryId)->where("rate.tax_region_id IN(?)", array(0, (int) $regionId)); $postcodeIsNumeric = is_numeric($postcode); if ($postcodeIsNumeric) { $selectClone = clone $select; $selectClone->where('rate.zip_is_range IS NOT NULL'); } $select->where('rate.zip_is_range IS NULL'); if ($request->getPostcode() != '*') { $select->where("rate.tax_postcode IS NULL OR rate.tax_postcode IN('*', '', ?)", $this->_createSearchPostCodeTemplates($postcode)); if ($postcodeIsNumeric) { $selectClone->where('? BETWEEN rate.zip_from AND rate.zip_to', $postcode); } } /** * @see ZF-7592 issue http://framework.zend.com/issues/browse/ZF-7592 */ if ($postcodeIsNumeric) { $select = $this->_getReadAdapter()->select()->union(array('(' . $select . ')', '(' . $selectClone . ')')); } $select->order('priority ' . Varien_Db_Select::SQL_ASC)->order('tax_calculation_rule_id ' . Varien_Db_Select::SQL_ASC)->order('tax_country_id ' . Varien_Db_Select::SQL_DESC)->order('tax_region_id ' . Varien_Db_Select::SQL_DESC)->order('tax_postcode ' . Varien_Db_Select::SQL_DESC)->order('value ' . Varien_Db_Select::SQL_DESC); $this->_ratesCache[$cacheKey] = $this->_getReadAdapter()->fetchAll($select); } return $this->_ratesCache[$cacheKey]; }
/** * Adopt specified address object to be compatible with Magento * * @param Varien_Object $address */ protected function _applyStreetAndRegionWorkarounds(Varien_Object $address) { // merge street addresses into 1 if ($address->hasStreet2()) { $address->setStreet(implode("\n", array($address->getStreet(), $address->getStreet2()))); $address->unsStreet2(); } // attempt to fetch region_id from directory if ($address->getCountryId() && $address->getRegion()) { $regions = Mage::getModel('directory/country')->loadByCode($address->getCountryId())->getRegionCollection()->addRegionCodeOrNameFilter($address->getRegion())->setPageSize(1); foreach ($regions as $region) { $address->setRegionId($region->getId()); $address->setExportedKeys(array_merge($address->getExportedKeys(), array('region_id'))); break; } } }
/** * Collect rates by address * * @param Varien_Object $address * @param null|bool|array $limitCarrier * @return Mage_Shipping_Model_Shipping */ public function collectRatesByAddress(Varien_Object $address, $limitCarrier = null) { /** @var $request Mage_Shipping_Model_Rate_Request */ $request = Mage::getModel('shipping/rate_request'); $request->setAllItems($address->getAllItems()); $request->setDestCountryId($address->getCountryId()); $request->setDestRegionId($address->getRegionId()); $request->setDestPostcode($address->getPostcode()); $request->setPackageValue($address->getBaseSubtotal()); $request->setPackageValueWithDiscount($address->getBaseSubtotalWithDiscount()); $request->setPackageWeight($address->getWeight()); $request->setFreeMethodWeight($address->getFreeMethodWeight()); $request->setPackageQty($address->getItemQty()); $request->setStoreId(Mage::app()->getStore()->getId()); $request->setWebsiteId(Mage::app()->getStore()->getWebsiteId()); $request->setBaseCurrency(Mage::app()->getStore()->getBaseCurrency()); $request->setPackageCurrency(Mage::app()->getStore()->getCurrentCurrency()); $request->setLimitCarrier($limitCarrier); $request->setBaseSubtotalInclTax($address->getBaseSubtotalInclTax() + $address->getBaseExtraTaxAmount()); return $this->collectRates($request); }
/** * Get information about tax rates applied to request * * @param Varien_Object $request * @return array */ public function getAppliedRates($request) { if (!$request->getCountryId() || !$request->getCustomerClassId() || !$request->getProductClassId()) { return array(); } $cacheKey = $this->_getRequestCacheKey($request); if (!isset($this->_rateCalculationProcess[$cacheKey])) { $this->_rateCalculationProcess[$cacheKey] = $this->_getResource()->getCalculationProcess($request); } return $this->_rateCalculationProcess[$cacheKey]; }
/** * Get rate ids applicable for some address * * @param Varien_Object $request * @return array */ function getApplicableRateIds($request) { $countryId = $request->getCountryId(); $regionId = $request->getRegionId(); $postcode = $request->getPostcode(); $select = $this->_getReadAdapter()->select()->from(array('rate' => $this->getTable('tax/tax_calculation_rate')), array('tax_calculation_rate_id'))->where('rate.tax_country_id = ?', $countryId)->where("rate.tax_region_id IN(?)", array(0, (int) $regionId)); $expr = $this->_getWriteAdapter()->getCheckSql('zip_is_range is NULL', $this->_getWriteAdapter()->quoteInto("rate.tax_postcode IS NULL OR rate.tax_postcode IN('*', '', ?)", $this->_createSearchPostCodeTemplates($postcode)), $this->_getWriteAdapter()->quoteInto('? BETWEEN rate.zip_from AND rate.zip_to', $postcode)); $select->where($expr); $select->order('tax_calculation_rate_id'); return $this->_getReadAdapter()->fetchCol($select); }
/** * Load select and return tax rates * * @param Varien_Object $request * @return array */ protected function _getRates($request) { $storeId = Mage::app()->getStore($request->getStore())->getId(); $select = $this->_getReadAdapter()->select(); $select->from(array('main_table' => $this->getMainTable()))->where('customer_tax_class_id = ?', $request->getCustomerClassId()); if ($request->getProductClassId()) { $select->where('product_tax_class_id IN (?)', $request->getProductClassId()); } $select->join(array('rule' => $this->getTable('tax/tax_calculation_rule')), 'rule.tax_calculation_rule_id = main_table.tax_calculation_rule_id', array('rule.priority', 'rule.position')); $select->join(array('rate' => $this->getTable('tax/tax_calculation_rate')), 'rate.tax_calculation_rate_id = main_table.tax_calculation_rate_id', array('value' => 'rate.rate', 'rate.tax_country_id', 'rate.tax_region_id', 'rate.tax_postcode', 'rate.tax_calculation_rate_id', 'rate.code')); $select->joinLeft(array('title_table' => $this->getTable('tax/tax_calculation_rate_title')), "rate.tax_calculation_rate_id = title_table.tax_calculation_rate_id AND title_table.store_id = '{$storeId}'", array('title' => 'IFNULL(title_table.value, rate.code)')); $select->where("rate.tax_country_id = ?", $request->getCountryId())->where("rate.tax_region_id in ('*', '', ?)", $request->getRegionId()); $selectClone = clone $select; $select->where("rate.zip_is_range IS NULL")->where("rate.tax_postcode in ('*', '', ?)", $this->_createSearchPostCodeTemplates($request->getPostcode())); $selectClone->where("rate.zip_is_range IS NOT NULL")->where("? BETWEEN rate.zip_from AND rate.zip_to", $request->getPostcode()); /** * @see ZF-7592 issue http://framework.zend.com/issues/browse/ZF-7592 */ $select = $this->_getReadAdapter()->select()->union(array('(' . $select . ')', '(' . $selectClone . ')')); $order = array('priority ASC', 'tax_calculation_rule_id ASC', 'tax_country_id DESC', 'tax_region_id DESC', 'tax_postcode DESC', 'value DESC'); $select->order($order); return $this->_getReadAdapter()->fetchAll($select); }
private function getDefaultDestination($store = null) { $this->log('default dest'); $address = new Varien_Object(); $request = new Varien_Object(); $address->setCountryId(Mage::getStoreConfig(Mage_Tax_Model_Config::CONFIG_XML_PATH_DEFAULT_COUNTRY, $store))->setRegionId(Mage::getStoreConfig(Mage_Tax_Model_Config::CONFIG_XML_PATH_DEFAULT_REGION, $store))->setPostcode(Mage::getStoreConfig(Mage_Tax_Model_Config::CONFIG_XML_PATH_DEFAULT_POSTCODE, $store)); $customerTaxClass = null; $customer = $this->getCustomer(); if (is_null($customerTaxClass) && $customer) { $customerTaxClass = $customer->getTaxClassId(); } elseif ($customerTaxClass === false || !$customer) { $customerTaxClass = $this->getDefaultCustomerTaxClass($store); } $request->setCountryId($address->getCountryId())->setRegionId($address->getRegionId())->setPostcode($address->getPostcode())->setStore($store)->setCustomerClassId($customerTaxClass); return $request; }
/** * Compare data from two tax rate requests. * Return true if requests are semilar * * @param Varien_Object $first * @param Varien_Object $second * @return bool */ public function compareRequests($first, $second) { // var_dump($first->getCountryId() , $second->getCountryId()); echo '<br>'; // var_dump($first->getRegionId(), $second->getRegionId());echo '<br>'; $country = $first->getCountryId() == $second->getCountryId(); /** * "0" support for admin dropdown with --please select-- */ $region = (int) $first->getRegionId() == (int) $second->getRegionId() || $first->getRegionId() == '*' || $second->getRegionId() == '*' || $first->getRegionId() == '0' || $second->getRegionId() == '0'; $postcode = $first->getPostcode() == $second->getPostcode() || $first->getPostcode() == '*' || $second->getPostcode() == '*'; $taxClass = $first->getCustomerClassId() == $second->getCustomerClassId(); if ($country && $region && $postcode && $taxClass) { return true; } return false; }
/** * Copy address * * @param Varien_Object $srcAddress * @param Varien_Object $dstAddress * @return Innoexts_Warehouse_Helper_Data */ public function copy($srcAddress, $dstAddress) { $dstAddress->setCountryId($srcAddress->getCountryId()); $dstAddress->setRegionId($srcAddress->getRegionId()); $dstAddress->setRegion($srcAddress->getRegion()); $dstAddress->setCity($srcAddress->getCity()); $dstAddress->setPostcode($srcAddress->getPostcode()); $dstAddress->setStreet($srcAddress->getStreet()); return $this; }
/** * Compare data and rates for two tax rate requests. * Return true if requests are semilar * * @param Varien_Object $first * @param Varien_Object $second * @return bool */ public function compareRequests($first, $second) { $country = $first->getCountryId() == $second->getCountryId(); /** * "0" support for admin dropdown with --please select-- */ $region = (int) $first->getRegionId() == (int) $second->getRegionId(); $postcode = $first->getPostcode() == $second->getPostcode(); $taxClass = $first->getCustomerClassId() == $second->getCustomerClassId(); if ($country && $region && $postcode && $taxClass) { return true; } /** * Compare available tax rates for both requests */ $firstReqRates = $this->_getResource()->getRateIds($first); $secondReqRates = $this->_getResource()->getRateIds($second); if ($firstReqRates === $secondReqRates) { return true; } return false; }