Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Weee.php
Go to the documentation of this file.
1 <?php
8 
10 use Magento\Weee\Helper\Data as WeeeHelper;
13 
14 class Weee extends \Magento\Sales\Model\Order\Creditmemo\Total\AbstractTotal
15 {
21  protected $_weeeData = null;
22 
28  private $serializer;
29 
40  public function __construct(
41  WeeeHelper $weeeData,
42  array $data = [],
43  Json $serializer = null
44  ) {
45  $this->_weeeData = $weeeData;
46  $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
47  parent::__construct($data);
48  }
49 
60  public function collect(Creditmemo $creditmemo)
61  {
62  $store = $creditmemo->getStore();
63 
64  $totalWeeeAmount = 0;
65  $baseTotalWeeeAmount = 0;
66  $totalWeeeAmountInclTax = 0;
67  $baseTotalWeeeAmountInclTax = 0;
68  $totalTaxAmount = 0;
69  $baseTotalTaxAmount = 0;
70 
71  foreach ($creditmemo->getAllItems() as $item) {
72  $orderItem = $item->getOrderItem();
73  $orderItemQty = $orderItem->getQtyOrdered();
74 
75  if (!$orderItemQty || $orderItem->isDummy() || $item->getQty() < 0) {
76  continue;
77  }
78 
79  $ratio = $item->getQty() / $orderItemQty;
80 
81  $orderItemWeeeAmountExclTax = $orderItem->getWeeeTaxAppliedRowAmount();
82  $orderItemBaseWeeeAmountExclTax = $orderItem->getBaseWeeeTaxAppliedRowAmnt();
83  $weeeAmountExclTax = $creditmemo->roundPrice($orderItemWeeeAmountExclTax * $ratio);
84  $baseWeeeAmountExclTax = $creditmemo->roundPrice($orderItemBaseWeeeAmountExclTax * $ratio, 'base');
85 
86  $orderItemWeeeAmountInclTax = $this->_weeeData->getRowWeeeTaxInclTax($orderItem);
87  $orderItemBaseWeeeAmountInclTax = $this->_weeeData->getBaseRowWeeeTaxInclTax($orderItem);
88  $weeeAmountInclTax = $creditmemo->roundPrice($orderItemWeeeAmountInclTax * $ratio);
89  $baseWeeeAmountInclTax = $creditmemo->roundPrice($orderItemBaseWeeeAmountInclTax * $ratio, 'base');
90 
91  $itemTaxAmount = $weeeAmountInclTax - $weeeAmountExclTax;
92  $itemBaseTaxAmount = $baseWeeeAmountInclTax - $baseWeeeAmountExclTax;
93 
94  $weeeAmountAvailable = $this->_weeeData->getWeeeAmountInvoiced($orderItem) -
95  $this->_weeeData->getWeeeAmountRefunded($orderItem);
96  $baseWeeeAmountAvailable = $this->_weeeData->getBaseWeeeAmountInvoiced($orderItem) -
97  $this->_weeeData->getBaseWeeeAmountRefunded($orderItem);
98  $weeeTaxAmountAvailable = $this->_weeeData->getWeeeTaxAmountInvoiced($orderItem) -
99  $this->_weeeData->getWeeeTaxAmountRefunded($orderItem);
100  $baseWeeeTaxAmountAvailable = $this->_weeeData->getBaseWeeeTaxAmountInvoiced($orderItem) -
101  $this->_weeeData->getBaseWeeeTaxAmountRefunded($orderItem);
102 
103  if ($item->isLast()) {
104  $weeeAmountExclTax = $weeeAmountAvailable;
105  $baseWeeeAmountExclTax = $baseWeeeAmountAvailable;
106  $itemTaxAmount = $weeeTaxAmountAvailable;
107  $itemBaseTaxAmount = $baseWeeeTaxAmountAvailable;
108  } else {
109  $weeeAmountExclTax = min($weeeAmountExclTax, $weeeAmountAvailable);
110  $baseWeeeAmountExclTax = min($baseWeeeAmountExclTax, $baseWeeeAmountAvailable);
111  $itemTaxAmount = min($itemTaxAmount, $weeeTaxAmountAvailable);
112  $itemBaseTaxAmount = min($itemBaseTaxAmount, $baseWeeeTaxAmountAvailable);
113  }
114 
115  $totalWeeeAmount += $weeeAmountExclTax;
116  $baseTotalWeeeAmount += $baseWeeeAmountExclTax;
117 
118  $item->setWeeeTaxAppliedRowAmount($weeeAmountExclTax);
119  $item->setBaseWeeeTaxAppliedRowAmount($baseWeeeAmountExclTax);
120 
121  $totalTaxAmount += $itemTaxAmount;
122  $baseTotalTaxAmount += $itemBaseTaxAmount;
123 
124  //Set the ratio of the tax amount in invoice item compared to tax amount in order item
125  //This information is needed to calculate tax per tax rate later
126  $orderItemTaxAmount = $orderItemWeeeAmountInclTax - $orderItemWeeeAmountExclTax;
127  if ($orderItemTaxAmount != 0) {
128  $taxRatio = [];
129  if ($item->getTaxRatio()) {
130  $taxRatio = $this->serializer->unserialize($item->getTaxRatio());
131  }
132  $taxRatio[\Magento\Weee\Model\Total\Quote\Weee::ITEM_TYPE] = $itemTaxAmount / $orderItemTaxAmount;
133  $item->setTaxRatio($this->serializer->serialize($taxRatio));
134  }
135 
136  $totalWeeeAmountInclTax += $weeeAmountInclTax;
137  $baseTotalWeeeAmountInclTax += $baseWeeeAmountInclTax;
138 
139  $newApplied = [];
140  $applied = $this->_weeeData->getApplied($orderItem);
141  foreach ($applied as $one) {
142  $title = (string)$one['title'];
143  $one['base_row_amount'] = $creditmemo->roundPrice($one['base_row_amount'] * $ratio, $title . '_base');
144  $one['row_amount'] = $creditmemo->roundPrice($one['row_amount'] * $ratio, $title);
145  $one['base_row_amount_incl_tax'] = $creditmemo->roundPrice(
146  $one['base_row_amount_incl_tax'] * $ratio,
147  $title . '_base'
148  );
149  $one['row_amount_incl_tax'] = $creditmemo->roundPrice($one['row_amount_incl_tax'] * $ratio, $title);
150 
151  $newApplied[] = $one;
152  }
153  $this->_weeeData->setApplied($item, $newApplied);
154 
155  // Update order item
156  $newApplied = [];
157  $applied = $this->_weeeData->getApplied($orderItem);
158  foreach ($applied as $one) {
159  if (isset($one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED])) {
160  $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] =
161  $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] + $baseWeeeAmountExclTax;
162  } else {
163  $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_REFUNDED] = $baseWeeeAmountExclTax;
164  }
165  if (isset($one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED])) {
166  $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] =
167  $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] + $weeeAmountExclTax;
168  } else {
169  $one[WeeeHelper::KEY_WEEE_AMOUNT_REFUNDED] = $weeeAmountExclTax;
170  }
171  if (isset($one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED])) {
172  $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] =
173  $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] + $itemBaseTaxAmount;
174  } else {
175  $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_REFUNDED] = $itemBaseTaxAmount;
176  }
177  if (isset($one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED])) {
178  $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] =
179  $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] + $itemTaxAmount;
180  } else {
181  $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_REFUNDED] = $itemTaxAmount;
182  }
183 
184  $newApplied[] = $one;
185  }
186  $this->_weeeData->setApplied($orderItem, $newApplied);
187 
188  $item->setWeeeTaxRowDisposition($item->getWeeeTaxDisposition() * $item->getQty());
189  $item->setBaseWeeeTaxRowDisposition($item->getBaseWeeeTaxDisposition() * $item->getQty());
190  }
191 
192  if ($this->_weeeData->includeInSubtotal($store)) {
193  $creditmemo->setSubtotal($creditmemo->getSubtotal() + $totalWeeeAmount);
194  $creditmemo->setBaseSubtotal($creditmemo->getBaseSubtotal() + $baseTotalWeeeAmount);
195  }
196 
197  $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTaxAmount);
198  $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTaxAmount);
199 
200  $creditmemo->setSubtotalInclTax(
201  $creditmemo->getSubtotalInclTax() + $totalWeeeAmountInclTax
202  );
203  $creditmemo->setBaseSubtotalInclTax(
204  $creditmemo->getBaseSubtotalInclTax() + $baseTotalWeeeAmountInclTax
205  );
206 
207  $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalWeeeAmount + $totalTaxAmount);
208  $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalWeeeAmount + $baseTotalTaxAmount);
209 
210  return $this;
211  }
212 }
$title
Definition: default.phtml:14
$orderItem
Definition: order.php:30
collect(Creditmemo $creditmemo)
Definition: Weee.php:60
__construct(WeeeHelper $weeeData, array $data=[], Json $serializer=null)
Definition: Weee.php:40