|
| 1 | +from datetime import timedelta |
1 | 2 | from odoo import models, fields, api |
2 | | -from odoo.exceptions import ValidationError |
| 3 | +from odoo.exceptions import UserError |
3 | 4 |
|
4 | 5 |
|
5 | 6 | class EstatePropertyOffer(models.Model): |
6 | 7 | _name = "estate.property.offer" |
7 | 8 | _description = "Real Estate Property Offer" |
8 | 9 | _order = "price desc" |
9 | 10 |
|
10 | | - price = fields.Float(required=True) |
| 11 | + price = fields.Float(string="Price", required=True) |
11 | 12 | status = fields.Selection( |
12 | | - [ |
13 | | - ('accepted', 'Accepted'), |
14 | | - ('refused', 'Refused'), |
15 | | - ], |
| 13 | + [('accepted', 'Accepted'), ('refused', 'Refused')], |
| 14 | + string="Status", |
| 15 | + copy=False |
16 | 16 | ) |
17 | | - property_id = fields.Many2one("estate.property", string="Property", required=True) |
18 | 17 | partner_id = fields.Many2one("res.partner", string="Buyer", required=True) |
| 18 | + property_id = fields.Many2one("estate.property", string="Property", required=True) |
| 19 | + validity = fields.Integer(default=7, string="Validity (Days)") |
| 20 | + date_deadline = fields.Date(compute="_compute_date_deadline", inverse="_inverse_date_deadline", string="Deadline") |
| 21 | + |
| 22 | + _check_price = models.Constraint( |
| 23 | + 'CHECK(price > 0)', |
| 24 | + 'The offer price must be strictly positive' |
| 25 | + ) |
| 26 | + |
| 27 | + @api.depends("create_date", "validity") |
| 28 | + def _compute_date_deadline(self): |
| 29 | + for record in self: |
| 30 | + base_date = record.create_date.date() if record.create_date else fields.Date.today() |
| 31 | + record.date_deadline = base_date + timedelta(days=record.validity) |
| 32 | + |
| 33 | + def _inverse_date_deadline(self): |
| 34 | + for record in self: |
| 35 | + base_date = record.create_date.date() if record.create_date else fields.Date.today() |
| 36 | + if record.date_deadline: |
| 37 | + record.validity = (record.date_deadline - base_date).days |
19 | 38 |
|
20 | 39 | def action_accept_offer(self): |
21 | 40 | for record in self: |
| 41 | + if record.status == 'accepted': |
| 42 | + continue |
| 43 | + |
22 | 44 | record.status = 'accepted' |
| 45 | + record.property_id.write({ |
| 46 | + 'selling_price': record.price, |
| 47 | + 'buyer_id': record.partner_id.id, |
| 48 | + 'state': 'offer_accepted' |
| 49 | + }) |
| 50 | + |
| 51 | + record.property_id.offer_ids.filtered(lambda o: o.id != record.id).write({ |
| 52 | + 'status': 'refused' |
| 53 | + }) |
| 54 | + return True |
23 | 55 |
|
24 | 56 | def action_refuse_offer(self): |
25 | 57 | for record in self: |
26 | 58 | record.status = 'refused' |
| 59 | + return True |
27 | 60 |
|
28 | | - @api.constrains("price") |
29 | | - def _check_price_ratio(self): |
30 | | - for record in self: |
31 | | - if record.price <= 0.0: |
32 | | - raise ValidationError("Price must be greater than 0") |
| 61 | + @api.model |
| 62 | + def create(self, vals): |
| 63 | + if len(vals) > 0: |
| 64 | + property = self.env['estate.property'].browse(vals[0]['property_id']) |
| 65 | + for record in vals: |
| 66 | + if property.state == 'new': |
| 67 | + property.state = 'offer_received' |
| 68 | + if record['price'] < property.best_price: |
| 69 | + raise UserError("Offer must be higher or equal than %d" % property.best_price) |
| 70 | + return super().create(vals) |
| 71 | + |
| 72 | + @api.model |
| 73 | + def _cron_move_sold(self): |
| 74 | + expired_offers = self.search([ |
| 75 | + ('status', '=', False), |
| 76 | + ('date_deadline', '<', fields.Date.today()) |
| 77 | + ]) |
| 78 | + expired_offers.write({'status': 'refused'}) |
0 commit comments