javac couldn't infer List<Object[]> from List.of(row) when row is Object[];
adding the explicit type witness List.<Object[]>of(row) resolves the
ambiguous overload that caused the compilation error.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TimeEntryRepositoryTest (@DataJpaTest): inserts entries across two weeks,
asserts date-range query returns only the correct slice
- ReportServiceTest (@ExtendWith(MockitoExtension)): mocks repository,
covers weekly aggregation, parseIsoWeekToMonday returning a Monday,
and monthly breach detection (both time and cost thresholds)
- TimeEntryEndToEndTest (@SpringBootTest + MockMvc): POST a 90-min entry,
GET /api/reports/weekly, assert weekTotalMinutes=90
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- User, Project, TimeEntry JPA entities with SLF4J logging in services
- Native SQL aggregate queries: per-day (weekly) and per-project (monthly)
both using COALESCE(project_rate, user_rate) for cost calculation
- ReportService parses ISO week/month strings, fills zero-day gaps,
computes timeBudgetPct / costBudgetPct / breached per project
- ProjectService piggybacks on aggregateAllByProject for budget status
on GET /api/projects (no N+1)
- GlobalExceptionHandler maps validation errors → 400 ProblemDetail,
EntityNotFoundException → 404, IllegalArgumentException → 400
- Lombok on pom.xml (optional, used for @Getter/@Setter/@NoArgsConstructor)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
V1 creates users, projects, time_entries with CHECK constraints and
three indexes (entry_date, project_id, user+date composite).
V2 seeds 3 users (Alice/Bob/Clara) and 3 projects, one with a
project-level hourly rate override (Acme Relaunch).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sets up toolchain pinning, format/lint (Biome + Spotless), lefthook
pre-commit hooks, Docker Compose for Postgres, and trivial passing
tests for both stacks.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>