< Summary

Information
Class: Services.ParserServices.DropboxOrderFolderNaming
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ParserServices/DropboxOrderFolderNaming.cs
Line coverage
58%
Covered lines: 17
Uncovered lines: 12
Coverable lines: 29
Total lines: 75
Line coverage: 58.6%
Branch coverage
60%
Covered branches: 12
Total branches: 20
Branch coverage: 60%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ParseFolderNameAndAdjustDate(...)60%482058.62%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ParserServices/DropboxOrderFolderNaming.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace Services.ParserServices;
 4
 5/// <summary>
 6/// Разбор имени папки заказов (вида "Exist Союз", "Эмекс +28 KBIC") на маппинг/дату/доставку.
 7/// Логика перенесена без изменений из JobController.ParseFileFieldAndAdjustDate (Dropbox-джоб FileUpload) —
 8/// используется и штатным джобом, и прямым импортом заказов из письма (Services.EmailRoutingServices.OrderEmailImportSe
 9/// </summary>
 10public static class DropboxOrderFolderNaming
 11{
 12    public static (string Name, DateTime Date, string Delivery) ParseFolderNameAndAdjustDate(string folder,
 13        DateTime initialDate)
 14    {
 1415        if (string.IsNullOrWhiteSpace(folder))
 016            return (folder, initialDate, string.Empty);
 17
 18        // 1️⃣ Проверяем наличие шаблона с числом (+/-N) в ЛЮБОМ месте строки
 1419        var match = Regex.Match(folder, @"^(.*?)\s*([+-]\d+)\s*(.*)$");
 20
 1421        if (match.Success)
 22        {
 523            string name = match.Groups[1].Value.Trim(); // Название (до числа)
 524            string offsetStr = match.Groups[2].Value.Trim(); // Смещение (+6 / -3 / +30)
 525            string delivery = match.Groups[3].Value.Trim(); // Направление (после числа)
 26
 527            if (int.TryParse(offsetStr, out int days))
 28            {
 529                DateTime adjustedDate = initialDate.AddDays(days);
 30
 31                // Если название пустое, но есть доставка - возможно число было в начале
 532                if (string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(delivery))
 33                {
 34                    // Пробуем разделить доставку на имя и остаток
 035                    var deliveryMatch = Regex.Match(delivery, @"^(\S+)\s*(.*)$");
 036                    if (deliveryMatch.Success)
 37                    {
 038                        name = deliveryMatch.Groups[1].Value.Trim();
 039                        delivery = deliveryMatch.Groups[2].Value.Trim();
 40                    }
 41                }
 42
 543                return (name, adjustedDate, delivery);
 44            }
 45        }
 46
 47        // 2️⃣ Если нет числа с плюсом/минусом, но есть просто число (например "Автопитер 30")
 948        var numberMatch = Regex.Match(folder, @"^(.*?)\s+(\d+)\s*(.*)$");
 949        if (numberMatch.Success)
 50        {
 051            string name = numberMatch.Groups[1].Value.Trim();
 052            string numberStr = numberMatch.Groups[2].Value.Trim();
 053            string delivery = numberMatch.Groups[3].Value.Trim();
 54
 55            // Если число выглядит как возможное смещение (маленькое число)
 056            if (int.TryParse(numberStr, out int days) && days <= 365) // разумный предел
 57            {
 058                DateTime adjustedDate = initialDate.AddDays(days);
 059                return (name, adjustedDate, delivery);
 60            }
 61        }
 62
 63        // 3️⃣ Разделяем на имя и доставку (первое слово = имя, остальное = доставка)
 964        var textMatch = Regex.Match(folder, @"^(\S+)\s*(.*)$");
 965        if (textMatch.Success)
 66        {
 967            string name = textMatch.Groups[1].Value.Trim();
 968            string delivery = textMatch.Groups[2].Value.Trim();
 969            return (name, initialDate, delivery);
 70        }
 71
 72        // 4️⃣ В остальных случаях — просто вернуть как есть
 073        return (folder.Trim(), initialDate, string.Empty);
 74    }
 75}