6.1 KiB
title, aliases, tags, audience, status, sub_feature, last_review, code_version
| title | aliases | tags | audience | status | sub_feature | last_review | code_version | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| prop-acc · deposit · 场景 - 部分扣罚后退还差额 |
|
|
|
已发布 | deposit | 2026-05-25 | 2026-05-22 |
场景:部分扣罚后退还差额
业户装修有损坏,物业扣一部分赔偿,剩下的部分退还。两步流水:先 forfeit-damage-public-area 再 refund,账户余额清零自动关闭。
典型情境
[!example] 真实情境 陈先生家装修完了,公共走道墙面被工人撞坏一小块,修复成本 ¥800(物业找人修)。陈先生当初交了 ¥5,000 装修保证金,扣 ¥800 后退还 ¥4,200。
业户视角
第 1 步:装修完通知验收
同 refund-full-no-damage 第 1 步。
第 2 步:验收发现损坏
- 物业验收员拍照、定损、出具修复报价
- 给您看证据,告知"墙面修复需 ¥800,从您押金扣"
- 您可选:
- 同意扣罚 → 走本流程,扣 800 退 4200
- 不同意 → 进入纠纷,账户冻结(走 freeze-during-dispute)
第 3 步:扣罚后等退款
物业先扣 ¥800,再退 ¥4,200。
第 4 步:收到 2 张红字收据
- 红字收据 1:"装修保证金扣罚 ¥-800(公共走道墙面损坏)"
- 红字收据 2:"装修保证金退还 ¥-4,200"
[!info] 为什么是两张? 系统每笔流水生成一张独立收据,扣罚和退款是两件事。各自有金额、各自有事由,合并到一张反而看不清。详见 transaction-types。
业务人员视角(物业财务)
第 1 步:做扣罚(ForfeitureAction)
详见 forfeit-damage-public-area。要点:
- Modal 表单填扣罚金额 ¥800、事由"公共走道墙面损坏"
- 系统建红字 CollectionOrder + DepositTransaction(forfeiture)+ Receipt
- 账户余额从 ¥5,000 变 ¥4,200
第 2 步:做退款(RefundAction)
详见 refund-full-no-damage。要点:
- Modal 表单退款金额自动带入当前余额 ¥4,200
- 选退款渠道
- 系统建红字 CollectionOrder + DepositTransaction(refund)+ Receipt
- 账户余额从 ¥4,200 变 ¥0
- 自动关账(status=Closed)
第 3 步:走线下退款 + 给收据
- 银行 / 微信退 ¥4,200
- 把 2 张红字收据 + 1 张扣罚说明(可选,详细解释扣罚事由)交业户
系统流程
sequenceDiagram
participant 业户
participant 财务
participant Filament
participant ForfeitFromDepositAccountAction
participant RefundFromDepositAccountAction
participant 数据库
Note over 业户,财务: 验收发现墙面损坏
业户->>财务: 同意扣 800
财务->>Filament: ViewDepositAccount → ForfeitureAction(modal)
Filament->>ForfeitFromDepositAccountAction: handle(account, 800, reason)
ForfeitFromDepositAccountAction->>数据库: 建红字 CO + DepositTransaction(forfeiture)
数据库-->>数据库: balance 5000→4200
Note over 业户,财务: 接着退差额
财务->>Filament: ViewDepositAccount → RefundAction(modal, 默认 4200)
Filament->>RefundFromDepositAccountAction: handle(account, 4200, channel)
RefundFromDepositAccountAction->>数据库: 建红字 CO + DepositTransaction(refund)
数据库-->>数据库: balance 4200→0, status→Closed
财务-->>业户: 2 张红字收据 + 银行/微信退 4200
[!info] 两步分别提交 扣罚和退款是两次独立操作,各自一笔流水、一张收据、一个 CollectionOrder。这样保留独立审计痕迹,任何一步出问题不影响另一步。
流水台账(本场景完整记录)
| 流水 ID | type | amount | balance_before | balance_after | 关联 CO | 凭证 Receipt |
|---|---|---|---|---|---|---|
| 1 | deposit | 5000 | 0 | 5000 | CO #1(+5000) | "装修保证金缴纳 ¥5,000" |
| 2 | forfeiture | 800 | 5000 | 4200 | CO #2(-800) | "装修保证金扣罚 ¥-800(公共走道墙面损坏)" |
| 3 | refund | 4200 | 4200 | 0 | CO #3(-4200) | "装修保证金退还 ¥-4,200" |
SUM(actual_amount of all CO) = +5000 - 800 - 4200 = 0 —— 账面平,物业代管资金净流入为 0,800 通过扣罚转入物业收入,4200 退还业户。
常见问题
[!question] 业户不同意扣罚怎么办? 不要强扣。先 freeze-during-dispute,等沟通 / 调解结果再操作:
- 调解结果"业户责任" → unfreeze-after-mediation → 走本场景
- 调解结果"物业误判" → 解冻 → 走 refund-full-no-damage
- 调解结果"双方妥协金额" → 解冻 → 按妥协金额走本场景
- 调解陷入僵局,业户失联或拒绝沟通 → 走 force-close-forfeit 或 force-close-retain
[!question] 扣罚 + 退款必须连续做吗? 不必须。可以:
- 验收当天先扣罚(留账户 Active 余额 ¥4,200)
- 第二天业户提供回款账号后再退 中间间隔多久都行,只要账户保持 Active。
[!question] 扣罚的钱去哪了? 扣罚的 CollectionOrder 是红字,
actual_amount=-800,但这笔钱实际上从"代管负债"科目转入"装修维修收入"科目(物业收入)。账上的资金从未离开物业账户,只是性质从"代管"变为"收入"。
[!question] 一次扣罚不够后续追加可以吗? 可以。例如先扣 ¥500,事后发现另有损坏再扣 ¥300。每次独立
ForfeitureAction,账户余额累计减少。
[!question] 扣罚 + 退款后业户反悔说"墙是装修前就坏的"? 走 freeze-during-dispute 已晚(账户已 Closed)。线下沟通 + 财务通过 tinker / 后端补正(走 deposit 一笔反向流水冲),业务上属"事后追溯",系统不主动支持。
异常分支
- 全无损 → refund-full-no-damage
- 全是损坏要全扣 → 只走 forfeit-damage-public-area,不退,账户余额 0 自动关
- 业户拒绝扣罚进入纠纷 → freeze-during-dispute
- 账户 Frozen 时被迫处置 → force-close-refund / force-close-forfeit