TaxPlugin.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /**
  3. * @copyright Vertex. All rights reserved. https://www.vertexinc.com/
  4. * @author Mediotype https://www.mediotype.com/
  5. */
  6. namespace Vertex\Tax\Model\Plugin;
  7. use Magento\Quote\Model\Quote;
  8. use Magento\Tax\Api\Data\QuoteDetailsItemExtensionFactory;
  9. use Magento\Tax\Api\Data\QuoteDetailsItemExtensionInterface;
  10. use Magento\Tax\Api\Data\QuoteDetailsItemInterface;
  11. use Magento\Tax\Api\Data\QuoteDetailsItemInterfaceFactory;
  12. use Magento\Tax\Api\Data\TaxClassKeyInterface;
  13. use Magento\Tax\Model\Sales\Total\Quote\Tax;
  14. use Vertex\Tax\Model\Config;
  15. /**
  16. * Plugins to the Tax Total
  17. */
  18. class TaxPlugin
  19. {
  20. /** @var Config */
  21. private $config;
  22. /** @var QuoteDetailsItemExtensionFactory */
  23. private $extensionFactory;
  24. /**
  25. * @param QuoteDetailsItemExtensionFactory $extensionFactory
  26. * @param Config $config
  27. */
  28. public function __construct(QuoteDetailsItemExtensionFactory $extensionFactory, Config $config)
  29. {
  30. $this->config = $config;
  31. $this->extensionFactory = $extensionFactory;
  32. }
  33. /**
  34. * Add Vertex product codes and custom tax classes to extra taxables
  35. *
  36. * @param Tax $subject
  37. * @param callable $super
  38. * @param QuoteDetailsItemInterfaceFactory $itemDataObjectFactory
  39. * @param Quote\Address $address
  40. * @param bool $useBaseCurrency
  41. * @return QuoteDetailsItemInterface[]
  42. */
  43. public function aroundMapQuoteExtraTaxables(
  44. Tax $subject,
  45. callable $super,
  46. $itemDataObjectFactory,
  47. Quote\Address $address,
  48. $useBaseCurrency
  49. ) {
  50. // Allows forward compatibility with argument additions
  51. $arguments = func_get_args();
  52. array_splice($arguments, 0, 2);
  53. /** @var QuoteDetailsItemInterface[] $items */
  54. $items = call_user_func_array($super, $arguments);
  55. $store = $address->getQuote()->getStore();
  56. $storeId = $store->getStoreId();
  57. if (!$this->config->isVertexActive($storeId) || !$this->config->isTaxCalculationEnabled($storeId)) {
  58. return $items;
  59. }
  60. foreach ($items as $item) {
  61. switch ($item->getType()) {
  62. case 'quote_gw':
  63. $sku = $this->config->getGiftWrappingOrderCode($store);
  64. $taxClassId = $this->config->getGiftWrappingOrderClass($store);
  65. break;
  66. case 'printed_card_gw':
  67. $sku = $this->config->getPrintedGiftcardCode($store);
  68. $taxClassId = $this->config->getPrintedGiftcardClass($store);
  69. break;
  70. default:
  71. continue 2;
  72. }
  73. $extensionAttributes = $this->getExtensionAttributes($item);
  74. $extensionAttributes->setVertexProductCode($sku);
  75. $item->setTaxClassId($taxClassId);
  76. if ($item->getTaxClassKey() && $item->getTaxClassKey()->getType() === TaxClassKeyInterface::TYPE_ID) {
  77. $item->getTaxClassKey()->setValue($taxClassId);
  78. }
  79. }
  80. return $items;
  81. }
  82. /**
  83. * Retrieve an extension attribute object for the QuoteDetailsItem
  84. *
  85. * @param QuoteDetailsItemInterface $taxData
  86. * @return QuoteDetailsItemExtensionInterface
  87. */
  88. private function getExtensionAttributes(QuoteDetailsItemInterface $taxData)
  89. {
  90. $extensionAttributes = $taxData->getExtensionAttributes();
  91. if ($extensionAttributes instanceof QuoteDetailsItemExtensionInterface) {
  92. return $extensionAttributes;
  93. }
  94. $extensionAttributes = $this->extensionFactory->create();
  95. $taxData->setExtensionAttributes($extensionAttributes);
  96. return $extensionAttributes;
  97. }
  98. }