Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
TaxManagement.php
Go to the documentation of this file.
1 <?php
9 
11 use Magento\Tax\Api\Data\OrderTaxDetailsAppliedTaxInterfaceFactory as TaxDetailsDataObjectFactory;
14 
16 {
21 
25  protected $orderFactory;
26 
31 
36 
41 
49  public function __construct(
50  \Magento\Sales\Model\OrderFactory $orderFactory,
51  \Magento\Sales\Model\ResourceModel\Order\Tax\ItemFactory $orderItemTaxFactory,
52  \Magento\Tax\Api\Data\OrderTaxDetailsInterfaceFactory $orderTaxDetailsDataObjectFactory,
53  \Magento\Tax\Api\Data\OrderTaxDetailsItemInterfaceFactory $itemDataObjectFactory,
54  TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory
55  ) {
56  $this->orderFactory = $orderFactory;
57  $this->orderItemTaxFactory = $orderItemTaxFactory;
58  $this->orderTaxDetailsDataObjectFactory = $orderTaxDetailsDataObjectFactory;
59  $this->itemDataObjectFactory = $itemDataObjectFactory;
60  $this->appliedTaxDataObjectFactory = $appliedTaxDataObjectFactory;
61  }
62 
71  protected function convertToAppliedTaxDataObject(
72  TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory,
73  $itemAppliedTax,
74  AppliedTax $existingAppliedTax = null
75  ) {
76  // if there is an existingAppliedTax, include its amount and baseAmount
77  $amount = $baseAmount = 0;
78  if ($existingAppliedTax !== null) {
79  $amount = $existingAppliedTax->getAmount();
80  $baseAmount = $existingAppliedTax->getBaseAmount();
81  }
82 
83  return $appliedTaxDataObjectFactory->create()
84  ->setCode($itemAppliedTax['code'])
85  ->setTitle($itemAppliedTax['title'])
86  ->setPercent($itemAppliedTax['tax_percent'])
87  ->setAmount($itemAppliedTax['real_amount'] + $amount)
88  ->setBaseAmount($itemAppliedTax['real_base_amount'] + $baseAmount);
89  }
90 
98  protected function aggregateAppliedTaxes(TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory, $items)
99  {
100  $orderAppliedTaxes = [];
101  $orderAppliedTaxesData = [];
102  foreach ($items as $item) {
103  $itemAppliedTaxes = $item->getAppliedTaxes();
104  foreach ($itemAppliedTaxes as $itemAppliedTax) {
105  $code = $itemAppliedTax->getCode();
106  if (!isset($orderAppliedTaxesData[$code])) {
107  $orderAppliedTaxesData[$code] = [
108  Tax::KEY_CODE => $code,
109  Tax::KEY_TITLE => $itemAppliedTax->getTitle(),
110  Tax::KEY_PERCENT => $itemAppliedTax->getPercent(),
111  Tax::KEY_AMOUNT => $itemAppliedTax->getAmount(),
112  Tax::KEY_BASE_AMOUNT => $itemAppliedTax->getBaseAmount(),
113  ];
114  } else {
115  $orderAppliedTaxesData[$code][Tax::KEY_AMOUNT] += $itemAppliedTax->getAmount();
116  $orderAppliedTaxesData[$code][Tax::KEY_BASE_AMOUNT] += $itemAppliedTax->getBaseAmount();
117  }
118  }
119  }
120  foreach ($orderAppliedTaxesData as $orderAppliedTaxData) {
121  $orderAppliedTaxes[] = $appliedTaxDataObjectFactory->create()
122  ->setCode($orderAppliedTaxData[Tax::KEY_CODE])
123  ->setTitle($orderAppliedTaxData[Tax::KEY_TITLE])
124  ->setPercent($orderAppliedTaxData[Tax::KEY_PERCENT])
125  ->setAmount($orderAppliedTaxData[Tax::KEY_AMOUNT])
126  ->setBaseAmount($orderAppliedTaxData[Tax::KEY_BASE_AMOUNT]);
127  }
128  return $orderAppliedTaxes;
129  }
130 
134  public function getOrderTaxDetails($orderId)
135  {
136  $order = $this->orderFactory->create()->load($orderId);
137  if (!$order) {
138  throw new NoSuchEntityException(
139  __(
140  'No such entity with %fieldName = %fieldValue',
141  ['fieldName' => 'orderId', 'fieldValue' => $orderId]
142  )
143  );
144  }
145 
146  $orderItemAppliedTaxes = $this->orderItemTaxFactory->create()->getTaxItemsByOrderId($orderId);
147  $itemsData = [];
148  foreach ($orderItemAppliedTaxes as $itemAppliedTax) {
149  $key = $itemId = $associatedItemId = null;
150 
151  //group applied taxes by item
152  if (isset($itemAppliedTax['item_id'])) {
153  //The taxable is a product
154  //Note: the associatedItemId is null
155  $itemId = $itemAppliedTax['item_id'];
156  $key = $itemId;
157  } elseif (isset($itemAppliedTax['associated_item_id'])) {
158  //The taxable is associated with a product, e.g., weee, gift wrapping, etc.
159  //Note: the itemId is null
160  $associatedItemId = $itemAppliedTax['associated_item_id'];
161  $key = $itemAppliedTax['taxable_item_type'] . $associatedItemId;
162  } else {
163  //The taxable is not associated with a product, e.g., shipping
164  //Use item type as key. Both the itemId and associatedItemId are null
165  $key = $itemAppliedTax['taxable_item_type'];
166  }
167 
168  // create the itemsData entry
169  if (!isset($itemsData[$key])) {
170  $itemsData[$key] = [
171  Item::KEY_TYPE => $itemAppliedTax['taxable_item_type'],
172  Item::KEY_ITEM_ID => $itemId, // might be null
173  Item::KEY_ASSOCIATED_ITEM_ID => $associatedItemId, // might be null
174  ];
175  }
176  $current = null;
177  if (isset($itemsData[$key][Item::KEY_APPLIED_TAXES][$itemAppliedTax['code']])) {
178  $current = $itemsData[$key][Item::KEY_APPLIED_TAXES][$itemAppliedTax['code']];
179  }
180  $itemsData[$key][Item::KEY_APPLIED_TAXES][$itemAppliedTax['code']] =
181  $this->convertToAppliedTaxDataObject($this->appliedTaxDataObjectFactory, $itemAppliedTax, $current);
182  }
183 
184  $items = [];
185  foreach ($itemsData as $itemData) {
186  $items[] = $this->itemDataObjectFactory->create()
187  ->setType($itemData[Item::KEY_TYPE])
188  ->setItemId($itemData[Item::KEY_ITEM_ID])
189  ->setAssociatedItemId($itemData[Item::KEY_ASSOCIATED_ITEM_ID])
190  ->setAppliedTaxes($itemData[Item::KEY_APPLIED_TAXES]);
191  }
192  $orderAppliedTaxesDOs = $this->aggregateAppliedTaxes($this->appliedTaxDataObjectFactory, $items);
193  return $this->orderTaxDetailsDataObjectFactory->create()
194  ->setItems($items)
195  ->setAppliedTaxes($orderAppliedTaxesDOs);
196  }
197 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
convertToAppliedTaxDataObject(TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory, $itemAppliedTax, AppliedTax $existingAppliedTax=null)
$order
Definition: order.php:55
__()
Definition: __.php:13
__construct(\Magento\Sales\Model\OrderFactory $orderFactory, \Magento\Sales\Model\ResourceModel\Order\Tax\ItemFactory $orderItemTaxFactory, \Magento\Tax\Api\Data\OrderTaxDetailsInterfaceFactory $orderTaxDetailsDataObjectFactory, \Magento\Tax\Api\Data\OrderTaxDetailsItemInterfaceFactory $itemDataObjectFactory, TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory)
$baseAmount
Definition: tax.phtml:46
$amount
Definition: order.php:14
aggregateAppliedTaxes(TaxDetailsDataObjectFactory $appliedTaxDataObjectFactory, $items)
$code
Definition: info.phtml:12
$items