|
Apache/2.4.41 (Ubuntu) Linux vmi616275.contaboserver.net 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 uid=33(www-data) gid=33(www-data) groups=33(www-data) server ip : 62.171.164.128 | your ip : 127.0.0.1 safemode OFF > / home / dev2.destoffenstraat.com / app / code / Geissweb / Euvat / Model / Setup / |
Filename | /home/dev2.destoffenstraat.com/app/code/Geissweb/Euvat/Model/Setup/Tax.php |
Size | 17.52 kb |
Permission | rwxrwxrwx |
Owner | root : root |
Create time | 17-Aug-2025 10:26 |
Last modified | 09-Jul-2024 08:40 |
Last accessed | 22-Aug-2025 02:07 |
Actions | edit | rename | delete | download (gzip) |
View | text | code | image |
<?php
/**
* ||GEISSWEB| EU VAT Enhanced
*
* NOTICE OF LICENSE
*
* This source file is subject to the GEISSWEB End User License Agreement
* that is available through the world-wide-web at this URL: https://www.geissweb.de/legal-information/eula
*
* DISCLAIMER
*
* Do not edit this file if you wish to update the extension in the future. If you wish to customize the extension
* for your needs please refer to our support for more information.
*
* @copyright Copyright (c) 2015 GEISS Weblösungen (https://www.geissweb.de)
* @license https://www.geissweb.de/legal-information/eula GEISSWEB End User License Agreement
*/
declare(strict_types=1);
namespace Geissweb\Euvat\Model\Setup;
use Exception;
use Geissweb\Euvat\Helper\Setup;
use Geissweb\Euvat\Logger\Logger;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Customer\Model\ResourceModel\Group\CollectionFactory as CustGroupCollFactory;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\Message\Manager;
use Magento\Tax\Model\Calculation\Rate;
use Magento\Tax\Model\Calculation\RuleFactory;
use Magento\Tax\Model\TaxRuleRepository;
class Tax
{
public const TC_PRODUCTS_STANDARD = 1;
public const TC_PRODUCTS_REDUCED = 2;
public const TC_PRODUCTS_SHIPPING_STANDARD = 3;
public const TC_PRODUCTS_SHIPPING_REDUCED = 4;
public const TC_PRODUCTS_DIGITAL = 5;
public const TC_CUSTOMER_CONSUMER = 7;
public const TC_CUSTOMER_BUSINESS_DOMESTIC = 8;
public const TC_CUSTOMER_BUSINESS_EU = 9;
/**
* @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
*/
public CollectionFactory $productCollectionFactory;
/**
* @var \Magento\Customer\Model\ResourceModel\Group\CollectionFactory
*/
public CustGroupCollFactory $customerGroupCollectionFactory;
/**
* @var array
*/
public array $standardRateIds = [];
/**
* @var array
*/
public array $reducedRateIds = [];
/**
* @var array
*/
public array $digitalRateIds = [];
/**
* @var array
*/
public array $exemptRateIds = [];
/**
* @var \Magento\Config\Model\ResourceModel\Config
*/
protected Config $configResourceModel;
/**
* @var \Geissweb\Euvat\Helper\Setup
*/
protected Setup $setupHelper;
/**
* @var \Magento\Tax\Model\Calculation\RuleFactory
*/
protected RuleFactory $taxRuleFactory;
/**
* @var \Magento\Tax\Model\Calculation\Rate
*/
protected Rate $taxRateModel;
/**
* @var \Magento\Framework\App\ResourceConnection
*/
private ResourceConnection $resource;
/**
* @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\Magento\Framework\DB\Adapter\AdapterInterface
*/
private AdapterInterface $connection;
/**
* @var \Magento\Tax\Model\TaxRuleRepository
*/
private TaxRuleRepository $taxRuleRepository;
/**
* @var \Geissweb\Euvat\Logger\Logger
*/
private Logger $logger;
/**
* @var \Magento\Framework\Message\Manager
*/
private Manager $messageManager;
/**
* Tax constructor.
*
* @param Setup $euvatSetupHelper
* @param Logger $logger
* @param RuleFactory $taxCalculationRuleFactory
* @param TaxRuleRepository $taxRuleRepository
* @param Rate $taxCalculationRate
* @param ResourceConnection $resource
* @param Manager $messageManager
* @param Config $configResourceModel
* @param CollectionFactory $productCollectionFactory
* @param CustGroupCollFactory $customerGroupCollectionFactory
*/
public function __construct(
Setup $euvatSetupHelper,
Logger $logger,
RuleFactory $taxCalculationRuleFactory,
TaxRuleRepository $taxRuleRepository,
Rate $taxCalculationRate,
ResourceConnection $resource,
Manager $messageManager,
Config $configResourceModel,
CollectionFactory $productCollectionFactory,
CustGroupCollFactory $customerGroupCollectionFactory
) {
$this->configResourceModel = $configResourceModel;
$this->setupHelper = $euvatSetupHelper;
$this->logger = $logger;
$this->taxRuleFactory = $taxCalculationRuleFactory;
$this->taxRuleRepository = $taxRuleRepository;
$this->taxRateModel = $taxCalculationRate;
$this->productCollectionFactory = $productCollectionFactory;
$this->customerGroupCollectionFactory = $customerGroupCollectionFactory;
$this->resource = $resource;
$this->connection = $resource->getConnection('write');
$this->messageManager = $messageManager;
}
/**
* Clear config cache
*/
public function clearConfigCache(): void
{
$this->setupHelper->clearConfigCache();
}
/**
* Execute setup
*
* @param array $post
*
* @return bool
*/
public function runSetup(array $post): bool
{
try {
$this->logger->customLog('PostData:');
$this->logger->customLog(var_export($post, true));
if (isset($post['apply_store_config']) && $post['apply_store_config'] === '1') {
$this->logger->customLog('Apply store config.');
$this->applyStoreConfig(
$post['country'],
$post['license_key'],
$post['vat_number'],
$post['installation_type'],
$post['create_tax_rules'] === '1',
);
}
if (isset($post['create_tax_rules']) && $post['create_tax_rules'] === '1') {
$this->logger->customLog('Create Tax Rules.');
$this->truncateTable('tax_class');
$this->truncateTable('tax_calculation_rule');
$this->truncateTable('tax_calculation_rate');
$this->truncateTable('tax_calculation_rate_title');
$this->truncateTable('tax_calculation');
//Add tax classes
$this->logger->customLog('Creating Tax Classes.');
$this->addTaxClasses($this->setupHelper->getTaxClassesInsertArray());
//Add tax rates
$this->logger->customLog('Creating Tax Rates:');
$rates = $this->setupHelper->getTaxRatesInsertArray(
$post['country'],
(bool)$post['use_member_state_rate_standard'],
false, // (bool)$post[ 'use_digital_rule' ],
(bool)$post['use_reduced_rule'],
(float)$post['reduced_rate']
);
$this->logger->customLog(var_export($rates, true));
$this->addTaxRates($rates);
//Add tax rules
$this->logger->customLog('Creating Tax Rules.');
$this->addTaxRules(
(bool)$post['use_member_state_rate_standard'],
(bool)$post['use_reduced_rule']
);
//Update existing products and customer groups
$map = [];
foreach ($post as $key => $value) {
if (str_starts_with($key, 'p_')) {
$temp = explode('_', $key);
$map['product'][$temp[1]] = (int)$value;
} elseif (str_starts_with($key, 'c_')) {
$temp = explode('_', $key);
$map['customer'][$temp[1]] = (int)$value;
}
}
if (isset($map['product']) && is_array($map['product'])) {
$this->logger->customLog('Updating Product Tax Classes');
$this->logger->customLog(var_export($map['product'], true));
$this->updateProductTaxClasses($map['product']);
}
if (isset($map['customer']) && is_array($map['customer'])) {
$this->logger->customLog('Updating Customer Tax Classes');
$this->logger->customLog(var_export($map['customer'], true));
$this->updateCustomerGroupTaxClasses($map['customer']);
}
}
$this->logger->customLog('All Done!');
$this->setIsInstalled();
} catch (Exception $e) {
$this->messageManager->addErrorMessage($e, 'Error during Setup: ' . $e->getMessage());
$this->logger->critical($e);
return false;
}
return true;
}
/**
* Creates new tax classes
*
* @param array $classes
*/
private function addTaxClasses(array $classes): void
{
foreach ($classes as $keyId => $class) {
$this->insertIntoTable('tax_class', $class);
}
}
/**
* Creates new tax rates
*
* @param array $rates
*/
private function addTaxRates(array $rates): void
{
try {
$tableTaxCalcRate = $this->getTable('tax_calculation_rate');
foreach ($rates as $rate) {
//Insert rate
$this->connection->insert($tableTaxCalcRate, $rate);
$lastId = $this->getLastInsertId($tableTaxCalcRate);
//Sort rates for use in rules
if ($rate['rate'] == 0) { //intentional ==
$this->exemptRateIds[] = $lastId;
} elseif ($rate['rate'] > 14) {
$this->standardRateIds[] = $lastId;
} else {
$this->reducedRateIds[] = $lastId;
}
}
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Creates new tax rules
*
* @param bool $useMSRate
* @param bool $withReduced
* @param bool $withDigital
*
* @return void
*/
private function addTaxRules(bool $useMSRate = true, bool $withReduced = true, bool $withDigital = false): void
{
try {
/**@var $rule \Magento\Tax\Api\Data\TaxRuleInterface */
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy products with standard VAT")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_SHIPPING_STANDARD]);
$rule->setTaxRateIds($this->standardRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
if ($withReduced) {
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy products with reduced VAT")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_REDUCED, self::TC_PRODUCTS_SHIPPING_REDUCED]);
$rule->setTaxRateIds($this->reducedRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
}
if ($withDigital) {
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy digital products and services")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_DIGITAL]);
$rule->setTaxRateIds($this->digitalRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
}
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("EU Businesses buy VAT exempt")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_BUSINESS_EU]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_REDUCED,
self::TC_PRODUCTS_SHIPPING_STANDARD, self::TC_PRODUCTS_SHIPPING_REDUCED
]);
if ($withDigital) {
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_REDUCED,
self::TC_PRODUCTS_SHIPPING_STANDARD, self::TC_PRODUCTS_SHIPPING_REDUCED,
self::TC_PRODUCTS_DIGITAL
]);
}
$rule->setTaxRateIds($this->exemptRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Updates existing product tax classes
*
* @param array $map
* @return void
*/
private function updateProductTaxClasses(array $map): void
{
$this->logger->customLog("Using Map: " . var_export($map, true));
$this->configResourceModel->saveConfig(
'tax/classes/default_product_tax_class',
(string)self::TC_PRODUCTS_STANDARD,
'default'
);
/** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */
$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('tax_class_id');
$productCollection->load();
$this->logger->customLog('Selected '.count($productCollection->getItems()).' products');
/** @var \Magento\Catalog\Model\Product $product */
foreach ($productCollection->getItems() as $product) {
$classId = (int)$product->getData('tax_class_id');
$hasMapping = array_key_exists($classId, $map);
$classIdNeedsChange = ($hasMapping && $classId != $map[$classId]);
if ($hasMapping && $classIdNeedsChange) {
$this->logger->customLog("Updating " . $product->getSku());
$product->addAttributeUpdate('tax_class_id', $map[$classId], 0);
} else {
$this->logger->customLog(sprintf(
'Not mappable classId: %s @ %s | hasMapping: %s | needsChange: %s',
$classId,
$product->getSku(),
$hasMapping ? 'true' : 'false',
$classIdNeedsChange ? 'true' : 'false'
));
}
}
}
/**
* Updates existing customer group tax classes
*
* @param array $map
* @return void
*/
private function updateCustomerGroupTaxClasses(array $map): void
{
$this->configResourceModel->saveConfig(
'tax/classes/default_customer_tax_class',
(string)self::TC_CUSTOMER_CONSUMER,
'default'
);
$customerGroupGollection = $this->customerGroupCollectionFactory->create();
foreach ($customerGroupGollection as $customerGroup) {
if (array_key_exists($customerGroup->getTaxClassId(), $map)) {
$customerGroup->setTaxClassId($map[$customerGroup->getTaxClassId()]);
$customerGroup->save();
}
}
}
/**
* Sets the store config for EU VAT calculation
*
* @param string $baseCc
* @param string $key
* @param string $vatId
* @param string $installType
* @param boolean $withRules
*
* @return void
*/
private function applyStoreConfig(
string $baseCc,
string $key,
string $vatId,
string $installType,
bool $withRules
): void {
try {
$config = $this->setupHelper->getStoreConfigValues(
$baseCc,
$key,
$vatId,
$installType,
$withRules
);
foreach ($config as $path => $value) {
if ($this->setupHelper->functionsHelper->configHelper->isDebugEnabled()) {
$this->logger->customLog("saveConfig: $path :: $value (default scope 0)");
}
$this->configResourceModel->saveConfig($path, $value, 'default', 0);
}
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Sets installed config flag
*
* @return void
*/
public function setIsInstalled(): void
{
$this->configResourceModel->saveConfig('euvat/extension_info/is_installed', '1', 'default');
}
/**
* Get Table name
*
* @param string $tableAlias
*
* @return string
*/
private function getTable(string $tableAlias): string
{
return $this->resource->getTableName($tableAlias);
}
/**
* Empty table
*
* @param string $table
*
* @return void
*/
private function truncateTable(string $table): void
{
$tableName = $this->getTable($table);
$this->connection->delete($tableName);
}
/**
* Insert into table
*
* @param string $table
* @param array $data
*
* @return void
*/
private function insertIntoTable(string $table, array $data): void
{
$tableName = $this->getTable($table);
$this->connection->insert($tableName, $data);
}
/**
* Gets the last ID
*
* @param string $table
* @return int
*/
private function getLastInsertId(string $table): int
{
$tableName = $this->getTable($table);
return (int)$this->connection->lastInsertId($tableName);
}
}
/**
* ||GEISSWEB| EU VAT Enhanced
*
* NOTICE OF LICENSE
*
* This source file is subject to the GEISSWEB End User License Agreement
* that is available through the world-wide-web at this URL: https://www.geissweb.de/legal-information/eula
*
* DISCLAIMER
*
* Do not edit this file if you wish to update the extension in the future. If you wish to customize the extension
* for your needs please refer to our support for more information.
*
* @copyright Copyright (c) 2015 GEISS Weblösungen (https://www.geissweb.de)
* @license https://www.geissweb.de/legal-information/eula GEISSWEB End User License Agreement
*/
declare(strict_types=1);
namespace Geissweb\Euvat\Model\Setup;
use Exception;
use Geissweb\Euvat\Helper\Setup;
use Geissweb\Euvat\Logger\Logger;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Customer\Model\ResourceModel\Group\CollectionFactory as CustGroupCollFactory;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
use Magento\Framework\Message\Manager;
use Magento\Tax\Model\Calculation\Rate;
use Magento\Tax\Model\Calculation\RuleFactory;
use Magento\Tax\Model\TaxRuleRepository;
class Tax
{
public const TC_PRODUCTS_STANDARD = 1;
public const TC_PRODUCTS_REDUCED = 2;
public const TC_PRODUCTS_SHIPPING_STANDARD = 3;
public const TC_PRODUCTS_SHIPPING_REDUCED = 4;
public const TC_PRODUCTS_DIGITAL = 5;
public const TC_CUSTOMER_CONSUMER = 7;
public const TC_CUSTOMER_BUSINESS_DOMESTIC = 8;
public const TC_CUSTOMER_BUSINESS_EU = 9;
/**
* @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
*/
public CollectionFactory $productCollectionFactory;
/**
* @var \Magento\Customer\Model\ResourceModel\Group\CollectionFactory
*/
public CustGroupCollFactory $customerGroupCollectionFactory;
/**
* @var array
*/
public array $standardRateIds = [];
/**
* @var array
*/
public array $reducedRateIds = [];
/**
* @var array
*/
public array $digitalRateIds = [];
/**
* @var array
*/
public array $exemptRateIds = [];
/**
* @var \Magento\Config\Model\ResourceModel\Config
*/
protected Config $configResourceModel;
/**
* @var \Geissweb\Euvat\Helper\Setup
*/
protected Setup $setupHelper;
/**
* @var \Magento\Tax\Model\Calculation\RuleFactory
*/
protected RuleFactory $taxRuleFactory;
/**
* @var \Magento\Tax\Model\Calculation\Rate
*/
protected Rate $taxRateModel;
/**
* @var \Magento\Framework\App\ResourceConnection
*/
private ResourceConnection $resource;
/**
* @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\Magento\Framework\DB\Adapter\AdapterInterface
*/
private AdapterInterface $connection;
/**
* @var \Magento\Tax\Model\TaxRuleRepository
*/
private TaxRuleRepository $taxRuleRepository;
/**
* @var \Geissweb\Euvat\Logger\Logger
*/
private Logger $logger;
/**
* @var \Magento\Framework\Message\Manager
*/
private Manager $messageManager;
/**
* Tax constructor.
*
* @param Setup $euvatSetupHelper
* @param Logger $logger
* @param RuleFactory $taxCalculationRuleFactory
* @param TaxRuleRepository $taxRuleRepository
* @param Rate $taxCalculationRate
* @param ResourceConnection $resource
* @param Manager $messageManager
* @param Config $configResourceModel
* @param CollectionFactory $productCollectionFactory
* @param CustGroupCollFactory $customerGroupCollectionFactory
*/
public function __construct(
Setup $euvatSetupHelper,
Logger $logger,
RuleFactory $taxCalculationRuleFactory,
TaxRuleRepository $taxRuleRepository,
Rate $taxCalculationRate,
ResourceConnection $resource,
Manager $messageManager,
Config $configResourceModel,
CollectionFactory $productCollectionFactory,
CustGroupCollFactory $customerGroupCollectionFactory
) {
$this->configResourceModel = $configResourceModel;
$this->setupHelper = $euvatSetupHelper;
$this->logger = $logger;
$this->taxRuleFactory = $taxCalculationRuleFactory;
$this->taxRuleRepository = $taxRuleRepository;
$this->taxRateModel = $taxCalculationRate;
$this->productCollectionFactory = $productCollectionFactory;
$this->customerGroupCollectionFactory = $customerGroupCollectionFactory;
$this->resource = $resource;
$this->connection = $resource->getConnection('write');
$this->messageManager = $messageManager;
}
/**
* Clear config cache
*/
public function clearConfigCache(): void
{
$this->setupHelper->clearConfigCache();
}
/**
* Execute setup
*
* @param array $post
*
* @return bool
*/
public function runSetup(array $post): bool
{
try {
$this->logger->customLog('PostData:');
$this->logger->customLog(var_export($post, true));
if (isset($post['apply_store_config']) && $post['apply_store_config'] === '1') {
$this->logger->customLog('Apply store config.');
$this->applyStoreConfig(
$post['country'],
$post['license_key'],
$post['vat_number'],
$post['installation_type'],
$post['create_tax_rules'] === '1',
);
}
if (isset($post['create_tax_rules']) && $post['create_tax_rules'] === '1') {
$this->logger->customLog('Create Tax Rules.');
$this->truncateTable('tax_class');
$this->truncateTable('tax_calculation_rule');
$this->truncateTable('tax_calculation_rate');
$this->truncateTable('tax_calculation_rate_title');
$this->truncateTable('tax_calculation');
//Add tax classes
$this->logger->customLog('Creating Tax Classes.');
$this->addTaxClasses($this->setupHelper->getTaxClassesInsertArray());
//Add tax rates
$this->logger->customLog('Creating Tax Rates:');
$rates = $this->setupHelper->getTaxRatesInsertArray(
$post['country'],
(bool)$post['use_member_state_rate_standard'],
false, // (bool)$post[ 'use_digital_rule' ],
(bool)$post['use_reduced_rule'],
(float)$post['reduced_rate']
);
$this->logger->customLog(var_export($rates, true));
$this->addTaxRates($rates);
//Add tax rules
$this->logger->customLog('Creating Tax Rules.');
$this->addTaxRules(
(bool)$post['use_member_state_rate_standard'],
(bool)$post['use_reduced_rule']
);
//Update existing products and customer groups
$map = [];
foreach ($post as $key => $value) {
if (str_starts_with($key, 'p_')) {
$temp = explode('_', $key);
$map['product'][$temp[1]] = (int)$value;
} elseif (str_starts_with($key, 'c_')) {
$temp = explode('_', $key);
$map['customer'][$temp[1]] = (int)$value;
}
}
if (isset($map['product']) && is_array($map['product'])) {
$this->logger->customLog('Updating Product Tax Classes');
$this->logger->customLog(var_export($map['product'], true));
$this->updateProductTaxClasses($map['product']);
}
if (isset($map['customer']) && is_array($map['customer'])) {
$this->logger->customLog('Updating Customer Tax Classes');
$this->logger->customLog(var_export($map['customer'], true));
$this->updateCustomerGroupTaxClasses($map['customer']);
}
}
$this->logger->customLog('All Done!');
$this->setIsInstalled();
} catch (Exception $e) {
$this->messageManager->addErrorMessage($e, 'Error during Setup: ' . $e->getMessage());
$this->logger->critical($e);
return false;
}
return true;
}
/**
* Creates new tax classes
*
* @param array $classes
*/
private function addTaxClasses(array $classes): void
{
foreach ($classes as $keyId => $class) {
$this->insertIntoTable('tax_class', $class);
}
}
/**
* Creates new tax rates
*
* @param array $rates
*/
private function addTaxRates(array $rates): void
{
try {
$tableTaxCalcRate = $this->getTable('tax_calculation_rate');
foreach ($rates as $rate) {
//Insert rate
$this->connection->insert($tableTaxCalcRate, $rate);
$lastId = $this->getLastInsertId($tableTaxCalcRate);
//Sort rates for use in rules
if ($rate['rate'] == 0) { //intentional ==
$this->exemptRateIds[] = $lastId;
} elseif ($rate['rate'] > 14) {
$this->standardRateIds[] = $lastId;
} else {
$this->reducedRateIds[] = $lastId;
}
}
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Creates new tax rules
*
* @param bool $useMSRate
* @param bool $withReduced
* @param bool $withDigital
*
* @return void
*/
private function addTaxRules(bool $useMSRate = true, bool $withReduced = true, bool $withDigital = false): void
{
try {
/**@var $rule \Magento\Tax\Api\Data\TaxRuleInterface */
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy products with standard VAT")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_SHIPPING_STANDARD]);
$rule->setTaxRateIds($this->standardRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
if ($withReduced) {
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy products with reduced VAT")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_REDUCED, self::TC_PRODUCTS_SHIPPING_REDUCED]);
$rule->setTaxRateIds($this->reducedRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
}
if ($withDigital) {
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("Consumers buy digital products and services")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_CONSUMER, self::TC_CUSTOMER_BUSINESS_DOMESTIC]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_DIGITAL]);
$rule->setTaxRateIds($this->digitalRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
}
$rule = $this->taxRuleFactory->create();
$rule->setCode(__("EU Businesses buy VAT exempt")->render());
$rule->setCustomerTaxClassIds([self::TC_CUSTOMER_BUSINESS_EU]);
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_REDUCED,
self::TC_PRODUCTS_SHIPPING_STANDARD, self::TC_PRODUCTS_SHIPPING_REDUCED
]);
if ($withDigital) {
$rule->setProductTaxClassIds([self::TC_PRODUCTS_STANDARD, self::TC_PRODUCTS_REDUCED,
self::TC_PRODUCTS_SHIPPING_STANDARD, self::TC_PRODUCTS_SHIPPING_REDUCED,
self::TC_PRODUCTS_DIGITAL
]);
}
$rule->setTaxRateIds($this->exemptRateIds);
$rule->setPosition(0);
$rule->setPriority(0);
$this->taxRuleRepository->save($rule);
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Updates existing product tax classes
*
* @param array $map
* @return void
*/
private function updateProductTaxClasses(array $map): void
{
$this->logger->customLog("Using Map: " . var_export($map, true));
$this->configResourceModel->saveConfig(
'tax/classes/default_product_tax_class',
(string)self::TC_PRODUCTS_STANDARD,
'default'
);
/** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $productCollection */
$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('tax_class_id');
$productCollection->load();
$this->logger->customLog('Selected '.count($productCollection->getItems()).' products');
/** @var \Magento\Catalog\Model\Product $product */
foreach ($productCollection->getItems() as $product) {
$classId = (int)$product->getData('tax_class_id');
$hasMapping = array_key_exists($classId, $map);
$classIdNeedsChange = ($hasMapping && $classId != $map[$classId]);
if ($hasMapping && $classIdNeedsChange) {
$this->logger->customLog("Updating " . $product->getSku());
$product->addAttributeUpdate('tax_class_id', $map[$classId], 0);
} else {
$this->logger->customLog(sprintf(
'Not mappable classId: %s @ %s | hasMapping: %s | needsChange: %s',
$classId,
$product->getSku(),
$hasMapping ? 'true' : 'false',
$classIdNeedsChange ? 'true' : 'false'
));
}
}
}
/**
* Updates existing customer group tax classes
*
* @param array $map
* @return void
*/
private function updateCustomerGroupTaxClasses(array $map): void
{
$this->configResourceModel->saveConfig(
'tax/classes/default_customer_tax_class',
(string)self::TC_CUSTOMER_CONSUMER,
'default'
);
$customerGroupGollection = $this->customerGroupCollectionFactory->create();
foreach ($customerGroupGollection as $customerGroup) {
if (array_key_exists($customerGroup->getTaxClassId(), $map)) {
$customerGroup->setTaxClassId($map[$customerGroup->getTaxClassId()]);
$customerGroup->save();
}
}
}
/**
* Sets the store config for EU VAT calculation
*
* @param string $baseCc
* @param string $key
* @param string $vatId
* @param string $installType
* @param boolean $withRules
*
* @return void
*/
private function applyStoreConfig(
string $baseCc,
string $key,
string $vatId,
string $installType,
bool $withRules
): void {
try {
$config = $this->setupHelper->getStoreConfigValues(
$baseCc,
$key,
$vatId,
$installType,
$withRules
);
foreach ($config as $path => $value) {
if ($this->setupHelper->functionsHelper->configHelper->isDebugEnabled()) {
$this->logger->customLog("saveConfig: $path :: $value (default scope 0)");
}
$this->configResourceModel->saveConfig($path, $value, 'default', 0);
}
} catch (Exception $e) {
$this->logger->critical($e);
}
}
/**
* Sets installed config flag
*
* @return void
*/
public function setIsInstalled(): void
{
$this->configResourceModel->saveConfig('euvat/extension_info/is_installed', '1', 'default');
}
/**
* Get Table name
*
* @param string $tableAlias
*
* @return string
*/
private function getTable(string $tableAlias): string
{
return $this->resource->getTableName($tableAlias);
}
/**
* Empty table
*
* @param string $table
*
* @return void
*/
private function truncateTable(string $table): void
{
$tableName = $this->getTable($table);
$this->connection->delete($tableName);
}
/**
* Insert into table
*
* @param string $table
* @param array $data
*
* @return void
*/
private function insertIntoTable(string $table, array $data): void
{
$tableName = $this->getTable($table);
$this->connection->insert($tableName, $data);
}
/**
* Gets the last ID
*
* @param string $table
* @return int
*/
private function getLastInsertId(string $table): int
{
$tableName = $this->getTable($table);
return (int)$this->connection->lastInsertId($tableName);
}
}