< Summary

Information
Class: Services.ApiServices._1CApi.Nomenclature.MapRow
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureIndex.cs
Line coverage
100%
Covered lines: 1
Uncovered lines: 0
Coverable lines: 1
Total lines: 81
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ArticleNorm()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/1CApi/Nomenclature/NomenclatureIndex.cs

#LineLine coverage
 1using OzonDomains.Nomenclature;
 2
 3namespace Services.ApiServices._1CApi.Nomenclature;
 4
 5/// <summary>Строка карты соответствий (<c>OneCNomenclatureMaps</c>) в том виде, в котором её читает индекс.</summary>
 6576public sealed record MapRow(string ArticleNorm, string ProducerNorm, string? ProducerName, Guid RefKey, string? RawArtic
 7
 8/// <param name="Groups">Группы бренда карточки; пусто — у карточки нет производителя или он не известен справочнику.</p
 9public sealed record IndexedCard(
 10    Guid RefKey,
 11    string ArticleKey,
 12    string? ProducerName,
 13    string ProducerNorm,
 14    string? RawArticle,
 15    string Source,
 16    IReadOnlySet<string> Groups)
 17{
 18    public bool HasProducer => ProducerNorm.Length > 0;
 19}
 20
 21/// <summary>
 22/// Снимок карты соответствий в памяти: ключ артикула (<see cref="ArticleKey.Key"/>, с диакритикой и кириллическими
 23/// двойниками) → карточки 1С с группами бренда. Неизменяемый; подмена снимка — в <c>NomenclatureIndexProvider</c>.
 24/// </summary>
 25public sealed class NomenclatureIndex
 26{
 27    public static readonly NomenclatureIndex Empty = new(new Dictionary<string, List<IndexedCard>>(), 0, new Dictionary<
 28
 29    private readonly Dictionary<string, List<IndexedCard>> _byArticle;
 30
 31    private NomenclatureIndex(Dictionary<string, List<IndexedCard>> byArticle, int count, Dictionary<string, int> usage)
 32    {
 33        _byArticle = byArticle;
 34        Count = count;
 35        ProducerUsage = usage;
 36    }
 37
 38    /// <summary>Сколько карточек у каждого написания производителя (ключ — <see cref="ArticleKey.Key"/> имени).</summar
 39    public IReadOnlyDictionary<string, int> ProducerUsage { get; }
 40
 41    public int Count { get; }
 42
 43    public static NomenclatureIndex Build(IEnumerable<MapRow> rows, ProducerDirectory directory)
 44    {
 45        var byArticle = new Dictionary<string, List<IndexedCard>>(StringComparer.Ordinal);
 46        var count = 0;
 47        var usage = new Dictionary<string, int>(StringComparer.Ordinal);
 48        foreach (var row in rows)
 49        {
 50            var key = ArticleKey.Key(row.ArticleNorm);
 51            if (key.Length == 0)
 52                continue;
 53
 54            var groups = row.ProducerNorm.Length == 0
 55                ? ProducerResolution.NoGroups
 56                : directory.GroupsOfName(string.IsNullOrWhiteSpace(row.ProducerName) ? row.ProducerNorm : row.ProducerNa
 57            if (groups.Count == 0 && row.ProducerNorm.Length > 0)
 58                groups = directory.GroupsOfName(row.ProducerNorm);
 59
 60            if (!byArticle.TryGetValue(key, out var list))
 61                byArticle[key] = list = new List<IndexedCard>(1);
 62
 63            list.Add(new IndexedCard(row.RefKey, key, row.ProducerName, row.ProducerNorm, row.RawArticle, row.Source, gr
 64            count++;
 65
 66            var producerKey = ArticleKey.Key(string.IsNullOrWhiteSpace(row.ProducerName) ? row.ProducerNorm : row.Produc
 67            if (producerKey.Length > 0)
 68                usage[producerKey] = usage.GetValueOrDefault(producerKey) + 1;
 69        }
 70
 71        return new NomenclatureIndex(byArticle, count, usage);
 72    }
 73
 74    public IReadOnlyList<IndexedCard> Find(string articleKey)
 75        => !string.IsNullOrEmpty(articleKey) && _byArticle.TryGetValue(articleKey, out var list)
 76            ? list
 77            : [];
 78
 79    /// <summary>Все артикулы индекса с карточками — для отчётов (дубли).</summary>
 80    public IEnumerable<KeyValuePair<string, List<IndexedCard>>> Articles() => _byArticle;
 81}

Methods/Properties

get_ArticleNorm()