Files
uniprop-manual/prop-acc/scenarios/deposit/refund-partial-after-forfeit.md

162 lines
6.1 KiB
Markdown
Raw Normal View History

2026-05-25 22:27:38 +08:00
---
title: prop-acc · deposit · 场景 - 部分扣罚后退还差额
aliases:
- 扣罚后退差额
- 部分退款
- refund-partial-after-forfeit
- 场景-押金扣罚后退差额
tags:
- 场景
- prop-acc
- 保证金
- 退款
- 扣罚
audience:
- 业户
- 业务人员
status: 已发布
sub_feature: deposit
last_review: 2026-05-25
code_version: 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 张扣罚说明(可选,详细解释扣罚事由)交业户
## 系统流程
```mermaid
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]]
## 相关文档
- [[refund-full-no-damage]]
- [[forfeit-damage-public-area]]
- [[transaction-types]]
- [[red-receipt-design]]
- [[freeze-during-dispute]]