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

phenix-datamap

Windows desktop tool (Phenix Data Mapper) for mapping third-party supplier reference data — places, airports, car-hire depots, transfer points, attractions — onto Phenix entities via a plugin-per-supplier model.

67 · ambermediumkernelOn-premZDD: not applicableother

Health score

67

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
25
Runs on supported modern .NET
Legacy transport / 15
6
Calls at least one legacy WCF endpoint
Test posture / 15
0
No tests
Security hygiene / 15
15
No credentials found in source
Dangerous coupling / 15
8
shares a core database (sqlserver:Phenix)
Activity / 10
8
Last commit six to twelve months ago
Deployment hygiene / 5
5
CI in place
Health over time
2026-07-24 (run-2026-07-24-1): 672026-07-27 (run-2026-07-27-1): 67
No change since 2026-07-24 (67 to 67).

Facts

Languagescsharp
FrameworksWinForms, WPF, LINQ to SQL
Runtimes.NET 8 (windows)
Tests / CInone / CI in place
Last commit2026-01-08
OwnerOwner unknown (mapping to be curated)
DomainPlatform services (system generated; curate in repo-owners.json to override)
Product areaPhenix
HostedOn-prem Deployed to our own machines
  • Release "phenix-datamap": AppLauncher: file copy to \\storage.travelcounsellors.com\builds\PhenixDataMap\$(Relea
  • Release "phenix-datamap release": Publish Live: file copy to \\ukmaniis3\Development\PhenixDataMap
  • Release "phenix-datamap release": Publish Preproduction: file copy to \\ukmaniis3\Development\PhenixDataMapBeta
Releases2 release pipeline(s): phenix-datamap; phenix-datamap release
Integrationrest, wcf, sqlserver
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 2 mechanism(s).

Detaches 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:HotelsMulticom, sqlserver:HotelsW2M, sqlserver:HotelsJacobsTravel, sqlserver:HotelsMedHotels: 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. 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.
  4. 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.
  5. Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
  6. 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

No specific actions for this repo. It either needs only normal maintenance, or its work is covered by an estate-level action. See the full programme.

Assessment notes

phenix-datamap

Purpose

Phenix Data Mapper is an internal WinForms desktop tool for the data team: it loads supplier reference data (Galileo places, airports, Avis/Alamo/EHI/SunnyCars car-hire depots, HolidayTaxis/ResortHoppa transfer points, Musement/Bedsonline attractions, emergency contacts, non-refundable place config, etc.) and maps it to Phenix master data through a plugin per supplier (src/Plugins/, ~40 plugins driven by Plugins.xml).

Tech stack

C# single-project WinForms/WPF app on net8.0-windows (recently migrated from .NET Framework — the csproj still carries ClickOnce publish properties and a ClickOnce.pfx). Data access mixes raw System.Data.SqlClient via TC.ConnectionBroker.Sql / TC.Phenix.DataAccess with legacy LINQ to SQL .dbml models for the Multicom and W2M hotel databases. EPPlus for spreadsheet import/export, Polly, Microsoft.Extensions DI/logging, TC.Authentication.ActiveDirectory with Azure AD settings in appsettings.json.

Deployment

Included as prod_application with 2 releases (phenix-datamap, phenix-datamap release) from classic build pipelines phenix-datamap and phenix-datamap develop-clone — no YAML in the repo and the deployment-scripts/ folder is empty. Historically published via ClickOnce to an internal share/URL (development.travelcounsellors.com/PhenixDataMap).

Dependencies

Internal packages: TC.ConnectionBroker.* 1.13.x (tc-connectionbroker), TC.Exceptions.WebApiClient (tc-exceptions), TC.Phenix.User.API.Client (phenix-user-api, brokered HTTP client PhenixUser), TC.UserAccount.ServiceClient (backoffice-useraccount-service, used for login authentication), plus TC.Phenix.ClientApiLibrary, TC.Phenix.DataAccess and TC.Authentication.ActiveDirectory (no confirmed source repos). External: Azure AD (tenant/client IDs in appsettings).

Data stores

Main work happens against the shared Phenix SQL Server database (via ConnectionBroker DatabaseConstants.PhenixDatabaseName, ~70 call sites). Side databases for supplier feeds: HotelsMulticom, HotelsW2M and HotelsJacobsTravel (LINQ to SQL / Settings connection strings pointing at ukbolsql3 with integrated security) and HotelsMedHotels via ConnectionBroker.

Integration points

Direct SQL against Phenix and the Hotels* databases; brokered REST call to the Phenix User API; WCF connection broker registered for the UserAccount service client. No messaging.

Code health

No test projects at all. README is untouched boilerplate. Actively maintained enough to have been ported to .NET 8 (last commit 2026-01-08), but the codebase carries legacy baggage: LINQ to SQL designer files, hard-coded dev server names in Settings.Designer.cs, and a checked-in ClickOnce.pfx certificate.

Modernisation risks

Runtime is modern (.NET 8) so EOL pressure is low, but it is a Windows-only thick client writing straight into the shared Phenix database, so schema changes there can silently break it. Zero automated tests over ~40 mapping plugins makes regressions likely; the LINQ to SQL models and hard-coded connection defaults should move to brokered configuration. Medium priority: modern stack, but untested and tightly coupled to shared data.