Расширение reminders (#19)
Tests / frontend-test (push) Successful in 46s
Tests / backend-test (push) Successful in 2m22s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/19
This commit was merged in pull request #19.
This commit is contained in:
2026-08-27 11:43:45 +00:00
parent 19a46b0df8
commit 95d460c80a
23 changed files with 1113 additions and 110 deletions
@@ -1,27 +1,32 @@
using System.Text.Json.Serialization;
namespace Tnsu.ApprovalRoute.Application.Reminders;
/// <param name="Email">Согласующий/исполнитель из строки списка — кому напоминать.</param>
/// <param name="HoursOverdue">
/// На сколько часов просрочен шаг: сейчас минус (активация шага + SLA).
/// Выходные не учитываются — считаются календарные часы.
/// <param name="ReceiverEmail">Email того, кому адресовано напоминание.</param>
/// <param name="ReceiverName">
/// ФИО получателя, если оно известно. Не всегда доступно (например, у согласующего
/// в старой строке списка без заполненного Title персонального поля) — тогда null.
/// </param>
/// <param name="Url">Ссылка на заявку, требующую решения.</param>
/// <param name="AskOverdueReason">
/// Спрашивать ли у пользователя причину просрочки. Значение уже с применённым
/// наследованием (шаг перекрывает тип заявки).
/// <param name="Url">
/// Ссылка на заявку. Собирается здесь, в сервисе (а не на стороне потребителя),
/// потому что не константна: requestId и партиция списка (server-relative url,
/// параметр rplist) у каждой заявки свои, и сервис их всё равно уже знает —
/// дублировать эту логику снаружи незачем.
/// </param>
/// <param name="Status">Статус просроченного шага (ApprovalStatus строки списка «… — согласование»).</param>
/// <param name="RequestUniqueCode">
/// Уникальный код заявки (колонка RequestUniqueCode списка данных) — null, если у
/// заявки его нет или строка данных не найдена.
/// </param>
public sealed record ReminderDto(
string Email,
int HoursOverdue,
string Url,
bool AskOverdueReason,
int RequestTypeId,
string RequestTypeName,
int RequestId,
string Status,
string? RequestUniqueCode);
/// <remarks>
/// Общая часть двух видов напоминаний — <see cref="ApprovalOverdueReminderDto"/> и
/// <see cref="ProbationEndingReminderDto"/>. Категории заявки (RequestTypeId,
/// RequestId и т.п.) здесь нет: она нужна только просроченным шагам согласования
/// (Power Automate ссылается на неё, работая со списком согласования конкретного
/// типа заявки) и объявлена прямо в ApprovalOverdueReminderDto.
///
/// [JsonPolymorphic]/[JsonDerivedType] нужны, потому что ReminderService отдаёт
/// список именно базового типа (IReadOnlyList&lt;ReminderDto&gt;) — без этих
/// атрибутов System.Text.Json сериализовал бы только то, что объявлено здесь,
/// теряя специфичные для наследника поля. Дискриминатор — системное поле "$type"
/// со значением "ApprovalOverdue"/"ProbationEnding".
/// </remarks>
[JsonPolymorphic]
[JsonDerivedType(typeof(ApprovalOverdueReminderDto), "ApprovalOverdue")]
[JsonDerivedType(typeof(ProbationEndingReminderDto), "ProbationEnding")]
public abstract record ReminderDto(string ReceiverEmail, string? ReceiverName, string Url);