InvoiceItemProcessor.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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\Data\LineItemInterfaceFactory;
  11. use Vertex\Services\Invoice\RequestInterface;
  12. use Vertex\Tax\Model\Repository\TaxClassNameRepository;
  13. /**
  14. * Processes Items on an Invoice and converts them to an array of LineItemInterface
  15. */
  16. class InvoiceItemProcessor implements InvoiceProcessorInterface
  17. {
  18. /** @var ItemProcessor */
  19. private $itemProcessor;
  20. /** @var LineItemInterfaceFactory */
  21. private $lineItemFactory;
  22. /** @var TaxClassNameRepository */
  23. private $taxClassNameRepository;
  24. /**
  25. * @param ItemProcessor $itemProcessor
  26. * @param LineItemInterfaceFactory $lineItemFactory
  27. * @param TaxClassNameRepository $taxClassNameRepository
  28. */
  29. public function __construct(
  30. ItemProcessor $itemProcessor,
  31. LineItemInterfaceFactory $lineItemFactory,
  32. TaxClassNameRepository $taxClassNameRepository
  33. ) {
  34. $this->itemProcessor = $itemProcessor;
  35. $this->lineItemFactory = $lineItemFactory;
  36. $this->taxClassNameRepository = $taxClassNameRepository;
  37. }
  38. /**
  39. * @inheritdoc
  40. */
  41. public function process(RequestInterface $request, InvoiceInterface $invoice)
  42. {
  43. /** @var InvoiceItemInterface[] $invoiceItems All InvoiceItems indexed by id */
  44. $invoiceItems = [];
  45. /** @var int[] $productIds All Product IDs in the invoice */
  46. $productSku = [];
  47. /** @var LineItemInterface[] $lineItems Vertex SDK LineItems to be returned */
  48. $lineItems = [];
  49. // Build the invoiceItems, parentItemIds, and productIds arrays
  50. foreach ($invoice->getItems() as $item) {
  51. if ($item->getBaseRowTotal() === null) {
  52. continue;
  53. }
  54. $invoiceItems[$item->getOrderItemId()] = $item;
  55. $productSku[] = $item->getSku();
  56. }
  57. $products = $this->itemProcessor->getProductsIndexedBySku($productSku);
  58. /** @var int[] $taxClasses Key is InvoiceItem ID, Value is Tax Class ID */
  59. $taxClasses = [];
  60. foreach ($invoiceItems as $item) {
  61. $product = isset($products[$item->getSku()]) ? $products[$item->getSku()] : false;
  62. $taxClassAttribute = $product ? $product->getCustomAttribute('tax_class_id') : false;
  63. $taxClassId = $taxClassAttribute ? $taxClassAttribute->getValue() : 0;
  64. if ($item->getBaseRowTotal() === null) {
  65. // For bundle products, the parent has a row total of NULL
  66. continue;
  67. }
  68. /** @var LineItemInterface $lineItem */
  69. $lineItem = $this->lineItemFactory->create();
  70. $lineItem->setProductCode($item->getSku());
  71. $lineItem->setQuantity($item->getQty());
  72. $lineItem->setUnitPrice($item->getBasePrice());
  73. $lineItem->setExtendedPrice($item->getBaseRowTotal() - $item->getBaseDiscountAmount());
  74. $lineItem->setLineItemId($item->getOrderItemId());
  75. $taxClasses[$item->getOrderItemId()] = $taxClassId;
  76. if ($lineItem->getExtendedPrice() == 0) {
  77. continue;
  78. }
  79. $lineItems[] = $lineItem;
  80. }
  81. /** @var string[int] $taxClassNames Tax Classes indexed by ID */
  82. $taxClassNames = $this->taxClassNameRepository->getListByIds(array_values($taxClasses));
  83. foreach ($lineItems as $lineItem) {
  84. $lineItemId = $lineItem->getLineItemId();
  85. $taxClass = $taxClasses[$lineItemId];
  86. $taxClassName = $taxClassNames[$taxClass];
  87. $lineItem->setProductClass($taxClassName);
  88. }
  89. $request->setLineItems(array_merge($request->getLineItems(), $lineItems));
  90. return $request;
  91. }
  92. }