diff --git a/app/code/Magento/CatalogRule/Model/Rule.php b/app/code/Magento/CatalogRule/Model/Rule.php index 859dbb110dec4a5962ab2e7fa8a5c1914b53166a..ff05ab857f3be04a6769137d3a6d89cf184b26c3 100644 --- a/app/code/Magento/CatalogRule/Model/Rule.php +++ b/app/code/Magento/CatalogRule/Model/Rule.php @@ -347,6 +347,58 @@ class Rule extends \Magento\Rule\Model\AbstractModel return $map; } + /** + * {@inheritdoc} + */ + public function validateData(\Magento\Framework\DataObject $dataObject) + { + $result = parent::validateData($dataObject); + if ($result === true) { + $result = []; + } + + $action = $dataObject->getData('simple_action'); + $discount = $dataObject->getData('discount_amount'); + $result = array_merge($result, $this->validateDiscount($action, $discount)); + if ($dataObject->getData('sub_is_enable') == 1) { + $action = $dataObject->getData('sub_simple_action'); + $discount = $dataObject->getData('sub_discount_amount'); + $result = array_merge($result, $this->validateDiscount($action, $discount)); + } + + return !empty($result) ? $result : true; + } + + /** + * Validate discount based on action + * + * @param string $action + * @param string|int|float $discount + * + * @return array Validation errors + */ + protected function validateDiscount($action, $discount) + { + $result = []; + switch ($action) { + case 'by_percent': + case 'to_percent': + if ($discount < 0 || $discount > 100) { + $result[] = __('Percentage discount should be between 0 and 100.'); + }; + break; + case 'by_fixed': + case 'to_fixed': + if ($discount < 0) { + $result[] = __('Discount value should be 0 or greater.'); + }; + break; + default: + $result[] = __('Unknown action.'); + } + return $result; + } + /** * Calculate price using catalog price rule of product * diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php index dbf6958530ac87af19504c393fc8fae0765b7d08..80f4ef5eed5ece794faef9fdc4b19f22ca4bb9af 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php @@ -8,6 +8,11 @@ namespace Magento\CatalogRule\Test\Unit\Model; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +/** + * Class RuleTest + * @package Magento\CatalogRule\Test\Unit\Model + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class RuleTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\CatalogRule\Model\Rule */ @@ -200,6 +205,110 @@ class RuleTest extends \PHPUnit_Framework_TestCase ]; } + /** + * Test validateData action + * + * @dataProvider validateDataDataProvider + * @param array $data Data for the rule actions + * @param bool|array $expected True or an array of errors + * + * @return void + */ + public function testValidateData($data, $expected) + { + $result = $this->rule->validateData(new \Magento\Framework\DataObject($data)); + $this->assertEquals($result, $expected); + } + + /** + * Data provider for testValidateData test + * + * @return array + */ + public function validateDataDataProvider() + { + return [ + [ + [ + 'simple_action' => 'by_fixed', + 'discount_amount' => '123', + 'sub_is_enable' => '0', + 'sub_simple_action' => 'by_percent', + 'sub_discount_amount' => '123', + ], + true + ], + [ + [ + 'simple_action' => 'by_percent', + 'discount_amount' => '9,99', + 'sub_is_enable' => '0', + ], + true + ], + [ + [ + 'simple_action' => 'by_fixed', + 'discount_amount' => '123', + 'sub_is_enable' => '1', + 'sub_simple_action' => 'by_percent', + 'sub_discount_amount' => '123', + ], + [ + 'Percentage discount should be between 0 and 100.', + ] + ], + [ + [ + 'simple_action' => 'by_percent', + 'discount_amount' => '123.12', + 'sub_is_enable' => '1', + 'sub_simple_action' => 'to_percent', + 'sub_discount_amount' => '123.001', + ], + [ + 'Percentage discount should be between 0 and 100.', + 'Percentage discount should be between 0 and 100.', + ] + ], + [ + [ + 'simple_action' => 'to_percent', + 'discount_amount' => '-12', + 'sub_is_enable' => '1', + 'sub_simple_action' => 'to_fixed', + 'sub_discount_amount' => '567.8901', + ], + [ + 'Percentage discount should be between 0 and 100.', + ] + ], + [ + [ + 'simple_action' => 'to_fixed', + 'discount_amount' => '-1234567890', + 'sub_is_enable' => '1', + 'sub_simple_action' => 'by_fixed', + 'sub_discount_amount' => '-5', + ], + [ + 'Discount value should be 0 or greater.', + 'Discount value should be 0 or greater.', + ] + ], + [ + [ + 'simple_action' => 'invalid action', + 'discount_amount' => '12', + 'sub_is_enable' => '0', + ], + [ + 'Unknown action.', + ] + ], + ]; + } + /** * Test after delete action * @@ -228,9 +337,10 @@ class RuleTest extends \PHPUnit_Framework_TestCase } /** - * Test IsRuleBehaviorChanged action + * Test isRuleBehaviorChanged action + * + * @dataProvider isRuleBehaviorChangedDataProvider * - * @dataProvider ruleData * @param array $dataArray * @param array $originDataArray * @param bool $isObjectNew @@ -258,11 +368,11 @@ class RuleTest extends \PHPUnit_Framework_TestCase } /** - * Data provider for isRuleBehaviorChanged test + * Data provider for testIsRuleBehaviorChanged test * * @return array */ - public function ruleData() + public function isRuleBehaviorChangedDataProvider() { return [ [['new name', 'new description'], ['name', 'description'], false, false], diff --git a/app/code/Magento/CatalogRule/i18n/de_DE.csv b/app/code/Magento/CatalogRule/i18n/de_DE.csv index e5ac9c2fcdef8bfac205f90ab801001bc731ec19..2cfceb25ae29b3c8535b66e5a14384de4ee0a623 100644 --- a/app/code/Magento/CatalogRule/i18n/de_DE.csv +++ b/app/code/Magento/CatalogRule/i18n/de_DE.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination",Bedingungenkombination "Product Attribute",Produktattribut "The rules have been applied.","Die Regeln wurden angewendet." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/en_US.csv b/app/code/Magento/CatalogRule/i18n/en_US.csv index aab29051ead73af95b6155cd2734ec5621db5de7..2a931e8b33161f90787eaca154c140360a6aeac1 100644 --- a/app/code/Magento/CatalogRule/i18n/en_US.csv +++ b/app/code/Magento/CatalogRule/i18n/en_US.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination","Conditions Combination" "Product Attribute","Product Attribute" "The rules have been applied.","The rules have been applied." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/es_ES.csv b/app/code/Magento/CatalogRule/i18n/es_ES.csv index f49ec6eddb9d3f9645b141d375657d399f18ab7e..acd65c67ccdb2b5e26b074cc87412e51835fed7f 100644 --- a/app/code/Magento/CatalogRule/i18n/es_ES.csv +++ b/app/code/Magento/CatalogRule/i18n/es_ES.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination","Combinación de condiciones" "Product Attribute","Atributos del producto" "The rules have been applied.","Las reglas han sido aplicadas." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/fr_FR.csv b/app/code/Magento/CatalogRule/i18n/fr_FR.csv index f003629331ba8db57eff2ab85cb70a5a8c1f8b3e..5349ab2025341e751ea891d5601a411d55d94c40 100644 --- a/app/code/Magento/CatalogRule/i18n/fr_FR.csv +++ b/app/code/Magento/CatalogRule/i18n/fr_FR.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination","Combinaison de conditions" "Product Attribute","Attribut de produit" "The rules have been applied.","Les règles ont été appliquées." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/nl_NL.csv b/app/code/Magento/CatalogRule/i18n/nl_NL.csv index 5c21f95f6eabba150428a7c51edb4102bb6ad582..6bc287b3c44cea7d6d72af7aaf9882652d415197 100644 --- a/app/code/Magento/CatalogRule/i18n/nl_NL.csv +++ b/app/code/Magento/CatalogRule/i18n/nl_NL.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination",Voorwaardencombinaties "Product Attribute","Product attribuut" "The rules have been applied.","De regels zijn ingesteld." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/pt_BR.csv b/app/code/Magento/CatalogRule/i18n/pt_BR.csv index 39db9b3f737aa1b8037bc0967117f1c7ced1ef3f..77c2c40996739516e7fd8849a8e246462bd59b1a 100644 --- a/app/code/Magento/CatalogRule/i18n/pt_BR.csv +++ b/app/code/Magento/CatalogRule/i18n/pt_BR.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination","Combinação de condições" "Product Attribute","Atributo de Produto" "The rules have been applied.","As regras foram aplicadas." +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/i18n/zh_CN.csv b/app/code/Magento/CatalogRule/i18n/zh_CN.csv index 4d291b895c161b9428069c891c095eea0d5933bb..e1fe27f48fbf548174ad16348e1f547747c26cf8 100644 --- a/app/code/Magento/CatalogRule/i18n/zh_CN.csv +++ b/app/code/Magento/CatalogRule/i18n/zh_CN.csv @@ -68,3 +68,6 @@ Promo,Promo "Conditions Combination",æ¡ä»¶ç»„åˆ "Product Attribute",产å“属性 "The rules have been applied.",规则已应用。 +"Percentage discount should be between 0 and 100.","Percentage discount should be between 0 and 100." +"Discount value should be 0 or greater.","Discount value should be 0 or greater." +"Unknown action.","Unknown action." diff --git a/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml b/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml index 8e87adac441dbf88047073fbf9044fbe4c2ecdd1..a3604faa6d38ccf46a41fa16145bc1a8b5fea6c3 100644 --- a/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml +++ b/app/code/Magento/CatalogRule/view/adminhtml/templates/promo/js.phtml @@ -13,15 +13,53 @@ function hideShowSubproductOptions() $('rule_sub_simple_action').up('div.field').show(); $('rule_sub_discount_amount').up('div.field').show(); $('rule_sub_discount_amount').addClassName('required-entry validate-not-negative-number'); + changeValidationForSubDiscountPercent(); } else { + $('rule_sub_discount_amount'). + removeClassName('required-entry'). + removeClassName('validate-not-negative-number'). + removeClassName('validate-number-range'). + removeClassName('number-range-0.00-100.00'); $('rule_sub_simple_action').up('div.field').hide(); $('rule_sub_discount_amount').up('div.field').hide(); - $('rule_sub_discount_amount').removeClassName('required-entry').removeClassName('validate-not-negative-number'); } return true; } + +function changeValidationForDiscountPercent() +{ + if ($('rule_simple_action').value == 'by_percent' || $('rule_simple_action').value == 'to_percent') { + $('rule_discount_amount').addClassName('validate-number-range number-range-0.00-100.00'); + } else { + $('rule_discount_amount').removeClassName('validate-number-range').removeClassName('number-range-0.00-100.00'); + } + + return true; +} + +function changeValidationForSubDiscountPercent() +{ + if ($('rule_sub_is_enable').value == 1) { + if ($('rule_sub_simple_action').value == 'by_percent' || $('rule_sub_simple_action').value == 'to_percent') { + $('rule_sub_discount_amount').addClassName('validate-number-range number-range-0.00-100.00'); + } else { + $('rule_sub_discount_amount'). + removeClassName('validate-number-range'). + removeClassName('number-range-0.00-100.00'); + } + } + + return true; +} + jQuery(document).ready(hideShowSubproductOptions); +jQuery(document).ready(changeValidationForDiscountPercent); +jQuery(document).on('change', '#rule_sub_is_enable', hideShowSubproductOptions); +jQuery(document).on('change', '#rule_simple_action', changeValidationForDiscountPercent); +jQuery(document).on('change', '#rule_sub_simple_action', changeValidationForSubDiscountPercent); window.hideShowSubproductOptions = hideShowSubproductOptions; +window.changeValidationForDiscountPercent = changeValidationForDiscountPercent; +window.changeValidationForSubDiscountPercent = changeValidationForSubDiscountPercent; }); </script> diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index 988a9e2beca59c3b12da13a0123e2b7b858778a6..20bb67ca0632c708946d9961f22099b1f810128a 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -350,19 +350,19 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel /** * Validate rule data * - * @param \Magento\Framework\DataObject $object + * @param \Magento\Framework\DataObject $dataObject * @return bool|string[] - return true if validation passed successfully. Array with errors description otherwise * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function validateData(\Magento\Framework\DataObject $object) + public function validateData(\Magento\Framework\DataObject $dataObject) { $result = []; $fromDate = $toDate = null; - if ($object->hasFromDate() && $object->hasToDate()) { - $fromDate = $object->getFromDate(); - $toDate = $object->getToDate(); + if ($dataObject->hasFromDate() && $dataObject->hasToDate()) { + $fromDate = $dataObject->getFromDate(); + $toDate = $dataObject->getToDate(); } if ($fromDate && $toDate) { @@ -374,14 +374,14 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel } } - if ($object->hasWebsiteIds()) { - $websiteIds = $object->getWebsiteIds(); + if ($dataObject->hasWebsiteIds()) { + $websiteIds = $dataObject->getWebsiteIds(); if (empty($websiteIds)) { $result[] = __('Please specify a website.'); } } - if ($object->hasCustomerGroupIds()) { - $customerGroupIds = $object->getCustomerGroupIds(); + if ($dataObject->hasCustomerGroupIds()) { + $customerGroupIds = $dataObject->getCustomerGroupIds(); if (empty($customerGroupIds)) { $result[] = __('Please specify Customer Groups.'); } diff --git a/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php b/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php index b7aefa2d344ef1d56b5a9797092e1542bb43a382..340a9501ef57b7eed9fe68e2024cb98ec9421f78 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Report/Filter/Form.php @@ -67,7 +67,7 @@ class Form extends \Magento\Reports\Block\Adminhtml\Filter\Form 'name' => 'show_order_statuses', 'label' => __('Order Status'), 'options' => ['0' => __('Any'), '1' => __('Specified')], - 'note' => __('Applies to Any of the Specified Order Statuses') + 'note' => __('Applies to Any of the Specified Order Statuses except canceled orders') ], 'to' );