Skip to content

Chart of Accounts API

The Chart of Accounts Service manages the hierarchical structure of ledger accounts.

Overview

The Chart of Accounts (COA) defines:

  • Account codes and names
  • Account types (Asset, Liability, Equity, Revenue, Expense)
  • Normal balances (Debit or Credit)
  • Parent-child relationships (hierarchy)

Standard Accounts

Keshless uses a 4-digit account code system:

Assets (1xxx)

CodeNameLevel
1000Assets0
1100Current Assets1
1110User Wallets2
1120Vendor Wallets2
1130Cash in Transit2
1140Petty Cash2

Liabilities (2xxx)

CodeNameLevel
2000Liabilities0
2100Current Liabilities1
2110Accounts Payable2
2120Pending Withdrawals2

Equity (3xxx)

CodeNameLevel
3000Equity0
3100Retained Earnings1
3200Share Capital1

Revenue (4xxx)

CodeNameLevel
4000Revenue0
4100Transaction Revenue1
4110Transaction Fee Revenue2
4120Withdrawal Fee Revenue2
4130Commission Income2

Expenses (5xxx)

CodeNameLevel
5000Expenses0
5100Operating Expenses1
5110Processing Costs2
5120Refund Expenses2

Service Methods

initialize()

Initialize and seed standard accounts on first run.

Example:

typescript
await chartOfAccountsService.initialize();
// ✅ Chart of Accounts initialized successfully

createAccount(data)

Create a new account.

Parameters:

ParameterTypeRequiredDescription
data.accountCodestringYes4-digit code
data.accountNamestringYesAccount name
data.accountTypeAccountTypeYesASSET/LIABILITY/etc.
data.parentCodestringNoParent account code
data.descriptionstringNoDescription

Returns: ChartOfAccounts

Example:

typescript
const account = await chartOfAccountsService.createAccount({
  accountCode: '4140',
  accountName: 'Premium Subscription Revenue',
  accountType: 'REVENUE',
  parentCode: '4100',
  description: 'Revenue from premium subscriptions'
});

getAccount(accountCode)

Get account by code.

Returns: ChartOfAccounts | null


getActiveAccount(accountCode)

Get active account by code.

Returns: ChartOfAccounts | null


getAccountsByType(accountType)

Get all accounts of a specific type.

Parameters:

ParameterTypeDescription
accountTypestringASSET/LIABILITY/EQUITY/REVENUE/EXPENSE

Returns: ChartOfAccounts[]


getChildAccounts(parentCode)

Get child accounts of a parent.

Returns: ChartOfAccounts[]


getAllAccounts(includeInactive?)

Get all accounts.

Parameters:

ParameterTypeDefaultDescription
includeInactivebooleanfalseInclude deactivated

Returns: ChartOfAccounts[] (sorted by account code)


getAccountTree()

Get hierarchical account tree.

Returns:

typescript
Array<{
  accountCode: string;
  accountName: string;
  accountType: AccountType;
  normalBalance: NormalBalance;
  level: number;
  isActive: boolean;
  children: Array<...>;  // Recursive
}>

Example:

typescript
const tree = await chartOfAccountsService.getAccountTree();
// Returns nested structure for rendering tree view

updateAccount(accountCode, updates)

Update an account.

Parameters:

ParameterTypeDescription
updates.accountNamestringNew name
updates.descriptionstringNew description
updates.isActivebooleanActive status

Returns: ChartOfAccounts


deactivateAccount(accountCode)

Deactivate an account (soft delete).

Returns: ChartOfAccounts


reactivateAccount(accountCode)

Reactivate a deactivated account.

Returns: ChartOfAccounts


isAccountActive(accountCode)

Check if account exists and is active.

Returns: boolean


getAccountsByCategory(includeInactive?)

Get accounts grouped by category.

Returns:

typescript
{
  assets: ChartOfAccounts[];
  liabilities: ChartOfAccounts[];
  equity: ChartOfAccounts[];
  revenue: ChartOfAccounts[];
  expenses: ChartOfAccounts[];
}

searchAccounts(searchTerm)

Search accounts by code, name, or description.

Parameters:

ParameterTypeDescription
searchTermstringSearch query

Returns: ChartOfAccounts[] (max 50 results)


getStatistics()

Get COA statistics.

Returns:

typescript
{
  totalAccounts: number;
  activeAccounts: number;
  inactiveAccounts: number;
  accountsByType: {
    assets: number;
    liabilities: number;
    equity: number;
    revenue: number;
    expenses: number;
  };
}

validateAccountCode(accountCode)

Validate account code format.

Pattern: ^\d{4}(-\w+)?$

Valid: 1110, 1110-user123Invalid: 11, abc1


getEntityAccountCode(baseAccountCode, entityId)

Generate entity-specific account code.

Example:

typescript
const userAccountCode = chartOfAccountsService.getEntityAccountCode('1110', 'user-123');
// Returns: '1110-user-123'

Account Schema

typescript
interface ChartOfAccounts {
  id: string;
  accountCode: string;      // Unique 4-digit code
  accountName: string;
  accountType: AccountType;
  normalBalance: NormalBalance;
  parentCode?: string;      // Parent account code
  level: number;            // Hierarchy level (0=top)
  description?: string;
  isActive: boolean;
  isSummary: boolean;       // true for parent accounts
  createdAt: Date;
  updatedAt: Date;
}

Account Types

TypeNormal BalanceIncreases On
ASSETDebitDebit
LIABILITYCreditCredit
EQUITYCreditCredit
REVENUECreditCredit
EXPENSEDebitDebit

Hierarchy Levels

LevelDescriptionExample
0Top-level categoryAssets (1000)
1Sub-categoryCurrent Assets (1100)
2Detail accountUser Wallets (1110)

Dashboard Integration

Manage COA in the admin dashboard:

  • Account List: /admin/accounting/chart-of-accounts
  • Account Tree: /admin/accounting/chart-of-accounts/tree
  • Create Account: /admin/accounting/chart-of-accounts/new

Internal use only - Keshless Payment Platform