# scerty/budgeting architecture

> Architecture diagram of the GitHub repository scerty/budgeting, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/scerty/budgeting
- Repository: https://github.com/scerty/budgeting

## Overview

This is a finance analytics and planning application: ERPNext general-ledger entries can be imported into Django-managed ingestion records, while an Angular dashboard queries Cube.js for expense, budget-versus-actual, and planning metrics. The tree also shows organizational, ledger, consolidation, workflow, and reporting domains. Sampled code confirms the ERPNext import and dashboard query paths; the intervening population of Cube’s analytics tables and the implementation of unsampled Django subsystems are not shown, so those links are omitted.

Main entry points: [`django/finance/management/commands/ingest_erpnext.py`](https://github.com/scerty/budgeting/blob/main/django/finance/management/commands/ingest_erpnext.py) (GL import command), [`django/finance/ingestion/erpnext.py`](https://github.com/scerty/budgeting/blob/main/django/finance/ingestion/erpnext.py) (ERPNext client), [`django/finance/models/ingestion.py`](https://github.com/scerty/budgeting/blob/main/django/finance/models/ingestion.py) (Ingestion records), [`cube/cube.js`](https://github.com/scerty/budgeting/blob/main/cube/cube.js) (Cube.js API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["ERP Ingestion"]
  node_import_command["GL import command<br/>[ingest_erpnext.py]"]
  node_erp_client["ERPNext client<br/>[erpnext.py]"]
  node_ingestion_models["Ingestion records<br/>[ingestion.py]"]
end

subgraph group_finance["Finance Domain"]
  node_django["Django application<br/>[urls.py]"]
  node_org_models["Organization and access<br/>[organization.py]"]
  node_ledger_models["Ledger domain<br/>[ledger.py]"]
  node_ops_models["Operations domain<br/>[operations.py]"]
  node_consolidation_models["Consolidation<br/>[consolidation.py]"]
  node_workflow_models["Workflow<br/>[workflow.py]"]
  node_planning_models["Planning<br/>[planning.py]"]
  node_planning_rules["Planning rules<br/>[planning_rules.py]"]
  node_reporting_models["Reporting domain<br/>[reporting.py]"]
end

subgraph group_analytics["Analytics"]
  node_cube_service["Cube.js API<br/>[cube.js]"]
  node_cube_schemas["Analytics schemas"]
  node_analytics_store[("Analytics tables")]
end

subgraph group_dashboard["Dashboard"]
  node_dashboard_entry["Dashboard bootstrap<br/>[main.ts]"]
  node_dashboard_app["Finance dashboard<br/>[app.ts]"]
end

node_operator(("Finance user"))
node_erpnext["ERPNext"]
node_postgres[("PostgreSQL")]
node_clickhouse[("ClickHouse")]

node_operator -->|"opens"| node_dashboard_entry
node_dashboard_entry -->|"bootstraps"| node_dashboard_app
node_dashboard_app -->|"queries metrics"| node_cube_service
node_cube_service -->|"uses schemas"| node_cube_schemas
node_cube_schemas -->|"queries tables"| node_analytics_store
node_analytics_store -->|"stored in"| node_clickhouse
node_operator -->|"runs import"| node_import_command
node_import_command -->|"fetches entries"| node_erp_client
node_erp_client -->|"requests GL data"| node_erpnext
node_import_command -->|"creates run and rows"| node_ingestion_models
node_ingestion_models -->|"persisted in"| node_postgres
node_django -->|"uses database"| node_postgres

click node_django "https://github.com/scerty/budgeting/blob/main/django/config/urls.py"
click node_import_command "https://github.com/scerty/budgeting/blob/main/django/finance/management/commands/ingest_erpnext.py"
click node_erp_client "https://github.com/scerty/budgeting/blob/main/django/finance/ingestion/erpnext.py"
click node_ingestion_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/ingestion.py"
click node_org_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/organization.py"
click node_ledger_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/ledger.py"
click node_ops_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/operations.py"
click node_consolidation_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/consolidation.py"
click node_workflow_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/workflow.py"
click node_planning_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/planning.py"
click node_planning_rules "https://github.com/scerty/budgeting/blob/main/django/finance/models/planning_rules.py"
click node_reporting_models "https://github.com/scerty/budgeting/blob/main/django/finance/models/reporting.py"
click node_cube_service "https://github.com/scerty/budgeting/blob/main/cube/cube.js"
click node_cube_schemas "https://github.com/scerty/budgeting/tree/main/cube/schema"
click node_dashboard_entry "https://github.com/scerty/budgeting/blob/main/dashboard/src/main.ts"
click node_dashboard_app "https://github.com/scerty/budgeting/blob/main/dashboard/src/app/app.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_import_command,node_erp_client,node_ingestion_models,node_operator toneBlue
class node_django,node_org_models,node_ledger_models,node_ops_models,node_consolidation_models,node_workflow_models,node_planning_models,node_planning_rules,node_reporting_models,node_postgres,node_clickhouse toneAmber
class node_cube_service,node_cube_schemas,node_analytics_store toneMint
class node_dashboard_entry,node_dashboard_app toneRose
class node_erpnext toneIndigo
```

## Components

### ERP Ingestion

- [GL import command](https://github.com/scerty/budgeting/blob/main/django/finance/management/commands/ingest_erpnext.py): `django/finance/management/commands/ingest_erpnext.py`
- [ERPNext client](https://github.com/scerty/budgeting/blob/main/django/finance/ingestion/erpnext.py): `django/finance/ingestion/erpnext.py`
- [Ingestion records](https://github.com/scerty/budgeting/blob/main/django/finance/models/ingestion.py): `django/finance/models/ingestion.py`

### Finance Domain

- [Django application](https://github.com/scerty/budgeting/blob/main/django/config/urls.py): `django/config/urls.py`
- [Organization and access](https://github.com/scerty/budgeting/blob/main/django/finance/models/organization.py): `django/finance/models/organization.py`
- [Ledger domain](https://github.com/scerty/budgeting/blob/main/django/finance/models/ledger.py): `django/finance/models/ledger.py`
- [Operations domain](https://github.com/scerty/budgeting/blob/main/django/finance/models/operations.py): `django/finance/models/operations.py`
- [Consolidation](https://github.com/scerty/budgeting/blob/main/django/finance/models/consolidation.py): `django/finance/models/consolidation.py`
- [Workflow](https://github.com/scerty/budgeting/blob/main/django/finance/models/workflow.py): `django/finance/models/workflow.py`
- [Planning](https://github.com/scerty/budgeting/blob/main/django/finance/models/planning.py): `django/finance/models/planning.py`
- [Planning rules](https://github.com/scerty/budgeting/blob/main/django/finance/models/planning_rules.py): `django/finance/models/planning_rules.py`
- [Reporting domain](https://github.com/scerty/budgeting/blob/main/django/finance/models/reporting.py): `django/finance/models/reporting.py`

### Analytics

- [Cube.js API](https://github.com/scerty/budgeting/blob/main/cube/cube.js): `cube/cube.js`
- [Analytics schemas](https://github.com/scerty/budgeting/tree/main/cube/schema): `cube/schema`
- **Analytics tables**

### Dashboard

- [Dashboard bootstrap](https://github.com/scerty/budgeting/blob/main/dashboard/src/main.ts): `dashboard/src/main.ts`
- [Finance dashboard](https://github.com/scerty/budgeting/blob/main/dashboard/src/app/app.ts): `dashboard/src/app/app.ts`

### Other components

- **Finance user**
- **ERPNext**
- **PostgreSQL**
- **ClickHouse**

## Connections

- Finance user → Dashboard bootstrap: opens
- Dashboard bootstrap → Finance dashboard: bootstraps
- Finance dashboard → Cube.js API: queries metrics
- Cube.js API → Analytics schemas: uses schemas
- Analytics schemas → Analytics tables: queries tables
- Analytics tables → ClickHouse: stored in
- Finance user → GL import command: runs import
- GL import command → ERPNext client: fetches entries
- ERPNext client → ERPNext: requests GL data
- GL import command → Ingestion records: creates run and rows
- Ingestion records → PostgreSQL: persisted in
- Django application → PostgreSQL: uses database
