Timesheet Lite
A compact .NET 8 demo focused on real-world reporting: EF Core aggregations, KPI endpoints, Swagger-ready APIs, and TRS-style PDF exports.
.NET 8
ASP.NET Core MVC
EF Core
Azure SQL
Docker
Azure Container Apps
ACR
GitHub Actions
Health Checks
Deployed via GitHub Actions ✅
— push to
main builds, tests, publishes the Docker image, and updates the running revision.
Runtime: Azure Container Apps · DB: Azure SQL · Config: env vars + secrets (no credentials in code)
Demo default: David Reyes · 2026-01
Seed range: 2026-01-02 → 2026-01-29
DB provider: Microsoft.EntityFrameworkCore.SqlServer
People
3
Projects
2
Entries
64
Focus
Reporting
KPIs · PDF · APIs
How to evaluate this demo
Monthly → KPIs + project filter → PDF. Then Year Overview → click a month cell to jump back filtered.
Architecture at a glance
cloud-ready · reproducibleSingle codebase with predictable routes, a relational model, and reporting-first queries. Deployment is container-based and configuration is environment-driven.
UI
ASP.NET Core MVC
- Razor views + Bootstrap layout
- Monthly / Year navigation
- Server-rendered filters + KPIs
API
OpenAPI / Controllers
- REST endpoints for demo data
- Swagger for discovery & testing
- Report metadata endpoints
Try:
GET /api/people
DATA
EF Core + Azure SQL
- Relational model (people, projects, WPs, entries)
- Migrations + seed for realistic output
- SQLite fallback locally (optional)
Cloud & Ops (what makes it “production-shaped”)
review-readyCI/CD
- GitHub Actions: build + test on push to
main - Docker image published to Azure Container Registry
- Deploy via Container Apps revision update (rollback-ready)
Config & Secrets
- DB connection injected via Container Apps secrets
- App reads
ConnectionStrings__SqlServer - No passwords in repo / Dockerfile / launchSettings
Health checks
-
Liveness:
/health/live(self) -
Readiness:
/health/ready(self + db) - Used by Azure probes to gate traffic to healthy revisions
Live:
http://timesheetlite-app.thankfulsea-910a130e.northeurope.azurecontainerapps.ioSwagger:
http://timesheetlite-app.thankfulsea-910a130e.northeurope.azurecontainerapps.io/swaggerWhat this demo showcases
- EF Core reporting queries (
AsNoTracking, filtering, grouping, aggregation). - KPI-driven reporting (month totals, calendar stats, insights).
- TRS-style PDF export generated server-side with QuestPDF.
- Project-aware reporting: selecting a project changes WPs, totals and PDF output.
- OpenAPI / Swagger endpoints to test the APIs quickly.
Built with
.NET 8 / ASP.NET Core MVC
Controllers + Razor views
EF Core
SQL Server provider (Azure SQL)
QuestPDF
PDF layout & export
Swagger (OpenAPI)
API discovery & testing
Bootstrap
UI layout & components
Quick demo tour
- Open Monthly Report and pick Person, Month and Project.
- Review the KPIs (Selected project, All projects, Calendar, Insights).
- Click Print PDF to generate the TRS-style document for the selected project.
- Go to Year Overview and click a month cell to jump back filtered.
- Open Swagger to test the APIs.
API quickstart
List people:
GET /api/people
Available monthly projects:
GET /api/reports/monthly-projects?personId=1&month=2026-01
Download PDF:
GET /reports/monthly/1/2026-01/pdfWhat to look for (engineering)
- Clear separation of concerns: controllers, view models, PDF generator.
- Queries optimized for reporting: grouping/aggregation, avoiding unnecessary tracking.
- Predictable routes + parameters (month format
yyyy-MM). - Seeded data producing realistic output (holidays, leaves, travels, multiple WPs).
- 12-factor friendly config: appsettings + env vars + secrets.