Time Tracking
The Time Tracking app provides a full time management solution with a live timer, manual entry logging, project organization, weekly overviews, reporting, and integration with the invoicing system for billable time.
Key Features
Section titled “Key Features”- Live timer with start, pause, resume, stop, and discard controls
- Manual time entry with duration input, project/customer assignment, and billable flag
- Today’s entries view with running totals
- Weekly overview bar chart (total vs. billable minutes per day)
- Project management with color coding and hourly rates
- Customer assignment via invoicing integration
- Configurable settings (default hourly rate, rounding increment, week start day)
- Report generation grouped by project, customer, or date
- Unbilled time summary for invoicing
Page Structure
Section titled “Page Structure”| Route | Purpose |
|---|---|
/business/apps/timetracking | Dashboard with timer, today stats, weekly chart, and today’s entries |
/business/apps/timetracking/entries | Full time entry list with filtering |
/business/apps/timetracking/projects | Project management (create, edit, archive) |
/business/apps/timetracking/reports | Report generation and export |
/business/apps/timetracking/settings | App configuration |
Dashboard
Section titled “Dashboard”The dashboard is the primary workspace, organized into several sections:
- Timer widget (
TimerWidgetcomponent) — live timer with project and customer selectors; supports start, pause, resume, stop, and discard actions via form submissions - Quick stats — two cards showing today’s total time and this week’s total
- Weekly overview — bar chart visualization with each day showing total (light) and billable (dark) bars, scaled relative to the max day
- Today’s entries — list rendered via
EntryRowcomponents with a “Quick Add” button - Quick nav — four-item grid linking to Entries, Projects, Reports, and Settings
Quick Add Entry
Section titled “Quick Add Entry”A dialog modal form for manual time entry with fields for:
- Description
- Date and duration (custom
DurationInputcomponent) - Project selector (color-coded options)
- Customer selector (from invoicing customers)
- Hourly rate and billable checkbox
Data Model
Section titled “Data Model”| Table | Description |
|---|---|
ext_timetracking.time_entries | Time entry records (date, duration, project, customer, billable, rate, invoiced) |
ext_timetracking.timer_states | Active timer state per user (started_at, elapsed_seconds, is_paused) |
ext_timetracking.projects | Projects with color, hourly rate, and billable default |
ext_timetracking.settings | Per-user settings (default rate, rounding, week start) |
Key Types
Section titled “Key Types”TimeEntry— id, user_id, project_id, customer_id, date, start_time, end_time, duration_minutes, description, is_billable, hourly_rate, invoiced, invoice_idTimerState— id, user_id, project_id, customer_id, description, started_at, elapsed_seconds, is_pausedProject— id, user_id, customer_id, name, description, color, hourly_rate, is_billable, is_activeTimeTrackingSettings— default_hourly_rate, rounding_increment, week_startDaySummary— date, total_minutes, billable_minutes, entries_countReportRow— group_key, group_label, total_minutes, billable_minutes, billable_amount, entries_countUnbilledSummary— customer_id, customer_name, total_minutes, total_amount, entry_count
Key Components
Section titled “Key Components”| Component | Location |
|---|---|
TimerWidget | $lib/apps/timetracking/modules/timer/index.js |
EntryRow | $lib/apps/timetracking/modules/entries/index.js |
DurationInput | $lib/apps/timetracking/modules/entries/index.js |
Services
Section titled “Services”Server-side logic lives in $lib/apps/timetracking/services/index.js:
getTimerState(userId)— fetch active timerstartTimer(userId, opts)/pauseTimer(userId)/resumeTimer(userId)/stopTimer(userId)/discardTimer(userId)— timer lifecyclegetEntriesToday(userId)— today’s time entriesgetWeeklySummary(userId, weekStart)— daily aggregates for the current weekgetSettings(userId)— user settingslistProjects(userId)— project listcreateEntry(userId, data)— manual entry creation
Form Actions
Section titled “Form Actions”| Action | Description |
|---|---|
start-timer | Start the timer with optional project, customer, and description |
stop-timer | Stop the timer and convert to a time entry |
pause-timer | Pause the running timer |
resume-timer | Resume a paused timer |
discard-timer | Discard the timer without saving |
create-entry | Manually add a time entry |