For migration from Java/Spring Boot to ASP.NET Core MVC
Team: 1 developer (C#/ASP.NET expert) + Claude AI
Do this NOW while DDC support is still available
| # | Task | Status | Notes |
|---|---|---|---|
| 0.1 | Get answers to DDC questions (see DDC_QUESTIONS.md) | TODO | URGENT - they may disappear after handoff |
| 0.2 | Obtain sample calibration file (download.dat) | TODO | Ask DDC or find on file server |
| 0.3 | Get access to running application for walkthrough | TODO | Need to see actual user workflows |
| 0.4 | Document which screens/features are actually used | TODO | Ask end users - many screens may be dead code |
| 0.5 | Get XCompress.dll/so native library + documentation | TODO | Need for compression; check if source available |
| 0.6 | Confirm database connection details for dev environment | TODO | Server, credentials, VPN requirements |
| 0.7 | Get copy of production database (or sanitized subset) | TODO | Essential for testing entity mappings |
| # | Task | Depends On | Notes |
|---|---|---|---|
| 1.1 | Create ASP.NET Core 8.0 solution structure | - | Web API + MVC project, class libraries for Domain/Infrastructure |
| 1.2 | Configure Entity Framework Core with SQL Server | 0.6 | Connection string, DbContext, initial migration |
| 1.3 | Set up Keycloak/OIDC authentication | - | Use Microsoft.AspNetCore.Authentication.OpenIdConnect |
| 1.4 | Create base repository + unit of work interfaces | - | IRepository, IUnitOfWork |
| 1.5 | Set up logging (Serilog) | - | Match existing log levels and patterns |
| 1.6 | Configure development environment | 0.6 | Docker for Keycloak, SQL Server connection |
| 1.7 | Create DateHelper utility class | - | ParseYYYYMMDD, ParseYYDDD, ParseCYYMMDD, ParseHHMMSS |
This is the foundation - everything else depends on it
| # | Task | Depends On | Notes |
|---|---|---|---|
| 2.1 | Map reference tables to EF Core entities | 1.2 | R24NB0US, R24NB3US, R24NB4US, CUST_CODE, CUST01, DBPACF01 (6 tables, simple) |
| 2.2 | Map MGAPROOT hierarchy to EF Core | 2.1 | MGAPROOT + CMPNTSEG + CMPATSEG + CNOTESEG + NOTESEG (5 tables, cascade delete) |
| 2.3 | Map DDEC2 hierarchy to EF Core | 2.1 | SDD2ROOT -> SDD2UNIT -> SDD2HIST, SDD2PROG (4 tables) |
| 2.4 | Map DDEC3 hierarchy to EF Core | 2.1 | SDD3UNIT (214 cols!) + SDD3HIST + SDD3PROG + SDD3FINC + SDD3RECV (5 tables) |
| 2.5 | Map DDEC5 hierarchy to EF Core | 2.1 | SDD5UNIT (245 cols!) + SDD5HIST + SDD5PROG + SDD5FINC (4 tables) |
| 2.6 | Map complex reference tables | 2.1 | R24NA2US, R24NA7US (432 cols!), R24NA9US, R24NB5-8US |
| 2.7 | Map binary/calibration data tables | 2.2 | SDCRBASE, SDBMD3BS, SDBMD5BS |
| 2.8 | Map remaining tables | 2.1 | R24OCSEG, R24SPSEG, MGAPCNTL, MGAPINAC, MGAPMISC, MGAPRULE |
| 2.9 | Create repository implementations | 2.1-2.8 | One per aggregate root: MgapRoot, Ddec2SalesOrder, Ddec3Unit, Ddec5Unit |
| 2.10 | Create unit of work implementation | 2.9 | Wraps DbContext transaction |
| 2.11 | Write integration tests against real DB | 2.9, 0.7 | CRUD operations for each entity |
Port the calibration processing engine - this is the heart of the application
| # | Task | Depends On | Notes |
|---|---|---|---|
| 3.1 | Port EncodingUtil (XOR + nibble swap) | - | Straightforward bit manipulation in C# |
| 3.2 | Port EBCDIC conversion utility | - | NuGet: System.Text.Encoding.CodePages, use Encoding.GetEncoding(37) |
| 3.3 | Integrate XCompress native library | 0.5 | P/Invoke to XCompress.dll/so for DCL Implode compression |
| 3.4 | Port V2DdecCalibrationSplitter | 3.1, 3.2 | Core file parser - 16 record types, mixed EBCDIC/binary |
| 3.5 | Port download request builder (replaces R24kd500sh) | 3.4 | Direct DB queries instead of SFTP + batch script |
| 3.6 | Port release request builder (replaces R24kd505sh) | 3.4 | Direct DB updates instead of SFTP + batch script |
| 3.7 | Port ZIP file assembly logic | 3.4, 3.3 | System.IO.Compression.ZipArchive |
| 3.8 | Create Engineering API controller | 3.5, 3.6, 3.7 | GET /api/engineering/basecal, POST process, POST release |
| 3.9 | Write unit tests for encryption/decryption | 3.1 | Test round-trip encrypt/decrypt with known test vectors |
| 3.10 | Write unit tests for calibration splitter | 3.4, 0.2 | Use sample calibration file |
Focus on the screens users actually need
| # | Task | Depends On | Notes |
|---|---|---|---|
| 4.1 | Create Razor Pages layout + shared components | 1.1, 1.3 | Navigation, header, footer, auth display |
| 4.2 | Build main menu (replaces R24pmenu) | 4.1 | Entry point - links to all functions |
| 4.3 | Build calibration download page | 4.1, 3.8 | Replaces engineering/download-calibration.jsp |
| 4.4 | Build calibration release page | 4.1, 3.8 | Replaces engineering/release-calibration.jsp |
| 4.5 | Build unit search/display screens | 4.1, 2.4, 2.5 | DDEC3 + DDEC5 unit lookup and display |
| 4.6 | Build unit change screens | 4.5 | Modify unit parameters |
| 4.7 | Build history display/change screens | 4.5 | View and modify history records |
| 4.8 | Build SPDB admin page | 4.1, 2.8 | Replaces SpdbController |
| 4.9 | Build access denied / error pages | 4.1 | Standard error handling |
Must Have (used regularly):
Probably Needed:
Likely Dead Code (verify with users):
Only port what's actually called - many COBOL programs may be dead code
| # | Task | Depends On | Priority | Notes |
|---|---|---|---|---|
| 5.1 | Identify which R24* programs are actually invoked | 0.3, 0.4 | P2 | Trace from menu/screen flow |
| 5.2 | Port R24pmenu (main menu logic) | 2.4 | P2 | Menu navigation and authorization |
| 5.3 | Port unit management programs | 2.4, 2.5 | P2 | R24pchun, R24p5chn - change unit |
| 5.4 | Port search/find programs | 2.4, 2.5 | P2 | R24pfind and similar |
| 5.5 | Port history programs | 2.4 | P2 | R24pslhp - select history |
| 5.6 | Port BOM programs | 2.2, 2.3 | P3 | R19pbm4d, R19pbm4m, R19pbm4u - if needed |
| 5.7 | Port DDEC II programs | 2.3 | P3 | R19pd2un etc. - only if DDEC II is still used |
| 5.8 | Port file extract programs | 2.4, 2.5 | P3 | R24pfe01-08 - billing extracts |
| 5.9 | Port date/utility functions | - | P2 | Cobdate, Gredate, Bomedit, DdecFunctions |
The client can't compile and must be rewritten. Design a modern replacement.
| # | Task | Depends On | Notes |
|---|---|---|---|
| 6.1 | Document current C++ client functionality | 0.3 | What does the DRS client actually do? |
| 6.2 | Design new client architecture | 6.1 | WPF? .NET MAUI? Web-only? Depends on requirements |
| 6.3 | Implement client authentication (OIDC) | 6.2, 1.3 | Token-based auth with Keycloak |
| 6.4 | Implement calibration download in client | 6.2, 3.8 | Call API, receive ZIP, extract |
| 6.5 | Implement calibration upload/release in client | 6.2, 3.8 | Select file, call API, show status |
| 6.6 | Implement ECM communication | 6.1 | THIS IS THE BIG UNKNOWN - how does current client talk to ECM? |
| # | Task | Depends On | Notes |
|---|---|---|---|
| 7.1 | Create integration test suite | Phase 2-3 | Test against real database |
| 7.2 | End-to-end testing with users | Phase 4-5 | Get actual users to validate workflows |
| 7.3 | Performance testing | Phase 2-5 | Ensure acceptable response times |
| 7.4 | Security review | All phases | Auth, authorization, input validation |
| 7.5 | Deployment to staging environment | All phases | Match current server setup or modernize |
| 7.6 | User acceptance testing | 7.2, 7.5 | Final sign-off before cutover |
| 7.7 | Production cutover | 7.6 | Clean cutover - old and new at same time |
| # | Task | Depends On | Notes |
|---|---|---|---|
| 8.1 | Modernize date columns (VARCHAR -> DATE) | 7.7 | Can be done gradually after migration |
| 8.2 | Add proper indexes | 7.7 | Performance optimization based on actual usage |
| 8.3 | Replace XOR encryption with AES | 7.7 | Modern encryption for new calibration files |
| 8.4 | Replace DCL Implode with standard ZIP | 7.7 | If client is also new, no backward compat needed |
| 8.5 | Remove dead code/screens | 7.7 | After confirming what's not used |
| Risk | Impact | Mitigation |
|---|---|---|
| DDC disappears before questions answered | HIGH | Ask questions NOW (see DDC_QUESTIONS.md) |
| XCompress native library not available | HIGH | Need source or documentation to reimplement |
| Can't get sample calibration file | MEDIUM | Can't test splitter without real data |
| DDEC II still in use (doubles scope) | MEDIUM | Confirm with users before porting R19* code |
| C++ client ECM communication unknown | HIGH | Need to understand serial/CAN protocol |
| Database has orphaned records (NOCHECK) | LOW | Defensive coding in EF Core, null checks |
| R24NA7US has 432 columns | LOW | Tedious but mechanical - Claude can help |