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.
a. Reversing Entries
#Call the reverseLedgerEntry mutation to reverse a posted Ledger Entry:
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
}
}
}{
"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. Attempting to reverse a reversing Ledger Entry will return isIkReplay: true.
The new, reversing, Ledger Entry will have:
- Ledger Lines of the opposite
amountvalues in the same currency as the original Ledger Entry. - The same
postedtimestamp as the original Ledger Entry. This ensures that the net balance change at thepostedtimestamp is 0. - A unique
createdtimestamp, set to the time of posting. - The same Tags and Groups as the original Ledger Entry.
- A
reversesfield that points to the original Ledger Entry. - A
reversalPositionvalue of one greater than the original Ledger Entry. This position value is 1 indexed.
The reversed Ledger Entry will be updated to include:
- A
reversedByfield that points to the reversing Ledger Entry. - A
reversedAttimestamp that is thecreatedtimestamp 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.
b. 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.
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
}
}
}{
"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"
}
}
}mutation ReconcileTx(
$entry: LedgerEntryInput!
) {
reconcileTx(
entry: $entry
) {
... on ReconcileTxResult {
entry {
type
created
posted
reversalPosition
}
lines {
amount
key
description
account {
path
}
}
}
... on Error {
code
message
}
}
}{
"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.
c. Querying Reversals
#Use the ledgerEntryHistory query to get the full history of a Ledger Entry with reversals. Lookups by IK for a reversing or reversed Ledger Entry will return a ledger_entry_not_found BadRequestError.
Additionally, Ledger Entries have a reversalHistory field that returns a list of all Ledger Entries and their reversals that share an ik.