9.8 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 |
场景:资金保留并关账(法律保留 / 业户失联)
账户 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),事务内:
- 校验
isFrozen() && hasBalance() - 校验
retain_reason非空 - 不建 CollectionOrder(没有资金动作,余额不变)
- 不建 DepositTransaction(同上)
- 不建 Receipt(同上)
- 更新
status=Closed(从 Frozen) - 在
meta写入审计字段:force_closed_disposition: 'retain'force_closed_memo: ...force_closed_at: nowbalance_held_amount: 保留的金额balance_held_reason: retain_reason 的副本
- 账户
balance字段保持原值(例如 ¥5,000)—— 不清零
第 5 步:线下记录归档
- 物业财务把这种"已 Closed 但有余额"账户列入待处理代管资金清单
- 银行账户里对应的资金做专项隔离(账面与物业自有资金分开)
- 每月 / 每季对账时核对
第 6 步:业户出现时
业户(或家属 / 继承人 / 清算人)出现并出示合法身份后:
| 选项 | 操作 |
|---|---|
| 退还给业户 | 开新账户 → 走 Deposit 把 retain 余额转入新账户(系统层 deposit + 备注"原 retain 账户转入")→ 立刻 [[refund-full-no-damage |
| 扣罚处理 | 开新账户 → 同上流程 → [[forfeit-damage-public-area |
| 物业内部决议无主资金 | 走法律程序(物业法务 / 街道办)→ 司法判决归属 → 按判决处理 |
[!warning] 不要试图"重启" Closed 账户 Closed 账户永久关闭。
canBeReopened永远 false。所有"业户回来了"的处理都通过新账户走。
系统流程
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 关账后)
{
"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