TotalsCalculationMessagePlugin.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * @author Mediotype Developement <diveinto@mediotype.com>
  4. * @copyright 2018 Mediotype. All rights reserved.
  5. */
  6. namespace Vertex\Tax\Model\Plugin;
  7. use Magento\Framework\Exception\NoSuchEntityException;
  8. use Magento\Framework\Message\ManagerInterface;
  9. use Magento\Framework\Message\MessageInterface;
  10. use Magento\Quote\Api\Data\TotalSegmentExtensionFactory;
  11. use Magento\Quote\Api\Data\TotalSegmentInterface;
  12. use Magento\Quote\Model\Cart\TotalsConverter;
  13. use Magento\Quote\Model\Quote\Address\Total;
  14. use Magento\Store\Model\StoreManagerInterface;
  15. use Psr\Log\LoggerInterface;
  16. use Vertex\Tax\Model\Calculator;
  17. use Vertex\Tax\Model\Config;
  18. /**
  19. * Add extension attribute 'vertex-messages' containing all vertex message from calculation
  20. *
  21. * @see TotalsConverter
  22. */
  23. class TotalsCalculationMessagePlugin
  24. {
  25. /** @var Config */
  26. private $config;
  27. /** @var LoggerInterface */
  28. private $logger;
  29. /** @var ManagerInterface */
  30. private $messageManager;
  31. /** @var StoreManagerInterface */
  32. private $storeManager;
  33. /** @var TotalSegmentExtensionFactory */
  34. private $totalSegmentExtensionFactory;
  35. /**
  36. * @param TotalSegmentExtensionFactory $totalSegmentExtensionFactory
  37. * @param ManagerInterface $messageManager
  38. * @param Config $config
  39. * @param StoreManagerInterface $storeManager
  40. */
  41. public function __construct(
  42. TotalSegmentExtensionFactory $totalSegmentExtensionFactory,
  43. ManagerInterface $messageManager,
  44. Config $config,
  45. StoreManagerInterface $storeManager,
  46. LoggerInterface $logger
  47. ) {
  48. $this->totalSegmentExtensionFactory = $totalSegmentExtensionFactory;
  49. $this->messageManager = $messageManager;
  50. $this->config = $config;
  51. $this->storeManager = $storeManager;
  52. $this->logger = $logger;
  53. }
  54. /**
  55. * Add any Vertex error messages to the tax totals data
  56. *
  57. * @see TotalsConverter::process()
  58. * @param TotalsConverter $subject
  59. * @param callable $super
  60. * @param Total[] $addressTotals
  61. * @return TotalSegmentInterface[]
  62. */
  63. public function aroundProcess(
  64. TotalsConverter $subject,
  65. callable $super,
  66. $addressTotals = []
  67. ) {
  68. // Allows forward compatibility with argument additions
  69. $arguments = func_get_args();
  70. array_splice($arguments, 0, 2);
  71. /** @var TotalSegmentInterface[] $totalSegment */
  72. $totalSegments = call_user_func_array($super, $arguments);
  73. $storeId = null;
  74. try {
  75. if ($currentStore = $this->storeManager->getStore()) {
  76. $storeId = $currentStore->getId();
  77. }
  78. } catch (NoSuchEntityException $e) {
  79. $this->logger->error($e->getMessage());
  80. }
  81. if (!$this->config->isVertexActive($storeId) || !$this->config->isTaxCalculationEnabled($storeId)) {
  82. return $totalSegments;
  83. }
  84. if (!array_key_exists('tax', $addressTotals)) {
  85. return $totalSegments;
  86. }
  87. $taxes = $addressTotals['tax']->getData();
  88. if (!array_key_exists('full_info', $taxes)) {
  89. return $totalSegments;
  90. }
  91. $messageCollection = $this->messageManager->getMessages(true, Calculator::MESSAGE_KEY);
  92. if (!$messageCollection->getCount()) {
  93. return $totalSegments;
  94. }
  95. $attributes = $totalSegments['tax']->getExtensionAttributes();
  96. if ($attributes === null) {
  97. $attributes = $this->totalSegmentExtensionFactory->create();
  98. }
  99. $attributes->setVertexTaxCalculationMessages(
  100. array_map(
  101. function (MessageInterface $message) {
  102. return $message->getText();
  103. },
  104. $messageCollection->getItems()
  105. )
  106. );
  107. $totalSegments['tax']->setExtensionAttributes($attributes);
  108. return $totalSegments;
  109. }
  110. }