CreditmemoRepositoryPlugin.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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\Sales\Api\CreditmemoRepositoryInterface;
  8. use Magento\Sales\Api\Data\CreditmemoInterface;
  9. use Magento\Sales\Api\Data\CreditmemoItemExtensionFactory;
  10. use Magento\Sales\Api\Data\CreditmemoItemInterface;
  11. use Magento\Sales\Api\Data\CreditmemoSearchResultInterface;
  12. use Vertex\Tax\Model\Config;
  13. use Vertex\Tax\Model\VertexTaxAttributeManager;
  14. /**
  15. * Plugin that adds Vertex Tax extension attributes when Creditmemo Repository called
  16. */
  17. class CreditmemoRepositoryPlugin
  18. {
  19. /** @var VertexTaxAttributeManager */
  20. private $attributeManager;
  21. /** @var Config */
  22. private $config;
  23. /** @var OrderItemExtensionFactory */
  24. private $creditmemoItemExtensionFactory;
  25. /**
  26. * @param VertexTaxAttributeManager $attributeManager
  27. * @param CreditmemoItemExtensionFactory $creditmemoItemExtensionFactory
  28. * @param Config $config
  29. */
  30. public function __construct(
  31. VertexTaxAttributeManager $attributeManager,
  32. CreditmemoItemExtensionFactory $creditmemoItemExtensionFactory,
  33. Config $config
  34. ) {
  35. $this->creditmemoItemExtensionFactory = $creditmemoItemExtensionFactory;
  36. $this->attributeManager = $attributeManager;
  37. $this->config = $config;
  38. }
  39. /**
  40. * Add Vertex extension attributes to creditmemo items after retrieval of a creditmemo
  41. *
  42. * @param CreditmemoRepositoryInterface $subject
  43. * @param CreditmemoInterface $resultCreditmemo
  44. * @return CreditmemoInterface
  45. */
  46. public function afterGet(CreditmemoRepositoryInterface $subject, CreditmemoInterface $resultCreditmemo)
  47. {
  48. if (!$this->config->isVertexActive($resultCreditmemo->getStoreId())) {
  49. return $resultCreditmemo;
  50. }
  51. $creditmemoItems = $resultCreditmemo->getItems();
  52. $orderItemIds = $this->getOrderItemIdsFromCreditmemoItemList($creditmemoItems);
  53. $taxCodes = $this->attributeManager->getTaxCodes($orderItemIds);
  54. $vertexTaxCodes = $this->attributeManager->getVertexTaxCodes($orderItemIds);
  55. $invoiceTextCodes = $this->attributeManager->getInvoiceTextCodes($orderItemIds);
  56. $this->setCreditmemoItemVertexExtensionAttributes(
  57. $creditmemoItems,
  58. $vertexTaxCodes,
  59. $invoiceTextCodes,
  60. $taxCodes
  61. );
  62. return $resultCreditmemo;
  63. }
  64. /**
  65. * Add Vertex extension attributes to creditmemo items after retrieval of a list of creditmemos
  66. *
  67. * @param CreditmemoRepositoryInterface $subject
  68. * @param CreditmemoSearchResultInterface $searchResult
  69. * @return CreditmemoSearchResultInterface
  70. */
  71. public function afterGetList(
  72. CreditmemoRepositoryInterface $subject,
  73. CreditmemoSearchResultInterface $searchResult
  74. ) {
  75. $creditmemoList = array_filter(
  76. $searchResult->getItems(),
  77. function (CreditmemoInterface $creditmemo) {
  78. return $this->config->isVertexActive($creditmemo->getStoreId());
  79. }
  80. );
  81. if (count($creditmemoList) < 1) {
  82. return $searchResult;
  83. }
  84. $creditmemoItems = array_reduce(
  85. $creditmemoList,
  86. function (array $carry, CreditmemoInterface $creditmemo) {
  87. return array_merge($carry, $creditmemo->getItems() !== null ? $creditmemo->getItems() : []);
  88. },
  89. []
  90. );
  91. $orderItemIds = $this->getOrderItemIdsFromCreditmemoItemList($creditmemoItems);
  92. if ($orderItemIds !== null) {
  93. $taxCodes = $this->attributeManager->getTaxCodes($orderItemIds);
  94. $vertexTaxCodes = $this->attributeManager->getVertexTaxCodes($orderItemIds);
  95. $invoiceTextCodes = $this->attributeManager->getInvoiceTextCodes($orderItemIds);
  96. $this->setCreditmemoItemVertexExtensionAttributes(
  97. $creditmemoItems,
  98. $vertexTaxCodes,
  99. $invoiceTextCodes,
  100. $taxCodes
  101. );
  102. }
  103. return $searchResult;
  104. }
  105. /**
  106. * Get Order Item Id from Creditmemo Item
  107. *
  108. * @param CreditmemoItemInterface[] $creditmemoItemArray
  109. * @return int[]
  110. */
  111. private function getOrderItemIdsFromCreditmemoItemList(array $creditmemoItemArray)
  112. {
  113. return array_map(
  114. function (CreditmemoItemInterface $item) {
  115. return $item->getOrderItemId();
  116. },
  117. $creditmemoItemArray
  118. );
  119. }
  120. /**
  121. * Set Creditmemo Item Vertex extension attributes to Creditmemo object
  122. *
  123. * @param $creditmemoItems
  124. * @param string[] $vertexTaxCodes
  125. * @param string[] $invoiceTextCodes
  126. * @param string[] $taxCodes
  127. * @return void
  128. */
  129. private function setCreditmemoItemVertexExtensionAttributes(
  130. $creditmemoItems,
  131. array $vertexTaxCodes,
  132. array $invoiceTextCodes,
  133. array $taxCodes
  134. ) {
  135. if (null !== $creditmemoItems) {
  136. foreach ($creditmemoItems as $creditmemoItem) {
  137. $this->setVertexTaxCodes($creditmemoItem, $vertexTaxCodes);
  138. $this->setInvoiceTextCodes($creditmemoItem, $invoiceTextCodes);
  139. $this->setTaxCodes($creditmemoItem, $taxCodes);
  140. }
  141. }
  142. }
  143. /**
  144. * Set Invoice Text Code extension attribute for Creditmemo Item
  145. *
  146. * @param CreditmemoItemInterface $creditmemoItem
  147. * @param string<int>[] $invoiceTextCodes
  148. * @return void
  149. */
  150. private function setInvoiceTextCodes(CreditmemoItemInterface $creditmemoItem, array $invoiceTextCodes)
  151. {
  152. $extensionAttributes = $creditmemoItem->getExtensionAttributes();
  153. if ($extensionAttributes && $extensionAttributes->getInvoiceTextCodes()) {
  154. return;
  155. }
  156. if ($invoiceTextCodes !== null && array_key_exists(
  157. $creditmemoItem->getOrderItemId(),
  158. $invoiceTextCodes
  159. )) {
  160. $creditmemoItemExtension = $extensionAttributes ?: $this->creditmemoItemExtensionFactory->create();
  161. $creditmemoItemExtension->setInvoiceTextCodes($invoiceTextCodes[$creditmemoItem->getOrderItemId()]);
  162. $creditmemoItem->setExtensionAttributes($creditmemoItemExtension);
  163. }
  164. }
  165. /**
  166. * Set Tax Code extension attribute for Creditmemo Item
  167. *
  168. * @param CreditmemoItemInterface $creditmemoItem
  169. * @param string<int>[] $taxCodes
  170. * @return void
  171. */
  172. private function setTaxCodes(CreditmemoItemInterface $creditmemoItem, array $taxCodes)
  173. {
  174. $extensionAttributes = $creditmemoItem->getExtensionAttributes();
  175. if ($extensionAttributes && $extensionAttributes->getTaxCodes()) {
  176. return;
  177. }
  178. if ($taxCodes !== null && array_key_exists($creditmemoItem->getOrderItemId(), $taxCodes)) {
  179. $creditmemoItemExtension = $extensionAttributes ?: $this->creditmemoItemExtensionFactory->create();
  180. $creditmemoItemExtension->setTaxCodes($taxCodes[$creditmemoItem->getOrderItemId()]);
  181. $creditmemoItem->setExtensionAttributes($creditmemoItemExtension);
  182. }
  183. }
  184. /**
  185. * Set Vertex Tax Code extension attribute for Creditmemo Item
  186. *
  187. * @param CreditmemoItemInterface $creditmemoItem
  188. * @param string<int>[] $vertexTaxCodes
  189. * @return void
  190. */
  191. private function setVertexTaxCodes(CreditmemoItemInterface $creditmemoItem, array $vertexTaxCodes)
  192. {
  193. $extensionAttributes = $creditmemoItem->getExtensionAttributes();
  194. if ($extensionAttributes && $extensionAttributes->getVertexTaxCodes()) {
  195. return;
  196. }
  197. if ($vertexTaxCodes !== null && array_key_exists($creditmemoItem->getOrderItemId(), $vertexTaxCodes)) {
  198. $creditmemoItemExtension = $extensionAttributes ?: $this->creditmemoItemExtensionFactory->create();
  199. $creditmemoItemExtension->setVertexTaxCodes($vertexTaxCodes[$creditmemoItem->getOrderItemId()]);
  200. $creditmemoItem->setExtensionAttributes($creditmemoItemExtension);
  201. }
  202. }
  203. }