# Architecture Cleanup Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Refactor the solution to achieve full Clean Architecture compliance by consolidating interfaces, creating Infrastructure project, merging SearchProcessing into DataAccess, and cleaning up Core. **Architecture:** Create new Infrastructure project for external system implementations (Oracle, LDAP). Consolidate all `ILotFinderRepository` partials into Core. Merge SearchProcessing into DataAccess. Enable Client to reference Core for shared ViewModels. **Tech Stack:** .NET 10, Dapper, Oracle.ManagedDataAccess, System.DirectoryServices.Protocols, ClosedXML --- ## Phase 1: Create Infrastructure Project ### Task 1.1: Create Infrastructure Project Structure **Files:** - Create: `NEW/src/JdeScoping.Infrastructure/JdeScoping.Infrastructure.csproj` **Step 1: Create project directory** Run: ```bash mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Jde mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Cms mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Auth mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Extensions ``` **Step 2: Create project file** Create file `NEW/src/JdeScoping.Infrastructure/JdeScoping.Infrastructure.csproj`: ```xml net10.0 enable enable ``` **Step 3: Verify project file created** Run: ```bash cat /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/JdeScoping.Infrastructure.csproj ``` Expected: Shows the XML content above. --- ### Task 1.2: Move JDE Oracle Data Source **Files:** - Move: `NEW/src/JdeScoping.Core/Repositories/Jde/JdeOracleDataSource.cs` → `NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeOracleDataSource.cs` **Step 1: Copy file to new location** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Jde/JdeOracleDataSource.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeOracleDataSource.cs ``` **Step 2: Update namespace in new file** Edit `NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeOracleDataSource.cs`: Change: ```csharp namespace JdeScoping.Core.Repositories.Jde; ``` To: ```csharp namespace JdeScoping.Infrastructure.Sources.Jde; ``` **Step 3: Delete original file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Jde/JdeOracleDataSource.cs ``` --- ### Task 1.3: Move JDE File Data Source **Files:** - Move: `NEW/src/JdeScoping.Core/Repositories/Jde/JdeFileDataSource.cs` → `NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeFileDataSource.cs` **Step 1: Copy file to new location** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Jde/JdeFileDataSource.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeFileDataSource.cs ``` **Step 2: Update namespace in new file** Edit `NEW/src/JdeScoping.Infrastructure/Sources/Jde/JdeFileDataSource.cs`: Change: ```csharp namespace JdeScoping.Core.Repositories.Jde; ``` To: ```csharp namespace JdeScoping.Infrastructure.Sources.Jde; ``` **Step 3: Delete original file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Jde/JdeFileDataSource.cs ``` --- ### Task 1.4: Move CMS Oracle Data Source **Files:** - Move: `NEW/src/JdeScoping.Core/Repositories/Cms/CmsOracleDataSource.cs` → `NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsOracleDataSource.cs` **Step 1: Copy file to new location** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Cms/CmsOracleDataSource.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsOracleDataSource.cs ``` **Step 2: Update namespace in new file** Edit `NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsOracleDataSource.cs`: Change: ```csharp namespace JdeScoping.Core.Repositories.Cms; ``` To: ```csharp namespace JdeScoping.Infrastructure.Sources.Cms; ``` **Step 3: Delete original file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Cms/CmsOracleDataSource.cs ``` --- ### Task 1.5: Move CMS File Data Source **Files:** - Move: `NEW/src/JdeScoping.Core/Repositories/Cms/CmsFileDataSource.cs` → `NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsFileDataSource.cs` **Step 1: Copy file to new location** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Cms/CmsFileDataSource.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsFileDataSource.cs ``` **Step 2: Update namespace in new file** Edit `NEW/src/JdeScoping.Infrastructure/Sources/Cms/CmsFileDataSource.cs`: Change: ```csharp namespace JdeScoping.Core.Repositories.Cms; ``` To: ```csharp namespace JdeScoping.Infrastructure.Sources.Cms; ``` **Step 3: Delete original file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Cms/CmsFileDataSource.cs ``` --- ### Task 1.6: Move LDAP Auth Service **Files:** - Move: `NEW/src/JdeScoping.Core/Auth/LdapAuthService.cs` → `NEW/src/JdeScoping.Infrastructure/Auth/LdapAuthService.cs` **Step 1: Copy file to new location** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Auth/LdapAuthService.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Infrastructure/Auth/LdapAuthService.cs ``` **Step 2: Update namespace in new file** Edit `NEW/src/JdeScoping.Infrastructure/Auth/LdapAuthService.cs`: Change: ```csharp namespace JdeScoping.Core.Auth; ``` To: ```csharp namespace JdeScoping.Infrastructure.Auth; ``` Also add using for Core interfaces: ```csharp using JdeScoping.Core.Auth; ``` **Step 3: Delete original file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Auth/LdapAuthService.cs ``` --- ### Task 1.7: Create Infrastructure Service Extensions **Files:** - Create: `NEW/src/JdeScoping.Infrastructure/Extensions/InfrastructureServiceExtensions.cs` - Delete: `NEW/src/JdeScoping.Core/Extensions/DataSourceServiceExtensions.cs` - Delete: `NEW/src/JdeScoping.Core/Extensions/AuthServiceExtensions.cs` **Step 1: Create new extension file** Create file `NEW/src/JdeScoping.Infrastructure/Extensions/InfrastructureServiceExtensions.cs`: ```csharp using JdeScoping.Core.Auth; using JdeScoping.Core.Interfaces; using JdeScoping.Core.Options; using JdeScoping.Infrastructure.Auth; using JdeScoping.Infrastructure.Sources.Cms; using JdeScoping.Infrastructure.Sources.Jde; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace JdeScoping.Infrastructure.Extensions; /// /// Extension methods for registering infrastructure services. /// public static class InfrastructureServiceExtensions { /// /// Adds infrastructure services (data sources, auth) to the service collection. /// /// The service collection. /// The configuration. /// The service collection for chaining. public static IServiceCollection AddInfrastructure( this IServiceCollection services, IConfiguration configuration) { // Bind configuration services.Configure( configuration.GetSection(DataSourceOptions.SectionName)); services.Configure( configuration.GetSection(AuthOptions.SectionName)); // Register data sources based on configuration var dataSourceOptions = configuration .GetSection(DataSourceOptions.SectionName) .Get(); if (dataSourceOptions?.UseFileDataSource == true) { services.AddScoped(); services.AddScoped(); } else { services.AddScoped(); services.AddScoped(); } // Register auth service based on configuration var authOptions = configuration .GetSection(AuthOptions.SectionName) .Get(); if (authOptions?.UseFakeAuth == true) { services.AddScoped(); } else { services.AddScoped(); } return services; } } ``` **Step 2: Delete old Core extension files** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Extensions/DataSourceServiceExtensions.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Extensions/AuthServiceExtensions.cs ``` --- ### Task 1.8: Clean up empty Core directories **Step 1: Remove empty Repositories directories** Run: ```bash rmdir /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Jde 2>/dev/null || true rmdir /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories/Cms 2>/dev/null || true rmdir /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Repositories 2>/dev/null || true ``` --- ### Task 1.9: Add Infrastructure to Solution **Files:** - Modify: `NEW/JdeScoping.slnx` **Step 1: Update solution file** Edit `NEW/JdeScoping.slnx` to add Infrastructure project: Change: ```xml ``` To: ```xml ``` --- ### Task 1.10: Add Infrastructure Reference to Host **Files:** - Modify: `NEW/src/JdeScoping.Host/JdeScoping.Host.csproj` **Step 1: Read current Host.csproj** Read the file to find the ItemGroup with ProjectReferences. **Step 2: Add Infrastructure reference** Add to the ProjectReference ItemGroup: ```xml ``` --- ### Task 1.11: Update Host Program.cs **Files:** - Modify: `NEW/src/JdeScoping.Host/Program.cs` **Step 1: Update using statements** Add: ```csharp using JdeScoping.Infrastructure.Extensions; ``` Remove: ```csharp using JdeScoping.Core.Extensions; ``` **Step 2: Update service registration** Change: ```csharp builder.Services .AddDataAccess(builder.Configuration) // 1. Database access configuration .AddDataSource(builder.Configuration) // 2. Data source registration (JDE/CMS) ``` To: ```csharp builder.Services .AddDataAccess(builder.Configuration) // 1. Database access configuration .AddInfrastructure(builder.Configuration) // 2. Infrastructure (JDE/CMS/Auth) ``` --- ### Task 1.12: Build and verify Phase 1 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Commit Phase 1** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: create Infrastructure project, move Oracle/LDAP implementations from Core" ``` --- ## Phase 2: Consolidate ILotFinderRepository Interfaces ### Task 2.1: Move DataSync Interface to Core **Files:** - Move: `NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.DataSync.cs` → `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.DataSync.cs` **Step 1: Copy file** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.DataSync.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.DataSync.cs ``` **Step 2: Update namespace** Edit `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.DataSync.cs`: Change: ```csharp namespace JdeScoping.DataAccess.Interfaces; ``` To: ```csharp namespace JdeScoping.Core.Interfaces; ``` **Step 3: Delete original** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.DataSync.cs ``` --- ### Task 2.2: Move SearchManagement Interface to Core **Files:** - Move: `NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.SearchManagement.cs` → `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.SearchManagement.cs` **Step 1: Copy file** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.SearchManagement.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.SearchManagement.cs ``` **Step 2: Update namespace** Edit `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.SearchManagement.cs`: Change: ```csharp namespace JdeScoping.DataAccess.Interfaces; ``` To: ```csharp namespace JdeScoping.Core.Interfaces; ``` **Step 3: Delete original** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.SearchManagement.cs ``` --- ### Task 2.3: Merge Lookups Interfaces The Core and DataAccess both have `.Lookups.cs` files. We need to merge them. **Files:** - Modify: `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.Lookups.cs` - Delete: `NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.Lookups.cs` **Step 1: Review both files and merge** The Core version has: - `SearchItemsAsync`, `SearchProfitCentersAsync`, `SearchWorkCentersAsync`, `SearchUsersAsync` - `LookupWorkOrdersAsync`, `LookupItemsAsync`, `LookupLotsAsync` The DataAccess version has: - `SearchItemsAsync`, `SearchWorkCentersAsync`, `SearchProfitCentersAsync`, `SearchUsersAsync` - `LookupItemsAsync`, `LookupWorkordersAsync`, `LookupWorkCentersAsync`, `LookupProfitCentersAsync`, `LookupUsersAsync`, `LookupLotsAsync` **Step 2: Update Core Lookups to include all methods** Replace `NEW/src/JdeScoping.Core/Interfaces/ILotFinderRepository.Lookups.cs` with: ```csharp using JdeScoping.Core.Models.Inventory; using JdeScoping.Core.Models.Organization; using JdeScoping.Core.Models.WorkOrders; using JdeScoping.Core.ViewModels; namespace JdeScoping.Core.Interfaces; /// /// Lookup operations for LotFinder data repository. /// public partial interface ILotFinderRepository { /// /// Searches for items matching the query (top 25). /// Task> SearchItemsAsync(string filter, CancellationToken cancellationToken = default); /// /// Searches for profit centers matching the query (top 25). /// Task> SearchProfitCentersAsync(string filter, CancellationToken cancellationToken = default); /// /// Searches for work centers matching the query (top 25). /// Task> SearchWorkCentersAsync(string filter, CancellationToken cancellationToken = default); /// /// Searches for JDE users (operators) matching the query (top 25). /// Task> SearchUsersAsync(string filter, CancellationToken cancellationToken = default); /// /// Looks up items by exact item numbers. /// Task> LookupItemsAsync(List itemNumbers, CancellationToken cancellationToken = default); /// /// Looks up work orders by work order numbers. /// Task> LookupWorkordersAsync(List workorderNumbers, CancellationToken cancellationToken = default); /// /// Looks up work centers by codes. /// Task> LookupWorkCentersAsync(List codes, CancellationToken cancellationToken = default); /// /// Looks up profit centers by codes. /// Task> LookupProfitCentersAsync(List codes, CancellationToken cancellationToken = default); /// /// Looks up users by user IDs or address numbers. /// Task> LookupUsersAsync(List userIds, CancellationToken cancellationToken = default); /// /// Looks up lots by lot number and item number. /// Task> LookupLotsAsync(List lots, CancellationToken cancellationToken = default); } ``` **Step 3: Delete DataAccess Lookups file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.Lookups.cs ``` --- ### Task 2.4: Delete remaining DataAccess ILotFinderRepository files **Files:** - Delete: `NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.cs` **Step 1: Delete base interface file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ILotFinderRepository.cs ``` --- ### Task 2.5: Update DataAccess ServiceCollectionExtensions **Files:** - Modify: `NEW/src/JdeScoping.DataAccess/Extensions/ServiceCollectionExtensions.cs` **Step 1: Update using statement** Change: ```csharp using JdeScoping.DataAccess.Interfaces; ``` To: ```csharp using JdeScoping.Core.Interfaces; ``` Also ensure the registration uses Core interface: ```csharp services.AddScoped(); ``` This should already be correct since it registers by interface type. --- ### Task 2.6: Update LotFinderRepository to use Core Interface **Files:** - Modify: `NEW/src/JdeScoping.DataAccess/Repositories/LotFinderRepository.cs` - Modify: `NEW/src/JdeScoping.DataAccess/Repositories/LotFinderRepository.Lookups.cs` - Modify: `NEW/src/JdeScoping.DataAccess/Repositories/LotFinderRepository.DataSync.cs` - Modify: `NEW/src/JdeScoping.DataAccess/Repositories/LotFinderRepository.SearchManagement.cs` **Step 1: Update each file's using/namespace** In each LotFinderRepository*.cs file, change: ```csharp using JdeScoping.DataAccess.Interfaces; ``` To: ```csharp using JdeScoping.Core.Interfaces; ``` Or add this using if not present. --- ### Task 2.7: Build and verify Phase 2 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Commit Phase 2** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: consolidate ILotFinderRepository interfaces into Core" ``` --- ## Phase 3: Merge SearchProcessing into DataAccess ### Task 3.1: Create target directories in DataAccess **Step 1: Create directories** Run: ```bash mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Services mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/FilterHandlers mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/QueryBuilders mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Models/FilterEntries mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Models/Results mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Attributes ``` --- ### Task 3.2: Move SearchProcessing files to DataAccess **Step 1: Move all files** Run: ```bash # Services cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Services/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Services/ # FilterHandlers cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/FilterHandlers/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/FilterHandlers/ # QueryBuilders cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/QueryBuilders/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/QueryBuilders/ # Models cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Models/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Models/ 2>/dev/null || true cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Models/FilterEntries/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Models/FilterEntries/ cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Models/Results/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Models/Results/ # Interfaces cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Interfaces/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Interfaces/ # Attributes cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Attributes/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Attributes/ # Extensions cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Extensions/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Extensions/ # Configuration cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing/Configuration/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.DataAccess/Configuration/ ``` --- ### Task 3.3: Update namespaces in moved files **Step 1: Update all namespaces** For each moved .cs file, change namespace from `JdeScoping.SearchProcessing.*` to `JdeScoping.DataAccess.*`. Use find/replace in each file. Key patterns: - `namespace JdeScoping.SearchProcessing` → `namespace JdeScoping.DataAccess` - `using JdeScoping.SearchProcessing` → `using JdeScoping.DataAccess` --- ### Task 3.4: Update DataAccess.csproj **Files:** - Modify: `NEW/src/JdeScoping.DataAccess/JdeScoping.DataAccess.csproj` **Step 1: Add SqlKata package if not present** Check if SearchProcessing uses SqlKata and add to DataAccess.csproj: ```xml ``` --- ### Task 3.5: Update DataAccess ServiceCollectionExtensions **Files:** - Modify: `NEW/src/JdeScoping.DataAccess/Extensions/ServiceCollectionExtensions.cs` **Step 1: Add SearchProcessing service registrations** Add to the `AddDataAccess` method: ```csharp // Search processing services services.AddScoped(); services.AddScoped(); services.AddScoped(); // Filter handlers services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); ``` Add required usings at top of file. --- ### Task 3.6: Delete SearchProcessing project **Step 1: Remove project directory** Run: ```bash rm -rf /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.SearchProcessing ``` --- ### Task 3.7: Update solution file **Files:** - Modify: `NEW/JdeScoping.slnx` **Step 1: Remove SearchProcessing from solution** Edit `NEW/JdeScoping.slnx`, remove the line: ```xml ``` --- ### Task 3.8: Update Host references **Files:** - Modify: `NEW/src/JdeScoping.Host/JdeScoping.Host.csproj` - Modify: `NEW/src/JdeScoping.Host/Program.cs` **Step 1: Remove SearchProcessing reference from Host.csproj** Remove the ProjectReference to SearchProcessing. **Step 2: Update Program.cs** Remove: ```csharp using JdeScoping.SearchProcessing; ``` Remove the line: ```csharp .AddSearchProcessing(builder.Configuration) // 4. Search execution ``` The search processing services are now registered via `AddDataAccess`. --- ### Task 3.9: Move SearchProcessing tests to DataAccess.Tests **Step 1: Create directories in DataAccess.Tests** Run: ```bash mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/Services mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/FilterHandlers mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/QueryBuilders mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/Models mkdir -p /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/Extensions ``` **Step 2: Move test files** Run: ```bash cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.SearchProcessing.Tests/FilterHandlers/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/FilterHandlers/ cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.SearchProcessing.Tests/Models/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/Models/ cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.SearchProcessing.Tests/Extensions/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/Extensions/ cp /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.SearchProcessing.Tests/QueryBuilders/*.cs /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.DataAccess.Tests/QueryBuilders/ ``` **Step 3: Update namespaces in test files** Change `JdeScoping.SearchProcessing.Tests` to `JdeScoping.DataAccess.Tests` in all moved test files. --- ### Task 3.10: Delete SearchProcessing.Tests project **Step 1: Remove test project directory** Run: ```bash rm -rf /Users/dohertj2/Desktop/JdeScopingTool/NEW/tests/JdeScoping.SearchProcessing.Tests ``` **Step 2: Update solution file** Remove from `NEW/JdeScoping.slnx`: ```xml ``` --- ### Task 3.11: Build and verify Phase 3 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Run tests** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet test ``` Expected: All tests pass. **Step 3: Commit Phase 3** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: merge SearchProcessing into DataAccess" ``` --- ## Phase 4: Clean up Core Package References ### Task 4.1: Remove infrastructure packages from Core.csproj **Files:** - Modify: `NEW/src/JdeScoping.Core/JdeScoping.Core.csproj` **Step 1: Edit Core.csproj** Remove these PackageReferences: ```xml ``` Keep: ```xml ``` --- ### Task 4.2: Delete remaining DI extensions from Core **Files:** - Delete: `NEW/src/JdeScoping.Core/Extensions/DataSyncServiceExtensions.cs` - Delete: `NEW/src/JdeScoping.Core/Extensions/ExcelExportServiceExtensions.cs` - Delete: `NEW/src/JdeScoping.Core/Extensions/SearchProcessingServiceExtensions.cs` **Step 1: Delete the files** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Extensions/DataSyncServiceExtensions.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Extensions/ExcelExportServiceExtensions.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/Extensions/SearchProcessingServiceExtensions.cs ``` --- ### Task 4.3: Build and verify Phase 4 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Commit Phase 4** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: remove infrastructure packages from Core" ``` --- ## Phase 5: Client References Core ### Task 5.1: Add Core reference to Client **Files:** - Modify: `NEW/src/JdeScoping.Client/JdeScoping.Client.csproj` **Step 1: Add ProjectReference** Add to Client.csproj: ```xml ``` --- ### Task 5.2: Delete duplicate ViewModels from Client **Files:** - Delete: `NEW/src/JdeScoping.Client/Models/ItemViewModel.cs` - Delete: `NEW/src/JdeScoping.Client/Models/ProfitCenterViewModel.cs` - Delete: `NEW/src/JdeScoping.Client/Models/WorkCenterViewModel.cs` - Delete: `NEW/src/JdeScoping.Client/Models/WorkOrderViewModel.cs` - Delete: `NEW/src/JdeScoping.Client/Models/PartOperationViewModel.cs` **Step 1: Delete duplicate files** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Client/Models/ItemViewModel.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Client/Models/ProfitCenterViewModel.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Client/Models/WorkCenterViewModel.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Client/Models/WorkOrderViewModel.cs rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Client/Models/PartOperationViewModel.cs ``` --- ### Task 5.3: Update Client usings **Step 1: Find files using deleted ViewModels** Search for files referencing `JdeScoping.Client.Models.ItemViewModel` etc. and update to use `JdeScoping.Core.ViewModels`. Update using statements in affected files: ```csharp using JdeScoping.Core.ViewModels; ``` --- ### Task 5.4: Build and verify Phase 5 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Commit Phase 5** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: Client references Core for shared ViewModels" ``` --- ## Phase 6: Excel Export Cleanup ### Task 6.1: Delete duplicate Excel interface **Files:** - Delete: `NEW/src/JdeScoping.ExcelExport/Interfaces/IExcelExportService.cs` **Step 1: Delete the file** Run: ```bash rm /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.ExcelExport/Interfaces/IExcelExportService.cs rmdir /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.ExcelExport/Interfaces 2>/dev/null || true ``` --- ### Task 6.2: Update ExcelExportService to implement Core.IExcelWriter **Files:** - Modify: `NEW/src/JdeScoping.ExcelExport/ExcelExportService.cs` **Step 1: Update class declaration** Change to implement `JdeScoping.Core.Interfaces.IExcelWriter` instead of the local interface. Add using: ```csharp using JdeScoping.Core.Interfaces; ``` Update class: ```csharp public class ExcelExportService : IExcelWriter ``` **Step 2: Ensure method signature matches** The `IExcelWriter` interface has: ```csharp Task GenerateExcelAsync(int searchId, CancellationToken cancellationToken = default); ``` Update or alias the method as needed. --- ### Task 6.3: Update ExcelExport ServiceCollectionExtensions **Files:** - Modify: `NEW/src/JdeScoping.ExcelExport/ServiceCollectionExtensions.cs` **Step 1: Update registration** Change registration to use Core interface: ```csharp using JdeScoping.Core.Interfaces; services.AddScoped(); ``` --- ### Task 6.4: Build and verify Phase 6 **Step 1: Build the solution** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet build ``` Expected: Build succeeded. **Step 2: Run all tests** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet test ``` Expected: All tests pass. **Step 3: Commit Phase 6** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: unify Excel export to use Core.IExcelWriter" ``` --- ## Phase 7: Final Verification ### Task 7.1: Full build verification **Step 1: Clean and rebuild** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet clean && dotnet build ``` Expected: Build succeeded with no warnings. --- ### Task 7.2: Run all tests **Step 1: Execute test suite** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && dotnet test --verbosity normal ``` Expected: All tests pass. --- ### Task 7.3: Verify Core has no infrastructure packages **Step 1: Check Core.csproj** Run: ```bash grep -E "(Dapper|Oracle|SqlClient|DirectoryServices|ClosedXML)" /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/JdeScoping.Core/JdeScoping.Core.csproj ``` Expected: No output (no infrastructure packages). --- ### Task 7.4: Verify dependency direction **Step 1: Check that only Host references Infrastructure** Run: ```bash grep -l "JdeScoping.Infrastructure" /Users/dohertj2/Desktop/JdeScopingTool/NEW/src/*/*.csproj ``` Expected: Only `JdeScoping.Host.csproj` --- ### Task 7.5: Final commit **Step 1: Create summary commit** Run: ```bash cd /Users/dohertj2/Desktop/JdeScopingTool/NEW && git add -A && git commit -m "refactor: complete Clean Architecture compliance - Created Infrastructure project for Oracle/LDAP implementations - Consolidated ILotFinderRepository interfaces into Core - Merged SearchProcessing into DataAccess - Removed infrastructure packages from Core - Client now references Core for shared ViewModels - Unified Excel export to use Core.IExcelWriter" ``` --- ## Summary **Total Tasks:** 38 tasks across 7 phases **Phase 1:** Create Infrastructure project (12 tasks) **Phase 2:** Consolidate interfaces (7 tasks) **Phase 3:** Merge SearchProcessing (11 tasks) **Phase 4:** Clean Core packages (3 tasks) **Phase 5:** Client references Core (4 tasks) **Phase 6:** Excel export cleanup (4 tasks) **Phase 7:** Final verification (5 tasks)