< Summary

Information
Class: OzonOrdersWeb.Extensions.ApplicationServicesExtensions
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Extensions/ApplicationServicesExtensions.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 261
Coverable lines: 261
Total lines: 345
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddApplicationServices(...)100%210%
AddSupplierStatusServices(...)100%210%
ResolveStockSyncSection(...)0%7280%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Extensions/ApplicationServicesExtensions.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Server.Kestrel.Core;
 2using Microsoft.AspNetCore.Http.Features;
 3using System.Linq;
 4using Services.LabelServices;
 5using SlqStudio.Application.Services.AppSettingsServices;
 6using SlqStudio.Application.Services.EmailService;
 7using SlqStudio.Application.Services.EmailService.Implementation;
 8using SlqStudio.Application.Services.EmailService.Models;
 9using Services.EmailRoutingServices;
 10using Services.HangfireService;
 11using Services.TransactionUtilsServices;
 12using Services.BackgroundJobsServices;
 13using Services.ChannelTaskServices;
 14using Services.BitrixStockServices;
 15using Services.FileStorageServices;
 16using Services.StockSyncServices;
 17using Services.TransactionCommentAi;
 18using Services.SearchServices.OrderSearch;
 19using Services.SupplierStatusServices;
 20using Services.SupplierStatusServices.Providers;
 21using Services.CacheServices.CommercialCategoryLookup;
 22using OzonRepositories.Data;
 23using OzonOrdersWeb.WebServices.JobLogs;
 24using OzonOrdersWeb.WebServices.SystemAlerts;
 25using OzonOrdersWeb.TransactionServices;
 26using OzonOrdersWeb.WebServices.OrderSearch;
 27using OzonOrdersWeb.WebServices.Currency;
 28using OzonOrdersWeb.WebServices.Orders;
 29using OzonOrdersWeb.WebServices.Orders.Grid;
 30using OzonOrdersWeb.WebServices.Transactions.Grid.Commit;
 31using OzonOrdersWeb.WebServices.Transactions.Grid.Commit.Steps;
 32using OzonOrdersWeb.WebServices.Transactions.Grid.Definitions;
 33using OzonOrdersWeb.WebServices.Transactions.Grid.Load;
 34using OzonOrdersWeb.WebServices.Transactions.Grid.Preview;
 35using OzonOrdersWeb.WebServices.Transactions.Grid.SupplierCarts;
 36using OzonOrdersWeb.WebServices.Sidebar;
 37using OzonOrdersWeb.WebServices.TransactionTimeTracking;
 38using Services.OrderControlServices;
 39using Services.YandexServices;
 40using Services.OrderDailySummaryServices;
 41using Services.SystemMonitoringServices;
 42using Services.ApiServices._1CApi.Stock;
 43
 44namespace OzonOrdersWeb.Extensions;
 45
 46public static class ApplicationServicesExtensions
 47{
 48    public static void AddApplicationServices(this IServiceCollection services, IConfiguration configuration, bool isPro
 49    {
 050        services.AddScoped<OzonOrdersWeb.WebServices.Transactions.ArmtekReceiptOriginService>();
 051        services.AddScoped<OzonOrdersWeb.WebServices.Transactions.ArmtekInvoiceNumberSuggestService>();
 052        services.Configure<IISServerOptions>(options =>
 053        {
 054            options.MaxRequestBodySize = int.MaxValue;
 055        });
 56
 057        services.Configure<KestrelServerOptions>(options =>
 058        {
 059            options.Limits.MaxRequestBodySize = 314572800;
 060        });
 61
 062        services.Configure<FormOptions>(options =>
 063        {
 064            options.ValueCountLimit = 4096 * 4;
 065        });
 66
 067        services.Configure<SmtpSettings>(configuration.GetSection("SmtpSettings"));
 068        services.Configure<ImapSettings>(configuration.GetSection("ImapSettings"));
 069        services.Configure<EmailRoutingExecutionOptions>(configuration.GetSection("EmailRouting"));
 070        services.Configure<SystemAlertsOptions>(configuration.GetSection(SystemAlertsOptions.SectionName));
 071        services.Configure<ServerFileStorageOptions>(configuration.GetSection(ServerFileStorageOptions.SectionName));
 072        services.AddSingleton<IServerFileStorage, ServerFileStorage>();
 073        services.Configure<LabelStorageOptions>(configuration.GetSection(LabelStorageOptions.SectionName));
 074        services.AddSingleton<ILabelCatalogCache, LabelCatalogCache>();
 075        services.AddSingleton<ILabelFileStorage, LabelFileStorage>();
 076        services.AddScoped<ILabelCatalogService, LabelCatalogService>();
 077        services.AddScoped<ILabelPrintLogService, LabelPrintLogService>();
 078        var stockSyncSection = ResolveStockSyncSection(configuration, isProd);
 079        services.Configure<GoogleSheetsStockSyncOptions>(stockSyncSection);
 080        services.AddTransient<IEmailService, EmailService>();
 081        services.AddTransient<IHtmlEmailSender, HtmlEmailSender>();
 082        services.AddTransient<IEmailInboxClient, ImapEmailInboxClient>();
 083        services.AddSingleton<IImapSettingsStore, FileImapSettingsStore>();
 084        services.AddTransient<IRoutingRuleEvaluator, RoutingRuleEvaluator>();
 085        services.AddScoped<IFileDeduplicationService, FileDeduplicationService>();
 086        services.AddTransient<IDropboxFileRouter, DropboxFileRouter>();
 087        services.AddTransient<IOrderEmailImportService, OrderEmailImportService>();
 088        services.AddTransient<IEmailAttachmentRoutingService, EmailAttachmentRoutingService>();
 089        services.AddScoped<IEmailRoutingJobRunService, EmailRoutingJobRunService>();
 090        services.AddSingleton<IEmailRoutingSchedulerStore, FileEmailRoutingSchedulerStore>();
 091        services.AddTransient<EmailAttachmentRoutingJob>();
 092        services.AddTransient<TransactionTimeTrackingCleanupJob>();
 093        services.AddScoped<IOrderControlService, OrderControlService>();
 094        services.AddScoped<IOrderDailySummaryService, OrderDailySummaryService>();
 095        services.AddScoped<Services.DailyWorkSummaryServices.IDailyWorkSummaryService, Services.DailyWorkSummaryServices
 096        services.AddTransient<OzonOrdersWeb.WebServices.DailySummary.DailyWorkSummaryJob>();
 097        services.AddScoped<IOrderDeliveryStatusSynchronizer, OrderDeliveryStatusSynchronizer>();
 098        services.AddScoped<IYandexOrderStatusSyncService, YandexOrderStatusSyncService>();
 099        services.AddTransient<OrderControlEvaluationJob>();
 100
 101        // Elasticsearch-поиск по заказам (docs/orders-search-elasticsearch.md)
 0102        services.AddSingleton<IOrderSearchDiagnosticsStore, OrderSearchDiagnosticsStore>();
 0103        services.AddScoped<IOrderSearchDiagnosticsService, OrderSearchDiagnosticsService>();
 0104        services.AddSingleton<IOrderSearchService, OrderElasticsearchService>();
 0105        services.AddSingleton<IOrderSearchDriftMetricsReporter, OrderSearchDriftPrometheusReporter>();
 0106        services.AddSingleton<IOrderSearchIndexOperationLock, OrderSearchIndexOperationLock>();
 0107        services.AddScoped<IOrderSearchDriftChecker, OrderSearchDriftChecker>();
 0108        services.AddScoped<IOrderSearchSyncService, OrderSearchSyncService>();
 0109        services.AddScoped<IOrderChangeNotifier, OrderChangeNotifier>();
 0110        services.AddTransient<OrderSearchIncrementalSyncJob>();
 0111        services.AddTransient<OrderSearchFullReindexJob>();
 0112        services.AddTransient<OrderSearchDriftCheckJob>();
 0113        services.AddTransient<OrderSearchDriftRepairJob>();
 0114        services.AddTransient<LabelsFolderIndexRefreshJob>();
 0115        services.AddTransient<DropboxToServerFileStorageMigrationJob>();
 0116        services.AddTransient<WarehouseStockSyncJob>();
 0117        services.AddTransient<RunAllPresetsJob>();
 0118        services.AddTransient<SendSyncReportEmailJob>();
 0119        services.AddTransient<ITransactionTimeTrackingService, TransactionTimeTrackingService>();
 0120        services.AddScoped<OzonOrdersWeb.WebServices.Transactions.TransactionProgressReporter>();
 0121        services.AddScoped<IWarehouseStockSyncService, WarehouseStockSyncService>();
 0122        services.AddScoped<IWarehouseStockLookupService, WarehouseStockLookupService>();
 0123        services.AddScoped<ICommercialCategoryLookupService, CommercialCategoryLookupService>();
 0124        services.AddScoped<OrderToSupplierOzonShipService>();
 125
 0126        services.Configure<TransactionCommentAiOptions>(
 0127            configuration.GetSection(TransactionCommentAiOptions.SectionName));
 0128        services.AddTransient<TransactionCommentAiService>();
 0129        services.AddSingleton<ITransactionCommentAiEnqueuer, TransactionCommentAiEnqueuer>();
 0130        services.AddTransient<TransactionCommentAiJob>();
 131
 0132        services.AddSingleton<IAppSettingsService, AppSettingsService>();
 0133        services.AddSingleton<AppSettingsBuilder>();
 134
 0135        services.AddSingleton<BarcodeLabelService>();
 0136        services.AddSingleton<ArticleLabelService>();
 0137        services.AddScoped<IOrderScanitStore, OrderScanitStore>();
 0138        services.AddScoped<IOzonLabelPrintService, OzonLabelPrintService>();
 0139        services.AddScoped<IOrdersOzonShipService, OrdersOzonShipService>();
 0140        services.AddScoped<IOzonExemplarService, OzonExemplarService>();
 0141        services.AddSingleton<ILabelExistenceService, LabelExistenceService>();
 142
 143        // Background Jobs System
 0144        services.AddScoped<IBackgroundJobLoggingService, BackgroundJobLoggingService>();
 0145        services.AddScoped<IBackgroundJobScheduleService, BackgroundJobScheduleService>();
 0146        services.AddScoped<ITransactionTimeTrackingReportQueryService, TransactionTimeTrackingReportQueryService>();
 0147        services.AddScoped<IOzonReportLoaderService, OzonReportLoaderService>();
 0148        services.AddScoped<ITransactionJobRetryScheduler, TransactionJobRetryScheduler>();
 0149        services.AddScoped<IAutomatedTransactionProcessingService, AutomatedTransactionProcessingService>();
 0150        services.AddTransient<IBitrixStockClearJobService, BitrixStockClearJobService>();
 0151        services.AddTransient<IBitrixStockArchiveJobService, BitrixStockArchiveJobService>();
 0152        services.AddTransient<IBitrixStockUnarchiveJobService, BitrixStockUnarchiveJobService>();
 0153        services.AddTransient<IBitrixStockPushJobService, BitrixStockPushJobService>();
 0154        services.AddScoped<IBitrixStockInventoryService, BitrixStockInventoryService>();
 0155        services.AddScoped<IWarehouseStockBitrixViewService, WarehouseStockBitrixViewService>();
 0156        services.AddScoped<IBitrixOzonLinkedStockApiSyncService, BitrixOzonLinkedStockApiSyncService>();
 0157        services.AddScoped<IBitrixStockAutoScheduleService, BitrixStockAutoScheduleService>();
 0158        services.AddSingleton<BitrixStockSyncReportStore>();
 0159        services.AddSingleton<BitrixStockActiveStageStore>();
 0160        services.AddScoped<IBitrixStockSyncReportService, BitrixStockSyncReportService>();
 0161        services.AddScoped<IBitrixStockSyncReportGridService, BitrixStockSyncReportGridService>();
 0162        services.AddSingleton<OzonOrdersWeb.Areas.Studio2.AnalysisServices.ProductAnalysisCache>();
 0163        services.AddScoped<OzonOrdersWeb.Areas.Studio2.AnalysisServices.ProductAnalysisGridService>();
 0164        services.AddScoped<OzonOrdersWeb.Areas.Studio2.AnalysisServices.ProductAnalysisReportService>();
 0165        services.AddSingleton<OzonOrdersWeb.Areas.Studio2.AnalysisServices.SalesForecastService>();
 0166        services.AddSingleton<OzonOrdersWeb.Areas.Studio2.AnalysisServices.TrendAnalysisService>();
 0167        services.AddSingleton<OzonOrdersWeb.Areas.Studio2.AnalysisServices.PurchaseRecommendationService>();
 0168        services.AddScoped<OzonOrdersWeb.Areas.Studio2.AnalysisServices.OzonErrorLinksService>();
 0169        services.AddScoped<IBitrixStockSyncReportApplyService, BitrixStockSyncReportApplyService>();
 0170        services.AddScoped<IBitrixStockLiveStockGuard, BitrixStockLiveStockGuard>();
 0171        services.AddScoped<IBitrixStockLiveStockComparer, BitrixStockLiveStockComparer>();
 0172        services.Configure<BitrixStockLiveStockOptions>(configuration.GetSection(BitrixStockLiveStockOptions.SectionName
 0173        services.AddScoped<IBitrixStockSyncReportCleanupService, BitrixStockSyncReportCleanupService>();
 0174        services.AddScoped<IBitrixStockSyncReportPricePushService, BitrixStockSyncReportPricePushService>();
 0175        services.AddScoped<IBitrixStockOzonOrphanCleanupService, BitrixStockOzonOrphanCleanupService>();
 0176        services.AddScoped<IOzonProductsCatalogService, OzonProductsCatalogService>();
 0177        services.AddScoped<IOzonCatalogStockEnricher, OzonCatalogStockEnricher>();
 0178        services.AddScoped<IBitrixStockSyncPipelineOrchestrator, BitrixStockSyncPipelineOrchestrator>();
 0179        services.Configure<BitrixStockRunLoggingOptions>(configuration.GetSection(BitrixStockRunLoggingOptions.SectionNa
 0180        services.AddSingleton<IBitrixStockRunFileLogger, BitrixStockRunFileLogger>();
 0181        services.AddScoped<IBitrixStockSyncPresetService, BitrixStockSyncPresetService>();
 0182        services.AddSingleton<ChannelTaskExecutor>();
 0183        services.AddSingleton<ChannelTaskProcessor>();
 0184        services.AddSingleton<IChannelTaskService>(sp => sp.GetRequiredService<ChannelTaskProcessor>());
 0185        services.AddHostedService(sp => sp.GetRequiredService<ChannelTaskProcessor>());
 0186        services.AddScoped<IBitrixStockExceptionService, BitrixStockExceptionService>();
 0187        services.AddScoped<IBitrixStockSyncArticleHistoryService, BitrixStockSyncArticleHistoryService>();
 0188        services.AddScoped<BitrixStockSyncApplyArticleLogService>();
 0189        services.AddScoped<IJobLogsBadgeService, JobLogsBadgeService>();
 0190        services.AddScoped<ISystemAlertSource, OzonSystemAlertSource>();
 0191        services.AddScoped<ISystemAlertSource, JobLogsSystemAlertSource>();
 0192        services.AddScoped<ISystemAlertSource, PassiveSystemAlertSource>();
 0193        services.AddScoped<ISystemAlertSource, HangfireSystemAlertSource>();
 0194        services.AddScoped<ISystemAlertSource, DiskSystemAlertSource>();
 0195        services.AddScoped<ISystemAlertSource, ElasticsearchSystemAlertSource>();
 0196        services.AddScoped<ISystemAlertSource, DatabaseSystemAlertSource>();
 0197        services.AddScoped<SupplierOrdersSystemAlertSource>();
 0198        services.AddScoped<ISystemAlertSource>(sp => sp.GetRequiredService<SupplierOrdersSystemAlertSource>());
 0199        services.AddScoped<ISystemAlertSource, OrderOperationsSystemAlertSource>();
 0200        services.AddScoped<ISystemAlertSource, StockAndOneCSystemAlertSource>();
 0201        services.AddScoped<ISystemAlertSource, OzonStockApplyAlertSource>();
 0202        services.AddHttpClient(ElasticsearchSystemAlertSource.HttpClientName);
 0203        services.AddSingleton<SystemAlertOrderIndex>();
 0204        services.AddScoped<SystemAlertIncidentStore>();
 0205        services.AddScoped<ISystemMonitoringSignalWriter, SystemMonitoringSignalWriter>();
 0206        services.AddSingleton<Services.SystemMonitoringServices.IsolatedSystemMonitoringSignalWriter>();
 0207        services.AddSingleton<IOneCStockAlertReporter, OneCStockAlertReporter>();
 0208        services.AddScoped<SystemAlertFactory>();
 0209        services.AddScoped<SystemAlertTelegramNotifier>();
 0210        services.AddScoped<SystemAlertPinnedMessageService>();
 0211        services.AddScoped<ISupplierOrderCanceller, SupplierOrderCanceller>();
 0212        services.AddScoped<OzonCancelledSupplierOrderHandler>();
 0213        services.AddScoped<SystemAlertEvaluationService>();
 0214        services.AddTransient<SystemAlertEvaluationJob>();
 0215        services.AddTransient<SystemMonitoringSignalCleanupJob>();
 0216        services.AddSingleton<DatabaseIoRateTracker>();
 0217        services.AddScoped<IServerDiagnosticsService, ServerDiagnosticsService>();
 218
 0219        services.AddSingleton<OrderDictionaryCache>();
 0220        services.AddScoped<IOrderFilterListsService, OrderFilterListsService>();
 0221        services.AddScoped<IOrderDataScopeQueryApplier, OrderDataScopeQueryApplier>();
 0222        services.AddScoped<IOrdersIndexQueryService, OrdersIndexQueryService>();
 0223        services.AddScoped<IOrderReturnInfoService, OrderReturnInfoService>();
 0224        services.AddScoped<IOrdersIndexPageDetailsService, OrdersIndexPageDetailsService>();
 0225        services.AddScoped<IOrdersClientStatusSyncService, OrdersClientStatusSyncService>();
 0226        services.AddTransient<OrdersClientStatusRefreshJob>();
 0227        services.AddTransient<OrdersClientStatusReconcileJob>();
 0228        services.AddSingleton<OrdersStatusSyncHealthStore>();
 0229        services.AddScoped<IOrderControlCandidateStatusSynchronizer, OrderControlCandidateStatusSynchronizer>();
 0230        services.AddScoped<IOrdersIndexClientStatusRefreshService, OrdersIndexClientStatusRefreshService>();
 0231        services.AddScoped<IOrdersIndexViewModelEnricher, OrdersIndexViewModelEnricher>();
 0232        services.AddScoped<IOrdersIndexPageViewDataService, OrdersIndexPageViewDataService>();
 0233        services.AddScoped<IOrderDataScopeIdFilterService, OrderDataScopeIdFilterService>();
 0234        services.AddScoped<IOrderCreateFormService, OrderCreateFormService>();
 0235        services.AddScoped<ICurrencyRatesViewBagService, CurrencyRatesViewBagService>();
 236
 237        // Страница заказов на AG Grid (/Studio2/OrdersGrid) — поверх того же конвейера списка.
 0238        services.AddScoped<IOrdersGridQueryService, OrdersGridQueryService>();
 0239        services.AddScoped<IOrdersGridFilterOptionsService, OrdersGridFilterOptionsService>();
 0240        services.AddScoped<IOrdersGridUserSettingsService, OrdersGridUserSettingsService>();
 0241        services.AddScoped<IUserSidebarSettingsService, UserSidebarSettingsService>();
 0242        services.AddScoped<IOrdersGridChangesService, OrdersGridChangesService>();
 0243        services.AddScoped<IOrdersGridStatusRefreshService, OrdersGridStatusRefreshService>();
 0244        services.AddScoped<IOrdersGridScopedQuery, OrdersGridScopedQuery>();
 0245        services.AddScoped<IOrdersGridRowHydrator, OrdersGridRowHydrator>();
 0246        services.AddScoped<IOrdersGridFacetsService, OrdersGridFacetsService>();
 0247        services.AddScoped<IOrdersGridOrderCardService, OrdersGridOrderCardService>();
 248
 249        // Фид «цена и остатки» по артикулу: чтение через API Interparts одним снимком.
 0250        services.AddSingleton(new Services.FeedPriceServices.FeedPriceOptions());
 0251        services.AddTransient<Services.FeedPriceServices.IFeedPriceReader, Services.FeedPriceServices.FidApiFeedPriceRea
 0252        services.AddScoped<Services.FeedPriceServices.IFeedPriceService, Services.FeedPriceServices.FeedPriceService>();
 0253        services.AddTransient<Services.FeedPriceServices.IFeedExplanationReader, Services.FeedPriceServices.FidApiFeedEx
 0254        services.AddScoped<Services.FeedPriceServices.IFeedExplanationService, Services.FeedPriceServices.FeedExplanatio
 0255        services.AddScoped<IOrdersGridFeedPriceService, OrdersGridFeedPriceService>();
 0256        services.AddScoped<IOrdersGridProductCardService, OrdersGridProductCardService>();
 0257        services.AddScoped<IOrdersGridSidebarPresetsService, OrdersGridSidebarPresetsService>();
 0258        services.AddScoped<IOrdersGridComputedResolver, OrdersGridComputedResolver>();
 259
 260        // Грид транзакций (/Studio2/TransactionsGrid): каталог определений ⊕ настройки админки, загрузка и конвейер про
 0261        services.AddScoped<ITransactionDefinitionProvider, TransactionDefinitionProvider>();
 0262        services.AddScoped<ITransactionGridLoadService, TransactionGridLoadService>();
 0263        services.AddScoped<ITransactionGridQuotationSourcesProvider, TransactionGridQuotationSourcesProvider>();
 0264        services.AddScoped<ITransactionCommitService, TransactionCommitService>();
 0265        services.AddScoped<AppStatusLookup>();
 0266        services.AddScoped<ShipToSellerOneCPlanner>();
 0267        services.AddScoped<IShipToSellerPreviewService, ShipToSellerPreviewService>();
 0268        services.AddScoped<ITransactionCommitStep, ScopeAndLoadStep>();
 0269        services.AddScoped<ITransactionCommitStep, ValidateSourceStatusStep>();
 0270        services.AddScoped<ITransactionCommitStep, OzonCancelStep>();
 0271        services.AddScoped<ITransactionCommitStep, OneCStockCheckStep>();
 0272        services.AddScoped<ITransactionCommitStep, ApplyEditsStep>();
 0273        services.AddScoped<ITransactionCommitStep, ZeroQuantityPolicyStep>();
 0274        services.AddScoped<ITransactionCommitStep, OneCDocumentStep>();
 0275        services.AddScoped<ITransactionCommitStep, QuantitySplitCancellationStep>();
 0276        services.AddScoped<ITransactionCommitStep, ResolveTargetStatusStep>();
 0277        services.AddScoped<ITransactionCommitStep, CreateTransactionStep>();
 0278        services.AddScoped<ITransactionCommitStep, HistoryStep>();
 0279        services.AddScoped<ITransactionCommitStep, CachesAndNotifyStep>();
 0280        services.AddScoped<ITransactionCommitStep, ZasylExpensesSnapshotStep>();
 0281        services.AddScoped<ITransactionCommitStep, TimeTrackingStep>();
 0282        services.AddScoped<ITransactionCommitStep, AiCommentStep>();
 0283        services.AddScoped<ITransactionCommitStep, SupplierCartsPreStep>();
 0284        services.AddScoped<ITransactionCommitStep, SupplierCartsPostStep>();
 0285        services.AddScoped<ITransactionCommitStep, SupplierVerificationStep>();
 0286        services.AddScoped<SupplierCartsProcessor>();
 287
 0288        AddSupplierStatusServices(services);
 0289    }
 290
 291    /// <summary>
 292    /// Отслеживание статусов заказов у API-поставщиков. Провайдеры регистрируются множественно —
 293    /// OrderSupplierStatusSyncService разбирает их по ProviderKey.
 294    /// </summary>
 295    private static void AddSupplierStatusServices(IServiceCollection services)
 296    {
 0297        services.AddScoped<ISupplierStatusResolver, SupplierStatusResolver>();
 0298        services.AddScoped<IOrderSupplierStateService, OrderSupplierStateService>();
 0299        services.AddScoped<IOrderSupplierStatusSyncService, OrderSupplierStatusSyncService>();
 0300        services.AddScoped<ISupplierOrderVerificationService, SupplierOrderVerificationService>();
 0301        services.AddScoped<IOrderSupplierStateInfoService, OrderSupplierStateInfoService>();
 0302        services.AddScoped<IOrderProblemInfoService, OrderProblemInfoService>();
 0303        services.AddScoped<ISupplierStatusDirectoryService, SupplierStatusDirectoryService>();
 0304        services.AddScoped<LocalCartStatusReader>();
 0305        services.AddScoped<SupplierOrderStatusSyncJob>();
 306
 0307        services.AddScoped<ISupplierStatusProvider, AvdSupplierStatusProvider>();
 0308        services.AddScoped<ISupplierStatusProvider, JapartsSupplierStatusProvider>();
 0309        services.AddScoped<ISupplierStatusProvider, BergSupplierStatusProvider>();
 0310        services.AddScoped<ISupplierStatusProvider, ArmtekSupplierStatusProvider>();
 0311        services.AddScoped<ISupplierStatusProvider, ArmtekBySupplierStatusProvider>();
 0312        services.AddScoped<ISupplierStatusProvider, MlAutoSupplierStatusProvider>();
 0313        services.AddScoped<ISupplierStatusProvider, MlAutoRuSupplierStatusProvider>();
 0314        services.AddScoped<ISupplierStatusProvider, ForumAutoSupplierStatusProvider>();
 0315        services.AddScoped<ISupplierStatusProvider, ForumAutoInterpartsSupplierStatusProvider>();
 0316        services.AddScoped<ISupplierStatusProvider, ForumAutoPiterSupplierStatusProvider>();
 0317        services.AddScoped<ISupplierStatusProvider, ForumAutoRostovSupplierStatusProvider>();
 0318        services.AddScoped<ISupplierStatusProvider, ForumAutoIstraSupplierStatusProvider>();
 0319        services.AddScoped<ISupplierStatusProvider, FavoritPartsSupplierStatusProvider>();
 0320        services.AddScoped<ISupplierStatusProvider, FavoritPartsIstraSupplierStatusProvider>();
 0321        services.AddScoped<ISupplierStatusProvider, FavoritPartsRostovSupplierStatusProvider>();
 0322        services.AddScoped<ISupplierStatusProvider, MoskvorechieIstraSupplierStatusProvider>();
 0323        services.AddScoped<ISupplierStatusProvider, ShateMSupplierStatusProvider>();
 0324        services.AddScoped<ISupplierStatusProvider, ProfitLigaSupplierStatusProvider>();
 0325        services.AddScoped<ISupplierStatusProvider, ZZapSupplierStatusProvider>();
 0326        services.AddScoped<ISupplierStatusProvider, MikadoSupplierStatusProvider>();
 0327        services.AddScoped<ISupplierStatusProvider, MotexSupplierStatusProvider>();
 0328    }
 329
 330    private static IConfigurationSection ResolveStockSyncSection(IConfiguration configuration, bool isProd)
 331    {
 0332        var paths = isProd
 0333            ? new[] { "GoogleSheetsStockSync:Prod", "GoogleSheetsStockSync:Local", "GoogleSheetsStockSync" }
 0334            : new[] { "GoogleSheetsStockSync:Local", "GoogleSheetsStockSync:Prod", "GoogleSheetsStockSync" };
 335
 0336        foreach (var path in paths)
 337        {
 0338            var section = configuration.GetSection(path);
 0339            if (!string.IsNullOrWhiteSpace(section["SpreadsheetId"]))
 0340                return section;
 341        }
 342
 0343        return configuration.GetSection(isProd ? "GoogleSheetsStockSync:Prod" : "GoogleSheetsStockSync:Local");
 344    }
 345}