< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.OrderFilterListsService
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/OrderFilterListsService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 410
Coverable lines: 410
Total lines: 658
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 134
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
BuildAsync()0%110100%
SetFilterListsFromFilteredDataOnlyAsync()0%156120%
SetFilteredListsFromDataAsync()0%506220%
SetFilteredListsAsync()0%156120%
SetFilterListsWithoutRestrictionsAsync()0%620%
ApplyDataScopeToFilterListsAsync()0%1056320%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/OrderFilterListsService.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.Rendering;
 2using OzonDomains;
 3using OzonDomains.Models;
 4using OzonDomains.Models.AccessControl;
 5using Services.Authorization.Services;
 6using Services.DataServices;
 7using Services.SupplierStatusServices;
 8
 9namespace OzonOrdersWeb.WebServices.Orders;
 10
 11public sealed class OrderFilterListsService : IOrderFilterListsService
 12{
 13    private readonly OrderDictionaryCache _dictionaryCache;
 14    private readonly AppStatusDataServices _appStatusServices;
 15    private readonly ClientStatusDataServices _clientStatusServices;
 16    private readonly SupplierDataServices _supplierDataServices;
 17    private readonly WarehouseDataServices _warehouseDataServices;
 18    private readonly OzonClientServices _ozonClientServices;
 19    private readonly DeliveryDataServices _deliveryDataServices;
 20    private readonly IScopeFilterValuesService _scopeFilterValuesService;
 21    private readonly ISupplierStatusDirectoryService _supplierStatusDirectoryService;
 22
 023    public OrderFilterListsService(
 024        OrderDictionaryCache dictionaryCache,
 025        AppStatusDataServices appStatusServices,
 026        ClientStatusDataServices clientStatusServices,
 027        SupplierDataServices supplierDataServices,
 028        WarehouseDataServices warehouseDataServices,
 029        OzonClientServices ozonClientServices,
 030        DeliveryDataServices deliveryDataServices,
 031        IScopeFilterValuesService scopeFilterValuesService,
 032        ISupplierStatusDirectoryService supplierStatusDirectoryService)
 33    {
 034        _dictionaryCache = dictionaryCache;
 035        _appStatusServices = appStatusServices;
 036        _clientStatusServices = clientStatusServices;
 037        _supplierDataServices = supplierDataServices;
 038        _warehouseDataServices = warehouseDataServices;
 039        _ozonClientServices = ozonClientServices;
 040        _deliveryDataServices = deliveryDataServices;
 041        _scopeFilterValuesService = scopeFilterValuesService;
 042        _supplierStatusDirectoryService = supplierStatusDirectoryService;
 043    }
 44
 45    public async Task<OrderFilterListsViewData> BuildAsync(OrderFilterListsBuildRequest request, CancellationToken ct)
 46    {
 047        var data = new OrderFilterListsViewData();
 48
 049        if (!request.UseFilteredData)
 50        {
 051            if (request.AccessProfile != null)
 52            {
 053                await SetFilteredListsAsync(data, request.AccessProfile, ct);
 54            }
 55            else
 56            {
 057                await SetFilterListsWithoutRestrictionsAsync(data, ct);
 58            }
 59        }
 060        else if (request.AccessProfile == null)
 61        {
 062            await SetFilterListsFromFilteredDataOnlyAsync(data, request.FilteredData ?? [], ct);
 63        }
 64        else
 65        {
 066            await SetFilteredListsFromDataAsync(data, request.FilteredData ?? [], request.AccessProfile, ct);
 67        }
 68
 069        await ApplyDataScopeToFilterListsAsync(data, request.UserId, request.OrderScopeExpression, ct);
 70
 71        // Справочник статусов поставщиков меняется только при ручной правке админом — держим
 72        // в том же 10-мин memcache, что и остальные словари фильтров, чтобы не делать
 73        // запрос с двумя Include на каждой загрузке страницы заказов.
 074        data.SupplierStatuses = await _dictionaryCache.GetOrCreateAsync(
 075            "dict_supplier_statuses",
 076            () => _supplierStatusDirectoryService.GetAsync(null, null, ct),
 077            ct);
 78
 079        return data;
 080    }
 81
 82    private async Task SetFilterListsFromFilteredDataOnlyAsync(
 83        OrderFilterListsViewData data,
 84        List<Order> filteredData,
 85        CancellationToken ct)
 86    {
 087        var appStatusNames = filteredData
 088            .Where(o => o.AppStatus != null && !string.IsNullOrEmpty(o.AppStatus.Name))
 089            .Select(o => o.AppStatus!.Name!)
 090            .Distinct()
 091            .OrderBy(n => n)
 092            .ToList();
 93
 094        var hasUnassigned =
 095            filteredData.Any(o => o.AppStatus == null || string.IsNullOrEmpty(o.AppStatus.Name));
 96
 097        if (hasUnassigned && !appStatusNames.Contains("Не указан"))
 98        {
 099            appStatusNames.Insert(0, "Не указан");
 100        }
 0101        else if (appStatusNames.Contains("Не указан"))
 102        {
 0103            appStatusNames.Remove("Не указан");
 0104            appStatusNames.Insert(0, "Не указан");
 105        }
 106
 0107        var allAppStatuses =
 0108            await _dictionaryCache.GetOrCreateAsync("dict_app_statuses_v3", () => _appStatusServices.GetAppStatuses(), c
 109
 0110        var statusColors = allAppStatuses
 0111            .Where(s => s.Name != null && appStatusNames.Contains(s.Name))
 0112            .ToDictionary(s => s.Name!, s => s.GetStatusColor());
 113
 0114        if (appStatusNames.Contains("Не указан") && !statusColors.ContainsKey("Не указан"))
 115        {
 0116            var unassignedStatus = allAppStatuses.FirstOrDefault(s => s.Name == "Не указан");
 117
 0118            if (unassignedStatus != null)
 119            {
 0120                statusColors["Не указан"] = unassignedStatus.GetStatusColor();
 121            }
 122        }
 123
 0124        data.AppStatuses = new SelectList(appStatusNames.Select(n => new { Name = n }), "Name", "Name");
 0125        data.StatusColors = statusColors;
 126
 0127        var supplierNames = filteredData
 0128            .Where(o => o.Supplier != null && !string.IsNullOrEmpty(o.Supplier.Name))
 0129            .Select(o => o.Supplier!.Name!)
 0130            .Distinct()
 0131            .OrderBy(n => n)
 0132            .ToList();
 133
 0134        data.Suppliers = new SelectList(supplierNames.Select(n => new { Name = n }), "Name", "Name");
 135
 0136        var clientNames = filteredData
 0137            .Where(o => o.OzonClient != null && !string.IsNullOrEmpty(o.OzonClient.Name))
 0138            .Select(o => o.OzonClient!.Name!)
 0139            .Distinct()
 0140            .OrderBy(n => n)
 0141            .ToList();
 142
 0143        data.Clients = new SelectList(clientNames.Select(n => new { Name = n }), "Name", "Name");
 144
 0145        var warehouseNames = filteredData
 0146            .Where(o => o.ShipmentWarehouse != null && !string.IsNullOrEmpty(o.ShipmentWarehouse.Name))
 0147            .Select(o => o.ShipmentWarehouse!.Name!)
 0148            .Distinct()
 0149            .OrderBy(n => n)
 0150            .ToList();
 151
 0152        data.Warehouses = new SelectList(warehouseNames.Select(w => new { Name = w }), "Name", "Name");
 153
 0154        var statusNames = filteredData
 0155            .Where(o => o.ClientStatus != null && !string.IsNullOrEmpty(o.ClientStatus.Name))
 0156            .Select(o => o.ClientStatus!.Name!)
 0157            .Distinct()
 0158            .OrderBy(n => n)
 0159            .ToList();
 160
 0161        data.Statuses = new SelectList(statusNames.Select(n => new { Name = n }), "Name", "Name");
 162
 0163        var providerNames = filteredData
 0164            .Where(o => o.Delivery != null && o.Delivery.Provider != null &&
 0165                        !string.IsNullOrEmpty(o.Delivery.Provider.Name))
 0166            .Select(o => o.Delivery!.Provider!.Name!)
 0167            .Distinct()
 0168            .OrderBy(n => n)
 0169            .ToList();
 170
 0171        data.Providers = new SelectList(providerNames.Select(n => new { Name = n }), "Name", "Name");
 0172    }
 173
 174    private async Task SetFilteredListsFromDataAsync(
 175        OrderFilterListsViewData data,
 176        List<Order> filteredData,
 177        AccessProfile accessProfile,
 178        CancellationToken ct)
 179    {
 0180        var allAppStatuses =
 0181            await _dictionaryCache.GetOrCreateAsync("dict_app_statuses_v3", () => _appStatusServices.GetAppStatuses(), c
 182
 0183        var allSuppliers =
 0184            await _dictionaryCache.GetOrCreateAsync("dict_suppliers", () => _supplierDataServices.GetSuppliers(), ct);
 185
 0186        var allClients =
 0187            await _dictionaryCache.GetOrCreateAsync("dict_ozon_clients", () => _ozonClientServices.GetOzonClients(), ct)
 188
 0189        var allWarehouses =
 0190            await _dictionaryCache.GetOrCreateAsync("dict_warehouses", () => _warehouseDataServices.GetWarehouses(), ct)
 191
 0192        var allProviders =
 0193            await _dictionaryCache.GetOrCreateAsync("dict_delivery_providers", () => _deliveryDataServices.GetProviders(
 194
 0195        var statusIds = accessProfile.ScopeItems
 0196            .Where(x => x.ScopeType == DataScopeType.AppStatus)
 0197            .Select(x => x.ReferenceId)
 0198            .ToList();
 199
 0200        var appStatusNames = filteredData
 0201            .Where(o => o.AppStatus != null && !string.IsNullOrEmpty(o.AppStatus.Name))
 0202            .Select(o => o.AppStatus!.Name!)
 0203            .Distinct()
 0204            .ToList();
 205
 0206        if (statusIds.Any())
 207        {
 0208            var allowedStatusNames = allAppStatuses
 0209                .Where(s => statusIds.Contains(s.Id))
 0210                .Select(s => s.Name)
 0211                .ToList();
 212
 0213            appStatusNames = appStatusNames.Where(n => allowedStatusNames.Contains(n)).ToList();
 214        }
 215
 0216        appStatusNames = appStatusNames.OrderBy(n => n).ToList();
 217
 0218        var hasUnassigned = filteredData.Any(o => o.AppStatus == null || string.IsNullOrEmpty(o.AppStatus.Name));
 219
 0220        if (hasUnassigned && !appStatusNames.Contains("Не указан"))
 221        {
 0222            appStatusNames.Insert(0, "Не указан");
 223        }
 0224        else if (appStatusNames.Contains("Не указан"))
 225        {
 0226            appStatusNames.Remove("Не указан");
 0227            appStatusNames.Insert(0, "Не указан");
 228        }
 229
 0230        var statusColors = allAppStatuses
 0231            .Where(s => s.Name != null && appStatusNames.Contains(s.Name))
 0232            .ToDictionary(s => s.Name!, s => s.GetStatusColor());
 233
 0234        if (appStatusNames.Contains("Не указан") && !statusColors.ContainsKey("Не указан"))
 235        {
 0236            var unassignedStatus = allAppStatuses.FirstOrDefault(s => s.Name == "Не указан");
 237
 0238            if (unassignedStatus != null)
 239            {
 0240                statusColors["Не указан"] = unassignedStatus.GetStatusColor();
 241            }
 242        }
 243
 0244        data.AppStatuses = new SelectList(appStatusNames.Select(n => new { Name = n }), "Name", "Name");
 0245        data.StatusColors = statusColors;
 246
 0247        var supplierIds = accessProfile.ScopeItems
 0248            .Where(x => x.ScopeType == DataScopeType.Supplier)
 0249            .Select(x => x.ReferenceId)
 0250            .ToList();
 251
 0252        var supplierNames = filteredData
 0253            .Where(o => o.Supplier != null && !string.IsNullOrEmpty(o.Supplier.Name))
 0254            .Select(o => o.Supplier!.Name!)
 0255            .Distinct()
 0256            .ToList();
 257
 0258        if (supplierIds.Any())
 259        {
 0260            var allowedSupplierNames = allSuppliers
 0261                .Where(s => supplierIds.Contains(s.Id))
 0262                .Select(s => s.Name)
 0263                .ToList();
 264
 0265            supplierNames = supplierNames.Where(n => allowedSupplierNames.Contains(n)).ToList();
 266        }
 267
 0268        data.Suppliers =
 0269            new SelectList(supplierNames.OrderBy(n => n).Select(n => new { Name = n }), "Name", "Name");
 270
 0271        var clientIds = accessProfile.ScopeItems
 0272            .Where(x => x.ScopeType == DataScopeType.OzonClient)
 0273            .Select(x => x.ReferenceId)
 0274            .ToList();
 275
 0276        var clientNames = filteredData
 0277            .Where(o => o.OzonClient != null && !string.IsNullOrEmpty(o.OzonClient.Name))
 0278            .Select(o => o.OzonClient!.Name!)
 0279            .Distinct()
 0280            .ToList();
 281
 0282        if (clientIds.Any())
 283        {
 0284            var allowedClientNames = allClients
 0285                .Where(c => clientIds.Contains(c.Id))
 0286                .Select(c => c.Name)
 0287                .ToList();
 288
 0289            clientNames = clientNames.Where(n => allowedClientNames.Contains(n)).ToList();
 290        }
 291
 0292        data.Clients = new SelectList(clientNames.OrderBy(n => n).Select(n => new { Name = n }), "Name", "Name");
 293
 0294        var warehouseIds = accessProfile.ScopeItems
 0295            .Where(x => x.ScopeType == DataScopeType.Warehouse)
 0296            .Select(x => x.ReferenceId)
 0297            .ToList();
 298
 0299        var warehouseNames = filteredData
 0300            .Where(o => o.ShipmentWarehouse != null && !string.IsNullOrEmpty(o.ShipmentWarehouse.Name))
 0301            .Select(o => o.ShipmentWarehouse!.Name!)
 0302            .Distinct()
 0303            .ToList();
 304
 0305        if (warehouseIds.Any())
 306        {
 0307            var allowedWarehouseNames = allWarehouses
 0308                .Where(w => warehouseIds.Contains(w.Id))
 0309                .Select(w => w.Name)
 0310                .ToList();
 311
 0312            warehouseNames = warehouseNames.Where(n => allowedWarehouseNames.Contains(n)).ToList();
 313        }
 314
 0315        var allWarehouseNames = warehouseNames.OrderBy(n => n).ToList();
 316
 0317        data.Warehouses = new SelectList(allWarehouseNames.Select(w => new { Name = w }), "Name", "Name");
 318
 0319        var statusNames = filteredData
 0320            .Where(o => o.ClientStatus != null && !string.IsNullOrEmpty(o.ClientStatus.Name))
 0321            .Select(o => o.ClientStatus!.Name!)
 0322            .Distinct()
 0323            .OrderBy(n => n)
 0324            .ToList();
 325
 0326        data.Statuses = new SelectList(statusNames.Select(n => new { Name = n }), "Name", "Name");
 327
 0328        var providerIds = accessProfile.ScopeItems
 0329            .Where(x => x.ScopeType == DataScopeType.DeliveryProvider)
 0330            .Select(x => x.ReferenceId)
 0331            .ToList();
 332
 0333        var providerNames = filteredData
 0334            .Where(o => o.Delivery != null && o.Delivery.Provider != null &&
 0335                        !string.IsNullOrEmpty(o.Delivery.Provider.Name))
 0336            .Select(o => o.Delivery!.Provider!.Name!)
 0337            .Distinct()
 0338            .ToList();
 339
 0340        if (providerIds.Any())
 341        {
 0342            var allowedProviderNames = allProviders
 0343                .Where(p => providerIds.Contains(p.Id))
 0344                .Select(p => p.Name)
 0345                .ToList();
 346
 0347            providerNames = providerNames.Where(n => allowedProviderNames.Contains(n)).ToList();
 348        }
 349
 0350        data.Providers =
 0351            new SelectList(providerNames.OrderBy(n => n).Select(n => new { Name = n }), "Name", "Name");
 352
 0353        var filteredDeliveryNames = filteredData
 0354            .Where(o => o.Delivery != null && !string.IsNullOrEmpty(o.Delivery.Name))
 0355            .Select(o => o.Delivery!.Name!)
 0356            .Distinct()
 0357            .OrderBy(n => n)
 0358            .ToList();
 359
 0360        data.DeliveryNames = new SelectList(filteredDeliveryNames.Select(n => new { Name = n }), "Name", "Name");
 0361    }
 362
 363    private async Task SetFilteredListsAsync(
 364        OrderFilterListsViewData data,
 365        AccessProfile accessProfile,
 366        CancellationToken ct)
 367    {
 0368        var statusIds = accessProfile.ScopeItems
 0369            .Where(x => x.ScopeType == DataScopeType.AppStatus)
 0370            .Select(x => x.ReferenceId)
 0371            .ToList();
 372
 0373        var allAppStatuses =
 0374            await _dictionaryCache.GetOrCreateAsync("dict_app_statuses_v3", () => _appStatusServices.GetAppStatuses(), c
 375
 0376        var appStatuses = statusIds.Any()
 0377            ? allAppStatuses.Where(s => statusIds.Contains(s.Id)).OrderBy(a => a.Name).ToList()
 0378            : allAppStatuses.OrderBy(a => a.Name).ToList();
 379
 0380        var unassignedStatus = appStatuses.FirstOrDefault(s => s.Name == "Не указан");
 381
 0382        if (unassignedStatus != null)
 383        {
 0384            appStatuses.Remove(unassignedStatus);
 0385            appStatuses.Insert(0, unassignedStatus);
 386        }
 387
 0388        data.AppStatuses = new SelectList(appStatuses, nameof(AppStatus.Name), nameof(AppStatus.Name));
 0389        data.StatusColors = appStatuses.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0390        data.AppStatusIsFinal = appStatuses.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 391
 0392        var supplierIds = accessProfile.ScopeItems
 0393            .Where(x => x.ScopeType == DataScopeType.Supplier)
 0394            .Select(x => x.ReferenceId)
 0395            .ToList();
 396
 0397        var allSuppliers =
 0398            await _dictionaryCache.GetOrCreateAsync("dict_suppliers", () => _supplierDataServices.GetSuppliers(), ct);
 399
 0400        var suppliers = supplierIds.Any()
 0401            ? allSuppliers.Where(s => supplierIds.Contains(s.Id)).OrderBy(a => a.Name).ToList()
 0402            : allSuppliers.OrderBy(a => a.Name).ToList();
 403
 0404        data.Suppliers = new SelectList(suppliers, "Name", "Name");
 405
 0406        var clientIds = accessProfile.ScopeItems
 0407            .Where(x => x.ScopeType == DataScopeType.OzonClient)
 0408            .Select(x => x.ReferenceId)
 0409            .ToList();
 410
 0411        var allClients =
 0412            await _dictionaryCache.GetOrCreateAsync("dict_ozon_clients", () => _ozonClientServices.GetOzonClients(), ct)
 413
 0414        var clients = clientIds.Any()
 0415            ? allClients.Where(c => clientIds.Contains(c.Id)).OrderBy(a => a.Name).ToList()
 0416            : allClients.OrderBy(a => a.Name).ToList();
 417
 0418        data.Clients = new SelectList(clients, "Name", "Name");
 419
 0420        var warehouseIds = accessProfile.ScopeItems
 0421            .Where(x => x.ScopeType == DataScopeType.Warehouse)
 0422            .Select(x => x.ReferenceId)
 0423            .ToList();
 424
 425        List<string> warehouseNames;
 426
 0427        var allWarehouses =
 0428            await _dictionaryCache.GetOrCreateAsync("dict_warehouses", () => _warehouseDataServices.GetWarehouses(), ct)
 429
 0430        if (warehouseIds.Any())
 431        {
 0432            warehouseNames = allWarehouses
 0433                .Where(w => warehouseIds.Contains(w.Id))
 0434                .Select(w => w.Name)
 0435                .Where(n => !string.IsNullOrEmpty(n))
 0436                .Select(n => n!)
 0437                .Distinct()
 0438                .OrderBy(w => w)
 0439                .ToList();
 440        }
 441        else
 442        {
 0443            warehouseNames = allWarehouses
 0444                .Select(w => w.Name)
 0445                .Where(n => !string.IsNullOrEmpty(n))
 0446                .Select(n => n!)
 0447                .Distinct()
 0448                .OrderBy(w => w)
 0449                .ToList();
 450        }
 451
 0452        data.Warehouses = new SelectList(warehouseNames.Select(w => new { Name = w }), "Name", "Name");
 453
 0454        var allClientStatuses =
 0455            await _dictionaryCache.GetOrCreateAsync("dict_client_statuses_v3", () => _clientStatusServices.GetClientStat
 456
 0457        var orderedStatuses = allClientStatuses.OrderBy(s => s.Name).ToList();
 458
 0459        data.Statuses = new SelectList(orderedStatuses, nameof(ClientStatus.Name), nameof(ClientStatus.Name));
 0460        data.StatusesIsFinal = orderedStatuses.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 0461        data.ClientStatusColors = orderedStatuses.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0462        data.ClientStatusTypesForPrint = orderedStatuses
 0463            .ToDictionary(
 0464                s => s.Name,
 0465                s => s.ClientType.HasValue ? s.ClientType.Value.ToString() : ClientType.ALL.ToString());
 466
 0467        var providerIds = accessProfile.ScopeItems
 0468            .Where(x => x.ScopeType == DataScopeType.DeliveryProvider)
 0469            .Select(x => x.ReferenceId)
 0470            .ToList();
 471
 0472        var allProviders =
 0473            await _dictionaryCache.GetOrCreateAsync("dict_delivery_providers", () => _deliveryDataServices.GetProviders(
 474
 0475        var providers = providerIds.Any()
 0476            ? allProviders.Where(p => providerIds.Contains(p.Id)).OrderBy(a => a.Name).ToList()
 0477            : allProviders.OrderBy(a => a.Name).ToList();
 478
 0479        data.Providers = new SelectList(providers, "Name", "Name");
 480
 0481        var allDeliveriesForFilter =
 0482            await _dictionaryCache.GetOrCreateAsync("dict_deliveries", () => _deliveryDataServices.GetDeliveriesAsync(),
 483
 0484        data.DeliveryNames = new SelectList(
 0485            allDeliveriesForFilter.OrderBy(d => d.Name).Select(d => new { Name = d.Name }),
 0486            "Name",
 0487            "Name");
 0488    }
 489
 490    private async Task SetFilterListsWithoutRestrictionsAsync(OrderFilterListsViewData data, CancellationToken ct)
 491    {
 0492        var allAppStatuses =
 0493            await _dictionaryCache.GetOrCreateAsync("dict_app_statuses_v3", () => _appStatusServices.GetAppStatuses(), c
 494
 0495        var allSuppliers =
 0496            await _dictionaryCache.GetOrCreateAsync("dict_suppliers", () => _supplierDataServices.GetSuppliers(), ct);
 497
 0498        var allClients =
 0499            await _dictionaryCache.GetOrCreateAsync("dict_ozon_clients", () => _ozonClientServices.GetOzonClients(), ct)
 500
 0501        var allWarehouses =
 0502            await _dictionaryCache.GetOrCreateAsync("dict_warehouses", () => _warehouseDataServices.GetWarehouses(), ct)
 503
 0504        var allClientStatuses =
 0505            await _dictionaryCache.GetOrCreateAsync("dict_client_statuses_v3", () => _clientStatusServices.GetClientStat
 506
 0507        var allProviders =
 0508            await _dictionaryCache.GetOrCreateAsync("dict_delivery_providers", () => _deliveryDataServices.GetProviders(
 509
 0510        var allDeliveriesForFilterUnrestricted =
 0511            await _dictionaryCache.GetOrCreateAsync("dict_deliveries", () => _deliveryDataServices.GetDeliveriesAsync(),
 512
 0513        var appStatuses = allAppStatuses.OrderBy(a => a.Name).ToList();
 514
 0515        var unassignedStatus = appStatuses.FirstOrDefault(s => s.Name == "Не указан");
 516
 0517        if (unassignedStatus != null)
 518        {
 0519            appStatuses.Remove(unassignedStatus);
 0520            appStatuses.Insert(0, unassignedStatus);
 521        }
 522
 0523        data.AppStatuses = new SelectList(appStatuses, "Name", "Name");
 0524        data.StatusColors = appStatuses.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0525        data.AppStatusIsFinal = appStatuses.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 0526        data.Suppliers = new SelectList(allSuppliers.OrderBy(a => a.Name), "Name", "Name");
 527
 0528        var orderedClients = allClients.OrderBy(a => a.Name).ToList();
 529
 0530        data.Clients = new SelectList(orderedClients, "Name", "Name");
 0531        data.ClientTypesForPrint = orderedClients
 0532            .ToDictionary(c => c.Name!, c => c.ClientType.ToString());
 533
 0534        var warehouseNames = allWarehouses
 0535            .Select(w => w.Name)
 0536            .Where(n => !string.IsNullOrEmpty(n))
 0537            .Distinct()
 0538            .OrderBy(w => w)
 0539            .ToList();
 540
 0541        data.Warehouses = new SelectList(warehouseNames.Select(w => new { Name = w }), "Name", "Name");
 542
 0543        var orderedStatuses = allClientStatuses.OrderBy(s => s.Name).ToList();
 544
 0545        data.Statuses = new SelectList(orderedStatuses, nameof(ClientStatus.Name), nameof(ClientStatus.Name));
 0546        data.StatusesIsFinal = orderedStatuses.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 0547        data.ClientStatusColors = orderedStatuses.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0548        data.ClientStatusTypesForPrint = orderedStatuses
 0549            .ToDictionary(
 0550                s => s.Name,
 0551                s => s.ClientType.HasValue ? s.ClientType.Value.ToString() : ClientType.ALL.ToString());
 552
 0553        data.Providers = new SelectList(allProviders.OrderBy(a => a.Name), "Name", "Name");
 0554        data.DeliveryNames = new SelectList(
 0555            allDeliveriesForFilterUnrestricted.OrderBy(d => d.Name).Select(d => new { Name = d.Name }),
 0556            "Name",
 0557            "Name");
 0558    }
 559
 560    private async Task ApplyDataScopeToFilterListsAsync(
 561        OrderFilterListsViewData data,
 562        string? userId,
 563        string? orderScopeExpression,
 564        CancellationToken ct)
 565    {
 0566        if (string.IsNullOrEmpty(userId))
 567        {
 0568            return;
 569        }
 570
 0571        if (string.IsNullOrEmpty(orderScopeExpression))
 572        {
 0573            return;
 574        }
 575
 0576        var allowed = await _scopeFilterValuesService.GetAllowedValuesAsync(userId, "Order", ct);
 0577        if (allowed.Count == 0)
 578        {
 0579            return;
 580        }
 581
 0582        if (allowed.TryGetValue("ShipmentWarehouseId", out var whIds) && whIds.Count > 0)
 583        {
 0584            var allWarehouses =
 0585                await _dictionaryCache.GetOrCreateAsync("dict_warehouses", () => _warehouseDataServices.GetWarehouses(),
 586
 0587            var names = allWarehouses
 0588                .Where(w => whIds.Contains(w.Id.ToString()))
 0589                .Select(w => w.Name)
 0590                .Where(n => !string.IsNullOrEmpty(n))
 0591                .Distinct()
 0592                .OrderBy(w => w)
 0593                .ToList();
 594
 0595            data.Warehouses = new SelectList(names.Select(w => new { Name = w }), "Name", "Name");
 596        }
 597
 0598        if (allowed.TryGetValue("SupplierId", out var supIds) && supIds.Count > 0)
 599        {
 0600            var allSuppliers =
 0601                await _dictionaryCache.GetOrCreateAsync("dict_suppliers", () => _supplierDataServices.GetSuppliers(), ct
 602
 0603            var filtered = allSuppliers.Where(s => supIds.Contains(s.Id.ToString())).OrderBy(s => s.Name).ToList();
 0604            data.Suppliers = new SelectList(filtered, "Name", "Name");
 605        }
 606
 0607        if (allowed.TryGetValue("OzonClientId", out var ozIds) && ozIds.Count > 0)
 608        {
 0609            var allClients =
 0610                await _dictionaryCache.GetOrCreateAsync("dict_ozon_clients", () => _ozonClientServices.GetOzonClients(),
 611
 0612            var filtered = allClients.Where(c => ozIds.Contains(c.Id.ToString())).OrderBy(c => c.Name).ToList();
 0613            data.Clients = new SelectList(filtered, "Name", "Name");
 0614            data.ClientTypesForPrint = filtered.ToDictionary(c => c.Name!, c => c.ClientType.ToString());
 615        }
 616
 0617        if (allowed.TryGetValue("AppStatusId", out var appStIds) && appStIds.Count > 0)
 618        {
 0619            var allAppStatuses =
 0620                await _dictionaryCache.GetOrCreateAsync("dict_app_statuses_v3", () => _appStatusServices.GetAppStatuses(
 621
 0622            var filtered = allAppStatuses.Where(s => appStIds.Contains(s.Id.ToString())).OrderBy(s => s.Name).ToList();
 0623            var unassigned = filtered.FirstOrDefault(s => s.Name == "Не указан");
 0624            if (unassigned != null)
 625            {
 0626                filtered.Remove(unassigned);
 0627                filtered.Insert(0, unassigned);
 628            }
 629
 0630            data.AppStatuses = new SelectList(filtered, nameof(AppStatus.Name), nameof(AppStatus.Name));
 0631            data.StatusColors = filtered.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0632            data.AppStatusIsFinal = filtered.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 633        }
 634
 0635        if (allowed.TryGetValue("ClientStatusId", out var clStIds) && clStIds.Count > 0)
 636        {
 0637            var allClientStatuses =
 0638                await _dictionaryCache.GetOrCreateAsync("dict_client_statuses_v3", () => _clientStatusServices.GetClient
 639
 0640            var filtered = allClientStatuses.Where(s => clStIds.Contains(s.Id.ToString())).OrderBy(s => s.Name).ToList()
 0641            data.Statuses = new SelectList(filtered, nameof(ClientStatus.Name), nameof(ClientStatus.Name));
 0642            data.StatusesIsFinal = filtered.ToDictionary(s => s.Name!, s => s.IsFinal.ToString());
 0643            data.ClientStatusColors = filtered.ToDictionary(s => s.Name!, s => s.GetStatusColor());
 0644            data.ClientStatusTypesForPrint = filtered.ToDictionary(
 0645                s => s.Name,
 0646                s => s.ClientType.HasValue ? s.ClientType.Value.ToString() : ClientType.ALL.ToString());
 647        }
 648
 0649        if (allowed.TryGetValue("DeliveryId", out var delIds) && delIds.Count > 0)
 650        {
 0651            var allDeliveries =
 0652                await _dictionaryCache.GetOrCreateAsync("dict_deliveries", () => _deliveryDataServices.GetDeliveriesAsyn
 653
 0654            var filteredDeliveries = allDeliveries.Where(d => delIds.Contains(d.Id.ToString())).OrderBy(d => d.Name).ToL
 0655            data.DeliveryNames = new SelectList(filteredDeliveries.Select(d => new { Name = d.Name }), "Name", "Name");
 656        }
 0657    }
 658}