31a0a8e9e3
Напоминания: - ProbationEndingReminderDto: ManagerEmail убран — это был унаследованный ReceiverEmail под вторым именем. - Ссылка для ProbationEnding больше не ведёт на саму заявку на приём (она уже закрыта, решать по ней нечего) — берётся из новой настройки RemindersOptions.ProbationReminderUrl и ведёт в раздел, где заводят новую заявку. Подстановок в ней нет: адрес конкретной формы в портал не передать, rptype без rpid/rpsource игнорируется (см. parseRoute в request-portal). Заодно ушли BuildProbationUrl и ненужные больше параметры type/listId. Стайлгайд (CLAUDE.md) — у enum первое значение None: - ReminderFeed: None=0 трактуется как ApprovalOverdue, чтобы вызов без явного выбора работал как раньше. - EmploymentStatus: заодно инвертирован switch в ReminderService — раньше «продолжить» было веткой по умолчанию, и новый None молча означал бы «сотрудник работает». Теперь по умолчанию пропуск с предупреждением. - ConditionsLogic: None — НЕвалидное значение, отвергается валидаторами шага (в том числе новым PatchTemplateRouteStepRequestValidator, его не было вовсе). Поэтому у ConditionsLogic в Create/Update-запросах убрано значение по умолчанию: System.Text.Json в .NET 10 уважает дефолты параметров конструктора, и пропущенное поле молча означало «И». Теперь пропущенное поле даёт None и упирается в валидатор. ЛОМАЮЩЕЕ ИЗМЕНЕНИЕ КОНТРАКТА: клиент, не присылающий conditionsLogic в POST/PUT шага, получит 400 вместо прежнего молчаливого «И». Админка не затронута — она это поле всегда отправляет.
72 lines
2.8 KiB
C#
72 lines
2.8 KiB
C#
using Tnsu.ApprovalRoute.Domain.Enums;
|
||
|
||
namespace Tnsu.ApprovalRoute.Application.TemplateRouteSteps;
|
||
|
||
// SlaHours/AskOverdueReason у шага перекрывают одноимённые поля типа заявки.
|
||
// null — «не задано, наследовать», поэтому оба поля nullable и необязательны
|
||
// (0 часов и false — это осознанный выбор, а не «пусто»). Добавлены в конец
|
||
// записей, чтобы не ломать существующие позиционные вызовы.
|
||
|
||
/// <summary>Одно условие появления шага — см. Domain.Entities.TemplateRouteStepCondition.</summary>
|
||
public sealed record RouteStepConditionDto(string FieldName, ComparisonOperator Operation, string Value);
|
||
|
||
public sealed record TemplateRouteStepDto(
|
||
int Id,
|
||
int OrderNo,
|
||
string? ExecutorEmail,
|
||
string? Position,
|
||
ProjectRole? ProjectRole,
|
||
HeadType? HeadType,
|
||
RouteStepStatus Status,
|
||
int RouteId,
|
||
bool AllowReassignToOtherApprovers,
|
||
IReadOnlyList<RouteStepConditionDto> Conditions,
|
||
ConditionsLogic ConditionsLogic,
|
||
string? Warning = null,
|
||
int? SlaHours = null,
|
||
bool? AskOverdueReason = null);
|
||
|
||
public sealed record CreateTemplateRouteStepRequest(
|
||
int OrderNo,
|
||
string? ExecutorEmail,
|
||
string? Position,
|
||
ProjectRole? ProjectRole,
|
||
HeadType? HeadType,
|
||
RouteStepStatus Status,
|
||
bool AllowReassignToOtherApprovers,
|
||
IReadOnlyList<RouteStepConditionDto>? Conditions,
|
||
ConditionsLogic ConditionsLogic,
|
||
int? SlaHours = null,
|
||
bool? AskOverdueReason = null);
|
||
|
||
public sealed record UpdateTemplateRouteStepRequest(
|
||
int OrderNo,
|
||
string? ExecutorEmail,
|
||
string? Position,
|
||
ProjectRole? ProjectRole,
|
||
HeadType? HeadType,
|
||
RouteStepStatus Status,
|
||
bool AllowReassignToOtherApprovers,
|
||
IReadOnlyList<RouteStepConditionDto>? Conditions,
|
||
ConditionsLogic ConditionsLogic,
|
||
int? SlaHours = null,
|
||
bool? AskOverdueReason = null);
|
||
|
||
/// <summary>
|
||
/// Как и остальные поля PATCH, Conditions=null означает «не менять». Отличить
|
||
/// «не менять» от «убрать все условия» здесь нельзя (тот же приём, что и раньше
|
||
/// для FieldName) — очистка условий делается через PUT с Conditions: [].
|
||
/// </summary>
|
||
public sealed record PatchTemplateRouteStepRequest(
|
||
int? OrderNo,
|
||
string? ExecutorEmail,
|
||
string? Position,
|
||
ProjectRole? ProjectRole,
|
||
HeadType? HeadType,
|
||
RouteStepStatus? Status,
|
||
bool? AllowReassignToOtherApprovers,
|
||
IReadOnlyList<RouteStepConditionDto>? Conditions,
|
||
ConditionsLogic? ConditionsLogic = null,
|
||
int? SlaHours = null,
|
||
bool? AskOverdueReason = null);
|