# rickzasyam/ngitungid architecture

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

- Interactive diagram: https://gitdiagram.com/rickzasyam/ngitungid
- Repository: https://github.com/rickzasyam/ngitungid

## Overview

NgitungID BI is an internal financial intelligence application for Indonesian SMEs. Its main accounting workflow uploads client PDF reports, extracts financial figures with Gemini, and stores line items for staff review and client-specific chart-of-accounts mapping; processed reports then feed dashboard and analytics views. Separate branches support client and team administration, and commercial contract and service management. The README documents the product flow; sampled routes show extraction, persistence, and dashboard aggregation, while page-level wiring and several route implementations were not sampled, so uncertain links are omitted.

Main entry points: [`lib/db/schema.ts`](https://github.com/rickzasyam/ngitungid/blob/main/lib/db/schema.ts) (Application database), [`app/api/upload/route.ts`](https://github.com/rickzasyam/ngitungid/blob/main/app/api/upload/route.ts) (Upload endpoint), [`app/api/reports/route.ts`](https://github.com/rickzasyam/ngitungid/blob/main/app/api/reports/route.ts) (Reports endpoint), [`lib/api/guards.ts`](https://github.com/rickzasyam/ngitungid/blob/main/lib/api/guards.ts) (Route access guards)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_reporting["Report workflow"]
  node_upload_ui["Report upload<br/>[page.tsx]"]
  node_upload_api["Upload endpoint<br/>[route.ts]"]
  node_gemini_extract["AI extraction<br/>[extract.ts]"]
  node_line_builder["Line-item builder<br/>[line-items.ts]"]
  node_review_ui["Extraction review<br/>[page.tsx]"]
  node_mapping_ui["COA mapping<br/>[page.tsx]"]
  node_reports_api["Reports endpoint<br/>[route.ts]"]
  node_coa_api["Client COA API<br/>[route.ts]"]
end

subgraph group_insights["Financial insights"]
  node_dashboard_api["Dashboard aggregation<br/>[route.ts]"]
  node_dashboard_ui["Financial dashboard<br/>[page.tsx]"]
  node_analytics_ui["Analytics views<br/>[page.tsx]"]
  node_ratio_api["Ratio analysis API<br/>[route.ts]"]
  node_neraca_api["Balance detail API<br/>[route.ts]"]
end

subgraph group_operations["Client operations"]
  node_client_admin["Client management<br/>[route.ts]"]
  node_client_context["Active client context<br/>[client-context.tsx]"]
  node_contract_ui["Contract workspace<br/>[page.tsx]"]
  node_contract_api["Contracts API<br/>[route.ts]"]
  node_service_api["Service catalog API<br/>[route.ts]"]
end

subgraph group_platform["Access and data"]
  node_auth["Authentication<br/>[auth.ts]"]
  node_guards["Route access guards<br/>[guards.ts]"]
  node_database[("Application database<br/>[schema.ts]")]
end

node_accountant(("Accounting staff"))
node_client(("Client viewer"))
node_gemini{{"Gemini API"}}

node_accountant -->|"uploads PDF"| node_upload_ui
node_upload_ui -->|"submits files"| node_upload_api
node_upload_api -->|"extracts figures"| node_gemini_extract
node_gemini_extract -->|"requests extraction"| node_gemini
node_upload_api -->|"builds line items"| node_line_builder
node_upload_api -->|"stores reports"| node_database
node_upload_api -->|"reads COA history"| node_database
node_upload_api -->|"stores line items"| node_database
node_accountant -->|"reviews reports"| node_review_ui
node_review_ui -->|"loads report lines"| node_reports_api
node_accountant -->|"maps accounts"| node_mapping_ui
node_mapping_ui -->|"loads reports"| node_reports_api
node_mapping_ui -->|"loads client COA"| node_coa_api
node_reports_api -->|"reads reports"| node_database
node_reports_api -->|"reads line items"| node_database
node_accountant -->|"views results"| node_dashboard_ui
node_client -->|"views results"| node_dashboard_ui
node_dashboard_ui -->|"requests metrics"| node_dashboard_api
node_dashboard_api -->|"reads financial data"| node_database
node_dashboard_api -->|"reads account mappings"| node_database
node_dashboard_api -->|"returns aggregates"| node_dashboard_ui
node_analytics_ui -->|"requests ratios"| node_ratio_api
node_analytics_ui -->|"requests balance detail"| node_neraca_api
node_client_admin -->|"reads and writes clients"| node_database
node_client_context -->|"loads client list"| node_client_admin
node_accountant -->|"manages contracts"| node_contract_ui
node_contract_ui -->|"submits contract data"| node_contract_api
node_contract_api -->|"reads and writes contracts"| node_database
node_contract_api -->|"uses service catalog"| node_service_api
node_service_api -->|"reads and writes services"| node_database
node_upload_api -->|"checks access"| node_guards
node_reports_api -->|"checks access"| node_guards
node_contract_api -->|"checks access"| node_guards
node_guards -->|"checks session"| node_auth
node_client_admin -->|"checks access"| node_guards

click node_upload_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/upload/page.tsx"
click node_upload_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/upload/route.ts"
click node_gemini_extract "https://github.com/rickzasyam/ngitungid/blob/main/lib/gemini/extract.ts"
click node_line_builder "https://github.com/rickzasyam/ngitungid/blob/main/lib/reports/line-items.ts"
click node_review_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/extraction-review/page.tsx"
click node_mapping_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/coa-mapping/page.tsx"
click node_reports_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/reports/route.ts"
click node_coa_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/clients/%5Bid%5D/coa/route.ts"
click node_dashboard_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/dashboard/%5BclientId%5D/route.ts"
click node_dashboard_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/dashboard/page.tsx"
click node_analytics_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/analytics/page.tsx"
click node_ratio_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/analytics/%5BclientId%5D/ratios/route.ts"
click node_neraca_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/analytics/%5BclientId%5D/neraca-detail/route.ts"
click node_client_admin "https://github.com/rickzasyam/ngitungid/blob/main/app/api/clients/route.ts"
click node_client_context "https://github.com/rickzasyam/ngitungid/blob/main/lib/client-context.tsx"
click node_contract_ui "https://github.com/rickzasyam/ngitungid/blob/main/app/kontrak/page.tsx"
click node_contract_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/contracts/route.ts"
click node_service_api "https://github.com/rickzasyam/ngitungid/blob/main/app/api/layanan/route.ts"
click node_auth "https://github.com/rickzasyam/ngitungid/blob/main/lib/auth.ts"
click node_guards "https://github.com/rickzasyam/ngitungid/blob/main/lib/api/guards.ts"
click node_database "https://github.com/rickzasyam/ngitungid/blob/main/lib/db/schema.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_upload_ui,node_upload_api,node_gemini_extract,node_line_builder,node_review_ui,node_mapping_ui,node_reports_api,node_coa_api,node_client toneBlue
class node_dashboard_api,node_dashboard_ui,node_analytics_ui,node_ratio_api,node_neraca_api toneAmber
class node_client_admin,node_client_context,node_contract_ui,node_contract_api,node_service_api,node_gemini toneMint
class node_auth,node_guards,node_database toneRose
class node_accountant toneIndigo
```

## Components

### Report workflow

- [Report upload](https://github.com/rickzasyam/ngitungid/blob/main/app/upload/page.tsx): `app/upload/page.tsx`
- [Upload endpoint](https://github.com/rickzasyam/ngitungid/blob/main/app/api/upload/route.ts): `app/api/upload/route.ts`
- [AI extraction](https://github.com/rickzasyam/ngitungid/blob/main/lib/gemini/extract.ts): `lib/gemini/extract.ts`
- [Line-item builder](https://github.com/rickzasyam/ngitungid/blob/main/lib/reports/line-items.ts): `lib/reports/line-items.ts`
- [Extraction review](https://github.com/rickzasyam/ngitungid/blob/main/app/extraction-review/page.tsx): `app/extraction-review/page.tsx`
- [COA mapping](https://github.com/rickzasyam/ngitungid/blob/main/app/coa-mapping/page.tsx): `app/coa-mapping/page.tsx`
- [Reports endpoint](https://github.com/rickzasyam/ngitungid/blob/main/app/api/reports/route.ts): `app/api/reports/route.ts`
- [Client COA API](https://github.com/rickzasyam/ngitungid/blob/main/app/api/clients/%5Bid%5D/coa/route.ts): `app/api/clients/[id]/coa/route.ts`

### Financial insights

- [Dashboard aggregation](https://github.com/rickzasyam/ngitungid/blob/main/app/api/dashboard/%5BclientId%5D/route.ts): `app/api/dashboard/[clientId]/route.ts`
- [Financial dashboard](https://github.com/rickzasyam/ngitungid/blob/main/app/dashboard/page.tsx): `app/dashboard/page.tsx`
- [Analytics views](https://github.com/rickzasyam/ngitungid/blob/main/app/analytics/page.tsx): `app/analytics/page.tsx`
- [Ratio analysis API](https://github.com/rickzasyam/ngitungid/blob/main/app/api/analytics/%5BclientId%5D/ratios/route.ts): `app/api/analytics/[clientId]/ratios/route.ts`
- [Balance detail API](https://github.com/rickzasyam/ngitungid/blob/main/app/api/analytics/%5BclientId%5D/neraca-detail/route.ts): `app/api/analytics/[clientId]/neraca-detail/route.ts`

### Client operations

- [Client management](https://github.com/rickzasyam/ngitungid/blob/main/app/api/clients/route.ts): `app/api/clients/route.ts`
- [Active client context](https://github.com/rickzasyam/ngitungid/blob/main/lib/client-context.tsx): `lib/client-context.tsx`
- [Contract workspace](https://github.com/rickzasyam/ngitungid/blob/main/app/kontrak/page.tsx): `app/kontrak/page.tsx`
- [Contracts API](https://github.com/rickzasyam/ngitungid/blob/main/app/api/contracts/route.ts): `app/api/contracts/route.ts`
- [Service catalog API](https://github.com/rickzasyam/ngitungid/blob/main/app/api/layanan/route.ts): `app/api/layanan/route.ts`

### Access and data

- [Authentication](https://github.com/rickzasyam/ngitungid/blob/main/lib/auth.ts): `lib/auth.ts`
- [Route access guards](https://github.com/rickzasyam/ngitungid/blob/main/lib/api/guards.ts): `lib/api/guards.ts`
- [Application database](https://github.com/rickzasyam/ngitungid/blob/main/lib/db/schema.ts): `lib/db/schema.ts`

### Other components

- **Accounting staff**
- **Client viewer**
- **Gemini API**

## Connections

- Accounting staff → Report upload: uploads PDF
- Report upload → Upload endpoint: submits files
- Upload endpoint → AI extraction: extracts figures
- AI extraction → Gemini API: requests extraction
- Upload endpoint → Line-item builder: builds line items
- Upload endpoint → Application database: stores reports
- Upload endpoint → Application database: reads COA history
- Upload endpoint → Application database: stores line items
- Accounting staff → Extraction review: reviews reports
- Extraction review → Reports endpoint: loads report lines
- Accounting staff → COA mapping: maps accounts
- COA mapping → Reports endpoint: loads reports
- COA mapping → Client COA API: loads client COA
- Reports endpoint → Application database: reads reports
- Reports endpoint → Application database: reads line items
- Accounting staff → Financial dashboard: views results
- Client viewer → Financial dashboard: views results
- Financial dashboard → Dashboard aggregation: requests metrics
- Dashboard aggregation → Application database: reads financial data
- Dashboard aggregation → Application database: reads account mappings
- Dashboard aggregation → Financial dashboard: returns aggregates
- Analytics views → Ratio analysis API: requests ratios
- Analytics views → Balance detail API: requests balance detail
- Client management → Application database: reads and writes clients
- Active client context → Client management: loads client list
- Accounting staff → Contract workspace: manages contracts
- Contract workspace → Contracts API: submits contract data
- Contracts API → Application database: reads and writes contracts
- Contracts API → Service catalog API: uses service catalog
- Service catalog API → Application database: reads and writes services
- Upload endpoint → Route access guards: checks access
- Reports endpoint → Route access guards: checks access
- Contracts API → Route access guards: checks access
- Route access guards → Authentication: checks session
- Client management → Route access guards: checks access
