| | | 1 | | namespace Services.ApiServices.TelegramBotApi; |
| | | 2 | | |
| | | 3 | | public enum TelegramSeverity |
| | | 4 | | { |
| | | 5 | | Info, |
| | | 6 | | Success, |
| | | 7 | | Warning, |
| | | 8 | | Error, |
| | | 9 | | Critical |
| | | 10 | | } |
| | | 11 | | |
| | | 12 | | /// <summary>Готовое к отправке сообщение (HTML parse mode). Создаётся через <see cref="TelegramMessageFactory"/>.</summ |
| | | 13 | | /// <param name="Html">Текст в HTML-разметке Telegram (не длиннее <see cref="TelegramMessageBuilder.MaxLength"/>).</para |
| | | 14 | | /// <param name="ChatId">Чат; null — <see cref="TelegramBotConfig.DefaultChatId"/>.</param> |
| | | 15 | | /// <param name="Channel">Категория: определяет чаты/темы по настройкам <see cref="TelegramBotConfig.Routes"/>.</param> |
| | | 16 | | /// <param name="Critical">Критичное: дополнительно уходит в <see cref="TelegramBotConfig.CriticalRoutes"/> (личка админ |
| | | 17 | | /// <param name="ImageUrl">Если задан, уходит фото с подписью (подпись Telegram ограничивает 1024 символами).</param> |
| | 79 | 18 | | public sealed record TelegramMessage( |
| | 137 | 19 | | string Html, |
| | 11 | 20 | | long? ChatId = null, |
| | 29 | 21 | | bool Silent = false, |
| | 29 | 22 | | string? ImageUrl = null, |
| | 17 | 23 | | TelegramChannel Channel = TelegramChannel.Default, |
| | 92 | 24 | | bool Critical = false); |
| | | 25 | | |
| | | 26 | | /// <summary>Один пункт сводки алертов.</summary> |
| | | 27 | | /// <param name="Domain">Подпись раздела (Ozon, 1С, Hangfire…).</param> |
| | | 28 | | /// <param name="Url">Относительная (/Studio2/…) или абсолютная ссылка; относительная требует <c>SiteBaseUrl</c>.</param |
| | | 29 | | /// <param name="OrderCount">Сколько заказов затронуто; 0 — не показывать.</param> |
| | | 30 | | public sealed record TelegramAlertItem( |
| | | 31 | | TelegramSeverity Severity, |
| | | 32 | | string Domain, |
| | | 33 | | string Title, |
| | | 34 | | IReadOnlyList<string> Lines, |
| | | 35 | | string? Url = null, |
| | | 36 | | int OrderCount = 0, |
| | | 37 | | bool Resolved = false); |
| | | 38 | | |
| | | 39 | | /// <summary>Новый заказ для сводки о поступлении.</summary> |
| | | 40 | | /// <param name="Key">Ключ товара вида «артикул=код производителя» (2212018LUE=DEP).</param> |
| | | 41 | | /// <param name="ImageUrl">Картинка товара из карточки; если задана, заказ уходит отдельным сообщением-фото.</param> |
| | | 42 | | public sealed record TelegramNewOrderItem(string ShipmentNumber, string? Client, string? Warehouse, string? Key, string? |
| | | 43 | | string? ImageUrl = null); |
| | | 44 | | |
| | | 45 | | /// <summary>Результат наката остатков по складу 1С (только применённое в Ozon).</summary> |
| | | 46 | | public sealed record TelegramRolloutStoreRow(string Store, int Added, int Decreased, int Cleared, int Failed); |
| | | 47 | | |
| | | 48 | | /// <summary>Активные остатки склада 1С: позиций с остатком > 0 и сумма штук.</summary> |
| | | 49 | | public sealed record TelegramStoreStockRow(string Store, int Positions, decimal Units); |
| | | 50 | | |
| | | 51 | | /// <summary>Остатки на складе Ozon: позиций с остатком > 0 и сумма штук (по данным отчёта наката, т.е. из Ozon API). |
| | | 52 | | public sealed record TelegramOzonStockRow(string Warehouse, int Positions, decimal Units, string? Client = null); |
| | | 53 | | |
| | | 54 | | /// <summary>Сводка наката остатков Bitrix → Ozon для сообщения в Telegram.</summary> |
| | | 55 | | public sealed record TelegramRolloutSummary( |
| | | 56 | | string ReportId, |
| | | 57 | | string Client, |
| | | 58 | | DateTime FinishedAtUtc, |
| | | 59 | | int ProductsInReport, |
| | | 60 | | IReadOnlyList<TelegramRolloutStoreRow> Stores, |
| | | 61 | | int CleanupSuccess, |
| | | 62 | | int CleanupFailed, |
| | | 63 | | int PricePushed, |
| | | 64 | | int PriceUnchanged, |
| | | 65 | | int PriceFailed, |
| | | 66 | | int OrphansFound, |
| | | 67 | | int OrphansZeroed, |
| | | 68 | | IReadOnlyList<TelegramStoreStockRow> Stock, |
| | | 69 | | DateTime? StockAsOfUtc, |
| | | 70 | | IReadOnlyList<TelegramOzonStockRow>? OzonStock = null) |
| | | 71 | | { |
| | | 72 | | public int TotalFailed => Stores.Sum(x => x.Failed) + CleanupFailed + PriceFailed + Math.Max(0, OrphansFound - Orpha |
| | | 73 | | public bool HasErrors => TotalFailed > 0; |
| | | 74 | | } |