HERON (GEK TERNA Group)
Vendor Management Portal
Summary
An internal portal for managing external delivery vendors: filterable delivery tracking, multi-tab analytics, structured team feedback, admin-configurable scoring, and timesheet reconciliation against tracked effort. Deployed on Azure Static Web Apps.
Architecture
- The workbook library is pulled in by a dynamic import at the moment an export is requested rather than by a static import, so a heavy document dependency stays out of the initial bundle for the large majority of sessions that never export.
- Grid exports emit a workbook rather than comma separated values because the exported data mixes two scripts and contains range labels that a spreadsheet would silently coerce into dates. The reason is recorded next to the implementation.
- Multi value filters are encoded as repeated query parameters instead of a single joined value, so a filter value that itself contains a separator character survives the round trip intact.
- This is the only surface here that runs a client side query cache, configured with a five minute freshness window and a single retry, so switching between the analytics tabs reuses already fetched results instead of refetching a computed aggregate on every tab change.
Highlights
- Build-time Content-Security-Policy generation, with an invalid policy failing the build instead of shipping.
- Design-system invariants enforced mechanically: a custom lint gate, wired into pre-commit and pre-push, rejects hardcoded typography literals.
- Third-party rich text sanitized at the render boundary with DOMPurify.
- Responsive behavior treated as a regression surface via Playwright e2e specs covering mobile navigation and layout.
- Upstream issue data is held in a TTL bounded in memory cache guarded by an async lock, so concurrent requests arriving during a refresh collapse into a single upstream call instead of a stampede.
- The composite vendor score is a weighted average over a declared metric catalog, so adding a weightable metric is a single point change and weights stay administrator configurable at runtime.
- Cache warm up runs as a cancellable background task in the application lifespan, so a slow or unavailable upstream at boot cannot block startup.
Technologies
- Python
- FastAPI
- Azure Functions
- Azure Cosmos DB
- openpyxl
- python-pptx
- React 19
- TypeScript
- Azure Static Web Apps
- MSAL
- Playwright