# 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)