# Generate reports

Source: https://fragment.dev/guides/generate-reports

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

<a id="generate-reports"></a>

Fragment supports queries for generating common financial reports. 

[Visual: generateReports. View on the HTML page.](https://fragment.dev/guides/generate-reports)

<a id="balance-sheet"></a>

## Balance sheet

A balance sheet reports the net worth of a business at the end of a reporting period. 

```graphql title="Balance sheet query"
query GetBalanceSheet(
  $ledgerIk: SafeString!
  $balanceAtEndOf: LastMoment!
  $accountsFilter: LedgerAccountsFilterSet!
  $after: String
) {
  ledger(ledger: { ik: $ledgerIk }) {
    ledgerAccounts(filter: $accountsFilter, after: $after) {
      nodes {
        id
        name
        type
        balance(at: $balanceAtEndOf)
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}
```

```json title="Balance sheet parameters"
{
  "ledgerIk": "ik-used-to-create-ledger",
  "accountsFilter": {
    "type": {
      "in": ["asset", "liability"]
    }
  },
  "balanceAtEndOf": "1969",
  "after": "{{data.ledger.ledgerAccounts.pageInfo.endCursor}}"
}
```

Generate a balance sheet by querying `balance` on all `asset` and `liability` Ledger Accounts.

Providing a [`LastMoment`](https://fragment.dev/markdown/api-reference/ledger-types.md#scalars-and-enums-lastmoment) to the `at` parameter on `balance` returns the balance at the end of that period. Values provided to `in` operators are OR'd, so both `asset` and `liability` accounts are returned.

<a id="income-statement"></a>

## Income statement

An income statement reports how a business's net worth changed over the course of a reporting period. 

```graphql title="Income statement query"
query GetIncomeStatement(
  $ledgerIk: SafeString!
  $balanceChangeDuring: Period!
  $accountsFilter: LedgerAccountsFilterSet!
  $after: String
) {
  ledger(ledger: { ik: $ledgerIk }) {
    ledgerAccounts(filter: $accountsFilter, after: $after) {
      nodes {
        path
        name
        type
        balanceChange(period: $balanceChangeDuring)
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}
```

```json title="Income statement parameters"
{
  "ledgerIk": "ik-used-to-create-ledger",
  "accountsFilter": {
    "type": {
      "in": ["income", "expense"]
    }
  },
  "balanceChangeDuring": "1969",
  "after": "{{data.ledger.ledgerAccounts.pageInfo.endCursor}}"
}
```

Generate an income statement by querying `balanceChange` on all `income` and `expense` Ledger Accounts.

Providing a [`Period`](https://fragment.dev/markdown/api-reference/ledger-types.md#scalars-and-enums-period) to the `period` parameter on `balanceChange` retrieves the difference in the Ledger Account's balance between the start and end of that period.

<a id="account-statement"></a>

## Account statement

An account statement reports how a Ledger Account changed over the course of a reporting period. It contains a Ledger Account's starting balance, ending balance and all Ledger Lines posted to it.

```graphql title="Monthly account statement query"
query GetAccountStatement(
  $accountMatch: LedgerAccountMatchInput!
  $startingBalanceAtEndOf: LastMoment!
  $endingBalanceAtEndOf: LastMoment!
  $linesFilter: LedgerLinesFilterSet!
  $after: String
) {
  ledgerAccount(ledgerAccount: $accountMatch) {
    path
    name
    type
    startingBalance: balance(at: $startingBalanceAtEndOf)
    endingBalance: balance(at: $endingBalanceAtEndOf)
    lines(filter: $linesFilter, after: $after) {
      nodes {
        id
        key
        posted
        description
        amount
        ledgerEntryId
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}
```

```json title="Monthly account statement variables"
{
  "accountMatch": {
    "ledger": {
      "ik": "ik-used-to-create-ledger"
    },
    "path": "liabilities/customer-deposits/customer:123"
  },
  "linesFilter": {
    "posted": {
      "after": "1969-07-01T00:00:00.000Z",
      "before": "1969-07-30T23:59:59.999Z"
    }
  },
  "startingBalanceAtEndOf": "1969-06",
  "endingBalanceAtEndOf": "1969-07",
  "after": "{{data.ledgerAccount.lines.pageInfo.endCursor}}"
}
```

Generate an account statement by querying for `balance` and `lines` on a Ledger Account.

Get the starting balance by passing a [`DateTime`](https://fragment.dev/markdown/api-reference/ledger-types.md#scalars-and-enums-datetime) to the `at` parameter on `balance`. Use a GraphQL alias to make multiple `balance` queries within one request.

To get all Ledger Lines that were posted during the reporting period, use the `filter` parameter on `lines`. The `after` and `before` filters are inclusive, so use timestamps for the first and last moments of the reporting period.

<a id="journal-export"></a>

## Journal export

A journal export lists all Ledger Entries posted to a Ledger during a reporting period.

```graphql title="Journal export query"
query GetJournalExport(
  $ledgerIk: SafeString!
  $entriesFilter: LedgerEntriesFilterSet!
  $after: String
) {
  ledger(ledger: { ik: $ledgerIk }) {
    ledgerEntries(filter: $entriesFilter, after: $after) {
      nodes {
        id
        type
        posted
        description
        lines {
          nodes {
            id
            description
            account {
              name
              path
              type
            }
            amount
          }
        }
      }
      pageInfo {
        hasNextPage
        endCursor
      }
    }
  }
}
```

```json title="Journal export variables"
{
  "ledgerIk": "ik-used-to-create-ledger",
  "entriesFilter": {
    "posted": {
      "after": "1969-01-01T00:00:00.000Z",
      "before": "1969-03-31T23:59:59.999Z"
    }
  },
  "after": "{{data.ledger.ledgerEntries.pageInfo.endCursor}}"
}
```

Generate a journal export by listing Ledger Entries. For each Ledger Entry, include its Ledger Lines and their Ledger Accounts.

This can be a long list, so query `pageInfo` to get a [pagination cursor](https://fragment.dev/markdown/guides/query-data.md#basics-pagination). It can be passed to the `after` parameter on `ledgerEntries` to page through the results.
