167 lines
9.1 KiB
Python
167 lines
9.1 KiB
Python
# -*- 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)
|
||
|