From 142dd953d437ef500709fd860c787f6ec64cf208 Mon Sep 17 00:00:00 2001 From: odoo Date: Mon, 15 Dec 2025 14:52:53 +0100 Subject: [PATCH 01/12] [ADD] Add Chapter 2 --- 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..348e3c3f208 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + + +{ + 'name': 'Estate', + 'depends': [ + 'base', + ], + 'installable': True, + 'application': True, +} From 32a660b6beb800186bd2c202e5a7f87be57eea1b Mon Sep 17 00:00:00 2001 From: odoo Date: Mon, 15 Dec 2025 15:18:06 +0100 Subject: [PATCH 02/12] [FIX] Fix Error --- estate/__manifest__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 348e3c3f208..051bd5b77d6 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - - { 'name': 'Estate', 'depends': [ From 81b8e5f4471979248a2c98de963e8f8014e5b223 Mon Sep 17 00:00:00 2001 From: odoo Date: Mon, 15 Dec 2025 17:16:36 +0100 Subject: [PATCH 03/12] [ADD] add estate models - Chapter 3 --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate_property.py | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) 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/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..ce8069ee968 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,27 @@ +from odoo import fields, models + + +class RecurringPlan(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + + name = fields.Char(required=True) + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float(required=True) + selling_price = fields.Float() + bedrooms = fields.Integer() + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + selection=[ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West') + ] + ) From f2bcc72f7597d05a943d6154b5c2350deb159ac2 Mon Sep 17 00:00:00 2001 From: mobar Date: Tue, 16 Dec 2025 14:47:56 +0100 Subject: [PATCH 04/12] [ADD] Add Chapter 4 --- estate/__manifest__.py | 5 +++++ estate/security/ir.model.access.csv | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 051bd5b77d6..93fcc7669b9 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,8 +1,13 @@ { 'name': 'Estate', + 'author': 'mobar', + 'license': 'LGPL-3', 'depends': [ 'base', ], + 'data': [ + 'security/ir.model.access.csv', + ], 'installable': True, 'application': True, } diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..0e11f47e58d --- /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 +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From 03d679b72bb24f56a9aaa86fecc4c2417366cd90 Mon Sep 17 00:00:00 2001 From: mobar Date: Wed, 17 Dec 2025 11:14:30 +0100 Subject: [PATCH 05/12] [ADD] Add Chapter 5 --- estate/__manifest__.py | 2 + estate/views/estate_menus.xml | 15 ++++++ estate/views/estate_property_views.xml | 65 ++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 93fcc7669b9..024ee7ded10 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,6 +7,8 @@ ], 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', ], 'installable': True, 'application': True, diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..57b795ff7dd --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..aca374fc228 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,65 @@ + + + + + estate.property.view.tree + estate.property + + + + + + + + + + + + + + + + estate.property.view.form + estate.property + +
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + Properties + estate.property + list,form + +
\ No newline at end of file From e313e7529a84b01f797aec1ef001348501205479 Mon Sep 17 00:00:00 2001 From: mobar Date: Fri, 19 Dec 2025 15:50:04 +0100 Subject: [PATCH 06/12] [ADD] Add Chapter 6 --- estate/views/estate_property_views.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index aca374fc228..cee4628e289 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -56,6 +56,29 @@ + + + estate.property.view.search + estate.property + + + + + + + + + + + + + + + + + + + Properties From baacd8fc52cf6e6e66fbbb9b3d0d546776107110 Mon Sep 17 00:00:00 2001 From: mobar Date: Mon, 22 Dec 2025 11:20:57 +0100 Subject: [PATCH 07/12] [ADD] Add Chapter 7 --- estate/__manifest__.py | 3 ++ estate/models/__init__.py | 3 ++ estate/models/estate_property.py | 3 ++ estate/models/estate_property_offer.py | 10 ++++++ estate/models/estate_property_tag.py | 9 +++++ estate/models/estate_property_type.py | 9 +++++ estate/security/ir.model.access.csv | 5 ++- estate/views/estate_menus.xml | 20 +++++++++++ estate/views/estate_property_offer_views.xml | 36 ++++++++++++++++++++ estate/views/estate_property_tag_views.xml | 34 ++++++++++++++++++ estate/views/estate_property_type_views.xml | 34 ++++++++++++++++++ estate/views/estate_property_views.xml | 5 +++ 12 files changed, 170 insertions(+), 1 deletion(-) 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 024ee7ded10..0e7ed55b5f2 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,9 @@ 'data': [ 'security/ir.model.access.csv', '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_menus.xml', ], 'installable': True, diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..09b2099fe84 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 \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ce8069ee968..5329d74af41 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -25,3 +25,6 @@ class RecurringPlan(models.Model): ('west', 'West') ] ) + property_type_id = fields.Many2one("estate.property.type", string="Property Type") + tag_ids = fields.Many2many("estate.property.tag", string="Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..d57619184c4 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Real Estate Property Offer" + _order = "name" + + name = fields.Char(required=True) + property_id = fields.Many2one("estate.property", string="Property", required=True) \ No newline at end of file diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..7544c03a554 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Real Estate Property Tag" + _order = "name" + + name = fields.Char(required=True) \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..99588cfefdc --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Real Estate Property Type" + _order = "name" + + name = fields.Char(required=True) \ No newline at end of file diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 0e11f47e58d..05bd9eefba4 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 -access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag,access_estate_property_tag,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer,access_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 57b795ff7dd..64000979ef6 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -12,4 +12,24 @@ name="Properties" parent="estate_property_menu" action="estate_property_action"/> + + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..92ff30a0abe --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,36 @@ + + + + estate.property.offer.view.tree + estate.property.offer + + + + + + + + + + + estate.property.offer.view.form + estate.property.offer + +
+ + + + + + +
+
+
+ + + + Property Offers + estate.property.offer + tree,form + +
\ 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..1a350fb37e1 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,34 @@ + + + + estate.property.tag.view.tree + estate.property.tag + + + + + + + + + + estate.property.tag.view.form + estate.property.tag + +
+ + + + + +
+
+
+ + + + Property Tags + estate.property.tag + list,form + +
\ 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..16096a43ae2 --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,34 @@ + + + + estate.property.type.view.tree + estate.property.type + + + + + + + + + + estate.property.type.view.form + estate.property.type + +
+ + + + + +
+
+
+ + + + Property Types + estate.property.type + list,form + +
\ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index cee4628e289..f415195a7fc 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -7,7 +7,9 @@ + + @@ -27,8 +29,10 @@

+ + @@ -63,6 +67,7 @@ + From 68dfcd8ac7fd1df7811cb40cc5687bcdd02259b9 Mon Sep 17 00:00:00 2001 From: mobar Date: Mon, 22 Dec 2025 11:50:30 +0100 Subject: [PATCH 08/12] [FIX] Fix Newlines --- estate/models/__init__.py | 2 +- estate/models/estate_property.py | 3 ++- estate/models/estate_property_offer.py | 3 ++- estate/models/estate_property_tag.py | 3 ++- estate/models/estate_property_type.py | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 09b2099fe84..2f1821a39c1 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,4 +1,4 @@ from . import estate_property from . import estate_property_type from . import estate_property_tag -from . import estate_property_offer \ No newline at end of file +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 5329d74af41..454760ccba4 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -27,4 +27,5 @@ class RecurringPlan(models.Model): ) property_type_id = fields.Many2one("estate.property.type", string="Property Type") tag_ids = fields.Many2many("estate.property.tag", string="Tags") - offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") \ No newline at end of file + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") + \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index d57619184c4..b8df550ae5c 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -7,4 +7,5 @@ class EstatePropertyOffer(models.Model): _order = "name" name = fields.Char(required=True) - property_id = fields.Many2one("estate.property", string="Property", required=True) \ No newline at end of file + property_id = fields.Many2one("estate.property", string="Property", required=True) + \ No newline at end of file diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index 7544c03a554..b8776960084 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -6,4 +6,5 @@ class EstatePropertyTag(models.Model): _description = "Real Estate Property Tag" _order = "name" - name = fields.Char(required=True) \ No newline at end of file + name = fields.Char(required=True) + \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 99588cfefdc..1d4f86a0677 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -6,4 +6,5 @@ class EstatePropertyType(models.Model): _description = "Real Estate Property Type" _order = "name" - name = fields.Char(required=True) \ No newline at end of file + name = fields.Char(required=True) + \ No newline at end of file From 13242fa939d65b5245c0194fb3efd7884feff421 Mon Sep 17 00:00:00 2001 From: mobar Date: Mon, 22 Dec 2025 13:54:11 +0100 Subject: [PATCH 09/12] [ADD] Add Chapter 8 --- estate/models/estate_property.py | 27 ++++++++++++++++++-- estate/models/estate_property_offer.py | 25 +++++++++++++++--- estate/models/estate_property_tag.py | 1 - estate/models/estate_property_type.py | 1 - estate/views/estate_property_offer_views.xml | 10 +++++--- estate/views/estate_property_views.xml | 5 ++++ 6 files changed, 58 insertions(+), 11 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 454760ccba4..e86e84b27fa 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import api, fields, models class RecurringPlan(models.Model): @@ -28,4 +28,27 @@ class RecurringPlan(models.Model): property_type_id = fields.Many2one("estate.property.type", string="Property Type") tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") - \ No newline at end of file + total_area = fields.Integer(compute="_compute_total_area") + best_price = fields.Float(compute="_compute_best_price", string="Best Offer Price") + + @api.depends('living_area', 'garden_area') + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends('offer_ids.price') + def _compute_best_price(self): + for record in self: + if record.offer_ids: + record.best_price = max(record.offer_ids.mapped('price')) + else: + record.best_price = 0.0 + + @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 = False diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index b8df550ae5c..4b846c63e3c 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,11 +1,28 @@ -from odoo import fields, models +from datetime import timedelta +from odoo import api, fields, models class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Real Estate Property Offer" - _order = "name" + _order = "price desc" - name = fields.Char(required=True) + price = fields.Float(required=True) property_id = fields.Many2one("estate.property", string="Property", required=True) - \ No newline at end of file + validity = fields.Integer(default=7, string="Validity (days)") + date_deadline = fields.Date( + compute="_compute_date_deadline", + inverse="_inverse_date_deadline", + store=True, + string="Deadline", + ) + + @api.depends("validity") + def _compute_date_deadline(self): + for offer in self: + offer.date_deadline = fields.Date.today() + timedelta(days=offer.validity) + + def _inverse_date_deadline(self): + for offer in self: + if offer.date_deadline: + offer.validity = (offer.date_deadline - fields.Date.today()).days diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index b8776960084..523fa63668e 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -7,4 +7,3 @@ class EstatePropertyTag(models.Model): _order = "name" name = fields.Char(required=True) - \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 1d4f86a0677..079275a846e 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -7,4 +7,3 @@ class EstatePropertyType(models.Model): _order = "name" name = fields.Char(required=True) - \ No newline at end of file diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 92ff30a0abe..53a5f856e50 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -5,8 +5,10 @@ estate.property.offer - + + +
@@ -19,8 +21,10 @@
- + + +
@@ -31,6 +35,6 @@ Property Offers estate.property.offer - tree,form + list,form \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f415195a7fc..b3bc1011977 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -38,6 +38,7 @@ + @@ -52,8 +53,12 @@ + + + + From e500df362a99256934488d4ae995ee73bfe54fc0 Mon Sep 17 00:00:00 2001 From: mobar Date: Mon, 22 Dec 2025 14:51:41 +0100 Subject: [PATCH 10/12] [ADD] Add Chapter 9 --- estate/models/estate_property.py | 28 +++++++++++++++++++- estate/models/estate_property_offer.py | 24 ++++++++++++++++- estate/views/estate_property_offer_views.xml | 7 ++++- estate/views/estate_property_views.xml | 6 +++++ 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e86e84b27fa..cdb98976884 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,5 @@ from odoo import api, fields, models - +from odoo.exceptions import UserError class RecurringPlan(models.Model): _name = "estate.property" @@ -25,6 +25,18 @@ class RecurringPlan(models.Model): ('west', 'West') ] ) + state = fields.Selection( + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled') + ], + default='new', + required=True + ) + buyer_id = fields.Many2one('res.partner', string='Buyer') property_type_id = fields.Many2one("estate.property.type", string="Property Type") tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") @@ -52,3 +64,17 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = False + + def action_sold(self): + for record in self: + if record.state == 'cancelled': + raise UserError(self.env._("Cancelled property cannot be sold.")) + record.state = 'sold' + return True + + def action_cancel(self): + for record in self: + if record.state == 'sold': + raise UserError(self.env._("Sold property cannot be cancelled.")) + record.state = 'cancelled' + return True diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 4b846c63e3c..d72842db359 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,6 +1,6 @@ from datetime import timedelta from odoo import api, fields, models - +from odoo.exceptions import UserError class EstatePropertyOffer(models.Model): _name = "estate.property.offer" @@ -8,6 +8,14 @@ class EstatePropertyOffer(models.Model): _order = "price desc" price = fields.Float(required=True) + 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) validity = fields.Integer(default=7, string="Validity (days)") date_deadline = fields.Date( @@ -26,3 +34,17 @@ def _inverse_date_deadline(self): for offer in self: if offer.date_deadline: offer.validity = (offer.date_deadline - fields.Date.today()).days + + def action_accept(self): + for record in self: + if record.property_id.offer_ids.filtered(lambda o: o.status == 'accepted' and o.id != record.id): + raise UserError(self.env._("Only one offer can be accepted per property.")) + record.status = 'accepted' + record.property_id.buyer_id = record.partner_id + record.property_id.selling_price = record.price + return True + + def action_refuse(self): + for record in self: + record.status = 'refused' + return True diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 53a5f856e50..f8aec409e83 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -6,9 +6,12 @@ - + + +