[FIX] purchase: Compute receipt_reminder_email based on the PO company

Steps to reproduce the issue:
- Have two companies in your database.
- Create a partner:
    - Set "receipt_reminder_email" to True for Company 1.
    - Set "receipt_reminder_email" to False for Company 2.

- Create a Purchase Order with Company 2.

Problem:
The field "receipt_reminder_email" is a related field, so its value
is False. However, if you switch the current company to "Company 1"
while keeping the Purchase Order in Company 2, the
"receipt_reminder_email" is updated to True.

Solution:
The field should be computed instead. the readonly for this field in not
neccessary anymore so the inverse is not mandoatory.

opw-3593577

closes odoo/odoo#147648

X-original-commit: 2211e08f69eed7af9be20f178f659f6a71fb6ac4
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Djamel Touati (otd) <otd@odoo.com>
This commit is contained in:
Djamel Touati
2023-12-28 08:25:20 +00:00
parent 78cbdc604e
commit d766d63b11
2 changed files with 34 additions and 10 deletions
+11 -4
View File
@@ -146,8 +146,8 @@ class PurchaseOrder(models.Model):
mail_reminder_confirmed = fields.Boolean("Reminder Confirmed", default=False, readonly=True, copy=False, help="True if the reminder email is confirmed by the vendor.")
mail_reception_confirmed = fields.Boolean("Reception Confirmed", default=False, readonly=True, copy=False, help="True if PO reception is confirmed by the vendor.")
receipt_reminder_email = fields.Boolean('Receipt Reminder Email', related='partner_id.receipt_reminder_email', readonly=False)
reminder_date_before_receipt = fields.Integer('Days Before Receipt', related='partner_id.reminder_date_before_receipt', readonly=False)
receipt_reminder_email = fields.Boolean('Receipt Reminder Email', compute='_compute_receipt_reminder_email')
reminder_date_before_receipt = fields.Integer('Days Before Receipt', compute='_compute_receipt_reminder_email')
@api.constrains('company_id', 'order_line')
def _check_order_line_company_id(self):
@@ -198,6 +198,12 @@ class PurchaseOrder(models.Model):
name += ': ' + formatLang(self.env, po.amount_total, currency_obj=po.currency_id)
po.display_name = name
@api.depends('company_id', 'partner_id')
def _compute_receipt_reminder_email(self):
for order in self:
order.receipt_reminder_email = order.partner_id.with_company(order.company_id).receipt_reminder_email
order.reminder_date_before_receipt = order.partner_id.with_company(order.company_id).reminder_date_before_receipt
@api.depends_context('lang')
@api.depends('order_line.taxes_id', 'order_line.price_subtotal', 'amount_total', 'amount_untaxed')
def _compute_tax_totals(self):
@@ -813,10 +819,11 @@ class PurchaseOrder(models.Model):
"""When auto sending a reminder mail, only send for unconfirmed purchase
order and not all products are service."""
return self.search([
('receipt_reminder_email', '=', True),
('partner_id', '!=', False),
('state', 'in', ['purchase', 'done']),
('mail_reminder_confirmed', '=', False)
]).filtered(lambda p: p.mapped('order_line.product_id.product_tmpl_id.type') != ['service'])
]).filtered(lambda p: p.partner_id.with_company(p.company_id).receipt_reminder_email and\
p.mapped('order_line.product_id.product_tmpl_id.type') != ['service'])
def _default_order_line_values(self):
default_data = super()._default_order_line_values()
+23 -6
View File
@@ -71,9 +71,13 @@ class TestPurchase(AccountTestInvoicingCommon):
self.assertTrue(purchase_order.name.startswith('PO/2020/'))
def test_reminder_1(self):
"""Set to send reminder today, check if a reminder can be send to the
"""Set to send reminder tomorrow, check if a reminder can be send to the
partner.
"""
# set partner to send reminder in Company 2
self.partner_a.with_company(self.env.companies[1]).receipt_reminder_email = True
self.partner_a.with_company(self.env.companies[1]).reminder_date_before_receipt = 1
# Create the PO in Company 1
self.env.user.tz = 'Europe/Brussels'
po = Form(self.env['purchase.order'])
po.partner_id = self.partner_a
@@ -86,12 +90,25 @@ class TestPurchase(AccountTestInvoicingCommon):
po_line.product_qty = 10
po_line.price_unit = 200
# set to send reminder today
date_planned = fields.Datetime.now().replace(hour=23, minute=0) + timedelta(days=1)
date_planned = fields.Datetime.now().replace(hour=23, minute=0) + timedelta(days=2)
po.date_planned = date_planned
po.receipt_reminder_email = True
po.reminder_date_before_receipt = 1
po = po.save()
po.button_confirm()
# Check that reminder is not set in Company 1 and the mail will not be sent
self.assertEqual(po.company_id, self.env.companies[0])
self.assertFalse(po.receipt_reminder_email)
self.assertEqual(po.reminder_date_before_receipt, 1, "The default value should be taken from the company")
old_messages = po.message_ids
po._send_reminder_mail()
messages_send = po.message_ids - old_messages
self.assertFalse(messages_send)
# Set to send reminder in Company 1
self.partner_a.receipt_reminder_email = True
self.partner_a.reminder_date_before_receipt = 2
# Invalidate the cache to ensure that the computed fields are recomputed
self.env.invalidate_all()
self.assertTrue(po.receipt_reminder_email)
self.assertEqual(po.reminder_date_before_receipt, 2)
# check date_planned is correctly set
self.assertEqual(po.date_planned, date_planned)
@@ -132,9 +149,9 @@ class TestPurchase(AccountTestInvoicingCommon):
po_line.price_unit = 200
# set to send reminder tomorrow
po.date_planned = fields.Datetime.now() + timedelta(days=2)
po.receipt_reminder_email = True
po.reminder_date_before_receipt = 1
po = po.save()
self.partner_a.receipt_reminder_email = True
self.partner_a.reminder_date_before_receipt = 1
po.button_confirm()
# check vendor is a message recipient