Weee.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Weee\Model\Total\Creditmemo;
  7. use Magento\Sales\Model\Order\Creditmemo;
  8. use Magento\Weee\Helper\Data as WeeeHelper;
  9. use Magento\Framework\Serialize\Serializer\Json;
  10. use Magento\Framework\App\ObjectManager;
  11. class Weee extends \Magento\Sales\Model\Order\Creditmemo\Total\AbstractTotal
  12. {
  13. /**
  14. * Weee data
  15. *
  16. * @var WeeeHelper
  17. */
  18. protected $_weeeData = null;
  19. /**
  20. * Instance of serializer.
  21. *
  22. * @var Json
  23. */
  24. private $serializer;
  25. /**
  26. * Constructor
  27. *
  28. * By default is looking for first argument as array and assigns it as object
  29. * attributes This behavior may change in child classes
  30. *
  31. * @param WeeeHelper $weeeData
  32. * @param array $data
  33. * @param Json|null $serializer
  34. */
  35. public function __construct(
  36. WeeeHelper $weeeData,
  37. array $data = [],
  38. Json $serializer = null
  39. ) {
  40. $this->_weeeData = $weeeData;
  41. $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
  42. parent::__construct($data);
  43. }
  44. /**
  45. * Collect Weee amounts for the credit memo
  46. *
  47. * @param Creditmemo $creditmemo
  48. * @return $this
  49. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  50. * @SuppressWarnings(PHPMD.NPathComplexity)
  51. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  52. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  53. */
  54. public function collect(Creditmemo $creditmemo)
  55. {
  56. $store = $creditmemo->getStore();
  57. $totalWeeeAmount = 0;
  58. $baseTotalWeeeAmount = 0;
  59. $totalWeeeAmountInclTax = 0;
  60. $baseTotalWeeeAmountInclTax = 0;
  61. $totalTaxAmount = 0;
  62. $baseTotalTaxAmount = 0;
  63. foreach ($creditmemo->getAllItems() as $item) {
  64. $orderItem = $item->getOrderItem();
  65. $orderItemQty = $orderItem->getQtyOrdered();
  66. if (!$orderItemQty || $orderItem->isDummy() || $item->getQty() < 0) {
  67. continue;
  68. }
  69. $ratio = $item->getQty() / $orderItemQty;
  70. $orderItemWeeeAmountExclTax = $orderItem->getWeeeTaxAppliedRowAmount();
  71. $orderItemBaseWeeeAmountExclTax = $orderItem->getBaseWeeeTaxAppliedRowAmnt();
  72. $weeeAmountExclTax = $creditmemo->roundPrice($orderItemWeeeAmountExclTax * $ratio);
  73. $baseWeeeAmountExclTax = $creditmemo->roundPrice($orderItemBaseWeeeAmountExclTax * $ratio, 'base');
  74. $orderItemWeeeAmountInclTax = $this->_weeeData->getRowWeeeTaxInclTax($orderItem);
  75. $orderItemBaseWeeeAmountInclTax = $this->_weeeData->getBaseRowWeeeTaxInclTax($orderItem);
  76. $weeeAmountInclTax = $creditmemo->roundPrice($orderItemWeeeAmountInclTax * $ratio);
  77. $baseWeeeAmountInclTax = $creditmemo->roundPrice($orderItemBaseWeeeAmountInclTax * $ratio, 'base');
  78. $itemTaxAmount = $weeeAmountInclTax - $weeeAmountExclTax;
  79. $itemBaseTaxAmount = $baseWeeeAmountInclTax - $baseWeeeAmountExclTax;
  80. $weeeAmountAvailable = $this->_weeeData->getWeeeAmountInvoiced($orderItem) -
  81. $this->_weeeData->getWeeeAmountRefunded($orderItem);
  82. $baseWeeeAmountAvailable = $this->_weeeData->getBaseWeeeAmountInvoiced($orderItem) -
  83. $this->_weeeData->getBaseWeeeAmountRefunded($orderItem);
  84. $weeeTaxAmountAvailable = $this->_weeeData->getWeeeTaxAmountInvoiced($orderItem) -
  85. $this->_weeeData->getWeeeTaxAmountRefunded($orderItem);
  86. $baseWeeeTaxAmountAvailable = $this->_weeeData->getBaseWeeeTaxAmountInvoiced($orderItem) -
  87. $this->_weeeData->getBaseWeeeTaxAmountRefunded($orderItem);
  88. if ($item->isLast()) {
  89. $weeeAmountExclTax = $weeeAmountAvailable;
  90. $baseWeeeAmountExclTax = $baseWeeeAmountAvailable;
  91. $itemTaxAmount = $weeeTaxAmountAvailable;
  92. $itemBaseTaxAmount = $baseWeeeTaxAmountAvailable;
  93. } else {
  94. $weeeAmountExclTax = min($weeeAmountExclTax, $weeeAmountAvailable);
  95. $baseWeeeAmountExclTax = min($baseWeeeAmountExclTax, $baseWeeeAmountAvailable);
  96. $itemTaxAmount = min($itemTaxAmount, $weeeTaxAmountAvailable);
  97. $itemBaseTaxAmount = min($itemBaseTaxAmount, $baseWeeeTaxAmountAvailable);
  98. }
  99. $totalWeeeAmount += $weeeAmountExclTax;
  100. $baseTotalWeeeAmount += $baseWeeeAmountExclTax;
  101. $item->setWeeeTaxAppliedRowAmount($weeeAmountExclTax);
  102. $item->setBaseWeeeTaxAppliedRowAmount($baseWeeeAmountExclTax);
  103. $totalTaxAmount += $itemTaxAmount;
  104. $baseTotalTaxAmount += $itemBaseTaxAmount;
  105. //Set the ratio of the tax amount in invoice item compared to tax amount in order item
  106. //This information is needed to calculate tax per tax rate later
  107. $orderItemTaxAmount = $orderItemWeeeAmountInclTax - $orderItemWeeeAmountExclTax;
  108. if ($orderItemTaxAmount != 0) {
  109. $taxRatio = [];
  110. if ($item->getTaxRatio()) {
  111. $taxRatio = $this->serializer->unserialize($item->getTaxRatio());
  112. }
  113. $taxRatio[\Magento\Weee\Model\Total\Quote\Weee::ITEM_TYPE] = $itemTaxAmount / $orderItemTaxAmount;
  114. $item->setTaxRatio($this->serializer->serialize($taxRatio));
  115. }
  116. $totalWeeeAmountInclTax += $weeeAmountInclTax;
  117. $baseTotalWeeeAmountInclTax += $baseWeeeAmountInclTax;
  118. $newApplied = [];
  119. $applied = $this->_weeeData->getApplied($orderItem);
  120. foreach ($applied as $one) {
  121. $title = (string)$one['title'];
  122. $one['base_row_amount'] = $creditmemo->roundPrice($one['base_row_amount'] * $ratio, $title . '_base');
  123. $one['row_amount'] = $creditmemo->roundPrice($one['row_amount'] * $ratio, $title);
  124. $one['base_row_amount_incl_tax'] = $creditmemo->roundPrice(
  125. $one['base_row_amount_incl_tax'] * $ratio,
  126. $title . '_base'
  127. );
  128. $one['row_amount_incl_tax'] = $creditmemo->roundPrice($one['row_amount_incl_tax'] * $ratio, $title);
  129. $newApplied[] = $one;
  130. }
  131. $this->_weeeData->setApplied($item, $newApplied);
  132. // Update order item
  133. $newApplied = [];
  134. $applied = $this->_weeeData->getApplied($orderItem);
  135. foreach ($applied as $one) {
  136. if (isset($one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED])) {
  137. $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] =
  138. $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] + $baseWeeeAmountExclTax;
  139. } else {
  140. $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] = $baseWeeeAmountExclTax;
  141. }
  142. if (isset($one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED])) {
  143. $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] =
  144. $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] + $weeeAmountExclTax;
  145. } else {
  146. $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] = $weeeAmountExclTax;
  147. }
  148. if (isset($one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED])) {
  149. $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] =
  150. $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] + $itemBaseTaxAmount;
  151. } else {
  152. $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] = $itemBaseTaxAmount;
  153. }
  154. if (isset($one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED])) {
  155. $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] =
  156. $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] + $itemTaxAmount;
  157. } else {
  158. $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] = $itemTaxAmount;
  159. }
  160. $newApplied[] = $one;
  161. }
  162. $this->_weeeData->setApplied($orderItem, $newApplied);
  163. $item->setWeeeTaxRowDisposition($item->getWeeeTaxDisposition() * $item->getQty());
  164. $item->setBaseWeeeTaxRowDisposition($item->getBaseWeeeTaxDisposition() * $item->getQty());
  165. }
  166. if ($this->_weeeData->includeInSubtotal($store)) {
  167. $creditmemo->setSubtotal($creditmemo->getSubtotal() + $totalWeeeAmount);
  168. $creditmemo->setBaseSubtotal($creditmemo->getBaseSubtotal() + $baseTotalWeeeAmount);
  169. }
  170. $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTaxAmount);
  171. $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTaxAmount);
  172. $creditmemo->setSubtotalInclTax(
  173. $creditmemo->getSubtotalInclTax() + $totalWeeeAmountInclTax
  174. );
  175. $creditmemo->setBaseSubtotalInclTax(
  176. $creditmemo->getBaseSubtotalInclTax() + $baseTotalWeeeAmountInclTax
  177. );
  178. $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalWeeeAmount + $totalTaxAmount);
  179. $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalWeeeAmount + $baseTotalTaxAmount);
  180. return $this;
  181. }
  182. }