Observed Behaviour When using a pricelist with a fixed price for all products with a different currency than the one of the company, adding shipping cost in a sale order using this pricelist will give a wrong value of the shipping cost Expect Behaviour The computed shipping cost added in the sale order should be the same as the fixed price defined in the pricelist Reproducibility This issue can be reproduced using the following steps : 1. Define a pricelist PL1 with a fixed price for all products and a different currency than the one used in the company (eg fixed price to 15KR) 2. Create a sale order and select PL1 as pricelist 3. Add a product and add a shipping cost The shipping cost should be the defined fixed price (15KR) but it gives another value, depending of the company currency Fix Description This fix remove a useless currency conversion coming from the fact that since https://github.com/odoo/odoo/pull/86484 we get the delivery price from the SO priceliste (using pricelist.get_product_price) giving us a price that is already converted to the correct currency Related issue/PR opw-2810506 closes odoo/odoo#88861 X-original-commit: 25e2f403e88172d67ea6ce382ac1e3f5e0e37835 Signed-off-by: Adrien Widart <awt@odoo.com> Signed-off-by: Hendrickx Anthony (anhe) <anhe@odoo.com>
241 lines
11 KiB
Python
241 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo.tests import common, Form
|
|
from odoo.tools import float_compare
|
|
|
|
|
|
@common.tagged('post_install', '-at_install')
|
|
class TestDeliveryCost(common.TransactionCase):
|
|
|
|
def setUp(self):
|
|
super(TestDeliveryCost, self).setUp()
|
|
self.SaleOrder = self.env['sale.order']
|
|
self.SaleOrderLine = self.env['sale.order.line']
|
|
self.AccountAccount = self.env['account.account']
|
|
self.SaleConfigSetting = self.env['res.config.settings']
|
|
self.Product = self.env['product.product']
|
|
|
|
self.partner_18 = self.env['res.partner'].create({'name': 'My Test Customer'})
|
|
self.pricelist = self.env.ref('product.list0')
|
|
self.product_4 = self.env['product.product'].create({'name': 'A product to deliver'})
|
|
self.product_uom_unit = self.env.ref('uom.product_uom_unit')
|
|
self.product_delivery_normal = self.env['product.product'].create({
|
|
'name': 'Normal Delivery Charges',
|
|
'type': 'service',
|
|
'list_price': 10.0,
|
|
'categ_id': self.env.ref('delivery.product_category_deliveries').id,
|
|
})
|
|
self.normal_delivery = self.env['delivery.carrier'].create({
|
|
'name': 'Normal Delivery Charges',
|
|
'fixed_price': 10,
|
|
'delivery_type': 'fixed',
|
|
'product_id': self.product_delivery_normal.id,
|
|
})
|
|
self.partner_4 = self.env['res.partner'].create({'name': 'Another Customer'})
|
|
self.partner_address_13 = self.env['res.partner'].create({
|
|
'name': "Another Customer's Address",
|
|
'parent_id': self.partner_4.id,
|
|
})
|
|
self.product_uom_hour = self.env.ref('uom.product_uom_hour')
|
|
self.account_data = self.env.ref('account.data_account_type_revenue')
|
|
self.account_tag_operating = self.env.ref('account.account_tag_operating')
|
|
self.product_2 = self.env['product.product'].create({'name': 'Zizizaproduct'})
|
|
self.product_category = self.env.ref('product.product_category_all')
|
|
self.free_delivery = self.env.ref('delivery.free_delivery_carrier')
|
|
# as the tests hereunder assume all the prices in USD, we must ensure
|
|
# that the company actually uses USD
|
|
# We do an invalidate_cache so the cache is aware of it too.
|
|
self.env.cr.execute(
|
|
"UPDATE res_company SET currency_id = %s WHERE id = %s",
|
|
[self.env.ref('base.USD').id, self.env.company.id])
|
|
self.env.company.invalidate_cache()
|
|
self.pricelist.currency_id = self.env.ref('base.USD').id
|
|
|
|
def test_00_delivery_cost(self):
|
|
# In order to test Carrier Cost
|
|
# Create sales order with Normal Delivery Charges
|
|
|
|
self.sale_normal_delivery_charges = self.SaleOrder.create({
|
|
'partner_id': self.partner_18.id,
|
|
'partner_invoice_id': self.partner_18.id,
|
|
'partner_shipping_id': self.partner_18.id,
|
|
'pricelist_id': self.pricelist.id,
|
|
'order_line': [(0, 0, {
|
|
'name': 'PC Assamble + 2GB RAM',
|
|
'product_id': self.product_4.id,
|
|
'product_uom_qty': 1,
|
|
'product_uom': self.product_uom_unit.id,
|
|
'price_unit': 750.00,
|
|
})],
|
|
})
|
|
# I add delivery cost in Sales order
|
|
|
|
self.a_sale = self.AccountAccount.create({
|
|
'code': 'X2020',
|
|
'name': 'Product Sales - (test)',
|
|
'user_type_id': self.account_data.id,
|
|
'tag_ids': [(6, 0, {
|
|
self.account_tag_operating.id
|
|
})]
|
|
})
|
|
|
|
self.product_consultant = self.Product.create({
|
|
'sale_ok': True,
|
|
'list_price': 75.0,
|
|
'standard_price': 30.0,
|
|
'uom_id': self.product_uom_hour.id,
|
|
'uom_po_id': self.product_uom_hour.id,
|
|
'name': 'Service',
|
|
'categ_id': self.product_category.id,
|
|
'type': 'service'
|
|
})
|
|
|
|
# I add delivery cost in Sales order
|
|
delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({
|
|
'default_order_id': self.sale_normal_delivery_charges.id,
|
|
'default_carrier_id': self.normal_delivery.id
|
|
}))
|
|
choose_delivery_carrier = delivery_wizard.save()
|
|
choose_delivery_carrier.button_confirm()
|
|
|
|
# I check sales order after added delivery cost
|
|
|
|
line = self.SaleOrderLine.search([('order_id', '=', self.sale_normal_delivery_charges.id),
|
|
('product_id', '=', self.normal_delivery.product_id.id)])
|
|
self.assertEqual(len(line), 1, "Delivery cost is not Added")
|
|
|
|
zin = str(delivery_wizard.display_price) + " " + str(delivery_wizard.delivery_price) + ' ' + line.company_id.country_id.code + line.company_id.name
|
|
self.assertEqual(float_compare(line.price_subtotal, 10.0, precision_digits=2), 0,
|
|
"Delivery cost does not correspond to 10.0. %s %s" % (line.price_subtotal, zin))
|
|
|
|
# I confirm the sales order
|
|
|
|
self.sale_normal_delivery_charges.action_confirm()
|
|
|
|
# Create one more sales order with Free Delivery Charges
|
|
|
|
self.delivery_sale_order_cost = self.SaleOrder.create({
|
|
'partner_id': self.partner_4.id,
|
|
'partner_invoice_id': self.partner_address_13.id,
|
|
'partner_shipping_id': self.partner_address_13.id,
|
|
'pricelist_id': self.pricelist.id,
|
|
'order_line': [(0, 0, {
|
|
'name': 'Service on demand',
|
|
'product_id': self.product_consultant.id,
|
|
'product_uom_qty': 24,
|
|
'product_uom': self.product_uom_hour.id,
|
|
'price_unit': 75.00,
|
|
}), (0, 0, {
|
|
'name': 'On Site Assistance',
|
|
'product_id': self.product_2.id,
|
|
'product_uom_qty': 30,
|
|
'product_uom': self.product_uom_hour.id,
|
|
'price_unit': 38.25,
|
|
})],
|
|
})
|
|
|
|
# I add free delivery cost in Sales order
|
|
delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({
|
|
'default_order_id': self.delivery_sale_order_cost.id,
|
|
'default_carrier_id': self.free_delivery.id
|
|
}))
|
|
choose_delivery_carrier = delivery_wizard.save()
|
|
choose_delivery_carrier.button_confirm()
|
|
|
|
# I check sales order after adding delivery cost
|
|
line = self.SaleOrderLine.search([('order_id', '=', self.delivery_sale_order_cost.id),
|
|
('product_id', '=', self.free_delivery.product_id.id)])
|
|
|
|
self.assertEqual(len(line), 1, "Delivery cost is not Added")
|
|
self.assertEqual(float_compare(line.price_subtotal, 0, precision_digits=2), 0,
|
|
"Delivery cost is not correspond.")
|
|
|
|
# I set default delivery policy
|
|
|
|
self.default_delivery_policy = self.SaleConfigSetting.create({})
|
|
|
|
self.default_delivery_policy.execute()
|
|
|
|
def test_01_delivery_cost_from_pricelist(self):
|
|
""" This test aims to validate the use of a pricelist to compute the delivery cost in the case the associated
|
|
product of the shipping method is defined in the pricelist """
|
|
|
|
# Create pricelist with a custom price for the standard shipping method
|
|
my_pricelist = self.env['product.pricelist'].create({
|
|
'name': 'shipping_cost_change',
|
|
'item_ids': [(0, 0, {
|
|
'compute_price': 'fixed',
|
|
'fixed_price': 5,
|
|
'applied_on': '0_product_variant',
|
|
'product_id': self.normal_delivery.product_id.id,
|
|
})],
|
|
})
|
|
|
|
# Create sales order with Normal Delivery Charges
|
|
sale_pricelist_based_delivery_charges = self.SaleOrder.create({
|
|
'partner_id': self.partner_18.id,
|
|
'pricelist_id': my_pricelist.id,
|
|
'order_line': [(0, 0, {
|
|
'name': 'PC Assamble + 2GB RAM',
|
|
'product_id': self.product_4.id,
|
|
'product_uom_qty': 1,
|
|
'product_uom': self.product_uom_unit.id,
|
|
'price_unit': 750.00,
|
|
})],
|
|
})
|
|
|
|
# Add of delivery cost in Sales order
|
|
delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({
|
|
'default_order_id': sale_pricelist_based_delivery_charges.id,
|
|
'default_carrier_id': self.normal_delivery.id
|
|
}))
|
|
self.assertEqual(delivery_wizard.delivery_price, 5.0, "Delivery cost does not correspond to 5.0 in wizard")
|
|
delivery_wizard.save().button_confirm()
|
|
|
|
line = self.SaleOrderLine.search([('order_id', '=', sale_pricelist_based_delivery_charges.id),
|
|
('product_id', '=', self.normal_delivery.product_id.id)])
|
|
self.assertEqual(len(line), 1, "Delivery cost hasn't been added to SO")
|
|
self.assertEqual(line.price_subtotal, 5.0, "Delivery cost does not correspond to 5.0")
|
|
|
|
def test_02_delivery_cost_from_different_currency(self):
|
|
""" This test aims to validate the use of a pricelist using a different currency to compute the delivery cost in
|
|
the case the associated product of the shipping method is defined in the pricelist """
|
|
|
|
# Create pricelist with a custom price for the standard shipping method
|
|
my_pricelist = self.env['product.pricelist'].create({
|
|
'name': 'shipping_cost_change',
|
|
'item_ids': [(0, 0, {
|
|
'compute_price': 'fixed',
|
|
'fixed_price': 5,
|
|
'applied_on': '0_product_variant',
|
|
'product_id': self.normal_delivery.product_id.id,
|
|
})],
|
|
'currency_id': self.env.ref('base.EUR').id,
|
|
})
|
|
|
|
# Create sales order with Normal Delivery Charges
|
|
sale_pricelist_based_delivery_charges = self.SaleOrder.create({
|
|
'partner_id': self.partner_18.id,
|
|
'pricelist_id': my_pricelist.id,
|
|
'order_line': [(0, 0, {
|
|
'name': 'PC Assamble + 2GB RAM',
|
|
'product_id': self.product_4.id,
|
|
'product_uom_qty': 1,
|
|
'product_uom': self.product_uom_unit.id,
|
|
'price_unit': 750.00,
|
|
})],
|
|
})
|
|
|
|
# Add of delivery cost in Sales order
|
|
delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({
|
|
'default_order_id': sale_pricelist_based_delivery_charges.id,
|
|
'default_carrier_id': self.normal_delivery.id
|
|
}))
|
|
self.assertEqual(delivery_wizard.delivery_price, 5.0, "Delivery cost does not correspond to 5.0 in wizard")
|
|
delivery_wizard.save().button_confirm()
|
|
|
|
line = self.SaleOrderLine.search([('order_id', '=', sale_pricelist_based_delivery_charges.id),
|
|
('product_id', '=', self.normal_delivery.product_id.id)])
|
|
self.assertEqual(len(line), 1, "Delivery cost hasn't been added to SO")
|
|
self.assertEqual(line.price_subtotal, 5.0, "Delivery cost does not correspond to 5.0")
|