On a sale order, the delivery carrier choice was done directly on the form view. To get an estimated delivery price, the user need to click 'add to order' to create a delivery fee line. To get the exact delivery price on the sale order, the user needed to leave the sale order without delivery line in order to get the exact price from the picking at its validation. As this flow was not so clear, this commit adds a new wizard to choose the delivery carrier and check its commition fees. This add a line in any case. The wizard will be launched from a new button on the sale order Task : 1908654
141 lines
5.9 KiB
Python
141 lines
5.9 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.ref('base.res_partner_18')
|
|
self.pricelist = self.env.ref('product.list0')
|
|
self.product_4 = self.env.ref('product.product_product_4')
|
|
self.product_uom_unit = self.env.ref('uom.product_uom_unit')
|
|
self.normal_delivery = self.env.ref('delivery.normal_delivery_carrier')
|
|
self.partner_4 = self.env.ref('base.res_partner_4')
|
|
self.partner_address_13 = self.env.ref('base.res_partner_address_13')
|
|
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.ref('product.product_product_2')
|
|
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
|
|
self.env.cr.execute(
|
|
"UPDATE res_company SET currency_id = %s WHERE id = %s",
|
|
[self.env.ref('base.USD').id, self.env.user.company_id.id])
|
|
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")
|
|
|
|
self.assertEqual(float_compare(line.price_subtotal, 10.0, precision_digits=2), 0,
|
|
"Delivery cost is not correspond.")
|
|
|
|
# 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()
|