/** * @param \Magento\Quote\Model\Quote\Address $address * @return bool */ public function isCanApplyMsrp($address) { $canApplyMsrp = false; foreach ($address->getAllItems() as $item) { if (!$item->getParentItemId() && $this->msrpHelper->isShowBeforeOrderConfirm($item->getProductId()) && $this->msrpHelper->isMinimalPriceLessMsrp($item->getProductId())) { $canApplyMsrp = true; break; } } return $canApplyMsrp; }
/** * @param \Magento\Quote\Model\Quote\Address $address * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function collect(\Magento\Quote\Model\Quote\Address $address) { $quote = $address->getQuote(); $eventArgs = ['website_id' => $this->_storeManager->getStore($quote->getStoreId())->getWebsiteId(), 'customer_group_id' => $quote->getCustomerGroupId(), 'coupon_code' => $quote->getCouponCode()]; $address->setFreeShipping(0); $totalDiscountAmount = 0; $subtotalWithDiscount = 0; $baseTotalDiscountAmount = 0; $baseSubtotalWithDiscount = 0; $items = $address->getAllItems(); if (!count($items)) { $address->setDiscountAmount($totalDiscountAmount); $address->setSubtotalWithDiscount($subtotalWithDiscount); $address->setBaseDiscountAmount($baseTotalDiscountAmount); $address->setBaseSubtotalWithDiscount($baseSubtotalWithDiscount); return $this; } foreach ($items as $item) { if ($item->getNoDiscount()) { $item->setDiscountAmount(0); $item->setBaseDiscountAmount(0); $item->setRowTotalWithDiscount($item->getRowTotal()); $item->setBaseRowTotalWithDiscount($item->getRowTotal()); $subtotalWithDiscount += $item->getRowTotal(); $baseSubtotalWithDiscount += $item->getBaseRowTotal(); } else { /** * Child item discount we calculate for parent */ if ($item->getParentItemId()) { continue; } /** * Composite item discount calculation */ if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $eventArgs['item'] = $child; $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); /** * Parent free shipping we apply to all children */ if ($item->getFreeShipping()) { $child->setFreeShipping($item->getFreeShipping()); } if (!$child->getDiscountAmount() && $item->getDiscountPercent()) { $child->setDiscountAmount($child->getRowTotal() * $item->getDiscountPercent()); } $totalDiscountAmount += $child->getDiscountAmount(); //*$item->getQty(); $baseTotalDiscountAmount += $child->getBaseDiscountAmount(); //*$item->getQty(); $child->setRowTotalWithDiscount($child->getRowTotal() - $child->getDiscountAmount()); $child->setBaseRowTotalWithDiscount($child->getBaseRowTotal() - $child->getBaseDiscountAmount()); $subtotalWithDiscount += $child->getRowTotalWithDiscount(); $baseSubtotalWithDiscount += $child->getBaseRowTotalWithDiscount(); } } else { $eventArgs['item'] = $item; $this->_eventManager->dispatch('sales_quote_address_discount_item', $eventArgs); $totalDiscountAmount += $item->getDiscountAmount(); $baseTotalDiscountAmount += $item->getBaseDiscountAmount(); $item->setRowTotalWithDiscount($item->getRowTotal() - $item->getDiscountAmount()); $item->setBaseRowTotalWithDiscount($item->getBaseRowTotal() - $item->getBaseDiscountAmount()); $subtotalWithDiscount += $item->getRowTotalWithDiscount(); $baseSubtotalWithDiscount += $item->getBaseRowTotalWithDiscount(); } } } $address->setDiscountAmount($totalDiscountAmount); $address->setSubtotalWithDiscount($subtotalWithDiscount); $address->setBaseDiscountAmount($baseTotalDiscountAmount); $address->setBaseSubtotalWithDiscount($baseSubtotalWithDiscount); $address->setGrandTotal($address->getGrandTotal() - $address->getDiscountAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() - $address->getBaseDiscountAmount()); return $this; }
/** * @param \Magento\Quote\Model\Quote\Address $address * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function collect(\Magento\Quote\Model\Quote\Address $address) { $store = $address->getQuote()->getStore(); $address->setTaxAmount(0); $address->setBaseTaxAmount(0); $address->setAppliedTaxes([]); $items = $address->getAllItems(); if (!count($items)) { return $this; } $custTaxClassId = $address->getQuote()->getCustomerTaxClassId(); $taxCalculationModel = $this->_calculation; /* @var $taxCalculationModel \Magento\Tax\Model\Calculation */ $request = $taxCalculationModel->getRateRequest($address, $address->getQuote()->getBillingAddress(), $custTaxClassId, $store); foreach ($items as $item) { /** * Child item's tax we calculate for parent */ if ($item->getParentItemId()) { continue; } /** * We calculate parent tax amount as sum of children's tax amounts */ if ($item->getHasChildren() && $item->isChildrenCalculated()) { foreach ($item->getChildren() as $child) { $discountBefore = $item->getDiscountAmount(); $baseDiscountBefore = $item->getBaseDiscountAmount(); $rate = $taxCalculationModel->getRate($request->setProductClassId($child->getProduct()->getTaxClassId())); $child->setTaxPercent($rate); $child->calcTaxAmount(); if ($discountBefore != $item->getDiscountAmount()) { $address->setDiscountAmount($address->getDiscountAmount() + ($item->getDiscountAmount() - $discountBefore)); $address->setBaseDiscountAmount($address->getBaseDiscountAmount() + ($item->getBaseDiscountAmount() - $baseDiscountBefore)); $address->setGrandTotal($address->getGrandTotal() - ($item->getDiscountAmount() - $discountBefore)); $address->setBaseGrandTotal($address->getBaseGrandTotal() - ($item->getBaseDiscountAmount() - $baseDiscountBefore)); } $this->_saveAppliedTaxes($address, $taxCalculationModel->getAppliedRates($request), $child->getTaxAmount(), $child->getBaseTaxAmount(), $rate); } $itemTaxAmount = $item->getTaxAmount() + $item->getDiscountTaxCompensation(); $address->setTaxAmount($address->getTaxAmount() + $itemTaxAmount); $itemBaseTaxAmount = $item->getBaseTaxAmount() + $item->getBaseDiscountTaxCompensation(); $address->setBaseTaxAmount($address->getBaseTaxAmount() + $itemBaseTaxAmount); } else { $discountBefore = $item->getDiscountAmount(); $baseDiscountBefore = $item->getBaseDiscountAmount(); $rate = $taxCalculationModel->getRate($request->setProductClassId($item->getProduct()->getTaxClassId())); $item->setTaxPercent($rate); $item->calcTaxAmount(); if ($discountBefore != $item->getDiscountAmount()) { $address->setDiscountAmount($address->getDiscountAmount() + ($item->getDiscountAmount() - $discountBefore)); $address->setBaseDiscountAmount($address->getBaseDiscountAmount() + ($item->getBaseDiscountAmount() - $baseDiscountBefore)); $address->setGrandTotal($address->getGrandTotal() - ($item->getDiscountAmount() - $discountBefore)); $address->setBaseGrandTotal($address->getBaseGrandTotal() - ($item->getBaseDiscountAmount() - $baseDiscountBefore)); } $itemTaxAmount = $item->getTaxAmount() + $item->getDiscountTaxCompensation(); $address->setTaxAmount($address->getTaxAmount() + $itemTaxAmount); $itemBaseTaxAmount = $item->getBaseTaxAmount() + $item->getBaseDiscountTaxCompensation(); $address->setBaseTaxAmount($address->getBaseTaxAmount() + $itemBaseTaxAmount); $applied = $taxCalculationModel->getAppliedRates($request); $this->_saveAppliedTaxes($address, $applied, $item->getTaxAmount(), $item->getBaseTaxAmount(), $rate); } } $shippingTaxClass = $this->_scopeConfig->getValue(\Magento\Tax\Model\Config::CONFIG_XML_PATH_SHIPPING_TAX_CLASS, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store); $shippingTax = 0; $shippingBaseTax = 0; if ($shippingTaxClass) { $rate = $taxCalculationModel->getRate($request->setProductClassId($shippingTaxClass)); if ($rate) { if (!$this->_taxData->shippingPriceIncludesTax()) { $shippingTax = $address->getShippingAmount() * $rate / 100; $shippingBaseTax = $address->getBaseShippingAmount() * $rate / 100; } else { $shippingTax = $address->getShippingTaxAmount(); $shippingBaseTax = $address->getBaseShippingTaxAmount(); } $shippingTax = $this->priceCurrency->round($shippingTax); $shippingBaseTax = $this->priceCurrency->round($shippingBaseTax); $address->setTaxAmount($address->getTaxAmount() + $shippingTax); $address->setBaseTaxAmount($address->getBaseTaxAmount() + $shippingBaseTax); $this->_saveAppliedTaxes($address, $taxCalculationModel->getAppliedRates($request), $shippingTax, $shippingBaseTax, $rate); } } if (!$this->_taxData->shippingPriceIncludesTax()) { $address->setShippingTaxAmount($shippingTax); $address->setBaseShippingTaxAmount($shippingBaseTax); } $address->setGrandTotal($address->getGrandTotal() + $address->getTaxAmount()); $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBaseTaxAmount()); return $this; }
/** * Get all items * * @param \Magento\Quote\Model\Quote\Address $address * @return array */ protected function _getAddressItems(\Magento\Quote\Model\Quote\Address $address) { return $address->getAllItems(); }
/** * @param Address $address * @return \Magento\Framework\DataObject[] */ public function getAddressItems($address) { $items = []; foreach ($address->getAllItems() as $item) { if ($item->getParentItemId()) { continue; } $item->setQuoteItem($this->getCheckout()->getQuote()->getItemById($item->getQuoteItemId())); $items[] = $item; } $itemsFilter = $this->_filterGridFactory->create(); $itemsFilter->addFilter(new \Magento\Framework\Filter\Sprintf('%d'), 'qty'); return $itemsFilter->filter($items); }