---
id: JNY-ACC-TRX-004
title: Approve an overpayment return and retain the remainder
feature: FEAT-ACC-TRX-04
product_area: accounting
module: transactions
revision: 1
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - ACT-ACC-0310
  - ACT-ACC-0311
  - ACT-ACC-0313
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-accounting: f47cb263875bbc0c5640fba7dae6785ec32695f8
actor: ACT-ACC-012
goal: Return 30.00 from a check overpayment with independent approval and retain another 20.00 as credit.
capabilities:
  - CAP-ACC-TRX-006
  - CAP-ACC-TRX-012
  - CAP-ACC-TRX-011
screens:
  - '/console/{tenantId}/accounting/payments/{paymentId}'
  - '/console/{tenantId}/accounting/refunds/{refundId}'
  - '/console/{tenantId}/accounting/credits/{creditId}'
steps:
  - 'n': 1
    surface: '/console/{tenantId}/accounting/payments/{paymentId}'
    action: Request a 30.00 check return from a 150.00 receipt with 100.00 allocated.
    capability: CAP-ACC-TRX-012
    expected: Approval wait reserves 30.00 and leaves only 20.00 otherwise refundable.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0313.spec.ts#ACT-ACC-0313'
  - 'n': 2
    surface: '/console/{tenantId}/accounting/refunds/{refundId}'
    action: 'Attempt requester approval, then authorize through a different approver.'
    capability: CAP-ACC-TRX-012
    expected: Self-approval fails and independent approval permits the requested stage.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/refunds/refunds.integration.spec.js#it
      is approved by another person (requested, approved_by_id theirs), then executed
  - 'n': 3
    surface: '/console/{tenantId}/accounting/refunds/{refundId}'
    action: Execute the offline refund using its permitted check-number entry.
    capability: CAP-ACC-TRX-012
    expected: Offline completion makes the receipt partly refunded.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0311.spec.ts#ACT-ACC-0311'
  - 'n': 4
    surface: '/console/{tenantId}/accounting/payments/{paymentId}'
    action: Issue credit from the remaining 20.00.
    capability: CAP-ACC-TRX-011
    expected: The open credit consumes available receipt value and prevents source-payment void while live.
    provenance: test
    source: 'react-console:acceptance/accounting/playwright/journeys/payments/ACT-ACC-0310.spec.ts#ACT-ACC-0310'
alternates:
  - from_step: 1
    condition: Independent refund approval is disabled.
    path: Request can proceed directly to execution.
    outcome: The separate approval stage is unnecessary.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/e2e/refunds.e2e.spec.js#it pays a refund in the request
      itself with execute: true
  - from_step: 1
    condition: The original excess came through a card.
    path: Select its processor return path rather than an ordinary check return.
    outcome: Original-method treatment applies unless the supported fallback conditions are met.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/refunds/refund-card-original-method.integration.spec.js#it
      refuses a check refund of the card’s unapplied money, saying the money goes back to the card
failures:
  - from_step: 1
    condition: Another operation tries to consume reserved refund value.
    path: 'Application, credit or repeat-refund eligibility rejects reuse.'
    outcome: The first return keeps its held value.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/refunds/refund-reservation.integration.spec.js#it
      refuses a credit of the reserved money, and a second refund of it (over_refund)
rules_in_play:
  - BR-CAP-ACC-TRX-012-01
  - BR-CAP-ACC-TRX-012-02
  - BR-CAP-ACC-TRX-012-05
  - BR-CAP-ACC-TRX-012-07
  - BR-CAP-ACC-TRX-011-02
  - BR-CAP-ACC-TRX-013-05
assertions:
  - id: AS-JNY-ACC-TRX-004-01
    statement: An approval-required request cannot authorize its own requester.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/refunds/refunds.integration.spec.js#it
      requests it pending_approval, refusing to execute it (refund_not_requested) or to let the requester
      approve it (self_approval)
  - id: AS-JNY-ACC-TRX-004-02
    statement: Offline execution converts the reserved value into returned value.
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/refunds/refund-reservation.integration.spec.js#it
      turns the reservation into the refunded amount when the refund is paid offline
  - id: AS-JNY-ACC-TRX-004-03
    statement: 'After return and credit consume the excess, the receipt retains no net held value.'
    provenance: test
    source: >-
      services-accounting:modules/transactions/tests/integration/services/credits/credits.integration.spec.js#it
      mirrors the money’s move in the facts: plus on the payment item, minus on the credit item
e2e_policy: required
e2e_reason: >-
  Requester and approver actions need browser coverage with separate identities; enabling the approval setting
  still uses the service.
proved_by: []
---

# Approve an overpayment return and retain the remainder

## Story

A check leaves 50.00 after settling the member’s debt. Staff request 30.00 back and a colleague approves because the workspace requires independent authorization. That value stays reserved until the check refund is recorded. Staff then retain the remaining 20.00 as customer credit. The source receipt holds no available excess, while its refund and credit explain where the money went.
