< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.OrdersGridGrouping
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridGrouping.cs
Line coverage
14%
Covered lines: 7
Uncovered lines: 42
Coverable lines: 49
Total lines: 79
Line coverage: 14.2%
Branch coverage
1%
Covered branches: 2
Total branches: 148
Branch coverage: 1.3%
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%22100%
IsShipment(...)100%11100%
ApplyOrder(...)0%3782610%
ByName(...)100%210%
KeyOf(...)0%7310850%

File(s)

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

#LineLine coverage
 1using System.Linq.Expressions;
 2using OzonDomains.Models;
 3
 4namespace OzonOrdersWeb.WebServices.Orders.Grid;
 5
 6/// <summary>
 7/// Группировка строк грида (AG Grid Community не умеет row grouping): сервер упорядочивает выборку по ключу
 8/// группы, затем по дате принятия, и помечает первую строку каждой группы в блоке — клиент рисует полосы.
 9/// Ключ группы — то же поле, что у справочного фильтра (см. <see cref="OrdersGridFacetsService"/>).
 10/// </summary>
 11public static class OrdersGridGrouping
 12{
 13    public const string Shipment = "shipment";
 14
 115    private static readonly HashSet<string> Supported = new(StringComparer.OrdinalIgnoreCase)
 116    {
 117        Shipment, "ozonClient", "clientStatus", "appStatus", "shipmentWarehouse", "deliveryProvider", "deliveryName",
 118        "supplier", "manufacturer", "processingDate", "shippingDate", "deliveryCity", "article", "productName", "product
 119    };
 20
 621    public static bool Supports(string? groupBy) => !string.IsNullOrWhiteSpace(groupBy) && Supported.Contains(groupBy);
 22
 2923    public static bool IsShipment(string? groupBy) => string.Equals(groupBy, Shipment, StringComparison.OrdinalIgnoreCas
 24
 25    /// <summary>Порядок по ключу группы; внутри группы — сортировка пользователя (см. <see cref="OrdersGridSorting"/>),
 26    public static IOrderedQueryable<Order> ApplyOrder(IQueryable<Order> query, string groupBy)
 27    {
 028        IOrderedQueryable<Order> ordered = groupBy.ToLowerInvariant() switch
 029        {
 030            "shipment" => query.OrderByDescending(o => o.ShipmentId),
 031            "ozonclient" => ByName(query, o => o.OzonClient != null ? o.OzonClient.Name : null),
 032            "clientstatus" => ByName(query, o => o.ClientStatus != null ? o.ClientStatus.Name : null),
 033            "appstatus" => ByName(query, o => o.AppStatus != null ? o.AppStatus.Name : null),
 034            "shipmentwarehouse" => ByName(query, o => o.ShipmentWarehouse != null ? o.ShipmentWarehouse.Name : null),
 035            "deliveryprovider" => ByName(query, o => o.Delivery != null && o.Delivery.Provider != null ? o.Delivery.Prov
 036            "deliveryname" => ByName(query, o => o.Delivery != null ? o.Delivery.Name : null),
 037            "supplier" => ByName(query, o => o.Supplier != null ? o.Supplier.Name : null),
 038            "manufacturer" => ByName(query, o => o.Manufacturer != null ? o.Manufacturer.Name : null),
 039            "deliverycity" => ByName(query, o => o.DeliveryCity),
 040            "article" => ByName(query, o => o.Article),
 041            "productname" => ByName(query, o => o.ProductName),
 042            "productkey" => ByName(query, o => o.ProductKey),
 043            "processingdate" => query.OrderByDescending(o => o.ProcessingDate!.Value.Date),
 044            "shippingdate" => query.OrderByDescending(o => o.ShippingDate!.Value.Date),
 045            _ => throw new ArgumentOutOfRangeException(nameof(groupBy), groupBy, "Неподдерживаемая группировка.")
 046        };
 47
 048        return ordered;
 49    }
 50
 51    /// <summary>По имени А→Я, пустые значения — в конец (MySQL иначе ставит NULL первым).</summary>
 52    private static IOrderedQueryable<Order> ByName(IQueryable<Order> query, Expression<Func<Order, string?>> key)
 53    {
 054        var isNull = Expression.Lambda<Func<Order, bool>>(
 055            Expression.Equal(key.Body, Expression.Constant(null, typeof(string))), key.Parameters);
 056        return query.OrderBy(isNull).ThenBy(key);
 57    }
 58
 59    /// <summary>Ключ группы для загруженного заказа — для пометки границ групп в блоке.</summary>
 060    public static string? KeyOf(Order o, string groupBy) => groupBy.ToLowerInvariant() switch
 061    {
 062        "shipment" => o.ShipmentId?.ToString(),
 063        "ozonclient" => o.OzonClient?.Name,
 064        "clientstatus" => o.ClientStatus?.Name,
 065        "appstatus" => o.AppStatus?.Name,
 066        "shipmentwarehouse" => o.ShipmentWarehouse?.Name,
 067        "deliveryprovider" => o.Delivery?.Provider?.Name,
 068        "deliveryname" => o.Delivery?.Name,
 069        "supplier" => o.Supplier?.Name,
 070        "manufacturer" => o.Manufacturer?.Name,
 071        "deliverycity" => o.DeliveryCity,
 072        "article" => o.Article,
 073        "productname" => o.ProductName,
 074        "productkey" => o.ProductKey,
 075        "processingdate" => o.ProcessingDate?.ToString("dd.MM.yyyy"),
 076        "shippingdate" => o.ShippingDate?.ToString("dd.MM.yyyy"),
 077        _ => null
 078    };
 79}