Директор Tansu среди директоров компаний: не параллельно, а после блока
Вместо удаления совпавшей строки CompanyDirectors — обе строки (директор компании и Директор Tansu) остаются в результате, это два разных пункта согласования, даже если физически один человек. Строка DirectorTansu, чей email совпал с одним из CompanyDirectors, не участвует в обычном схлопывании по email (CollapseByExecutorEmail) — та восприняла бы это как конфликт PositionCode одного согласующего. Вместо этого её OrderNo явно переставляется на «сразу после блока CompanyDirectors» (максимальный OrderNo блока + 1), так что она идёт последовательно, а не параллельно остальным директорам компаний. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+16
-10
@@ -849,11 +849,11 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
|
||||
resolved.Value.Steps.ShouldContain(s => s.ExecutorEmail == "mechanic.kps@tnsu.kz");
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Резолв: если Директор Tansu совпадает с одним из Директоров компаний, эта строка убирается из CompanyDirectors, а не конфликтует")]
|
||||
public async Task ResolveAsync_DirectorTansuMatchesOneOfCompanyDirectors_RemovesDuplicateFromCompanyDirectors()
|
||||
[Fact(DisplayName = "Резолв: если Директор Tansu совпадает с одним из Директоров компаний, он идёт не параллельно блоку, а сразу после него")]
|
||||
public async Task ResolveAsync_DirectorTansuMatchesOneOfCompanyDirectors_SequencedAfterCompanyDirectorsBlock()
|
||||
{
|
||||
// Arrange — директор ТОО TANSU Construction (из шага CompanyDirectors, OrderNo 5)
|
||||
// и Директор Tansu (из шага DirectorTansu, OrderNo 10, идёт в маршруте последним) —
|
||||
// и Директор Tansu (из шага DirectorTansu, сам сконфигурирован с OrderNo 10) —
|
||||
// один и тот же человек с одним и тем же email.
|
||||
var portalClient = new Mock<ITnsuPortalClient>();
|
||||
portalClient
|
||||
@@ -898,15 +898,21 @@ public sealed class TemplateRouteServiceTests : IClassFixture<PostgresDatabaseFi
|
||||
new ResolveTemplateRouteRequest(requestTypeId, "someone@tnsu.kz", null, RouteStepStatus.Approval),
|
||||
CancellationToken.None);
|
||||
|
||||
// Assert — вместо трёх строк (2 CompanyDirectors + 1 DirectorTansu) остаётся
|
||||
// две: KazPromService-директор и Директор Tansu, без предупреждения о конфликте.
|
||||
// Assert — все три строки остаются (директор не пропадает и не схлопывается
|
||||
// молча), но Директор Tansu не параллелен блоку CompanyDirectors (OrderNo 5),
|
||||
// а идёт сразу после него — OrderNo 6, а не свой сконфигурированный 10.
|
||||
resolved.IsSuccess.ShouldBeTrue();
|
||||
resolved.Value.Steps.Count.ShouldBe(2);
|
||||
var tansuStep = resolved.Value.Steps.Single(s => s.ExecutorEmail == "director.tansu@tnsu.kz");
|
||||
tansuStep.PositionCode.ShouldBe(HeadType.DirectorTansu);
|
||||
tansuStep.OrderNo.ShouldBe(10);
|
||||
resolved.Value.Steps.Count.ShouldBe(3);
|
||||
var tansuStep = resolved.Value.Steps.Single(s => s.PositionCode == HeadType.DirectorTansu);
|
||||
tansuStep.ExecutorEmail.ShouldBe("director.tansu@tnsu.kz");
|
||||
tansuStep.OrderNo.ShouldBe(6);
|
||||
tansuStep.Warning.ShouldBeNull();
|
||||
resolved.Value.Steps.ShouldContain(s => s.ExecutorEmail == "mechanic.kps@tnsu.kz" && s.PositionCode == HeadType.CompanyDirectors);
|
||||
|
||||
var companyDirectorSteps = resolved.Value.Steps.Where(s => s.PositionCode == HeadType.CompanyDirectors).ToList();
|
||||
companyDirectorSteps.Count.ShouldBe(2);
|
||||
companyDirectorSteps.ShouldAllBe(s => s.OrderNo == 5);
|
||||
companyDirectorSteps.ShouldContain(s => s.ExecutorEmail == "director.tansu@tnsu.kz");
|
||||
companyDirectorSteps.ShouldContain(s => s.ExecutorEmail == "mechanic.kps@tnsu.kz");
|
||||
}
|
||||
|
||||
[Fact(DisplayName = "Резолв шага с типом руководителя Chief возвращает warning, если руководитель не найден")]
|
||||
|
||||
Reference in New Issue
Block a user