Files
gzth/estate/models/estate_property_offer.py
2025-09-17 23:26:53 +08:00

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);