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.
Health score
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.
Facts
| Languages | csharp |
| Frameworks | WinForms, WPF, LINQ to SQL |
| Runtimes | .NET 8 (windows) |
| Tests / CI | none / CI in place |
| Last commit | 2026-01-08 |
| Owner | Owner unknown (mapping to be curated) |
| Domain | Platform services (system generated; curate in repo-owners.json to override) |
| Product area | Phenix |
| Hosted | On-prem Deployed to our own machines
|
| Releases | 2 release pipeline(s): phenix-datamap; phenix-datamap release |
| Integration | rest, wcf, sqlserver |
| Source | Open in Azure DevOps |
Risk flags
Each flag links to its glossary definition.
Dependencies in context
Entanglement
kernel Bound into the core by 2 mechanism(s).
- Speaks WCF (client)
- Shares core database sqlserver:Phenix
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).
Depends on / used by
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 applicableNot 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 databasesqlserver: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.
- 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.
- Confirm the target: PostgreSQL (relational model; keep transactions and joins, swap the engine).
- 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.
- 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.
- Move reads to the target, watch correctness and latency, then cut writes over and keep SQL Server read-only until confidence is earned.
- Decommission the SQL Server database and remove the connection strings and firewall paths that pointed at it.
Containerisation
Not appropriateThis 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.