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
| Layer | Technology | Purpose |
|---|---|---|
| API | FastAPI | REST API, auto-docs |
| ORM | SQLAlchemy | Database models |
| Database | PostgreSQL | Persistent storage |
| Cache | Redis | Session, rate limiting |
| Storage | S3-compatible | Document storage |
| Frontend | Next.js | Web application |
| AI | OpenAI-compatible | Document 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