[FIX] website_sale: set correct payment terms
__Current behavior before commit:__ When a sale order is created with a product added to the cart, `payment_term_id` is initially set by [sale_get_payment_term][1]. However, when the user sets their address, `payment_term_id` is then set to `partner_id.property_payment_term_id` due to the triggering of [_compute_payment_term_id][2]. This means that `payment_term_id` is computed differently if the user edits his address before confirming the order or not. (Resulting in it being `False` most of the time). __Description of the fix:__ Inherit [_compute_payment_term_id][2] to set `payment_term_id` using [sale_get_payment_term][1] from the **website_sale** module. __Steps to reproduce the issue on runbot:__ - Add a product to the cart through the website. → A new sale order will be created with payment terms set. - Proceed to checkout and edit the address on the website → The sale order payment terms will be removed opw-3492868 [1]: https://github.com/odoo/odoo/blob/1336ecf08210b04fb4b365d9e3a2bf8ae434de51/addons/website_sale/models/website.py#L215 [2]: https://github.com/odoo/odoo/blob/1336ecf08210b04fb4b365d9e3a2bf8ae434de51/addons/sale/models/sale_order.py#L518 closes odoo/odoo#145023 X-original-commit: 14f1168d1a27c04312a42f365ebfd24c0d07dba8 Signed-off-by: Julien Launois (jula) <jula@odoo.com>
This commit is contained in:
@@ -101,6 +101,13 @@ class SaleOrder(models.Model):
|
||||
else:
|
||||
order.is_abandoned_cart = False
|
||||
|
||||
@api.depends('partner_id')
|
||||
def _compute_payment_term_id(self):
|
||||
super()._compute_payment_term_id()
|
||||
for order in self:
|
||||
if order.website_id:
|
||||
order.payment_term_id = order.website_id.with_company(order.company_id).sale_get_payment_term(order.partner_id)
|
||||
|
||||
def _search_abandoned_cart(self, operator, value):
|
||||
website_ids = self.env['website'].search_read(fields=['id', 'cart_abandoned_delay', 'partner_id'])
|
||||
deadlines = [[
|
||||
|
||||
@@ -683,3 +683,32 @@ class TestWebsiteSaleCheckoutAddress(TransactionCaseWithUserDemo, HttpCaseWithUs
|
||||
})
|
||||
invoice.action_post()
|
||||
self.assertFalse(partner_1._can_edit_name())
|
||||
|
||||
def test_11_payment_term_when_address_change(self):
|
||||
''' This test ensures that the payment term set when triggering
|
||||
`onchange_partner_id` by changing the address of a website sale
|
||||
order is computed by `sale_get_payment_term`.
|
||||
'''
|
||||
self._setUp_multicompany_env()
|
||||
product_id = self.env['product.product'].create({
|
||||
'name': 'Product A',
|
||||
'list_price': 100,
|
||||
'website_published': True,
|
||||
'sale_ok': True}).id
|
||||
|
||||
env = api.Environment(self.env.cr, self.portal_user.id, {})
|
||||
with MockRequest(env, website=self.website.with_env(env).with_context(website_id=self.website.id)) as req:
|
||||
req.httprequest.method = "POST"
|
||||
|
||||
self.WebsiteSaleController.cart_update(product_id)
|
||||
so = self.portal_user.sale_order_ids[0]
|
||||
self.assertTrue(so.payment_term_id, "A payment term should be set by default on the sale order")
|
||||
|
||||
self.default_address_values['partner_id'] = self.portal_partner.id
|
||||
self.default_address_values['name'] = self.portal_partner.name
|
||||
self.WebsiteSaleController.address(**self.default_address_values)
|
||||
self.assertTrue(so.payment_term_id, "A payment term should still be set on the sale order")
|
||||
|
||||
so.website_id = False
|
||||
self.WebsiteSaleController.address(**self.default_address_values)
|
||||
self.assertFalse(so.payment_term_id, "The website default payment term should not be set on a sale order not coming from the website")
|
||||
|
||||
Reference in New Issue
Block a user