< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.OrdersGridMultiValueFilters
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridMultiValueFilters.cs
Line coverage
17%
Covered lines: 6
Uncovered lines: 28
Coverable lines: 34
Total lines: 80
Line coverage: 17.6%
Branch coverage
0%
Covered branches: 0
Total branches: 47
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Supports(...)100%11100%
Apply(...)0%2256470%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridMultiValueFilters.cs

#LineLine coverage
 1using OzonDomains.Models;
 2using OzonRepositories.Context;
 3
 4namespace OzonOrdersWeb.WebServices.Orders.Grid;
 5
 6/// <summary>
 7/// Множественный выбор в справочных фильтрах грида (set-фильтр «как в AG Grid Enterprise»).
 8/// Общий конвейер (<c>OrderDataFilterManager</c>) умеет только одно значение на поле, поэтому
 9/// наборы из 2+ значений применяются отдельным <c>Where … Contains</c> через
 10/// <see cref="OrdersIndexQueryRequest.QueryPostProcessor"/>. Одно значение идёт старым путём —
 11/// там остаются спец-случаи (LIKE у клиента, «Засыл» у склада).
 12/// </summary>
 13public static class OrdersGridMultiValueFilters
 14{
 115    private static readonly HashSet<string> Supported = new(StringComparer.OrdinalIgnoreCase)
 116    {
 117        "ozonClient", "deliveryProvider", "deliveryName", "clientStatus", "appStatus",
 118        "supplierStatus", "shipmentWarehouse", "supplier", "hasOzonPromotion"
 119    };
 20
 921    public static bool Supports(string colId) => Supported.Contains(colId);
 22
 23    public static IQueryable<Order> Apply(
 24        IQueryable<Order> query,
 25        IReadOnlyDictionary<string, IReadOnlyList<string>> filters,
 26        ApplicationDbContext context)
 27    {
 028        foreach (var (colId, rawValues) in filters)
 29        {
 030            var values = rawValues.Select(v => v.ToLowerInvariant()).ToList();
 031            if (values.Count == 0) continue;
 32
 033            switch (colId.ToLowerInvariant())
 34            {
 35                case "ozonclient":
 036                    query = query.Where(o => o.OzonClient != null && values.Contains(o.OzonClient.Name.ToLower()));
 037                    break;
 38                case "deliveryprovider":
 039                    query = query.Where(o => o.Delivery != null && o.Delivery.Provider != null && values.Contains(o.Deli
 040                    break;
 41                case "deliveryname":
 042                    query = query.Where(o => o.Delivery != null && o.Delivery.Name != null && values.Contains(o.Delivery
 043                    break;
 44                case "clientstatus":
 045                    query = query.Where(o => o.ClientStatus != null && values.Contains(o.ClientStatus.Name.ToLower()));
 046                    break;
 47                case "appstatus":
 48                {
 49                    // «Не указан» в списке статусов = заказы без статуса в отчёте.
 050                    var includeEmpty = values.Contains("не указан");
 051                    query = query.Where(o =>
 052                        (o.AppStatus != null && o.AppStatus.Name != null && values.Contains(o.AppStatus.Name.ToLower()))
 053                        || (includeEmpty && o.AppStatus == null));
 054                    break;
 55                }
 56                case "supplierstatus":
 57                {
 058                    var ids = rawValues.Select(v => int.TryParse(v, out var id) ? id : (int?)null)
 059                        .Where(id => id.HasValue).Select(id => id!.Value).ToList();
 060                    if (ids.Count == 0) break;
 061                    query = query.Where(o => context.OrderSupplierStates.Any(state =>
 062                        state.OrderId == o.Id && state.ActiveOrderId != null
 063                        && state.SupplierStatusId.HasValue && ids.Contains(state.SupplierStatusId.Value)));
 064                    break;
 65                }
 66                case "shipmentwarehouse":
 067                    query = query.Where(o => o.ShipmentWarehouse != null && o.ShipmentWarehouse.Name != null && values.C
 068                    break;
 69                case "supplier":
 070                    query = query.Where(o => o.Supplier != null && o.Supplier.Name != null && values.Contains(o.Supplier
 71                    break;
 72                case "hasozonpromotion":
 73                    // Оба значения выбраны — фильтр не сужает; здесь только на всякий случай.
 74                    break;
 75            }
 76        }
 77
 078        return query;
 79    }
 80}