From de60fd0fdb4d30d0633b2d4baa7744d8ff8ccd5e Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Fri, 31 Jul 2026 14:38:31 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BB=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TemplateRoutes/ResolveTemplateRouteDto.cs | 1 - .../TemplateRoutes/TemplateRouteDto.cs | 6 --- .../TemplateRoutes/TemplateRouteService.cs | 9 ++--- .../Entities/TemplateRoute.cs | 3 -- .../Enums/RouteType.cs | 8 ---- .../Persistence/ApprovalRouteDbContext.cs | 1 - ...SectionAndStepConditionFields.Designer.cs} | 8 +--- ...eListNameSectionAndStepConditionFields.cs} | 12 ++++++ .../ApprovalRouteDbContextModelSnapshot.cs | 6 --- .../TemplateRouteServiceTests.cs | 38 +++++++++---------- .../TemplateRouteStepServiceTests.cs | 2 +- .../components/screens/ResolveScreen.tsx | 4 +- .../components/screens/RouteFormModal.tsx | 20 +--------- .../components/screens/RouteStepsScreen.tsx | 4 +- .../components/screens/RoutesScreen.tsx | 9 +---- .../webparts/approvalAdmin/models/enums.ts | 6 --- .../webparts/approvalAdmin/models/resolve.ts | 3 +- .../approvalAdmin/models/templateRoutes.ts | 6 --- frontend/src/webparts/approvalAdmin/texts.ts | 17 ++------- 19 files changed, 48 insertions(+), 115 deletions(-) delete mode 100644 backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteType.cs rename backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/{20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs => 20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs} (96%) rename backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/{20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.cs => 20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.cs} (87%) diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs index bf5b484..2d13744 100644 --- a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs +++ b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/ResolveTemplateRouteDto.cs @@ -12,7 +12,6 @@ public sealed record ResolvedRouteStepDto( public sealed record ResolveTemplateRouteResultDto( int RouteId, - RouteType RouteType, bool RequiresControl, IReadOnlyList Steps); diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs index 6992701..82aee23 100644 --- a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs +++ b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteDto.cs @@ -1,10 +1,7 @@ -using Tnsu.ApprovalRoute.Domain.Enums; - namespace Tnsu.ApprovalRoute.Application.TemplateRoutes; public sealed record TemplateRouteDto( int Id, - RouteType RouteType, int RequestTypeId, Guid? DepartmentId, Guid CompanyId, @@ -12,7 +9,6 @@ public sealed record TemplateRouteDto( bool RequiresControl); public sealed record CreateTemplateRouteRequest( - RouteType RouteType, int RequestTypeId, Guid? DepartmentId, Guid CompanyId, @@ -20,14 +16,12 @@ public sealed record CreateTemplateRouteRequest( bool RequiresControl); public sealed record UpdateTemplateRouteRequest( - RouteType RouteType, Guid? DepartmentId, Guid CompanyId, bool ByProject, bool RequiresControl); public sealed record PatchTemplateRouteRequest( - RouteType? RouteType, Guid? DepartmentId, Guid? CompanyId, bool? ByProject, diff --git a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs index a513f06..94e2de1 100644 --- a/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs +++ b/backend/src/Tnsu.ApprovalRoute.Application/TemplateRoutes/TemplateRouteService.cs @@ -24,7 +24,7 @@ public sealed class TemplateRouteService( var items = await query .Select(x => new TemplateRouteDto( - x.Id, x.RouteType, x.RequestTypeId, x.DepartmentId, x.CompanyId, x.ByProject, x.RequiresControl)) + x.Id, x.RequestTypeId, x.DepartmentId, x.CompanyId, x.ByProject, x.RequiresControl)) .ToListAsync(cancellationToken); return Result.Ok>(items); @@ -52,7 +52,6 @@ public sealed class TemplateRouteService( var entity = new TemplateRoute { - RouteType = r.RouteType, RequestTypeId = r.RequestTypeId, DepartmentId = r.DepartmentId, CompanyId = r.CompanyId, @@ -76,7 +75,6 @@ public sealed class TemplateRouteService( return Result.Fail(new ConflictError( "Маршрут с таким типом заявки, отделом, компанией и признаком «по проекту» уже существует.")); - entity.RouteType = r.RouteType; entity.DepartmentId = r.DepartmentId; entity.CompanyId = r.CompanyId; entity.ByProject = r.ByProject; @@ -101,7 +99,6 @@ public sealed class TemplateRouteService( return Result.Fail(new ConflictError( "Маршрут с таким типом заявки, отделом, компанией и признаком «по проекту» уже существует.")); - entity.RouteType = r.RouteType ?? entity.RouteType; entity.DepartmentId = departmentId; entity.CompanyId = companyId; entity.ByProject = byProject; @@ -179,7 +176,7 @@ public sealed class TemplateRouteService( var collapsedSteps = CollapseByExecutorEmail(steps); - return Result.Ok(new ResolveTemplateRouteResultDto(route.Id, route.RouteType, route.RequiresControl, collapsedSteps)); + return Result.Ok(new ResolveTemplateRouteResultDto(route.Id, route.RequiresControl, collapsedSteps)); } private Task HasDuplicateAsync( @@ -260,5 +257,5 @@ public sealed class TemplateRouteService( } private static TemplateRouteDto ToDto(TemplateRoute e) => new( - e.Id, e.RouteType, e.RequestTypeId, e.DepartmentId, e.CompanyId, e.ByProject, e.RequiresControl); + e.Id, e.RequestTypeId, e.DepartmentId, e.CompanyId, e.ByProject, e.RequiresControl); } diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs b/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs index 9319917..c5ac975 100644 --- a/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs +++ b/backend/src/Tnsu.ApprovalRoute.Domain/Entities/TemplateRoute.cs @@ -1,11 +1,8 @@ -using Tnsu.ApprovalRoute.Domain.Enums; - namespace Tnsu.ApprovalRoute.Domain.Entities; public class TemplateRoute { public int Id { get; set; } - public RouteType RouteType { get; set; } = RouteType.Sequential; public int RequestTypeId { get; set; } public Guid? DepartmentId { get; set; } diff --git a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteType.cs b/backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteType.cs deleted file mode 100644 index 8004453..0000000 --- a/backend/src/Tnsu.ApprovalRoute.Domain/Enums/RouteType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Tnsu.ApprovalRoute.Domain.Enums; - -public enum RouteType -{ - None, - Parallel, - Sequential -} diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs index 4f4bb5d..e9ba224 100644 --- a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs +++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/ApprovalRouteDbContext.cs @@ -24,7 +24,6 @@ public class ApprovalRouteDbContext(DbContextOptions opt modelBuilder.Entity(e => { e.HasKey(x => x.Id); - e.Property(x => x.RouteType).HasConversion().HasMaxLength(32).IsRequired(); e.HasOne(x => x.RequestType).WithMany(x => x.Routes).HasForeignKey(x => x.RequestTypeId); e.HasIndex(x => new { x.RequestTypeId, x.DepartmentId, x.CompanyId, x.ByProject }).IsUnique(); }); diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs similarity index 96% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs rename to backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs index a49cb0c..011788e 100644 --- a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs +++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.Designer.cs @@ -12,7 +12,7 @@ using Tnsu.ApprovalRoute.Infrastructure.Persistence; namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations { [DbContext(typeof(ApprovalRouteDbContext))] - [Migration("20260731073536_AddRequestTypeListNameSectionAndStepConditionFields")] + [Migration("20260731093159_AddRequestTypeListNameSectionAndStepConditionFields")] partial class AddRequestTypeListNameSectionAndStepConditionFields { /// @@ -97,12 +97,6 @@ namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations .HasColumnType("boolean") .HasColumnName("requires_control"); - b.Property("RouteType") - .IsRequired() - .HasMaxLength(32) - .HasColumnType("character varying(32)") - .HasColumnName("route_type"); - b.HasKey("Id") .HasName("pk_template_routes"); diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.cs similarity index 87% rename from backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.cs rename to backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.cs index d6dfe6e..29c2f4f 100644 --- a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731073536_AddRequestTypeListNameSectionAndStepConditionFields.cs +++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260731093159_AddRequestTypeListNameSectionAndStepConditionFields.cs @@ -10,6 +10,10 @@ namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.DropColumn( + name: "route_type", + table: "template_routes"); + migrationBuilder.AddColumn( name: "field_name", table: "template_route_steps", @@ -80,6 +84,14 @@ namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations migrationBuilder.DropColumn( name: "site_url", table: "request_types"); + + migrationBuilder.AddColumn( + name: "route_type", + table: "template_routes", + type: "character varying(32)", + maxLength: 32, + nullable: false, + defaultValue: ""); } } } diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs index 73488db..0d54ade 100644 --- a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs +++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs @@ -94,12 +94,6 @@ namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations .HasColumnType("boolean") .HasColumnName("requires_control"); - b.Property("RouteType") - .IsRequired() - .HasMaxLength(32) - .HasColumnType("character varying(32)") - .HasColumnName("route_type"); - b.HasKey("Id") .HasName("pk_template_routes"); diff --git a/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/ApplicationServices/TemplateRouteServiceTests.cs b/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/ApplicationServices/TemplateRouteServiceTests.cs index 101fd69..7f0f80b 100644 --- a/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/ApplicationServices/TemplateRouteServiceTests.cs +++ b/backend/tests/Tnsu.ApprovalRoute.IntegrationTests/ApplicationServices/TemplateRouteServiceTests.cs @@ -48,7 +48,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture(); @@ -198,7 +196,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture(); @@ -274,7 +272,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture(); @@ -401,7 +399,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture(); @@ -429,7 +427,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture(); @@ -457,7 +455,7 @@ public sealed class TemplateRouteServiceTests : IClassFixture = ({ api, dictionary, {result && ( <> - {texts.resolve.summary(result.routeId, routeTypeLabels[result.routeType], result.requiresControl)} + {texts.resolve.summary(result.routeId, result.requiresControl)} {unresolvedCount > 0 && {texts.resolve.unresolved(unresolvedCount)}} v !== RouteType.None) - .map(v => ({ value: v, label: routeTypeLabels[v] })); - function toFormState(editing: TemplateRoute | undefined, initialRequestTypeId: string): IFormState { if (!editing) { return { requestTypeId: initialRequestTypeId, - routeType: RouteType.Sequential, companyId: '', departmentId: '', byProject: false, @@ -45,7 +39,6 @@ function toFormState(editing: TemplateRoute | undefined, initialRequestTypeId: s } return { requestTypeId: String(editing.requestTypeId), - routeType: editing.routeType, companyId: editing.companyId, departmentId: editing.departmentId ?? '', byProject: editing.byProject, @@ -88,14 +81,12 @@ export const RouteFormModal: React.FC = ({ const departmentId = form.departmentId.trim() ? form.departmentId.trim() : null; const request = editing ? api.templateRoutes.update(editing.id, { - routeType: form.routeType, companyId: form.companyId.trim(), departmentId, byProject: form.byProject, requiresControl: form.requiresControl }) : api.templateRoutes.create({ - routeType: form.routeType, requestTypeId: Number(form.requestTypeId), companyId: form.companyId.trim(), departmentId, @@ -129,13 +120,6 @@ export const RouteFormModal: React.FC = ({ onChange={e => setForm({ ...form, requestTypeId: e.target.value })} /> - -