From 809cf2801f850177e8e3210733d1418c70aa022a Mon Sep 17 00:00:00 2001
From: Matt Marcha <matt@marcha.pro>
Date: Wed, 17 Jul 2024 15:45:07 -1000
Subject: [PATCH] chapt 8

---
 estate/models/estate_property.py             | 33 ++++++++++++++++++--
 estate/models/estate_property_offer.py       | 15 +++++++--
 estate/views/estate_property_offer_views.xml |  4 +++
 estate/views/estate_property_views.xml       |  2 ++
 4 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py
index 8035797..b7603bc 100644
--- a/estate/models/estate_property.py
+++ b/estate/models/estate_property.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
-
-from odoo import fields, models
+from odoo import api, fields, models
 
 class EstateProperty(models.Model):
     _name = "estate.property"
@@ -25,4 +24,32 @@ class EstateProperty(models.Model):
     salesman_id = fields.Many2one("res.users", string="Salesman")
     buyer_id = fields.Many2one("res.partner", string="Buyer")
     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")
+    total_area = fields.Integer(compute="_get_total_area", readonly=True)
+    best_price = fields.Float(compute="_compute_best_price")
+
+    @api.depends('living_area', 'garden_area')
+    def _get_total_area(self):
+        for entry in self:
+            entry.total_area = entry.living_area + entry.garden_area
+
+    @api.depends('offer_ids.price')
+    def _compute_best_price(self):
+        for record in self:
+            record.best_price = max(record.offer_ids.mapped('price')) if record.offer_ids else None
+
+    @api.onchange('garden')
+    def _onchange_garden(self):
+        if self.garden:
+            self.garden_area = 10
+            self.garden_orientation = 'north'
+        else:
+            self.garden_area = None
+            self.garden_orientation = None
+
+    @api.onchange('date_availability')
+    def _onchange_date_availability(self):
+        if self.date_availability < fields.Date.today():
+            return {'warning': {
+                'title': ("Warning"),
+                'message': ("The date is in the past.")}}
\ No newline at end of file
diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py
index 2d6783a..0a28458 100644
--- a/estate/models/estate_property_offer.py
+++ b/estate/models/estate_property_offer.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo import fields, models
+from odoo import api, fields, models
 
 class EstatePropertyOffer(models.Model):
     _name = "estate.property.offer"
@@ -8,4 +8,15 @@ class EstatePropertyOffer(models.Model):
     price = fields.Float()
     status = fields.Selection(copy=False, selection=[('accepted', 'Accepted'), ('refused', 'Refused')])
     partner_id = fields.Many2one("res.partner", required=True)
-    property_id = fields.Many2one("estate.property", required=True)
\ No newline at end of file
+    property_id = fields.Many2one("estate.property", required=True)
+    validity = fields.Integer(default=7, string='validity (days)')
+    date_deadline = fields.Date(compute="_compute_date_deadline", inverse="_inverse_date_deadline")
+
+    @api.depends('validity', 'create_date')
+    def _compute_date_deadline(self):
+        for record in self:
+            record.date_deadline = fields.Date.add(record.create_date or fields.Date.today(), days=record.validity)
+    
+    def _inverse_date_deadline(self):
+        for record in self:
+            record.validity = (record.date_deadline - (record.create_date.date() or fields.Date.today())).days
\ 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 9b67456..6ca370a 100644
--- a/estate/views/estate_property_offer_views.xml
+++ b/estate/views/estate_property_offer_views.xml
@@ -7,6 +7,8 @@
             <tree string="Offers">
                 <field name="price" />
                 <field name="partner_id" />
+                <field name="validity" />
+                <field name="date_deadline" />
                 <field name="status" />
             </tree>
         </field>
@@ -20,6 +22,8 @@
                 <sheet>
                     <field name="price" />
                     <field name="partner_id" />
+                    <field name="validity" />
+                    <field name="date_deadline" />
                     <field name="status" />
                 </sheet>
             </form>
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml
index fa94b15..054e965 100644
--- a/estate/views/estate_property_views.xml
+++ b/estate/views/estate_property_views.xml
@@ -41,6 +41,7 @@
                         </group>
                         <group>
                             <field name="expected_price" />
+                            <field name="best_price" />
                             <field name="selling_price" />
                         </group>
                     </group>
@@ -55,6 +56,7 @@
                                 <field name="garden" />
                                 <field name="garden_area" string="Garden area (sqm)" />
                                 <field name="garden_orientation" />
+                                <field name="total_area" string="Total area (sqm)" />
                             </group>
                         </page>
                         <page string="People">