< Summary

Information
Class: Services.BackgroundJobsServices.ReportDeliveryDateFilter
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BackgroundJobsServices/ReportDeliveryDateFilter.cs
Line coverage
96%
Covered lines: 29
Uncovered lines: 1
Coverable lines: 30
Total lines: 82
Line coverage: 96.6%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor(...)100%11100%
get_TargetDay()100%11100%
get_DownloadFrom()100%11100%
get_DownloadTo()100%11100%
get_FilterDateKeys()100%11100%
BuildTransactionJobPeriods(...)100%11100%
BuildSingleTargetDayPeriod(...)50%22100%
BuildDateKeysForPeriod(...)100%44100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/BackgroundJobsServices/ReportDeliveryDateFilter.cs

#LineLine coverage
 1using System.Globalization;
 2
 3namespace Services.BackgroundJobsServices;
 4
 5/// <summary>
 6/// Фильтр дат в CSV/XLSX отчётах Ozon для фоновых TransactionJobs.
 7/// API Ozon отбирает по «Принят в обработку» (ProcessedAt), строки файла — по столбцу даты доставки/статуса за вчера (M
 8/// </summary>
 9public static class ReportDeliveryDateFilter
 10{
 11    /// <summary>Единственное допустимое значение daysBack: вчера по MSK.</summary>
 12    public const int TransactionJobDaysBack = 1;
 13
 14    /// <summary>Сколько дней назад запрашивать отчёт у Ozon API (широкий период, как при ручной загрузке за месяц).</su
 15    public const int TransactionJobReportDownloadDays = 30;
 16
 017    internal static readonly TimeZoneInfo MoscowTimeZone = RussianTimeZoneHelper.Zone;
 18
 19    public const string DeliveryDateColumnName = "Фактическая дата передачи в доставку";
 20    public const string ReturnsStatusDateColumnName = "Дата статуса";
 21
 22    /// <summary>Период загрузки отчёта и ключи фильтрации строк CSV.</summary>
 123    public sealed record TransactionJobReportPeriods(
 124        DateTime TargetDay,
 125        DateTime DownloadFrom,
 126        DateTime DownloadTo,
 227        IReadOnlyList<string> FilterDateKeys);
 28
 29    /// <summary>
 30    /// Вчера (MSK): узкий отбор строк в файле; широкий запрос к API за последние <see cref="TransactionJobReportDownloa
 31    /// </summary>
 32    public static TransactionJobReportPeriods BuildTransactionJobPeriods(
 33        DateTime nowUtc,
 34        TimeZoneInfo timeZone,
 35        int daysBack)
 36    {
 137        var (_, _, filterDateKeys) = BuildSingleTargetDayPeriod(nowUtc, timeZone, daysBack);
 138        var targetDay = DateTime.ParseExact(
 139            filterDateKeys[0],
 140            "yyyy-MM-dd",
 141            CultureInfo.InvariantCulture);
 42
 143        var nowLocal = TimeZoneInfo.ConvertTimeFromUtc(nowUtc, timeZone);
 144        var downloadFrom = targetDay.AddDays(-TransactionJobReportDownloadDays);
 45        // До конца текущих суток MSK — чтобы в выгрузку попали заказы, принятые раньше, но с доставкой «вчера».
 146        var downloadTo = nowLocal.Date.AddDays(1).AddTicks(-1);
 47
 148        return new TransactionJobReportPeriods(targetDay, downloadFrom, downloadTo, filterDateKeys);
 49    }
 50
 51    /// <summary>
 52    /// Один целевой день MSK: границы суток и dateKeys для фильтра строк файла.
 53    /// daysBack=1 при запуске 27.05 → 26.05.
 54    /// </summary>
 55    public static (DateTime periodFrom, DateTime periodTo, IReadOnlyList<string> dateKeys) BuildSingleTargetDayPeriod(
 56        DateTime nowUtc,
 57        TimeZoneInfo timeZone,
 58        int daysBack)
 59    {
 360        var nowLocal = TimeZoneInfo.ConvertTimeFromUtc(nowUtc, timeZone);
 361        var offset = daysBack < 1 ? 1 : daysBack;
 362        var targetDay = nowLocal.Date.AddDays(-offset);
 363        var periodFrom = targetDay;
 364        var periodTo = targetDay.AddDays(1).AddTicks(-1);
 365        var dateKeys = new[] { targetDay.ToString("yyyy-MM-dd") };
 366        return (periodFrom, periodTo, dateKeys);
 67    }
 68
 69    public static IReadOnlyList<string> BuildDateKeysForPeriod(DateTime periodFrom, DateTime periodTo)
 70    {
 271        var fromDate = periodFrom.Date;
 272        var toDate = periodTo.Date;
 273        if (fromDate > toDate)
 174            (fromDate, toDate) = (toDate, fromDate);
 75
 276        var keys = new List<string>();
 1677        for (var d = fromDate; d <= toDate; d = d.AddDays(1))
 678            keys.Add(d.ToString("yyyy-MM-dd"));
 79
 280        return keys;
 81    }
 82}