77 lines
3.9 KiB
Python
77 lines
3.9 KiB
Python
from odoo import models,fields,api;# 导入Odoo模型、字段和API模块
|
|
from datetime import timedelta;# 导入时间模块
|
|
from odoo.exceptions import UserError;# 导入用户错误模块
|
|
from odoo.exceptions import ValidationError;# 导入验证错误模块
|
|
# 房屋报价模型
|
|
class EstatePropertyOffer(models.Model):
|
|
_name = 'estate.property.offer';
|
|
_description = '房屋报价'
|
|
_order = "price desc";# 默认按价格降序排列
|
|
|
|
price = fields.Float(string='报价', required=True);
|
|
status = fields.Selection([('Accepted', '已接受'),('Refused', '已拒绝')], string='状态',copy=False);
|
|
partner_id = fields.Many2one('res.partner', string='客户', required=True);
|
|
property_id = fields.Many2one('estate.property', string='房屋', required=True);
|
|
validity = fields.Integer(string='有效期', default=7);# 默认有效期为7天
|
|
date_deadline = fields.Date(string='截止日期', compute='_compute_date_deadline',inverse='_inverse_validity', store=True);# 计算字段,存储在数据库中
|
|
property_type_id = fields.Many2one(related='property_id.property_type_id', string='房屋类型', store=True);# 关联房屋类型模型
|
|
|
|
|
|
# 保价必须为严格正数
|
|
_sql_constraints = [
|
|
('check_price', 'CHECK(price > 0)', '报价必须为正数')
|
|
]
|
|
@api.depends('validity',"create_date")# 计算字段
|
|
def _compute_date_deadline(self):
|
|
for record in self:
|
|
if record.create_date:
|
|
# 计算截止日期
|
|
record.date_deadline = record.create_date + timedelta(days=record.validity);
|
|
else:
|
|
# 如果创建日期为空,则为当前日期
|
|
record.date_deadline = fields.Date.today()+ timedelta(days=record.validity);
|
|
# 反向计算有效期,inverse方法
|
|
def _inverse_validity(self):
|
|
for record in self:
|
|
if record.date_deadline:
|
|
if record.create_date:
|
|
validity = (record.date_deadline - record.create_date.date()).days;
|
|
# 如果有效期小于0,则抛出异常
|
|
if validity < 0:
|
|
raise UserError("有效期不能小于0天")
|
|
record.validity = validity;
|
|
else:
|
|
validity = (record.date_deadline - fields.Datetime.now().date()).days;
|
|
# 如果有效期小于0,则抛出异常
|
|
if validity < 0:
|
|
raise UserError("有效期不能小于0天")
|
|
record.validity = validity;
|
|
# 接受报价
|
|
def action_accept(self):
|
|
# 将房屋状态改为已接受报价
|
|
self.property_id.state = 'offer_accepted';
|
|
# 将房屋的销售价格设置为报价价格
|
|
self.property_id.selling_price = self.price;
|
|
# 将买家设置为报价的客户
|
|
self.property_id.buyer_id = self.partner_id.id;
|
|
# 将报价的状态设置为已接受
|
|
self.status = 'Accepted';
|
|
# 拒绝报价
|
|
def action_refuse(self):
|
|
# 将房屋状态改为已收到报价
|
|
self.property_id.state = 'offer_received';
|
|
# 将报价的状态设置为已拒绝
|
|
self.status = 'Refused';
|
|
|
|
# 创建报价时,将房产状态设置为‘收到报价’。如果用户尝试创建价格低于现有报价的报价,则引发错误。
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
for vals in vals_list:
|
|
# 检查房产状态是否为‘收到报价’
|
|
property_id = vals.get('property_id')
|
|
property_record = self.env['estate.property'].browse(property_id);
|
|
property_record.state = 'offer_received';
|
|
price = vals.get('price')
|
|
if price<property_record.best_price:
|
|
raise UserError("报价必须高于现有报价")
|
|
return super(EstatePropertyOffer, self).create(vals_list); |