The starting point was an established .NET Framework shipping application with a separate Web API codebase. Both applications contained implementations of overlapping business operations. For example, a change to UPS rule retrieval could require corresponding updates in both codebases, followed by separate deployments.
The legacy user interface also relied on Telerik and DevExpress controls, including XtraGrid, date pickers and multi-column combo boxes. The modernization replaced these with reusable Razor, JavaScript and jQuery-based components. DevExpress XtraReports was also removed; invoice PDFs are now generated from language-specific HTML templates through an iText conversion pipeline.
The most important constraint was functional parity. Existing postal-code normalization, decimal handling, shipment calculations, carrier-specific rules and quotation behaviour all had to be preserved. I introduced a separate CoreServices class library shared by the ASP.NET Core web application and Web API, and used Playwright to compare the quotation journey in both applications against the same database.
This case study focuses on the engineering decisions behind that work: removing duplicated logic, creating reusable UI components, replacing report generation, isolating carrier implementations and validating the modern application against the established system.
Functional Parity
Reproduce the established live application's workflows and business rules in the modern application.
Reusable Grid Architecture
Replace Telerik and DevExpress XtraGrid controls with shared Razor-rendered grids and reusable JavaScript behaviour.
Custom HTML-Based Invoice PDFs
Replace DevExpress XtraReports with language-specific HTML templates, iText PDF conversion and ZUGFeRD XML embedding.
Shared CoreServices Library
Move overlapping business operations into a separate class library referenced by the web application and Web API.
Extensible Carrier Services
Use a common carrier shipment interface with individual UPS, DHL, DPD and Asendia implementations.
Legacy Rule Preservation
Retain country-specific postal-code handling, numeric normalization and shipment net-amount calculations.
Playwright Regression Testing
Compare every step of the quote-generation page between the legacy and modern applications using the same database.