[FIX] delivery: tax calculations are wrong on delivery products

Steps to reproduce:

1- install sale, accounting
2- create a fiscal position fp that maps
tax inc t1 to any other tax t2
3- create a delivery product dp with t1 and mark it "can be sold"
4- create a new delivery method with dp
5- in a new sales order, choose fp, click on add delivery
6- the unit_price is wrong, it hasn't mapped t1 to t2
7- try adding the delivery as a product in a new sales order line
8- the unit_price is correct and the taxes are correctly calculated

Bug:

 `_create_delivery_line` is not using the same logic used
 when normally adding a sales order line although technically
 delivery product is still a product

Fix:

use `_get_tax_included_unit_price` to get the correct unit_price

OPW-2806965

closes odoo/odoo#96874

X-original-commit: 03bb18d12606447faaed0de04bb83dde5de53b96
Signed-off-by: Laurent Smet <las@odoo.com>
Signed-off-by: Mohamed Megahed Abbas Megahed SALLAM (mome) <mome@odoo.com>
This commit is contained in:
momegahed
2022-08-01 10:55:34 +02:00
parent ad71d6d3ee
commit c004067287
2 changed files with 72 additions and 0 deletions
@@ -172,6 +172,17 @@ class DeliveryCarrier(models.Model):
self.ensure_one()
if hasattr(self, '%s_rate_shipment' % self.delivery_type):
res = getattr(self, '%s_rate_shipment' % self.delivery_type)(order)
# apply fiscal position
company = self.company_id or order.company_id or self.env.company
res['price'] = self.product_id._get_tax_included_unit_price(
company,
company.currency_id,
order.date_order,
'sale',
fiscal_position=order.fiscal_position_id,
product_price_unit=res['price'],
product_currency=company.currency_id
)
# apply margin on computed price
res['price'] = float(res['price']) * (1.0 + (self.margin / 100.0))
# save the real price in case a free_over rule overide it to 0
@@ -237,3 +237,64 @@ class TestDeliveryCost(common.TransactionCase):
('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_01_taxes_on_delivery_cost(self):
# Creating taxes and fiscal position
tax_price_include = self.env['account.tax'].create({
'name': '10% inc',
'type_tax_use': 'sale',
'amount_type': 'percent',
'amount': 10,
'price_include': True,
'include_base_amount': True,
})
tax_price_exclude = self.env['account.tax'].create({
'name': '15% exc',
'type_tax_use': 'sale',
'amount_type': 'percent',
'amount': 15,
})
fiscal_position = self.env['account.fiscal.position'].create({
'name': 'fiscal_pos_a',
'tax_ids': [
(0, None, {
'tax_src_id': tax_price_include.id,
'tax_dest_id': tax_price_exclude.id,
}),
],
})
# Setting tax on delivery product
self.normal_delivery.product_id.taxes_id = tax_price_include
# Create sales order
order_form = Form(self.env['sale.order'].with_context(tracking_disable=True))
order_form.partner_id = self.partner_18
order_form.pricelist_id = self.pricelist
order_form.fiscal_position_id = fiscal_position
# Try adding delivery product as a normal product
with order_form.order_line.new() as line:
line.product_id = self.normal_delivery.product_id
line.product_uom_qty = 1.0
line.product_uom = self.product_uom_unit
sale_order = order_form.save()
self.assertRecordValues(sale_order.order_line, [{'price_subtotal': 9.09, 'price_total': 10.45}])
# Now trying to add the delivery line using the delivery wizard, the results should be the same as before
delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context(default_order_id=sale_order.id,
default_carrier_id=self.normal_delivery.id))
choose_delivery_carrier = delivery_wizard.save()
choose_delivery_carrier.button_confirm()
line = self.SaleOrderLine.search([
('order_id', '=', sale_order.id),
('product_id', '=', self.normal_delivery.product_id.id),
('is_delivery', '=', True)
])
self.assertRecordValues(line, [{'price_subtotal': 9.09, 'price_total': 10.45}])