vault backup: 2026-05-25 22:37:41
This commit is contained in:
230
prop-acc/scenarios/deposit/force-close-retain.md
Normal file
230
prop-acc/scenarios/deposit/force-close-retain.md
Normal file
@@ -0,0 +1,230 @@
|
||||
---
|
||||
title: prop-acc · deposit · 场景 - 资金保留并关账(法律保留/业户失联)
|
||||
aliases:
|
||||
- 强制保留关账
|
||||
- ForceClose retain
|
||||
- 资金保留归档
|
||||
- force-close-retain
|
||||
- 场景-押金资金保留关账
|
||||
tags:
|
||||
- 场景
|
||||
- prop-acc
|
||||
- 保证金
|
||||
- 强制关账
|
||||
audience:
|
||||
- 业务人员
|
||||
status: 已发布
|
||||
sub_feature: deposit
|
||||
last_review: 2026-05-25
|
||||
code_version: 2026-05-22
|
||||
---
|
||||
|
||||
# 场景:资金保留并关账(法律保留 / 业户失联)
|
||||
|
||||
账户 **Frozen** 状态、**有余额**,但**不确定该退还还是扣罚** —— 业户失联、遗产分配延迟、法律保留期未满、案件审理中等。物业用 `ForceCloseAction` 选 `retain` disposition,**关闭账户但保留余额** —— 资金留在物业账上,等业户回来或法律决定。
|
||||
|
||||
## 典型情境
|
||||
|
||||
> [!example] 真实情境(一)
|
||||
> 装修公司倒闭,法人失联。"王装修有限公司"账户里还有 ¥15,000(为 3 户业主代缴的押金)。3 户业主中 2 户已自费维修,1 户仍在装修。物业不知该退给装修公司(已失联)、退给业主(账面缴款人不是业主)、还是扣罚作维修款。决定:**保留资金,关账户,等法律或公司清算结果**。
|
||||
|
||||
> [!example] 真实情境(二)
|
||||
> 张阿姨因家中变故住进养老院,装修保证金账户里还有 ¥4,000。家属正在办继承公证,需 6 个月。物业不能擅自退给"自称是子女的人",也不能扣罚(无任何违约)。**保留资金,关账户,等继承公证结果**。
|
||||
|
||||
## 业户 / 业户家属视角
|
||||
|
||||
### 您(或亲属)会感受到什么
|
||||
|
||||
- 账户被关闭,但**没有任何退款**或扣罚通知
|
||||
- 系统通知:"您的押金账户已结清,资金 ¥X 暂留物业代管,事由 XXX"
|
||||
- 小程序"我的押金账户"显示 "🔒 已结清,余额保留中"
|
||||
- **资金仍属于您 / 您家属 / 法定继承人**,物业不可挪用
|
||||
|
||||
### 您要做什么
|
||||
|
||||
- 在法律 / 继承 / 公司清算等程序结束后,**主动联系物业**
|
||||
- 出示身份证明(本人 / 继承证明 / 司法授权文件)
|
||||
- 物业核实后**重新进入退款流程**(走线下操作,系统层面**不重启账户**)
|
||||
|
||||
## 业务人员视角
|
||||
|
||||
### 第 1 步:确认 retain 判定
|
||||
|
||||
**业务上要符合**以下任一情境:
|
||||
|
||||
- 业户失联(无法核实身份,无法退款)
|
||||
- 业户已故,继承未定
|
||||
- 装修公司清算 / 倒闭,无明确债权人
|
||||
- 法律保留期内(司法要求资金不动)
|
||||
- 任何**不该退、不该扣**的临时归档需求
|
||||
|
||||
> [!warning] 不要把 retain 当万能选项
|
||||
> retain 是为**长期不确定**的情境设计的。短期纠纷应走 [[freeze-during-dispute|冻结]] 等结果。retain 是终态,关账后**永久无法在本账户继续操作**。
|
||||
|
||||
### 第 2 步:打开 Frozen 账户
|
||||
|
||||
后台 → 保证金 → 账户列表 → 找 Frozen 账户 → 进 `ViewDepositAccount`。
|
||||
|
||||
### 第 3 步:点击 `ForceCloseAction`(标签"强制关账")
|
||||
|
||||
Modal 表单:
|
||||
|
||||
| 字段 | 填什么 |
|
||||
|---|---|
|
||||
| **处置方式 (disposition)** | 选 ✅ **`retain`(保留归档)** |
|
||||
| **保留事由(retain_reason)** | **必填**(关键!),如 "装修公司倒闭,3 户业主代缴款,清算未结" |
|
||||
| **关账事由(memo)** | 必填,如 "ForceClose retain,等待清算结果" |
|
||||
|
||||
> [!info] retain_reason 与 memo 的区别
|
||||
> - `retain_reason`:**业务背景**,为什么保留(写给将来要追溯的人看)
|
||||
> - `memo`:**操作意图**,这次操作做了什么
|
||||
>
|
||||
> 两个字段都进 `meta`,审计时一起查。
|
||||
|
||||
> [!warning] retain 不写 retain_reason 会被守护拦截
|
||||
> `ForceCloseDepositAccountAction` 对 disposition=retain 时强制要求 `retain_reason` 非空。这是刻意设计 —— 防止"无理由保留"导致后续追溯困难。
|
||||
|
||||
### 第 4 步:提交
|
||||
|
||||
系统调 `ForceCloseDepositAccountAction(disposition=retain)`,事务内:
|
||||
|
||||
1. 校验 `isFrozen() && hasBalance()`
|
||||
2. 校验 `retain_reason` 非空
|
||||
3. **不建 CollectionOrder**(没有资金动作,余额不变)
|
||||
4. **不建 DepositTransaction**(同上)
|
||||
5. **不建 Receipt**(同上)
|
||||
6. 更新 `status=Closed`(从 Frozen)
|
||||
7. 在 `meta` 写入审计字段:
|
||||
- `force_closed_disposition: 'retain'`
|
||||
- `force_closed_memo: ...`
|
||||
- `force_closed_at: now`
|
||||
- **`balance_held_amount`**: 保留的金额
|
||||
- **`balance_held_reason`**: retain_reason 的副本
|
||||
8. 账户 `balance` 字段保持原值(例如 ¥5,000)—— **不清零**
|
||||
|
||||
### 第 5 步:线下记录归档
|
||||
|
||||
- 物业财务把这种"已 Closed 但有余额"账户列入**待处理代管资金清单**
|
||||
- 银行账户里对应的资金做**专项隔离**(账面与物业自有资金分开)
|
||||
- 每月 / 每季对账时核对
|
||||
|
||||
### 第 6 步:业户出现时
|
||||
|
||||
业户(或家属 / 继承人 / 清算人)出现并出示合法身份后:
|
||||
|
||||
| 选项 | 操作 |
|
||||
|---|---|
|
||||
| 退还给业户 | **开新账户** → 走 `Deposit` 把 retain 余额转入新账户(系统层 deposit + 备注"原 retain 账户转入")→ 立刻 [[refund-full-no-damage|退款]] |
|
||||
| 扣罚处理 | **开新账户** → 同上流程 → [[forfeit-damage-public-area|扣罚]] |
|
||||
| 物业内部决议无主资金 | 走法律程序(物业法务 / 街道办)→ 司法判决归属 → 按判决处理 |
|
||||
|
||||
> [!warning] 不要试图"重启" Closed 账户
|
||||
> Closed 账户永久关闭。`canBeReopened` 永远 false。所有"业户回来了"的处理都通过**新账户**走。
|
||||
|
||||
## 系统流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 业户家属
|
||||
participant 财务
|
||||
participant Filament
|
||||
participant ForceCloseDepositAccountAction
|
||||
participant 数据库
|
||||
|
||||
Note over 业户家属,财务: 业户失联,余额 5000 留 Frozen 状态
|
||||
|
||||
财务->>Filament: ViewDepositAccount → ForceCloseAction(disposition=retain, retain_reason)
|
||||
Filament->>ForceCloseDepositAccountAction: handle(account, retain, retain_reason, memo)
|
||||
ForceCloseDepositAccountAction->>ForceCloseDepositAccountAction: isFrozen() && hasBalance()? yes
|
||||
ForceCloseDepositAccountAction->>ForceCloseDepositAccountAction: retain_reason 非空? yes
|
||||
ForceCloseDepositAccountAction->>数据库: 开启事务
|
||||
ForceCloseDepositAccountAction->>数据库: 1. balance 不变(5000)
|
||||
ForceCloseDepositAccountAction->>数据库: 2. status=Closed
|
||||
ForceCloseDepositAccountAction->>数据库: 3. meta.force_closed_disposition=retain<br/>+ balance_held_amount=5000<br/>+ balance_held_reason
|
||||
Note over 数据库: 不建 CO/Transaction/Receipt
|
||||
ForceCloseDepositAccountAction->>数据库: 提交事务
|
||||
Filament-->>财务: 成功通知
|
||||
|
||||
Note over 业户家属,财务: 数年后家属持继承公证出现
|
||||
|
||||
业户家属->>财务: 我是继承人,要领回 5000
|
||||
财务->>财务: 核验继承文件
|
||||
财务->>Filament: 开新 DepositAccount + 缴款 5000 (备注"原 retain 转入")
|
||||
财务->>Filament: 立即 RefundAction (5000) → 自动 Closed
|
||||
财务-->>业户家属: 退款 + 红字收据
|
||||
```
|
||||
|
||||
## 流水台账(本场景完整记录)
|
||||
|
||||
| 流水 | 说明 |
|
||||
|---|---|
|
||||
| (无)| 整个 retain 关账过程**没有任何 DepositTransaction**,余额未变,只有账户状态变更 + meta 审计字段 |
|
||||
|
||||
后续如果业户家属出现:
|
||||
|
||||
| 流水 | 说明 |
|
||||
|---|---|
|
||||
| (新账户的)deposit | 把 retain 余额转入新账户 |
|
||||
| (新账户的)refund | 退给业户家属 |
|
||||
|
||||
## meta 字段示例(retain 关账后)
|
||||
|
||||
```json
|
||||
{
|
||||
"force_closed_disposition": "retain",
|
||||
"force_closed_memo": "ForceClose retain,等待清算结果",
|
||||
"force_closed_at": "2026-05-25T14:32:01+08:00",
|
||||
"force_closed_by": 42,
|
||||
"balance_held_amount": 5000.00,
|
||||
"balance_held_reason": "装修公司倒闭,3 户业主代缴款,清算未结"
|
||||
}
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
> [!question] retain 后账户有余额但 status=Closed,这不是矛盾吗?
|
||||
> 不矛盾。Closed 表示"业务终结",`balance` 字段表示"账面余额"。两者**独立**:
|
||||
>
|
||||
> - Closed + balance=0:正常关账(refund / forfeit 后)
|
||||
> - Closed + balance>0:retain 关账,业务终结但资金仍归业户
|
||||
>
|
||||
> 系统设计上,`canBeClosed()` 要求 `balance==0` 是给**正常路径**用的;ForceClose 走专用 Policy 不受此限制。
|
||||
|
||||
> [!question] retain 之后报表上余额怎么算?
|
||||
> 物业代管资金报表:
|
||||
> - 全 Active 账户 `balance` 之和
|
||||
> - **加上** Closed 账户中 `meta.balance_held_amount` 之和
|
||||
>
|
||||
> 后者是"待处置代管资金",银行账户里对应的钱仍属业户。详见 [[audit-monthly-deposit-balance]]。
|
||||
|
||||
> [!question] retain 的资金物业能挪用吗?
|
||||
> **不能,法律上是业户的钱**。物业的会计科目仍为"其他应付款",银行账户里这部分资金做隔离专户最规范。任何挪用都是违法。
|
||||
|
||||
> [!question] 长期 retain(10 年以上)的资金怎么处理?
|
||||
> 根据各地民法 / 物业管理条例,长期无主资金可能转入:
|
||||
> - 街道办无主资金账户
|
||||
> - 公益基金
|
||||
> - 财政
|
||||
>
|
||||
> 具体走流程视司法管辖,**系统不主动处理** —— 物业法务发起,系统配合记录(可能在该账户 meta 加一笔 `transferred_to_*` 备注,或者依照流程做反向 forfeit 然后转出)。
|
||||
|
||||
> [!question] retain 的金额能在已关账户上"动一下"吗(例如部分释放、部分继续保留)?
|
||||
> 不能。账户 Closed 后任何操作都不允许。如果业务需要"部分释放":开新账户 → 把保留余额按 X 元转入(deposit)→ 退给业户(refund)→ 剩余在新账户继续 retain(再 ForceClose retain 一次)。
|
||||
|
||||
> [!question] retain 不写 retain_reason 系统会怎样?
|
||||
> `ForceCloseDepositAccountAction` 会校验失败,抛出错误。Modal 表单也会前端校验阻止提交。这是**刻意设计**:无理由 retain = 后续无法追溯 = 不合规。
|
||||
|
||||
## 异常分支
|
||||
|
||||
- 业户出现配合退款 → 开新账户 + deposit + refund(详见上方"业户出现时"步骤)
|
||||
- 业户最终被司法判定无主 → 物业法务发起转出流程
|
||||
- 短期纠纷不适用 retain → 走 [[freeze-during-dispute]] 然后 [[unfreeze-after-mediation]]
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [[force-close-refund]]
|
||||
- [[force-close-forfeit]]
|
||||
- [[account-state-machine]]
|
||||
- [[freeze-during-dispute]]
|
||||
- [[audit-monthly-deposit-balance]]
|
||||
- [[audit-long-pending-accounts]]
|
||||
Reference in New Issue
Block a user