FRAGMENT supports querying a Ledger Account for its latest balances, historical balances and balance changes.
Use the ledgerAccount
query to look up a Ledger Account's balance.
query GetBalance(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
balance
}
}
{
"ledgerAccount": {
"path": "assets/banks/user-cash",
"ledger": {
"ik": "quickstart-ledger"
}
}
}
Ledger Accounts have three balances:
ownBalance
is the sum of all Ledger Lines posted to the Ledger Account, excluding Ledger Lines in child Ledger AccountschildBalance
is the sum of all Ledger Lines posted to the children of this Ledger Accountbalance
is the sum of all Ledger Lines posted to this Ledger Account and its childrenquery GetAggregatedBalances(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
childBalance
balance
}
}
{
"ledgerAccount": {
"path": "liabilities/users"
}
}
Balance reads are eventually consistent by default. This means that the balance may not reflect all the Ledger Lines in the account.
To read a strongly consistent balance, a Ledger Account must have its balances updated in a strongly consistent manner. This is set in the Schema on a Ledger Account's consistencyConfig
:
{
"key": "strongly-consistent-ledger-accounts",
"name": "Strongly consistent Ledger Accounts",
"chartOfAccounts": {
"defaultCurrency": { "code": "USD" },
"accounts": [
{
"key": "liabilities",
"type": "liability",
"children": [
{
"key": "users",
"template": true,
"consistencyConfig": {
"ownBalanceUpdates": "strong"
},
"children": [
{
"key": "available",
"consistencyConfig": {
"ownBalanceUpdates": "strong"
}
},
{
"key": "pending"
},
{
"key": "blocked"
}
]
}
]
}
]
}
}
Once a Ledger Account's balance is updated consistently, set the consistencyMode
on balance queries to determine the consistency of the read you issue.
query GetStronglyConsistentBalance(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
ownBalance(consistencyMode: strong)
}
}
consistencyMode
can be set to:
strong
to perform a strongly consistent balance readeventual
to perform an eventually consistent balance readuse_account
to use the value of consistencyConfig.ownBalanceUpdates
when performing a balance read{
"ledgerAccount": {
"path": "liabilities/users:user-1/available",
"ledger": {
"ik": "quickstart-ledger"
}
}
}
Only ownBalance
can be queried with consistencyMode: strong
.
Read the Configure consistency section to learn more about FRAGMENT's consistency semantics and Ledger Account consistency modes.
To query the balance of a Ledger Account at a particular point in time use the at
argument:
query GetHistoricalBalances(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
end_of_year: balance(at: "1969")
end_of_month: balance(at: "1969-07")
end_of_day: balance(at: "1969-07-21")
end_of_hour: balance(at: "1969-07-21T02")
}
}
If you don't specify at
, you'll get the latest balance. at
is supported for all balances and works granularly to the hour.
You can also query the net change on a Ledger Account over a specific reporting period. This can be useful for generating financial statements.
Similar to balances, there are three types of balance changes:
ownBalanceChange
, how much ownBalance
changedchildBalanceChange
, how much childBalance
changedbalanceChange
, how much balance
changedBalance change queries require you to specify a period
. This can be a year, quarter, month, day or hour.
query GetBalanceChanges(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
ownBalanceChange(period: "1969")
childBalanceChange(period: "1969")
balanceChange(period: "1969")
currentYear: balanceChange(period: "1969")
lastYear: balanceChange(period: "1968")
lastYearQ4: balanceChange(period: "1968-Q4")
lastYearDecember: balanceChange(period: "1968-12")
lastYearChristmas: balanceChange(period: "1968-12-25")
lastYearLastHour: balanceChange(period: "1968-12-31T23")
}
}
You can also perform multiple balance queries using aliases.
{
"ledgerAccount": {
"path": "liabilities/users:user-1/available",
"ledger": {
"ik": "quickstart-ledger"
}
}
}
For Ledger Accounts in currencyMode: multi
, use the currency
argument to query the balance in a specific currency.
query GetMultiCurrencyBalances(
$ledgerAccount: LedgerAccountMatchInput!
) {
ledgerAccount(ledgerAccount: $ledgerAccount) {
latestUSDBalance: balance(currency: { code: USD })
latestGBPBalance: balance(currency: { code: GBP })
USDBalanceChange:
balanceChange(period: "1969", currency: { code: USD })
GBPBalanceChange:
balanceChange(period: "1969", currency: { code: GBP })
}
}
{
"ledgerAccount": {
"path": "liabilities/users:user-1/available",
"ledger": {
"ik": "quickstart-ledger"
}
}
}
You can also query balances in all of a multi-currency Ledger Account's currencies, see Handle currencies.
Balance queries respect the Ledger's balanceUTCOffset
when specifying periods and times. This field is specified when creating the Ledger.
-08:00
, then querying balance(at: "1969-01-31")
returns the balance at midnight PT on that date, or 8am on 1969-02-01 UTC.balanceChange(period: "1969")
returns the net change between 8am on 1969-01-01 UTC and 8am on 1969-01-01 UTC. This gives you the net change between midnights local time.