Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CommonTaxCollector.php
Go to the documentation of this file.
1 <?php
8 
9 use Magento\Customer\Api\Data\AddressInterfaceFactory as CustomerAddressFactory;
10 use Magento\Customer\Api\Data\AddressInterface as CustomerAddress;
11 use Magento\Customer\Api\Data\RegionInterfaceFactory as CustomerAddressRegionFactory;
17 use Magento\Tax\Api\Data\QuoteDetailsInterfaceFactory;
18 use Magento\Tax\Api\Data\TaxClassKeyInterfaceFactory;
24 
30 {
34  const ITEM_TYPE_SHIPPING = 'shipping';
35  const ITEM_TYPE_PRODUCT = 'product';
41  const ITEM_CODE_SHIPPING = 'shipping';
42 
46  const KEY_ITEM = 'item';
47  const KEY_BASE_ITEM = 'base_item';
55  const KEY_ASSOCIATED_TAXABLE_UNIT_PRICE = 'unit_price';
56  const KEY_ASSOCIATED_TAXABLE_BASE_UNIT_PRICE = 'base_unit_price';
57  const KEY_ASSOCIATED_TAXABLE_QUANTITY = 'quantity';
58  const KEY_ASSOCIATED_TAXABLE_TAX_CLASS_ID = 'tax_class_id';
59  const KEY_ASSOCIATED_TAXABLE_PRICE_INCLUDES_TAX = 'price_includes_tax';
60  const KEY_ASSOCIATED_TAXABLE_ASSOCIATION_ITEM_CODE = 'associated_item_code';
68 
72  const KEY_TAX_DETAILS_TYPE = 'type';
73  const KEY_TAX_DETAILS_CODE = 'code';
74  const KEY_TAX_DETAILS_PRICE_EXCL_TAX = 'price_excl_tax';
75  const KEY_TAX_DETAILS_BASE_PRICE_EXCL_TAX = 'base_price_excl_tax';
76  const KEY_TAX_DETAILS_PRICE_INCL_TAX = 'price_incl_tax';
77  const KEY_TAX_DETAILS_BASE_PRICE_INCL_TAX = 'base_price_incl_tax';
78  const KEY_TAX_DETAILS_ROW_TOTAL = 'row_total_excl_tax';
79  const KEY_TAX_DETAILS_BASE_ROW_TOTAL = 'base_row_total_excl_tax';
80  const KEY_TAX_DETAILS_ROW_TOTAL_INCL_TAX = 'row_total_incl_tax';
81  const KEY_TAX_DETAILS_BASE_ROW_TOTAL_INCL_TAX = 'base_row_total_incl_tax';
82  const KEY_TAX_DETAILS_TAX_PERCENT = 'tax_percent';
83  const KEY_TAX_DETAILS_ROW_TAX = 'row_tax';
84  const KEY_TAX_DETAILS_BASE_ROW_TAX = 'base_row_tax';
85  const KEY_TAX_DETAILS_APPLIED_TAXES = 'applied_taxes';
89  protected $_config;
90 
96  protected $counter = 0;
97 
104 
111 
116 
121 
126 
131 
143  public function __construct(
144  \Magento\Tax\Model\Config $taxConfig,
146  \Magento\Tax\Api\Data\QuoteDetailsInterfaceFactory $quoteDetailsDataObjectFactory,
147  \Magento\Tax\Api\Data\QuoteDetailsItemInterfaceFactory $quoteDetailsItemDataObjectFactory,
148  \Magento\Tax\Api\Data\TaxClassKeyInterfaceFactory $taxClassKeyDataObjectFactory,
149  CustomerAddressFactory $customerAddressFactory,
150  CustomerAddressRegionFactory $customerAddressRegionFactory
151  ) {
152  $this->taxCalculationService = $taxCalculationService;
153  $this->quoteDetailsDataObjectFactory = $quoteDetailsDataObjectFactory;
154  $this->_config = $taxConfig;
155  $this->taxClassKeyDataObjectFactory = $taxClassKeyDataObjectFactory;
156  $this->quoteDetailsItemDataObjectFactory = $quoteDetailsItemDataObjectFactory;
157  $this->customerAddressFactory = $customerAddressFactory;
158  $this->customerAddressRegionFactory = $customerAddressRegionFactory;
159  }
160 
168  {
169  $customerAddress = $this->customerAddressFactory->create();
170  $customerAddress->setCountryId($address->getCountryId());
171  $customerAddress->setRegion(
172  $this->customerAddressRegionFactory->create()->setRegionId($address->getRegionId())
173  );
174  $customerAddress->setPostcode($address->getPostcode());
175  $customerAddress->setCity($address->getCity());
176  $customerAddress->setStreet($address->getStreet());
177 
178  return $customerAddress;
179  }
180 
191  public function mapItem(
192  \Magento\Tax\Api\Data\QuoteDetailsItemInterfaceFactory $itemDataObjectFactory,
194  $priceIncludesTax,
195  $useBaseCurrency,
196  $parentCode = null
197  ) {
198  if (!$item->getTaxCalculationItemId()) {
199  $sequence = 'sequence-' . $this->getNextIncrement();
200  $item->setTaxCalculationItemId($sequence);
201  }
203  $itemDataObject = $itemDataObjectFactory->create();
204  $itemDataObject->setCode($item->getTaxCalculationItemId())
205  ->setQuantity($item->getQty())
206  ->setTaxClassKey(
207  $this->taxClassKeyDataObjectFactory->create()
209  ->setValue($item->getProduct()->getTaxClassId())
210  )
211  ->setIsTaxIncluded($priceIncludesTax)
212  ->setType(self::ITEM_TYPE_PRODUCT);
213 
214  if ($useBaseCurrency) {
215  if (!$item->getBaseTaxCalculationPrice()) {
216  $item->setBaseTaxCalculationPrice($item->getBaseCalculationPriceOriginal());
217  }
218  $itemDataObject->setUnitPrice($item->getBaseTaxCalculationPrice())
219  ->setDiscountAmount($item->getBaseDiscountAmount());
220  } else {
221  if (!$item->getTaxCalculationPrice()) {
222  $item->setTaxCalculationPrice($item->getCalculationPriceOriginal());
223  }
224  $itemDataObject->setUnitPrice($item->getTaxCalculationPrice())
225  ->setDiscountAmount($item->getDiscountAmount());
226  }
227 
228  $itemDataObject->setParentCode($parentCode);
229 
230  return $itemDataObject;
231  }
232 
242  public function mapItemExtraTaxables(
243  \Magento\Tax\Api\Data\QuoteDetailsItemInterfaceFactory $itemDataObjectFactory,
244  AbstractItem $item,
245  $priceIncludesTax,
246  $useBaseCurrency
247  ) {
248  $itemDataObjects = [];
249  $extraTaxables = $item->getAssociatedTaxables();
250  if (!$extraTaxables) {
251  return [];
252  }
253 
254  foreach ($extraTaxables as $extraTaxable) {
255  $extraTaxableIncludesTax =
256  isset($extraTaxable['price_includes_tax']) ? $extraTaxable['price_includes_tax'] : $priceIncludesTax;
257 
258  if ($useBaseCurrency) {
259  $unitPrice = $extraTaxable[self::KEY_ASSOCIATED_TAXABLE_BASE_UNIT_PRICE];
260  } else {
261  $unitPrice = $extraTaxable[self::KEY_ASSOCIATED_TAXABLE_UNIT_PRICE];
262  }
264  $itemDataObject = $itemDataObjectFactory->create();
265  $itemDataObject->setCode($extraTaxable[self::KEY_ASSOCIATED_TAXABLE_CODE])
266  ->setType($extraTaxable[self::KEY_ASSOCIATED_TAXABLE_TYPE])
267  ->setQuantity($extraTaxable[self::KEY_ASSOCIATED_TAXABLE_QUANTITY])
268  ->setTaxClassKey(
269  $this->taxClassKeyDataObjectFactory->create()
271  ->setValue($extraTaxable[self::KEY_ASSOCIATED_TAXABLE_TAX_CLASS_ID])
272  )
273  ->setUnitPrice($unitPrice)
274  ->setIsTaxIncluded($extraTaxableIncludesTax)
275  ->setAssociatedItemCode($item->getTaxCalculationItemId());
276  $itemDataObjects[] = $itemDataObject;
277  }
278 
279  return $itemDataObjects;
280  }
281 
290  public function mapItems(
291  ShippingAssignmentInterface $shippingAssignment,
292  $priceIncludesTax,
293  $useBaseCurrency
294  ) {
295  $items = $shippingAssignment->getItems();
296  if (!count($items)) {
297  return [];
298  }
299 
300  //Populate with items
301  $itemDataObjectFactory = $this->quoteDetailsItemDataObjectFactory;
302  $itemDataObjects = [];
303  foreach ($items as $item) {
304  if ($item->getParentItem()) {
305  continue;
306  }
307 
308  if ($item->getHasChildren() && $item->isChildrenCalculated()) {
309  $parentItemDataObject = $this->mapItem(
310  $itemDataObjectFactory,
311  $item,
312  $priceIncludesTax,
313  $useBaseCurrency
314  );
315  $itemDataObjects[] = $parentItemDataObject;
316  foreach ($item->getChildren() as $child) {
317  $childItemDataObject = $this->mapItem(
318  $itemDataObjectFactory,
319  $child,
320  $priceIncludesTax,
321  $useBaseCurrency,
322  $parentItemDataObject->getCode()
323  );
324  $itemDataObjects[] = $childItemDataObject;
325  $extraTaxableItems = $this->mapItemExtraTaxables(
326  $itemDataObjectFactory,
327  $item,
328  $priceIncludesTax,
329  $useBaseCurrency
330  );
331  $itemDataObjects = array_merge($itemDataObjects, $extraTaxableItems);
332  }
333  } else {
334  $itemDataObject = $this->mapItem($itemDataObjectFactory, $item, $priceIncludesTax, $useBaseCurrency);
335  $itemDataObjects[] = $itemDataObject;
336  $extraTaxableItems = $this->mapItemExtraTaxables(
337  $itemDataObjectFactory,
338  $item,
339  $priceIncludesTax,
340  $useBaseCurrency
341  );
342  $itemDataObjects = array_merge($itemDataObjects, $extraTaxableItems);
343  }
344  }
345 
346  return $itemDataObjects;
347  }
348 
357  {
358  $quoteDetails->setBillingAddress($this->mapAddress($address->getQuote()->getBillingAddress()));
359  $quoteDetails->setShippingAddress($this->mapAddress($address));
360  return $quoteDetails;
361  }
362 
369  public function getShippingDataObject(
370  ShippingAssignmentInterface $shippingAssignment,
372  $useBaseCurrency
373  ) {
374  $store = $shippingAssignment->getShipping()->getAddress()->getQuote()->getStore();
375  if ($total->getShippingTaxCalculationAmount() === null) {
376  //Save the original shipping amount because shipping amount will be overridden
377  //with shipping amount excluding tax
378  $total->setShippingTaxCalculationAmount($total->getShippingAmount());
379  $total->setBaseShippingTaxCalculationAmount($total->getBaseShippingAmount());
380  }
381  if ($total->getShippingTaxCalculationAmount() !== null) {
383  $itemDataObject = $this->quoteDetailsItemDataObjectFactory->create()
384  ->setType(self::ITEM_TYPE_SHIPPING)
385  ->setCode(self::ITEM_CODE_SHIPPING)
386  ->setQuantity(1);
387  if ($useBaseCurrency) {
388  $itemDataObject->setUnitPrice($total->getBaseShippingTaxCalculationAmount());
389  } else {
390  $itemDataObject->setUnitPrice($total->getShippingTaxCalculationAmount());
391  }
392  if ($total->getShippingDiscountAmount()) {
393  if ($useBaseCurrency) {
394  $itemDataObject->setDiscountAmount($total->getBaseShippingDiscountAmount());
395  } else {
396  $itemDataObject->setDiscountAmount($total->getShippingDiscountAmount());
397  }
398  }
399  $itemDataObject->setTaxClassKey(
400  $this->taxClassKeyDataObjectFactory->create()
402  ->setValue($this->_config->getShippingTaxClass($store))
403  );
404  $itemDataObject->setIsTaxIncluded(
405  $this->_config->shippingPriceIncludesTax($store)
406  );
407  return $itemDataObject;
408  }
409 
410  return null;
411  }
412 
420  protected function prepareQuoteDetails(ShippingAssignmentInterface $shippingAssignment, $itemDataObjects)
421  {
422  $items = $shippingAssignment->getItems();
423  $address = $shippingAssignment->getShipping()->getAddress();
424  if (!count($items)) {
425  return $this->quoteDetailsDataObjectFactory->create();
426  }
427 
428  $quoteDetails = $this->quoteDetailsDataObjectFactory->create();
429  $this->populateAddressData($quoteDetails, $address);
430 
431  //Set customer tax class
432  $quoteDetails->setCustomerTaxClassKey(
433  $this->taxClassKeyDataObjectFactory->create()
435  ->setValue($address->getQuote()->getCustomerTaxClassId())
436  );
437  $quoteDetails->setItems($itemDataObjects);
438  $quoteDetails->setCustomerId($address->getQuote()->getCustomerId());
439 
440  return $quoteDetails;
441  }
442 
450  protected function organizeItemTaxDetailsByType(
451  TaxDetailsInterface $taxDetails,
452  TaxDetailsInterface $baseTaxDetails
453  ) {
455  $keyedItems = [];
456  foreach ($taxDetails->getItems() as $item) {
457  $keyedItems[$item->getCode()] = $item;
458  }
460  $baseKeyedItems = [];
461  foreach ($baseTaxDetails->getItems() as $item) {
462  $baseKeyedItems[$item->getCode()] = $item;
463  }
464 
465  $itemsByType = [];
466  foreach ($keyedItems as $code => $item) {
467  $baseItem = $baseKeyedItems[$code];
468  $itemType = $item->getType();
469  $itemsByType[$itemType][$code] = [self::KEY_ITEM => $item, self::KEY_BASE_ITEM => $baseItem];
470  }
471 
472  return $itemsByType;
473  }
474 
485  protected function processProductItems(
486  ShippingAssignmentInterface $shippingAssignment,
487  array $itemTaxDetails,
488  QuoteAddress\Total $total
489  ) {
490  $store = $shippingAssignment->getShipping()->getAddress()->getQuote()->getStore();
491 
493  $keyedAddressItems = [];
494  foreach ($shippingAssignment->getItems() as $addressItem) {
495  $keyedAddressItems[$addressItem->getTaxCalculationItemId()] = $addressItem;
496  }
497 
498  $subtotal = $baseSubtotal = 0;
499  $discountTaxCompensation = $baseDiscountTaxCompensation = 0;
500  $tax = $baseTax = 0;
501  $subtotalInclTax = $baseSubtotalInclTax = 0;
502 
503  foreach ($itemTaxDetails as $code => $itemTaxDetail) {
505  $taxDetail = $itemTaxDetail[self::KEY_ITEM];
507  $baseTaxDetail = $itemTaxDetail[self::KEY_BASE_ITEM];
508  $quoteItem = $keyedAddressItems[$code];
509  $this->updateItemTaxInfo($quoteItem, $taxDetail, $baseTaxDetail, $store);
510 
511  //Update aggregated values
512  if ($quoteItem->getHasChildren() && $quoteItem->isChildrenCalculated()) {
513  //avoid double counting
514  continue;
515  }
516  $subtotal += $taxDetail->getRowTotal();
517  $baseSubtotal += $baseTaxDetail->getRowTotal();
518  $discountTaxCompensation += $taxDetail->getDiscountTaxCompensationAmount();
519  $baseDiscountTaxCompensation += $baseTaxDetail->getDiscountTaxCompensationAmount();
520  $tax += $taxDetail->getRowTax();
521  $baseTax += $baseTaxDetail->getRowTax();
522  $subtotalInclTax += $taxDetail->getRowTotalInclTax();
523  $baseSubtotalInclTax += $baseTaxDetail->getRowTotalInclTax();
524  }
525 
526  //Set aggregated values
527  $total->setTotalAmount('subtotal', $subtotal);
528  $total->setBaseTotalAmount('subtotal', $baseSubtotal);
529  $total->setTotalAmount('tax', $tax);
530  $total->setBaseTotalAmount('tax', $baseTax);
531  $total->setTotalAmount('discount_tax_compensation', $discountTaxCompensation);
532  $total->setBaseTotalAmount('discount_tax_compensation', $baseDiscountTaxCompensation);
533 
534  $total->setSubtotalInclTax($subtotalInclTax);
535  $total->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);
536  $total->setBaseSubtotalInclTax($baseSubtotalInclTax);
537  $shippingAssignment->getShipping()->getAddress()->setBaseSubtotalTotalInclTax($baseSubtotalInclTax);
538 
539  return $this;
540  }
541 
549  protected function processAppliedTaxes(
550  QuoteAddress\Total $total,
551  ShippingAssignmentInterface $shippingAssignment,
552  array $itemsByType
553  ) {
554  $total->setAppliedTaxes([]);
555  $allAppliedTaxesArray = [];
556 
558  $keyedAddressItems = [];
559  foreach ($shippingAssignment->getItems() as $addressItem) {
560  $keyedAddressItems[$addressItem->getTaxCalculationItemId()] = $addressItem;
561  }
562 
563  foreach ($itemsByType as $itemType => $items) {
564  foreach ($items as $itemTaxCalculationId => $itemTaxDetails) {
566  $taxDetails = $itemTaxDetails[self::KEY_ITEM];
567  $baseTaxDetails = $itemTaxDetails[self::KEY_BASE_ITEM];
568 
569  $appliedTaxes = $taxDetails->getAppliedTaxes();
570  $baseAppliedTaxes = $baseTaxDetails->getAppliedTaxes();
571 
572  $itemType = $taxDetails->getType();
573  $itemId = null;
574  $associatedItemId = null;
575  if ($itemType == self::ITEM_TYPE_PRODUCT) {
576  //Use item id instead of tax calculation id
577  $itemId = $keyedAddressItems[$itemTaxCalculationId]->getId();
578  } else {
579  if ($taxDetails->getAssociatedItemCode()
580  && $taxDetails->getAssociatedItemCode() != self::ASSOCIATION_ITEM_CODE_FOR_QUOTE) {
581  //This item is associated with a product item
582  $associatedItemId = $keyedAddressItems[$taxDetails->getAssociatedItemCode()]->getId();
583  } else {
584  //This item is associated with an order, e.g., shipping, etc.
585  $itemId = null;
586  }
587  }
588  $extraInfo = [
589  'item_id' => $itemId,
590  'item_type' => $itemType,
591  'associated_item_id' => $associatedItemId,
592  ];
593 
594  $appliedTaxesArray = $this->convertAppliedTaxes($appliedTaxes, $baseAppliedTaxes, $extraInfo);
595 
596  if ($itemType == self::ITEM_TYPE_PRODUCT) {
597  $quoteItem = $keyedAddressItems[$itemTaxCalculationId];
598  $quoteItem->setAppliedTaxes($appliedTaxesArray);
599  }
600 
601  $allAppliedTaxesArray[$itemTaxCalculationId] = $appliedTaxesArray;
602 
603  foreach ($appliedTaxesArray as $appliedTaxArray) {
604  $this->_saveAppliedTaxes(
605  $total,
606  [$appliedTaxArray],
607  $appliedTaxArray['amount'],
608  $appliedTaxArray['base_amount'],
609  $appliedTaxArray['percent']
610  );
611  }
612  }
613  }
614 
615  $total->setItemsAppliedTaxes($allAppliedTaxesArray);
616 
617  return $this;
618  }
619 
629  public function updateItemTaxInfo($quoteItem, $itemTaxDetails, $baseItemTaxDetails, $store)
630  {
631  //The price should be base price
632  $quoteItem->setPrice($baseItemTaxDetails->getPrice());
633  $quoteItem->setConvertedPrice($itemTaxDetails->getPrice());
634  $quoteItem->setPriceInclTax($itemTaxDetails->getPriceInclTax());
635  $quoteItem->setRowTotal($itemTaxDetails->getRowTotal());
636  $quoteItem->setRowTotalInclTax($itemTaxDetails->getRowTotalInclTax());
637  $quoteItem->setTaxAmount($itemTaxDetails->getRowTax());
638  $quoteItem->setTaxPercent($itemTaxDetails->getTaxPercent());
639  $quoteItem->setDiscountTaxCompensationAmount($itemTaxDetails->getDiscountTaxCompensationAmount());
640 
641  $quoteItem->setBasePrice($baseItemTaxDetails->getPrice());
642  $quoteItem->setBasePriceInclTax($baseItemTaxDetails->getPriceInclTax());
643  $quoteItem->setBaseRowTotal($baseItemTaxDetails->getRowTotal());
644  $quoteItem->setBaseRowTotalInclTax($baseItemTaxDetails->getRowTotalInclTax());
645  $quoteItem->setBaseTaxAmount($baseItemTaxDetails->getRowTax());
646  $quoteItem->setTaxPercent($baseItemTaxDetails->getTaxPercent());
647  $quoteItem->setBaseDiscountTaxCompensationAmount($baseItemTaxDetails->getDiscountTaxCompensationAmount());
648 
649  //Set discount calculation price, this may be needed by discount collector
650  if ($this->_config->discountTax($store)) {
651  $quoteItem->setDiscountCalculationPrice($itemTaxDetails->getPriceInclTax());
652  $quoteItem->setBaseDiscountCalculationPrice($baseItemTaxDetails->getPriceInclTax());
653  } else {
654  $quoteItem->setDiscountCalculationPrice($itemTaxDetails->getPrice());
655  $quoteItem->setBaseDiscountCalculationPrice($baseItemTaxDetails->getPrice());
656  }
657 
658  return $this;
659  }
660 
670  protected function processShippingTaxInfo(
671  ShippingAssignmentInterface $shippingAssignment,
673  $shippingTaxDetails,
674  $baseShippingTaxDetails
675  ) {
676  $total->setTotalAmount('shipping', $shippingTaxDetails->getRowTotal());
677  $total->setBaseTotalAmount('shipping', $baseShippingTaxDetails->getRowTotal());
678  $total->setTotalAmount(
679  'shipping_discount_tax_compensation',
680  $shippingTaxDetails->getDiscountTaxCompensationAmount()
681  );
682  $total->setBaseTotalAmount(
683  'shipping_discount_tax_compensation',
684  $baseShippingTaxDetails->getDiscountTaxCompensationAmount()
685  );
686 
687  $total->setShippingInclTax($shippingTaxDetails->getRowTotalInclTax());
688  $total->setBaseShippingInclTax($baseShippingTaxDetails->getRowTotalInclTax());
689  $total->setShippingTaxAmount($shippingTaxDetails->getRowTax());
690  $total->setBaseShippingTaxAmount($baseShippingTaxDetails->getRowTax());
691 
692  //Add the shipping tax to total tax amount
693  $total->addTotalAmount('tax', $shippingTaxDetails->getRowTax());
694  $total->addBaseTotalAmount('tax', $baseShippingTaxDetails->getRowTax());
695 
696  if ($this->_config->discountTax($shippingAssignment->getShipping()->getAddress()->getQuote()->getStore())) {
697  $total->setShippingAmountForDiscount($shippingTaxDetails->getRowTotalInclTax());
698  $total->setBaseShippingAmountForDiscount($baseShippingTaxDetails->getRowTotalInclTax());
699  }
700 
701  return $this;
702  }
703 
712  public function convertAppliedTaxes($appliedTaxes, $baseAppliedTaxes, $extraInfo = [])
713  {
714  $appliedTaxesArray = [];
715 
716  if (!$appliedTaxes || !$baseAppliedTaxes) {
717  return $appliedTaxesArray;
718  }
719 
720  foreach ($appliedTaxes as $taxId => $appliedTax) {
721  $baseAppliedTax = $baseAppliedTaxes[$taxId];
722  $rateDataObjects = $appliedTax->getRates();
723 
724  $rates = [];
725  foreach ($rateDataObjects as $rateDataObject) {
726  $rates[] = [
727  'percent' => $rateDataObject->getPercent(),
728  'code' => $rateDataObject->getCode(),
729  'title' => $rateDataObject->getTitle(),
730  ];
731  }
732 
733  $appliedTaxArray = [
734  'amount' => $appliedTax->getAmount(),
735  'base_amount' => $baseAppliedTax->getAmount(),
736  'percent' => $appliedTax->getPercent(),
737  'id' => $appliedTax->getTaxRateKey(),
738  'rates' => $rates,
739  ];
740  if (!empty($extraInfo)) {
741  $appliedTaxArray = array_merge($appliedTaxArray, $extraInfo);
742  }
743 
744  $appliedTaxesArray[] = $appliedTaxArray;
745  }
746 
747  return $appliedTaxesArray;
748  }
749 
762  protected function _saveAppliedTaxes(
764  $applied,
765  $amount,
766  $baseAmount,
767  $rate
768  ) {
769  $previouslyAppliedTaxes = $total->getAppliedTaxes();
770  $process = count($previouslyAppliedTaxes);
771 
772  foreach ($applied as $row) {
773  if ($row['percent'] == 0) {
774  continue;
775  }
776  if (!isset($previouslyAppliedTaxes[$row['id']])) {
777  $row['process'] = $process;
778  $row['amount'] = 0;
779  $row['base_amount'] = 0;
780  $previouslyAppliedTaxes[$row['id']] = $row;
781  }
782 
783  if ($row['percent'] !== null) {
784  $row['percent'] = $row['percent'] ? $row['percent'] : 1;
785  $rate = $rate ? $rate : 1;
786 
787  $appliedAmount = $amount / $rate * $row['percent'];
788  $baseAppliedAmount = $baseAmount / $rate * $row['percent'];
789  } else {
790  $appliedAmount = 0;
791  $baseAppliedAmount = 0;
792  foreach ($row['rates'] as $rate) {
793  $appliedAmount += $rate['amount'];
794  $baseAppliedAmount += $rate['base_amount'];
795  }
796  }
797 
798  if ($appliedAmount || $previouslyAppliedTaxes[$row['id']]['amount']) {
799  $previouslyAppliedTaxes[$row['id']]['amount'] += $appliedAmount;
800  $previouslyAppliedTaxes[$row['id']]['base_amount'] += $baseAppliedAmount;
801  } else {
802  unset($previouslyAppliedTaxes[$row['id']]);
803  }
804  }
805  $total->setAppliedTaxes($previouslyAppliedTaxes);
806  }
807 
813  protected function includeShipping()
814  {
815  return false;
816  }
817 
823  protected function includeItems()
824  {
825  return false;
826  }
827 
833  protected function includeExtraTax()
834  {
835  return false;
836  }
837 
843  protected function saveAppliedTaxes()
844  {
845  return false;
846  }
847 
854  protected function getNextIncrement()
855  {
856  return ++$this->counter;
857  }
858 }
setBillingAddress(\Magento\Customer\Api\Data\AddressInterface $billingAddress=null)
__construct(\Magento\Tax\Model\Config $taxConfig, \Magento\Tax\Api\TaxCalculationInterface $taxCalculationService, \Magento\Tax\Api\Data\QuoteDetailsInterfaceFactory $quoteDetailsDataObjectFactory, \Magento\Tax\Api\Data\QuoteDetailsItemInterfaceFactory $quoteDetailsItemDataObjectFactory, \Magento\Tax\Api\Data\TaxClassKeyInterfaceFactory $taxClassKeyDataObjectFactory, CustomerAddressFactory $customerAddressFactory, CustomerAddressRegionFactory $customerAddressRegionFactory)
$rates
Definition: tax.phtml:35
populateAddressData(QuoteDetailsInterface $quoteDetails, QuoteAddress $address)
$baseAmount
Definition: tax.phtml:46
$address
Definition: customer.php:38
$amount
Definition: order.php:14
setShippingAddress(\Magento\Customer\Api\Data\AddressInterface $shippingAddress=null)
convertAppliedTaxes($appliedTaxes, $baseAppliedTaxes, $extraInfo=[])
$quoteItem
Definition: quote.php:38
updateItemTaxInfo($quoteItem, $itemTaxDetails, $baseItemTaxDetails, $store)
mapItems(ShippingAssignmentInterface $shippingAssignment, $priceIncludesTax, $useBaseCurrency)
prepareQuoteDetails(ShippingAssignmentInterface $shippingAssignment, $itemDataObjects)
processShippingTaxInfo(ShippingAssignmentInterface $shippingAssignment, QuoteAddress\Total $total, $shippingTaxDetails, $baseShippingTaxDetails)
_saveAppliedTaxes(QuoteAddress\Total $total, $applied, $amount, $baseAmount, $rate)
$customerAddress
$code
Definition: info.phtml:12
$items