QuoteValidator.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Quote\Model;
  7. use Magento\Directory\Model\AllowedCountries;
  8. use Magento\Framework\App\ObjectManager;
  9. use Magento\Framework\Exception\LocalizedException;
  10. use Magento\Framework\Message\Error;
  11. use Magento\Quote\Model\Quote as QuoteEntity;
  12. use Magento\Quote\Model\Quote\Validator\MinimumOrderAmount\ValidationMessage as OrderAmountValidationMessage;
  13. use Magento\Quote\Model\ValidationRules\QuoteValidationRuleInterface;
  14. /**
  15. * Class to validate the quote
  16. *
  17. * @api
  18. * @since 100.0.2
  19. */
  20. class QuoteValidator
  21. {
  22. /**
  23. * Maximum available number
  24. */
  25. const MAXIMUM_AVAILABLE_NUMBER = 10000000000000000;
  26. /**
  27. * @var AllowedCountries
  28. */
  29. private $allowedCountryReader;
  30. /**
  31. * @var OrderAmountValidationMessage
  32. */
  33. private $minimumAmountMessage;
  34. /**
  35. * @var QuoteValidationRuleInterface
  36. */
  37. private $quoteValidationRule;
  38. /**
  39. * QuoteValidator constructor.
  40. *
  41. * @param AllowedCountries|null $allowedCountryReader
  42. * @param OrderAmountValidationMessage|null $minimumAmountMessage
  43. * @param QuoteValidationRuleInterface|null $quoteValidationRule
  44. */
  45. public function __construct(
  46. AllowedCountries $allowedCountryReader = null,
  47. OrderAmountValidationMessage $minimumAmountMessage = null,
  48. QuoteValidationRuleInterface $quoteValidationRule = null
  49. ) {
  50. $this->allowedCountryReader = $allowedCountryReader ?: ObjectManager::getInstance()
  51. ->get(AllowedCountries::class);
  52. $this->minimumAmountMessage = $minimumAmountMessage ?: ObjectManager::getInstance()
  53. ->get(OrderAmountValidationMessage::class);
  54. $this->quoteValidationRule = $quoteValidationRule ?: ObjectManager::getInstance()
  55. ->get(QuoteValidationRuleInterface::class);
  56. }
  57. /**
  58. * Validate quote amount
  59. *
  60. * @param QuoteEntity $quote
  61. * @param float $amount
  62. * @return $this
  63. */
  64. public function validateQuoteAmount(QuoteEntity $quote, $amount)
  65. {
  66. if (!$quote->getHasError() && $amount >= self::MAXIMUM_AVAILABLE_NUMBER) {
  67. $quote->setHasError(true);
  68. $quote->addMessage(__('This item price or quantity is not valid for checkout.'));
  69. }
  70. return $this;
  71. }
  72. /**
  73. * Validates quote before submit.
  74. *
  75. * @param Quote $quote
  76. * @return $this
  77. * @throws LocalizedException
  78. */
  79. public function validateBeforeSubmit(QuoteEntity $quote)
  80. {
  81. if ($quote->getHasError()) {
  82. $errors = $this->getQuoteErrors($quote);
  83. throw new LocalizedException(__($errors ?: 'Something went wrong. Please try to place the order again.'));
  84. }
  85. foreach ($this->quoteValidationRule->validate($quote) as $validationResult) {
  86. if ($validationResult->isValid()) {
  87. continue;
  88. }
  89. $messages = $validationResult->getErrors();
  90. $defaultMessage = array_shift($messages);
  91. if ($defaultMessage && !empty($messages)) {
  92. $defaultMessage .= ' %1';
  93. }
  94. if ($defaultMessage) {
  95. throw new LocalizedException(__($defaultMessage, implode(' ', $messages)));
  96. }
  97. }
  98. return $this;
  99. }
  100. /**
  101. * Parses quote error messages and concatenates them into single string.
  102. *
  103. * @param Quote $quote
  104. * @return string
  105. */
  106. private function getQuoteErrors(QuoteEntity $quote): string
  107. {
  108. $errors = array_map(
  109. function (Error $error) {
  110. return $error->getText();
  111. },
  112. $quote->getErrors()
  113. );
  114. return implode(PHP_EOL, $errors);
  115. }
  116. }