Files
uniprop-manual/prop-acc/scenarios/deposit/refund-partial-after-forfeit.md
2026-05-25 22:27:38 +08:00

6.1 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 · 场景 - 部分扣罚后退还差额
扣罚后退差额
部分退款
refund-partial-after-forfeit
场景-押金扣罚后退差额
场景
prop-acc
保证金
退款
扣罚
业户
业务人员
已发布 deposit 2026-05-25 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 张扣罚说明(可选,详细解释扣罚事由)交业户

系统流程

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,等沟通 / 调解结果再操作:

[!question] 扣罚 + 退款必须连续做吗? 不必须。可以:

  • 验收当天先扣罚(留账户 Active 余额 ¥4,200)
  • 第二天业户提供回款账号后再退 中间间隔多久都行,只要账户保持 Active。

[!question] 扣罚的钱去哪了? 扣罚的 CollectionOrder 是红字,actual_amount=-800,但这笔钱实际上从"代管负债"科目转入"装修维修收入"科目(物业收入)。账上的资金从未离开物业账户,只是性质从"代管"变为"收入"。

[!question] 一次扣罚不够后续追加可以吗? 可以。例如先扣 ¥500,事后发现另有损坏再扣 ¥300。每次独立 ForfeitureAction,账户余额累计减少。

[!question] 扣罚 + 退款后业户反悔说"墙是装修前就坏的"? 走 freeze-during-dispute 已晚(账户已 Closed)。线下沟通 + 财务通过 tinker / 后端补正(走 deposit 一笔反向流水冲),业务上属"事后追溯",系统不主动支持。

异常分支

相关文档