# tree-shady/personalovertimerecord architecture

> Architecture diagram of the GitHub repository tree-shady/personalovertimerecord, 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/tree-shady/personalovertimerecord
- Repository: https://github.com/tree-shady/personalovertimerecord

## Overview

PersonalOvertimeRecord is an Android app for recording overtime and leave, calculating pay, and managing attendance data. The main workflow is launch and optional biometric unlock, then create or review records in the calendar, persist them locally, and view monthly summaries. Separate branches cover data import/export, WebDAV sync, settings, and update checks. The README documents these capabilities and the MVVM/repository structure; source excerpts were not provided, so uncertain activity-to-service wiring is omitted.

Main entry points: [`app/src/main/java/com/example/personalovertimerecord/MainActivity.kt`](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/MainActivity.kt) (Calendar screen), [`app/src/main/java/com/example/personalovertimerecord/SettingsActivity.kt`](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/SettingsActivity.kt) (App settings), [`app/src/main/java/com/example/personalovertimerecord/viewmodel/AttendanceViewModel.kt`](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/viewmodel/AttendanceViewModel.kt) (Attendance state), [`app/src/main/java/com/example/personalovertimerecord/utils/SyncManager.kt`](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/SyncManager.kt) (Sync coordination)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_access["App access"]
  node_launcher["Launch gate"]
  node_biometric["Biometric unlock"]
  node_main["Calendar screen<br/>[MainActivity.kt]"]
end

subgraph group_attendance["Attendance and pay"]
  node_calendar["Calendar view<br/>[CalendarView.kt]"]
  node_recorddialog["Record editor"]
  node_attendancevm["Attendance state"]
  node_models["Attendance models<br/>[OvertimeModels.kt]"]
  node_calculators["Overtime and pay"]
  node_salary["Salary calculation"]
  node_report["Monthly reports<br/>[ReportActivity.kt]"]
end

subgraph group_data["Local data"]
  node_repository["Attendance repository"]
  node_dao["Attendance access<br/>[AttendanceDao.kt]"]
  node_database[("Encrypted database<br/>[AppDatabase.kt]")]
end

subgraph group_management["Data management"]
  node_manager["Data manager"]
  node_export["Import and export<br/>[DataExporter.kt]"]
  node_csv["CSV tools<br/>[CsvExporter.kt]"]
  node_pdf["PDF reports<br/>[PdfExporter.kt]"]
end

subgraph group_operations["Settings and services"]
  node_settings["App settings"]
  node_settingsmanager["Settings storage<br/>[SettingsManager.kt]"]
  node_sync["Sync coordination<br/>[SyncManager.kt]"]
  node_webdav["WebDAV client<br/>[WebDAVManager.kt]"]
  node_autosync["Scheduled sync<br/>[AutoSyncWorker.kt]"]
  node_update["Update checker<br/>[UpdateManager.kt]"]
end

node_user(("User"))
node_externalstorage(("WebDAV service"))

node_user -->|"launches"| node_launcher
node_launcher -->|"gates with"| node_biometric
node_biometric -->|"unlocks"| node_main
node_user -->|"uses"| node_main
node_main -->|"shows"| node_calendar
node_main -->|"edits records"| node_recorddialog
node_main -->|"presents"| node_attendancevm
node_attendancevm -->|"accesses"| node_repository
node_repository -->|"uses"| node_dao
node_dao -->|"reads and writes"| node_database
node_attendancevm -->|"handles"| node_models
node_user -->|"views"| node_report
node_user -->|"manages data"| node_manager
node_manager -->|"imports and exports"| node_export
node_export -->|"uses"| node_csv
node_report -->|"exports"| node_pdf
node_user -->|"configures"| node_settings
node_settings -->|"stores preferences"| node_settingsmanager
node_autosync -->|"triggers"| node_sync
node_sync -->|"transfers backup"| node_webdav
node_webdav -->|"syncs with"| node_externalstorage
node_settings -->|"configures sync"| node_sync
node_settings -->|"checks updates"| node_update

click node_launcher "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/LauncherActivity.kt"
click node_biometric "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/BiometricActivity.kt"
click node_main "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/MainActivity.kt"
click node_calendar "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/view/CalendarView.kt"
click node_recorddialog "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/dialog/AddOvertimeDialog.kt"
click node_attendancevm "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/viewmodel/AttendanceViewModel.kt"
click node_models "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/OvertimeModels.kt"
click node_calculators "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/OvertimeCalculator.kt"
click node_salary "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/SalaryCalculator.kt"
click node_report "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/ReportActivity.kt"
click node_repository "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/repository/RoomAttendanceRepository.kt"
click node_dao "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/db/AttendanceDao.kt"
click node_database "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/db/AppDatabase.kt"
click node_manager "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/DataManagerActivity.kt"
click node_export "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/DataExporter.kt"
click node_csv "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/CsvExporter.kt"
click node_pdf "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/PdfExporter.kt"
click node_settings "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/SettingsActivity.kt"
click node_settingsmanager "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/SettingsManager.kt"
click node_sync "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/SyncManager.kt"
click node_webdav "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/WebDAVManager.kt"
click node_autosync "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/AutoSyncWorker.kt"
click node_update "https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/UpdateManager.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_launcher,node_biometric,node_main,node_user toneBlue
class node_calendar,node_recorddialog,node_attendancevm,node_models,node_calculators,node_salary,node_report toneAmber
class node_repository,node_dao,node_database toneMint
class node_manager,node_export,node_csv,node_pdf toneRose
class node_settings,node_settingsmanager,node_sync,node_webdav,node_autosync,node_update,node_externalstorage toneIndigo
```

## Components

### App access

- [Launch gate](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/LauncherActivity.kt): `app/src/main/java/com/example/personalovertimerecord/LauncherActivity.kt`
- [Biometric unlock](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/BiometricActivity.kt): `app/src/main/java/com/example/personalovertimerecord/BiometricActivity.kt`
- [Calendar screen](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/MainActivity.kt): `app/src/main/java/com/example/personalovertimerecord/MainActivity.kt`

### Attendance and pay

- [Calendar view](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/view/CalendarView.kt): `app/src/main/java/com/example/personalovertimerecord/view/CalendarView.kt`
- [Record editor](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/dialog/AddOvertimeDialog.kt): `app/src/main/java/com/example/personalovertimerecord/dialog/AddOvertimeDialog.kt`
- [Attendance state](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/viewmodel/AttendanceViewModel.kt): `app/src/main/java/com/example/personalovertimerecord/viewmodel/AttendanceViewModel.kt`
- [Attendance models](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/OvertimeModels.kt): `app/src/main/java/com/example/personalovertimerecord/data/OvertimeModels.kt`
- [Overtime and pay](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/OvertimeCalculator.kt): `app/src/main/java/com/example/personalovertimerecord/utils/OvertimeCalculator.kt`
- [Salary calculation](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/SalaryCalculator.kt): `app/src/main/java/com/example/personalovertimerecord/utils/SalaryCalculator.kt`
- [Monthly reports](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/ReportActivity.kt): `app/src/main/java/com/example/personalovertimerecord/ReportActivity.kt`

### Local data

- [Attendance repository](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/repository/RoomAttendanceRepository.kt): `app/src/main/java/com/example/personalovertimerecord/repository/RoomAttendanceRepository.kt`
- [Attendance access](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/db/AttendanceDao.kt): `app/src/main/java/com/example/personalovertimerecord/data/db/AttendanceDao.kt`
- [Encrypted database](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/db/AppDatabase.kt): `app/src/main/java/com/example/personalovertimerecord/data/db/AppDatabase.kt`

### Data management

- [Data manager](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/DataManagerActivity.kt): `app/src/main/java/com/example/personalovertimerecord/DataManagerActivity.kt`
- [Import and export](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/DataExporter.kt): `app/src/main/java/com/example/personalovertimerecord/utils/DataExporter.kt`
- [CSV tools](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/CsvExporter.kt): `app/src/main/java/com/example/personalovertimerecord/utils/CsvExporter.kt`
- [PDF reports](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/PdfExporter.kt): `app/src/main/java/com/example/personalovertimerecord/utils/PdfExporter.kt`

### Settings and services

- [App settings](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/SettingsActivity.kt): `app/src/main/java/com/example/personalovertimerecord/SettingsActivity.kt`
- [Settings storage](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/data/SettingsManager.kt): `app/src/main/java/com/example/personalovertimerecord/data/SettingsManager.kt`
- [Sync coordination](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/SyncManager.kt): `app/src/main/java/com/example/personalovertimerecord/utils/SyncManager.kt`
- [WebDAV client](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/WebDAVManager.kt): `app/src/main/java/com/example/personalovertimerecord/utils/WebDAVManager.kt`
- [Scheduled sync](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/AutoSyncWorker.kt): `app/src/main/java/com/example/personalovertimerecord/utils/AutoSyncWorker.kt`
- [Update checker](https://github.com/tree-shady/personalovertimerecord/blob/main/app/src/main/java/com/example/personalovertimerecord/utils/UpdateManager.kt): `app/src/main/java/com/example/personalovertimerecord/utils/UpdateManager.kt`

### Other components

- **User**
- **WebDAV service**

## Connections

- User → Launch gate: launches
- Launch gate → Biometric unlock: gates with
- Biometric unlock → Calendar screen: unlocks
- User → Calendar screen: uses
- Calendar screen → Calendar view: shows
- Calendar screen → Record editor: edits records
- Calendar screen → Attendance state: presents
- Attendance state → Attendance repository: accesses
- Attendance repository → Attendance access: uses
- Attendance access → Encrypted database: reads and writes
- Attendance state → Attendance models: handles
- User → Monthly reports: views
- User → Data manager: manages data
- Data manager → Import and export: imports and exports
- Import and export → CSV tools: uses
- Monthly reports → PDF reports: exports
- User → App settings: configures
- App settings → Settings storage: stores preferences
- Scheduled sync → Sync coordination: triggers
- Sync coordination → WebDAV client: transfers backup
- WebDAV client → WebDAV service: syncs with
- App settings → Sync coordination: configures sync
- App settings → Update checker: checks updates
