1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/website_sale/tests/test_website_sale_fiscal_position.py
2024-12-10 09:04:09 +07:00

98 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.base.tests.common import HttpCaseWithUserPortal
from odoo.addons.product.tests.common import ProductCommon
from odoo.tests import tagged
from odoo import Command
@tagged('post_install', '-at_install')
class TestWebsiteSaleFiscalPosition(ProductCommon, HttpCaseWithUserPortal):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls._use_currency('USD')
def test_shop_fiscal_position_products_template(self):
"""
The `website_sale.products` template is computationally intensive
and therefore uses the cache.
The goal of this test is to check that this template
is up to date with the fiscal position detected.
"""
self.env.ref('base.group_user').write({'implied_ids': [(4, self.env.ref('product.group_product_pricelist').id)]})
self.env.company.country_id = self.env.ref('base.us')
website_id = self.env.ref('website.default_website').id
belgium_id = self.env.ref('base.be').id
# Set setting to display tax included on the website
config = self.env['res.config.settings'].create({})
config.show_line_subtotals_tax_selection = "tax_included"
config.execute()
# Create a fiscal position with a mapping of taxes
tax_15_excl = self.env['account.tax'].create({
'name': '15% excl',
'type_tax_use': 'sale',
'amount_type': 'percent',
'amount': 15,
'price_include': False,
'include_base_amount': False,
})
tax_0 = self.env['account.tax'].create({
'name': '0% Test Tax',
'type_tax_use': 'sale',
'amount_type': 'percent',
'amount': 0,
})
self.env['account.fiscal.position'].create({
'name': 'fiscal_pos_belgium',
'auto_apply': True,
'country_id': belgium_id,
'tax_ids': [Command.create({
'tax_src_id': tax_15_excl.id,
'tax_dest_id': tax_0.id,
})]
})
# Create a pricelist which will be automatically detected
self.env['product.pricelist'].create([{
'name': 'EUROPE EUR',
'selectable': True,
'website_id': website_id,
'country_group_ids': [Command.link(self.env.ref('base.europe').id)],
'sequence': 1,
'currency_id': self.env.ref('base.EUR').id,
}, {
'name': 'Christmas List',
'selectable': False,
'website_id': website_id,
'country_group_ids': [Command.link(self.env.ref('base.europe').id)],
'sequence': 20,
'currency_id': self.env.ref('base.EUR').id,
}])
# Create the product to be used for analysis
self.env["product.product"].create({
'name': "Super product",
'list_price': 40.00,
'taxes_id': [tax_15_excl.id],
'website_published': True,
})
# Create a conversion rate (1 USD <=> 2 EUR)
self.env['res.currency.rate'].search([]).unlink()
self.env['res.currency.rate'].create({
'company_id': self.env.company.id,
'currency_id': self.env.ref('base.EUR').id,
'company_rate': 2,
'name': '2023-01-01',
})
self.partner_portal.country_id = belgium_id
# [1] By going to the shop page with the portal user,
# a t-cache key `pricelist,products` + `fiscal_position_id` is generated
self.start_tour("/shop", 'website_sale_fiscal_position_portal_tour', login="portal")
# [2] If we return to the page with a public user
# and take the portal user's pricelist,
# the prices must not be those previously calculated for the portal user.
# Because the fiscal position differs from that of the public user.
self.start_tour("/shop", 'website_sale_fiscal_position_public_tour', login="")