Files
uniprop-manual/prop-acc/scenarios/deposit/force-close-retain.md
2026-05-25 22:37:41 +08:00

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 · 场景 - 资金保留并关账(法律保留/业户失联)
强制保留关账
ForceClose retain
资金保留归档
force-close-retain
场景-押金资金保留关账
场景
prop-acc
保证金
强制关账
业务人员
已发布 deposit 2026-05-25 2026-05-22

场景:资金保留并关账(法律保留 / 业户失联)

账户 Frozen 状态、有余额,但不确定该退还还是扣罚 —— 业户失联、遗产分配延迟、法律保留期未满、案件审理中等。物业用 ForceCloseActionretain 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。所有"业户回来了"的处理都通过新账户走。

系统流程

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

相关文档