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.