Merge pull request !12877 from 李鹏宇/dev_wang
This commit is contained in:
李鹏宇
2026-09-20 12:12:29 +00:00
committed by Gitee
+129 -178
View File
@@ -6,30 +6,46 @@
视图统一使用应收账单原有列表视图 yuthon_property.view_property_accounts_receivable_tree
每个菜单只通过 domain 过滤 management_type_id(应收类型)的 name
父菜单:yuthon_work_brand.yuthon_accounts_receivable_menu(物业财务管理 - 应收账单)
说明:
1) 只保留 searchpanel(片区管理员 / 状态)这一种分组形式;
去掉 action context 里默认的 group_by 分组(红框里按公司折叠的那些分组行);
2) 列表按「应收开始」due_date 倒序(tree 视图本身 default_order 也是 due_date desc,这里显式再写一次);
3) 只保留 7 个独立类型菜单(租金/管理费/水费/电费/违约金/押金/广告灯箱费),
其余 9 个应收类型合并成 1 个「其它」菜单。
-->
<!--
应收类型子菜单专用的搜索视图
作用:完整沿用「应收账单」原搜索视图 view_property_accounts_receivable_search 的内容,
额外挂上左侧搜索面板(片区管理员 + 状态,均为多选)
额外挂上左侧搜索面板(片区管理员 + 状态,均为单选分类)
说明:这里做成独立的新搜索视图(而不是继承原视图),
目的是只让下面这 16 个「应收类型」子菜单出现搜索面板,
目的是只让下面这些「应收类型」子菜单出现搜索面板,
不影响「应收账单」主菜单原本的界面
-->
<record id="view_receivable_type_search" model="ir.ui.view">
<!-- 搜索视图外部标识 -->
<field name="name">property.accounts.receivable.search.receivable.type</field>
<!-- 所属模型:应收账单 -->
<field name="model">property.accounts.receivable</field>
<field name="arch" type="xml">
<search>
<!-- 综合搜索:名称/承租方/合同编码/公司 一起模糊匹配 -->
<field name="property_ids"
string="综合搜索"
filter_domain="['|', '|', '|', ('property_ids.name', 'ilike', self), ('lessee_id.name', 'ilike', self), ('contract_id.contract_code', 'ilike', self), ('company_id.name', 'ilike', self)]"/>
<!-- 可按物业搜索 -->
<field name="property_ids"/>
<!-- 可按承租方搜索 -->
<field name="lessee_id"/>
<!-- 可按合同搜索 -->
<field name="contract_id" string="合同"/>
<!-- 可按公司搜索 -->
<field name="company_id"/>
<!-- 可按原始金额搜索 -->
<field name="original_amount"/>
<!-- 可按状态搜索 -->
<field name="deposit_state"/>
<!-- 分组筛选器(默认不激活,仅作为「分组」菜单选项供用户手动选择) -->
<group expand="0" string="group_by">
<filter name="group_company_id" string="公司" context="{'group_by':'company_id'}"/>
<filter name="group_is_reconciliation" string="对账" context="{'group_by':'is_reconciliation'}"/>
@@ -42,22 +58,31 @@
<filter name="group_precinct_id" string="片区管理员" context="{'group_by':'precinct_id'}"/>
<filter name="group_due_date" string="应收开始" context="{'group_by':'due_date'}"/>
</group>
<!-- 顶部快捷搜索区(沿用应收账单样式) -->
<header_search class="header-search-inline">
<!-- 应收状态快捷筛选:红冲/对账/未对账/作废 -->
<quick_filter string="应收状态">
<filter string="红冲" name="is_red" domain="[('is_red', '=', True)]"/>
<filter string="对账" name="is_reconciliation" domain="[('is_reconciliation', '=', True)]"/>
<filter string="未对账" name="not_reconciliation" domain="[('is_reconciliation', '=', False)]"/>
<filter string="作废" name="is_invalid" domain="[('is_invalid', '=', True)]"/>
</quick_filter>
<!-- 年 -->
<field name="year_id" placeholder="年" options="{'no_label': True}"/>
<!-- 月 -->
<field name="month_id" placeholder="月" options="{'no_label': True}"/>
<!-- 公司 -->
<field name="company_id" placeholder="公司" options="{'no_label': True}"/>
<!-- 权属类型 -->
<field name="tenure_type" options="{'no_label': True}"/>
<!-- 片区管理员 -->
<field name="precinct_id" placeholder="片区管理员" options="{'no_label': True}"/>
</header_search>
<!-- 左侧搜索面板:片区管理员 + 状态,均为单选分类(不写 select="multi") -->
<searchpanel>
<!-- 片区管理员:单选分类 -->
<field name="precinct_id" string="片区管理员"/>
<!-- 状态:单选分类,默认选中「未收」(在 action context 里配置) -->
<field name="deposit_state" string="状态"/>
</searchpanel>
</search>
@@ -66,14 +91,19 @@
<!-- ========== 1. 租金 ========== -->
<record id="action_receivable_type_rent" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">租金</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=租金的记录 -->
<field name="domain">[('management_type_id.name', '=', '租金')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_rent"
@@ -84,14 +114,19 @@
<!-- ========== 2. 管理费 ========== -->
<record id="action_receivable_type_management_fee" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">管理费</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=管理费的记录 -->
<field name="domain">[('management_type_id.name', '=', '管理费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_management_fee"
@@ -102,14 +137,19 @@
<!-- ========== 3. 水费 ========== -->
<record id="action_receivable_type_water_fee" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">水费</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=水费的记录 -->
<field name="domain">[('management_type_id.name', '=', '水费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_water_fee"
@@ -120,14 +160,19 @@
<!-- ========== 4. 电费 ========== -->
<record id="action_receivable_type_electricity_fee" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">电费</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=电费的记录 -->
<field name="domain">[('management_type_id.name', '=', '电费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_electricity_fee"
@@ -138,14 +183,19 @@
<!-- ========== 5. 违约金 ========== -->
<record id="action_receivable_type_penalty" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">违约金</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=违约金的记录 -->
<field name="domain">[('management_type_id.name', '=', '违约金')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_penalty"
@@ -156,14 +206,19 @@
<!-- ========== 6. 押金 ========== -->
<record id="action_receivable_type_deposit" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">押金</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=押金的记录 -->
<field name="domain">[('management_type_id.name', '=', '押金')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_deposit"
@@ -172,184 +227,80 @@
action="action_receivable_type_deposit"
sequence="6"/>
<!-- ========== 7. 有偿服务收入 ========== -->
<record id="action_receivable_type_service_income" model="ir.actions.act_window">
<field name="name">有偿服务收入</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=有偿服务收入的记录 -->
<field name="domain">[('management_type_id.name', '=', '有偿服务收入')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_service_income"
name="有偿服务收入"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_service_income"
sequence="7"/>
<!-- ========== 8. 广告灯箱费 ========== -->
<!-- ========== 7. 广告灯箱费 ========== -->
<record id="action_receivable_type_advertising_lightbox_fee" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">广告灯箱费</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 只显示应收类型=广告灯箱费的记录 -->
<field name="domain">[('management_type_id.name', '=', '广告灯箱费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_advertising_lightbox_fee"
name="广告灯箱费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_advertising_lightbox_fee"
sequence="7"/>
<!-- ========== 8. 其它(汇总其余 9 个应收类型) ========== -->
<!--
「其它」= 有偿服务收入 / 停车费 / 灯箱 / 管子间 / 更名费 / 维修费 / 其他费用 / 评估费 / 保险费
这 9 类原来各自独立菜单,现合并到本菜单;domain 用 management_type_id.name in [...] 一次取全
-->
<record id="action_receivable_type_others" model="ir.actions.act_window">
<!-- 动作名称 -->
<field name="name">其它</field>
<!-- 模型:应收账单 -->
<field name="res_model">property.accounts.receivable</field>
<!-- 视图模式:仅列表 -->
<field name="view_mode">tree</field>
<!-- 汇总其余 9 个应收类型的记录 -->
<field name="domain">[('management_type_id.name', 'in', ['有偿服务收入', '停车费', '灯箱', '管子间', '更名费', '维修费', '其他费用', '评估费', '保险费'])]</field>
<!-- 不设默认分组(无 group_by);按应收开始 due_date 倒序;searchpanel 默认选中「未收」 -->
<field name="context">{'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<!-- 使用本模块专用的搜索视图(含 searchpanel) -->
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<!-- 复用应收账单原有列表视图 -->
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_others"
name="其它"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_others"
sequence="8"/>
<!-- ========== 9. 停车费 ========== -->
<record id="action_receivable_type_parking_fee" model="ir.actions.act_window">
<field name="name">停车费</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=停车费的记录 -->
<field name="domain">[('management_type_id.name', '=', '停车费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_parking_fee"
name="停车费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_parking_fee"
sequence="9"/>
<!-- ========== 10. 灯箱 ========== -->
<record id="action_receivable_type_lightbox" model="ir.actions.act_window">
<field name="name">灯箱</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=灯箱的记录 -->
<field name="domain">[('management_type_id.name', '=', '灯箱')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_lightbox"
name="灯箱"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_lightbox"
sequence="10"/>
<!-- ========== 11. 管子间 ========== -->
<record id="action_receivable_type_pipe_room" model="ir.actions.act_window">
<field name="name">管子间</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=管子间的记录 -->
<field name="domain">[('management_type_id.name', '=', '管子间')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_pipe_room"
name="管子间"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_pipe_room"
sequence="11"/>
<!-- ========== 12. 更名费 ========== -->
<record id="action_receivable_type_rename_fee" model="ir.actions.act_window">
<field name="name">更名费</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=更名费的记录 -->
<field name="domain">[('management_type_id.name', '=', '更名费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_rename_fee"
name="更名费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_rename_fee"
sequence="12"/>
<!-- ========== 13. 维修费 ========== -->
<record id="action_receivable_type_repair_fee" model="ir.actions.act_window">
<field name="name">维修费</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=维修费的记录 -->
<field name="domain">[('management_type_id.name', '=', '维修费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_repair_fee"
name="维修费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_repair_fee"
sequence="13"/>
<!-- ========== 14. 其他费用 ========== -->
<record id="action_receivable_type_other_fee" model="ir.actions.act_window">
<field name="name">其他费用</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=其他费用的记录 -->
<field name="domain">[('management_type_id.name', '=', '其他费用')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_other_fee"
name="其他费用"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_other_fee"
sequence="14"/>
<!-- ========== 15. 评估费 ========== -->
<record id="action_receivable_type_appraisal_fee" model="ir.actions.act_window">
<field name="name">评估费</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=评估费的记录 -->
<field name="domain">[('management_type_id.name', '=', '评估费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_appraisal_fee"
name="评估费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_appraisal_fee"
sequence="15"/>
<!-- ========== 16. 保险费 ========== -->
<record id="action_receivable_type_insurance_fee" model="ir.actions.act_window">
<field name="name">保险费</field>
<field name="res_model">property.accounts.receivable</field>
<field name="view_mode">tree</field>
<!-- 只显示应收类型=保险费的记录 -->
<field name="domain">[('management_type_id.name', '=', '保险费')]</field>
<!-- 沿用应收账单菜单的分组/排序上下文;searchpanel_default_deposit_state=未收 让左侧面板默认选中「未收」 -->
<field name="context">{'search_default_group_company_id': True, 'group_by': ['company_id', 'due_date:year', 'due_date:month'], 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}</field>
<field name="search_view_id" ref="yuthon_work_brand.view_receivable_type_search"/>
<field name="view_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
</record>
<menuitem id="menu_receivable_type_insurance_fee"
name="保险费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_insurance_fee"
sequence="16"/>
<!--
清理:原先 16 个应收类型菜单里的 9 个(有偿服务收入/停车费/灯箱/管子间/更名费/维修费/其他费用/评估费/保险费)
现已合并为上面的「其它」菜单。仅把 XML 里的记录删掉,数据库里已建好的旧菜单不会自动消失,
因此用 <delete> 指令在升级时把数据库中的旧菜单与旧动作一并删除。
<delete> 对不存在的记录只会跳过并记 warning(Odoo 源码 tools/convert.py 的 _tag_delete 捕获 ValueError),
所以重复升级也安全。删除顺序:先删菜单,再删动作,避免外键引用报错。
-->
<delete model="ir.ui.menu" id="menu_receivable_type_service_income"/>
<delete model="ir.ui.menu" id="menu_receivable_type_parking_fee"/>
<delete model="ir.ui.menu" id="menu_receivable_type_lightbox"/>
<delete model="ir.ui.menu" id="menu_receivable_type_pipe_room"/>
<delete model="ir.ui.menu" id="menu_receivable_type_rename_fee"/>
<delete model="ir.ui.menu" id="menu_receivable_type_repair_fee"/>
<delete model="ir.ui.menu" id="menu_receivable_type_other_fee"/>
<delete model="ir.ui.menu" id="menu_receivable_type_appraisal_fee"/>
<delete model="ir.ui.menu" id="menu_receivable_type_insurance_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_service_income"/>
<delete model="ir.actions.act_window" id="action_receivable_type_parking_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_lightbox"/>
<delete model="ir.actions.act_window" id="action_receivable_type_pipe_room"/>
<delete model="ir.actions.act_window" id="action_receivable_type_rename_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_repair_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_other_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_appraisal_fee"/>
<delete model="ir.actions.act_window" id="action_receivable_type_insurance_fee"/>
</odoo>