Skip to content

Commit 8490d5b

Browse files
[IMP] estate: add business logic to CRUD and extend users view
Control the property CRUD operations by adding buisness logic, blocking deletions and checking offer prices. We also updated the user profile so salespeople can see and manage all their properties in one place. - Prevent deletion of properties unless state is 'New' or 'Cancelled' using the 'ondelete' decorator. - Update property state to 'Offer Received' upon offer creation. - Raise a validation error if a new offer price is lower than existing offers. - Extend 'res.users' to include a list of properties assigned to the salesperson via a One2many field with a domain for available properties. - Inherit the users form view to display assigned properties in a new notebook page.
1 parent 0e1fcf0 commit 8490d5b

File tree

6 files changed

+58
-0
lines changed

6 files changed

+58
-0
lines changed

estate/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"views/estate_property_type_views.xml",
1313
"views/estate_property_tag_views.xml",
1414
"views/estate_property_offers_views.xml",
15+
"views/estate_sales_person_views.xml",
1516
"views/estate_property_menus.xml",
1617
"views/estate_property_type_menus.xml",
1718
"views/estate_property_tag_menus.xml",

estate/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
from . import estate_property_type
33
from . import estate_property_tag
44
from . import estate_property_offer
5+
from . import estate_sales_person

estate/models/estate_property.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,15 @@ def action_set_cancel(self):
108108
raise UserError("Sold properties cannot be canceled.")
109109
record.state = "canceled"
110110
return True
111+
112+
@api.ondelete(at_uninstall=False)
113+
def _unlink_if_new_or_canceled(self):
114+
for record in self:
115+
if record.state not in ("new", "canceled"):
116+
raise UserError("Only properties in 'new' or 'canceled' state can be deleted.")
117+
118+
def check_has_higher_offer(self, price):
119+
for offer in self.offer_ids:
120+
if float_compare(offer.price, price, precision_digits=2) > 0:
121+
return True
122+
return False

estate/models/estate_property_offer.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,19 @@ def refuse_offer(self):
6060
offer.status = 'refused'
6161
if offer.property_id.state != 'offer_accepted':
6262
offer.property_id.state = 'offer_received'
63+
64+
@api.model
65+
def create(self, vals_list):
66+
# Check that the offer price is higher than the current best offer for the property
67+
for val in vals_list:
68+
property_id = val.get('property_id')
69+
has_higher_offer = self.env['estate.property'].browse(property_id).check_has_higher_offer(val.get('price', 0))
70+
if has_higher_offer:
71+
raise UserError('The offer price must be higher than the current best offer for the property.')
72+
73+
# Create the offer
74+
offer = super().create(vals_list)
75+
if offer.property_id.state == 'new':
76+
offer.property_id.state = 'offer_received'
77+
78+
return offer
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from odoo import fields, models
2+
3+
4+
class EstateSalesPerson(models.Model):
5+
_inherit = "res.users"
6+
7+
property_ids = fields.One2many("estate.property", "salesperson_id", string="Estate Properties", domain=[('state', 'in', ['new', 'offer_received'])])
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<odoo>
3+
<record id="view_estate_sales_person_form" model="ir.ui.view">
4+
<field name="name">estate.salesperson.form</field>
5+
<field name="model">res.users</field>
6+
<field name="inherit_id" ref="base.view_users_form"/>
7+
<field name="arch" type="xml">
8+
<notebook position="inside">
9+
<page string="Estate Properties">
10+
<field name="property_ids">
11+
<list string="Estate Properties">
12+
<field name="name"/>
13+
<field name="expected_price"/>
14+
<field name="state"/>
15+
</list>
16+
</field>
17+
</page>
18+
</notebook>
19+
</field>
20+
</record>
21+
</odoo>

0 commit comments

Comments
 (0)