Skip to content

GL Detail Reports — Cash Account Register & Transaction Detail

Date: 2026-07-01

Problem / motivation

Two Peachtree General Ledger reports drill into posted ledger activity: Cash Account Register ("transactions in a cash account including a running balance") and Transaction Detail Report ("all transactions matching your search criteria"). We have the ledger_entries / ledger_entry_lines data; these expose it as an account register with a running balance and as a filterable line-level detail report. Closes two GL rows on the Peachtree Report Parity tracker.

In scope

  • cash_account_register(account_id, date_filter) — opening balance, then every posted line for that account in the range with a running balance, and the closing balance.
  • transaction_detail_report(date_filter, account_id?, source_type?, generate_csv) — posted ledger lines matching the filters, in date/entry order; CSV-exportable.
  • Posted entries only (is_posted = TRUE). Path.REPORTS.

Out of scope

  • Working Trial Balance (adjustment-column worksheet) — needs persisted adjustments; deferred.
  • Cash Account Register is not restricted to cash-type accounts server-side (any account id works); the frontend passes a bank/cash account. Signed as debit − credit (natural for asset accounts).

Data model changes

None. Reads ledger_entries (entry_date, entry_number, source_type, memo, is_posted) and ledger_entry_lines (account_id, debit_amount, credit_amount, memo) joined to accounts. No migration, no new Path/Resource.

What's being implemented

  • Responsesapp/graphql/reports/strawberry/gl/gl_report_response.py (CashAccountRegisterResponse + line type, TransactionDetailResponse).
  • Repositoryapp/graphql/reports/repositories/gl/gl_report_repository.py (cash_account_opening, cash_account_lines, transaction_detail).
  • Serviceapp/graphql/reports/services/gl/gl_report_service.py.
  • Queriesapp/graphql/reports/queries/gl/gl_report_queries.py.
  • Teststests/graphql/reports/test_gl_reports.py.

GraphQL surface

cashAccountRegister(accountId: UUID!, dateFilter: DateRangeFilter!): CashAccountRegister!
transactionDetailReport(dateFilter: DateRangeFilter!, accountId: UUID, sourceType: SourceType, generateCsv: Boolean! = false): GenericReportPage!

type CashAccountRegister {
  accountCode: Int!, accountName: String, startDate: Date!, endDate: Date!,
  openingBalance: Decimal!, closingBalance: Decimal!, rows: [CashAccountRegisterLine!]!
}
type CashAccountRegisterLine { entryDate: Date!, entryNumber: String!, sourceType: SourceType, memo: String, debitAmount: Decimal!, creditAmount: Decimal!, runningBalance: Decimal! }
type TransactionDetail { entryDate: Date!, entryNumber: String!, sourceType: SourceType, memo: String, accountCode: Int!, accountName: String, lineMemo: String, debitAmount: Decimal!, creditAmount: Decimal! }

Frontend contract

  • Cash Account Register: pick a bank/cash account + date range; render rows with a running balance column; openingBalance/closingBalance bracket the period.
  • Transaction Detail: optional accountId and sourceType filters over a date range; flat line list, generateCsv: truecsvUrl.

Future additions

  • Working Trial Balance once adjustment entries are persisted.