diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.Designer.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.Designer.cs
new file mode 100644
index 0000000..25f2078
--- /dev/null
+++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.Designer.cs
@@ -0,0 +1,175 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Tnsu.ApprovalRoute.Infrastructure.Persistence;
+
+#nullable disable
+
+namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations
+{
+ [DbContext(typeof(ApprovalRouteDbContext))]
+ [Migration("20260722112539_InitialCreate")]
+ partial class InitialCreate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RequestType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name");
+
+ b.Property("PageUrl")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("page_url");
+
+ b.HasKey("Id")
+ .HasName("pk_request_types");
+
+ b.ToTable("request_types", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DepartmentId")
+ .HasColumnType("uuid")
+ .HasColumnName("department_id");
+
+ b.Property("ProjectId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_id");
+
+ b.Property("RequestTypeId")
+ .HasColumnType("uuid")
+ .HasColumnName("request_type_id");
+
+ b.Property("RequiresControl")
+ .HasColumnType("boolean")
+ .HasColumnName("requires_control");
+
+ b.Property("RouteType")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("route_type");
+
+ b.HasKey("Id")
+ .HasName("pk_routes");
+
+ b.HasIndex("RequestTypeId")
+ .HasDatabaseName("ix_routes_request_type_id");
+
+ b.ToTable("routes", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RouteStep", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AllowReassignToOtherApprovers")
+ .HasColumnType("boolean")
+ .HasColumnName("allow_reassign_to_other_approvers");
+
+ b.Property("ExecutorUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("executor_user_id");
+
+ b.Property("OrderNo")
+ .HasColumnType("integer")
+ .HasColumnName("order_no");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("position");
+
+ b.Property("RouteId")
+ .HasColumnType("uuid")
+ .HasColumnName("route_id");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("status");
+
+ b.HasKey("Id")
+ .HasName("pk_route_steps");
+
+ b.HasIndex("RouteId", "OrderNo")
+ .HasDatabaseName("ix_route_steps_route_id_order_no");
+
+ b.ToTable("route_steps", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.HasOne("Tnsu.ApprovalRoute.Domain.Entities.RequestType", "RequestType")
+ .WithMany("Routes")
+ .HasForeignKey("RequestTypeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_routes_request_types_request_type_id");
+
+ b.Navigation("RequestType");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RouteStep", b =>
+ {
+ b.HasOne("Tnsu.ApprovalRoute.Domain.Entities.Route", "Route")
+ .WithMany("Steps")
+ .HasForeignKey("RouteId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_route_steps_routes_route_id");
+
+ b.Navigation("Route");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RequestType", b =>
+ {
+ b.Navigation("Routes");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.Navigation("Steps");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.cs
new file mode 100644
index 0000000..9d893ca
--- /dev/null
+++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/20260722112539_InitialCreate.cs
@@ -0,0 +1,97 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations
+{
+ ///
+ public partial class InitialCreate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "request_types",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ name = table.Column(type: "character varying(256)", maxLength: 256, nullable: false),
+ page_url = table.Column(type: "character varying(512)", maxLength: 512, nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_request_types", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "routes",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ route_type = table.Column(type: "character varying(32)", maxLength: 32, nullable: false),
+ request_type_id = table.Column(type: "uuid", nullable: false),
+ department_id = table.Column(type: "uuid", nullable: false),
+ company_id = table.Column(type: "uuid", nullable: false),
+ project_id = table.Column(type: "uuid", nullable: false),
+ requires_control = table.Column(type: "boolean", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_routes", x => x.id);
+ table.ForeignKey(
+ name: "fk_routes_request_types_request_type_id",
+ column: x => x.request_type_id,
+ principalTable: "request_types",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "route_steps",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ order_no = table.Column(type: "integer", nullable: false),
+ executor_user_id = table.Column(type: "uuid", nullable: false),
+ position = table.Column(type: "character varying(128)", maxLength: 128, nullable: false),
+ status = table.Column(type: "character varying(32)", maxLength: 32, nullable: false),
+ route_id = table.Column(type: "uuid", nullable: false),
+ allow_reassign_to_other_approvers = table.Column(type: "boolean", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_route_steps", x => x.id);
+ table.ForeignKey(
+ name: "fk_route_steps_routes_route_id",
+ column: x => x.route_id,
+ principalTable: "routes",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "ix_route_steps_route_id_order_no",
+ table: "route_steps",
+ columns: new[] { "route_id", "order_no" });
+
+ migrationBuilder.CreateIndex(
+ name: "ix_routes_request_type_id",
+ table: "routes",
+ column: "request_type_id");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "route_steps");
+
+ migrationBuilder.DropTable(
+ name: "routes");
+
+ migrationBuilder.DropTable(
+ name: "request_types");
+ }
+ }
+}
diff --git a/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs
new file mode 100644
index 0000000..bc98f9b
--- /dev/null
+++ b/backend/src/Tnsu.ApprovalRoute.Infrastructure/Persistence/Migrations/ApprovalRouteDbContextModelSnapshot.cs
@@ -0,0 +1,172 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Tnsu.ApprovalRoute.Infrastructure.Persistence;
+
+#nullable disable
+
+namespace Tnsu.ApprovalRoute.Infrastructure.Persistence.Migrations
+{
+ [DbContext(typeof(ApprovalRouteDbContext))]
+ partial class ApprovalRouteDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RequestType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name");
+
+ b.Property("PageUrl")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("page_url");
+
+ b.HasKey("Id")
+ .HasName("pk_request_types");
+
+ b.ToTable("request_types", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("CompanyId")
+ .HasColumnType("uuid")
+ .HasColumnName("company_id");
+
+ b.Property("DepartmentId")
+ .HasColumnType("uuid")
+ .HasColumnName("department_id");
+
+ b.Property("ProjectId")
+ .HasColumnType("uuid")
+ .HasColumnName("project_id");
+
+ b.Property("RequestTypeId")
+ .HasColumnType("uuid")
+ .HasColumnName("request_type_id");
+
+ b.Property("RequiresControl")
+ .HasColumnType("boolean")
+ .HasColumnName("requires_control");
+
+ b.Property("RouteType")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("route_type");
+
+ b.HasKey("Id")
+ .HasName("pk_routes");
+
+ b.HasIndex("RequestTypeId")
+ .HasDatabaseName("ix_routes_request_type_id");
+
+ b.ToTable("routes", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RouteStep", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AllowReassignToOtherApprovers")
+ .HasColumnType("boolean")
+ .HasColumnName("allow_reassign_to_other_approvers");
+
+ b.Property("ExecutorUserId")
+ .HasColumnType("uuid")
+ .HasColumnName("executor_user_id");
+
+ b.Property("OrderNo")
+ .HasColumnType("integer")
+ .HasColumnName("order_no");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("position");
+
+ b.Property("RouteId")
+ .HasColumnType("uuid")
+ .HasColumnName("route_id");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("status");
+
+ b.HasKey("Id")
+ .HasName("pk_route_steps");
+
+ b.HasIndex("RouteId", "OrderNo")
+ .HasDatabaseName("ix_route_steps_route_id_order_no");
+
+ b.ToTable("route_steps", (string)null);
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.HasOne("Tnsu.ApprovalRoute.Domain.Entities.RequestType", "RequestType")
+ .WithMany("Routes")
+ .HasForeignKey("RequestTypeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_routes_request_types_request_type_id");
+
+ b.Navigation("RequestType");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RouteStep", b =>
+ {
+ b.HasOne("Tnsu.ApprovalRoute.Domain.Entities.Route", "Route")
+ .WithMany("Steps")
+ .HasForeignKey("RouteId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_route_steps_routes_route_id");
+
+ b.Navigation("Route");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.RequestType", b =>
+ {
+ b.Navigation("Routes");
+ });
+
+ modelBuilder.Entity("Tnsu.ApprovalRoute.Domain.Entities.Route", b =>
+ {
+ b.Navigation("Steps");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}