public function testTaxDetailsItemMultipleTaxes() { $appliedTaxDataArray = ['tax_rate_key' => '77', 'percent' => 0.0925, 'amount' => 0.82, 'rates' => [self::$travisCtyRateObjectDataArray, self::$utopiaCtyRateObjectDataArray, self::$noTaxRateObjectDataArray]]; $taxDetailsItemDataArray = ['code' => 'QWERTY123', 'type' => 'product', 'tax_percent' => 0.0925, 'price' => 4.99, 'price_incl_tax' => 5.45, 'row_total' => 4.99, 'row_tax' => 0.64, 'taxable_amount' => 4.99, 'discount_amount' => 0.0, 'discount_tax_compensation_amount' => 0.0, 'applied_taxes' => [$appliedTaxDataArray]]; $taxDetailsItemObjectFromArray = $this->taxDetailsItemBuilder->populateWithArray($taxDetailsItemDataArray)->create(); $taxDetailsItemObjectFromObject = $this->taxDetailsItemBuilder->populate($taxDetailsItemObjectFromArray)->create(); $this->assertEquals($taxDetailsItemDataArray, $taxDetailsItemObjectFromArray->__toArray()); $this->assertEquals($taxDetailsItemDataArray, $taxDetailsItemObjectFromObject->__toArray()); $this->assertEquals($taxDetailsItemObjectFromArray, $taxDetailsItemObjectFromObject); }
/** * Callback function that creates a tax details item with applied taxes from a quote details item for testing. * * @param QuoteDetailsItem $item * @return Data\TaxDetails\Item */ public function createTaxDetailsItemWithAppliedTaxes(QuoteDetailsItem $item) { $appliedTaxRateBuilder = $this->taxDetailsBuilder->getAppliedTaxBuilder(); $taxRateBuilder = $appliedTaxRateBuilder->getAppliedTaxRateBuilder(); $rate = $taxRateBuilder->setPercent(self::TAX)->setCode('TAX')->setTitle('Tax')->create(); $appliedTaxes = $appliedTaxRateBuilder->setAmount($item->getUnitPrice() * self::TAX)->setTaxRateKey('TAX_RATE')->setPercent(self::TAX)->setRates([$rate])->create(); return $this->taxDetailsItemBuilder->populate($this->createTaxDetailsItem($item))->setAppliedTaxes([$appliedTaxes])->create(); }
/** * {@inheritdoc} */ public function _setDataValues(array $data) { if (isset($data[TaxDetails::KEY_APPLIED_TAXES])) { $appliedTaxDataObjects = []; $appliedTaxes = $data[TaxDetails::KEY_APPLIED_TAXES]; foreach ($appliedTaxes as $appliedTax) { $appliedTaxDataObjects[] = $this->appliedTaxBuilder->populateWithArray($appliedTax)->create(); } $data[TaxDetails::KEY_APPLIED_TAXES] = $appliedTaxDataObjects; } if (isset($data[TaxDetails::KEY_ITEMS])) { $taxDetailItemDataObjects = []; $taxDetailItems = $data[TaxDetails::KEY_ITEMS]; foreach ($taxDetailItems as $taxDetailItem) { $taxDetailItemDataObjects[] = $this->taxDetailsItemBuilder->populateWithArray($taxDetailItem)->create(); } $data[TaxDetails::KEY_ITEMS] = $taxDetailItemDataObjects; } return parent::_setDataValues($data); }
/** * Create AppliedTax data object based on applied tax rates and tax amount * * @param float $rowTax * @param float $totalTaxRate * @param array $appliedRates May contain multiple tax rates when catalog price includes tax * example: * [ * [ * 'id' => 'id1', * 'percent' => 7.5, * 'rates' => [ * 'code' => 'code1', * 'title' => 'title1', * 'percent' => 5.3, * ], * ], * [ * 'id' => 'id2', * 'percent' => 8.5, * 'rates' => [ * 'code' => 'code2', * 'title' => 'title2', * 'percent' => 7.3, * ], * ], * ] * @return \Magento\Tax\Service\V1\Data\TaxDetails\AppliedTax[] */ protected function getAppliedTaxes($rowTax, $totalTaxRate, $appliedRates) { $appliedTaxBuilder = $this->taxDetailsItemBuilder->getAppliedTaxBuilder(); $appliedTaxRateBuilder = $appliedTaxBuilder->getAppliedTaxRateBuilder(); /** @var \Magento\Tax\Service\V1\Data\TaxDetails\AppliedTax[] $appliedTaxes */ $appliedTaxes = []; $totalAppliedAmount = 0; foreach ($appliedRates as $appliedRate) { if ($appliedRate['percent'] == 0) { continue; } $appliedAmount = $rowTax / $totalTaxRate * $appliedRate['percent']; //Use delta rounding to split tax amounts for each tax rates between items $appliedAmount = $this->deltaRound($appliedAmount, $appliedRate['id'], true, self::KEY_APPLIED_TAX_DELTA_ROUNDING); if ($totalAppliedAmount + $appliedAmount > $rowTax) { $appliedAmount = $rowTax - $totalAppliedAmount; } $totalAppliedAmount += $appliedAmount; $appliedTaxBuilder->setAmount($appliedAmount); $appliedTaxBuilder->setPercent($appliedRate['percent']); $appliedTaxBuilder->setTaxRateKey($appliedRate['id']); /** @var AppliedTaxRate[] $rateDataObjects */ $rateDataObjects = []; foreach ($appliedRate['rates'] as $rate) { $appliedTaxRateBuilder->setPercent($rate['percent']); $appliedTaxRateBuilder->setCode($rate['code']); $appliedTaxRateBuilder->setTitle($rate['title']); //Skipped position, priority and rule_id $rateDataObjects[$rate['code']] = $appliedTaxRateBuilder->create(); } $appliedTaxBuilder->setRates($rateDataObjects); $appliedTax = $appliedTaxBuilder->create(); $appliedTaxes[$appliedTax->getTaxRateKey()] = $appliedTax; } return $appliedTaxes; }