VertexCalculator.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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\Calculation;
  7. use Magento\Framework\DataObject;
  8. use Magento\Tax\Api\Data\AppliedTaxInterfaceFactory;
  9. use Magento\Tax\Api\Data\AppliedTaxRateInterfaceFactory;
  10. use Magento\Tax\Api\Data\QuoteDetailsItemInterface;
  11. use Magento\Tax\Api\Data\TaxDetailsItemInterfaceFactory;
  12. use Magento\Tax\Api\TaxClassManagementInterface;
  13. use Magento\Tax\Model\Calculation;
  14. use Magento\Tax\Model\Config;
  15. use Vertex\Tax\Model\Calculation\VertexCalculator\AppliedTaxesDeterminer;
  16. use Vertex\Tax\Model\Calculation\VertexCalculator\ItemCalculator;
  17. /**
  18. * Retrieves pre-calculated tax information for items and provides it during the tax-calculation process
  19. */
  20. class VertexCalculator extends Calculation\UnitBaseCalculator
  21. {
  22. const VERTEX_CALCULATION_ERROR = 'vertex_calculation_error';
  23. const VERTEX_QUOTE_ITEM_ID_PREFIX = 'quote_item_id_';
  24. const VERTEX_LINE_ITEM_TAX_KEY = 'vertex_item_tax';
  25. const VERTEX_SHIPPING_LINE_ITEM_ID = 'shipping';
  26. /** @var ItemCalculator */
  27. private $itemCalculator;
  28. /** @var AppliedTaxesDeterminer */
  29. private $appliedTaxesDeterminer;
  30. /**
  31. * @param TaxClassManagementInterface $taxClassService
  32. * @param TaxDetailsItemInterfaceFactory $taxDetailsItemDataObjectFactory
  33. * @param AppliedTaxInterfaceFactory $appliedTaxDataObjectFactory
  34. * @param AppliedTaxRateInterfaceFactory $appliedTaxRateDataObjectFactory
  35. * @param Calculation $calculationTool
  36. * @param Config $config
  37. * @param int $storeId
  38. * @param ItemCalculator $itemCalculator
  39. * @param AppliedTaxesDeterminer $appliedTaxesDeterminer
  40. * @param DataObject|null $addressRateRequest
  41. *
  42. * @SuppressWarnings(PHPMD.ExcessiveParameterList) Necessary for parent class
  43. */
  44. public function __construct(
  45. TaxClassManagementInterface $taxClassService,
  46. TaxDetailsItemInterfaceFactory $taxDetailsItemDataObjectFactory,
  47. AppliedTaxInterfaceFactory $appliedTaxDataObjectFactory,
  48. AppliedTaxRateInterfaceFactory $appliedTaxRateDataObjectFactory,
  49. Calculation $calculationTool,
  50. Config $config,
  51. $storeId,
  52. ItemCalculator $itemCalculator,
  53. AppliedTaxesDeterminer $appliedTaxesDeterminer,
  54. DataObject $addressRateRequest = null
  55. ) {
  56. parent::__construct(
  57. $taxClassService,
  58. $taxDetailsItemDataObjectFactory,
  59. $appliedTaxDataObjectFactory,
  60. $appliedTaxRateDataObjectFactory,
  61. $calculationTool,
  62. $config,
  63. $storeId,
  64. $addressRateRequest
  65. );
  66. $this->itemCalculator = $itemCalculator;
  67. $this->appliedTaxesDeterminer = $appliedTaxesDeterminer;
  68. }
  69. /**
  70. * {@inheritdoc}
  71. *
  72. * Protected method is part of override, $round required as part of override
  73. */
  74. protected function calculateWithTaxNotInPrice(QuoteDetailsItemInterface $item, $quantity, $round = true)
  75. {
  76. $itemTaxes = $this->itemCalculator->getVertexItemTaxes();
  77. /** @var DataObject $itemTax */
  78. $itemTax = $itemTaxes !== null
  79. ? $this->itemCalculator->calculateItemTax($item, $itemTaxes, $round)
  80. : $this->itemCalculator->getEmptyItemTax();
  81. $percent = $itemTax->hasTaxPercent() ? $itemTax->getTaxPercent() : 0;
  82. $rowTax = $itemTax->hasTaxAmount() ? $itemTax->getTaxAmount() : 0;
  83. // Determine whether or not to round the price
  84. $basePrice = $round ? $this->calculationTool->round($item->getUnitPrice()) : $item->getUnitPrice();
  85. $perItemTax = $rowTax / $quantity;
  86. $basePriceInclTax = $basePrice + ($round ? $this->calculationTool->round($perItemTax) : $perItemTax);
  87. $appliedTaxes = $this->appliedTaxesDeterminer->prepareAppliedTaxes($item, $itemTax);
  88. $rowTotal = $basePrice * $quantity;
  89. return $this->taxDetailsItemDataObjectFactory->create()
  90. ->setCode($item->getCode())
  91. ->setType($item->getType())
  92. ->setRowTax($rowTax)
  93. ->setPrice($basePrice)
  94. ->setPriceInclTax($basePriceInclTax)
  95. ->setRowTotal($rowTotal)
  96. ->setRowTotalInclTax($rowTotal + $rowTax)
  97. ->setDiscountTaxCompensationAmount(0)
  98. ->setAssociatedItemCode($item->getAssociatedItemCode())
  99. ->setTaxPercent($percent)
  100. ->setAppliedTaxes($appliedTaxes);
  101. }
  102. }