← All case studies

Legacy Modernization & Platform Engineering · Government / Federal Acquisition

Financial Reporting Platform Modernization for a Federal Acquisition Program

Industry

Government / Federal Acquisition

Engagement type

Legacy Modernization & Platform Engineering

Methodology

6-step approach

Capabilities

Platform ModernizationArchitecture LeadershipRegulated Environment DeliveryEngineering Enablement

We designed and led the modernization of a federal contract management and financial reporting platform — migrating from 30+ isolated SSRS report pages, ASP.NET WebForms on .NET Framework 4.8, and session-based filter state to a unified React 18 + ASP.NET Core 9 analytical workspace. The new platform consolidated a fragmented reporting surface into a single tabbed environment with a persistent global filter bar, URL-driven state, and live financial dashboards backed by existing stored procedures via Dapper — with no stored procedure changes and no disruption to the running legacy application.

The challenge

The platform served a federal acquisition program tracking hundreds of contracts, task orders, periods of performance, and cost reports across multiple contractors and departments. Over years of incremental development, the reporting layer had fragmented into 30+ isolated pages — each with its own filter setup, no shared state, and no bookmarkable views. Users re-entered contractor, contract, and period-of-performance selections on every page. The embedded report server was a standalone infrastructure dependency requiring separate maintenance and licensing.

The application ran on ASP.NET WebForms — a stack with no upgrade path to .NET Core. Session keys were used to pass filter state between pages, making navigation context fragile and non-shareable. Authentication had accumulated multiple conflicting library versions across partial integration work over the years.

The organization needed a migration path that preserved the existing stored procedures — which contained production-validated government financial calculations — reduced the report server dependency, and delivered a measurably better user experience without a full-stop rewrite that risked service continuity.

The approach

We began with a structured pre-work phase: auditing all session state keys across the codebase, mapping each key to its producer and consumer pages, cataloguing stored procedure parameters that had been sourced from session state, and assessing the legacy data layer for overlap with the write-side domains scheduled for migration. This audit drove migration sequencing and prevented hidden session dependencies from surfacing mid-implementation.

The migration strategy was strangler fig — a new ASP.NET Core 9 API and React 18 SPA ran alongside the legacy system, sharing the same SQL Server database, consuming one domain at a time. The legacy application continued operating for all write operations and non-migrated reports throughout. The reporting workspace was redesigned from the ground up: a single 6-tab shell with a persistent global filter bar, full URL state encoding for every filter and tab combination, and live financial dashboard data from existing stored procedures called via Dapper with no proc changes.

01Session State Audit02Strangler Fig Migration03Permission Service Consolidation04URL-Driven Filter State05Financial Dashboard06Operational Workspace
01

Session State Audit

Mapped all session keys across the codebase to their producer and consumer pages before writing a line of new code. This drove migration sequencing and surfaced hidden navigation dependencies that would have blocked delivery mid-phase.

02

Strangler Fig Migration

New API and SPA deployed alongside the legacy app, sharing the database. Legacy handled writes and non-migrated reports throughout; the new app consumed one domain at a time with no disruption to live operations.

03

Permission Service Consolidation

Replaced ~100 scattered per-page permission checks with a single typed IPermissionService backed by the existing RBAC tables, with results cached per user per permission. One auditable code path replaced a sprawl of inconsistent checks.

04

URL-Driven Filter State

Replaced session-based filter passing with full URLSearchParams encoding. Every filter and tab combination is a unique, bookmarkable URL — shared links work without re-entry, and browser navigation works correctly for the first time.

05

Financial Dashboard

Existing stored procedures called via Dapper with no changes to proc code; burn rate calculation and summary aggregation moved to the C# service layer; React renders KPI cards, a budget-vs-actual grouped bar chart, and a sortable POP detail grid with Excel export.

06

Operational Workspace

Hierarchical drill-down (Contractor → Contract → Task Order → Period of Performance → Cost Reports) with inline CRUD replacing the legacy dashboard, connected directly to the reporting workspace via pre-populated deep links.

Why it matters

Government financial platforms accumulate architectural debt in distinct layers — conflicting auth libraries, session state woven through navigation, reports scattered across standalone pages with no shared context. Untangling it requires discipline at the seams: a session dependency map before any migration work begins, a permission consolidation strategy that replaces sprawl with a single auditable path, and a strangler fig approach that never breaks the running system. Done right, the new platform is measurably better for users and measurably cheaper to operate and extend.

Technologies & domains

ASP.NET Core 9C#React 18TypeScriptDapperSQL ServerOkta / JWTViteAG GridRechartsEPPlusFederal Acquisition

Outcome

The financial reporting workspace consolidated 30+ isolated pages into a single tabbed environment where filter state persists across all report views and every combination is bookmarkable and shareable. The embedded report server dependency was eliminated for the financial reporting domain, with remaining tabs following in subsequent phases. The operations team gained a unified filter context rather than re-entering contractor and contract selections on every page.

Key results

8 documented
  • 30+ isolated report pages consolidated into a single 6-tab analytical workspace
  • Report server dependency eliminated for the financial reporting domain
  • Filter re-entry eliminated — global filter bar persists across all tabs with URL encoding
  • Every filter and tab combination bookmarkable and shareable via URL
  • ~100 scattered permission checks replaced by one typed, cached permission service
  • Session-based state fully replaced by JWT claims and URL parameters
  • Legacy application continued operating without disruption throughout migration
  • Existing stored procedures preserved unchanged — production-validated financial calculations untouched

Capabilities applied

  • Platform Modernization
  • Architecture Leadership
  • Regulated Environment Delivery
  • Engineering Enablement
Start a conversation

Work with Protabyte

Ready to tackle a similar challenge?

Every engagement starts with a focused conversation. No obligation, no sales pitch. Just an honest assessment of where we can help.

Discuss a modernization engagement