# ReverseBankReconciliation

## Permission Scope

reconciliation

## Overview

reverseBankReconciliation adds an immutable UNRECONCILE history group containing the original source items.

## Business Rules

- Original reconciliation must exist and have action RECONCILE
- Original reconciliation can be reversed at most once
- UNRECONCILE history copies source types, source IDs, and cleared amounts
- Each statement line must currently reference the reconciliation being reversed
- Reversal clears `currentBankReconciliationId` and restores `reconciliationStatus` to UNRECONCILED
- The statement line then becomes eligible for reconciliation again
- Direct reconciliation reversal creates no journal
- Indirect reconciliation reversal reverses the original bank-to-clearing journal
- Reconciliation reversal and any related journal reversal use the current operation date

## Process Flow

```mermaid
flowchart LR
    A[Receive original ID] --> B[Lock and validate original]
    B --> C[Copy original source items]
    C --> D[Create UNRECONCILE history group]
    D --> E{Original had indirect amount?}
    E -->|No| F[Return reversal]
    E -->|Yes| G[Reverse original journal entry]
    G --> F
```

## External Dependencies

- financial-accounting::GetJournalEntryBySource
- financial-accounting::GetPeriodByDate
- financial-accounting::ReverseJournalEntry

## Error Scenarios

- **CASH_BANK_RECONCILIATION_NOT_FOUND**: Original does not exist
- **CASH_BANK_RECONCILIATION_INVALID**: Target or original group is invalid
- **CASH_BANK_RECONCILIATION_ACCOUNTING_PERIOD_NOT_FOUND**: Reversal period does not exist
- **CASH_BANK_RECONCILIATION_JOURNAL_FAILED**: Original journal reversal failed

## Test Cases

- creates a reversing group with the original source items
- reverses the original journal entry for an indirect reconciliation
