Platform Evolution
Assessment run-2026-07-27-1 · 213 of 213 repos assessed
Repos / phenix-cms

phenix-cms

Windows desktop contract management system (CMS) for loading and maintaining accommodation contracts, media, and health & safety data in the Phenix platform.

47 · redhighkernelOn-premZDD: not applicableother

Health score

47

0 to 100 across seven weighted factors; nothing is hidden. Green is 75 and above, amber 50 to 74, red below 50. How scoring works.


Runtime currency / 25
0
.NET Framework, out of mainstream support
Legacy transport / 15
6
Calls at least one legacy WCF endpoint
Test posture / 15
8
Some tests, coverage is thin
Security hygiene / 15
15
No credentials found in source
Dangerous coupling / 15
3
shares a core database (sqlserver:Phenix); depends on pinning component(s): application-framework
Activity / 10
10
Actively maintained
Deployment hygiene / 5
5
CI in place
Health over time
2026-07-24 (run-2026-07-24-1): 472026-07-27 (run-2026-07-27-1): 47
No change since 2026-07-24 (47 to 47).

Facts

Languagescsharp, sql
FrameworksWPF, WinForms, MVVM Light
Runtimes.NET Framework 4.6.2
Tests / CIsome / CI in place
Last commit2026-02-24
OwnerOwner unknown (mapping to be curated)
DomainContent and destinations (system generated; curate in repo-owners.json to override)
Product areaPhenix
HostedOn-prem Deployed to our own machines
  • Release "\commercial\phenix-cms Release": Publish Live Clickonce: task "Extract files "
  • Release "\commercial\phenix-cms Release": Publish Live Clickonce: file copy to \\ukmaniis3\development\PhenixCMS
Releases2 release pipeline(s): \commercial\phenix-cms QA; \commercial\phenix-cms Release
Integrationwcf, rest, sqlserver-stored-procedures
SourceOpen in Azure DevOps

Risk flags

Each flag links to its glossary definition.

Dependencies in context

Laying out the graph…
greenamberreddata store (square, dashed link)Node size follows fan-in. Click any node to open it.

Entanglement

kernel Bound into the core by 3 mechanism(s).

Detaches when its pinning dependencies are cut or multi-targeted (application-framework); and when its WCF surface gains a modern interface or its WCF calls move to one; and when the shared database group it belongs to gains an owned API or completes schema separation (sqlserver:Phenix).

Migration playbooks

Generated from this repo's assessment data: what is feasible, what blocks it, and the steps in order. Ratings: green means actionable now, amber means sequence other work first, red means blocked, grey means not applicable.

ZDD adoption

Not applicable

Not a deployed service (libraries, database definitions, desktop apps) or a retirement candidate not worth the investment. Desktop application distributed to user machines; server-side ZDD does not apply.

SQL Server exit

Blocked by a shared core database

sqlserver:Phenix is shared, so this system cannot change engine on its own: every sharer moves in convoy. The stage 4 work (named owner, declarative schema, owned API) has to land first; after that, the steps below apply to whatever slice this system ends up owning.

Blockers
Steps
  1. Inventory the schema and query surface of sqlserver:Phenix, sqlserver:TransferStaging: tables, stored procedures, triggers, cross-database joins and anything else engine-specific.
  2. Confirm the target: PostgreSQL (relational model; keep transactions and joins, swap the engine).
  3. Replatform to modern .NET first (see the recommended actions): current PostgreSQL and MongoDB drivers and EF Core providers target modern .NET, and doing one risky change at a time is cheaper than doing two.
  4. Data access is not through an ORM, so port the SQL by hand: translate T-SQL constructs, replace stored procedures with application code or target-native equivalents, and add integration tests around the queries that matter first.
  5. Stored procedures are load-bearing here: rewrite them as application logic or target-native functions before any cutover.
  6. Stand up the target alongside SQL Server, backfill with an ETL pass (pgloader or an export/import job), then dual-write or replicate until parity is proven.
  7. Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
  8. Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.

Containerisation

Not appropriate

This is a desktop application distributed to user machines; containers do not apply. Its modernisation path is replacement by a web application, not containerisation.

Recommended actions

Replatform phenix-cms to modern .NET

Runs on .NET Framework 4.6.2, out of mainstream support. Blocked until stage 2 cuts: application-framework. Shares sqlserver:Phenix, so batch it with its database group (stage 4).

Impact: Reduces the end-of-life runtime count

proposed

Assessment notes

phenix-cms

Purpose

Internal Windows desktop application ("CMS") used by commercial teams to load and maintain accommodation contracts (rates, availability, board basis, special offers), media assets, and health & safety records for the Phenix booking platform. Includes a WPF contract-loading UI, an older WinForms application shell, and a media manager tool.

Tech stack

C# on .NET Framework 4.6.2. Mix of WPF (MVVM Light, AvalonDock) and WinForms projects in a single CMS.sln. Data access via TC.ConnectionBroker.Sql/TC.Phenix.DataAccess and a large library of hand-written SQL stored-procedure scripts (Sql Scripts/, 100+ files). Newtonsoft.Json, Microsoft.Extensions.DependencyInjection.

Deployment

Included as prod_application with 2 releases. Build pipelines: phenix-cms master-feature, phenix-cms release. Release pipelines under \commercial\: phenix-cms QA and phenix-cms Release. No pipeline YAML in the repo (classic ADO pipelines); deployment scripts pulled in via a deployment-scripts git submodule.

Dependencies

Heavy use of internal TC NuGet packages: TC.ConnectionBroker.* (tc-connectionbroker), TC.Phenix.ApplicationFramework (application-framework), TC.Exceptions.* (tc-exceptions), TC.Phenix.ExchangeRate (exchange-rate-service), TC.Phenix.Provider (phenix-provider), TC.ServiceContract.Linking (phenix-linking-service), TC.ServiceContract.Reviews (phenix-reviews), TC.Phenix.DirectStock (direct-stock), TC.UserAccount.ServiceClient (backoffice-useraccount-service), plus TC.ContactCentre.ServiceClient and TC.Cache. No notable third-party SaaS integrations.

Data stores

Talks directly to the shared Phenix SQL Server database (environment-specific names, e.g. PhenixStaging) via stored procedures, plus a TransferStaging database used by the media manager. Connection resolution goes through TC.ConnectionBroker rather than hard-coded connection strings.

Integration points

WCF service clients (TC.ConnectionBroker.Wcf, TC.ContactCentre.ServiceClient, user account service) and some REST clients (TC.Exceptions.WebApiClient). Direct SQL stored-procedure access to the shared database is the dominant integration style.

Code health

One MSTest test project (CMS.ContractLoading.ViewModelTests with Moq) covering the newer WPF view models only; the large WinForms CMS.Application project is untested. README is boilerplate. Actively maintained (last commit 2026-02-24) with recently bumped packages (Newtonsoft 13, MS.Extensions 10.x).

Modernisation risks

.NET Framework 4.6.2 desktop app (WPF + WinForms) — no path to cross-platform or web without a rewrite. Tight coupling to the shared Phenix database through hundreds of stored procedures. Legacy MVVM Light and AvalonDock 1.x UI libraries are unmaintained. Test coverage is thin relative to the app's size.