Skip to content

Trial Balance API

The Trial Balance Service generates trial balance reports to verify the accounting equation and detect imbalances.

Overview

A trial balance proves that:

  1. Total Debits = Total Credits (double-entry integrity)
  2. Assets = Liabilities + Equity (accounting equation)

Service Methods

generateTrialBalance(options)

Generate a trial balance report.

Parameters:

ParameterTypeDefaultDescription
options.asOfDateDateNowPoint-in-time report
options.useCachebooleantrueUse cached balances (faster)

Returns:

typescript
interface TrialBalanceReport {
  asOfDate: Date;
  entries: TrialBalanceEntry[];
  totalDebits: number;
  totalCredits: number;
  difference: number;
  isBalanced: boolean;  // difference < E0.01

  // Grouped by type
  assets: { entries: TrialBalanceEntry[]; total: number };
  liabilities: { entries: TrialBalanceEntry[]; total: number };
  equity: { entries: TrialBalanceEntry[]; total: number };
  revenue: { entries: TrialBalanceEntry[]; total: number };
  expenses: { entries: TrialBalanceEntry[]; total: number };
}

interface TrialBalanceEntry {
  accountCode: string;
  accountName: string;
  accountType: 'ASSET' | 'LIABILITY' | 'EQUITY' | 'REVENUE' | 'EXPENSE';
  debitTotal: number;
  creditTotal: number;
  balance: number;
}

Example:

typescript
// Generate current trial balance
const trialBalance = await trialBalanceService.generateTrialBalance();

console.log(`Debits: E${trialBalance.totalDebits.toFixed(2)}`);
console.log(`Credits: E${trialBalance.totalCredits.toFixed(2)}`);
console.log(`Balanced: ${trialBalance.isBalanced}`);

verifyTrialBalance(options)

Verify trial balance and create a reconciliation record.

Parameters:

ParameterTypeDescription
options.asOfDateDatePoint-in-time
options.triggeredBystringActor ID for audit

Returns: Reconciliation record

Example:

typescript
const reconciliation = await trialBalanceService.verifyTrialBalance({
  triggeredBy: 'system'
});

if (!reconciliation.isReconciled) {
  console.error('Trial balance does NOT balance!');
}

verifyAccountingEquation(asOfDate?)

Verify the accounting equation: Assets = Liabilities + Equity + Net Income

Returns:

typescript
{
  assets: number;
  liabilities: number;
  equity: number;
  revenue: number;
  expenses: number;
  netIncome: number;  // Revenue - Expenses
  totalLiabilitiesAndEquity: number;  // L + E + Net Income
  difference: number;
  isBalanced: boolean;
}

Example:

typescript
const equation = await trialBalanceService.verifyAccountingEquation();

console.log(`Assets: E${equation.assets.toFixed(2)}`);
console.log(`Liabilities + Equity: E${equation.totalLiabilitiesAndEquity.toFixed(2)}`);
console.log(`Net Income: E${equation.netIncome.toFixed(2)}`);

exportToCSV(asOfDate?)

Export trial balance to CSV format.

Returns: CSV string

CSV Format:

csv
Account Code,Account Name,Account Type,Debit,Credit,Balance
1110,User Wallets,ASSET,50000.00,45000.00,5000.00
1120,Vendor Wallets,ASSET,30000.00,28000.00,2000.00
...

TOTAL,,80000.00,80000.00,
DIFFERENCE,,,0.00,
BALANCED,,YES,,

getFinancialSummary(asOfDate?)

Get a high-level financial summary.

Returns:

typescript
{
  asOfDate: Date;
  totalAssets: number;
  totalLiabilities: number;
  totalEquity: number;
  totalRevenue: number;
  totalExpenses: number;
  netIncome: number;
  cashPosition: number;  // User + Vendor wallets
}

compareTrialBalances(startDate, endDate)

Compare trial balances between two dates.

Returns:

typescript
{
  startBalance: TrialBalanceReport;
  endBalance: TrialBalanceReport;
  changes: Array<{
    accountCode: string;
    accountName: string;
    startBalance: number;
    endBalance: number;
    change: number;
    changePercent: number;
  }>;
}

Example:

typescript
const startOfMonth = new Date('2026-01-01');
const endOfMonth = new Date('2026-01-31');

const comparison = await trialBalanceService.compareTrialBalances(
  startOfMonth,
  endOfMonth
);

// Show top changes
for (const change of comparison.changes.slice(0, 5)) {
  console.log(`${change.accountName}: ${change.changePercent.toFixed(1)}%`);
}

Account Type Classification

Account codes follow this convention:

First DigitAccount TypeNormal Balance
1ASSETDebit
2LIABILITYCredit
3EQUITYCredit
4REVENUECredit
5EXPENSEDebit

Trial Balance vs Cache

MethodSpeedAccuracyUse Case
useCache: trueFastDepends on syncQuick reports
useCache: falseSlowerMost accurateVerification

When to use ledger (no cache):

  • Monthly/quarterly verification
  • After suspected issues
  • For regulatory reports

Scheduled Verification

JobSchedulePurpose
Trial Balance CheckDaily 4:30 AMVerify debits = credits
Accounting EquationWeekly SundayVerify A = L + E

Dashboard Integration

View trial balance reports:

  • Current Trial Balance: /admin/accounting/trial-balance
  • Historical Comparison: /admin/accounting/trial-balance/compare
  • Financial Summary: /admin/accounting/summary

Internal use only - Keshless Payment Platform