Files
gzth/yuthon_property/models/property_evaluation_plan.py
T
2026-09-24 19:38:13 +08:00

167 lines
9.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
class PropertyEvaluationPlan(models.Model):
_name = 'property.evaluation.plan'
_description = '物业评估方案'
name = fields.Char(string='物业名称')
evaluation_area = fields.Float(string='评估面积(m²)')
property_id = fields.Many2one('yuthon.property', string='物业')
# 业务状态:取关联物业的业务状态(只读展示)
business_state = fields.Selection(related='property_id.business_state', string='业务状态')
company_id = fields.Many2one('yuthon.property.company', string='评估公司', compute='_compute_search', store=True)
admin_id = fields.Many2one('res.users', string="管理员", compute='_compute_search', store=True)
assessment_category = fields.Selection([('rent_money', '租金'), ('value', '价值')], string="评估类别", default='rent_money')
# 以下字段均从关联物业带出,属计算字段,不落库(口径见 _compute_from_property)
owner_id = fields.Many2one('yuthon.owner.message', string="权属人", compute='_compute_from_property')
registered_id = fields.Many2one('yuthon.purpose.evidence', string='证载用途', compute='_compute_from_property')
registered_id2 = fields.Many2one('yuthon.resource.type', string='设定用途', compute='_compute_from_property')
rent_id = fields.Many2one('rent.free.setting', string="办法")
lease_period = fields.Integer(string='租赁期限(<=)', compute='_compute_from_property')
first_years_begin = fields.Integer(string='第几年开始', compute='_compute_from_property')
increments_few_years = fields.Integer(string='每几年递增', compute='_compute_from_property')
lease_form = fields.Selection([('sublease', '分租'), ('whole', '整租')], string="租赁形式", compute='compute_lease_form')
annual_increase_percentage = fields.Float(string='递增百分比', igits=(6, 2), compute='_compute_from_property')
annual_increase_amount = fields.Float(string='递增金额', igits=(6, 2), compute='_compute_from_property')
rent_unit = fields.Float(string='递增单价', igits=(6, 2), compute='_compute_from_property')
remake = fields.Text(string='备注')
property_state = fields.Selection([('to', '待评估'), ('ing', '评估中'), ('done', '已评估')],
string="状态", default='to')
@api.depends('property_id')
def _compute_search(self):
for record in self:
if record.property_id:
record.company_id = record.property_id.company_id.id
record.admin_id = record.property_id.admin_id.id
@api.depends('property_id',
'property_id.asset_type_id',
'property_id.reference_ids.start_date',
'property_id.reference_ids.end_date',
'property_id.reference_ids.lease_period',
'property_id.reference_ids.rent_period',
'property_id.reference_ids.first_years_begin',
'property_id.reference_ids.increments_few_years',
'property_id.reference_ids.annual_increase_amount',
'property_id.reference_ids.rent_unit',
'property_id.reference_ids.annual_increase_percentage',
'property_id.title_information_ids.start_time',
'property_id.title_information_ids.end_date',
'property_id.title_information_ids.owner_id',
'property_id.title_information_ids.registered_id')
def _compute_from_property(self):
"""从关联物业带出:
- 租赁期限 / 第几年开始 / 每几年递增 / 递增金额 / 递增单价 / 递增百分比 ← 物业「出租参考条件」中日期范围覆盖当天的那行
- 权属人 / 证载用途 ← 物业「产权信息明细」中日期范围覆盖当天的那行
- 设定用途 ← 物业的「出租类型」(asset_type_id)
"""
for plan in self:
prop = plan.property_id
ref_line = prop._get_valid_reference_line() if prop else prop
title_line = prop._get_valid_title_line() if prop else prop
plan.lease_period = ref_line.lease_period if ref_line else 0
plan.first_years_begin = ref_line.first_years_begin if ref_line else 0
plan.increments_few_years = ref_line.increments_few_years if ref_line else 0
plan.annual_increase_amount = ref_line.annual_increase_amount if ref_line else 0.0
plan.rent_unit = ref_line.rent_unit if ref_line else 0.0
plan.annual_increase_percentage = ref_line.annual_increase_percentage if ref_line else 0.0
plan.owner_id = title_line.owner_id.id if title_line and title_line.owner_id else False
plan.registered_id = title_line.registered_id.id if title_line and title_line.registered_id else False
plan.registered_id2 = prop.asset_type_id.id if prop and prop.asset_type_id else False
@api.depends('property_id')
def compute_lease_form(self):
# 一个方案只对应一个物业 → 恒为「整租」(原「多物业=分租」的判断随 m2o 改造取消)
for record in self:
record.lease_form = 'whole' if record.property_id else False
def put_assessment_approval(self):
property_evaluation_ids = self.env["property.evaluation.plan"].browse(
self._context.get('active_ids', self._context.get('active_id')))
form_id = self.env.ref('yuthon_property_approval.property_evaluate_application_form').id
property_list = []
for i in property_evaluation_ids:
# 仅「待评估」可提交评估申请;评估中 / 已评估不再提供该入口
if i.property_state != 'to':
raise UserError('仅「待评估」的方案可以提交评估申请')
property_list.append([0, 0, {
'property_evaluation_id': i.id,
}])
# 此处只负责跳转,状态改为「评估中」由评估申请保存成功时触发
# (见 property.evaluate.application.create)
return {
'name': '提交物业评估',
'view_mode': 'form',
'res_model': 'property.evaluate.application',
'type': 'ir.actions.act_window',
'views': [(form_id, 'form')],
"context": {
'default_property_ids': property_list,
}
}
def action_listing_rental(self):
"""挂牌招租:把所选评估方案关联的物业带进「挂牌申报表」明细行"""
property_evaluation_ids = self.env["property.evaluation.plan"].browse(
self._context.get('active_ids', self._context.get('active_id')))
properties = property_evaluation_ids.mapped('property_id')
if not properties:
raise UserError('所选评估方案未关联物业,无法挂牌招租')
# 已进入签约流程(待签约/签约中/已签约)的物业不放进挂牌申报表
form_model = self.env['property.rental.form']
properties = form_model._get_listable_properties(properties)
if not properties:
raise UserError('所选物业均已进入签约流程(待签约/签约中/已签约),不能在挂牌申报表中提交')
form_model._check_listing_available(properties)
form_id = self.env.ref('yuthon_property_approval.view_property_rental_form_form').id
line_list = []
for prop in properties:
line_list.append([0, 0, {
'property_id': prop.id,
}])
return {
'name': '挂牌招租',
'type': 'ir.actions.act_window',
'res_model': 'property.rental.form',
'view_mode': 'form',
'views': [(form_id, 'form')],
'target': 'current',
'context': {
'default_property_rental_form_line_ids': line_list,
},
}
def button_source(self):
"""详情:跳转到对应物业的表单"""
self.ensure_one()
prop = self.property_id
if not prop:
raise UserError('该评估方案未关联物业,无法查看详情')
return {
"name": "物业",
"type": "ir.actions.act_window",
"res_model": "yuthon.property",
"view_mode": "form",
"views": [[self.env.ref('yuthon_property.yuthon_property_form').id, 'form']],
"target": "current",
"res_id": prop.id,
}
DERIVED_FIELDS = ['owner_id', 'registered_id', 'registered_id2', 'lease_period',
'first_years_begin', 'increments_few_years', 'annual_increase_amount',
'rent_unit', 'annual_increase_percentage']
def update_message(self):
"""这些字段已改为从关联物业实时计算、不落库,这里只需清缓存触发重算"""
property_evaluation_ids = self.env["property.evaluation.plan"].browse(
self._context.get('active_ids', self._context.get('active_id')))
property_evaluation_ids.invalidate_recordset(self.DERIVED_FIELDS)