2700 lines
		
	
	
		
			103 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			2700 lines
		
	
	
		
			103 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Tax\Model;
 | 
						|
 | 
						|
use Magento\Tax\Api\Data\TaxClassKeyInterface;
 | 
						|
use Magento\Tax\Model\TaxClass\Key;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
 | 
						|
/**
 | 
						|
 * @magentoDbIsolation enabled
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class TaxCalculationTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var float
 | 
						|
     */
 | 
						|
    private const EPSILON = 0.0000000001;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Tax\Api\TaxCalculationInterface
 | 
						|
     */
 | 
						|
    private $taxCalculationService;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tax Details Factory
 | 
						|
     *
 | 
						|
     * @var \Magento\Tax\Api\Data\QuoteDetailsInterfaceFactory
 | 
						|
     */
 | 
						|
    private $quoteDetailsFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Array of default tax classes ids
 | 
						|
     *
 | 
						|
     * Key is class name
 | 
						|
     *
 | 
						|
     * @var int[]
 | 
						|
     */
 | 
						|
    private $taxClassIds;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Array of default tax rates ids.
 | 
						|
     *
 | 
						|
     * Key is rate percentage as string.
 | 
						|
     *
 | 
						|
     * @var int[]
 | 
						|
     */
 | 
						|
    private $taxRates;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Array of default tax rules ids.
 | 
						|
     *
 | 
						|
     * Key is rule code.
 | 
						|
     *
 | 
						|
     * @var int[]
 | 
						|
     */
 | 
						|
    private $taxRules;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Helps in creating required tax rules.
 | 
						|
     *
 | 
						|
     * @var TaxRuleFixtureFactory
 | 
						|
     */
 | 
						|
    private $taxRuleFixtureFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\Api\DataObjectHelper
 | 
						|
     */
 | 
						|
    private $dataObjectHelper;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->quoteDetailsFactory = $this->objectManager->create(
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterfaceFactory::class
 | 
						|
        );
 | 
						|
        $this->dataObjectHelper = $this->objectManager->create(\Magento\Framework\Api\DataObjectHelper::class);
 | 
						|
        $this->taxCalculationService = $this->objectManager->get(\Magento\Tax\Api\TaxCalculationInterface::class);
 | 
						|
        $this->taxRuleFixtureFactory = new TaxRuleFixtureFactory();
 | 
						|
 | 
						|
        $this->setUpDefaultRules();
 | 
						|
    }
 | 
						|
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        $this->tearDownDefaultRules();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoConfigFixture current_store tax/calculation/algorithm UNIT_BASE_CALCULATION
 | 
						|
     * @dataProvider calculateUnitBasedDataProvider
 | 
						|
     */
 | 
						|
    public function testCalculateTaxUnitBased($quoteDetailsData, $expected)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails, 1);
 | 
						|
        $this->assertEqualsWithDelta($expected, $this->convertObjectToArray($taxDetails), self::EPSILON);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function calculateUnitBasedDataProvider()
 | 
						|
    {
 | 
						|
        $baseQuote = $this->getBaseQuoteData();
 | 
						|
        $oneProduct = $baseQuote;
 | 
						|
        $oneProduct['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => [
 | 
						|
                Key::KEY_TYPE => TaxClassKeyInterface::TYPE_NAME,
 | 
						|
                Key::KEY_VALUE => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $oneProductResults = [
 | 
						|
            'subtotal' => 20,
 | 
						|
            'tax_amount' => 1.5,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 1.5,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                            'percent' => 7.5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 1.5,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.75,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.5,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 1.5,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $weeeProduct = $baseQuote;
 | 
						|
        $weeeProduct['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $weeeProduct['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $weeeProductResults = [
 | 
						|
            'subtotal' => 17,
 | 
						|
            'tax_amount' => 1.4,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 1.4,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 0.83,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 10,
 | 
						|
                    'row_total_incl_tax' => 10.83,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 0.83,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 0.57,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.57,
 | 
						|
                    'row_total' => 7,
 | 
						|
                    'row_total_incl_tax' => 7.57,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 0.57,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $weeeProducts = $baseQuote;
 | 
						|
        $weeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $weeeProducts['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $weeeProductsResults = [
 | 
						|
            'subtotal' => 34,
 | 
						|
            'tax_amount' => 2.80,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 2.80,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 1.66,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.66,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.66,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 1.14,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.57,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.14,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.14,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $multiWeeeProducts = $baseQuote;
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-2',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'weee2-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-2'
 | 
						|
        ];
 | 
						|
        $multiWeeeProductsResults = [
 | 
						|
            'subtotal' => 68,
 | 
						|
            'tax_amount' => 5.60,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 5.60,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 1.66,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.66,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.66,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 1.14,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.57,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.14,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.14,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sequence-2' => [
 | 
						|
                    'code' => 'sequence-2',
 | 
						|
                    'row_tax' => 1.66,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.66,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.66,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee2-Recycling Fee' => [
 | 
						|
                    'code' => 'weee2-Recycling Fee',
 | 
						|
                    'row_tax' => 1.14,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.57,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.14,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-2',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.14,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $oneProductInclTax = $baseQuote;
 | 
						|
        $oneProductInclTax['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10.75,
 | 
						|
            'tax_class_key' => 'DefaultProductClass',
 | 
						|
            'is_tax_included' => true,
 | 
						|
        ];
 | 
						|
        $oneProductInclTaxResults = $oneProductResults;
 | 
						|
 | 
						|
        $oneProductInclTaxDiffRate = $baseQuote;
 | 
						|
        $oneProductInclTaxDiffRate['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 11,
 | 
						|
            'tax_class_key' => 'HigherProductClass',
 | 
						|
            'is_tax_included' => true,
 | 
						|
        ];
 | 
						|
        $oneProductInclTaxDiffRateResults = [
 | 
						|
            'subtotal' => 20,
 | 
						|
            'tax_amount' => 4.4,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 4.4,
 | 
						|
                    'percent' => 22,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 22',
 | 
						|
                            'title' => 'US - 42 - 22',
 | 
						|
                            'percent' => 22,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 4.4,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 12.2,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 24.4,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 22.0,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 22' => [
 | 
						|
                            'amount' => 4.4,
 | 
						|
                            'percent' => 22,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 22' => [
 | 
						|
                                    'percent' => 22,
 | 
						|
                                    'code' => 'US - 42 - 22',
 | 
						|
                                    'title' => 'US - 42 - 22',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $twoProducts = $baseQuote;
 | 
						|
        $twoProducts['items'] = [
 | 
						|
            [
 | 
						|
                'code' => 'sku_1',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 2,
 | 
						|
                'unit_price' => 10,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'sku_2',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 20,
 | 
						|
                'unit_price' => 11,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $twoProductsResults = [
 | 
						|
            'subtotal' => 240,
 | 
						|
            'tax_amount' => 18.1,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 18.1,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                            'percent' => 7.5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 1.5,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.75,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.5,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 1.5,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sku_2' =>                 [
 | 
						|
                    'code' => 'sku_2',
 | 
						|
                    'row_tax' => 16.6,
 | 
						|
                    'price' => 11,
 | 
						|
                    'price_incl_tax' => 11.83,
 | 
						|
                    'row_total' => 220,
 | 
						|
                    'row_total_incl_tax' => 236.6,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 16.6,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $twoProductsInclTax = $baseQuote;
 | 
						|
        $twoProductsInclTax['items'] = [
 | 
						|
            [
 | 
						|
                'code' => 'sku_1',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 2,
 | 
						|
                'unit_price' => 10.75,
 | 
						|
                'row_total' => 21.5,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
                'is_tax_included' => true,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'sku_2',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 20,
 | 
						|
                'unit_price' => 11.83,
 | 
						|
                'row_total' => 236.6,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
                'is_tax_included' => true,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $twoProductInclTaxResults = $twoProductsResults;
 | 
						|
 | 
						|
        $bundleProduct = $baseQuote;
 | 
						|
        $bundleProduct['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'DefaultProductClass',
 | 
						|
            'parent_code' => 'bundle',
 | 
						|
        ];
 | 
						|
        $bundleProduct['items'][] = [
 | 
						|
            'code' => 'bundle',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 0,
 | 
						|
            'tax_class_key' => 'DefaultProductClass',
 | 
						|
        ];
 | 
						|
        $bundleProductResults = [
 | 
						|
            'subtotal' => 20,
 | 
						|
            'tax_amount' => 1.5,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 1.5,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                            'percent' => 7.5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 1.5,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.75,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.5,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 1.5,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'bundle' => [
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.75,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.5,
 | 
						|
                    'row_tax' => 1.5,
 | 
						|
                    'code' => 'bundle',
 | 
						|
                    'type' => 'product',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        return [
 | 
						|
            'one product' => [
 | 
						|
                'quote_details' => $oneProduct,
 | 
						|
                'expected_tax_details' => $oneProductResults,
 | 
						|
            ],
 | 
						|
            'weee product' => [
 | 
						|
                'quote_details' => $weeeProduct,
 | 
						|
                'expected_tax_details' => $weeeProductResults,
 | 
						|
            ],
 | 
						|
            'weee products' => [
 | 
						|
                'quote_details' => $weeeProducts,
 | 
						|
                'expected_tax_details' => $weeeProductsResults,
 | 
						|
            ],
 | 
						|
            'multi weee products' => [
 | 
						|
                'quote_details' => $multiWeeeProducts,
 | 
						|
                'expected_tax_details' => $multiWeeeProductsResults,
 | 
						|
            ],
 | 
						|
            'one product, tax included' => [
 | 
						|
                'quote_details' => $oneProductInclTax,
 | 
						|
                'expected_tax_details' => $oneProductInclTaxResults,
 | 
						|
            ],
 | 
						|
            'one product, tax included but differs from store rate' => [
 | 
						|
                'quote_details' => $oneProductInclTaxDiffRate,
 | 
						|
                'expected_tax_details' => $oneProductInclTaxDiffRateResults,
 | 
						|
            ],
 | 
						|
            'two products' => [
 | 
						|
                'quote_details' => $twoProducts,
 | 
						|
                'expected_tax_details' => $twoProductsResults,
 | 
						|
            ],
 | 
						|
            'two products, tax included' => [
 | 
						|
                'quote_details' => $twoProductsInclTax,
 | 
						|
                'expected_tax_details' => $twoProductInclTaxResults,
 | 
						|
            ],
 | 
						|
            'bundle product' => [
 | 
						|
                'quote_details' => $bundleProduct,
 | 
						|
                'expected_tax_details' => $bundleProductResults,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider calculateTaxTotalBasedDataProvider
 | 
						|
     * @magentoConfigFixture current_store tax/calculation/algorithm TOTAL_BASE_CALCULATION
 | 
						|
     */
 | 
						|
    public function testCalculateTaxTotalBased($quoteDetailsData, $expectedTaxDetails, $storeId = null)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails, $storeId);
 | 
						|
 | 
						|
        $this->assertEquals($expectedTaxDetails, $this->convertObjectToArray($taxDetails));
 | 
						|
    }
 | 
						|
 | 
						|
    public function calculateTaxTotalBasedDataProvider()
 | 
						|
    {
 | 
						|
        return array_merge(
 | 
						|
            $this->calculateTaxNoTaxInclDataProvider(),
 | 
						|
            $this->calculateTaxTaxInclDataProvider(),
 | 
						|
            $this->calculateTaxRoundingDataProvider()
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function calculateTaxNoTaxInclDataProvider()
 | 
						|
    {
 | 
						|
        $prodNoTaxInclBase = [
 | 
						|
            'quote_details' => [
 | 
						|
                'shipping_address' => [
 | 
						|
                    'postcode' => '55555',
 | 
						|
                    'country_id' => 'US',
 | 
						|
                    'region' => ['region_id' => 42],
 | 
						|
                ],
 | 
						|
                'items' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'code',
 | 
						|
                        'type' => 'type',
 | 
						|
                        'quantity' => 1,
 | 
						|
                        'unit_price' => 10.0,
 | 
						|
                        'is_tax_included' => false,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'customer_tax_class_key' => 'DefaultCustomerClass',
 | 
						|
            ],
 | 
						|
            'expected_tax_details' => [
 | 
						|
                'subtotal' => 10.0,
 | 
						|
                'tax_amount' => 0.0,
 | 
						|
                'discount_tax_compensation_amount' => 0.0,
 | 
						|
                'applied_taxes' => [],
 | 
						|
                'items' => [],
 | 
						|
            ],
 | 
						|
            'store_id' => null,
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodQuoteDetailItemBase = [
 | 
						|
            'code' => 'code',
 | 
						|
            'type' => 'type',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 10.0,
 | 
						|
            'is_tax_included' => false,
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteDetailAppliedTaxesBase = [
 | 
						|
            [
 | 
						|
                'amount' => 0.75,
 | 
						|
                'percent' => 7.5,
 | 
						|
                'rates' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'US - 42 - 7.5',
 | 
						|
                        'title' => 'US - 42 - 7.5',
 | 
						|
                        'percent' => 7.5,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $itemDetailAppliedTaxesBase = [
 | 
						|
            'US - 42 - 7.5' => [
 | 
						|
                'amount' => 0.75,
 | 
						|
                'percent' => 7.5,
 | 
						|
                'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                'rates' => [
 | 
						|
                    'US - 42 - 7.5' => [
 | 
						|
                        'percent' => 7.5,
 | 
						|
                        'code' => 'US - 42 - 7.5',
 | 
						|
                        'title' => 'US - 42 - 7.5',
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteDetailItemWithDefaultProductTaxClass = $prodQuoteDetailItemBase;
 | 
						|
        $quoteDetailItemWithDefaultProductTaxClass['tax_class_key'] = 'DefaultProductClass';
 | 
						|
 | 
						|
        $prodExpectedItemWithNoProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 0,
 | 
						|
                'price' => 10.0,
 | 
						|
                'price_incl_tax' => 10.0,
 | 
						|
                'row_total' => 10.0,
 | 
						|
                'row_total_incl_tax' => 10.0,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 0,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => [],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $itemAppliedTaxes = $itemDetailAppliedTaxesBase;
 | 
						|
        $prodExpectedItemWithDefaultProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 0.75,
 | 
						|
                'price' => 10.0,
 | 
						|
                'price_incl_tax' => 10.75,
 | 
						|
                'row_total' => 10.0,
 | 
						|
                'row_total_incl_tax' => 10.75,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 7.5,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => $itemAppliedTaxes,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodWithStoreIdWithTaxClassId = $prodNoTaxInclBase;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId = $prodNoTaxInclBase;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId = $prodNoTaxInclBase;
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId = $prodNoTaxInclBase;
 | 
						|
 | 
						|
        $prodWithStoreIdWithTaxClassId['store_id'] = 1;
 | 
						|
        $prodWithStoreIdWithTaxClassId['quote_details']['items'][] = $quoteDetailItemWithDefaultProductTaxClass;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 0.75;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] = $quoteDetailAppliedTaxesBase;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['store_id'] = 1;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['quote_details']['items'][] = $prodQuoteDetailItemBase;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['quote_details']['items'][] =
 | 
						|
            $quoteDetailItemWithDefaultProductTaxClass;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 0.75;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] = $quoteDetailAppliedTaxesBase;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId['quote_details']['items'][] = $prodQuoteDetailItemBase;
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        return [
 | 
						|
            'product with store id, with tax class id' => $prodWithStoreIdWithTaxClassId,
 | 
						|
            'product with store id, without tax class id' => $prodWithStoreIdWithoutTaxClassId,
 | 
						|
            'product without store id, with tax class id' => $prodWithoutStoreIdWithTaxClassId,
 | 
						|
            'product without store id, without tax class id' => $prodWithoutStoreIdWithoutTaxClassId,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function calculateTaxTaxInclDataProvider()
 | 
						|
    {
 | 
						|
        $productTaxInclBase = [
 | 
						|
            'quote_details' => [
 | 
						|
                'shipping_address' => [
 | 
						|
                    'postcode' => '55555',
 | 
						|
                    'country_id' => 'US',
 | 
						|
                    'region' => ['region_id' => 42],
 | 
						|
                ],
 | 
						|
                'items' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'code',
 | 
						|
                        'type' => 'type',
 | 
						|
                        'quantity' => 1,
 | 
						|
                        'unit_price' => 10.0,
 | 
						|
                        'is_tax_included' => true,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'customer_tax_class_key' => [
 | 
						|
                    Key::KEY_TYPE => TaxClassKeyInterface::TYPE_NAME,
 | 
						|
                    Key::KEY_VALUE => 'DefaultCustomerClass',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'expected_tax_details' => [
 | 
						|
                'subtotal' => 10.0,
 | 
						|
                'tax_amount' => 0.0,
 | 
						|
                'discount_tax_compensation_amount' => 0.0,
 | 
						|
                'applied_taxes' => [],
 | 
						|
                'items' => [],
 | 
						|
            ],
 | 
						|
            'store_id' => null,
 | 
						|
        ];
 | 
						|
 | 
						|
        $productTaxInclQuoteDetailItemBase = [
 | 
						|
            'code' => 'code',
 | 
						|
            'type' => 'type',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 10.0,
 | 
						|
            'is_tax_included' => true,
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteDetailTaxInclItemWithDefaultProductTaxClass = $productTaxInclQuoteDetailItemBase;
 | 
						|
        $quoteDetailTaxInclItemWithDefaultProductTaxClass['tax_class_key'] = 'DefaultProductClass';
 | 
						|
 | 
						|
        $productTaxInclExpectedItemWithNoProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 0,
 | 
						|
                'price' => 10.0,
 | 
						|
                'price_incl_tax' => 10.0,
 | 
						|
                'row_total' => 10.0,
 | 
						|
                'row_total_incl_tax' => 10.0,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 0,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => [],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteDetailAppliedTaxesBase = [
 | 
						|
            [
 | 
						|
                'amount' => 0.70,
 | 
						|
                'percent' => 7.5,
 | 
						|
                'rates' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'US - 42 - 7.5',
 | 
						|
                        'title' => 'US - 42 - 7.5',
 | 
						|
                        'percent' => 7.5,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $productTaxInclExpectedItemWithDefaultProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 0.70,
 | 
						|
                'price' => 9.30,
 | 
						|
                'price_incl_tax' => 10.00,
 | 
						|
                'row_total' => 9.30,
 | 
						|
                'row_total_incl_tax' => 10.00,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 7.5,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => [
 | 
						|
                    'US - 42 - 7.5' => [
 | 
						|
                        'amount' => 0.7,
 | 
						|
                        'percent' => 7.5,
 | 
						|
                        'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                        'rates' => [
 | 
						|
                            'US - 42 - 7.5' => [
 | 
						|
                                'percent' => 7.5,
 | 
						|
                                'code' => 'US - 42 - 7.5',
 | 
						|
                                'title' => 'US - 42 - 7.5',
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId = $productTaxInclBase;
 | 
						|
        $productInclTaxWithStoreIdWithoutTaxClassId = $productTaxInclBase;
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId = $productTaxInclBase;
 | 
						|
        $productInclTaxWithoutStoreIdWithoutTaxClassId = $productTaxInclBase;
 | 
						|
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['store_id'] = 1;
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['quote_details']['items'][] =
 | 
						|
            $quoteDetailTaxInclItemWithDefaultProductTaxClass;
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 0.70;
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['expected_tax_details']['subtotal'] = 9.30;
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] =
 | 
						|
            $quoteDetailAppliedTaxesBase;
 | 
						|
        $productInclTaxWithStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $productTaxInclExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $productInclTaxWithStoreIdWithoutTaxClassId['store_id'] = 1;
 | 
						|
        $productInclTaxWithStoreIdWithoutTaxClassId['quote_details']['items'][] =
 | 
						|
            $productTaxInclQuoteDetailItemBase;
 | 
						|
        $productInclTaxWithStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $productTaxInclExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId['quote_details']['items'][] =
 | 
						|
            $quoteDetailTaxInclItemWithDefaultProductTaxClass;
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 0.70;
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId['expected_tax_details']['subtotal'] = 9.30;
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] =
 | 
						|
            $quoteDetailAppliedTaxesBase;
 | 
						|
        $productInclTaxWithoutStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $productTaxInclExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $productInclTaxWithoutStoreIdWithoutTaxClassId['quote_details']['items'][] = $productTaxInclQuoteDetailItemBase;
 | 
						|
        $productInclTaxWithoutStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $productTaxInclExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        return [
 | 
						|
            'product incl tax with store id, with tax class id' => $productInclTaxWithStoreIdWithTaxClassId,
 | 
						|
            'product incl tax with store id, without tax class id' => $productInclTaxWithStoreIdWithoutTaxClassId,
 | 
						|
            'product incl tax without store id, with tax class id' => $productInclTaxWithoutStoreIdWithTaxClassId,
 | 
						|
            'product incl tax without store id, without tax class id' => $productInclTaxWithoutStoreIdWithoutTaxClassId,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function calculateTaxRoundingDataProvider()
 | 
						|
    {
 | 
						|
        $prodRoundingNoTaxInclBase = [
 | 
						|
            'quote_details' => [
 | 
						|
                'shipping_address' => [
 | 
						|
                    'postcode' => '55555',
 | 
						|
                    'country_id' => 'US',
 | 
						|
                    'region' => ['region_id' => 42],
 | 
						|
                ],
 | 
						|
                'items' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'code',
 | 
						|
                        'type' => 'type',
 | 
						|
                        'quantity' => 2,
 | 
						|
                        'unit_price' => 7.97,
 | 
						|
                        'is_tax_included' => false,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'customer_tax_class_key' => 'DefaultCustomerClass',
 | 
						|
            ],
 | 
						|
            'expected_tax_details' => [
 | 
						|
                'subtotal' => 15.94,
 | 
						|
                'tax_amount' => 0.0,
 | 
						|
                'discount_tax_compensation_amount' => 0.0,
 | 
						|
                'applied_taxes' => [],
 | 
						|
                'items' => [],
 | 
						|
            ],
 | 
						|
            'store_id' => null,
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodQuoteDetailItemBase = [
 | 
						|
            'code' => 'code',
 | 
						|
            'type' => 'type',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7.97,
 | 
						|
            'is_tax_included' => false,
 | 
						|
        ];
 | 
						|
 | 
						|
        $quoteDetailItemWithDefaultProductTaxClass = $prodQuoteDetailItemBase;
 | 
						|
        $quoteDetailItemWithDefaultProductTaxClass['tax_class_key'] = 'DefaultProductClass';
 | 
						|
 | 
						|
        $quoteDetailAppliedTaxesBase = [
 | 
						|
            [
 | 
						|
                'amount' => 1.20,
 | 
						|
                'percent' => 7.5,
 | 
						|
                'rates' => [
 | 
						|
                    [
 | 
						|
                        'code' => 'US - 42 - 7.5',
 | 
						|
                        'title' => 'US - 42 - 7.5',
 | 
						|
                        'percent' => 7.5,
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodExpectedItemWithNoProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 0,
 | 
						|
                'price' => 7.97,
 | 
						|
                'price_incl_tax' => 7.97,
 | 
						|
                'row_total' => 15.94,
 | 
						|
                'row_total_incl_tax' => 15.94,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 0,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => [],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodExpectedItemWithDefaultProductTaxClass = [
 | 
						|
            'code' => [
 | 
						|
                'code' => 'code',
 | 
						|
                'row_tax' => 1.20,
 | 
						|
                'price' => 7.97,
 | 
						|
                'price_incl_tax' => 8.57,
 | 
						|
                'row_total' => 15.94,
 | 
						|
                'row_total_incl_tax' => 17.14,
 | 
						|
                'type' => 'type',
 | 
						|
                'tax_percent' => 7.5,
 | 
						|
                'discount_tax_compensation_amount' => 0,
 | 
						|
                'associated_item_code' => null,
 | 
						|
                'applied_taxes' => [
 | 
						|
                    'US - 42 - 7.5' => [
 | 
						|
                        'amount' => 1.2,
 | 
						|
                        'percent' => 7.5,
 | 
						|
                        'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                        'rates' => [
 | 
						|
                            'US - 42 - 7.5' => [
 | 
						|
                                'percent' => 7.5,
 | 
						|
                                'code' => 'US - 42 - 7.5',
 | 
						|
                                'title' => 'US - 42 - 7.5',
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $prodWithStoreIdWithTaxClassId = $prodRoundingNoTaxInclBase;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId = $prodRoundingNoTaxInclBase;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId = $prodRoundingNoTaxInclBase;
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId = $prodRoundingNoTaxInclBase;
 | 
						|
 | 
						|
        $prodWithStoreIdWithTaxClassId['store_id'] = 1;
 | 
						|
        $prodWithStoreIdWithTaxClassId['quote_details']['items'][] = $quoteDetailItemWithDefaultProductTaxClass;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 1.20;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] = $quoteDetailAppliedTaxesBase;
 | 
						|
        $prodWithStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['store_id'] = 1;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['quote_details']['items'][] = $prodQuoteDetailItemBase;
 | 
						|
        $prodWithStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['quote_details']['items'][] =
 | 
						|
            $quoteDetailItemWithDefaultProductTaxClass;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['tax_amount'] = 1.20;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['applied_taxes'] =
 | 
						|
            $quoteDetailAppliedTaxesBase;
 | 
						|
        $prodWithoutStoreIdWithTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithDefaultProductTaxClass;
 | 
						|
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId['quote_details']['items'][] = $prodQuoteDetailItemBase;
 | 
						|
        $prodWithoutStoreIdWithoutTaxClassId['expected_tax_details']['items'] =
 | 
						|
            $prodExpectedItemWithNoProductTaxClass;
 | 
						|
 | 
						|
        return [
 | 
						|
            'rounding product with store id, with tax class id' => $prodWithStoreIdWithTaxClassId,
 | 
						|
            'rounding product with store id, without tax class id' => $prodWithStoreIdWithoutTaxClassId,
 | 
						|
            'rounding product without store id, with tax class id' => $prodWithoutStoreIdWithTaxClassId,
 | 
						|
            'rounding product without store id, without tax class id' => $prodWithoutStoreIdWithoutTaxClassId,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @dataProvider calculateTaxRowBasedDataProvider
 | 
						|
     * @magentoConfigFixture default_store tax/calculation/algorithm ROW_BASE_CALCULATION
 | 
						|
     */
 | 
						|
    public function testCalculateTaxRowBased($quoteDetailsData, $expectedTaxDetails)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails);
 | 
						|
 | 
						|
        $this->assertEqualsWithDelta($expectedTaxDetails, $this->convertObjectToArray($taxDetails), self::EPSILON);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function calculateTaxRowBasedDataProvider()
 | 
						|
    {
 | 
						|
        $baseQuote = $this->getBaseQuoteData();
 | 
						|
 | 
						|
        $oneProduct = $baseQuote;
 | 
						|
        $oneProduct['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 10,
 | 
						|
            'unit_price' => 1,
 | 
						|
            'tax_class_key' => 'DefaultProductClass',
 | 
						|
        ];
 | 
						|
        $oneProductResults = [
 | 
						|
            'subtotal' => 10,
 | 
						|
            'tax_amount' => 0.75,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 0.75,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                            'percent' => 7.5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 0.75,
 | 
						|
                    'price' => 1,
 | 
						|
                    'price_incl_tax' => 1.08,
 | 
						|
                    'row_total' => 10,
 | 
						|
                    'row_total_incl_tax' => 10.75,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 0.75,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $weeeProduct = $baseQuote;
 | 
						|
        $weeeProduct['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $weeeProduct['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $weeeProductResults = [
 | 
						|
            'subtotal' => 17,
 | 
						|
            'tax_amount' => 1.4,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 1.4,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 0.83,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 10,
 | 
						|
                    'row_total_incl_tax' => 10.83,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 0.83,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 0.57,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.57,
 | 
						|
                    'row_total' => 7,
 | 
						|
                    'row_total_incl_tax' => 7.57,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 0.57,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $weeeProducts = $baseQuote;
 | 
						|
        $weeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $weeeProducts['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $weeeProductsResults = [
 | 
						|
            'subtotal' => 34,
 | 
						|
            'tax_amount' => 2.81,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 2.81,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 1.65,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.65,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.65,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 1.16,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.58,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.16,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.16,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $multiWeeeProducts = $baseQuote;
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'weee1-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-1'
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'sequence-2',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 10,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
        ];
 | 
						|
        $multiWeeeProducts['items'][] = [
 | 
						|
            'code' => 'weee2-Recycling Fee',
 | 
						|
            'type' => 'weee',
 | 
						|
            'quantity' => 2,
 | 
						|
            'unit_price' => 7,
 | 
						|
            'tax_class_key' => 'WeeeProductClass',
 | 
						|
            'associated_item_code' => 'sequence-2'
 | 
						|
        ];
 | 
						|
        $multiWeeeProductsResults = [
 | 
						|
            'subtotal' => 68,
 | 
						|
            'tax_amount' => 5.62,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 5.62,
 | 
						|
                    'percent' => 8.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sequence-1' => [
 | 
						|
                    'code' => 'sequence-1',
 | 
						|
                    'row_tax' => 1.65,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.65,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.65,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee1-Recycling Fee' => [
 | 
						|
                    'code' => 'weee1-Recycling Fee',
 | 
						|
                    'row_tax' => 1.16,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.58,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.16,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-1',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.16,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sequence-2' => [
 | 
						|
                    'code' => 'sequence-2',
 | 
						|
                    'row_tax' => 1.65,
 | 
						|
                    'price' => 10,
 | 
						|
                    'price_incl_tax' => 10.83,
 | 
						|
                    'row_total' => 20,
 | 
						|
                    'row_total_incl_tax' => 21.65,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.65,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'weee2-Recycling Fee' => [
 | 
						|
                    'code' => 'weee2-Recycling Fee',
 | 
						|
                    'row_tax' => 1.16,
 | 
						|
                    'price' => 7,
 | 
						|
                    'price_incl_tax' => 7.58,
 | 
						|
                    'row_total' => 14,
 | 
						|
                    'row_total_incl_tax' => 15.16,
 | 
						|
                    'type' => 'weee',
 | 
						|
                    'tax_percent' => 8.25,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => 'sequence-2',
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25' => [
 | 
						|
                            'amount' => 1.16,
 | 
						|
                            'percent' => 8.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $oneProductInclTax = $baseQuote;
 | 
						|
        $oneProductInclTax['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 10,
 | 
						|
            'unit_price' => 1.0,
 | 
						|
            'tax_class_key' => 'DefaultProductClass',
 | 
						|
            'is_tax_included' => true,
 | 
						|
        ];
 | 
						|
        $oneProductInclTaxResults = [
 | 
						|
            'subtotal' => 9.3,
 | 
						|
            'tax_amount' => 0.7,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 0.7,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => .7,
 | 
						|
                    'price' => 0.93,
 | 
						|
                    'price_incl_tax' => 1.0,
 | 
						|
                    'row_total' => 9.3,
 | 
						|
                    'row_total_incl_tax' => 10,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 0.7,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $oneProductInclTaxDiffRate = $baseQuote;
 | 
						|
        $oneProductInclTaxDiffRate['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 9,
 | 
						|
            'unit_price' => 0.33, // this is including the store tax of 10%. Pre tax is 0.3
 | 
						|
            'tax_class_key' => [
 | 
						|
                Key::KEY_TYPE => TaxClassKeyInterface::TYPE_NAME,
 | 
						|
                Key::KEY_VALUE => 'HigherProductClass',
 | 
						|
            ],
 | 
						|
            'is_tax_included' => true,
 | 
						|
        ];
 | 
						|
        $oneProductInclTaxDiffRateResults = [
 | 
						|
            'subtotal' => 2.73,
 | 
						|
            'tax_amount' => 0.6,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 0.6,
 | 
						|
                    'percent' => 22,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'percent' => 22,
 | 
						|
                            'code' => 'US - 42 - 22',
 | 
						|
                            'title' => 'US - 42 - 22',
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 0.6,
 | 
						|
                    'price' => 0.3,
 | 
						|
                    'price_incl_tax' => 0.37,
 | 
						|
                    'row_total' => 2.73,
 | 
						|
                    'row_total_incl_tax' => 3.33,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 22.0,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 22' => [
 | 
						|
                            'amount' => 0.6,
 | 
						|
                            'percent' => 22,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 22' => [
 | 
						|
                                    'percent' => 22,
 | 
						|
                                    'code' => 'US - 42 - 22',
 | 
						|
                                    'title' => 'US - 42 - 22',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $twoProducts = $baseQuote;
 | 
						|
        $twoProducts['items'] = [
 | 
						|
            [
 | 
						|
                'code' => 'sku_1',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 10,
 | 
						|
                'unit_price' => 1,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'sku_2',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 20,
 | 
						|
                'unit_price' => 11,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $twoProductsResults = [
 | 
						|
            'subtotal' => 230,
 | 
						|
            'tax_amount' => 17.25,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 17.25,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => .75,
 | 
						|
                    'price' => 1,
 | 
						|
                    'price_incl_tax' => 1.08,
 | 
						|
                    'row_total' => 10,
 | 
						|
                    'row_total_incl_tax' => 10.75,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 0.75,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sku_2' => [
 | 
						|
                    'code' => 'sku_2',
 | 
						|
                    'row_tax' => 16.5,
 | 
						|
                    'price' => 11,
 | 
						|
                    'price_incl_tax' => 11.83,
 | 
						|
                    'row_total' => 220,
 | 
						|
                    'row_total_incl_tax' => 236.5,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 16.5,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $twoProductsInclTax = $baseQuote;
 | 
						|
        $twoProductsInclTax['items'] = [
 | 
						|
            [
 | 
						|
                'code' => 'sku_1',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 10,
 | 
						|
                'unit_price' => 0.98,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
                'is_tax_included' => true,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'sku_2',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 20,
 | 
						|
                'unit_price' => 11.99,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
                'is_tax_included' => true,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $twoProductInclTaxResults = [
 | 
						|
            'subtotal' => 232.19,
 | 
						|
            'tax_amount' => 17.41,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 17.41,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => .68,
 | 
						|
                    'price' => 0.91,
 | 
						|
                    'price_incl_tax' => 0.98,
 | 
						|
                    'row_total' => 9.12,
 | 
						|
                    'row_total_incl_tax' => 9.8,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 0.68,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sku_2' => [
 | 
						|
                    'code' => 'sku_2',
 | 
						|
                    'row_tax' => 16.73,
 | 
						|
                    'price' => 11.15,
 | 
						|
                    'price_incl_tax' => 11.99,
 | 
						|
                    'row_total' => 223.07,
 | 
						|
                    'row_total_incl_tax' => 239.8, // Shouldn't this be 223.07?
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 16.73,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        $oneProductWithChildren = $baseQuote;
 | 
						|
        $oneProductWithChildren['items'] = [
 | 
						|
            [
 | 
						|
                'code' => 'child_1_sku',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 2,
 | 
						|
                'unit_price' => 12.34,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
                'parent_code' => 'parent_sku',
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'parent_sku', // Put the parent in the middle of the children to test an edge case
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 10,
 | 
						|
                'unit_price' => 0,
 | 
						|
                'tax_class_key' => 'DefaultProductClass',
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'child_2_sku',
 | 
						|
                'type' => 'product',
 | 
						|
                'quantity' => 2,
 | 
						|
                'unit_price' => 1.99,
 | 
						|
                'tax_class_key' => 'HigherProductClass',
 | 
						|
                'parent_code' => 'parent_sku',
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $oneProductWithChildrenResults = [
 | 
						|
            'subtotal' => 286.6,
 | 
						|
            'tax_amount' => 27.27,
 | 
						|
            'discount_tax_compensation_amount' => 0,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 18.51,
 | 
						|
                    'percent' => 7.5,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 7.5',
 | 
						|
                            'title' => 'US - 42 - 7.5',
 | 
						|
                            'percent' => 7.5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                ],
 | 
						|
                [
 | 
						|
                    'amount' => 8.76,
 | 
						|
                    'percent' => 22,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 22',
 | 
						|
                            'title' => 'US - 42 - 22',
 | 
						|
                            'percent' => 22,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'child_1_sku' => [
 | 
						|
                    'code' => 'child_1_sku',
 | 
						|
                    'row_tax' => 18.51,
 | 
						|
                    'price' => 12.34,
 | 
						|
                    'price_incl_tax' => 13.27,
 | 
						|
                    'row_total' => 246.8,
 | 
						|
                    'row_total_incl_tax' => 265.31,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 7.5,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 7.5' => [
 | 
						|
                            'amount' => 18.51,
 | 
						|
                            'percent' => 7.5,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 7.5',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 7.5' => [
 | 
						|
                                    'percent' => 7.5,
 | 
						|
                                    'code' => 'US - 42 - 7.5',
 | 
						|
                                    'title' => 'US - 42 - 7.5',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'child_2_sku' => [
 | 
						|
                    'code' => 'child_2_sku',
 | 
						|
                    'row_tax' => 8.76,
 | 
						|
                    'price' => 1.99,
 | 
						|
                    'price_incl_tax' => 2.43,
 | 
						|
                    'row_total' => 39.8,
 | 
						|
                    'row_total_incl_tax' => 48.56,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 22,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 22' => [
 | 
						|
                            'amount' => 8.76,
 | 
						|
                            'percent' => 22,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 22',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 22' => [
 | 
						|
                                    'percent' => 22,
 | 
						|
                                    'code' => 'US - 42 - 22',
 | 
						|
                                    'title' => 'US - 42 - 22',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'parent_sku' => [
 | 
						|
                    'price' => 28.66,
 | 
						|
                    'price_incl_tax' => 31.39,
 | 
						|
                    'row_total' => 286.6,
 | 
						|
                    'row_total_incl_tax' => 313.87,
 | 
						|
                    'row_tax' => 27.27,
 | 
						|
                    'code' => 'parent_sku',
 | 
						|
                    'type' => 'product',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        return [
 | 
						|
            'one product' => [
 | 
						|
                'quote_details' => $oneProduct,
 | 
						|
                'expected_tax_details' => $oneProductResults,
 | 
						|
            ],
 | 
						|
            'weee_product' => [
 | 
						|
                'quote_details' => $weeeProduct,
 | 
						|
                'expected_tax_details' => $weeeProductResults,
 | 
						|
            ],
 | 
						|
            'weee_products' => [
 | 
						|
                'quote_details' => $weeeProducts,
 | 
						|
                'expected_tax_details' => $weeeProductsResults,
 | 
						|
            ],
 | 
						|
            'multi weee_products' => [
 | 
						|
                'quote_details' => $multiWeeeProducts,
 | 
						|
                'expected_tax_details' => $multiWeeeProductsResults,
 | 
						|
            ],
 | 
						|
            'one product, tax included' => [
 | 
						|
                'quote_details' => $oneProductInclTax,
 | 
						|
                'expected_tax_details' => $oneProductInclTaxResults,
 | 
						|
            ],
 | 
						|
            'one product, tax included but differs from store rate' => [
 | 
						|
                'quote_details' => $oneProductInclTaxDiffRate,
 | 
						|
                'expected_tax_details' => $oneProductInclTaxDiffRateResults,
 | 
						|
            ],
 | 
						|
            'two products' => [
 | 
						|
                'quote_details' => $twoProducts,
 | 
						|
                'expected_tax_details' => $twoProductsResults,
 | 
						|
            ],
 | 
						|
            'two products, tax included' => [
 | 
						|
                'quote_details' => $twoProductsInclTax,
 | 
						|
                'expected_tax_details' => $twoProductInclTaxResults,
 | 
						|
            ],
 | 
						|
            'one product with two children' => [
 | 
						|
                'quote_details' => $oneProductWithChildren,
 | 
						|
                'expected_tax_details' => $oneProductWithChildrenResults,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create quote details for use with multi rules tests
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    protected function setupMultiRuleQuote()
 | 
						|
    {
 | 
						|
        $baseQuote = $this->getBaseQuoteData();
 | 
						|
 | 
						|
        $baseQuote['items'][] = [
 | 
						|
            'code' => 'sku_1',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 10,
 | 
						|
            'unit_price' => 1.89,
 | 
						|
            'tax_class_key' => 'MultipleRulesProductClass',
 | 
						|
            'is_tax_included' => true,
 | 
						|
            'discount_amount' => 5,
 | 
						|
        ];
 | 
						|
        $baseQuote['items'][] = [
 | 
						|
            'code' => 'sku_2',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 5,
 | 
						|
            'unit_price' => 14.99,
 | 
						|
            'tax_class_key' => 'MultipleRulesProductClass',
 | 
						|
            'is_tax_included' => true,
 | 
						|
            'discount_amount' => 10,
 | 
						|
        ];
 | 
						|
        $baseQuote['items'][] = [
 | 
						|
            'code' => 'sku_3',
 | 
						|
            'type' => 'product',
 | 
						|
            'quantity' => 1,
 | 
						|
            'unit_price' => 99.99,
 | 
						|
            'tax_class_key' => 'MultipleRulesProductClass',
 | 
						|
            'is_tax_included' => false,
 | 
						|
            'discount_amount' => 5,
 | 
						|
        ];
 | 
						|
 | 
						|
        return $baseQuote;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create the base results for the multi rules test
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    protected function getBaseQuoteResult()
 | 
						|
    {
 | 
						|
        $result = [
 | 
						|
            'subtotal' => 183.75,
 | 
						|
            'tax_amount' => 42.88,
 | 
						|
            'discount_tax_compensation_amount' => 3.08,
 | 
						|
            'applied_taxes' => [
 | 
						|
                [
 | 
						|
                    'amount' => 22.1,
 | 
						|
                    'percent' => 13.25,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 8.25',
 | 
						|
                            'title' => 'US - 42 - 8.25',
 | 
						|
                            'percent' => 8.25,
 | 
						|
                        ],
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 5 - 55555',
 | 
						|
                            'title' => 'US - 42 - 5 - 55555',
 | 
						|
                            'percent' => 5,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 8.25US - 42 - 5 - 55555',
 | 
						|
                ],
 | 
						|
                [
 | 
						|
                    'amount' => 20.78,
 | 
						|
                    'percent' => 12.4575,
 | 
						|
                    'rates' => [
 | 
						|
                        [
 | 
						|
                            'code' => 'US - 42 - 11 - 55555',
 | 
						|
                            'title' => 'US - 42 - 11 - 55555',
 | 
						|
                            'percent' => 11,
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    'tax_rate_key' => 'US - 42 - 11 - 55555',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'items' => [
 | 
						|
                'sku_1' => [
 | 
						|
                    'code' => 'sku_1',
 | 
						|
                    'row_tax' => 3.31,
 | 
						|
                    'price' => 1.69,
 | 
						|
                    'price_incl_tax' => 2.12,
 | 
						|
                    'row_total' => 16.86,
 | 
						|
                    'row_total_incl_tax' => 21.2,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 25.7075,
 | 
						|
                    'discount_tax_compensation_amount' => 1.03,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25US - 42 - 5 - 55555' => [
 | 
						|
                            'amount' => 1.71,
 | 
						|
                            'percent' => 13.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25US - 42 - 5 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                                'US - 42 - 5 - 55555' => [
 | 
						|
                                    'percent' => 5,
 | 
						|
                                    'code' => 'US - 42 - 5 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 5 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                        'US - 42 - 11 - 55555' => [
 | 
						|
                            'amount' => 1.6,
 | 
						|
                            'percent' => 12.4575,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 11 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 11 - 55555' => [
 | 
						|
                                    'percent' => 11,
 | 
						|
                                    'code' => 'US - 42 - 11 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 11 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sku_2' => [
 | 
						|
                    'code' => 'sku_2',
 | 
						|
                    'row_tax' => 15.15,
 | 
						|
                    'price' => 13.38,
 | 
						|
                    'price_incl_tax' => 16.82,
 | 
						|
                    'row_total' => 66.9,
 | 
						|
                    'row_total_incl_tax' => 84.1,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 25.7075,
 | 
						|
                    'discount_tax_compensation_amount' => 2.05,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25US - 42 - 5 - 55555' => [
 | 
						|
                            'amount' => 7.8,
 | 
						|
                            'percent' => 13.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25US - 42 - 5 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                                'US - 42 - 5 - 55555' => [
 | 
						|
                                    'percent' => 5,
 | 
						|
                                    'code' => 'US - 42 - 5 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 5 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                        'US - 42 - 11 - 55555' => [
 | 
						|
                            'amount' => 7.35,
 | 
						|
                            'percent' => 12.4575,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 11 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 11 - 55555' => [
 | 
						|
                                    'percent' => 11,
 | 
						|
                                    'code' => 'US - 42 - 11 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 11 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'sku_3' => [
 | 
						|
                    'code' => 'sku_3',
 | 
						|
                    'row_tax' => 24.42,
 | 
						|
                    'price' => 99.99,
 | 
						|
                    'price_incl_tax' => 125.7,
 | 
						|
                    'row_total' => 99.99,
 | 
						|
                    'row_total_incl_tax' => 125.7,
 | 
						|
                    'type' => 'product',
 | 
						|
                    'tax_percent' => 25.7075,
 | 
						|
                    'discount_tax_compensation_amount' => 0,
 | 
						|
                    'associated_item_code' => null,
 | 
						|
                    'applied_taxes' => [
 | 
						|
                        'US - 42 - 8.25US - 42 - 5 - 55555' => [
 | 
						|
                            'amount' => 12.59,
 | 
						|
                            'percent' => 13.25,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 8.25US - 42 - 5 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 8.25' => [
 | 
						|
                                    'percent' => 8.25,
 | 
						|
                                    'code' => 'US - 42 - 8.25',
 | 
						|
                                    'title' => 'US - 42 - 8.25',
 | 
						|
                                ],
 | 
						|
                                'US - 42 - 5 - 55555' => [
 | 
						|
                                    'percent' => 5,
 | 
						|
                                    'code' => 'US - 42 - 5 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 5 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                        'US - 42 - 11 - 55555' => [
 | 
						|
                            'amount' => 11.83,
 | 
						|
                            'percent' => 12.4575,
 | 
						|
                            'tax_rate_key' => 'US - 42 - 11 - 55555',
 | 
						|
                            'rates' => [
 | 
						|
                                'US - 42 - 11 - 55555' => [
 | 
						|
                                    'percent' => 11,
 | 
						|
                                    'code' => 'US - 42 - 11 - 55555',
 | 
						|
                                    'title' => 'US - 42 - 11 - 55555',
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @dataProvider multiRulesRowBasedDataProvider
 | 
						|
     * @magentoConfigFixture default_store tax/calculation/algorithm ROW_BASE_CALCULATION
 | 
						|
     */
 | 
						|
    public function testMultiRulesRowBased($quoteDetailsData, $expectedTaxDetails)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails);
 | 
						|
 | 
						|
        $this->assertEqualsWithDelta($expectedTaxDetails, $this->convertObjectToArray($taxDetails), self::EPSILON);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function multiRulesRowBasedDataProvider()
 | 
						|
    {
 | 
						|
        $quoteDetails = $this->setupMultiRuleQuote();
 | 
						|
 | 
						|
        $results = $this->getBaseQuoteResult();
 | 
						|
 | 
						|
        return [
 | 
						|
            'multi rules, multi rows' => [
 | 
						|
                'quote_details' => $quoteDetails,
 | 
						|
                'expected_tax_details' => $results,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @dataProvider multiRulesTotalBasedDataProvider
 | 
						|
     * @magentoConfigFixture default_store tax/calculation/algorithm TOTAL_BASE_CALCULATION
 | 
						|
     */
 | 
						|
    public function testMultiRulesTotalBased($quoteDetailsData, $expectedTaxDetails)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails);
 | 
						|
 | 
						|
        $this->assertEqualsWithDelta($expectedTaxDetails, $this->convertObjectToArray($taxDetails), self::EPSILON);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function multiRulesTotalBasedDataProvider()
 | 
						|
    {
 | 
						|
        $quoteDetails = $this->setupMultiRuleQuote();
 | 
						|
 | 
						|
        $results = $this->getBaseQuoteResult();
 | 
						|
 | 
						|
        //Differences from the row base result
 | 
						|
        $results['subtotal'] = 183.76;
 | 
						|
        $results['tax_amount'] = 42.89;
 | 
						|
        $results['discount_tax_compensation_amount'] = 3.06;
 | 
						|
        $results['applied_taxes'][0]['amount'] = 22.11;
 | 
						|
        $results['items']['sku_2']['row_tax'] = 15.16;
 | 
						|
        $results['items']['sku_2']['row_total'] = 66.91;
 | 
						|
        $results['items']['sku_2']['discount_tax_compensation_amount'] = 2.03;
 | 
						|
        $results['items']['sku_2']['applied_taxes']['US - 42 - 8.25US - 42 - 5 - 55555']['amount'] = 7.81;
 | 
						|
 | 
						|
        return [
 | 
						|
            'multi rules, multi rows' => [
 | 
						|
                'quote_details' => $quoteDetails,
 | 
						|
                'expected_tax_details' => $results,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @dataProvider multiRulesUnitBasedDataProvider
 | 
						|
     * @magentoConfigFixture default_store tax/calculation/algorithm UNIT_BASE_CALCULATION
 | 
						|
     */
 | 
						|
    public function testMultiRulesUnitBased($quoteDetailsData, $expectedTaxDetails)
 | 
						|
    {
 | 
						|
        $quoteDetailsData = $this->performTaxClassSubstitution($quoteDetailsData);
 | 
						|
        $quoteDetails = $this->quoteDetailsFactory->create();
 | 
						|
        $this->dataObjectHelper->populateWithArray(
 | 
						|
            $quoteDetails,
 | 
						|
            $quoteDetailsData,
 | 
						|
            \Magento\Tax\Api\Data\QuoteDetailsInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        $taxDetails = $this->taxCalculationService->calculateTax($quoteDetails);
 | 
						|
 | 
						|
        $this->assertEqualsWithDelta($expectedTaxDetails, $this->convertObjectToArray($taxDetails), self::EPSILON);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     */
 | 
						|
    public function multiRulesUnitBasedDataProvider()
 | 
						|
    {
 | 
						|
        $quoteDetails = $this->setupMultiRuleQuote();
 | 
						|
 | 
						|
        $results = $this->getBaseQuoteResult();
 | 
						|
 | 
						|
        //Differences from the row base result
 | 
						|
        $results['subtotal'] = 183.79;
 | 
						|
        $results['tax_amount'] = 42.87;
 | 
						|
        $results['discount_tax_compensation_amount'] = 3.05;
 | 
						|
        $results['applied_taxes'][1]['amount'] = 20.77;
 | 
						|
        $results['items']['sku_1']['row_tax'] = 3.3;
 | 
						|
        $results['items']['sku_1']['row_total'] = 16.9;
 | 
						|
        $results['items']['sku_1']['discount_tax_compensation_amount'] = 1;
 | 
						|
        $results['items']['sku_1']['applied_taxes']['US - 42 - 8.25US - 42 - 5 - 55555']['amount'] = 1.7;
 | 
						|
        $results['items']['sku_2']['applied_taxes']['US - 42 - 8.25US - 42 - 5 - 55555']['amount'] = 7.81;
 | 
						|
        $results['items']['sku_2']['applied_taxes']['US - 42 - 11 - 55555']['amount'] = 7.34;
 | 
						|
 | 
						|
        return [
 | 
						|
            'multi rules, multi rows' => [
 | 
						|
                'quote_details' => $quoteDetails,
 | 
						|
                'expected_tax_details' => $results,
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Substitutes an ID for the name of a tax class in a tax class ID field.
 | 
						|
     *
 | 
						|
     * @param array $data
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function performTaxClassSubstitution($data)
 | 
						|
    {
 | 
						|
        array_walk_recursive(
 | 
						|
            $data,
 | 
						|
            function (&$value, $key) {
 | 
						|
                if (($key === 'tax_class_key' || $key === 'customer_tax_class_key')
 | 
						|
                    && is_string($value)
 | 
						|
                ) {
 | 
						|
                    $value = [
 | 
						|
                        Key::KEY_TYPE => TaxClassKeyInterface::TYPE_ID,
 | 
						|
                        Key::KEY_VALUE => $this->taxClassIds[$value],
 | 
						|
                    ];
 | 
						|
                }
 | 
						|
            }
 | 
						|
        );
 | 
						|
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Helper function that sets up some default rules
 | 
						|
     */
 | 
						|
    private function setUpDefaultRules()
 | 
						|
    {
 | 
						|
        $this->taxClassIds = $this->taxRuleFixtureFactory->createTaxClasses([
 | 
						|
            ['name' => 'DefaultCustomerClass', 'type' => ClassModel::TAX_CLASS_TYPE_CUSTOMER],
 | 
						|
            ['name' => 'DefaultProductClass', 'type' => ClassModel::TAX_CLASS_TYPE_PRODUCT],
 | 
						|
            ['name' => 'HigherProductClass', 'type' => ClassModel::TAX_CLASS_TYPE_PRODUCT],
 | 
						|
            ['name' => 'MultipleRulesProductClass', 'type' => ClassModel::TAX_CLASS_TYPE_PRODUCT],
 | 
						|
            ['name' => 'WeeeProductClass', 'type' => ClassModel::TAX_CLASS_TYPE_PRODUCT],
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->taxRates = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 7.5, 'country' => 'US', 'region' => 42],
 | 
						|
            ['percentage' => 7.5, 'country' => 'US', 'region' => 12], // Default store rate
 | 
						|
        ]);
 | 
						|
 | 
						|
        $weeeTaxRates = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 8.25, 'country' => 'US', 'region' => 12] // Default store rate
 | 
						|
        ]);
 | 
						|
 | 
						|
        $multiTaxRates1 = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 8.25, 'country' => 'US', 'region' => 42],
 | 
						|
            ['percentage' => 12, 'country' => 'US', 'region' => 12], // Default store rate
 | 
						|
        ]);
 | 
						|
 | 
						|
        $multiTaxRatesSamePriority = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 5, 'country' => 'US', 'region' => 42, 'postcode' => '55555'],
 | 
						|
        ]);
 | 
						|
 | 
						|
        $multiTaxRatesDifferentPriority = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 11, 'country' => 'US', 'region' => 42, 'postcode' => '55555'],
 | 
						|
        ]);
 | 
						|
 | 
						|
        $higherRates = $this->taxRuleFixtureFactory->createTaxRates([
 | 
						|
            ['percentage' => 22, 'country' => 'US', 'region' => 42],
 | 
						|
            ['percentage' => 10, 'country' => 'US', 'region' => 12], // Default store rate
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->taxRules = $this->taxRuleFixtureFactory->createTaxRules([
 | 
						|
            [
 | 
						|
                'code' => 'Default Rule',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [$this->taxClassIds['DefaultProductClass']],
 | 
						|
                'tax_rate_ids' => array_values($this->taxRates),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 0,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'Weee Rule',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [$this->taxClassIds['WeeeProductClass']],
 | 
						|
                'tax_rate_ids' => array_values($weeeTaxRates),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 0,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'Higher Rate Rule',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [$this->taxClassIds['HigherProductClass']],
 | 
						|
                'tax_rate_ids' => array_values($higherRates),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 0,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'MultiRule-1',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [
 | 
						|
                    $this->taxClassIds['MultipleRulesProductClass'],
 | 
						|
                    $this->taxClassIds['WeeeProductClass']
 | 
						|
                ],
 | 
						|
                'tax_rate_ids' => array_values($multiTaxRates1),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 0,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'MultiRule-2',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [$this->taxClassIds['MultipleRulesProductClass']],
 | 
						|
                'tax_rate_ids' => array_values($multiTaxRatesSamePriority),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 0,
 | 
						|
            ],
 | 
						|
            [
 | 
						|
                'code' => 'MultiRule-3',
 | 
						|
                'customer_tax_class_ids' => [$this->taxClassIds['DefaultCustomerClass'], 3],
 | 
						|
                'product_tax_class_ids' => [$this->taxClassIds['MultipleRulesProductClass']],
 | 
						|
                'tax_rate_ids' => array_values($multiTaxRatesDifferentPriority),
 | 
						|
                'sort_order' => 0,
 | 
						|
                'priority' => 1,
 | 
						|
            ],
 | 
						|
        ]);
 | 
						|
 | 
						|
        // For cleanup
 | 
						|
        $this->taxRates = array_merge($this->taxRates, $weeeTaxRates);
 | 
						|
        $this->taxRates = array_merge($this->taxRates, $higherRates);
 | 
						|
        $this->taxRates = array_merge($this->taxRates, $multiTaxRates1);
 | 
						|
        $this->taxRates = array_merge($this->taxRates, $multiTaxRatesSamePriority);
 | 
						|
        $this->taxRates = array_merge($this->taxRates, $multiTaxRatesDifferentPriority);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Helper function that tears down some default rules
 | 
						|
     */
 | 
						|
    private function tearDownDefaultRules()
 | 
						|
    {
 | 
						|
        $this->taxRuleFixtureFactory->deleteTaxRules(array_values($this->taxRules));
 | 
						|
        $this->taxRuleFixtureFactory->deleteTaxRates(array_values($this->taxRates));
 | 
						|
        $this->taxRuleFixtureFactory->deleteTaxClasses(array_values($this->taxClassIds));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function getBaseQuoteData()
 | 
						|
    {
 | 
						|
        $baseQuote = [
 | 
						|
            'billing_address' => [
 | 
						|
                'postcode' => '55555',
 | 
						|
                'country_id' => 'US',
 | 
						|
                'region' => ['region_id' => 42],
 | 
						|
            ],
 | 
						|
            'shipping_address' => [
 | 
						|
                'postcode' => '55555',
 | 
						|
                'country_id' => 'US',
 | 
						|
                'region' => ['region_id' => 42],
 | 
						|
            ],
 | 
						|
            'items' => [],
 | 
						|
            'customer_tax_class_key' => 'DefaultCustomerClass',
 | 
						|
        ];
 | 
						|
        return $baseQuote;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Convert given object to array.
 | 
						|
     *
 | 
						|
     * This utility function is used to simplify expected result verification.
 | 
						|
     *
 | 
						|
     * @param \Magento\Framework\DataObject $object
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function convertObjectToArray($object)
 | 
						|
    {
 | 
						|
        if ($object instanceof \Magento\Framework\DataObject) {
 | 
						|
            $data = $object->getData();
 | 
						|
        } elseif (is_object($object)) {
 | 
						|
            $data = (array)$object;
 | 
						|
        } else {
 | 
						|
            throw new \InvalidArgumentException("Provided argument is not an object.");
 | 
						|
        }
 | 
						|
        foreach ($data as $key => $value) {
 | 
						|
            if (is_object($value)) {
 | 
						|
                $data[$key] = $this->convertObjectToArray($value);
 | 
						|
            } elseif (is_array($value)) {
 | 
						|
                foreach ($value as $nestedKey => $nestedValue) {
 | 
						|
                    if (is_object($nestedValue)) {
 | 
						|
                        $value[$nestedKey] = $this->convertObjectToArray($nestedValue);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                $data[$key] = $value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
}
 |