mirror of
https://github.com/SARL-PACIFIC-ERP/odoo-sh-test.git
synced 2025-06-25 17:42:22 +00:00
chapt 9-10
This commit is contained in:
parent
196dde8fa8
commit
8efdb872c0
|
@ -1,10 +1,22 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from odoo import api, fields, models
|
from odoo import api, fields, models, exceptions
|
||||||
|
from odoo.tools import float_utils as floatTool
|
||||||
|
|
||||||
class EstateProperty(models.Model):
|
class EstateProperty(models.Model):
|
||||||
|
|
||||||
|
# ------------- Private attributes ------------------------- #
|
||||||
|
|
||||||
_name = "estate.property"
|
_name = "estate.property"
|
||||||
_description = "Properties for the Estate module"
|
_description = "Properties for the Estate module"
|
||||||
|
|
||||||
|
_sql_constraints = [
|
||||||
|
('check_expected_price', 'CHECK (expected_price > 0)', 'Expected rice should be superior to 0'),
|
||||||
|
('check_selling_price', 'CHECK (selling_price >= 0)', 'Selling price cannot be negative'),
|
||||||
|
('unique_name', 'UNIQUE (name)', 'A property with this name aready exists. Name should be unique.'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# ------------- Fields ------------------------- #
|
||||||
|
|
||||||
name = fields.Char(required=True)
|
name = fields.Char(required=True)
|
||||||
description = fields.Text()
|
description = fields.Text()
|
||||||
active = fields.Boolean(default=True)
|
active = fields.Boolean(default=True)
|
||||||
|
@ -28,6 +40,8 @@ class EstateProperty(models.Model):
|
||||||
total_area = fields.Integer(compute="_get_total_area", readonly=True)
|
total_area = fields.Integer(compute="_get_total_area", readonly=True)
|
||||||
best_price = fields.Float(compute="_compute_best_price")
|
best_price = fields.Float(compute="_compute_best_price")
|
||||||
|
|
||||||
|
# ------------- Compute methods ------------------------- #
|
||||||
|
|
||||||
@api.depends('living_area', 'garden_area')
|
@api.depends('living_area', 'garden_area')
|
||||||
def _get_total_area(self):
|
def _get_total_area(self):
|
||||||
for entry in self:
|
for entry in self:
|
||||||
|
@ -38,6 +52,8 @@ class EstateProperty(models.Model):
|
||||||
for record in self:
|
for record in self:
|
||||||
record.best_price = max(record.offer_ids.mapped('price')) if record.offer_ids else None
|
record.best_price = max(record.offer_ids.mapped('price')) if record.offer_ids else None
|
||||||
|
|
||||||
|
# ------------- OnChange ------------------------- #
|
||||||
|
|
||||||
@api.onchange('garden')
|
@api.onchange('garden')
|
||||||
def _onchange_garden(self):
|
def _onchange_garden(self):
|
||||||
if self.garden:
|
if self.garden:
|
||||||
|
@ -52,4 +68,41 @@ class EstateProperty(models.Model):
|
||||||
if self.date_availability < fields.Date.today():
|
if self.date_availability < fields.Date.today():
|
||||||
return {'warning': {
|
return {'warning': {
|
||||||
'title': ("Warning"),
|
'title': ("Warning"),
|
||||||
'message': ("The date is in the past.")}}
|
'message': ("The date is in the past.")}}
|
||||||
|
|
||||||
|
# ------------- Constrains ------------------------- #
|
||||||
|
|
||||||
|
@api.constrains('selling_price', 'expected_price')
|
||||||
|
def _check_selling_price(self):
|
||||||
|
for property in self:
|
||||||
|
if (
|
||||||
|
not floatTool.float_is_zero(property.selling_price, precision_rounding=0.01)
|
||||||
|
and floatTool.float_compare((property.expected_price * 0.9), property.selling_price, precision_rounding=0.01) > 0
|
||||||
|
):
|
||||||
|
raise exceptions.ValidationError("Selling price can't be less than 90% of the expected price")
|
||||||
|
|
||||||
|
# ------------- Actions ------------------------- #
|
||||||
|
|
||||||
|
def action_sold(self):
|
||||||
|
if self.exists():
|
||||||
|
if self.state == 'cancelled':
|
||||||
|
raise exceptions.UserError('A cancelled property cannot be sold')
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.state = 'sold'
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise exceptions.MissingError('Property not found')
|
||||||
|
return False
|
||||||
|
|
||||||
|
def action_cancel(self):
|
||||||
|
if self.exists():
|
||||||
|
if self.state == 'sold':
|
||||||
|
raise exceptions.UserError('A sold property cannot be cancelled')
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.state = 'cancelled'
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise exceptions.MissingError('Property not found')
|
||||||
|
return False
|
||||||
|
|
|
@ -1,17 +1,22 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from odoo import api, fields, models
|
from odoo import api, fields, models, exceptions
|
||||||
|
from odoo.tools import float_utils as floatTool
|
||||||
|
|
||||||
class EstatePropertyOffer(models.Model):
|
class EstatePropertyOffer(models.Model):
|
||||||
_name = "estate.property.offer"
|
_name = "estate.property.offer"
|
||||||
_description = "Offers made on properties"
|
_description = "Offers made on properties"
|
||||||
|
|
||||||
price = fields.Float()
|
price = fields.Float()
|
||||||
status = fields.Selection(copy=False, selection=[('accepted', 'Accepted'), ('refused', 'Refused')])
|
state = fields.Selection(copy=False, selection=[('accepted', 'Accepted'), ('refused', 'Refused')])
|
||||||
partner_id = fields.Many2one("res.partner", required=True)
|
partner_id = fields.Many2one("res.partner", required=True)
|
||||||
property_id = fields.Many2one("estate.property", required=True)
|
property_id = fields.Many2one("estate.property", required=True)
|
||||||
validity = fields.Integer(default=7, string='validity (days)')
|
validity = fields.Integer(default=7, string='validity (days)')
|
||||||
date_deadline = fields.Date(compute="_compute_date_deadline", inverse="_inverse_date_deadline")
|
date_deadline = fields.Date(compute="_compute_date_deadline", inverse="_inverse_date_deadline")
|
||||||
|
|
||||||
|
_sql_constraints = [
|
||||||
|
('check_price', 'CHECK (price > 0)', 'Expected price should be superior to 0'),
|
||||||
|
]
|
||||||
|
|
||||||
@api.depends('validity', 'create_date')
|
@api.depends('validity', 'create_date')
|
||||||
def _compute_date_deadline(self):
|
def _compute_date_deadline(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
|
@ -19,4 +24,35 @@ class EstatePropertyOffer(models.Model):
|
||||||
|
|
||||||
def _inverse_date_deadline(self):
|
def _inverse_date_deadline(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
record.validity = (record.date_deadline - (record.create_date.date() or fields.Date.today())).days
|
record.validity = (record.date_deadline - (record.create_date.date() or fields.Date.today())).days
|
||||||
|
|
||||||
|
def action_accept(self):
|
||||||
|
if self.exists():
|
||||||
|
if "accepted" in self.mapped("property_id.offer_ids.state"):
|
||||||
|
raise exceptions.UserError("An offer as already been accepted.")
|
||||||
|
self.write(
|
||||||
|
{
|
||||||
|
"state": "accepted",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return self.mapped("property_id").write(
|
||||||
|
{
|
||||||
|
"state": "offer_accepted",
|
||||||
|
"selling_price": self.price,
|
||||||
|
"buyer_id": self.partner_id.id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise exceptions.MissingError('Offer not found')
|
||||||
|
|
||||||
|
def action_reject(self):
|
||||||
|
if self.exists():
|
||||||
|
if self.state == 'accepted':
|
||||||
|
raise exceptions.UserError('Cannot accept an offer refused')
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.state = 'refused'
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
raise exceptions.MissingError('Offer not found')
|
||||||
|
return False
|
|
@ -9,7 +9,9 @@
|
||||||
<field name="partner_id" />
|
<field name="partner_id" />
|
||||||
<field name="validity" />
|
<field name="validity" />
|
||||||
<field name="date_deadline" />
|
<field name="date_deadline" />
|
||||||
<field name="status" />
|
<button name="action_accept" string="Accept" type="object" icon="fa-check"/>
|
||||||
|
<button name="action_reject" string="Reject" type="object" icon="fa-close"/>
|
||||||
|
<field name="state" />
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
@ -24,7 +26,7 @@
|
||||||
<field name="partner_id" />
|
<field name="partner_id" />
|
||||||
<field name="validity" />
|
<field name="validity" />
|
||||||
<field name="date_deadline" />
|
<field name="date_deadline" />
|
||||||
<field name="status" />
|
<field name="state" />
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
|
|
|
@ -28,6 +28,10 @@
|
||||||
<field name="model">estate.property</field>
|
<field name="model">estate.property</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
|
<header>
|
||||||
|
<button name="action_sold" type="object" string="Sold"/>
|
||||||
|
<button name="action_cancel" type="object" string="Cancel"/>
|
||||||
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
<h1>
|
<h1>
|
||||||
<field name="name" />
|
<field name="name" />
|
||||||
|
@ -35,6 +39,7 @@
|
||||||
<field name="tag_ids" widget="many2many_tags" />
|
<field name="tag_ids" widget="many2many_tags" />
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
|
<field name="state"/>
|
||||||
<field name="property_type_id" />
|
<field name="property_type_id" />
|
||||||
<field name="postcode" />
|
<field name="postcode" />
|
||||||
<field name="date_availability" />
|
<field name="date_availability" />
|
||||||
|
|
Loading…
Reference in a new issue