CreditmemoGiftwrapProcessor.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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\Api\Data\InvoiceRequestBuilder;
  7. use Magento\Sales\Api\Data\CreditmemoInterface;
  8. use Magento\Sales\Api\Data\CreditmemoItemInterface;
  9. use Vertex\Data\LineItemInterface;
  10. use Vertex\Services\Invoice\RequestInterface;
  11. use Vertex\Tax\Model\ModuleManager;
  12. /**
  13. * Processes Giftwrapping and printed cards on a Creditmemo and converts them to a LineItemInterface
  14. */
  15. class CreditmemoGiftwrapProcessor implements CreditmemoProcessorInterface
  16. {
  17. /** @var GiftWrapProcessor */
  18. private $giftWrapProcessor;
  19. /** @var ModuleManager */
  20. private $moduleManager;
  21. /**
  22. * @param ModuleManager $moduleManager
  23. * @param GiftWrapProcessor $giftWrapProcessor
  24. */
  25. public function __construct(
  26. ModuleManager $moduleManager,
  27. GiftWrapProcessor $giftWrapProcessor
  28. ) {
  29. $this->moduleManager = $moduleManager;
  30. $this->giftWrapProcessor = $giftWrapProcessor;
  31. }
  32. /**
  33. * @inheritdoc
  34. */
  35. public function process(RequestInterface $request, CreditmemoInterface $creditmemo)
  36. {
  37. $lineItems = $request->getLineItems();
  38. $extensionAttributes = $creditmemo->getExtensionAttributes();
  39. if ($extensionAttributes === null || !$this->moduleManager->isEnabled('Magento_GiftWrapping')) {
  40. return $request;
  41. }
  42. // Order-level Gift Wrapping
  43. $orderGiftWrap = $this->giftWrapProcessor->processOrderGiftWrap(
  44. $extensionAttributes->getGwBasePrice(),
  45. $creditmemo->getStoreId()
  46. );
  47. if ($orderGiftWrap) {
  48. $orderGiftWrap->setUnitPrice($orderGiftWrap->getUnitPrice() * -1);
  49. $orderGiftWrap->setExtendedPrice($orderGiftWrap->getExtendedPrice() * -1);
  50. $lineItems[] = $orderGiftWrap;
  51. }
  52. // Order-level Printed Card
  53. $orderGiftcard = $this->giftWrapProcessor->processOrderGiftCard(
  54. $extensionAttributes->getGwCardBasePrice(),
  55. $creditmemo->getStoreId()
  56. );
  57. if ($orderGiftcard) {
  58. $orderGiftcard->setUnitPrice($orderGiftcard->getUnitPrice() * -1);
  59. $orderGiftcard->setExtendedPrice($orderGiftcard->getExtendedPrice() * -1);
  60. $lineItems[] = $orderGiftcard;
  61. }
  62. // Item-level Gift Wrapping
  63. $lineItems = array_merge($lineItems, $this->processItems($creditmemo));
  64. $request->setLineItems($lineItems);
  65. return $request;
  66. }
  67. /**
  68. * Create LineItems for each individual item-level gift wrap
  69. *
  70. * @param CreditmemoInterface $creditmemo
  71. * @return LineItemInterface[]
  72. */
  73. private function processItems(CreditmemoInterface $creditmemo)
  74. {
  75. /** @var LineItemInterface[] $lineItems */
  76. $lineItems = [];
  77. if ($creditmemo->getExtensionAttributes() === null) {
  78. return $lineItems;
  79. }
  80. /** @var CreditmemoItemInterface[] $creditmemoItems Indexed by Order Item ID */
  81. $creditmemoItems = [];
  82. /** @var int[] $orderItemIds */
  83. $orderItemIds = [];
  84. foreach ($creditmemo->getItems() as $item) {
  85. if ($item->getQty() < 1) {
  86. continue;
  87. }
  88. $orderItemIds[] = $item->getOrderItemId();
  89. $creditmemoItems[$item->getOrderItemId()] = $item;
  90. }
  91. /** @var float[] $giftWrapAmounts Indexed by Order Item ID */
  92. $giftWrapAmounts = $this->giftWrapProcessor->getGiftWrapAmounts(
  93. $creditmemo->getOrderId(),
  94. $orderItemIds,
  95. (float)$creditmemo->getExtensionAttributes()->getGwItemsBasePrice()
  96. );
  97. foreach ($giftWrapAmounts as $orderItemId => $giftWrapAmount) {
  98. $lineItems[] = $this->giftWrapProcessor->buildItem(
  99. -1 * $giftWrapAmount,
  100. $creditmemoItems[$orderItemId]->getSku(),
  101. $creditmemo->getStoreId()
  102. );
  103. }
  104. return $lineItems;
  105. }
  106. }