Merge pull request !12869 from 李鹏宇/dev_wang
This commit is contained in:
李鹏宇
2026-09-18 11:06:35 +00:00
committed by Gitee
8 changed files with 318 additions and 143 deletions
@@ -66,3 +66,5 @@ from . import property_fee_form
from . import receivable_modify_line
from . import yuthon_property_task
from . import property_tenant_checkout
from . import property_tenant_checkout_inspection
from . import property_tenant_checkout_fee
@@ -1,12 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _
from odoo import models, fields, api
from odoo.exceptions import UserError
class PropertyTenantCheckout(models.Model):
"""租户退租表:物业客户服务中心与财务部联合验收结算的审批单(纯自由录入,不关联合同/承租方)"""
"""租户退租表:物业客户服务中心检查、租户签字、财务结算的多节点审批单。
各节点可见内容由工作流 state 字段驱动(form 视图按 state 显隐分组),
节点与按钮在工作流里配置,本模型只管字段与数据。"""
_name = 'property.tenant.checkout'
_description = '租户退租表'
_inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin']
@@ -27,44 +29,63 @@ class PropertyTenantCheckout(models.Model):
active = fields.Boolean('Active', default=True, tracking=True) # 归档标记
work_end = fields.Boolean(string="结束") # 流程是否结束
document_ids = fields.Many2many('ir.attachment', string="附件") # 附件
document_ids = fields.Many2many('ir.attachment', 'property_tenant_checkout_document_rel',
'checkout_id', 'attachment_id', string="附件") # 附件
# ===== 表头信息(纯自由录入)=====
tenant_unit = fields.Char(string='租户单元') # 如:4F东边01单元
company_name = fields.Char(string='公司名称') # 承租方公司名称
# ===== 关联租赁合同 =====
contract_id = fields.Many2one('property.lease.contract', string='关联租赁合同') # 从合同列表「退租」按钮发起时自动带入
# ===== 合同信息(关联后自动带出,只读参考)=====
tenant_unit = fields.Char(string='租户单元') # 如:4F东边01单元(关联合同后自动带出,可改)
lessee_id = fields.Many2one(related='contract_id.lessee_id', string='承租方', readonly=True) # 承租方(关联合同自动带出)
contract_code = fields.Char(related='contract_id.contract_code', string='合同编号', readonly=True) # 合同编号
lessor_id = fields.Many2one(related='contract_id.lessor_id', string='出租方公司', readonly=True) # 出租方
contract_term_start = fields.Date(related='contract_id.term_start_time', string='合同开始', readonly=True) # 合同期限起
contract_term_end = fields.Date(related='contract_id.term_end_time', string='合同结束', readonly=True) # 合同期限止
deposit_amount = fields.Float(related='contract_id.deposit', string='合同保证金', readonly=True) # 合同保证金
rent_address = fields.Char(string='租赁地址') # 租赁地址(关联合同后自动带出,可改)
# ===== 节点一:发起申请 =====
checkout_deadline = fields.Date(string='退租截止日期') # 退租截止日期
handler = fields.Char(string='经办人') # 经办人
contract_handle_type = fields.Selection([
('checkout', '退租'), ('renew', '续租'), ('transfer', '转租'), ('other', '其他')
], string='合同办理方式', default='checkout') # 合同办理方式
checkout_reason = fields.Text(string='退租原因') # 退租原因
other_note = fields.Text(string='其它(补充说明)') # 其它补充说明
# ===== 客户服务中心 =====
contract_handling = fields.Char(string='合同办理') # 合同办理说明
contract_expiry = fields.Date(string='合同到期') # 合同到期日
other_note = fields.Text(string='其它说明') # 其它说明(如保证金退回说明)
air_conditioner = fields.Char(string='空调机') # 空调机验收备注
light_tube = fields.Char(string='光管') # 光管验收备注
interior_decor = fields.Char(string='室内装修') # 室内装修验收备注
other_equipment = fields.Char(string='其它设备') # 其它设备验收备注
retrieve_keys = fields.Char(string='收回钥匙') # 收回钥匙验收备注
electric_meter = fields.Char(string='电表') # 电表验收备注
engineering_group = fields.Char(string='工程组') # 工程组
center_person_in_charge = fields.Char(string='负责人') # 客户服务中心负责人
inspection_date = fields.Date(string='验收日期') # 客户服务中心验收日期
# ===== 节点二:工程组检查与确认 =====
inspection_ids = fields.One2many('property.tenant.checkout.inspection', 'checkout_id', string='物业检查项') # 物业检查项明细
site_photo = fields.Many2many('ir.attachment', 'property_tenant_checkout_site_photo_rel',
'checkout_id', 'attachment_id', string='现场照片') # 现场照片
engineering_sign = fields.Binary(string='工程组检查确认签字') # 工程组检查确认签字(PNG)
handler = fields.Char(string='经办人') # 经办人(工程组)
# ===== 租户签字 =====
tenant_sign_date = fields.Date(string='租户签字日期') # 租户签字确认日期
tenant_signature = fields.Binary(string='租户电子签名') # 租户电子签名(PNG 图片,存手绘/打字/上传的签名)
# ===== 节点三:租户签字确认 =====
result_summary = fields.Text(string='结果摘要') # 退租结果摘要
tenant_signature = fields.Binary(string='租户电子签名') # 租户电子签名(PNG:手绘/打字/上传)
signer_name = fields.Char(string='签字人姓名') # 签字人姓名
tenant_sign_date = fields.Date(string='签字确认日期') # 签字确认日期
# ===== 财务部 =====
rent_fee = fields.Char(string='房租') # 房租
management_fee = fields.Char(string='管理费') # 管理费
phone_fee = fields.Char(string='电话费') # 电话费
utility_fee = fields.Char(string='水、电费') # 水、电费
other_fee = fields.Char(string='其它费用') # 其它费用
settlement = fields.Char(string='结算') # 结算
# ===== 节点四:费用结算与复核 =====
fee_ids = fields.One2many('property.tenant.checkout.fee', 'checkout_id', string='应收费用明细') # 应收费用明细
total_fee = fields.Float(string='应收合计', compute='_compute_total_fee', store=True) # 应收费用合计(自动求和)
deposit_treatment = fields.Selection([
('full', '退还全额'), ('part', '部分退还'), ('none', '不退还')
], string='保证金处理方式') # 保证金处理方式
settlement_sign = fields.Binary(string='结算复核签字') # 结算复核签字(PNG)
# ===== 节点五:财务处理 =====
finance_handler = fields.Char(string='财务部经办人') # 财务部经办人
finance_reviewer = fields.Char(string='复核人') # 复核人
finance_person_in_charge = fields.Char(string='财务部负责人') # 财务部负责人
finance_date = fields.Date(string='财务日期') # 财务部日期
@api.depends('fee_ids', 'fee_ids.amount')
def _compute_total_fee(self):
"""应收合计 = 所有费用明细金额之和"""
for rec in self:
rec.total_fee = sum(line.amount for line in rec.fee_ids)
@api.onchange('tenant_signature')
def _onchange_tenant_signature(self):
"""签名后自动填写签字日期;清除签名则清空日期(仅记录、不强制)"""
@@ -73,9 +94,37 @@ class PropertyTenantCheckout(models.Model):
else:
self.tenant_sign_date = False # 无签名则清空日期
@api.onchange('contract_id')
def _onchange_contract_id(self):
"""关联合同后自动带出公司名称/物业信息/租赁地址(可再手工修改);其余信息以 related 只读展示"""
if self.contract_id:
self.tenant_unit = self.contract_id.property_name # 租户单元=合同物业信息
# 租赁地址=合同物业明细首行对应的物业地址名称(无物业明细则为空)
self.rent_address = self.contract_id.lease_ids[:1].address_id.name
def action_print_tenant_checkout(self):
"""打印租户退租表"""
self.ensure_one()
# 调用报表动作生成 PDF
report = self.env.ref('yuthon_property_approval.action_property_tenant_checkout_report')
return report.report_action(self)
class PropertyLeaseContract(models.Model):
"""在租赁合同上增加「退租」入口:从合同列表直接发起租户退租表"""
_inherit = 'property.lease.contract'
def action_tenant_checkout(self):
"""合同列表「退租」按钮:打开租户退租表并自动关联当前合同"""
self.ensure_one()
return {
'name': '租户退租表',
'type': 'ir.actions.act_window',
'res_model': 'property.tenant.checkout',
'view_mode': 'form',
'target': 'current',
'context': {
'default_contract_id': self.id, # 关联当前合同
'default_tenant_unit': self.property_name, # 带出租户单元(物业信息)
'default_rent_address': self.lease_ids[:1].address_id.name, # 带出租赁地址(物业地址名称)
},
}
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields
class PropertyTenantCheckoutFee(models.Model):
"""租户退租表-应收费用明细(费用结算阶段的可增删明细行)"""
_name = 'property.tenant.checkout.fee'
_description = '租户退租表-应收费用明细'
_order = 'sequence, id'
checkout_id = fields.Many2one('property.tenant.checkout', string='退租表', ondelete='cascade') # 关联退租表
sequence = fields.Integer(string='序号', default=10) # 排序
item = fields.Char(string='费用项') # 费用项名称(租金/管理费/电费/电话费/水费/其它)
amount = fields.Float(string='金额') # 金额
period = fields.Char(string='所属周期') # 费用所属周期
remark = fields.Text(string='说明') # 说明
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields
class PropertyTenantCheckoutInspection(models.Model):
"""租户退租表-物业检查项(工程组检查阶段的可增删明细行)"""
_name = 'property.tenant.checkout.inspection'
_description = '租户退租表-物业检查项'
_order = 'sequence, id'
checkout_id = fields.Many2one('property.tenant.checkout', string='退租表', ondelete='cascade') # 关联退租表
sequence = fields.Integer(string='序号', default=10) # 排序
item = fields.Char(string='检查项') # 检查项名称
status = fields.Selection([('normal', '正常'), ('abnormal', '异常')], string='状态', default='normal') # 正常/异常
note = fields.Text(string='批注') # 批注说明
repair_fee = fields.Float(string='维修费') # 维修费金额
@@ -44,57 +44,70 @@
<tr>
<td class="header-cell"><strong>租户单元</strong></td>
<td class="text-left"><span t-esc="doc.tenant_unit or ''"/></td>
<td class="header-cell"><strong>公司名称</strong></td>
<td class="text-left"><span t-esc="doc.company_name or ''"/></td>
<td class="header-cell"><strong>承租方</strong></td>
<td class="text-left"><span t-esc="doc.lessee_id.name or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>合同编号</strong></td>
<td class="text-left"><span t-esc="doc.contract_code or ''"/></td>
<td class="header-cell"><strong>出租方</strong></td>
<td class="text-left"><span t-esc="doc.lessor_id.display_name or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>合同期限</strong></td>
<td class="text-left">
<span t-esc="doc.contract_term_start and doc.contract_term_start.strftime('%Y-%m-%d') or ''"/>
~<span t-esc="doc.contract_term_end and doc.contract_term_end.strftime('%Y-%m-%d') or ''"/>
</td>
<td class="header-cell"><strong>合同保证金</strong></td>
<td class="text-left"><span t-esc="doc.deposit_amount or 0"/></td>
</tr>
<tr>
<td class="header-cell"><strong>租赁地址</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.rent_address or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>退租截止日期</strong></td>
<td class="text-left"><span t-esc="doc.checkout_deadline and doc.checkout_deadline.strftime('%Y-%m-%d') or ''"/></td>
<td class="header-cell"><strong>经办人</strong></td>
<td class="text-left"><span t-esc="doc.handler or ''"/></td>
</tr>
<!-- 客户服务中心 -->
<tr>
<td colspan="4" class="section-header"><strong>客户服务中心</strong></td>
<td class="header-cell"><strong>合同办理方式</strong></td>
<td class="text-left"><span t-esc="doc.contract_handle_type or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>合同办理</strong></td>
<td class="text-left"><span t-esc="doc.contract_handling or ''"/></td>
<td class="header-cell"><strong>合同到期</strong></td>
<td class="text-left"><span t-esc="doc.contract_expiry and doc.contract_expiry.strftime('%Y-%m-%d') or ''"/></td>
<td class="header-cell"><strong>退租原因</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.checkout_reason or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>其它说明</strong></td>
<td class="header-cell"><strong>其它(补充说明)</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.other_note or ''"/></td>
</tr>
<!-- 工程组检查与确认 -->
<tr>
<td class="header-cell"><strong>空调机</strong></td>
<td class="text-left"><span t-esc="doc.air_conditioner or ''"/></td>
<td class="header-cell"><strong>光管</strong></td>
<td class="text-left"><span t-esc="doc.light_tube or ''"/></td>
<td colspan="4" class="section-header"><strong>工程组检查与确认</strong></td>
</tr>
<t t-if="doc.inspection_ids">
<tr>
<td class="header-cell"><strong>检查项</strong></td>
<td class="header-cell"><strong>状态</strong></td>
<td class="header-cell"><strong>批注</strong></td>
<td class="header-cell"><strong>维修费</strong></td>
</tr>
<t t-foreach="doc.inspection_ids" t-as="line">
<tr>
<td class="text-left"><span t-esc="line.item or ''"/></td>
<td class="text-left"><span t-esc="line.status or ''"/></td>
<td class="text-left"><span t-esc="line.note or ''"/></td>
<td class="text-left"><span t-esc="line.repair_fee or 0"/></td>
</tr>
</t>
</t>
<tr>
<td class="header-cell"><strong>室内装修</strong></td>
<td class="text-left"><span t-esc="doc.interior_decor or ''"/></td>
<td class="header-cell"><strong>其它设备</strong></td>
<td class="text-left"><span t-esc="doc.other_equipment or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>收回钥匙</strong></td>
<td class="text-left"><span t-esc="doc.retrieve_keys or ''"/></td>
<td class="header-cell"><strong>电表</strong></td>
<td class="text-left"><span t-esc="doc.electric_meter or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>工程组</strong></td>
<td class="text-left"><span t-esc="doc.engineering_group or ''"/></td>
<td class="header-cell"><strong>负责人</strong></td>
<td class="text-left"><span t-esc="doc.center_person_in_charge or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>验收日期</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.inspection_date and doc.inspection_date.strftime('%Y-%m-%d') or ''"/></td>
<td class="header-cell"><strong>经办人</strong></td>
<td class="text-left"><span t-esc="doc.handler or ''"/></td>
<td class="header-cell"><strong>工程组确认签字</strong></td>
<td class="text-left">
<img t-if="doc.engineering_sign" t-att-src="'data:image/png;base64,' + doc.engineering_sign" style="max-height:60px;"/>
</td>
</tr>
<!-- 租户签字确认 -->
@@ -102,49 +115,68 @@
<td colspan="4" class="section-header"><strong>租户签字确认</strong></td>
</tr>
<tr>
<td class="header-cell"><strong>租户签字日期</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.tenant_sign_date and doc.tenant_sign_date.strftime('%Y-%m-%d') or ''"/></td>
<td class="header-cell"><strong>结果摘要</strong></td>
<td colspan="3" class="text-left"><span t-esc="doc.result_summary or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>租户电子签名</strong></td>
<td colspan="3" class="text-left">
<!-- 有签名时显示签名图,二进制字段为 base64 字符串,需拼 data URI -->
<td class="text-left">
<img t-if="doc.tenant_signature" t-att-src="'data:image/png;base64,' + doc.tenant_signature" style="max-height:80px;"/>
</td>
<td class="header-cell"><strong>签字人/日期</strong></td>
<td class="text-left">
<span t-esc="doc.signer_name or ''"/>
<span t-esc="doc.tenant_sign_date and doc.tenant_sign_date.strftime('%Y-%m-%d') or ''"/>
</td>
</tr>
<!-- 财务部 -->
<!-- 费用结算与复核 -->
<tr>
<td colspan="4" class="section-header"><strong>财务部</strong></td>
<td colspan="4" class="section-header"><strong>费用结算与复核</strong></td>
</tr>
<t t-if="doc.fee_ids">
<tr>
<td class="header-cell"><strong>费用项</strong></td>
<td class="header-cell"><strong>金额</strong></td>
<td class="header-cell"><strong>所属周期</strong></td>
<td class="header-cell"><strong>说明</strong></td>
</tr>
<t t-foreach="doc.fee_ids" t-as="fee">
<tr>
<td class="text-left"><span t-esc="fee.item or ''"/></td>
<td class="text-left"><span t-esc="fee.amount or 0"/></td>
<td class="text-left"><span t-esc="fee.period or ''"/></td>
<td class="text-left"><span t-esc="fee.remark or ''"/></td>
</tr>
</t>
</t>
<tr>
<td class="header-cell"><strong>应收合计</strong></td>
<td class="text-left"><span t-esc="doc.total_fee or 0"/></td>
<td class="header-cell"><strong>保证金处理</strong></td>
<td class="text-left"><span t-esc="doc.deposit_treatment or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>房租</strong></td>
<td class="text-left"><span t-esc="doc.rent_fee or ''"/></td>
<td class="header-cell"><strong>管理费</strong></td>
<td class="text-left"><span t-esc="doc.management_fee or ''"/></td>
<td class="header-cell"><strong>结算复核签字</strong></td>
<td colspan="3" class="text-left">
<img t-if="doc.settlement_sign" t-att-src="'data:image/png;base64,' + doc.settlement_sign" style="max-height:60px;"/>
</td>
</tr>
<!-- 财务处理 -->
<tr>
<td colspan="4" class="section-header"><strong>财务处理</strong></td>
</tr>
<tr>
<td class="header-cell"><strong>电话费</strong></td>
<td class="text-left"><span t-esc="doc.phone_fee or ''"/></td>
<td class="header-cell"><strong>水、电费</strong></td>
<td class="text-left"><span t-esc="doc.utility_fee or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>其它费用</strong></td>
<td class="text-left"><span t-esc="doc.other_fee or ''"/></td>
<td class="header-cell"><strong>结算</strong></td>
<td class="text-left"><span t-esc="doc.settlement or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>经办人</strong></td>
<td class="header-cell"><strong>财务部经办人</strong></td>
<td class="text-left"><span t-esc="doc.finance_handler or ''"/></td>
<td class="header-cell"><strong>复核人</strong></td>
<td class="text-left"><span t-esc="doc.finance_reviewer or ''"/></td>
</tr>
<tr>
<td class="header-cell"><strong>负责人</strong></td>
<td class="header-cell"><strong>财务部负责人</strong></td>
<td class="text-left"><span t-esc="doc.finance_person_in_charge or ''"/></td>
<td class="header-cell"><strong>日期</strong></td>
<td class="header-cell"><strong>财务日期</strong></td>
<td class="text-left"><span t-esc="doc.finance_date and doc.finance_date.strftime('%Y-%m-%d') or ''"/></td>
</tr>
@@ -146,4 +146,6 @@ access_property_payment_type,property_payment_type,model_property_payment_type,b
access_property_contract_rental_wizard,property_contract_rental_wizard,model_property_contract_rental_wizard,base.group_user,1,1,1,1
access_yuthon_property_task,yuthon_property_task,model_yuthon_property_task,base.group_user,1,1,1,1
access_yuthon_property_task_confirm,yuthon_property_task_confirm,model_yuthon_property_task_confirm,base.group_user,1,1,1,1
access_property_tenant_checkout,property_tenant_checkout,model_property_tenant_checkout,base.group_user,1,1,1,1
access_property_tenant_checkout,property_tenant_checkout,model_property_tenant_checkout,base.group_user,1,1,1,1
access_property_tenant_checkout_inspection,property_tenant_checkout_inspection,model_property_tenant_checkout_inspection,base.group_user,1,1,1,1
access_property_tenant_checkout_fee,property_tenant_checkout_fee,model_property_tenant_checkout_fee,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
146
147
148
149
150
151
@@ -482,6 +482,8 @@
<button name="put_evaluation_plan" type="object" class="btn-primary" string="评估推送"
invisible="contact_state == 'ing'"/>
<button name="action_open_contract" class="btn-primary" type="object" string="账单详情"/>
<!-- 退租:打开租户退租表并自动关联当前合同(仅系统管理员可见) -->
<button name="action_tenant_checkout" class="btn-primary" type="object" string="退租" groups="base.group_system"/>
<!-- <button name="button_lease_extension" type="object" class="btn-primary" string="续租"/>-->
<!-- <button name="button_lease_return" type="object" class="btn-primary" string="退租"/>-->
</tree>
@@ -8,14 +8,15 @@
<tree string="租户退租表">
<field name="name"/>
<field name="code"/>
<field name="contract_id"/>
<field name="tenant_unit"/>
<field name="company_name"/>
<field name="state"/>
<field name="checkout_deadline"/>
</tree>
</field>
</record>
<!-- 表单视图 -->
<!-- 表单视图:按工作流 state 字段控制各节点可见区块 -->
<record id="view_property_tenant_checkout_form" model="ir.ui.view">
<field name="name">property.tenant.checkout.form</field>
<field name="model">property.tenant.checkout</field>
@@ -49,78 +50,129 @@
<field name="state" invisible="1"/>
<field name="work_end" invisible="1"/>
<field name="name" required="1"/>
<field name="company_id" invisible="1"/>
<field name="department_id" invisible="1"/>
</group>
</group>
<!-- 表头信息 -->
<group string="表头信息" col="3">
<!-- 已关联合同 · 关键信息自动带出(各节点均可见,只读参考) -->
<group string="已关联合同 · 关键信息自动带出" col="3">
<group>
<field name="lessee_id"/>
<field name="tenant_unit"/>
<field name="company_name"/>
<field name="rent_address"/>
</group>
<group>
<field name="checkout_deadline"/>
<field name="handler"/>
<field name="lessor_id"/>
<field name="contract_code"/>
<field name="contract_term_start"/>
</group>
<group>
<field name="contract_term_end"/>
<field name="deposit_amount"/>
</group>
<group/>
</group>
<!-- 客户服务中心 -->
<group string="客户服务中心" col="3">
<!-- ===== 节点一:发起申请(state 为空或走到「发起申请」节点时显示)===== -->
<group string="发起退租申请" invisible="state and state != '发起申请'" col="2">
<group>
<field name="contract_id" options="{'no_create': True}" required="1"/>
<field name="checkout_deadline" required="1"/>
</group>
<group>
<field name="contract_handle_type" required="1"/>
</group>
<group>
<field name="checkout_reason" widget="text"/>
</group>
<group>
<field name="contract_handling"/>
<field name="contract_expiry"/>
<field name="other_note" widget="text"/>
<field name="air_conditioner"/>
<field name="light_tube"/>
</group>
<group>
<field name="interior_decor"/>
<field name="other_equipment"/>
<field name="retrieve_keys"/>
<field name="electric_meter"/>
<field name="engineering_group"/>
</group>
<group>
<field name="center_person_in_charge"/>
<field name="inspection_date"/>
</group>
</group>
<!-- 租户签字 -->
<group string="租户签字确认" col="2">
<!-- ===== 节点二:工程组检查与确认 ===== -->
<group string="工程组检查与确认" invisible="state not in ['工程组检查']" col="1">
<group>
<field name="tenant_sign_date"/>
<field name="inspection_ids">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="item"/>
<field name="status"/>
<field name="note"/>
<field name="repair_fee"/>
</tree>
</field>
</group>
<group>
<!-- 电子签名控件:手绘/打字/上传三合一;full_name 自动带出公司名称作为打字签名默认值 -->
<field name="tenant_signature" widget="signature" options="{'full_name': 'company_name'}"/>
<group col="2">
<group>
<field name="site_photo" widget="many2many_binary"/>
<field name="handler"/>
</group>
<group>
<field name="engineering_sign" widget="signature" options="{'full_name': 'tenant_unit'}"/>
</group>
</group>
</group>
<!-- 财务部 -->
<group string="财务部" col="3">
<!-- ===== 节点三:租户签字确认 ===== -->
<group string="租户签字确认" invisible="state not in ['租户签字']" col="2">
<group>
<field name="rent_fee"/>
<field name="management_fee"/>
<field name="phone_fee"/>
<field name="utility_fee"/>
<field name="result_summary" widget="text"/>
<field name="tenant_signature" widget="signature" options="{'full_name': 'tenant_unit'}"/>
</group>
<group>
<field name="other_fee"/>
<field name="settlement"/>
<field name="finance_handler"/>
<field name="finance_reviewer"/>
</group>
<group>
<field name="finance_person_in_charge"/>
<field name="finance_date"/>
<field name="signer_name"/>
<field name="tenant_sign_date" readonly="1"/>
</group>
</group>
<!-- 附件 -->
<!-- ===== 节点四:费用结算与复核 ===== -->
<group string="费用结算与复核" invisible="state not in ['费用结算']" col="1">
<group>
<field name="fee_ids">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="item"/>
<field name="amount"/>
<field name="period"/>
<field name="remark"/>
</tree>
</field>
<field name="total_fee" readonly="1"/>
<field name="deposit_treatment"/>
</group>
<group col="2">
<group>
<field name="settlement_sign" widget="signature" options="{'full_name': 'tenant_unit'}"/>
</group>
</group>
</group>
<!-- ===== 节点五:财务处理 ===== -->
<group string="财务处理" invisible="state not in ['财务']" col="1">
<group>
<field name="fee_ids" readonly="1">
<tree>
<field name="item"/>
<field name="amount"/>
<field name="period"/>
<field name="remark"/>
</tree>
</field>
<field name="total_fee" readonly="1"/>
<field name="deposit_treatment" readonly="1"/>
</group>
<group col="2">
<group>
<field name="finance_handler"/>
<field name="finance_reviewer"/>
</group>
<group>
<field name="finance_person_in_charge"/>
<field name="finance_date"/>
</group>
</group>
</group>
<!-- 附件(随时可附) -->
<group>
<field name="document_ids" widget="preview_many2many"/>
</group>