< Summary

Information
Class: OzonOrdersWeb.WebServices.ApiSettingsGrid.ApiMappingGridBuilders
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/ApiSettingsGrid/ApiMappingGrid.cs
Line coverage
96%
Covered lines: 50
Uncovered lines: 2
Coverable lines: 52
Total lines: 105
Line coverage: 96.1%
Branch coverage
75%
Covered branches: 3
Total branches: 4
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Row(...)100%22100%
Armtek(...)100%11100%
MlAuto(...)100%11100%
MlAutoRu(...)100%11100%
MlAutoCore(...)100%1180%
ProfitLiga(...)100%1187.5%
Berg(...)50%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/ApiSettingsGrid/ApiMappingGrid.cs

#LineLine coverage
 1using System.Globalization;
 2using OzonOrdersWeb.Areas.Studio2.ViewModels.ApiSupplierSettings;
 3
 4namespace OzonOrdersWeb.WebServices.ApiSettingsGrid;
 5
 6/// <summary>Вариант списка в колонке связи. <c>Groups</c> — значения зависимой колонки, при которых вариант доступен (п
 7public sealed record ApiMappingOption(string Value, string Label, IReadOnlyList<string>? Groups = null);
 8
 9/// <summary>Колонка связи «склад → значение поставщика»: <c>Field</c> — имя свойства строки формы.</summary>
 10public sealed record ApiMappingColumn(
 11    string Field,
 12    string Header,
 13    IReadOnlyList<ApiMappingOption> Options,
 14    string? EmptyLabel,
 15    string? DependsOn = null,
 16    bool DisabledOnError = false,
 17    int MinWidth = 280);
 18
 19public sealed record ApiMappingRow(int WarehouseId, string WarehouseName, IReadOnlyDictionary<string, string> Values);
 20
 21/// <summary>
 22/// Описание грида связей склада Studio2 со значениями API-поставщика (Armtek, ML-Auto, Профит-Лига, Berg).
 23/// Значения уходят обычным POST формы страницы как <c>&lt;Prefix&gt;[i].&lt;Field&gt;</c>, контроллеры не меняются.
 24/// </summary>
 25public sealed record ApiMappingGrid(
 26    string Key,
 27    string Prefix,
 28    string Eyebrow,
 29    string Title,
 30    string Description,
 31    string AnchorPrefix,
 32    string? LoadError,
 33    bool PostWarehouseName,
 34    bool RowSave,
 35    IReadOnlyList<string> LinkedFields,
 36    IReadOnlyList<ApiMappingColumn> Columns,
 37    IReadOnlyList<ApiMappingRow> Rows);
 38
 39public static class ApiMappingGridBuilders
 40{
 41    private static ApiMappingRow Row(int id, string name, params (string Field, string? Value)[] values)
 1342        => new(id, name, values.ToDictionary(x => x.Field, x => x.Value ?? ""));
 43
 44    public static ApiMappingGrid Armtek(ArmtekSettingsViewModel model)
 45    {
 146        var addresses = model.ArmtekBuyers
 547            .SelectMany(b => b.DeliveryAddresses.Select(a => (Buyer: b.Kunnr, Address: a.Kunnr, a.DisplayName)))
 348            .GroupBy(x => x.Address)
 549            .Select(g => new ApiMappingOption(g.Key, g.First().DisplayName, g.Select(x => x.Buyer).Distinct().ToList()))
 150            .ToList();
 151        return new ApiMappingGrid(
 152            "dirApiMapArmtek", "DeliveryMappings", "Проценка Armtek", "Связи склада и адреса доставки",
 153            "Выберите клиента и адрес для склада. Без связи проценка работает по настройкам Armtek по умолчанию.",
 154            "armtek-mapping", model.DeliveryMappingsLoadError, true, true,
 155            ["BuyerKunnr", "DeliveryAddressKunnr"],
 156            [
 157                new ApiMappingColumn("BuyerKunnr", "Клиент Armtek",
 258                    model.ArmtekBuyers.Select(b => new ApiMappingOption(b.Kunnr, b.DisplayName)).ToList(), "Не связано")
 159                new ApiMappingColumn("DeliveryAddressKunnr", "Адрес доставки Armtek", addresses, "Не связано", DependsOn
 160            ],
 261            model.DeliveryMappings.Select(m => Row(m.ShipmentWarehouseId, m.WarehouseName,
 262                ("BuyerKunnr", m.BuyerKunnr), ("DeliveryAddressKunnr", m.DeliveryAddressKunnr))).ToList());
 63    }
 64
 165    public static ApiMappingGrid MlAuto(MlAutoSettingsViewModel model) => MlAutoCore(
 166        "dirApiMapMlAuto", "ПРОЦЕНКА ML-AUTO", "Выберите адрес ML-Auto для склада Studio2. Его можно изменить в корзине 
 167        "Адрес доставки ML-Auto", "mlauto-mapping", model.DeliveryMappingsLoadError, model.DeliveryMappings, model.Deliv
 68
 169    public static ApiMappingGrid MlAutoRu(MlAutoRuSettingsViewModel model) => MlAutoCore(
 170        "dirApiMapMlAutoRu", "ML-AUTO RU", "Выберите адрес ML-Auto RU для склада Studio2. Связи хранятся отдельно от ML-
 171        "Адрес доставки ML-Auto RU", "mlautoru-mapping", model.DeliveryMappingsLoadError, model.DeliveryMappings, model.
 72
 73    private static ApiMappingGrid MlAutoCore(string key, string eyebrow, string description, string header, string ancho
 74        string? error, List<MlAutoDeliveryMappingViewModel> mappings, List<MlAutoDeliveryAddressViewModel> addresses)
 275        => new(key, "DeliveryMappings", eyebrow, "Связи склада и адреса доставки", description, anchor, error, true, tru
 276            ["DeliveryAddressId"],
 277            [new ApiMappingColumn("DeliveryAddressId", header,
 078                addresses.Select(a => new ApiMappingOption(a.Id, a.DisplayName)).ToList(), "Не связано", DisabledOnError
 279            mappings.Select(m => Row(m.ShipmentWarehouseId, m.WarehouseName, ("DeliveryAddressId", m.DeliveryAddressId))
 80
 181    public static ApiMappingGrid ProfitLiga(ProfitLigaSettingsViewModel model) => new(
 182        "dirApiMapProfitLiga", "PointMappings", "ЗАКАЗ ПРОФИТ-ЛИГИ", "Связи склада и торговой точки",
 183        "Выберите торговую точку Профит-Лиги для склада отгрузки Studio2. Точка определяет адрес доставки и дату поставк
 184        "profitliga-mapping", model.PointsLoadError, true, false,
 185        ["PointCode"],
 186        [new ApiMappingColumn("PointCode", "Торговая точка Профит-Лиги",
 087            model.Points.Select(p => new ApiMappingOption(p.Code, p.DisplayName)).ToList(), "Не связано", DisabledOnErro
 288        model.PointMappings.Select(m => Row(m.ShipmentWarehouseId, m.WarehouseName, ("PointCode", m.PointCode))).ToList(
 89
 190    public static ApiMappingGrid Berg(BergSettingsViewModel model) => new(
 191        "dirApiMapBerg", "AddressMappings", "ЗАКАЗ ЧЕРЕЗ API BERG", "Адреса отгрузки Berg",
 192        "Заказ через API уходит на конкретный адрес из справочника Berg. Склад отгрузки заказа Studio2 определяет адрес:
 193        "berg-mapping", model.AddressesLoadError, false, false,
 194        ["BergShipmentAddressId"],
 195        [
 196            new ApiMappingColumn("BergShipmentAddressId", "Адрес Berg",
 197                model.Addresses.Select(a => new ApiMappingOption(a.Id.ToString(CultureInfo.InvariantCulture), a.DisplayN
 198                "— не связан —", DisabledOnError: true),
 199            new ApiMappingColumn("DispatchType", "Тип отгрузки",
 1100                [new("3", "Доставка"), new("2", "Самовывоз"), new("60580", "Срочная доставка")], null, MinWidth: 220)
 1101        ],
 2102        model.AddressMappings.Select(m => Row(m.ShipmentWarehouseId, m.WarehouseName,
 2103            ("BergShipmentAddressId", m.BergShipmentAddressId?.ToString(CultureInfo.InvariantCulture)),
 2104            ("DispatchType", m.DispatchType.ToString(CultureInfo.InvariantCulture)))).ToList());
 105}