@@ -23,12 +23,12 @@ class PropertyAccountsReceivableSummary(models.Model):
|
||||
electricity_unpaid = fields.Float(string='电费')
|
||||
penalty_unpaid = fields.Float(string='违约金')
|
||||
deposit_unpaid = fields.Float(string='押金')
|
||||
ad_unpaid = fields.Float(string='广告灯箱费')
|
||||
lightbox_unpaid = fields.Float(string='灯箱')
|
||||
other_unpaid = fields.Float(string='其他')
|
||||
|
||||
# 7 个单独展示的类型;其余类型(有偿服务收入/停车费/灯箱/管子间/更名费/维修费/其他费用/
|
||||
# 评估费/保险费,以及以后新增的类型)全部归入「其他」
|
||||
_SUMMARY_TYPES = ['租金', '管理费', '水费', '电费', '违约金', '押金', '广告灯箱费']
|
||||
# 7 个单独展示的类型(灯箱单独一列);其余类型(广告灯箱费/有偿服务收入/停车费/管子间/
|
||||
# 更名费/维修费/其他费用/评估费/保险费,以及以后新增的类型)全部归入「其他」
|
||||
_SUMMARY_TYPES = ['租金', '管理费', '水费', '电费', '违约金', '押金', '灯箱']
|
||||
|
||||
def init(self):
|
||||
tools.drop_view_if_exists(self.env.cr, self._table)
|
||||
@@ -36,7 +36,7 @@ class PropertyAccountsReceivableSummary(models.Model):
|
||||
for fname, tname in [
|
||||
('rent_unpaid', '租金'), ('management_unpaid', '管理费'), ('water_unpaid', '水费'),
|
||||
('electricity_unpaid', '电费'), ('penalty_unpaid', '违约金'), ('deposit_unpaid', '押金'),
|
||||
('ad_unpaid', '广告灯箱费'),
|
||||
('lightbox_unpaid', '灯箱'),
|
||||
]:
|
||||
main_cols += "\n COALESCE(SUM(CASE WHEN t.name = '%s' THEN r.submitted ELSE 0.0 END), 0.0) AS %s," % (tname, fname)
|
||||
excluded = ", ".join("'%s'" % t for t in self._SUMMARY_TYPES)
|
||||
@@ -61,7 +61,7 @@ class PropertyAccountsReceivableSummary(models.Model):
|
||||
|
||||
def action_open_unpaid_detail(self):
|
||||
"""未收明细:打开该合同下 未收/收部分 且 未对账 的应收账单,
|
||||
复用 view_property_accounts_receivable_tree,默认按应收类型分组"""
|
||||
复用 view_property_accounts_receivable_tree,不做分组,按应收类型倒序"""
|
||||
self.ensure_one()
|
||||
tree_view = self.env.ref('yuthon_property.view_property_accounts_receivable_tree')
|
||||
search_view = self.env.ref('yuthon_property_approval.view_property_accounts_receivable_search')
|
||||
@@ -79,7 +79,6 @@ class PropertyAccountsReceivableSummary(models.Model):
|
||||
('is_reconciliation', '=', False),
|
||||
],
|
||||
'context': {
|
||||
'group_by': 'management_type_id',
|
||||
'order': 'management_type_id desc',
|
||||
},
|
||||
'target': 'current',
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
</group>
|
||||
|
||||
<!-- ===== 节点一:申请人(state 为空或走到「申请人」节点时显示)===== -->
|
||||
<group string="发起退租申请" invisible="state and state != '申请人'" col="1">
|
||||
<group invisible="state and state != '申请人'" col="1">
|
||||
<group>
|
||||
<!-- 申请人:默认自动带出当前登录用户,可手选他人代提交;流程监控的「创建人」取系统 create_uid,与此字段无关 -->
|
||||
<field name="user_id" string="申请人" required="1"/>
|
||||
@@ -80,13 +80,21 @@
|
||||
<field name="early_reason" required="1" widget="radio"/>
|
||||
<!-- 退租日期:退租截止日期与退租日期统一使用此字段,所有退租原因均显示 -->
|
||||
<field name="early_quitting_date" required="1"/>
|
||||
<!-- 押金及费用结算:紧跟退租日期,仅「协商一致」退租显示 -->
|
||||
<field name="total_fee" readonly="1" invisible="early_reason != 'agree'"/>
|
||||
<field name="deposit_treatment" invisible="early_reason != 'agree'"/>
|
||||
<field name="deposit" readonly="1" invisible="early_reason != 'agree'"/>
|
||||
<field name="refund_amount" invisible="early_reason != 'agree' or deposit_treatment != 'part_refund'"/>
|
||||
<field name="forfeit" readonly="1" invisible="early_reason != 'agree' or deposit_treatment != 'part_refund'"/>
|
||||
<field name="total_receivables" readonly="1" invisible="early_reason != 'agree' or deposit_treatment != 'part_refund'"/>
|
||||
<!-- 退租说明:进入终止/押金处理逻辑 -->
|
||||
<field name="early_explain" widget="text"/>
|
||||
<!-- 其��(补充说明) -->
|
||||
<!-- 其它(补充说明) -->
|
||||
<field name="other_note" widget="text"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
|
||||
<!-- 应收明细(仅「协商一致」且已填退租日期时显示) -->
|
||||
<div invisible="early_reason != 'agree' or not early_quitting_date">
|
||||
<notebook>
|
||||
@@ -144,7 +152,8 @@
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<!-- ===== 节点三:片区管理员(费用结算与复核)===== -->
|
||||
<!-- ===== 节点三:片区管理员(费用明细与结算签字)===== -->
|
||||
<!-- 押金/退押相关字段已前移至「押金及费用结算」区块(仅协商一致显示),此处保留费用明细与签字 -->
|
||||
<group string="费用结算与复核" invisible="state not in ['片区管理员']" col="1">
|
||||
<group>
|
||||
<field name="fee_ids">
|
||||
@@ -156,13 +165,6 @@
|
||||
<field name="remark"/>
|
||||
</tree>
|
||||
</field>
|
||||
<field name="total_fee" readonly="1"/>
|
||||
<field name="deposit_treatment"/>
|
||||
<field name="deposit" readonly="1"/>
|
||||
<field name="refund_amount" invisible="deposit_treatment != 'part_refund'"/>
|
||||
<field name="forfeit" readonly="1" invisible="deposit_treatment != 'part_refund'"/>
|
||||
<field name="total_receivables" readonly="1" invisible="deposit_treatment != 'part_refund'"/>
|
||||
<field name="early_explain" widget="text" readonly="1"/>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<field name="electricity_unpaid" sum="合计" options='{"fg_color": "red: electricity_unpaid > 0;" }'/>
|
||||
<field name="penalty_unpaid" sum="合计" options='{"fg_color": "red: penalty_unpaid > 0;" }'/>
|
||||
<field name="deposit_unpaid" sum="合计" options='{"fg_color": "red: deposit_unpaid > 0;" }'/>
|
||||
<field name="ad_unpaid" sum="合计" options='{"fg_color": "red: ad_unpaid > 0;" }'/>
|
||||
<field name="lightbox_unpaid" sum="合计" options='{"fg_color": "red: lightbox_unpaid > 0;" }'/>
|
||||
<field name="other_unpaid" sum="合计" options='{"fg_color": "red: other_unpaid > 0;" }'/>
|
||||
<button name="action_open_unpaid_detail" type="object" string="未收明细"
|
||||
class="btn-primary btn-sm" icon="fa-list" title="查看该合同未收明细"/>
|
||||
|
||||
@@ -89,6 +89,23 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!--
|
||||
应收类型子菜单专用列表视图(primary 继承应收账单基础 tree)
|
||||
作用:类型专属菜单里已经用 domain 限定了类型,列表里不再显示「应收类型」列
|
||||
说明:mode=primary 使其成为独立视图,不影响「应收账单汇总」等原有菜单的视图
|
||||
-->
|
||||
<record id="view_receivable_type_tree_no_type" model="ir.ui.view">
|
||||
<field name="name">property.accounts.receivable.tree.no.type</field>
|
||||
<field name="model">property.accounts.receivable</field>
|
||||
<field name="inherit_id" ref="yuthon_property.view_property_accounts_receivable_tree"/>
|
||||
<field name="mode">primary</field>
|
||||
<field name="arch" type="xml">
|
||||
<field name="management_type_id" position="attributes">
|
||||
<attribute name="column_invisible">1</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- ========== 0. 汇总(按合同汇总各应收类型未收金额,排在各类型子菜单最上面) ========== -->
|
||||
<menuitem id="menu_receivable_summary"
|
||||
name="汇总"
|
||||
@@ -310,4 +327,161 @@
|
||||
<delete model="ir.actions.act_window" id="action_receivable_type_appraisal_fee"/>
|
||||
<delete model="ir.actions.act_window" id="action_receivable_type_insurance_fee"/>
|
||||
|
||||
<!--
|
||||
============================================================
|
||||
物业管理根菜单下的「应收账单」副本(挂在 生成应收 之后)
|
||||
与上面那组菜单的唯一区别:所有动作的 domain 追加
|
||||
('admin_id', '=', uid)——只显示片区管理员为当前登录人的记录。
|
||||
汇总动作用独立 server action(返回按合同汇总窗口 + 本人片区 domain)。
|
||||
============================================================
|
||||
-->
|
||||
<menuitem id="menu_receivable_type_my_root"
|
||||
name="应收账单"
|
||||
parent="yuthon_property.yuthon_property_menu_root"
|
||||
sequence="11"/>
|
||||
|
||||
<!-- 0. 汇总(按合同汇总,仅当前登录人片区的数据) -->
|
||||
<record id="action_receivable_summary_my" model="ir.actions.server">
|
||||
<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)]
|
||||
]]></field>
|
||||
</record>
|
||||
<menuitem id="menu_receivable_summary_my"
|
||||
name="汇总"
|
||||
parent="menu_receivable_type_my_root"
|
||||
action="action_receivable_summary_my"
|
||||
sequence="0"/>
|
||||
|
||||
<!-- 1. 租金(本人片区) -->
|
||||
<record id="action_receivable_type_rent_my" 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', '=', '租金'), ('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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</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">
|
||||
<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"/>
|
||||
</record>
|
||||
<menuitem id="menu_receivable_type_others_my"
|
||||
name="其他"
|
||||
parent="menu_receivable_type_my_root"
|
||||
action="action_receivable_type_others_my"
|
||||
sequence="8"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
Reference in New Issue
Block a user