diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..9a7e03eded3 --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..5e3fcf6cfc5 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,23 @@ +{ + 'name': "Estate", + 'version': '1.0', + 'depends': ['base'], + 'author': "PRIN", + 'category': 'Category', + 'description': """ + Just a dummy estate app + """, + 'data' : [ + 'security/ir.model.access.csv', + + 'views/estate_property_views.xml', + 'views/estate_property_type_views.xml', + 'views/estate_property_offer_views.xml', + 'views/estate_property_tag_views.xml', + + 'views/estate_menus.xml', + ], + 'installable': True, + 'application': True, + 'license': 'LGPL-3', +} \ No newline at end of file diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..09b2099fe84 --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +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 new file mode 100644 index 00000000000..c21e7454dbc --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,74 @@ +from odoo import api,fields,models +from dateutil.relativedelta import relativedelta + + +class estate_property(models.Model): + _name = "estate.property" + _description = "Estate property file" + + name = fields.Char('Name',required=True, translate=True, default='Unknown') + description = fields.Text("Description",required=True, translate=True) + postcode = fields.Char("Post code",required=False, translate=True) + Date_avaibility = fields.Date("Avaibility date",required=False, copy=False, default=lambda self: self._default_date_availability(3)) + def _default_date_availability(self,number_of_months): + return fields.Date.context_today(self) + relativedelta(months=number_of_months) + expected_price = fields.Float("Expected Price",required=False) + selling_price = fields.Float("Selling Price",readonly=True, copy=False, required=False) + bedrooms = fields.Integer("Bedrooms numbers",required=False, default=2) + living_area = fields.Integer("Living Area",required=False) + facades = fields.Integer("Facades",required=False) + garage = fields.Boolean("Garage",required=False) + garden = fields.Boolean("Garden",required=False) + garden_area = fields.Integer("garden_area",required=False) + Orientation = fields.Selection( + string="Garden Orientation", + selection=[('North','North'),('East','East'),('South','South'),('West','West')] + ) + Estate_state = fields.Selection( + string="Estate State", + selection=[('New','New'),('Offer_Received','Offer Received'),('Offer_Accepted','Offer Accepted'),('Sold','Sold'),("Cancelled","Cancelled")], + default="New", + copy=False + ) + active = fields.Boolean("active",required=True,default=True,active=True) + + property_type_id = fields.Many2one("estate.property.type", string="Property Type") + property_salesman_id = fields.Many2one("res.users", string="Salesman", default=lambda self: self.env.user) + property_buyer_id = fields.Many2one("res.partner", string="Buyer") + + property_tags_id = fields.Many2many("estate.property.tag", string="Tags") + + property_offers_id = fields.One2many("estate.property.offer","property_id", string="Offers") + + total_area = fields.Float(compute="_compute_total_area") + best_offer = fields.Float(compute="_compute_best_offer") + + @api.depends("living_area","garden_area") + def _compute_total_area(self): + for prop in self: + prop.total_area = prop.living_area+prop.garden_area + + + @api.depends("property_offers_id.price") + def _compute_best_offer(self): + for prop in self: + prop.best_offer = max(prop.property_offers_id.mapped("price")) if prop.property_offers_id else 0.0 + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden == True: + self.garden_area = 100 + self.Orientation = "North" + else: + self.garden_area = 0 + self.Orientation = False + + def action_cancel_property(self): + for record in self: + record.Estate_state = "Cancelled" + + def action_sold_property(self): + for record in self: + record.Estate_state = "Sold" + + note = fields.Text("Special mentions about the house.") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..b89cb529a4c --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,30 @@ +from odoo import fields,models,api +from dateutil.relativedelta import relativedelta + + +class estate_property_offer(models.Model): + _name = "estate.property.offer" + _description = "Estate property offer file" + + price = fields.Integer('Price',required=True, default=100000) + validity = fields.Integer("validity days", default=7) + date_dateline = fields.Date("Date deadline",compute="_compute_date_deadline", inverse="_inverser_date_deadline") + status = fields.Selection( + string="Offer Status", + selection=[('Accepted','Acccepted'), + ('In Waiting','In Waiting'), + ('Refused','Refused')], + default="In Waiting", + copy=False + ) + partner_id = fields.Many2one("res.partner", string="Partner",required=True) + property_id = fields.Many2one("estate.property", string="Property",required=True) + + @api.depends("validity") + def _compute_date_deadline(self): + for record in self: + record.date_dateline=fields.Date.context_today(self)+relativedelta(days=record.validity) + + def _inverser_date_deadline(self): + for record in self: + record.validity = (record.date_dateline - fields.Date.context_today(self)).days \ 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..54c337a2fdc --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,8 @@ +from odoo import fields,models + + +class estate_property_tag(models.Model): + _name = "estate.property.tag" + _description = "Estate property tag file" + + name = fields.Char('Name',required=True, translate=True, default='Unknown') \ 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..4799eea3d3c --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import fields,models + + +class estate_property_type(models.Model): + _name = "estate.property.type" + _description = "Estate property type file" + + name = fields.Char('Name',required=True, translate=True, default='Unknown') \ No newline at end of file diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..0db13e578ec --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +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,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_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..816cd96df4d --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + \ 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..daf86614e8c --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,39 @@ + + + + estate.property.offer.form + estate.property.offer + +
+ + +

+ +

+ + + + + +
+
+
+
+
+ + estate.property.offer.list + estate.property.offer + + + + + + + + + + Estate Properties Offers + estate.property.offer + list,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..a74b8e94078 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,23 @@ + + + + estate.property.tag.form + estate.property.tag + +
+ + +

+ +

+
+
+
+
+
+ + Estate Properties 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..426c7d6351d --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,23 @@ + + + + estate.property.type.form + estate.property.type + +
+ + +

+ +

+
+
+
+
+
+ + Estate Properties 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 new file mode 100644 index 00000000000..ee1d4c94aa4 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,98 @@ + + + + estate.property.list + estate.property + + + + + + + + + + + + + + estate.property.form + estate.property + +
+
+
+ + + +

+ +

+ + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + estate.property.search + estate.property + + + + + + + + + + + + + + + + + + Estate Properties + estate.property + list,form + +
\ No newline at end of file