AppliedTaxesDeterminer.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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\VertexCalculator;
  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 Vertex\Tax\Model\ItemType;
  12. /**
  13. * Determine the applied taxes on tax-calculated items
  14. */
  15. class AppliedTaxesDeterminer
  16. {
  17. /** @var AppliedTaxInterfaceFactory */
  18. private $appliedTaxDataObjectFactory;
  19. /** @var AppliedTaxRateInterfaceFactory */
  20. private $appliedTaxRateDataObjectFactory;
  21. /** @var ItemType */
  22. private $itemType;
  23. /**
  24. * @param AppliedTaxInterfaceFactory $appliedTaxDataObjectFactory
  25. * @param AppliedTaxRateInterfaceFactory $appliedTaxRateDataObjectFactory
  26. * @param ItemType $itemType
  27. */
  28. public function __construct(
  29. AppliedTaxInterfaceFactory $appliedTaxDataObjectFactory,
  30. AppliedTaxRateInterfaceFactory $appliedTaxRateDataObjectFactory,
  31. ItemType $itemType
  32. ) {
  33. $this->appliedTaxRateDataObjectFactory = $appliedTaxRateDataObjectFactory;
  34. $this->appliedTaxDataObjectFactory = $appliedTaxDataObjectFactory;
  35. $this->itemType = $itemType;
  36. }
  37. /**
  38. * Convert given Vertex tax details to applied tax information.
  39. *
  40. * @param QuoteDetailsItemInterface $item
  41. * @param DataObject $vertexItemTax Pre-calculated Vertex tax item response.
  42. * @return array
  43. */
  44. public function prepareAppliedTaxes(QuoteDetailsItemInterface $item, DataObject $vertexItemTax)
  45. {
  46. $appliedTaxes = [];
  47. if (!$vertexItemTax->getTaxAmount()) {
  48. return [];
  49. }
  50. $rateTitle = $this->getAppliedRateTitleByType($item->getType());
  51. $rateId = $item->getCode();
  52. $rateCode = $item->getType();
  53. /** @var \Magento\Tax\Api\Data\AppliedTaxInterface $appliedTax */
  54. $appliedTax = $this->appliedTaxDataObjectFactory->create()
  55. ->setAmount($vertexItemTax->getTaxAmount())
  56. ->setPercent($vertexItemTax->getTaxPercent())
  57. ->setTaxRateKey($rateCode)
  58. ->setRates(
  59. [
  60. $rateId => $this->appliedTaxRateDataObjectFactory->create()
  61. ->setPercent($vertexItemTax->getTaxPercent())
  62. ->setCode($rateCode)
  63. ->setTitle($rateTitle),
  64. ]
  65. );
  66. $appliedTaxes[$rateId] = $appliedTax;
  67. return $appliedTaxes;
  68. }
  69. /**
  70. * Get the applied tax rate title for the given rate type.
  71. *
  72. * We are not currently able to supply jurisdiction-level tax information. As a fallback, we can provide the
  73. * aggregate tax labels by rate type.
  74. *
  75. * @param string $rateType
  76. * @return string
  77. */
  78. private function getAppliedRateTitleByType($rateType)
  79. {
  80. switch ($rateType) {
  81. case $this->itemType->shipping():
  82. $title = 'Shipping';
  83. break;
  84. case $this->itemType->giftWrap():
  85. case $this->itemType->orderGiftWrap():
  86. case $this->itemType->orderPrintedCard():
  87. $title = 'Gift Options';
  88. break;
  89. default:
  90. $title = 'Sales and Use';
  91. break;
  92. }
  93. return $title;
  94. }
  95. }