Chart of Accounts

The chart of accounts is the foundation of the CEF Core general ledger. Every journal entry, subledger posting, and financial report maps back to accounts defined here.

Account Structure

CEF Core organizes the chart of accounts into five standard account types. Each type occupies a dedicated GL code range and carries a defined normal balance that determines how debits and credits affect the account.

Account TypeGL Code RangeNormal BalanceDebit Effect
ASSET1000 - 1999DEBITIncreases balance
LIABILITY2000 - 2999CREDITDecreases balance
EQUITY3000 - 3999CREDITDecreases balance
REVENUE4000 - 4999CREDITDecreases balance
EXPENSE6000 - 6999DEBITIncreases balance

Key Principle: Assets and expenses have debit normal balances. Liabilities, equity, and revenue have credit normal balances. A debit to an asset increases it; a debit to a liability decreases it. This follows standard double-entry bookkeeping rules enforced by the GL engine.

Key CEF Accounts

These are the primary accounts used across the CEF Core subledgers. Each subledger posts to specific GL codes automatically when transactions are recorded.

Asset Accounts (1000-series)

1010 - Operating Checking

Primary operating bank account. Updated by the Cash subledger when receipts and disbursements are recorded. Reconciled daily via the tie-out job against the cash.cash_account table.

DEBIT

1200 - Loans Receivable

Total outstanding principal balance of all active loans. Debited when a loan is disbursed, credited when principal payments are received. Tied out daily against the sum of loans.loan balances.

DEBIT

1300 - Accrued Interest Receivable

Interest earned on loans but not yet received in cash. Debited when interest accrues, credited when the borrower pays. Accrual runs every 15 minutes via the tenantAccrualCheck scheduled job.

DEBIT

1400 - Allowance for Loan Losses

Contra-asset account representing estimated uncollectible loan balances. Credited to increase the reserve, debited when a loan is charged off. Reported as a negative on the balance sheet.

CREDIT (contra)

Liability Accounts (2000-series)

2000 - Investor Notes Payable

Total principal owed to investors who hold notes with the fund. Credited when a new note is issued, debited when a note is redeemed. Tied out daily against the sum of investor_notes.note balances.

CREDIT

2100 - Accrued Interest Payable

Interest owed to investors on their notes but not yet paid out. Credited when interest accrues on notes, debited when interest payments are disbursed.

CREDIT

Equity, Revenue, and Expense Accounts

3100 - Retained Earnings

Accumulated net income from all prior periods. Updated during year-end close when revenue and expense accounts are zeroed out.

4000 - Interest Income - Loans

Revenue from interest charged on outstanding loans. Credited when loan interest accrues or when interest payments are received. This is the fund's primary revenue source.

6000 - Interest Expense - Notes

Cost of interest paid or accrued to investors on their notes. Debited when note interest accrues. The spread between 4000 and 6000 is the fund's net interest margin.

Parent-Child Hierarchy

Accounts can be organized into a parent-child hierarchy for reporting purposes. Parent accounts aggregate the balances of their children on financial statements.

Example Hierarchy:

1000 - Total Assets (parent)

1010 - Operating Checking

1020 - Money Market Account

1200 - Loans Receivable

1210 - Church Building Loans

1220 - Parsonage Loans

1230 - Construction Loans

1300 - Accrued Interest Receivable

1400 - Allowance for Loan Losses

Parent accounts cannot receive direct journal entry postings. Only leaf-level (child) accounts accept debits and credits. The parent account balance is always the sum of its children.

Important: Do not post journal entries to parent accounts. The system will reject the entry with a validation error. Always post to the most specific child account.

Adding and Managing Accounts

To manage the chart of accounts, navigate to Accounting → Chart of Accounts in the sidebar. You must have ADMIN or TREASURY role.

Creating a New Account

  1. Click "+ New Account": Opens the account creation form.
  2. Enter the GL code: Must fall within the correct range for the account type (e.g., 1000-1999 for assets). Codes must be unique across the chart.
  3. Set the account name: Use a descriptive name that clearly identifies the account purpose (e.g., "Construction Loan Reserve").
  4. Select the account type: ASSET, LIABILITY, EQUITY, REVENUE, or EXPENSE. This determines the normal balance and which financial statements include it.
  5. Assign a parent (optional): Select an existing account as the parent to create a hierarchy.
  6. Save: The system validates the GL code range, uniqueness, and hierarchy, then creates the account.

Deactivating an Account

Accounts with a zero balance can be deactivated to hide them from daily use while preserving historical data. Deactivated accounts no longer appear in the GL code dropdown when creating journal entries but remain visible in historical reports.

Filter the chart of accounts view using the ?active=true or ?active=false query parameter to see only active or inactive accounts.

Important: You cannot deactivate an account that has a non-zero balance. Pay down or transfer the balance first, then deactivate. Accounts cannot be deleted -- only deactivated via soft delete.

How Subledgers Post to GL Codes

Each subledger in CEF Core automatically generates journal entries when transactions are recorded. The following table shows which GL accounts are affected by common subledger operations.

SubledgerTransactionDebitCredit
LoansLoan disbursement1200 Loans Receivable1010 Operating Checking
LoansLoan payment (principal)1010 Operating Checking1200 Loans Receivable
LoansInterest accrual1300 Accrued Interest Recv.4000 Interest Income
Investor NotesNote issued1010 Operating Checking2000 Notes Payable
Investor NotesNote interest accrual6000 Interest Expense2100 Accrued Interest Pay.
CashCash receipt1010 Operating CheckingVaries by source
FeesOrigination fee charged1300 or receivable4xxx Fee Income

Pro Tip: You do not need to create manual journal entries for subledger transactions. The Loans, Investor Notes, Cash, and Fees subledgers automatically post balanced journal entries to the GL when you record transactions through their interfaces.

API Reference

The chart of accounts is managed through the GL API. All requests require JWT authentication.

MethodEndpointDescription
GET/api/v1/gl/chart-of-accountsList all accounts (add ?active=true to filter)
POST/api/v1/gl/chart-of-accountsCreate a new GL account
PATCH/api/v1/gl/chart-of-accounts/:idUpdate account name, parent, or active status

Next Steps

With your chart of accounts configured, learn how to record journal entries that post debits and credits to these accounts.

Journal Entries Guide