< Summary

Information
Class: OzonOrdersWeb.WebServices.SystemAlerts.SystemAlertsOptions
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/SystemAlerts/SystemAlertsOptions.cs
Line coverage
98%
Covered lines: 89
Uncovered lines: 1
Coverable lines: 90
Total lines: 180
Line coverage: 98.8%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_AnalysisWindowHours()100%11100%
get_SourceWindowHours()100%11100%
.ctor()100%11100%
get_RecordMaxAgeDays()100%11100%
get_DangerFreshnessHours()100%11100%
WindowHoursFor(...)100%44100%
get_DangerFailureCount()100%11100%
get_SuccessMaxAgeMinutes()100%11100%
get_PendingWebhookMaxAgeMinutes()100%11100%
get_MaxPendingWebhooks()100%11100%
get_RunningJobMaxAgeMinutes()100%11100%
get_MaxStuckJobs()100%11100%
get_MaxOverdueOrderControlTasks()100%11100%
get_OzonNewOrdersMaxAgeHours()100%11100%
get_OzonNewOrdersDangerAgeHours()100%11100%
get_ConfirmationChecks()100%11100%
get_MaxMuteHours()100%11100%
get_ConfirmationMinGapSeconds()100%11100%
get_ManualRefreshMinIntervalSeconds()100%11100%
get_CountsCacheSeconds()100%11100%
get_SupplierChecksEnabled()100%11100%
get_SupplierOrderMaxAgeDays()100%11100%
get_SupplierAutoCancelEnabled()100%11100%
get_SupplierAutoCancelProviders()100%11100%
get_SupplierCancelMentions()100%11100%
get_SupplierCartStaleHours()100%11100%
get_SupplierDeliveryGraceHours()100%11100%
get_SupplierStatusStaleDays()100%11100%
get_SupplierRejectedDangerCount()100%11100%
get_SupplierBlindDangerCount()100%11100%
get_OzonDeliveredStatusKeywords()100%11100%
get_OzonCancelledStatusKeywords()100%11100%
get_SupplierRejectedKeywords()100%11100%
get_SupplierRejectedExcludeKeywords()100%11100%
get_SupplierDeliveredKeywords()100%11100%
get_SupplierRejectedStatusCodes()100%11100%
get_SupplierDeliveredStatusCodes()100%11100%
get_OrderChecksEnabled()100%11100%
get_OrderProblemWindowHours()100%11100%
get_SlaWarningHours()100%11100%
get_SlaDangerHours()100%11100%
get_SlaOverdueMaxHours()100%11100%
get_SlaUnhandledAppStatusNames()100%11100%
get_CancelSpikeMinCount()100%11100%
get_CancelSpikeFactor()100%11100%
get_NullResetDangerCount()100%11100%
get_PostedCostLostDangerCount()100%11100%
get_PostedLossMinCount()100%11100%
get_StockChecksEnabled()100%11100%
get_BitrixAutoScheduleOverdueMinutes()100%11100%
get_PushZeroingMinItems()100%11100%
get_PushZeroingSharePercent()100%11100%
get_WarehouseStockStaleHours()100%11100%
get_OneCProbeEnabled()100%11100%
get_OneCProbeIntervalMinutes()100%11100%
get_OneCProbeSlowMs()100%11100%
get_OneCProbeTimeoutSeconds()100%11100%
get_HangfireChecksEnabled()100%11100%
get_HangfireRecurringOverdueMinutes()100%11100%
get_DiskChecksEnabled()100%11100%
get_DiskFreePercentWarning()100%11100%
get_DiskFreePercentDanger()100%11100%
get_DiskFreeGbDanger()100%11100%
get_ElasticsearchChecksEnabled()100%11100%
get_ElasticsearchTimeoutSeconds()100%11100%
get_ElasticsearchDiskFreePercentWarning()100%11100%
get_ElasticsearchDiskFreePercentDanger()100%11100%
get_ElasticsearchYellowIsWarning()100%210%
get_OrderSearchDriftDangerMultiplier()100%11100%
get_OrderSearchDriftCheckStaleHours()100%11100%
get_DatabaseChecksEnabled()100%11100%
get_DatabaseLatencyWarningMs()100%11100%
get_DatabaseLatencyDangerMs()100%11100%
get_DatabaseConnectionsWarningPercent()100%11100%
get_DatabaseConnectionsDangerPercent()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/SystemAlerts/SystemAlertsOptions.cs

#LineLine coverage
 1namespace OzonOrdersWeb.WebServices.SystemAlerts;
 2
 3public sealed class SystemAlertsOptions
 4{
 5    public const string SectionName = "SystemAlerts";
 3236    public int AnalysisWindowHours { get; set; } = 24;
 7
 8    /// <summary>Окно актуальности по ключу алерта (например <c>onec-posting</c>), часы; без записи берётся <see cref="A
 2459    public Dictionary<string, int> SourceWindowHours { get; set; } =
 10610        new(StringComparer.OrdinalIgnoreCase)
 10611        {
 10612            ["ozon-cancelled-supplier-live"] = 72,
 10613            ["orders-null-reset"] = 1,
 10614            ["posted-cost-lost"] = 24
 10615        };
 16
 17    /// <summary>Записи без верхней границы окна (зависшие Running/Received, просрочки) старше этого срока не считаются.
 12018    public int RecordMaxAgeDays { get; set; } = 3;
 19
 20    /// <summary>Если самая свежая ошибка старше этого срока, критичность журнального алерта снижается до предупреждения
 11021    public int DangerFreshnessHours { get; set; } = 6;
 22
 23    public int WindowHoursFor(string key) =>
 24424        Math.Max(1, SourceWindowHours.TryGetValue(key, out var hours) && hours > 0 ? hours : AnalysisWindowHours);
 13625    public int DangerFailureCount { get; set; } = 2;
 12626    public int SuccessMaxAgeMinutes { get; set; } = 120;
 12027    public int PendingWebhookMaxAgeMinutes { get; set; } = 15;
 12028    public int MaxPendingWebhooks { get; set; } = 1;
 13429    public int RunningJobMaxAgeMinutes { get; set; } = 120;
 12030    public int MaxStuckJobs { get; set; } = 1;
 12031    public int MaxOverdueOrderControlTasks { get; set; } = 1;
 10832    public int OzonNewOrdersMaxAgeHours { get; set; } = 24;
 10833    public int OzonNewOrdersDangerAgeHours { get; set; } = 48;
 34
 35    /// <summary>Сколько проверок подряд должна наблюдаться проблема, прежде чем «состоянческий» алерт откроется.</summa
 15536    public int ConfirmationChecks { get; set; } = 2;
 10937    public int MaxMuteHours { get; set; } = 168;
 38
 39    /// <summary>Минимальный интервал между проверками, учитываемыми для debounce: ручные обновления не «подтверждают» а
 12140    public int ConfirmationMinGapSeconds { get; set; } = 120;
 41
 42    /// <summary>Не чаще одного ручного пересчёта алертов (кнопка обновления на вкладке) за этот интервал.</summary>
 10643    public int ManualRefreshMinIntervalSeconds { get; set; } = 20;
 44
 45    /// <summary>Кэш счётчиков для чипов в шапке страниц.</summary>
 10846    public int CountsCacheSeconds { get; set; } = 15;
 47
 48    // ---------- Заказы у поставщиков ----------
 49
 13250    public bool SupplierChecksEnabled { get; set; } = true;
 51
 52    /// <summary>Заказы старше этого срока не анализируются: у поставщиков они давно закрыты, их «просрочка» — шум.</sum
 12653    public int SupplierOrderMaxAgeDays { get; set; } = 14;
 54
 55    /// <summary>
 56    /// Автоотмена у поставщика заказов из алерта <c>ozon-cancelled-supplier-live</c>. При false заказы только
 57    /// уходят в Telegram (тема General) с подсказкой, что отменить вручную.
 58    /// </summary>
 11059    public bool SupplierAutoCancelEnabled { get; set; } = true;
 60
 61    /// <summary>Провайдеры, у которых API умеет отмену и она подключена; остальным — «отменить вручную».</summary>
 462    public string[] SupplierAutoCancelProviders { get; set; } =
 10663    [
 10664        "ZZapMoscow", "ForumAuto", "ForumAutoInterparts", "ForumAutoPiter", "ForumAutoRostov", "ForumAutoIstra", "Armtek
 10665    ];
 66
 67    /// <summary>Кого упоминать в сообщении об отменённых в Ozon заказах (<c>@username</c>). Bot API не умеет «упомянуть
 11168    public string[] SupplierCancelMentions { get; set; } = ["@Burn1ngSnow"];
 69
 70    /// <summary>Позиция лежит в корзине поставщика и не оформлена дольше этого срока (часы).</summary>
 12771    public int SupplierCartStaleHours { get; set; } = 12;
 72
 73    /// <summary>Допуск после ожидаемой даты поставки, прежде чем считать заказ просроченным (часы).</summary>
 12674    public int SupplierDeliveryGraceHours { get; set; } = 24;
 75
 76    /// <summary>Статус открытого заказа у поставщика не менялся дольше этого срока (дни).</summary>
 12777    public int SupplierStatusStaleDays { get; set; } = 5;
 78
 79    /// <summary>Сколько отказов одного поставщика за окно считаются критичными.</summary>
 11280    public int SupplierRejectedDangerCount { get; set; } = 3;
 81
 82    /// <summary>Сколько строк без статуса у одного поставщика считаются критичными («слепая зона»).</summary>
 10983    public int SupplierBlindDangerCount { get; set; } = 5;
 84
 85    /// <summary>
 86    /// Основы слов в названии статуса Ozon: заказ уже доставлен. Основы без первой буквы, чтобы совпадать
 87    /// независимо от регистра («Доставлен», «доставлен», «Получен», «Заказ выполнен»).
 88    /// </summary>
 25289    public string[] OzonDeliveredStatusKeywords { get; set; } = ["оставлен", "олучен", "ыполнен"];
 90
 91    /// <summary>Основы слов в названии статуса Ozon: заказ отменён («Отменён», «Отменен при доставке»...).</summary>
 22692    public string[] OzonCancelledStatusKeywords { get; set; } = ["тмен"];
 93
 94    /// <summary>Признаки отказа в названии или коде статуса поставщика (без учёта регистра).</summary>
 3995    public string[] SupplierRejectedKeywords { get; set; } =
 10696    [
 10697        "отказ", "отклон", "нет в наличии", "аннулир", "отмен", "не выполнен", "снят с резерва", "обнулен",
 10698        "не зарезервирован", "не соответствует", "заблокирован", "что-то не так"
 10699    ];
 100
 101    /// <summary>Исключения из <see cref="SupplierRejectedKeywords"/>: отмена с нашей стороны отказом поставщика не явля
 123102    public string[] SupplierRejectedExcludeKeywords { get; set; } = ["покупателем"];
 103
 104    /// <summary>Признаки выполненного заказа: такие статусы не считаются просроченными и «зависшими».</summary>
 23105    public string[] SupplierDeliveredKeywords { get; set; } =
 106106        ["закрыт", "выдан", "отгружен", "получен", "выполнен", "выкуплен", "доставлен", "архив"];
 107
 108    /// <summary>Коды статусов-отказов по провайдеру там, где у статуса нет понятного названия («Код 6»).</summary>
 42109    public Dictionary<string, string[]> SupplierRejectedStatusCodes { get; set; } =
 106110        new(StringComparer.OrdinalIgnoreCase) { ["MlAuto"] = ["6"], ["MlAutoRu"] = ["6"] };
 111
 112    /// <summary>Коды статусов «отгружен/выдан» по провайдеру.</summary>
 41113    public Dictionary<string, string[]> SupplierDeliveredStatusCodes { get; set; } =
 106114        new(StringComparer.OrdinalIgnoreCase) { ["MlAuto"] = ["14"], ["MlAutoRu"] = ["14"] };
 115
 116    // ---------- Ozon и заказы ----------
 117
 116118    public bool OrderChecksEnabled { get; set; } = true;
 119
 120    /// <summary>Окно актуальности ошибок 1С и транзакций по заказу для значка в сетках (часы).</summary>
 111121    public int OrderProblemWindowHours { get; set; } = 72;
 122
 123    /// <summary>Отправление без обработки: предупреждение за столько часов до дедлайна отгрузки.</summary>
 118124    public int SlaWarningHours { get; set; } = 12;
 125
 126    /// <summary>Критично, если до дедлайна отгрузки осталось меньше этого срока или он уже прошёл.</summary>
 110127    public int SlaDangerHours { get; set; } = 3;
 128
 129    /// <summary>Просрочку старше этого срока не показываем: отправление давно решено вручную.</summary>
 116130    public int SlaOverdueMaxHours { get; set; } = 48;
 131
 132    /// <summary>Названия статусов заказа в приложении, означающие «ещё не обработан».</summary>
 116133    public string[] SlaUnhandledAppStatusNames { get; set; } = ["Не указан"];
 134
 116135    public int CancelSpikeMinCount { get; set; } = 10;
 108136    public int CancelSpikeFactor { get; set; } = 3;
 137
 138    /// <summary>Сколько сбросов ключевых полей заказа в NULL за окно считаются критичными.</summary>
 107139    public int NullResetDangerCount { get; set; } = 3;
 140
 141    /// <summary>Сколько проведённых заказов без расчёта себестоимости считаются критичными.</summary>
 108142    public int PostedCostLostDangerCount { get; set; } = 3;
 143
 144    /// <summary>Сколько убыточных проведённых заказов за окно стоит показать.</summary>
 116145    public int PostedLossMinCount { get; set; } = 3;
 146
 147    // ---------- Остатки и 1С ----------
 148
 114149    public bool StockChecksEnabled { get; set; } = true;
 114150    public int BitrixAutoScheduleOverdueMinutes { get; set; } = 30;
 114151    public int PushZeroingMinItems { get; set; } = 50;
 108152    public int PushZeroingSharePercent { get; set; } = 60;
 108153    public int WarehouseStockStaleHours { get; set; } = 3;
 114154    public bool OneCProbeEnabled { get; set; } = true;
 108155    public int OneCProbeIntervalMinutes { get; set; } = 10;
 108156    public int OneCProbeSlowMs { get; set; } = 5000;
 108157    public int OneCProbeTimeoutSeconds { get; set; } = 20;
 158
 106159    public bool HangfireChecksEnabled { get; set; } = true;
 106160    public int HangfireRecurringOverdueMinutes { get; set; } = 10;
 161
 106162    public bool DiskChecksEnabled { get; set; } = true;
 108163    public int DiskFreePercentWarning { get; set; } = 15;
 110164    public int DiskFreePercentDanger { get; set; } = 7;
 108165    public int DiskFreeGbDanger { get; set; } = 5;
 166
 106167    public bool ElasticsearchChecksEnabled { get; set; } = true;
 106168    public int ElasticsearchTimeoutSeconds { get; set; } = 5;
 106169    public int ElasticsearchDiskFreePercentWarning { get; set; } = 15;
 106170    public int ElasticsearchDiskFreePercentDanger { get; set; } = 10;
 0171    public bool ElasticsearchYellowIsWarning { get; set; }
 106172    public int OrderSearchDriftDangerMultiplier { get; set; } = 5;
 106173    public int OrderSearchDriftCheckStaleHours { get; set; } = 6;
 174
 106175    public bool DatabaseChecksEnabled { get; set; } = true;
 106176    public int DatabaseLatencyWarningMs { get; set; } = 500;
 106177    public int DatabaseLatencyDangerMs { get; set; } = 2000;
 106178    public int DatabaseConnectionsWarningPercent { get; set; } = 80;
 106179    public int DatabaseConnectionsDangerPercent { get; set; } = 95;
 180}

Methods/Properties

get_AnalysisWindowHours()
get_SourceWindowHours()
.ctor()
get_RecordMaxAgeDays()
get_DangerFreshnessHours()
WindowHoursFor(System.String)
get_DangerFailureCount()
get_SuccessMaxAgeMinutes()
get_PendingWebhookMaxAgeMinutes()
get_MaxPendingWebhooks()
get_RunningJobMaxAgeMinutes()
get_MaxStuckJobs()
get_MaxOverdueOrderControlTasks()
get_OzonNewOrdersMaxAgeHours()
get_OzonNewOrdersDangerAgeHours()
get_ConfirmationChecks()
get_MaxMuteHours()
get_ConfirmationMinGapSeconds()
get_ManualRefreshMinIntervalSeconds()
get_CountsCacheSeconds()
get_SupplierChecksEnabled()
get_SupplierOrderMaxAgeDays()
get_SupplierAutoCancelEnabled()
get_SupplierAutoCancelProviders()
get_SupplierCancelMentions()
get_SupplierCartStaleHours()
get_SupplierDeliveryGraceHours()
get_SupplierStatusStaleDays()
get_SupplierRejectedDangerCount()
get_SupplierBlindDangerCount()
get_OzonDeliveredStatusKeywords()
get_OzonCancelledStatusKeywords()
get_SupplierRejectedKeywords()
get_SupplierRejectedExcludeKeywords()
get_SupplierDeliveredKeywords()
get_SupplierRejectedStatusCodes()
get_SupplierDeliveredStatusCodes()
get_OrderChecksEnabled()
get_OrderProblemWindowHours()
get_SlaWarningHours()
get_SlaDangerHours()
get_SlaOverdueMaxHours()
get_SlaUnhandledAppStatusNames()
get_CancelSpikeMinCount()
get_CancelSpikeFactor()
get_NullResetDangerCount()
get_PostedCostLostDangerCount()
get_PostedLossMinCount()
get_StockChecksEnabled()
get_BitrixAutoScheduleOverdueMinutes()
get_PushZeroingMinItems()
get_PushZeroingSharePercent()
get_WarehouseStockStaleHours()
get_OneCProbeEnabled()
get_OneCProbeIntervalMinutes()
get_OneCProbeSlowMs()
get_OneCProbeTimeoutSeconds()
get_HangfireChecksEnabled()
get_HangfireRecurringOverdueMinutes()
get_DiskChecksEnabled()
get_DiskFreePercentWarning()
get_DiskFreePercentDanger()
get_DiskFreeGbDanger()
get_ElasticsearchChecksEnabled()
get_ElasticsearchTimeoutSeconds()
get_ElasticsearchDiskFreePercentWarning()
get_ElasticsearchDiskFreePercentDanger()
get_ElasticsearchYellowIsWarning()
get_OrderSearchDriftDangerMultiplier()
get_OrderSearchDriftCheckStaleHours()
get_DatabaseChecksEnabled()
get_DatabaseLatencyWarningMs()
get_DatabaseLatencyDangerMs()
get_DatabaseConnectionsWarningPercent()
get_DatabaseConnectionsDangerPercent()