!12895 添加功能

Merge pull request !12895 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-09-21 11:16:24 +00:00
committed by Gitee
2 changed files with 143 additions and 118 deletions
@@ -6,8 +6,8 @@
<field name="model">property.accounts.receivable.summary</field>
<field name="arch" type="xml">
<tree create="false" edit="false" delete="false" default_order="contract_id desc">
<field name="contract_id"/>
<field name="property_name"/>
<field name="contract_id"/>
<field name="admin_id"/>
<field name="rent_unpaid" sum="合计" options='{"fg_color": "red: rent_unpaid > 0;" }'/>
<field name="management_unpaid" sum="合计" options='{"fg_color": "red: management_unpaid > 0;" }'/>
+142 -117
View File
@@ -332,9 +332,8 @@
<!--
============================================================
物业管理根菜单下的「应收账单」副本(挂在 生成应收 之后)
与上面那组菜单的唯一区别:所有动作的 domain 追加
('admin_id', '=', uid)——只显示片区管理员为当前登录人的记录。
汇总动作用独立 server action(返回按合同汇总窗口 + 本人片区 domain)。
与上面那组菜单内容完全一致(不再追加 ('admin_id', '=', uid) 过滤)。
汇总动作用独立 server action(直接返回按合同汇总窗口)。
============================================================
-->
<menuitem id="menu_receivable_type_my_root"
@@ -342,14 +341,20 @@
parent="yuthon_property.yuthon_property_menu_root"
sequence="11"/>
<!-- 0. 汇总(按合同汇总,仅当前登录人片区的数据) -->
<!-- 0. 汇总(按合同汇总;searchpanel 片区管理员默认当前登录人对应片区) -->
<record id="action_receivable_summary_my" model="ir.actions.server">
<field name="name">应收账单汇总(本人片区)</field>
<field name="name">应收账单汇总</field>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
action = env.ref('yuthon_property_approval.action_receivable_unpaid_window').sudo().read()[0]
action['domain'] = [('admin_id', '=', env.user.id)]
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
# 汇总搜索视图的 searchpanel 字段是 admin_id(res.users),去掉原 group_by contract_id
ctx = {}
if precinct:
ctx['searchpanel_default_admin_id'] = env.user.id
action['context'] = ctx
]]></field>
</record>
<menuitem id="menu_receivable_summary_my"
@@ -358,132 +363,152 @@ action['domain'] = [('admin_id', '=', env.user.id)]
action="action_receivable_summary_my"
sequence="0"/>
<!-- 1. 租金(本人片区) -->
<record id="action_receivable_type_rent_my" model="ir.actions.act_window">
<!--
1~8. 类型子菜单:每个类型一个独立 server action(硬编码类型 + 注入 searchpanel 片区管理员默认)。
注:menuitem 不能带 context(RelaxNG 不允许),故用独立 server action 取代「按 context 分发」。
目的:searchpanel「片区管理员」默认选中当前登录人对应的片区
(res.users -> employee_id -> yuthon.precinct.message);若无对应片区则不预选(显示全部)。
数据范围与「物业财务管理 - 应收账单」一致(不加 domain 硬过滤),仅在 searchpanel 上做默认选中。
「其他」按应收类型分组显示(恢复分组折叠)。
-->
<record id="action_receivable_type_rent_my_srv" model="ir.actions.server">
<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', '=', '租金'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '租金')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '租金', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_rent_my"
name="租金"
parent="menu_receivable_type_my_root"
action="action_receivable_type_rent_my"
sequence="1"/>
<!-- 2. 管理费(本人片区) -->
<record id="action_receivable_type_management_fee_my" model="ir.actions.act_window">
<record id="action_receivable_type_management_fee_my_srv" model="ir.actions.server">
<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', '=', '管理费'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '管理费')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '管理费', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_management_fee_my"
name="管理费"
parent="menu_receivable_type_my_root"
action="action_receivable_type_management_fee_my"
sequence="2"/>
<!-- 3. 水费(本人片区) -->
<record id="action_receivable_type_water_fee_my" model="ir.actions.act_window">
<record id="action_receivable_type_water_fee_my_srv" model="ir.actions.server">
<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', '=', '水费'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '水费')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '水费', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_water_fee_my"
name="水费"
parent="menu_receivable_type_my_root"
action="action_receivable_type_water_fee_my"
sequence="3"/>
<!-- 4. 电费(本人片区) -->
<record id="action_receivable_type_electricity_fee_my" model="ir.actions.act_window">
<record id="action_receivable_type_electricity_fee_my_srv" model="ir.actions.server">
<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', '=', '电费'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '电费')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '电费', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_electricity_fee_my"
name="电费"
parent="menu_receivable_type_my_root"
action="action_receivable_type_electricity_fee_my"
sequence="4"/>
<!-- 5. 违约金(本人片区) -->
<record id="action_receivable_type_penalty_my" model="ir.actions.act_window">
<record id="action_receivable_type_penalty_my_srv" model="ir.actions.server">
<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', '=', '违约金'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '违约金')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '违约金', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_penalty_my"
name="违约金"
parent="menu_receivable_type_my_root"
action="action_receivable_type_penalty_my"
sequence="5"/>
<!-- 6. 押金(本人片区) -->
<record id="action_receivable_type_deposit_my" model="ir.actions.act_window">
<record id="action_receivable_type_deposit_my_srv" model="ir.actions.server">
<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', '=', '押金'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '押金')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '押金', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_deposit_my"
name="押金"
parent="menu_receivable_type_my_root"
action="action_receivable_type_deposit_my"
sequence="6"/>
<!-- 7. 灯箱(本人片区) -->
<record id="action_receivable_type_lightbox_my" model="ir.actions.act_window">
<record id="action_receivable_type_lightbox_my_srv" model="ir.actions.server">
<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', '=', '灯箱'), ('admin_id', '=', uid)]</field>
<field name="context">{'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_work_brand.view_receivable_type_tree_no_type"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', '=', '灯箱')]
view_id = env.ref('yuthon_work_brand.view_receivable_type_tree_no_type').id
ctx = {'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '灯箱', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_lightbox_my"
name="灯箱"
parent="menu_receivable_type_my_root"
action="action_receivable_type_lightbox_my"
sequence="7"/>
<!-- 8. 其他(本人片区;含多个类型,按应收类型分组显示) -->
<record id="action_receivable_type_others_my" model="ir.actions.act_window">
<record id="action_receivable_type_others_my_srv" model="ir.actions.server">
<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', 'in', ['广告灯箱费', '有偿服务收入', '停车费', '管子间', '更名费', '维修费', '其他费用', '评估费', '保险费']), ('admin_id', '=', uid)]</field>
<field name="context">{'group_by': 'management_type_id', '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"/>
<field name="model_id" ref="yuthon_property.model_property_accounts_receivable"/>
<field name="state">code</field>
<field name="code"><![CDATA[
employee = env['hr.employee'].search([('user_id', '=', env.user.id)], limit=1)
precinct = env['yuthon.precinct.message'].search([('employee_id', '=', employee.id)], limit=1) if employee else env['yuthon.precinct.message']
domain = [('management_type_id.name', 'in', ['广告灯箱费', '有偿服务收入', '停车费', '管子间', '更名费', '维修费', '其他费用', '评估费', '保险费'])]
view_id = env.ref('yuthon_property.view_property_accounts_receivable_tree').id
ctx = {'group_by': 'management_type_id', 'orderedBy': [{'name': 'due_date', 'asc': False}], 'searchpanel_default_deposit_state': 'unpaid'}
if precinct:
ctx['searchpanel_default_precinct_id'] = precinct.id
action = {'type': 'ir.actions.act_window', 'name': '其他', 'res_model': 'property.accounts.receivable', 'view_mode': 'tree', 'domain': domain, 'context': ctx, 'search_view_id': env.ref('yuthon_work_brand.view_receivable_type_search').id, 'view_id': view_id}
]]></field>
</record>
<menuitem id="menu_receivable_type_others_my"
name="其他"
parent="menu_receivable_type_my_root"
action="action_receivable_type_others_my"
sequence="8"/>
<menuitem id="menu_receivable_type_rent_my" name="租金" parent="menu_receivable_type_my_root" action="action_receivable_type_rent_my_srv" sequence="1"/>
<menuitem id="menu_receivable_type_management_fee_my" name="管理费" parent="menu_receivable_type_my_root" action="action_receivable_type_management_fee_my_srv" sequence="2"/>
<menuitem id="menu_receivable_type_water_fee_my" name="水费" parent="menu_receivable_type_my_root" action="action_receivable_type_water_fee_my_srv" sequence="3"/>
<menuitem id="menu_receivable_type_electricity_fee_my" name="电费" parent="menu_receivable_type_my_root" action="action_receivable_type_electricity_fee_my_srv" sequence="4"/>
<menuitem id="menu_receivable_type_penalty_my" name="违约金" parent="menu_receivable_type_my_root" action="action_receivable_type_penalty_my_srv" sequence="5"/>
<menuitem id="menu_receivable_type_deposit_my" name="押金" parent="menu_receivable_type_my_root" action="action_receivable_type_deposit_my_srv" sequence="6"/>
<menuitem id="menu_receivable_type_lightbox_my" name="灯箱" parent="menu_receivable_type_my_root" action="action_receivable_type_lightbox_my_srv" sequence="7"/>
<menuitem id="menu_receivable_type_others_my" name="其他" parent="menu_receivable_type_my_root" action="action_receivable_type_others_my_srv" sequence="8"/>
<!-- 清理:旧的 8 个 _my act_window 记录(已被独立 server action 取代) -->
<delete model="ir.actions.act_window" id="action_receivable_type_rent_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_management_fee_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_water_fee_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_electricity_fee_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_penalty_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_deposit_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_lightbox_my"/>
<delete model="ir.actions.act_window" id="action_receivable_type_others_my"/>
</odoo>