9 use Magento\Tax\Api\Data\AppliedTaxInterfaceFactory;
10 use Magento\Tax\Api\Data\AppliedTaxRateInterfaceFactory;
13 use Magento\Tax\Api\Data\TaxDetailsItemInterfaceFactory;
96 private $addressRateRequest =
null;
150 $this->taxClassManagement = $taxClassService;
157 $this->addressRateRequest = $addressRateRequest;
217 if (
$item->getIsTaxIncluded()) {
258 if (
null == $this->addressRateRequest) {
259 $this->addressRateRequest = $this->calculationTool->getRateRequest(
260 $this->shippingAddress,
261 $this->billingAddress,
262 $this->customerTaxClassId,
267 return $this->addressRateRequest;
279 if ((
bool)$this->config->crossBorderTradeEnabled($this->storeId)) {
282 return (abs(
$rate - $storeRate) < 0.00001);
303 protected function getAppliedTax($rowTax, $appliedRate)
305 $appliedTaxDataObject = $this->appliedTaxDataObjectFactory->create();
306 $appliedTaxDataObject->setAmount($rowTax);
307 $appliedTaxDataObject->setPercent($appliedRate[
'percent']);
308 $appliedTaxDataObject->setTaxRateKey($appliedRate[
'id']);
311 $rateDataObjects = [];
312 foreach ($appliedRate[
'rates'] as
$rate) {
314 $rateDataObjects[
$rate[
'code']] = $this->appliedTaxRateDataObjectFactory->create()
315 ->setPercent(
$rate[
'percent'])
316 ->setCode(
$rate[
'code'])
317 ->setTitle(
$rate[
'title']);
319 $appliedTaxDataObject->setRates($rateDataObjects);
320 return $appliedTaxDataObject;
352 protected function getAppliedTaxes($rowTax, $totalTaxRate, $appliedRates)
356 $totalAppliedAmount = 0;
357 foreach ($appliedRates as $appliedRate) {
358 if ($appliedRate[
'percent'] == 0) {
362 $appliedAmount = $rowTax / $totalTaxRate * $appliedRate[
'percent'];
368 self::KEY_APPLIED_TAX_DELTA_ROUNDING
370 if ($totalAppliedAmount + $appliedAmount > $rowTax) {
371 $appliedAmount = $rowTax - $totalAppliedAmount;
373 $totalAppliedAmount += $appliedAmount;
375 $appliedTaxDataObject = $this->appliedTaxDataObjectFactory->create();
376 $appliedTaxDataObject->setAmount($appliedAmount);
377 $appliedTaxDataObject->setPercent($appliedRate[
'percent']);
378 $appliedTaxDataObject->setTaxRateKey($appliedRate[
'id']);
381 $rateDataObjects = [];
382 foreach ($appliedRate[
'rates'] as
$rate) {
384 $rateDataObjects[
$rate[
'code']] = $this->appliedTaxRateDataObjectFactory->create()
385 ->setPercent(
$rate[
'percent'])
386 ->setCode(
$rate[
'code'])
387 ->setTitle(
$rate[
'title']);
389 $appliedTaxDataObject->setRates($rateDataObjects);
390 $appliedTaxes[$appliedTaxDataObject->getTaxRateKey()] = $appliedTaxDataObject;
393 return $appliedTaxes;
412 $delta = isset($this->roundingDeltas[
$type][
$rate]) ?
418 $roundPrice = $this->calculationTool->round($roundPrice);
438 $storeTax = $this->calculationTool->calcTaxAmount($storePriceInclTax, $storeRate,
true,
false);
439 $priceExclTax = $storePriceInclTax - $storeTax;
440 $customerTax = $this->calculationTool->calcTaxAmount($priceExclTax, $customerRate,
false,
false);
441 $customerPriceInclTax = $priceExclTax + $customerTax;
443 $customerPriceInclTax = $this->calculationTool->round($customerPriceInclTax);
445 return $customerPriceInclTax;
calculateWithTaxInPrice(QuoteDetailsItemInterface $item, $quantity, $round=true)
const KEY_APPLIED_TAX_DELTA_ROUNDING
$taxDetailsItemDataObjectFactory
__construct(TaxClassManagementInterface $taxClassService, TaxDetailsItemInterfaceFactory $taxDetailsItemDataObjectFactory, AppliedTaxInterfaceFactory $appliedTaxDataObjectFactory, AppliedTaxRateInterfaceFactory $appliedTaxRateDataObjectFactory, Calculation $calculationTool, \Magento\Tax\Model\Config $config, $storeId, \Magento\Framework\DataObject $addressRateRequest=null)
$appliedTaxRateDataObjectFactory
const KEY_TAX_BEFORE_DISCOUNT_DELTA_ROUNDING
calculateWithTaxNotInPrice(QuoteDetailsItemInterface $item, $quantity, $round=true)
$appliedTaxDataObjectFactory
const KEY_REGULAR_DELTA_ROUNDING
calculate(QuoteDetailsItemInterface $item, $quantity, $round=true)
setShippingAddress(CustomerAddress $shippingAddress)
isSameRateAsStore($rate, $storeRate)
deltaRound($price, $rate, $direction, $type=self::KEY_REGULAR_DELTA_ROUNDING, $round=true)
setBillingAddress(CustomerAddress $billingAddress)
setCustomerTaxClassId($customerTaxClassId)
calculatePriceInclTax($storePriceInclTax, $storeRate, $customerRate, $round=true)
setCustomerId($customerId)