InvoiceGiftwrapProcessor.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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\InvoiceInterface;
  8. use Magento\Sales\Api\Data\InvoiceItemInterface;
  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 an Invoice and converts them to a LineItemInterface
  14. */
  15. class InvoiceGiftwrapProcessor implements InvoiceProcessorInterface
  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, InvoiceInterface $invoice)
  36. {
  37. $lineItems = $request->getLineItems();
  38. $extensionAttributes = $invoice->getExtensionAttributes();
  39. if (!$this->moduleManager->isEnabled('Magento_GiftWrapping')) {
  40. return $request;
  41. }
  42. if ($extensionAttributes !== null) {
  43. // Order-level Gift Wrapping
  44. $orderGiftWrap = $this->giftWrapProcessor->processOrderGiftWrap(
  45. $extensionAttributes->getGwBasePrice(),
  46. $invoice->getStoreId()
  47. );
  48. if ($orderGiftWrap) {
  49. $lineItems[] = $orderGiftWrap;
  50. }
  51. // Order-level Printed Card
  52. $orderGiftcard = $this->giftWrapProcessor->processOrderGiftCard(
  53. $extensionAttributes->getGwCardBasePrice(),
  54. $invoice->getStoreId()
  55. );
  56. if ($orderGiftcard) {
  57. $lineItems[] = $orderGiftcard;
  58. }
  59. }
  60. // Item-level Gift Wrapping
  61. $lineItems = array_merge($lineItems, $this->processItems($invoice));
  62. $request->setLineItems($lineItems);
  63. return $request;
  64. }
  65. /**
  66. * Create LineItems for each individual item-level gift wrap
  67. *
  68. * @param InvoiceInterface $invoice
  69. * @return LineItemInterface[]
  70. */
  71. private function processItems(InvoiceInterface $invoice)
  72. {
  73. /** @var LineItemInterface[] $lineItems */
  74. $lineItems = [];
  75. if ($invoice->getExtensionAttributes() === null) {
  76. return $lineItems;
  77. }
  78. /** @var InvoiceItemInterface[] $invoiceItems Indexed by Order Item ID */
  79. $invoiceItems = [];
  80. /** @var int[] $orderItemIds */
  81. $orderItemIds = [];
  82. foreach ($invoice->getItems() as $item) {
  83. if ($item->getQty() < 1) {
  84. continue;
  85. }
  86. $orderItemIds[] = $item->getOrderItemId();
  87. $invoiceItems[$item->getOrderItemId()] = $item;
  88. }
  89. /** @var float[] $giftWrapAmounts Indexed by Order Item ID */
  90. $giftWrapAmounts = $this->giftWrapProcessor->getGiftWrapAmounts(
  91. $invoice->getOrderId(),
  92. $orderItemIds,
  93. (float)$invoice->getExtensionAttributes()->getGwItemsBasePrice()
  94. );
  95. foreach ($giftWrapAmounts as $orderItemId => $giftWrapAmount) {
  96. $lineItems[] = $this->giftWrapProcessor->buildItem(
  97. $giftWrapAmount,
  98. $invoiceItems[$orderItemId]->getSku(),
  99. $invoice->getStoreId()
  100. );
  101. }
  102. return $lineItems;
  103. }
  104. }