/** * Collect tax totals for quote address * * @param Address $address * @return $this */ public function collect(Address $address) { parent::collect($address); $this->clearValues($address); $items = $this->_getAddressItems($address); if (!$items) { return $this; } $baseTaxDetails = $this->getQuoteTaxDetails($address, true); $taxDetails = $this->getQuoteTaxDetails($address, false); //Populate address and items with tax calculation results $itemsByType = $this->organizeItemTaxDetailsByType($taxDetails, $baseTaxDetails); if (isset($itemsByType[self::ITEM_TYPE_PRODUCT])) { $this->processProductItems($address, $itemsByType[self::ITEM_TYPE_PRODUCT]); } if (isset($itemsByType[self::ITEM_TYPE_SHIPPING])) { $shippingTaxDetails = $itemsByType[self::ITEM_TYPE_SHIPPING][self::ITEM_CODE_SHIPPING][self::KEY_ITEM]; $baseShippingTaxDetails = $itemsByType[self::ITEM_TYPE_SHIPPING][self::ITEM_CODE_SHIPPING][self::KEY_BASE_ITEM]; $this->processShippingTaxInfo($address, $shippingTaxDetails, $baseShippingTaxDetails); } //Process taxable items that are not product or shipping $this->processExtraTaxables($address, $itemsByType); //Save applied taxes for each item and the quote in aggregation $this->processAppliedTaxes($address, $itemsByType); if ($this->includeExtraTax()) { $this->_addAmount($address->getExtraTaxAmount()); $this->_addBaseAmount($address->getBaseExtraTaxAmount()); } return $this; }
/** * Collect tax totals for shipping. The result can be used to calculate discount on shipping * * @param Address $address * @return $this */ public function collect(Address $address) { parent::collect($address); $items = $this->_getAddressItems($address); if (!$items) { return $this; } //Add shipping $shippingDataObject = $this->getShippingDataObject($address, false); $baseShippingDataObject = $this->getShippingDataObject($address, true); if ($shippingDataObject == null || $baseShippingDataObject == null) { return $this; } $quoteDetails = $this->prepareQuoteDetails($address, [$shippingDataObject]); $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails, $address->getQuote()->getStore()->getStoreId()); $baseQuoteDetails = $this->prepareQuoteDetails($address, [$baseShippingDataObject]); $baseTaxDetails = $this->taxCalculationService->calculateTax($baseQuoteDetails, $address->getQuote()->getStore()->getStoreId()); $this->processShippingTaxInfo($address, $taxDetails->getItems()[self::ITEM_CODE_SHIPPING], $baseTaxDetails->getItems()[self::ITEM_CODE_SHIPPING]); return $this; }
/** * Calculate tax on product items. The result will be used to determine shipping * and discount later. * * @param Address $address * @return $this */ public function collect(Address $address) { parent::collect($address); $items = $this->_getAddressItems($address); if (!$items) { return $this; } $priceIncludesTax = $this->_config->priceIncludesTax($address->getQuote()->getStore()); //Setup taxable items $itemDataObjects = $this->mapItems($address, $priceIncludesTax, false); $quoteDetails = $this->prepareQuoteDetails($address, $itemDataObjects); $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails, $address->getQuote()->getStore()->getStoreId()); $itemDataObjects = $this->mapItems($address, $priceIncludesTax, true); $baseQuoteDetails = $this->prepareQuoteDetails($address, $itemDataObjects); $baseTaxDetails = $this->taxCalculationService->calculateTax($baseQuoteDetails, $address->getQuote()->getStore()->getStoreId()); $itemsByType = $this->organizeItemTaxDetailsByType($taxDetails, $baseTaxDetails); if (isset($itemsByType[self::ITEM_TYPE_PRODUCT])) { $this->processProductItems($address, $itemsByType[self::ITEM_TYPE_PRODUCT]); } return $this; }