Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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;
 }
Example #3
0
 /**
  * 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;
 }