Несколько условий шага, объединяемых через И/ИЛИ (#16)
Tests / frontend-test (push) Successful in 47s
Tests / backend-test (push) Successful in 2m12s

<html>
<body>
<!--StartFragment-->
GetEmployeeByEmailAsync возвращает массив; новый HeadType.CompanyDirectors
--

<!--EndFragment-->
</body>
</html>[GetEmployeeByEmailAsync возвращает массив; новый HeadType.CompanyDirectors](http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/commit/572749b4d7cc11bc8e1ef4184a93f18a14b710ab)

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/16
This commit was merged in pull request #16.
This commit is contained in:
2026-08-25 07:04:44 +00:00
parent e4a6cb8167
commit ba48ed1a0e
27 changed files with 1622 additions and 413 deletions
@@ -7,6 +7,9 @@ namespace Tnsu.ApprovalRoute.Application.TemplateRouteSteps;
// (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,
@@ -17,9 +20,8 @@ public sealed record TemplateRouteStepDto(
RouteStepStatus Status,
int RouteId,
bool AllowReassignToOtherApprovers,
string? FieldName,
ComparisonOperator? Operation,
string? Value,
IReadOnlyList<RouteStepConditionDto> Conditions,
ConditionsLogic ConditionsLogic,
string? Warning = null,
int? SlaHours = null,
bool? AskOverdueReason = null);
@@ -32,9 +34,8 @@ public sealed record CreateTemplateRouteStepRequest(
HeadType? HeadType,
RouteStepStatus Status,
bool AllowReassignToOtherApprovers,
string? FieldName,
ComparisonOperator? Operation,
string? Value,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic ConditionsLogic = ConditionsLogic.And,
int? SlaHours = null,
bool? AskOverdueReason = null);
@@ -46,12 +47,16 @@ public sealed record UpdateTemplateRouteStepRequest(
HeadType? HeadType,
RouteStepStatus Status,
bool AllowReassignToOtherApprovers,
string? FieldName,
ComparisonOperator? Operation,
string? Value,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic ConditionsLogic = ConditionsLogic.And,
int? SlaHours = null,
bool? AskOverdueReason = null);
/// <summary>
/// Как и остальные поля PATCH, Conditions=null означает «не менять». Отличить
/// «не менять» от «убрать все условия» здесь нельзя (тот же приём, что и раньше
/// для FieldName) — очистка условий делается через PUT с Conditions: [].
/// </summary>
public sealed record PatchTemplateRouteStepRequest(
int? OrderNo,
string? ExecutorEmail,
@@ -60,8 +65,7 @@ public sealed record PatchTemplateRouteStepRequest(
HeadType? HeadType,
RouteStepStatus? Status,
bool? AllowReassignToOtherApprovers,
string? FieldName,
ComparisonOperator? Operation,
string? Value,
IReadOnlyList<RouteStepConditionDto>? Conditions,
ConditionsLogic? ConditionsLogic = null,
int? SlaHours = null,
bool? AskOverdueReason = null);