Skip to main content

System Architecture

Overview

BalanceSheet Pro follows a modular architecture with a Core System that handles double-entry accounting and pluggable modules for specific business functions.

┌─────────────────────────────────────────────────────────┐
│ MODULE LAYER │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Accounts │ │ Accounts │ │Inventory │ │ Payroll │ │
│ │ Payable │ │Receivable│ │ Module │ │ Module │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ └─────────────┴────────────┴─────────────┘ │
│ │ (API) │
├─────────────────────────┼───────────────────────────────┤
│ CORE SYSTEM │
│ ┌─────────────────────────────────────────────────┐ │
│ │ General Journal Engine │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ Journal │ │ Posting │ │ Trial Balance│ │ │
│ │ │ Entry │ │ Engine │ │ Generator │ │ │
│ │ └──────────┘ └──────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Financial Reporting Engine │ │
│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │Balance │ │Income │ │Equity │ │ Cash │ │ │
│ │ │Sheet │ │Statement│ │Statement│ │ Flows │ │ │
│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Chart of Accounts │ Fiscal Periods │ Audit Log │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

Tech Stack

LayerTechnologyPurpose
APIFastAPIREST API, auto-docs
ORMSQLAlchemyDatabase models
DatabasePostgreSQLPersistent storage
CacheRedisSession, rate limiting
StorageS3-compatibleDocument storage
FrontendNext.jsWeb application
AIOpenAI-compatibleDocument processing

Multi-Tenancy

Every business table includes company_id for tenant isolation:

-- Row-Level Security example
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY company_isolation ON accounts
USING (company_id = current_setting('app.company_id')::UUID);

Data Flow

User uploads document

AI classifies & extracts

AI proposes journal entry

Accountant reviews

Approved → Posted

Balances updated

Reports generated