# Reverse Ledger Entries

Source: https://fragment.dev/guides/reverse-ledger-entries

[Documentation index](https://fragment.dev/llms.txt)

<a id="reverse-ledger-entries"></a>

To correct mistakes, you can reverse a Ledger Entry that you've posted to Fragment. Reversing a Ledger Entry posts a new Ledger Entry that offsets the original Ledger Entry.

[Visual: reversals. View on the HTML page.](https://fragment.dev/guides/reverse-ledger-entries)

<a id="reversing-entries"></a>

## Reversing Entries

Call the `reverseLedgerEntry` mutation to reverse a posted Ledger Entry:

```graphql title="reverseLedgerEntry mutation" expandable
mutation ReverseLedgerEntry(
  $id: ID!
) {
  reverseLedgerEntry(
    id: $id
  ) {
    __typename
    ... on ReverseLedgerEntryResult {
      reversingLedgerEntry {
        ik
        id
        type
        posted
        created
        reverses {
          id
          created
        }
        reversalPosition
      }
      reversedLedgerEntry {
        ik
        id
        type
        posted
        created
        reversedBy {
          id
          created
        }
        reversalPosition
        reversedAt
      }
      isIkReplay
    }
    ... on Error {
      code
      message
    }
  }
}
```

```json title="reverseLedgerEntry variables"
{
  "id": "<ID of the entry to reverse>"
}
```

You cannot reverse a Ledger Entry using `ik` because the reversing, reversed, and any subsequent reposting of the Ledger Entry will all share the same `ik`. This ensures all versions of a Ledger Entry are [idempotent](https://fragment.dev/markdown/api-reference/ledger-overview.md#idempotency). Attempting to reverse a reversing Ledger Entry will return `isIkReplay: true`.

The new, reversing, Ledger Entry will have:
- Ledger Lines of the opposite `amount` values in the same currency as the original Ledger Entry. 
- The same `posted` timestamp as the original Ledger Entry. This ensures that the net balance change at the `posted` timestamp is 0. 
- A unique `created` timestamp, set to the time of posting.
- The same Tags and Groups as the original Ledger Entry. 
- A `reverses` field that points to the original Ledger Entry.
- A `reversalPosition` value of one greater than the original Ledger Entry. This position value is 1 indexed.

The reversed Ledger Entry will be updated to include:
- A `reversedBy` field that points to the reversing Ledger Entry.
- A `reversedAt` timestamp that is the `created` timestamp of the reversing Ledger Entry.

After calling `reverseLedgerEntry`, both the reversing and reversed Ledger Entries are immutable and can no longer be updated using `updateLedgerEntry`.

<a id="reposting-entries"></a>

## Reposting Entries

Once a Ledger Entry has been reversed, it can be reposted by using the same `ik` value. Any Entry Type can be used for the reposted Ledger Entry. To do so, simply use the `addLedgerEntry` or `reconcileTx` mutation.

```graphql title="addLedgerEntry mutation" expandable
mutation AddLedgerEntry(
  $ik: SafeString!
  $entry: LedgerEntryInput!
) {
  addLedgerEntry(
    ik: $ik,
    entry: $entry
  ) {
    __typename
    ... on AddLedgerEntryResult {
      entry {
        type
        created
        posted
        reversalPosition
      }
      lines {
        amount
        key
        description
        account {
          path
        }
      }
    }
    ... on Error {
      code
      message
    }
  }
}
```

```json title="addLedgerEntry variables"
{
  "ik": "add-ledger-entry",
  "entry": {
    "ledger": {
      "ik": "quickstart-ledger"
    },
    "type": "user_funds_account",
    "posted": "1234-01-01T01:01:01",
    "parameters": {
      "user_id": "testing-user",
      "funding_amount": "400"
    }
  }
}
```

```graphql title="reconcileTx mutation" expandable
mutation ReconcileTx(
  $entry: LedgerEntryInput!
) {
  reconcileTx(
    entry: $entry
  ) {
    ... on ReconcileTxResult {
      entry {
        type
        created
        posted
        reversalPosition
      }
      lines {
        amount
        key
        description
        account {
          path
        }
      }
    }
    ... on Error {
      code
      message
    }
  }
}
```

```json title="reconcileTx variables"
{
  "entry": {
    "type": "user_funding",
    "ledger": {
      "ik": "quickstart-ledger"
    },
    "parameters": {
      "txId": "tx_12345",
      "customerId": "customer-1"
    }
  }
}
```

The newly posted Ledger Entry will have a `reversalPosition` value of one greater than the previous reversal Ledger Entry. 

<a id="querying-reversals"></a>

## Querying Reversals

Use the [ledgerEntryHistory](https://fragment.dev/markdown/api-reference/ledger-queries.md#ledgerentryhistory) query to get the full history of a Ledger Entry with reversals. [Lookups](https://fragment.dev/markdown/guides/query-data.md#ledger-entries-lookup) by IK for a reversing or reversed Ledger Entry will return a `ledger_entry_not_found` `BadRequestError`. 

Additionally, Ledger Entries have a [`reversalHistory`](https://fragment.dev/markdown/api-reference/ledger-types.md#core-types-ledgerentry) field that returns a list of all Ledger Entries and their reversals that share an `ik`.

<a id="hidden-filter"></a>

## Hidden Filter

Once a Ledger Entry has been reversed it is hidden from your list of Ledger Entries. For debugging, you can [query hidden Ledger Entries](https://fragment.dev/markdown/guides/query-data.md#ledger-entries-list-hidden).
