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 · reproducible

Single 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-ready
CI/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.io
Swagger:
http://timesheetlite-app.thankfulsea-910a130e.northeurope.azurecontainerapps.io/swagger
What 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
  1. Open Monthly Report and pick Person, Month and Project.
  2. Review the KPIs (Selected project, All projects, Calendar, Insights).
  3. Click Print PDF to generate the TRS-style document for the selected project.
  4. Go to Year Overview and click a month cell to jump back filtered.
  5. 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/pdf
What 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.