< Summary

Information
Class: OzonRepositories.Data.EtProducerMarketPrefixResolver
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/EtProducerMarketPrefixResolver.cs
Line coverage
22%
Covered lines: 11
Uncovered lines: 37
Coverable lines: 48
Total lines: 92
Line coverage: 22.9%
Branch coverage
12%
Covered branches: 4
Total branches: 32
Branch coverage: 12.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_EtProduserId()100%11100%
Resolve(...)15.38%3282623.52%
CollectGroupMarketPrefixes(...)0%2040%
PreferCanonicalManufacturer(...)100%11100%
PreferCanonicalCode(...)0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/EtProducerMarketPrefixResolver.cs

#LineLine coverage
 1namespace OzonRepositories.Data;
 2
 3/// <summary>
 4/// Выбор Ozon MarketPrefix для группы et_producers (realId) с учётом справочника Manufacturers.
 5/// </summary>
 6public static class EtProducerMarketPrefixResolver
 7{
 138    public sealed record ProducerRow(int Id, int RealId, string Prefix, string? MarketPrefix);
 9
 2510    public sealed record ManufacturerRow(int? EtProduserId, string Code, string? Name);
 11
 12    public static string? Resolve(
 13        ProducerRow match,
 14        IReadOnlyList<ProducerRow> allProducers,
 15        IReadOnlyList<ManufacturerRow> manufacturers)
 16    {
 317        var canonicalRealId = match.RealId != 0 ? match.RealId : match.Id;
 18
 319        var linkedManufacturer = manufacturers
 520            .Where(m => m.EtProduserId == canonicalRealId && !string.IsNullOrWhiteSpace(m.Code))
 321            .OrderBy(m => PreferCanonicalManufacturer(m))
 322            .ThenBy(m => m.Code, StringComparer.OrdinalIgnoreCase)
 323            .FirstOrDefault();
 24
 325        if (linkedManufacturer != null)
 26        {
 327            return linkedManufacturer.Code.Trim();
 28        }
 29
 030        var producersById = allProducers.ToDictionary(p => p.Id);
 031        var groupPrefixes = CollectGroupMarketPrefixes(allProducers, canonicalRealId);
 032        if (groupPrefixes.Count == 0)
 33        {
 034            return match.MarketPrefix?.Trim();
 35        }
 36
 037        var manufacturerCodes = manufacturers
 038            .Where(m => !string.IsNullOrWhiteSpace(m.Code))
 039            .Select(m => m.Code.Trim())
 040            .ToHashSet(StringComparer.OrdinalIgnoreCase);
 41
 042        var knownInManufacturers = groupPrefixes
 043            .Where(p => manufacturerCodes.Contains(p))
 044            .ToList();
 45
 046        if (knownInManufacturers.Count > 0)
 47        {
 048            var alternate = knownInManufacturers
 049                .Where(p => !string.Equals(p, match.Prefix, StringComparison.OrdinalIgnoreCase))
 050                .OrderBy(PreferCanonicalCode(manufacturers))
 051                .ThenBy(p => p, StringComparer.OrdinalIgnoreCase)
 052                .ToList();
 53
 054            if (alternate.Count > 0)
 55            {
 056                return alternate[0];
 57            }
 58
 059            return knownInManufacturers
 060                .OrderBy(PreferCanonicalCode(manufacturers))
 061                .ThenBy(p => p, StringComparer.OrdinalIgnoreCase)
 062                .First();
 63        }
 64
 065        if (match.RealId != 0 && producersById.TryGetValue(match.RealId, out var headProducer))
 66        {
 067            return headProducer.MarketPrefix?.Trim() ?? match.MarketPrefix?.Trim();
 68        }
 69
 070        return match.MarketPrefix?.Trim();
 71    }
 72
 73    private static List<string> CollectGroupMarketPrefixes(IReadOnlyList<ProducerRow> allProducers, int canonicalRealId)
 74    {
 075        return allProducers
 076            .Where(p => p.Id == canonicalRealId || p.RealId == canonicalRealId)
 077            .Select(p => p.MarketPrefix?.Trim())
 078            .Where(p => !string.IsNullOrWhiteSpace(p))
 079            .Distinct(StringComparer.OrdinalIgnoreCase)
 080            .ToList()!;
 81    }
 82
 83    private static int PreferCanonicalManufacturer(ManufacturerRow row) =>
 384        string.Equals(row.Code, row.Name, StringComparison.OrdinalIgnoreCase) ? 0 : 1;
 85
 86    private static Func<string, int> PreferCanonicalCode(IReadOnlyList<ManufacturerRow> manufacturers) =>
 087        code => manufacturers.Any(m =>
 088            string.Equals(m.Code, code, StringComparison.OrdinalIgnoreCase) &&
 089            string.Equals(m.Code, m.Name, StringComparison.OrdinalIgnoreCase))
 090            ? 0
 091            : 1;
 92}