Double-Entry Ledger & Chart of Accounts

Immutable accounting journal, balanced debit/credit invariants, and multi-tenant ledger entries.

The double-entry general ledger records all financial transactions with strict mathematical debit/credit balancing.

Chart of Accounts Structure

Standardized account hierarchy: Assets (1000s), Liabilities (2000s), Equity (3000s), Revenue (4000s), and Expenses (5000s).

Double-Entry Invariance Math

Enforce the mathematical identity: Sum of Debits minus Sum of Credits equals zero.

src/Modules/Finance/Finance.Domain/Entities/JournalEntry.csC#
public sealed class JournalEntry : TenantAggregateRoot
{
    private readonly List<JournalLine> _lines = new();
    public IReadOnlyCollection<JournalLine> Lines => _lines.AsReadOnly();
    public DateTimeOffset PostedAtUtc { get; private set; }
    public string TransactionReference { get; private set; } = string.Empty;

    public Result ValidateBalancing()
    {
        var sumDebits = _lines.Where(l => l.EntryType == EntryType.Debit).Sum(l => l.Amount);
        var sumCredits = _lines.Where(l => l.EntryType == EntryType.Credit).Sum(l => l.Amount);

        if (sumDebits != sumCredits)
            return Result.Failure($"Ledger out of balance: Debits={sumDebits}, Credits={sumCredits}");

        return Result.Success();
    }
}

Immutable Journal History

Financial journal records are strictly append-only; adjustments require formal reversing entries.