Files
uniprop-manual/prop-acc/scenarios/deposit/close-manual-with-zero-balance.md
2026-05-25 22:32:40 +08:00

143 lines
5.4 KiB
Markdown

---
title: prop-acc · deposit · 场景 - 主动关账(已无业务往来)
aliases:
- 主动关账
- 手工关押金账户
- close-manual-with-zero-balance
- 场景-押金账户主动关账
tags:
- 场景
- prop-acc
- 保证金
- 结清
audience:
- 业务人员
status: 已发布
sub_feature: deposit
last_review: 2026-05-25
code_version: 2026-05-22
---
# 场景:主动关账(已无业务往来)
账户**余额本来就是 0**(从未缴款、或之前已通过其他流程退完),物业财务想把账户**主动归档**,走 `CloseAction` 手工关账。比 [[close-after-zero-balance|自动关账]] 罕见,但 UI 仍提供。
## 典型情境
> [!example] 真实情境
> 一年前物业为某业户开了押金账户,但**业户最终没装修**(改主意了),账户始终余额 0、状态 Active。一年后清理账户列表时,物业财务想把这种"挂着但没用过"的账户关掉,避免长期占列。
## 业务人员视角(本场景**业户无感**)
> [!info] 业户视角
> 业户从未缴款、也没动账户,**完全感受不到**这个操作。不会收到通知,也不会拿到收据(没有资金流水,Listener 不触发)。
### 适用前提
- 账户 `status = Active`
- 账户 `balance == 0`
- 业务上已确认**确实无后续业务**(联系业户确认或长期无动静)
### 第 1 步:打开账户
后台 → 保证金 → 账户列表 → 按"余额=0 + 状态=Active"过滤 → 找到目标账户。
### 第 2 步:点击 `CloseAction`(标签"关账")
右上角状态管理组。Modal 表单:
| 字段 | 填什么 |
|---|---|
| **关账事由(memo)** | 必填,如 "账户未缴款,业户已确认无装修计划" |
> [!warning] Policy 守护
> `CloseAction` 调 `canBeClosed()`:
> - `balance == 0` ✅
> - `status !== Closed` ✅
> 满足这两条即可关,**不要求 Active**(理论上 Frozen + balance==0 也行,但 Frozen 状态下通常先解冻再关)。
### 第 3 步:提交
系统调 `DepositAccount::close($memo)`,事务内:
1. 校验 `canBeClosed()`
2. 更新 `status=Closed`
3.`meta.close_memo` 记关账事由
4.`meta.closed_at` 记关账时间
**不产生** `DepositTransaction`(没有资金流水)、**不产生** `CollectionOrder`、**不产生** `Receipt`
### 第 4 步:无需通知业户
业务上无变化,业户无感知。如果业务上认为需要(例如告知业户"我们这边把账户归档了,以后要装修请重新申请开户"),走线下沟通,不走系统通知。
## 系统流程
```mermaid
sequenceDiagram
participant 财务
participant Filament
participant 数据库
Note over 财务: 找到一年前开的空账户
财务->>Filament: ViewDepositAccount → CloseAction(modal, memo)
Filament->>数据库: 校验 canBeClosed() (balance==0, status!=Closed) → true
Filament->>数据库: 更新 status=Closed + meta.close_memo + meta.closed_at
数据库-->>Filament: ok
Filament-->>财务: 成功通知
Note over 数据库: 无 Transaction,无 CO,无 Receipt
```
## 流水台账(本场景完整记录)
| 流水 | 说明 |
|---|---|
| (无)| 账户从开户到关账,无任何 DepositTransaction |
只有账户本身的 `status` 字段从 `Active``Closed`,`meta` 加几个审计字段。
## 常见问题
> [!question] 没有流水的账户也算有效记录吗?
> 算。`DepositAccount` 本身是审计对象,记录了开户时间、缴款人信息、关账事由,具备完整的"开-关"生命周期文档,即使中间没有资金往来。
> [!question] 业务上常见这种"开了不缴"的账户吗?
> 不应常见。如果一个物业项目积累了很多空账户,说明**开户流程**有问题(业户开始装修前就开账户,但有相当比例改主意)。建议改流程为"业户决定装修当天才开账户",降低空账户产生率。
> [!question] 主动关账后能反悔重开吗?
> **不能**。`canBeReopened()` 永远 false。如果业户后来真的要装修,**开新账户**。
> [!question] 余额非 0 主动关账可以吗?
> **不能**。`canBeClosed()` 要求 `balance==0`。如果账户有余额但要终结:
> - Active + 有余额 → 走 [[refund-full-no-damage|退款]] 或 [[forfeit-damage-public-area|扣罚]] 清零后自动关
> - Frozen + 有余额 → 走 [[force-close-refund]] / [[force-close-forfeit]] / [[force-close-retain]] 强制关账
> [!question] 主动关账和自动关账的区别?
> 主要区别在**触发方式**和**业务背景**:
>
> | 维度 | 自动关账([[close-after-zero-balance]]) | 主动关账(本场景) |
> |---|---|---|
> | 触发 | 最后一笔 Refund / Forfeiture 使余额变 0 | 手工 `CloseAction` |
> | 业务背景 | 有缴款也有退/扣的完整生命周期 | 通常无缴款,只是清理 |
> | 流水台账 | 有 | 无 |
> | 业户感知 | 收到最后一张红字收据 | 无感 |
> | 频率 | 大量(每个正常退还都触发)| 罕见(清理用)|
> [!question] 批量关账(同时关多个空账户)有功能吗?
> 当前没有。如果要清理 100+ 空账户,需要在 List 页加批量操作,或运维 tinker。
## 异常分支
- 余额非 0 想强制关 → [[force-close-refund]] / [[force-close-forfeit]] / [[force-close-retain]]
- 已关账户想恢复使用 → 不可逆,开新账户
- Frozen 账户余额 0 想关 → 先 [[unfreeze-after-mediation]] 再走本流程,或直接走 [[force-close-retain]]
## 相关文档
- [[close-after-zero-balance]]
- [[account-state-machine]]
- [[deposit-first-time-renovation]]
- [[audit-long-pending-accounts]]