Work tracking
Track professional work across multiple jobs, each with a type-specific track hierarchy, sessions (time logs) with live timers or manual entry, and job-type-specific planning:
- Software engineering — per-job team roster, tickets on projects (status, priority, ETA, assignees, checklist tasks), optional session→ticket link
- Client-based — project metadata (status, ETA, budget, rate, notes) and milestones on client projects
- Store — launch profile, flat areas, milestones (with kind), team, suppliers, ops tasks, inventory, shifts, and P&L (finance transactions linked by
work_job_id)
Job types
| Type | Tracks | Planning | Session fields |
|---|---|---|---|
SOFTWARE_ENGINEERING | Flat projects | Tickets + checklist tasks per project; per-job people roster | Required activityCategory; optional ticketId |
CLIENT_BASED | Clients → projects | Project metadata + milestones | Optional billable |
STORE | Flat areas (PROJECT tracks) | Area metadata + milestones (milestoneKind, renewalDate) | Required store activityCategory |
Creating a STORE job with seedLaunchTemplate: true (default) seeds areas (Permits, Fit-out, Inventory), permit milestones, and an empty store profile.
Dates on the wire use dd/MM/yyyy for calendar fields (startDate, endDate, etaDate, dueDate, etc.).
Domain model
| Table | Purpose |
|---|---|
work_people | Per-job roster (SE + STORE) |
work_tickets | SE work items on a project track |
work_ticket_tasks | Checklist items on a ticket |
work_milestones | Client/store deliverables (milestone_kind, renewal_date) |
work_tracks | Project metadata columns |
work_sessions | Optional ticket_id; activity_category as varchar (SE + store enums) |
work_store_profiles | 1:1 store business profile per job |
work_store_suppliers | Vendors per store job |
work_store_tasks | Operational tasks |
work_store_task_templates | Recurring checklist templates (generate instances via API) |
work_store_products | SKU catalog per store |
work_store_stock_events | RECEIVE / SALE / ADJUST / WASTE |
work_store_shifts | Staff shift records |
transactions.work_job_id | Optional FK for store P&L |
Enums: WorkTicketStatus, WorkTicketPriority, WorkProjectStatus, WorkMilestoneKind, WorkStoreActivityCategory, WorkStoreTaskStatus, WorkStoreStockEventType (shared + server).
Validation (server):
- Tickets only when
jobType == SOFTWARE_ENGINEERING - Milestones on
PROJECTtracks forCLIENT_BASEDorSTORE - Store APIs require
jobType == STORE - Store sessions require a store activity category
API (/api/v1/work)
Requires feature flag WORK enabled for the client platform (X-Platform header).
Core routes unchanged; store routes (under /work/jobs/{jobId}/ unless noted):
| Method | Path | Description |
|---|---|---|
| GET/PUT | store-profile | Get / upsert store profile |
| GET | store-pnl?startDate=&endDate= | Income/expense totals for linked transactions |
| GET/POST | store-suppliers | List / create suppliers |
| PATCH/DELETE | /work/store-suppliers/{id} | Update / delete supplier |
| GET/POST | store-tasks | List / create ops tasks |
| PATCH/DELETE | /work/store-tasks/{id} | Update / complete / delete task |
| GET/POST | store-task-templates | List / create templates |
| POST | store-task-templates/generate | Instantiate tasks from templates |
| DELETE | /work/store-task-templates/{id} | Delete template |
| GET/POST | store-products | List / create products |
| PATCH/DELETE | /work/store-products/{id} | Update / delete product |
| GET/POST | /work/store-products/{id}/stock-events | Stock history / add event |
| GET/POST | store-shifts | List / create shifts |
| PATCH/DELETE | /work/store-shifts/{id} | End shift / delete |
POST /work/jobs body may include seedLaunchTemplate (boolean, default true for new STORE jobs).
Desktop UI
Sidebar entry Work (when WORK flag is on). Hub navigation: left menu + one full-width screen per area.
| Section | STORE | SE | Client |
|---|---|---|---|
| Overview | yes | yes | yes |
| Store profile | yes | — | — |
| Structure (areas / projects) | yes | yes | yes |
| Planning | yes | tickets | metadata |
| Suppliers / Tasks / Inventory / Shifts / P&L | yes | — | — |
| Time log | yes | yes | yes |
| Team | yes | yes | — |
Composable modules: composeApp/.../ui/screens/work/ (WorkStorePanels, WorkNavigation, WorkOverviewContent, etc.).
Enable locally
UPDATE feature_flags SET enabled = true WHERE feature_key = 'WORK' AND platform = 'DESKTOP';Also ensure OTER is enabled for the platform.
Code layout
| Layer | Path |
|---|---|
| Server entities | server/.../database/entities/Work*.kt, WorkStoreEntities.kt |
| Server service | server/.../service/WorkService.kt, WorkStoreService.kt |
| Server routes | server/.../routing/WorkRouting.kt |
| Shared models | shared/.../models/Work*.kt, WorkStore.kt |
| Shared HTTP | shared/.../services/work/WorkService.kt |
| Desktop UI | composeApp/.../ui/screens/WorkScreen.kt, ui/screens/work/*, WorkViewModel.kt |
Migrations: V10__work_tracking.sql, V12__work_tickets_and_project_management.sql, V13__work_store_phase1.sql, V14__work_store_operations.sql, V15__work_store_inventory_and_finance.sql