# mrpyaesone/personal-expense-tracker-assessment architecture

> Architecture diagram of the GitHub repository mrpyaesone/personal-expense-tracker-assessment, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-08-02). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mrpyaesone/personal-expense-tracker-assessment
- Repository: https://github.com/mrpyaesone/personal-expense-tracker-assessment

## Overview

#### Purpose and runtime
Personal-Expense-Tracker is a single-activity native Android app for recording and viewing personal expense logs. It runs Kotlin/Android with Jetpack Compose, Coroutines/Flow, Hilt dependency injection, Room over local SQLite, and Compose Navigation. It has no indicated remote backend or external service dependency.

#### Application entry and composition
Android launches the application and activity, which establish app-wide DI and the Compose UI/navigation host.
- `app/src/main/java/com/example/pro_expense/ProExpenseApplication.kt`
- `app/src/main/java/com/example/pro_expense/MainActivity.kt`
- `app/src/main/AndroidManifest.xml`

Navigation defines the two primary feature destinations: expense listing and expense entry.
- `app/src/main/java/com/example/pro_expense/navigation/NavGraph.kt`
- `app/src/main/java/com/example/pro_expense/navigation/NavHost.kt`

#### UI feature boundary
Each feature owns its Compose screen, ViewModel, and immutable UI state. Screens render state and send user events to ViewModels; ViewModels invoke domain use cases rather than data access directly.
- `app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListScreen.kt`
- `app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt`
- `app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseViewModel.kt`

The list flow presents persisted logs; the log-expense flow captures an amount/category/date-style entry, validates and submits it, then navigates through feature navigation contracts.
- `app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseScreen.kt`
- `app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseNavigation.kt`
- `app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListNavigation.kt`

#### Domain business boundary
The domain layer is UI- and storage-agnostic. `ExpenseLog` is the business model; `ExpenseRepo` is the persistence contract; single-purpose use cases mediate loading and logging operations.
- `app/src/main/java/com/example/pro_expense/domain/model/ExpenseLog.kt`
- `app/src/main/java/com/example/pro_expense/domain/repo/ExpenseRepo.kt`
- `app/src/main/java/com/example/pro_expense/domain/usecase/LoadExpenseLogsUseCase.kt`
- `app/src/main/java/com/example/pro_expense/domain/usecase/LogExpenseUseCase.kt`

A dispatcher abstraction isolates coroutine execution policy from use cases and enables deterministic tests.
- `app/src/main/java/com/example/pro_expense/domain/dispatcher/DispatcherProvider.kt`
- `app/src/main/java/com/example/pro_expense/domain/di/DispatcherModule.kt`

#### Persistence and repository boundary
Room is the sole system of record. The database exposes the expense DAO; entity types represent SQLite rows. `ExpenseRepoImpl` implements the domain interface, coordinates DAO calls, and maps between database entities and domain models.
- `app/src/main/java/com/example/pro_expense/data/local/ProExpenseDatabase.kt`
- `app/src/main/java/com/example/pro_expense/data/local/dao/ExpenseLogDao.kt`
- `app/src/main/java/com/example/pro_expense/data/local/entities/ExpenseLogEntity.kt`
- `app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt`
- `app/src/main/java/com/example/pro_expense/data/mapper/ExpenseLogMapper.kt`

Primary data flow is: Room DAO → repository/entity-domain mapper → `LoadExpenseLogsUseCase` → list ViewModel state → Compose list. Write flow reverses this: form → log ViewModel → `LogExpenseUseCase` → repository/domain-entity mapper → DAO → Room.

#### Dependency assembly and representation transforms
Hilt modules bind the interface-to-implementation and provision database/DAO dependencies, keeping construction out of feature code.
- `app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt`
- `app/src/main/java/com/example/pro_expense/data/local/di/DatabaseModule.kt`
- `app/src/main/java/com/example/pro_expense/data/local/di/DaoModule.kt`

A second mapping boundary converts domain logs into presentation-specific view objects, preventing Compose rendering concerns from leaking into domain or storage.
- `app/src/main/java/com/example/pro_expense/ui/mapper/ExpenseLogVOMapper.kt`
- `app/src/main/java/com/example/pro_expense/ui/vo/ExpenseLogVO.kt

Main entry points: [`app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt`](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt) (Expense repository impl), [`app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt`](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt) (Hilt modules), [`app/src/main/java/com/example/pro_expense/navigation/NavHost.kt`](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/navigation/NavHost.kt) (Navigation host), [`app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt`](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt) (Expense list ViewModel)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App &amp; Navigation"]
  node_manifest["Android manifest<br/>Android config"]
  node_application["ProExpense application<br/>Hilt application"]
  node_activity["Main activity<br/>Compose activity<br/>[MainActivity.kt]"]
  node_nav["Navigation host<br/>Compose navigation<br/>[NavHost.kt]"]
end

subgraph group_ui["Compose Features"]
  node_list_screen["Expense list screen<br/>Compose screen"]
  node_list_vm["Expense list ViewModel<br/>feature ViewModel"]
  node_log_screen["Log expense screen<br/>Compose form"]
  node_log_vm["Log expense ViewModel<br/>feature ViewModel"]
  node_presentation_mapper["Expense log VO mapper<br/>presentation mapper"]
end

subgraph group_domain["Domain"]
  node_expense_model["Expense log<br/>domain model<br/>[ExpenseLog.kt]"]
  node_repo_contract["Expense repository<br/>repository contract<br/>[ExpenseRepo.kt]"]
  node_load_usecase["Load expense logs<br/>use case"]
  node_log_usecase["Log expense<br/>use case"]
  node_dispatcher["Dispatcher provider<br/>coroutine abstraction"]
end

subgraph group_data["Local Persistence"]
  node_repo_impl["Expense repository impl<br/>repository adapter<br/>[ExpenseRepoImpl.kt]"]
  node_dao["Expense log DAO<br/>Room DAO<br/>[ExpenseLogDao.kt]"]
  node_database[("ProExpense database<br/>Room database")]
  node_entity["Expense log entity<br/>SQLite entity"]
end

subgraph group_di["Dependency Injection"]
  node_hilt_modules["Hilt modules<br/>DI modules<br/>[RepoModule.kt]"]
end

node_manifest -->|"launches"| node_application
node_application -->|"initializes DI for"| node_activity
node_activity -->|"sets Compose content"| node_nav
node_nav -->|"list destination"| node_list_screen
node_nav -->|"entry destination"| node_log_screen
node_list_screen -->|"events and state"| node_list_vm
node_log_screen -->|"form events and state"| node_log_vm
node_list_vm -->|"loads logs"| node_load_usecase
node_list_vm -->|"maps for rendering"| node_presentation_mapper
node_log_vm -->|"submits expense"| node_log_usecase
node_load_usecase -->|"reads via"| node_repo_contract
node_log_usecase -->|"writes via"| node_repo_contract
node_load_usecase -.->|"uses"| node_dispatcher
node_log_usecase -.->|"uses"| node_dispatcher
node_repo_impl -->|"implements"| node_repo_contract
node_repo_impl -->|"reads and writes"| node_dao
node_repo_impl -->|"maps with domain log"| node_entity
node_dao -->|"Room access"| node_database
node_database -->|"stores rows"| node_entity
node_hilt_modules -.->|"binds"| node_repo_impl
node_hilt_modules -.->|"provides"| node_database
node_hilt_modules -.->|"provides"| node_dao

click node_manifest "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/AndroidManifest.xml"
click node_application "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ProExpenseApplication.kt"
click node_activity "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/MainActivity.kt"
click node_nav "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/navigation/NavHost.kt"
click node_list_screen "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListScreen.kt"
click node_list_vm "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt"
click node_log_screen "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseScreen.kt"
click node_log_vm "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseViewModel.kt"
click node_presentation_mapper "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/mapper/ExpenseLogVOMapper.kt"
click node_expense_model "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/model/ExpenseLog.kt"
click node_repo_contract "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/repo/ExpenseRepo.kt"
click node_load_usecase "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/usecase/LoadExpenseLogsUseCase.kt"
click node_log_usecase "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/usecase/LogExpenseUseCase.kt"
click node_dispatcher "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/dispatcher/DispatcherProvider.kt"
click node_repo_impl "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt"
click node_dao "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/dao/ExpenseLogDao.kt"
click node_database "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/ProExpenseDatabase.kt"
click node_entity "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/entities/ExpenseLogEntity.kt"
click node_hilt_modules "https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt"

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_manifest,node_application,node_activity,node_nav toneBlue
class node_list_screen,node_list_vm,node_log_screen,node_log_vm,node_presentation_mapper toneAmber
class node_expense_model,node_repo_contract,node_load_usecase,node_log_usecase,node_dispatcher toneMint
class node_repo_impl,node_dao,node_database,node_entity toneRose
class node_hilt_modules toneIndigo
```

## Components

### App & Navigation

- [Android manifest](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/AndroidManifest.xml): Android config · `app/src/main/AndroidManifest.xml`
- [ProExpense application](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ProExpenseApplication.kt): Hilt application · `app/src/main/java/com/example/pro_expense/ProExpenseApplication.kt`
- [Main activity](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/MainActivity.kt): Compose activity · `app/src/main/java/com/example/pro_expense/MainActivity.kt`
- [Navigation host](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/navigation/NavHost.kt): Compose navigation · Hosts the expense-list and log-expense destinations. · `app/src/main/java/com/example/pro_expense/navigation/NavHost.kt`

### Compose Features

- [Expense list screen](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListScreen.kt): Compose screen · `app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListScreen.kt`
- [Expense list ViewModel](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt): feature ViewModel · `app/src/main/java/com/example/pro_expense/ui/expenselist/ExpenseListViewModel.kt`
- [Log expense screen](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseScreen.kt): Compose form · `app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseScreen.kt`
- [Log expense ViewModel](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseViewModel.kt): feature ViewModel · Validates and submits expense entries. · `app/src/main/java/com/example/pro_expense/ui/logexpense/LogExpenseViewModel.kt`
- [Expense log VO mapper](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/ui/mapper/ExpenseLogVOMapper.kt): presentation mapper · Converts domain logs into Compose view objects. · `app/src/main/java/com/example/pro_expense/ui/mapper/ExpenseLogVOMapper.kt`

### Domain

- [Expense log](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/model/ExpenseLog.kt): domain model · `app/src/main/java/com/example/pro_expense/domain/model/ExpenseLog.kt`
- [Expense repository](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/repo/ExpenseRepo.kt): repository contract · `app/src/main/java/com/example/pro_expense/domain/repo/ExpenseRepo.kt`
- [Load expense logs](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/usecase/LoadExpenseLogsUseCase.kt): use case · `app/src/main/java/com/example/pro_expense/domain/usecase/LoadExpenseLogsUseCase.kt`
- [Log expense](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/usecase/LogExpenseUseCase.kt): use case · `app/src/main/java/com/example/pro_expense/domain/usecase/LogExpenseUseCase.kt`
- [Dispatcher provider](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/domain/dispatcher/DispatcherProvider.kt): coroutine abstraction · Supplies execution policy to use cases. · `app/src/main/java/com/example/pro_expense/domain/dispatcher/DispatcherProvider.kt`

### Local Persistence

- [Expense repository impl](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt): repository adapter · Maps domain logs and coordinates DAO access. · `app/src/main/java/com/example/pro_expense/data/ExpenseRepoImpl.kt`
- [Expense log DAO](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/dao/ExpenseLogDao.kt): Room DAO · `app/src/main/java/com/example/pro_expense/data/local/dao/ExpenseLogDao.kt`
- [ProExpense database](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/ProExpenseDatabase.kt): Room database · Local SQLite system of record. · `app/src/main/java/com/example/pro_expense/data/local/ProExpenseDatabase.kt`
- [Expense log entity](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/local/entities/ExpenseLogEntity.kt): SQLite entity · `app/src/main/java/com/example/pro_expense/data/local/entities/ExpenseLogEntity.kt`

### Dependency Injection

- [Hilt modules](https://github.com/mrpyaesone/personal-expense-tracker-assessment/blob/main/app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt): DI modules · Binds repository and provides Room database and DAO. · `app/src/main/java/com/example/pro_expense/data/di/RepoModule.kt`

## Connections

- Android manifest → ProExpense application: launches
- ProExpense application → Main activity: initializes DI for
- Main activity → Navigation host: sets Compose content
- Navigation host → Expense list screen: list destination
- Navigation host → Log expense screen: entry destination
- Expense list screen → Expense list ViewModel: events and state
- Log expense screen → Log expense ViewModel: form events and state
- Expense list ViewModel → Load expense logs: loads logs
- Expense list ViewModel → Expense log VO mapper: maps for rendering
- Log expense ViewModel → Log expense: submits expense
- Load expense logs → Expense repository: reads via
- Log expense → Expense repository: writes via
- Load expense logs → Dispatcher provider: uses
- Log expense → Dispatcher provider: uses
- Expense repository impl → Expense repository: implements
- Expense repository impl → Expense log DAO: reads and writes
- Expense repository impl → Expense log entity: maps with domain log
- Expense log DAO → ProExpense database: Room access
- ProExpense database → Expense log entity: stores rows
- Hilt modules → Expense repository impl: binds
- Hilt modules → ProExpense database: provides
- Hilt modules → Expense log DAO: provides
