# Tasks: Implement Data Access ## Phase 1: Project Setup - [x] Create JdeScoping.DataAccess project - Location: `NEW/src/JdeScoping.DataAccess/JdeScoping.DataAccess.csproj` - Target: net10.0 - Validation: Project builds successfully - Dependencies: None - [x] Add NuGet package references - Packages: Microsoft.Data.SqlClient, Oracle.ManagedDataAccess.Core, Dapper, Microsoft.Extensions.Options, Microsoft.Extensions.Logging.Abstractions, Microsoft.Extensions.Configuration.Abstractions - Validation: `dotnet restore` succeeds - [x] Create folder structure - Folders: Exceptions/, Interfaces/, Repositories/, Queries/, Configuration/ - Validation: Directories exist ## Phase 2: Exception Types - [x] Create DataAccessException base class - Location: `Exceptions/DataAccessException.cs` - Properties: Operation, Repository, Message, InnerException - Validation: Class compiles - [x] Create ConnectionException class - Location: `Exceptions/ConnectionException.cs` - Properties: DataSource (inherits from DataAccessException) - Validation: Class compiles - [x] Create QueryException class - Location: `Exceptions/QueryException.cs` - Properties: QueryName (inherits from DataAccessException) - Validation: Class compiles - [x] Create DataAccessTimeoutException class - Location: `Exceptions/DataAccessTimeoutException.cs` - Properties: TimeoutSeconds (inherits from DataAccessException) - Validation: Class compiles ## Phase 3: Configuration - [x] Create DataAccessOptions class - Location: `Configuration/DataAccessOptions.cs` - Properties: DefaultTimeoutSeconds, LotUsageTimeoutSeconds, MisDataTimeoutSeconds, RebuildIndexTimeoutSeconds, ProductionSchema, ArchiveSchema, StageSchema - Validation: Class compiles with default values ## Phase 4: Connection Factory - [x] Create IDbConnectionFactory interface - Location: `Interfaces/IDbConnectionFactory.cs` - Methods: CreateLotFinderConnectionAsync, CreateJdeConnectionAsync, CreateJdeStageConnectionAsync, CreateCmsConnectionAsync - Validation: Interface compiles - [x] Create DbConnectionFactory implementation - Location: `DbConnectionFactory.cs` - Dependencies: IConfiguration, ILogger - Validation: Compiles, logs connection attempts ## Phase 5: SQL Query Constants - [x] Create LotFinderQueries static class - Location: `Queries/LotFinderQueries.cs` - Contains: All SQL Server queries from spec (GetUserSearches, GetQueuedSearches, GetSearch, etc.) - Validation: All queries compile as const strings - [x] Create JdeQueries static class - Location: `Queries/JdeQueries.cs` - Contains: All JDE Oracle queries from spec (GetWorkOrders, GetWorkOrderSteps, GetLots, etc.) - Note: Include both full and filtered variants - Validation: All queries compile as const strings - [x] Create CmsQueries static class - Location: `Queries/CmsQueries.cs` - Contains: SQL_GET_MIS_DATA query from spec - Validation: Query compiles as const string ## Phase 6: Repository Interfaces - [x] Create ILotFinderRepository interface - Location: `Interfaces/ILotFinderRepository.cs` - Methods: All 17 methods from spec (GetUserSearchesAsync, GetQueuedSearchesAsync, GetSearchAsync, GetSearchResultsAsync, SubmitSearchAsync, UpdateSearchStatusAsync, UpdateSearchResultsAsync, SearchItemsAsync, LookupItemsAsync, LookupWorkordersAsync, SearchWorkCentersAsync, LookupWorkCentersAsync, SearchProfitCentersAsync, LookupProfitCentersAsync, SearchUsersAsync, LookupUsersAsync, LookupLotsAsync, GetLastDataUpdatesAsync, GetTableSpecAsync, RebuildIndicesAsync, PostProcessMisDataAsync, BulkInsertAsync, TruncateTableAsync) - Validation: Interface compiles - [x] Create IJdeRepository interface - Location: `Interfaces/IJdeRepository.cs` - Methods: All 18 methods from spec (GetWorkOrdersAsync, GetWorkOrdersArchiveAsync, GetWorkOrderStepsAsync, GetWorkOrderStepsArchiveAsync, GetWorkOrderTimesAsync, GetWorkOrderTimesArchiveAsync, GetWorkOrderRoutingsAsync, GetWorkOrderComponentsAsync, GetWorkOrderComponentsArchiveAsync, GetLotsAsync, GetLotUsagesAsync, GetLotUsagesArchiveAsync, GetLotLocationsAsync, GetItemsAsync, GetUsersAsync, GetBranchesAsync, GetProfitCentersAsync, GetWorkCentersAsync, GetStatusCodesAsync, GetFunctionCodesAsync, GetOrgHierarchyAsync, GetRouteMastersAsync) - Return types: IAsyncEnumerable for streaming - Validation: Interface compiles - [x] Create ICmsRepository interface - Location: `Interfaces/ICmsRepository.cs` - Methods: GetMisDataAsync - Return type: IAsyncEnumerable - Validation: Interface compiles ## Phase 7: LotFinderRepository Implementation - [x] Create LotFinderRepository class - Location: `Repositories/LotFinderRepository.cs` - Dependencies: IDbConnectionFactory, ILogger, IOptions - Validation: Class compiles - [x] Implement Search Management methods - Methods: GetUserSearchesAsync, GetQueuedSearchesAsync, GetSearchAsync, GetSearchResultsAsync, SubmitSearchAsync, UpdateSearchStatusAsync, UpdateSearchResultsAsync - Validation: Methods compile, use Dapper QueryAsync/ExecuteAsync - [x] Implement Reference Data Lookup methods - Methods: SearchItemsAsync, LookupItemsAsync, LookupWorkordersAsync, SearchWorkCentersAsync, LookupWorkCentersAsync, SearchProfitCentersAsync, LookupProfitCentersAsync, SearchUsersAsync, LookupUsersAsync, LookupLotsAsync - Note: Use DataTable for table-valued parameters - Validation: Methods compile - [x] Implement Data Sync methods - Methods: GetLastDataUpdatesAsync, GetTableSpecAsync, RebuildIndicesAsync, PostProcessMisDataAsync, BulkInsertAsync, TruncateTableAsync - Note: RebuildIndicesAsync includes table name whitelist validation - Validation: Methods compile ## Phase 8: JdeRepository Implementation - [x] Create JdeRepository class - Location: `Repositories/JdeRepository.cs` - Dependencies: IDbConnectionFactory, ILogger, IOptions - Validation: Class compiles - [x] Implement Work Order methods - Methods: GetWorkOrdersAsync, GetWorkOrdersArchiveAsync, GetWorkOrderStepsAsync, GetWorkOrderStepsArchiveAsync, GetWorkOrderTimesAsync, GetWorkOrderTimesArchiveAsync, GetWorkOrderRoutingsAsync, GetWorkOrderComponentsAsync, GetWorkOrderComponentsArchiveAsync - Pattern: IAsyncEnumerable with Query (buffered: false) for streaming - Validation: Methods compile - [x] Implement Lot methods - Methods: GetLotsAsync, GetLotUsagesAsync, GetLotUsagesArchiveAsync, GetLotLocationsAsync - Note: GetLotLocationsAsync uses JDE Stage connection - Validation: Methods compile - [x] Implement Reference Data methods - Methods: GetItemsAsync, GetUsersAsync, GetBranchesAsync, GetProfitCentersAsync, GetWorkCentersAsync, GetStatusCodesAsync, GetFunctionCodesAsync, GetOrgHierarchyAsync, GetRouteMastersAsync - Note: GetStatusCodesAsync uses JDE Stage connection - Validation: Methods compile - [x] Implement schema placeholder replacement - Method: Private ApplySchemaReplacements method - Replaces: {ProductionSchema}, {ArchiveSchema}, {StageSchema} - Validation: Placeholders replaced correctly ## Phase 9: CmsRepository Implementation - [x] Create CmsRepository class - Location: `Repositories/CmsRepository.cs` - Dependencies: IDbConnectionFactory, ILogger, IOptions - Validation: Class compiles - [x] Implement GetMisDataAsync method - Pattern: IAsyncEnumerable with Query (buffered: false) for streaming - Timeout: Uses MisDataTimeoutSeconds from options - Validation: Method compiles ## Phase 10: Service Registration - [x] Create ServiceCollectionExtensions class - Location: `Extensions/ServiceCollectionExtensions.cs` - Method: AddDataAccess(this IServiceCollection services, IConfiguration configuration) - Registers: DataAccessOptions, IDbConnectionFactory (singleton), all repositories (scoped) - Validation: Extension method compiles ## Phase 11: Unit Tests - [x] Create test project - Location: `NEW/tests/JdeScoping.DataAccess.Tests/JdeScoping.DataAccess.Tests.csproj` - Dependencies: xUnit, NSubstitute, Shouldly - Validation: Project builds - [x] Create DbConnectionFactory tests - Tests: Connection creation, error handling, logging - Validation: Tests pass - [x] Create LotFinderRepository tests - Tests: Search methods, lookup methods, exception handling - Mock: IDbConnectionFactory - Validation: Tests pass - [x] Create JdeRepository tests - Tests: Streaming methods, cancellation, schema replacement - Mock: IDbConnectionFactory - Validation: Tests pass - [x] Create CmsRepository tests - Tests: GetMisDataAsync, timeout configuration - Mock: IDbConnectionFactory - Validation: Tests pass ## Phase 12: Verification - [x] Build complete solution - Command: `dotnet build NEW/JdeScoping.slnx` - Validation: No build errors - [x] Run all unit tests - Command: `dotnet test NEW/tests/JdeScoping.DataAccess.Tests/` - Validation: All 124 tests pass - [x] Validate OpenSpec change - Command: `openspec validate implement-data-access --strict` - Validation: No validation errors - [x] Codex MCP review - Review: Repository implementations against spec - Verify: All methods match spec signatures - Verify: Query SQL matches legacy exactly