< Summary

Information
Class: Services.LabelServices.OzonPostingNumberHelper
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/OzonPostingNumberHelper.cs
Line coverage
98%
Covered lines: 49
Uncovered lines: 1
Coverable lines: 50
Total lines: 122
Line coverage: 98%
Branch coverage
86%
Covered branches: 38
Total branches: 44
Branch coverage: 86.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%
GetOzonApiPostingNumber(...)100%44100%
IsStudioLocalSplitPosting(...)50%22100%
IsSplitChildPosting(...)85.71%1414100%
GetOzonParentPostingNumber(...)80%1010100%
GetLabelPostingNumberCandidates()83.33%6690%
GetLabelFileNameCandidates()100%88100%
GroupStudioLocalSplitSiblings(...)100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/OzonPostingNumberHelper.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2using OzonDomains.Models;
 3
 4namespace Services.LabelServices;
 5
 6public static class OzonPostingNumberHelper
 7{
 18    private static readonly Regex StudioSuffixRegex = new(@"(/\d+)+$", RegexOptions.Compiled);
 9
 10    /// <summary>
 11    /// Номер отправления для Ozon API: убирает суффикс Studio (/1, /2), сохраняет Ozon FBS (-1, -2).
 12    /// </summary>
 13    public static string GetOzonApiPostingNumber(string? shipmentNumber)
 14    {
 2415        if (string.IsNullOrEmpty(shipmentNumber))
 16        {
 217            return shipmentNumber ?? string.Empty;
 18        }
 19
 2220        return StudioSuffixRegex.Replace(shipmentNumber, string.Empty);
 21    }
 22
 23    public static bool IsStudioLocalSplitPosting(string? shipmentNumber) =>
 824        !string.IsNullOrEmpty(shipmentNumber) && shipmentNumber.Contains('/');
 25
 26    /// <summary>
 27    /// Отправление уже разделено (Studio: /1, Ozon FBS: 38985986-0036-1).
 28    /// </summary>
 29    public static bool IsSplitChildPosting(string? shipmentNumber)
 30    {
 1431        if (string.IsNullOrEmpty(shipmentNumber))
 32        {
 133            return false;
 34        }
 35
 1336        if (shipmentNumber.Contains('/'))
 37        {
 738            var slash = shipmentNumber.LastIndexOf('/');
 739            return slash >= 0 && slash < shipmentNumber.Length - 1
 740                               && int.TryParse(shipmentNumber[(slash + 1)..], out _);
 41        }
 42
 643        var parts = shipmentNumber.Split('-');
 644        return parts.Length >= 3
 645               && int.TryParse(parts[^1], out var splitIndex)
 646               && splitIndex > 0
 647               && splitIndex < 100;
 48    }
 49
 50    public static string? GetOzonParentPostingNumber(string? shipmentNumber)
 51    {
 652        if (string.IsNullOrEmpty(shipmentNumber) || !IsSplitChildPosting(shipmentNumber))
 53        {
 154            return null;
 55        }
 56
 557        if (shipmentNumber.Contains('/'))
 58        {
 459            var slash = shipmentNumber.LastIndexOf('/');
 460            return slash > 0 ? shipmentNumber[..slash] : null;
 61        }
 62
 163        var parts = shipmentNumber.Split('-');
 164        return parts.Length >= 3 ? string.Join("-", parts.Take(parts.Length - 1)) : null;
 65    }
 66
 67    public static IEnumerable<string> GetLabelPostingNumberCandidates(string? shipmentNumber)
 68    {
 169        if (string.IsNullOrEmpty(shipmentNumber))
 70        {
 071            yield break;
 72        }
 73
 174        yield return shipmentNumber;
 75
 176        var parent = GetOzonParentPostingNumber(shipmentNumber);
 177        if (!string.IsNullOrEmpty(parent))
 78        {
 179            yield return parent;
 80        }
 81
 182        var slashIdx = shipmentNumber.LastIndexOf('/');
 183        if (slashIdx > 0)
 84        {
 185            yield return shipmentNumber[..slashIdx];
 86        }
 187    }
 88
 89    public static IEnumerable<string> GetLabelFileNameCandidates(string? shipmentNumber)
 90    {
 691        if (string.IsNullOrEmpty(shipmentNumber))
 92        {
 293            yield break;
 94        }
 95
 496        yield return $"{shipmentNumber}.pdf";
 97
 498        if (!IsSplitChildPosting(shipmentNumber))
 99        {
 2100            yield break;
 101        }
 102
 2103        var slashIdx = shipmentNumber.LastIndexOf('/');
 2104        if (slashIdx > 0)
 105        {
 2106            yield return $"{shipmentNumber[..slashIdx]}.pdf";
 107        }
 108
 2109        var parts = shipmentNumber.Split('-');
 2110        if (parts.Length >= 3)
 111        {
 1112            yield return $"{string.Join("-", parts.Take(parts.Length - 1))}.pdf";
 113        }
 2114    }
 115
 116    public static Dictionary<string, List<Order>> GroupStudioLocalSplitSiblings(IEnumerable<Order> orders) =>
 2117        orders
 5118            .Where(o => IsStudioLocalSplitPosting(o.ShipmentNumber))
 3119            .GroupBy(o => GetOzonApiPostingNumber(o.ShipmentNumber))
 2120            .Where(g => g.Count() > 1)
 4121            .ToDictionary(g => g.Key, g => g.ToList(), StringComparer.Ordinal);
 122}