odoo-tutorials/estate/models/estate_property_offer.py
2024-07-31 15:15:15 -10:00

58 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
from odoo import api, fields, models, exceptions
from odoo.tools import float_utils as floatTool
class EstatePropertyOffer(models.Model):
_name = "estate.property.offer"
_description = "Offers made on properties"
price = fields.Float()
state = 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)
validity = fields.Integer(default=7, string='validity (days)')
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')
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
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