From dbeb0a21993a904cda00484fdff80003b225c513 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Wed, 3 Dec 2025 15:34:46 +0530 Subject: [PATCH 01/13] [IMP] estate: add initial estate application Created the necessary __init__.py and __manifest__.py files to initialize the estate application. --- estate/__init__.py | 0 estate/__manifest__.py | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..e7b2632b0a8 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,12 @@ +{ + 'name': 'Real Estate', + 'version': '1.0', + 'category': 'Real Estate', + 'depends': ['base'], + 'author': 'snrav-odoo', + 'license': 'LGPL-3', + 'description': 'Real estate purchase & sales', + 'application': True, +} + + From 1fb715ff069c67b8d963d3916d68ab9dde982c32 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Wed, 3 Dec 2025 17:44:20 +0530 Subject: [PATCH 02/13] [IMP] estate: add initial estate module structure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces the basic scaffolding for the new real estate module. • Creates the module initialization files (__init__). • Adds the first 'estate.property' model definition. • Includes the initial set of base fields for the model. These changes set up the foundational structure of the estate module, enabling future development of property management features. --- estate/__init__.py | 1 + estate/__manifest__.py | 2 -- estate/models/__init__.py | 1 + estate/models/estate_property.py | 25 +++++++++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_property.py diff --git a/estate/__init__.py b/estate/__init__.py index e69de29bb2d..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index e7b2632b0a8..3267deadee5 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,5 +8,3 @@ 'description': 'Real estate purchase & sales', 'application': True, } - - diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..5e1963c9d2f --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..9d5a5dcbeaa --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,25 @@ +from odoo import models, fields + + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + + name = fields.Char(required=True) + description = fields.Text() + pincode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float(required=True) + selling_price = fields.Float() + bedrooms = fields.Integer(required=True) + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer(string="Garden Area (sqft)") + garden_orientation = fields.Selection([ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West'), + ]) From d3e5e7b37dd3c7a411e391ee388deea404e0657a Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Thu, 4 Dec 2025 11:46:35 +0530 Subject: [PATCH 03/13] [IMP] estate: Implement access rights for property model - Added a security CSV file in the `security` folder. - Granted users access to the `estate.property` model. These changes ensure that only authorized users can access and manage estate properties, improving data security and compliance with access control rules. --- estate/__manifest__.py | 3 +++ estate/security/ir.model.access.csv | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 3267deadee5..3b92e789b1b 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -6,5 +6,8 @@ 'author': 'snrav-odoo', 'license': 'LGPL-3', 'description': 'Real estate purchase & sales', + 'data': [ + 'security/ir.model.access.csv' + ], 'application': True, } diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..b5005de0d92 --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +estate.access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From f1cb53a37216804de7fb44fc39f7125fa8acc0a4 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Thu, 4 Dec 2025 18:38:28 +0530 Subject: [PATCH 04/13] [IMP] estate: add property menus and actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Added Real Estate menu structure and linked property action. • Created window action for `estate.property`. • Loaded property views and menu XML in manifest. These changes provide users with a navigation structure and actions to access property records efficiently, improving usability and making the estate module functional from the UI. --- estate/__manifest__.py | 2 ++ estate/models/estate_property.py | 20 ++++++++++++++++++-- estate/views/estate_property_menu.xml | 18 ++++++++++++++++++ estate/views/estate_property_views.xml | 13 +++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 estate/views/estate_property_menu.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 3b92e789b1b..33cbadc7741 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,6 +7,8 @@ 'license': 'LGPL-3', 'description': 'Real estate purchase & sales', 'data': [ + 'views/estate_property_views.xml', + 'views/estate_property_menu.xml', 'security/ir.model.access.csv' ], 'application': True, diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 9d5a5dcbeaa..ce8206a3a39 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import models, fields +from dateutil.relativedelta import relativedelta class EstateProperty(models.Model): @@ -8,10 +9,13 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() pincode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date( + copy=False, + default=lambda self: fields.Date.context_today(self) + relativedelta(months=3), + ) expected_price = fields.Float(required=True) selling_price = fields.Float() - bedrooms = fields.Integer(required=True) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() @@ -23,3 +27,15 @@ class EstateProperty(models.Model): ('east', 'East'), ('west', 'West'), ]) + state = fields.Selection( + selection=[ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + string="Status", + default="new", + ) + active = fields.Boolean(default=False) diff --git a/estate/views/estate_property_menu.xml b/estate/views/estate_property_menu.xml new file mode 100644 index 00000000000..7965f791aee --- /dev/null +++ b/estate/views/estate_property_menu.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..56011cb8191 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,13 @@ + + + + Estate Property + estate.property + list,form + +

+ Create your Properties here ! +

+
+
+
From ecd35907dfabc67fc28f4f90bc285e85f2399395 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Mon, 8 Dec 2025 10:54:55 +0530 Subject: [PATCH 05/13] [IMP] estate: Add basic views for property * Added estate property form view. * Added estate property list view. * Added search view with filter and group_by options. These changes provide the basic UI for managing estate properties, allowing users to create, view, and search properties efficiently. --- estate/models/estate_property.py | 2 +- estate/views/estate_property_views.xml | 80 ++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ce8206a3a39..ec021fa204e 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,7 +8,7 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() - pincode = fields.Char() + postcode = fields.Char() date_availability = fields.Date( copy=False, default=lambda self: fields.Date.context_today(self) + relativedelta(months=3), diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 56011cb8191..1d8e53cc910 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,5 +1,85 @@ + + + estate.property.list + estate.property + + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + Search Properties + estate.property + + + + + + + + + + + + + + + Estate Property estate.property From cf8d9c54992292c86c7e37f4718dab41c5b71994 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Mon, 8 Dec 2025 15:13:40 +0530 Subject: [PATCH 06/13] [IMP] estate: model relations (M2O, O2M, M2M) * Added estate_property_offer model with required fields. * Added estate_property_tag model with required fields. * Added estate_property_type model with required fields. * Implemented relations between models (Many2one, One2many, Many2many). * Created corresponding views for offers, tags, and property types. * Added access rights for new models. --- estate/__manifest__.py | 3 ++ estate/models/__init__.py | 3 ++ estate/models/estate_property.py | 7 ++++ estate/models/estate_property_offer.py | 13 +++++++ estate/models/estate_property_tag.py | 9 +++++ estate/models/estate_property_type.py | 8 +++++ estate/security/ir.model.access.csv | 7 ++-- estate/views/estate_property_menu.xml | 17 +++++++++ estate/views/estate_property_offer_views.xml | 37 ++++++++++++++++++++ estate/views/estate_property_tag_views.xml | 23 ++++++++++++ estate/views/estate_property_type_views.xml | 24 +++++++++++++ estate/views/estate_property_views.xml | 33 +++++++++++------ 12 files changed, 171 insertions(+), 13 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tag.py create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_offer_views.xml create mode 100644 estate/views/estate_property_tag_views.xml create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 33cbadc7741..e309ca44136 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,9 @@ 'description': 'Real estate purchase & sales', 'data': [ 'views/estate_property_views.xml', + 'views/estate_property_type_views.xml', + 'views/estate_property_tag_views.xml', + 'views/estate_property_offer_views.xml', 'views/estate_property_menu.xml', 'security/ir.model.access.csv' ], diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..2f1821a39c1 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ from . import estate_property +from . import estate_property_type +from . import estate_property_tag +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ec021fa204e..3c0b1e72e46 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -39,3 +39,10 @@ class EstateProperty(models.Model): default="new", ) active = fields.Boolean(default=False) + property_type_id = fields.Many2one("estate.property.type", string="Property Type", required=True) + customer = fields.Many2one("res.partner", string="Customer", copy=False) + salesperson = fields.Many2one( + "res.users", string="Salesperson", default=lambda self: self.env.user + ) + tag_ids = fields.Many2many("estate.property.tag", string="Property Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..b6a28e4e3e5 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,13 @@ +from odoo import models, fields + + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Estate Property Offer" + + price = fields.Float() + status = fields.Selection( + selection=[("accepted", "Accepted"), ("refused", "Refused")], copy=False + ) + partner_id = fields.Many2one("res.partner", string="Partner", required=True) + property_id = fields.Many2one("estate.property", string="Property", required=True) diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..5ea642ebedd --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyTags(models.Model): + _name = "estate.property.tag" + _description = "Estate Property Tag" + _order = "name" + + name = fields.Char(required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..eebc62e998c --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Estate Property Type" + + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index b5005de0d92..1b2d70de7dd 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,5 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -estate.access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +estate.access_estate_property,"access_estate_property",estate.model_estate_property,base.group_user,1,1,1,1 +estate.access_estate_property_type,"access_estate_property_type",estate.model_estate_property_type,base.group_user,1,1,1,1 +estate.access_estate_property_tag,"access_estate_property_tag",estate.model_estate_property_tag,base.group_user,1,1,1,1 +estate.access_estate_property_offer,"access_estate_property_offer",estate.model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_property_menu.xml b/estate/views/estate_property_menu.xml index 7965f791aee..13b9066800f 100644 --- a/estate/views/estate_property_menu.xml +++ b/estate/views/estate_property_menu.xml @@ -15,4 +15,21 @@ parent="estate_property_menu_advertisement" action="main_action_estate" /> + + +
diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..8d095383824 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,37 @@ + + + + Property Offers + estate.property.offer + list,form + + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + estate.property.offer.form + estate.property.offer + +
+ + + + + + + +
+
+
+ +
\ No newline at end of file diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..c9bdb4e2901 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,23 @@ + + + + Properties Tags + estate.property.tag + list,form + +

+ Create your first Property Tag! +

+
+
+ + + estate.property.tag.list + estate.property.tag + + + + + + +
\ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..366f0d60d35 --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,24 @@ + + + + Properties Types + estate.property.type + list,form + +

+ Create your first Property Type! +

+
+
+ + + + estate.property.type.list + estate.property.type + + + + + + +
\ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 1d8e53cc910..bba0f968d36 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -22,18 +22,22 @@ estate.property.form estate.property -
+ - - - - - - +

+ +

+ + + + + + + @@ -47,12 +51,19 @@ -
- - - + + + + + + + + + + +
From 24d1e8ea442e90dd76f11d0ffa006b74303b2d42 Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Tue, 9 Dec 2025 11:36:00 +0530 Subject: [PATCH 07/13] [IMP] estate: add computed fields and onchanges for offers and garden. - Compute total_area and best_price in estate.property - Compute validity date for offers with inverse method - Set default garden area and orientation using onchange - Chapter 8 --- estate/models/estate_property.py | 26 +++++++++++++++++++- estate/models/estate_property_offer.py | 16 +++++++++++- estate/views/estate_property_offer_views.xml | 4 +++ estate/views/estate_property_views.xml | 22 ++++++++++------- 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3c0b1e72e46..17d5ad6bbc5 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import models, api, fields from dateutil.relativedelta import relativedelta @@ -46,3 +46,27 @@ class EstateProperty(models.Model): ) tag_ids = fields.Many2many("estate.property.tag", string="Property Tags") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer") + total_area = fields.Integer(compute="_compute_area") + best_price = fields.Integer(compute="_compute_highest") + + @api.depends("living_area", "garden_area") + def _compute_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends("offer_ids.price") + def _compute_highest(self): + for record in self: + if not record.mapped("offer_ids.price"): + record.best_price = 0 + else: + record.best_price = max(record.mapped("offer_ids.price")) + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden: + self.garden_area = 10 + self.garden_orientation = "north" + else: + self.garden_area = 0 + self.garden_orientation = None diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index b6a28e4e3e5..f2946bd98d0 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,5 @@ -from odoo import models, fields +from odoo import models, api, fields +from dateutil.relativedelta import relativedelta class EstatePropertyOffer(models.Model): @@ -11,3 +12,16 @@ class EstatePropertyOffer(models.Model): ) partner_id = fields.Many2one("res.partner", string="Partner", required=True) property_id = fields.Many2one("estate.property", string="Property", required=True) + validity = fields.Integer(default=7) + date_deadline = fields.Date(compute="_compute_deadline", inverse="_inverse_date") + + @api.depends("validity") + def _compute_deadline(self): + for record in self: + base_date = record.create_date or fields.Date.today() + record.date_deadline = base_date + relativedelta(days=record.validity) + + def _inverse_date(self): + for record in self: + base_date = record.create_date or fields.Date.today() + record.validity = (record.date_deadline - fields.Date.to_date(base_date)).days diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 8d095383824..b8ca1f7f1a2 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -14,6 +14,8 @@ + + @@ -28,6 +30,8 @@ + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bba0f968d36..48c5e76660d 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -23,20 +23,21 @@ estate.property
- -

- + +

+

- - - + + + - - + + + @@ -51,8 +52,11 @@ + + + - + From 81668cbe9e38421cc228fc6121941c163a4d732e Mon Sep 17 00:00:00 2001 From: Ravij Parikh Date: Tue, 9 Dec 2025 18:25:33 +0530 Subject: [PATCH 08/13] [IMP] estate: add buttons to enforce property and offer workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Link business logic to UI buttons. Prevent cancelled properties from being sold. Prevent sold properties from being cancelled. Add ‘Accept’ and ‘Refuse’ buttons for offers. Update buyer and selling price automatically. Ensure consistent workflow and reduce errors. --- estate/models/estate_property.py | 34 +++- estate/models/estate_property_offer.py | 16 +- estate/security/ir.model.access.csv | 2 +- estate/views/estate_property_menu.xml | 1 + estate/views/estate_property_offer_views.xml | 7 +- estate/views/estate_property_tag_views.xml | 3 +- estate/views/estate_property_type_views.xml | 3 +- estate/views/estate_property_views.xml | 196 +++++++++---------- 8 files changed, 147 insertions(+), 115 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 17d5ad6bbc5..2305b880c5a 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,5 @@ -from odoo import models, api, fields from dateutil.relativedelta import relativedelta +from odoo import models, api, fields, exceptions class EstateProperty(models.Model): @@ -22,10 +22,10 @@ class EstateProperty(models.Model): garden = fields.Boolean() garden_area = fields.Integer(string="Garden Area (sqft)") garden_orientation = fields.Selection([ - ('north', 'North'), - ('south', 'South'), - ('east', 'East'), - ('west', 'West'), + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West"), ]) state = fields.Selection( selection=[ @@ -46,16 +46,16 @@ class EstateProperty(models.Model): ) tag_ids = fields.Many2many("estate.property.tag", string="Property Tags") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer") - total_area = fields.Integer(compute="_compute_area") - best_price = fields.Integer(compute="_compute_highest") + total_area = fields.Integer(compute="_total_area") + best_price = fields.Integer(compute="_best_price") @api.depends("living_area", "garden_area") - def _compute_area(self): + def _total_area(self): for record in self: record.total_area = record.living_area + record.garden_area @api.depends("offer_ids.price") - def _compute_highest(self): + def _best_price(self): for record in self: if not record.mapped("offer_ids.price"): record.best_price = 0 @@ -70,3 +70,19 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = None + + def action_sold_property(self): + for record in self: + if record.state == "cancelled": + raise exceptions.UserError("Properties which are Cancelled cannot be Sold") + else: + record.state = "sold" + return True + + def action_cancel_offer(self): + for record in self: + if record.state == "sold": + raise exceptions.UserError("Properties which are Sold cannot be Cancelled") + else: + record.state = "cancelled" + return True diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f2946bd98d0..4fab7653393 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,5 +1,5 @@ -from odoo import models, api, fields from dateutil.relativedelta import relativedelta +from odoo import models, api, fields class EstatePropertyOffer(models.Model): @@ -25,3 +25,17 @@ def _inverse_date(self): for record in self: base_date = record.create_date or fields.Date.today() record.validity = (record.date_deadline - fields.Date.to_date(base_date)).days + + def action_accept(self): + for record in self: + record.status = "accepted" + record.property_id.selling_price = record.price + record.property_id.customer = record.partner_id + return True + + def action_refuse(self): + for record in self: + record.status = "refused" + record.property_id.selling_price = 0.00 + record.property_id.customer = None + return True diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 1b2d70de7dd..93689780568 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,4 +2,4 @@ estate.access_estate_property,"access_estate_property",estate.model_estate_property,base.group_user,1,1,1,1 estate.access_estate_property_type,"access_estate_property_type",estate.model_estate_property_type,base.group_user,1,1,1,1 estate.access_estate_property_tag,"access_estate_property_tag",estate.model_estate_property_tag,base.group_user,1,1,1,1 -estate.access_estate_property_offer,"access_estate_property_offer",estate.model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file +estate.access_estate_property_offer,"access_estate_property_offer",estate.model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_menu.xml b/estate/views/estate_property_menu.xml index 13b9066800f..4f050d2b83f 100644 --- a/estate/views/estate_property_menu.xml +++ b/estate/views/estate_property_menu.xml @@ -33,3 +33,4 @@ action="action_estate_property_tag" /> + diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index b8ca1f7f1a2..b9beb899379 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -13,9 +13,11 @@ - +