InvoiceRepositoryPlugin.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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\Data\InvoiceInterface;
  8. use Magento\Sales\Api\Data\InvoiceItemExtensionFactory;
  9. use Magento\Sales\Api\Data\InvoiceItemInterface;
  10. use Magento\Sales\Api\InvoiceRepositoryInterface;
  11. use Vertex\Tax\Model\Config;
  12. use Vertex\Tax\Model\VertexTaxAttributeManager;
  13. /**
  14. * Plugin that adds Vertex Tax extension attributes when the Invoice Repository is called
  15. */
  16. class InvoiceRepositoryPlugin
  17. {
  18. /** @var VertexTaxAttributeManager */
  19. private $attributeManager;
  20. /** @var Config */
  21. private $config;
  22. /** @var InvoiceItemExtensionFactory */
  23. private $invoiceItemExtensionFactory;
  24. /**
  25. * @param VertexTaxAttributeManager $attributeManager
  26. * @param InvoiceItemExtensionFactory $invoiceItemExtensionFactory
  27. * @param Config $config
  28. */
  29. public function __construct(
  30. VertexTaxAttributeManager $attributeManager,
  31. InvoiceItemExtensionFactory $invoiceItemExtensionFactory,
  32. Config $config
  33. ) {
  34. $this->attributeManager = $attributeManager;
  35. $this->invoiceItemExtensionFactory = $invoiceItemExtensionFactory;
  36. $this->config = $config;
  37. }
  38. /**
  39. * Add Vertex extension attributes to an invoice's items after it is retrieved
  40. *
  41. * @param InvoiceRepositoryInterface $subject
  42. * @param InvoiceInterface $invoice
  43. * @return InvoiceInterface
  44. */
  45. public function afterGet(InvoiceRepositoryInterface $subject, InvoiceInterface $invoice)
  46. {
  47. if (!$this->config->isVertexActive($invoice->getStoreId())) {
  48. return $invoice;
  49. }
  50. $invoiceItems = $invoice->getItems();
  51. $orderItemIds = $this->getOrderItemIdsFromInvoiceItemList($invoiceItems);
  52. $taxCodes = $this->attributeManager->getTaxCodes($orderItemIds);
  53. $vertexTaxCodes = $this->attributeManager->getVertexTaxCodes($orderItemIds);
  54. $invoiceTextCodes = $this->attributeManager->getInvoiceTextCodes($orderItemIds);
  55. $this->setInvoiceItemVertexExtensionAttributes(
  56. $invoiceItems,
  57. $vertexTaxCodes,
  58. $invoiceTextCodes,
  59. $taxCodes
  60. );
  61. return $invoice;
  62. }
  63. /**
  64. * Retrieve the Order Item IDs from a list of Invoice Items
  65. *
  66. * @param InvoiceItemInterface[] $invoiceItems
  67. * @return int[]
  68. */
  69. private function getOrderItemIdsFromInvoiceItemList(array $invoiceItems)
  70. {
  71. return array_map(
  72. function (InvoiceItemInterface $invoiceItem) {
  73. return $invoiceItem->getOrderItemId();
  74. },
  75. $invoiceItems
  76. );
  77. }
  78. /**
  79. * Assign Invoice Item Vertex extension attributes to the Invoice Item object
  80. *
  81. * @param InvoiceItemInterface[] $invoiceItems
  82. * @param string<int>[] $vertexTaxCodes
  83. * @param string<int>[] $invoiceTextCodes
  84. * @param string<int>[] $taxCodes
  85. * @return void
  86. */
  87. private function setInvoiceItemVertexExtensionAttributes(
  88. array $invoiceItems,
  89. array $vertexTaxCodes,
  90. array $invoiceTextCodes,
  91. array $taxCodes
  92. ) {
  93. if ($invoiceItems === null) {
  94. return;
  95. }
  96. foreach ($invoiceItems as $invoiceItem) {
  97. $this->setVertexTaxCodes($invoiceItem, $vertexTaxCodes);
  98. $this->setInvoiceTextCodes($invoiceItem, $invoiceTextCodes);
  99. $this->setTaxCodes($invoiceItem, $taxCodes);
  100. }
  101. }
  102. /**
  103. * Set InvoiceTextCode extension attribute for Invoice Item
  104. *
  105. * @param InvoiceItemInterface $invoiceItem
  106. * @param string<int>[] $invoiceTextCodes
  107. * @return void
  108. */
  109. private function setInvoiceTextCodes(InvoiceItemInterface $invoiceItem, array $invoiceTextCodes)
  110. {
  111. $extensionAttributes = $invoiceItem->getExtensionAttributes();
  112. if ($extensionAttributes && $extensionAttributes->getInvoiceTextCodes()) {
  113. return;
  114. }
  115. if ($invoiceTextCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $invoiceTextCodes)) {
  116. $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create();
  117. $extensionAttributes->setInvoiceTextCodes($invoiceTextCodes[$invoiceItem->getOrderItemId()]);
  118. $invoiceItem->setExtensionAttributes($extensionAttributes);
  119. }
  120. }
  121. /**
  122. * Set the TaxCode extension attribute for an Invoice Item
  123. *
  124. * @param InvoiceItemInterface $invoiceItem
  125. * @param string<int>[] $taxCodes
  126. * @return void
  127. */
  128. private function setTaxCodes(InvoiceItemInterface $invoiceItem, array $taxCodes)
  129. {
  130. $extensionAttributes = $invoiceItem->getExtensionAttributes();
  131. if ($extensionAttributes && $extensionAttributes->getTaxCodes()) {
  132. return;
  133. }
  134. if ($taxCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $taxCodes)) {
  135. $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create();
  136. $extensionAttributes->setTaxCodes($taxCodes[$invoiceItem->getOrderItemId()]);
  137. $invoiceItem->setExtensionAttributes($extensionAttributes);
  138. }
  139. }
  140. /**
  141. * Set the VertexTaxCode extension attribute for an Invoice Item
  142. *
  143. * @param InvoiceItemInterface $invoiceItem
  144. * @param string<int>[] $vertexTaxCodes
  145. * @return void
  146. */
  147. private function setVertexTaxCodes(InvoiceItemInterface $invoiceItem, array $vertexTaxCodes)
  148. {
  149. $extensionAttributes = $invoiceItem->getExtensionAttributes();
  150. if ($extensionAttributes && $extensionAttributes->getVertexTaxCodes()) {
  151. return;
  152. }
  153. if ($vertexTaxCodes !== null && array_key_exists($invoiceItem->getOrderItemId(), $vertexTaxCodes)) {
  154. $extensionAttributes = $extensionAttributes ?: $this->invoiceItemExtensionFactory->create();
  155. $extensionAttributes->setVertexTaxCodes($vertexTaxCodes[$invoiceItem->getOrderItemId()]);
  156. $invoiceItem->setExtensionAttributes($extensionAttributes);
  157. }
  158. }
  159. }