Skip to content

Commit 4d069f8

Browse files
committed
[IMP] real_estate: Testcases for offers and garden reset logic
Purpose: Prevent invalid property sales/offers and fix garden field issues. Approach: - Blocked offers on sold properties and sales without accepted offers. - Fixed garden reset to retain area and orientation when unchecked. Impact: Eliminates user confusion and ensures consistent UI behavior.
1 parent 621fae0 commit 4d069f8

File tree

3 files changed

+73
-7
lines changed

3 files changed

+73
-7
lines changed

real_estate/models/estate_property_offers.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,25 @@ def _compute_date_deadline(self):
3737
if record.create_date and record.validity:
3838
record.offer_deadline = fields.Date.add(
3939
record.create_date, days=record.validity
40-
)
40+
)
4141
else:
4242
record.offer_deadline = fields.Date.add(
4343
fields.Date.today(), days=record.validity
44-
)
44+
)
4545

4646
def _inverse_date_deadline(self):
4747
for record in self:
4848
if record.create_date and record.offer_deadline:
4949
record.validity = (
5050
record.offer_deadline - fields.Date.to_date(record.create_date)
51-
).days
51+
).days
5252

5353
def action_accept_offer(self):
5454
for offer in self:
55-
accepted_offer = self.env["estate.property.offers"].search(
56-
[
55+
accepted_offer = self.env["estate.property.offers"].search([
5756
("property_id", "=", offer.property_id.id),
5857
("status", "=", "accepted"),
59-
]
60-
)
58+
])
6159
if accepted_offer:
6260
raise UserError("Only one offer can be accepted per property.")
6361
offer.status = "accepted"
@@ -74,6 +72,9 @@ def create(self, vals):
7472
for val in vals:
7573
property_id = self.env["estate.property"].browse(val["property_id"])
7674

75+
if property_id.state == "sold":
76+
raise UserError("Cannot create an offer on a sold property.")
77+
7778
if property_id.state == "new":
7879
property_id.state = "offer_received"
7980

real_estate/tests/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
from . import test_real_estate

real_estate/tests/test_real_estate.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
from odoo.exceptions import UserError
4+
from odoo.tests import Form, tagged
5+
from odoo.tests.common import TransactionCase
6+
7+
8+
@tagged('post_install', '-at_install')
9+
class TestEstateProperty(TransactionCase):
10+
11+
def setUp(self):
12+
super().setUp()
13+
self.Property = self.env['estate.property']
14+
self.Offer = self.env['estate.property.offers']
15+
16+
def test_offer_cannot_be_created_on_sold_property(self):
17+
"""Offers cannot be created for sold properties"""
18+
partner = self.env['res.partner'].create({
19+
'name': 'Test Partner',
20+
'email': '[email protected]',
21+
})
22+
prop = self.Property.create({
23+
'name': 'Sold Property',
24+
'state': 'sold',
25+
'expected_price': 90000
26+
})
27+
with self.assertRaises(UserError):
28+
self.Offer.create({
29+
'price': 100000,
30+
'property_id': prop.id,
31+
'partner_id': partner.id,
32+
})
33+
34+
def test_cannot_mark_as_sold_without_accepted_offer(self):
35+
"""Should raise error when trying to sell a property with no offers at all"""
36+
prop = self.Property.create({
37+
'name': 'No Offers Property',
38+
'expected_price': 120000,
39+
})
40+
with self.assertRaises(UserError):
41+
prop.action_sold()
42+
43+
def test_onchange_garden_unchecked_resets_fields(self):
44+
"""Garden area and orientation should reset when garden is unchecked"""
45+
form = Form(self.env['estate.property'])
46+
form.name = "Reset Garden Test"
47+
form.expected_price = 90000
48+
form.garden = True
49+
prop = form.save()
50+
51+
self.assertEqual(prop.garden_area, 10)
52+
self.assertEqual(prop.garden_orientation, "north")
53+
54+
form = Form(prop)
55+
form.garden = False
56+
self.assertEqual(form.garden_area, 0)
57+
self.assertFalse(form.garden_orientation)
58+
59+
prop = form.save()
60+
self.assertFalse(prop.garden)
61+
self.assertEqual(prop.garden_area, 0)
62+
self.assertFalse(prop.garden_orientation)

0 commit comments

Comments
 (0)