Initial commit: JDE Scoping Tool migration project

Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
This commit is contained in:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
@@ -0,0 +1,106 @@
using JdeScoping.Core.Models;
using JdeScoping.Core.Models.Inventory;
using JdeScoping.Core.Models.Organization;
using JdeScoping.Core.Models.Quality;
using JdeScoping.Core.Models.WorkOrders;
using JdeScoping.DataSync;
using JdeScoping.DataSync.Configuration;
using JdeScoping.DataSync.Configuration.MergeConfigurations;
using JdeScoping.DataSync.Contracts;
using JdeScoping.DataSync.Fetchers.Cms;
using JdeScoping.DataSync.Fetchers.Jde;
using JdeScoping.DataSync.Generated;
using JdeScoping.DataSync.HealthChecks;
using JdeScoping.DataSync.Services;
using JdeScoping.DataSync.Telemetry;
using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Extension methods for registering data sync services.
/// </summary>
public static class DataSyncDependencyInjection
{
/// <summary>
/// Adds data synchronization services to the service collection.
/// </summary>
/// <param name="services">The service collection.</param>
/// <param name="configuration">The configuration.</param>
/// <returns>The service collection for chaining.</returns>
public static IServiceCollection AddDataSyncServices(
this IServiceCollection services,
IConfiguration configuration)
{
// Bind configuration with validation
services.AddOptions<DataSyncOptions>()
.Bind(configuration.GetSection(DataSyncOptions.SectionName))
.ValidateDataAnnotations()
.ValidateOnStart();
// Register hosted service
services.AddHostedService<DataSyncService>();
// Register core services as scoped (for parallel isolation)
services.AddScoped<ISyncOrchestrator, SyncOrchestrator>();
services.AddScoped<IScheduleChecker, ScheduleChecker>();
services.AddScoped<ITableSyncOperation, TableSyncOperation>();
services.AddScoped<IDataUpdateRepository, DataUpdateRepository>();
// Register bulk merge services
services.AddSingleton<IDataReaderFactory, DataReaderFactory>();
services.AddSingleton<ISchemaValidator, SchemaValidator>();
services.AddScoped<IBulkMergeHelper, BulkMergeHelper>();
// Register merge configuration registry
services.AddSingleton<IMergeConfigurationRegistry, MergeConfigurationRegistry>();
// Register merge configurations - explicit registration per entity
services.AddSingleton<IMergeConfiguration<WorkOrder>, WorkOrderMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<Lot>, LotMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<LotUsage>, LotUsageMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<Item>, ItemMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<WorkCenter>, WorkCenterMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<ProfitCenter>, ProfitCenterMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<JdeUser>, JdeUserMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<Branch>, BranchMergeConfiguration>();
services.AddSingleton<IMergeConfiguration<MisData>, MisDataMergeConfiguration>();
// Register health check
services.AddHealthChecks()
.AddCheck<DataSyncHealthCheck>("data-sync", tags: ["datasync", "background"]);
// Register metrics as singleton
services.AddSingleton<DataSyncMetrics>();
// Register JDE fetchers
services.AddScoped<IDataFetcher<WorkOrder>, JdeWorkOrderFetcher>();
services.AddScoped<IDataFetcher<LotUsage>, JdeLotUsageFetcher>();
services.AddScoped<IDataFetcher<Item>, JdeItemFetcher>();
services.AddScoped<IDataFetcher<Lot>, JdeLotFetcher>();
services.AddScoped<IDataFetcher<WorkCenter>, JdeWorkCenterFetcher>();
services.AddScoped<IDataFetcher<ProfitCenter>, JdeProfitCenterFetcher>();
services.AddScoped<IDataFetcher<JdeUser>, JdeUserFetcher>();
services.AddScoped<IDataFetcher<Branch>, JdeBranchFetcher>();
// Register CMS fetchers
services.AddScoped<IDataFetcher<MisData>, CmsMisDataFetcher>();
// Register post processors
services.AddScoped<IPostProcessor, MisDataPostProcessor>();
services.AddScoped<MisDataPostProcessor>();
// Register fetchers by name for dynamic resolution
services.AddScoped<JdeWorkOrderFetcher>();
services.AddScoped<JdeLotUsageFetcher>();
services.AddScoped<JdeItemFetcher>();
services.AddScoped<JdeLotFetcher>();
services.AddScoped<JdeWorkCenterFetcher>();
services.AddScoped<JdeProfitCenterFetcher>();
services.AddScoped<JdeUserFetcher>();
services.AddScoped<JdeBranchFetcher>();
services.AddScoped<CmsMisDataFetcher>();
return services;
}
}