/**
  * Retrieve generic object with all the misc store information values
  *
  * @param Store $store
  * @return DataObject
  */
 public function getStoreInformationObject(Store $store)
 {
     $info = new DataObject(['name' => $store->getConfig(self::XML_PATH_STORE_INFO_NAME), 'phone' => $store->getConfig(self::XML_PATH_STORE_INFO_PHONE), 'hours' => $store->getConfig(self::XML_PATH_STORE_INFO_HOURS), 'street_line1' => $store->getConfig(self::XML_PATH_STORE_INFO_STREET_LINE1), 'street_line2' => $store->getConfig(self::XML_PATH_STORE_INFO_STREET_LINE2), 'city' => $store->getConfig(self::XML_PATH_STORE_INFO_CITY), 'postcode' => $store->getConfig(self::XML_PATH_STORE_INFO_POSTCODE), 'region_id' => $store->getConfig(self::XML_PATH_STORE_INFO_REGION_CODE), 'country_id' => $store->getConfig(self::XML_PATH_STORE_INFO_COUNTRY_CODE), 'vat_number' => $store->getConfig(self::XML_PATH_STORE_INFO_VAT_NUMBER)]);
     if ($info->getRegionId()) {
         $info->setRegion($this->regionFactory->create()->load($info->getRegionId())->getName());
     }
     if ($info->getCountryId()) {
         $info->setCountry($this->countryFactory->create()->loadByCode($info->getCountryId())->getName());
     }
     return $info;
 }
Example #2
0
 /**
  * Prepare object for save
  *
  * @param \Magento\Framework\DataObject $object
  * @return $this
  */
 public function beforeSave($object)
 {
     $region = $object->getData('region');
     if (is_numeric($region)) {
         $regionModel = $this->_createRegionInstance();
         $regionModel->load($region);
         if ($regionModel->getId() && $object->getCountryId() == $regionModel->getCountryId()) {
             $object->setRegionId($regionModel->getId())->setRegion($regionModel->getName());
         }
     }
     return $this;
 }
 /**
  * Prepare existing row data object
  *
  * @param DataObject $row
  * @return void
  */
 protected function _prepareArrayRow(DataObject $row)
 {
     $country = $row->getCountryId();
     $options = [];
     if ($country) {
         $options['option_' . $this->getCountryRenderer()->calcOptionHash($country)] = 'selected="selected"';
         $ccTypes = $row->getCcTypes();
         foreach ($ccTypes as $cardType) {
             $options['option_' . $this->getCcTypesRenderer()->calcOptionHash($cardType)] = 'selected="selected"';
         }
     }
     $row->setData('option_extra_attrs', $options);
 }
 /**
  * Prepare existing row data object
  *
  * @param \Magento\Framework\DataObject $row
  * @return void
  */
 protected function _prepareArrayRow(\Magento\Framework\DataObject $row)
 {
     $country = $row->getCountryId();
     $options = [];
     if ($country) {
         $options['option_' . $this->getCountryRenderer()->calcOptionHash($country)] = 'selected="selected"';
         $ccTypes = $row->getCcTypes();
         if (!is_array($ccTypes)) {
             $ccTypes = [$ccTypes];
         }
         foreach ($ccTypes as $cardType) {
             $options['option_' . $this->getCcTypesRenderer()->calcOptionHash($cardType)] = 'selected="selected"';
         }
     }
     $row->setData('option_extra_attrs', $options);
     return;
 }
Example #5
0
 /**
  * Get billing address request data
  *
  * @param \Magento\Framework\DataObject $address
  * @return array
  * @SuppressWarnings(PHPMD.NPathComplexity)
  */
 protected function _getBillingAddress(\Magento\Framework\DataObject $address)
 {
     $region = $address->getRegionCode() ? $address->getRegionCode() : $address->getRegion();
     $request = ['billing_first_name' => $address->getFirstname(), 'billing_last_name' => $address->getLastname(), 'billing_city' => $address->getCity(), 'billing_state' => $region ? $region : $address->getCity(), 'billing_zip' => $address->getPostcode(), 'billing_country' => $address->getCountryId()];
     // convert streets to tow lines format
     $street = $this->_customerAddress->convertStreetLines($address->getStreet(), 2);
     $request['billing_address1'] = isset($street[0]) ? $street[0] : '';
     $request['billing_address2'] = isset($street[1]) ? $street[1] : '';
     return $request;
 }
Example #6
0
 /**
  * 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 \Magento\Framework\DataObject $request
  * @return array
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.NPathComplexity)
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 protected function _getRates($request)
 {
     // Extract params that influence our SELECT statement and use them to create cache key
     $storeId = $this->_storeManager->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 : [$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('|', [$storeId, $customerClassId, $productClassKey, $countryId, $regionId, $postcode]);
     if (!isset($this->_ratesCache[$cacheKey])) {
         // Make SELECT and get data
         $select = $this->getConnection()->select();
         $select->from(['main_table' => $this->getMainTable()], ['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->getConnection()->getCheckSql('title_table.value IS NULL', 'rate.code', 'title_table.value');
         $ruleTableAliasName = $this->getConnection()->quoteIdentifier('rule.tax_calculation_rule_id');
         $select->join(['rule' => $this->getTable('tax_calculation_rule')], $ruleTableAliasName . ' = main_table.tax_calculation_rule_id', ['rule.priority', 'rule.position', 'rule.calculate_subtotal'])->join(['rate' => $this->getTable('tax_calculation_rate')], 'rate.tax_calculation_rate_id = main_table.tax_calculation_rate_id', ['value' => 'rate.rate', 'rate.tax_country_id', 'rate.tax_region_id', 'rate.tax_postcode', 'rate.tax_calculation_rate_id', 'rate.code'])->joinLeft(['title_table' => $this->getTable('tax_calculation_rate_title')], "rate.tax_calculation_rate_id = title_table.tax_calculation_rate_id " . "AND title_table.store_id = '{$storeId}'", ['title' => $ifnullTitleValue])->where('rate.tax_country_id = ?', $countryId)->where("rate.tax_region_id IN(?)", [0, (int) $regionId]);
         $postcodeIsNumeric = is_numeric($postcode);
         $postcodeIsRange = false;
         $originalPostcode = null;
         if (is_string($postcode) && preg_match('/^(.+)-(.+)$/', $postcode, $matches)) {
             if ($countryId == self::USA_COUNTRY_CODE && is_numeric($matches[2]) && strlen($matches[2]) == 4) {
                 $postcodeIsNumeric = true;
                 $originalPostcode = $postcode;
                 $postcode = $matches[1];
             } else {
                 $postcodeIsRange = true;
                 $zipFrom = $matches[1];
                 $zipTo = $matches[2];
             }
         }
         if ($postcodeIsNumeric || $postcodeIsRange) {
             $selectClone = clone $select;
             $selectClone->where('rate.zip_is_range IS NOT NULL');
         }
         $select->where('rate.zip_is_range IS NULL');
         if ($postcode != '*' || $postcodeIsRange) {
             $select->where("rate.tax_postcode IS NULL OR rate.tax_postcode IN('*', '', ?)", $postcodeIsRange ? $postcode : $this->_createSearchPostCodeTemplates($postcode, $originalPostcode));
             if ($postcodeIsNumeric) {
                 $selectClone->where('? BETWEEN rate.zip_from AND rate.zip_to', $postcode);
             } elseif ($postcodeIsRange) {
                 $selectClone->where('rate.zip_from >= ?', $zipFrom)->where('rate.zip_to <= ?', $zipTo);
             }
         }
         /**
          * @see ZF-7592 issue http://framework.zend.com/issues/browse/ZF-7592
          */
         if ($postcodeIsNumeric || $postcodeIsRange) {
             $select = $this->getConnection()->select()->union(['(' . $select . ')', '(' . $selectClone . ')']);
         }
         $select->order('priority ' . \Magento\Framework\DB\Select::SQL_ASC)->order('tax_calculation_rule_id ' . \Magento\Framework\DB\Select::SQL_ASC)->order('tax_country_id ' . \Magento\Framework\DB\Select::SQL_DESC)->order('tax_region_id ' . \Magento\Framework\DB\Select::SQL_DESC)->order('tax_postcode ' . \Magento\Framework\DB\Select::SQL_DESC)->order('value ' . \Magento\Framework\DB\Select::SQL_DESC);
         $fetchResult = $this->getConnection()->fetchAll($select);
         $filteredRates = [];
         if ($fetchResult) {
             foreach ($fetchResult as $rate) {
                 if (!isset($filteredRates[$rate['tax_calculation_rate_id']])) {
                     $filteredRates[$rate['tax_calculation_rate_id']] = $rate;
                 }
             }
         }
         $this->_ratesCache[$cacheKey] = array_values($filteredRates);
     }
     return $this->_ratesCache[$cacheKey];
 }
 /**
  * Determine whether address is taxable, based on either country or region
  *
  * @param \Magento\Framework\DataObject $address
  * @param $storeId
  * @return bool
  */
 public function isAddressTaxable(\Magento\Framework\DataObject $address, $storeId)
 {
     $isTaxable = true;
     // Filtering just by country (not region)
     if (!$this->getFilterTaxByRegion($storeId)) {
         $countryFilters = explode(',', $this->getTaxCalculationCountriesEnabled($storeId));
         $countryId = $address->getCountryId();
         if (!in_array($countryId, $countryFilters)) {
             $isTaxable = false;
         }
         // Filtering by region within countries
     } else {
         $regionFilters = explode(',', $this->getRegionFilterList($storeId));
         $entityId = $address->getRegionId() ?: $address->getCountryId();
         if (!in_array($entityId, $regionFilters)) {
             $isTaxable = false;
         }
     }
     return $isTaxable;
 }
Example #8
0
 /**
  * @param DataObject $request
  * @param DataObject $shipping
  *
  * @return Object
  */
 public function setShipping($request, $shipping)
 {
     $request->setShiptofirstname($shipping->getFirstname())->setShiptolastname($shipping->getLastname())->setShiptostreet(implode(' ', $shipping->getStreet()))->setShiptocity($shipping->getCity())->setShiptostate($shipping->getRegionCode())->setShiptozip($shipping->getPostcode())->setShiptocountry($shipping->getCountryId());
     return $request;
 }
 /**
  * Get information about tax rates applied to request
  *
  * @param   \Magento\Framework\DataObject $request
  * @return  array
  */
 public function getAppliedRates($request)
 {
     if (!$request->getCountryId() || !$request->getCustomerClassId() || !$request->getProductClassId()) {
         return [];
     }
     $cacheKey = $this->_getRequestCacheKey($request);
     if (!isset($this->_rateCalculationProcess[$cacheKey])) {
         $this->_rateCalculationProcess[$cacheKey] = $this->_getResource()->getCalculationProcess($request);
     }
     return $this->_rateCalculationProcess[$cacheKey];
 }
Example #10
0
 /**
  * Adopt specified address object to be compatible with Magento
  *
  * @param \Magento\Framework\DataObject $address
  * @return void
  */
 protected function _applyStreetAndRegionWorkarounds(\Magento\Framework\DataObject $address)
 {
     // merge street addresses into 1
     if ($address->hasStreet2()) {
         $address->setStreet(implode("\n", [$address->getStreet(), $address->getStreetLine(2)]));
         $address->unsStreet2();
     }
     // attempt to fetch region_id from directory
     if ($address->getCountryId() && $address->getRegion()) {
         $regions = $this->_countryFactory->create()->loadByCode($address->getCountryId())->getRegionCollection()->addRegionCodeOrNameFilter($address->getRegion())->setPageSize(1);
         foreach ($regions as $region) {
             $address->setRegionId($region->getId());
             $address->setExportedKeys(array_merge($address->getExportedKeys(), ['region_id']));
             break;
         }
     }
 }
Example #11
0
 /**
  * Collect rates by address
  *
  * @param \Magento\Framework\DataObject $address
  * @param null|bool|array $limitCarrier
  * @return $this
  */
 public function collectRatesByAddress(\Magento\Framework\DataObject $address, $limitCarrier = null)
 {
     /** @var $request \Magento\Quote\Model\Quote\Address\RateRequest */
     $request = $this->_shipmentRequestFactory->create();
     $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($this->_storeManager->getStore()->getId());
     $request->setWebsiteId($this->_storeManager->getStore()->getWebsiteId());
     $request->setBaseCurrency($this->_storeManager->getStore()->getBaseCurrency());
     $request->setPackageCurrency($this->_storeManager->getStore()->getCurrentCurrency());
     $request->setLimitCarrier($limitCarrier);
     $request->setBaseSubtotalInclTax($address->getBaseSubtotalInclTax());
     return $this->collectRates($request);
 }