123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Tax\Model\Calculation;
- use Magento\Directory\Model\Region;
- use Magento\Framework\Api\AttributeValueFactory;
- use Magento\Framework\Exception\CouldNotDeleteException;
- use Magento\Tax\Api\Data\TaxRateInterface;
- /**
- * Tax Rate Model
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Rate extends \Magento\Framework\Model\AbstractExtensibleModel implements TaxRateInterface
- {
- /**#@+
- * Constants defined for keys of array, makes typos less likely
- */
- const KEY_ID = 'id';
- const KEY_COUNTRY_ID = 'tax_country_id';
- const KEY_REGION_ID = 'tax_region_id';
- const KEY_REGION_NAME = 'region_name';
- const KEY_POSTCODE = 'tax_postcode';
- const KEY_ZIP_IS_RANGE = 'zip_is_range';
- const KEY_ZIP_RANGE_FROM = 'zip_from';
- const KEY_ZIP_RANGE_TO = 'zip_to';
- const KEY_PERCENTAGE_RATE = 'rate';
- const KEY_CODE = 'code';
- const KEY_TITLES = 'titles';
- /**#@-*/
- /**#@-*/
- protected $_titles = null;
- /**
- * @var \Magento\Tax\Model\Calculation\Rate\Title
- */
- protected $_titleModel = null;
- /**
- * @var \Magento\Directory\Model\RegionFactory
- */
- protected $_regionFactory;
- /**
- * @var \Magento\Tax\Model\Calculation\Rate\TitleFactory
- */
- protected $_titleFactory;
- /**
- * @var Region
- */
- protected $directoryRegion;
- /**
- * @param \Magento\Framework\Model\Context $context
- * @param \Magento\Framework\Registry $registry
- * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
- * @param AttributeValueFactory $customAttributeFactory
- * @param \Magento\Directory\Model\RegionFactory $regionFactory
- * @param Rate\TitleFactory $taxTitleFactory
- * @param Region $directoryRegion
- * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
- * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
- * @param array $data
- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
- */
- public function __construct(
- \Magento\Framework\Model\Context $context,
- \Magento\Framework\Registry $registry,
- \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
- AttributeValueFactory $customAttributeFactory,
- \Magento\Directory\Model\RegionFactory $regionFactory,
- \Magento\Tax\Model\Calculation\Rate\TitleFactory $taxTitleFactory,
- Region $directoryRegion,
- \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
- \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
- array $data = []
- ) {
- $this->_regionFactory = $regionFactory;
- $this->_titleFactory = $taxTitleFactory;
- $this->directoryRegion = $directoryRegion;
- parent::__construct(
- $context,
- $registry,
- $extensionFactory,
- $customAttributeFactory,
- $resource,
- $resourceCollection,
- $data
- );
- }
- /**
- * Magento model constructor
- *
- * @return void
- */
- protected function _construct()
- {
- $this->_init(\Magento\Tax\Model\ResourceModel\Calculation\Rate::class);
- }
- /**
- * Prepare location settings and tax postcode before save rate
- *
- * @return \Magento\Tax\Model\Calculation\Rate
- * @throws \Magento\Framework\Exception\LocalizedException
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- */
- public function beforeSave()
- {
- $isWrongRange = $this->getZipIsRange() && ($this->getZipFrom() === '' || $this->getZipTo() === '');
- $isEmptyValues = $this->getCode() === '' ||
- $this->getTaxCountryId() === '' ||
- $this->getRate() === '' ||
- ($this->getTaxPostcode() === '' && !$this->getZipIsRange());
- if ($isEmptyValues || $isWrongRange) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The required information is invalid. Verify the information and try again.')
- );
- }
- if (!is_numeric($this->getRate()) || $this->getRate() < 0) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The Rate Percent is invalid. Enter a positive number and try again.')
- );
- }
- if ($this->getZipIsRange()) {
- $zipFrom = $this->getZipFrom();
- $zipTo = $this->getZipTo();
- if (strlen($zipFrom) > 9 || strlen($zipTo) > 9) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __(
- 'The ZIP Code length is invalid. '
- . 'Verify that the length is nine characters or fewer and try again.'
- )
- );
- }
- if (!is_numeric($zipFrom) || !is_numeric($zipTo) || $zipFrom < 0 || $zipTo < 0) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('The ZIP Code is invalid. Use numbers only.')
- );
- }
- if ($zipFrom > $zipTo) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('Range To should be equal or greater than Range From.')
- );
- }
- $this->setTaxPostcode($zipFrom . '-' . $zipTo);
- } else {
- $taxPostCode = $this->getTaxPostcode();
- if (strlen($taxPostCode) > 10) {
- $taxPostCode = substr($taxPostCode, 0, 10);
- }
- $this->setTaxPostcode($taxPostCode)->setZipIsRange(null)->setZipFrom(null)->setZipTo(null);
- }
- parent::beforeSave();
- $country = $this->getTaxCountryId();
- $region = $this->getTaxRegionId();
- /** @var $regionModel \Magento\Directory\Model\Region */
- $regionModel = $this->_regionFactory->create();
- $regionModel->load($region);
- if ($regionModel->getCountryId() != $country) {
- $this->setTaxRegionId('*');
- }
- return $this;
- }
- /**
- * Save rate titles
- *
- * @return \Magento\Tax\Model\Calculation\Rate
- */
- public function afterSave()
- {
- $this->saveTitles();
- $this->_eventManager->dispatch('tax_settings_change_after');
- return parent::afterSave();
- }
- /**
- * Processing object before delete data
- *
- * @return \Magento\Tax\Model\Calculation\Rate
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function beforeDelete()
- {
- if ($this->_isInRule()) {
- throw new CouldNotDeleteException(
- __("The tax rate can't be removed because it exists in a tax rule.")
- );
- }
- return parent::beforeDelete();
- }
- /**
- * After rate delete
- * redeclared for dispatch tax_settings_change_after event
- *
- * @return \Magento\Tax\Model\Calculation\Rate
- */
- public function afterDelete()
- {
- $this->_eventManager->dispatch('tax_settings_change_after');
- return parent::afterDelete();
- }
- /**
- * Saves the tax titles
- *
- * @param array|null $titles
- * @return void
- */
- public function saveTitles($titles = null)
- {
- if ($titles === null) {
- $titles = $this->getTitle();
- }
- $this->getTitleModel()->deleteByRateId($this->getId());
- if (is_array($titles) && $titles) {
- foreach ($titles as $store => $title) {
- if ($title !== '') {
- $this->getTitleModel()->setId(
- null
- )->setTaxCalculationRateId(
- $this->getId()
- )->setStoreId(
- (int)$store
- )->setValue(
- $title
- )->save();
- }
- }
- }
- }
- /**
- * Returns a tax title
- *
- * @return \Magento\Tax\Model\Calculation\Rate\Title
- */
- public function getTitleModel()
- {
- if ($this->_titleModel === null) {
- $this->_titleModel = $this->_titleFactory->create();
- }
- return $this->_titleModel;
- }
- /**
- * {@inheritdoc}
- */
- public function getTitles()
- {
- if ($this->getData(self::KEY_TITLES)) {
- return $this->getData(self::KEY_TITLES);
- }
- if ($this->_titles === null) {
- $this->_titles = $this->getTitleModel()->getCollection()->loadByRateId($this->getId())->getItems();
- }
- return $this->_titles;
- }
- /**
- * Deletes all tax rates
- *
- * @return \Magento\Tax\Model\Calculation\Rate
- */
- public function deleteAllRates()
- {
- $this->_getResource()->deleteAllRates();
- $this->_eventManager->dispatch('tax_settings_change_after');
- return $this;
- }
- /**
- * Load rate model by code
- *
- * @param string $code
- * @return \Magento\Tax\Model\Calculation\Rate
- */
- public function loadByCode($code)
- {
- $this->load($code, 'code');
- return $this;
- }
- /**
- * Check if rate exists in tax rule
- *
- * @return array
- */
- protected function _isInRule()
- {
- return $this->getResource()->isInRule($this->getId());
- }
- /**
- * {@inheritdoc}
- */
- public function getRegionName()
- {
- if (!$this->getData(self::KEY_REGION_NAME)) {
- $regionName = $this->directoryRegion->load($this->getTaxRegionId())->getCode();
- $this->setData(self::KEY_REGION_NAME, $regionName);
- }
- return $this->getData(self::KEY_REGION_NAME);
- }
- /**
- * @codeCoverageIgnoreStart
- * {@inheritdoc}
- */
- public function getTaxCalculationRateId()
- {
- return $this->getData(self::KEY_ID);
- }
- /**
- * {@inheritdoc}
- */
- public function getTaxCountryId()
- {
- return $this->getData(self::KEY_COUNTRY_ID);
- }
- /**
- * {@inheritdoc}
- */
- public function getTaxRegionId()
- {
- return $this->getData(self::KEY_REGION_ID);
- }
- /**
- * {@inheritdoc}
- */
- public function getTaxPostcode()
- {
- return $this->getData(self::KEY_POSTCODE);
- }
- /**
- * {@inheritdoc}
- */
- public function getZipFrom()
- {
- return $this->getData(self::KEY_ZIP_RANGE_FROM);
- }
- /**
- * {@inheritdoc}
- */
- public function getZipTo()
- {
- return $this->getData(self::KEY_ZIP_RANGE_TO);
- }
- /**
- * {@inheritdoc}
- */
- public function getRate()
- {
- return $this->getData(self::KEY_PERCENTAGE_RATE);
- }
- /**
- * {@inheritdoc}
- */
- public function getCode()
- {
- return $this->getData(self::KEY_CODE);
- }
- /**
- * {@inheritdoc}
- */
- public function getZipIsRange()
- {
- return $this->getData(self::KEY_ZIP_IS_RANGE);
- }
- /**
- * Set country id
- *
- * @param string $taxCountryId
- * @return $this
- */
- public function setTaxCountryId($taxCountryId)
- {
- return $this->setData(self::KEY_COUNTRY_ID, $taxCountryId);
- }
- /**
- * Set region id
- *
- * @param int $taxRegionId
- * @return $this
- */
- public function setTaxRegionId($taxRegionId)
- {
- return $this->setData(self::KEY_REGION_ID, $taxRegionId);
- }
- /**
- * Set region name
- *
- * @param string $regionName
- * @return $this
- */
- public function setRegionName($regionName)
- {
- return $this->setData(self::KEY_REGION_NAME, $regionName);
- }
- /**
- * Set postcode
- *
- * @param string $taxPostCode
- * @return $this
- */
- public function setTaxPostcode($taxPostCode)
- {
- return $this->setData(self::KEY_POSTCODE, $taxPostCode);
- }
- /**
- * Set zip is range
- *
- * @param int $zipIsRange
- * @return $this
- */
- public function setZipIsRange($zipIsRange)
- {
- return $this->setData(self::KEY_ZIP_IS_RANGE, $zipIsRange);
- }
- /**
- * Set zip range from
- *
- * @param int $zipFrom
- * @return $this
- */
- public function setZipFrom($zipFrom)
- {
- return $this->setData(self::KEY_ZIP_RANGE_FROM, $zipFrom);
- }
- /**
- * Set zip range to
- *
- * @param int $zipTo
- * @return $this
- */
- public function setZipTo($zipTo)
- {
- return $this->setData(self::KEY_ZIP_RANGE_TO, $zipTo);
- }
- /**
- * Set tax rate in percentage
- *
- * @param float $rate
- * @return $this
- */
- public function setRate($rate)
- {
- return $this->setData(self::KEY_PERCENTAGE_RATE, $rate);
- }
- /**
- * Set tax rate code
- *
- * @param string $code
- * @return $this
- */
- public function setCode($code)
- {
- return $this->setData(self::KEY_CODE, $code);
- }
- /**
- * Set tax rate titles
- *
- * @param \Magento\Tax\Api\Data\TaxRateTitleInterface[] $titles
- * @return $this
- */
- public function setTitles(array $titles = null)
- {
- return $this->setData(self::KEY_TITLES, $titles);
- }
- // @codeCoverageIgnoreEnd
- /**
- * {@inheritdoc}
- *
- * @return \Magento\Tax\Api\Data\TaxRateExtensionInterface|null
- */
- public function getExtensionAttributes()
- {
- return $this->_getExtensionAttributes();
- }
- /**
- * {@inheritdoc}
- *
- * @param \Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes
- * @return $this
- */
- public function setExtensionAttributes(\Magento\Tax\Api\Data\TaxRateExtensionInterface $extensionAttributes)
- {
- return $this->_setExtensionAttributes($extensionAttributes);
- }
- }
|