Merge pull request !12875 from 李鹏宇/dev_wang
This commit is contained in:
李鹏宇
2026-09-20 11:35:22 +00:00
committed by Gitee
2 changed files with 357 additions and 0 deletions
+2
View File
@@ -14,6 +14,8 @@
'security/ir.model.access.csv',
'views/yuthon_none_views.xml',
'views/hr_menus.xml',
# 应收账单按「应收类型」拆分的子菜单(必须排在 hr_menus.xml 之后,父菜单在 hr_menus.xml 中定义)
'views/receivable_type_menus.xml',
'views/purchase_menus.xml',
'views/executive_manage.xml',
'views/stock_menus.xml',
@@ -0,0 +1,355 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--
应收账单 - 按「应收类型」拆分的子菜单
模型统一使用 property.accounts.receivable
视图统一使用应收账单原有列表视图 yuthon_property.view_property_accounts_receivable_tree
每个菜单只通过 domain 过滤 management_type_id(应收类型)的 name
父菜单:yuthon_work_brand.yuthon_accounts_receivable_menu(物业财务管理 - 应收账单)
-->
<!--
应收类型子菜单专用的搜索视图
作用:完整沿用「应收账单」原搜索视图 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'}"/>
<filter name="group_property_ids" string="物业" context="{'group_by':'property_ids'}"/>
<filter name="group_lessee_id" string="承租方" context="{'group_by':'lessee_id'}"/>
<filter name='group_by_contract_id' string="合同" context="{'group_by':'contract_id'}"/>
<filter name="contract_sort" string="资产类型" context="{'group_by':'contract_sort'}"/>
<filter name="group_management_type_id" string="应收类型" context="{'group_by':'management_type_id'}"/>
<filter name="group_tenure_type" string="权属类型" context="{'group_by':'tenure_type'}"/>
<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="片区管理员"/>
<field name="deposit_state" string="状态"/>
</searchpanel>
</search>
</field>
</record>
<!-- ========== 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>
<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"
name="租金"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_rent"
sequence="1"/>
<!-- ========== 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>
<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"
name="管理费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_management_fee"
sequence="2"/>
<!-- ========== 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>
<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"
name="水费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_water_fee"
sequence="3"/>
<!-- ========== 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>
<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"
name="电费"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_electricity_fee"
sequence="4"/>
<!-- ========== 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>
<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"
name="违约金"
parent="yuthon_accounts_receivable_menu"
action="action_receivable_type_penalty"
sequence="5"/>
<!-- ========== 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>
<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"
name="押金"
parent="yuthon_accounts_receivable_menu"
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. 广告灯箱费 ========== -->
<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>
<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="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"/>
</odoo>