diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 00000000..bf38a861
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+ false
+
+
diff --git a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IProgramManagerDbContext.cs b/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IProgramManagerDbContext.cs
index a8f8400b..9d3aeefa 100644
--- a/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IProgramManagerDbContext.cs
+++ b/ProgramManager/src/Application/GozareshgirProgramManager.Application/_Common/Interfaces/IProgramManagerDbContext.cs
@@ -25,7 +25,7 @@ public interface IProgramManagerDbContext
DbSet TaskSections { get; set; }
DbSet ProjectSections { get; set; }
DbSet PhaseSections { get; set; }
-
+ DbSet BugSections { get; set; }
DbSet ProjectTasks { get; set; }
DbSet TaskChatMessages { get; set; }
diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugDocument.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugDocument.cs
new file mode 100644
index 00000000..2d3b17dd
--- /dev/null
+++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugDocument.cs
@@ -0,0 +1,14 @@
+namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
+
+public class BugDocument
+{
+
+ public BugDocument(Guid fileId)
+ {
+ FileId = fileId;
+ }
+ private BugDocument() { } // EF
+ public Guid Id { get; private set; }
+ public Guid FileId { get; private set; }
+ public BugSection BugSection { get; private set; }
+}
\ No newline at end of file
diff --git a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugSection.cs b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugSection.cs
index f65c9b62..cbb79db8 100644
--- a/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugSection.cs
+++ b/ProgramManager/src/Domain/GozareshgirProgramManager.Domain/ProjectAgg/Entities/BugSection.cs
@@ -5,12 +5,23 @@ namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
public class BugSection : EntityBase
{
- public BugSection(Guid taskId, string initialDescription, long originalAssignedUserId)
+ public BugSection(Guid taskId, string initialDescription, long originalAssignedUserId, ProjectTaskPriority priority)
{
TaskId = taskId;
InitialDescription = initialDescription;
Status = TaskSectionStatus.ReadyToStart;
OriginalAssignedUserId = originalAssignedUserId;
+ Priority = priority;
+ }
+
+
+
+
+
+ // برای EF Core
+ private BugSection()
+ {
+
}
///
@@ -41,5 +52,14 @@ public class BugSection : EntityBase
// Navigation to ProjectTask (must be Task level)
public ProjectTask ProjectTask { get; private set; } = null!;
-
+ ///
+ /// لیست مدارک و فایلها
+ ///
+ public List BugDocuments { get; private set; } = new();
+
+ public void AddDocument(BugDocument document)
+ {
+ BugDocuments.Add(document);
+ }
+
}
\ No newline at end of file
diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.Designer.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.Designer.cs
new file mode 100644
index 00000000..40edf85e
--- /dev/null
+++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.Designer.cs
@@ -0,0 +1,1149 @@
+//
+using System;
+using GozareshgirProgramManager.Infrastructure.Persistence.Context;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace GozareshgirProgramManager.Infrastructure.Migrations
+{
+ [DbContext(typeof(ProgramManagerDbContext))]
+ [Migration("20260127100843_BugSectioninit")]
+ partial class BugSectioninit
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.CheckoutAgg.Entities.Checkout", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CheckoutEndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("CheckoutStartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DeductionFromSalary")
+ .HasColumnType("float");
+
+ b.Property("FullName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("MandatoryHours")
+ .HasColumnType("int");
+
+ b.Property("Month")
+ .HasColumnType("int");
+
+ b.Property("MonthlySalaryDefined")
+ .HasColumnType("float");
+
+ b.Property("MonthlySalaryPay")
+ .HasColumnType("float");
+
+ b.Property("RemainingHours")
+ .HasColumnType("int");
+
+ b.Property("TotalDaysWorked")
+ .HasColumnType("int");
+
+ b.Property("TotalHoursWorked")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.Property("Year")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("Checkouts", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.CustomerAgg.Customer", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("nvarchar(256)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Customers", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.FileManagementAgg.Entities.UploadedFile", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Category")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DeletedByUserId")
+ .HasColumnType("bigint");
+
+ b.Property("DeletedDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DurationSeconds")
+ .HasColumnType("int");
+
+ b.Property("FileExtension")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("FileSizeBytes")
+ .HasColumnType("bigint");
+
+ b.Property("FileType")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("ImageHeight")
+ .HasColumnType("int");
+
+ b.Property("ImageWidth")
+ .HasColumnType("int");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bit")
+ .HasDefaultValue(false);
+
+ b.Property("IsVirusScanPassed")
+ .HasColumnType("bit");
+
+ b.Property("MimeType")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("OriginalFileName")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("ReferenceEntityId")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("ReferenceEntityType")
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("StoragePath")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("StorageProvider")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("StorageUrl")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("ThumbnailUrl")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("UniqueFileName")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("UploadDate")
+ .HasColumnType("datetime2");
+
+ b.Property("UploadedByUserId")
+ .HasColumnType("bigint");
+
+ b.Property("VirusScanDate")
+ .HasColumnType("datetime2");
+
+ b.Property("VirusScanResult")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Category");
+
+ b.HasIndex("IsDeleted");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("UniqueFileName")
+ .IsUnique();
+
+ b.HasIndex("UploadedByUserId");
+
+ b.HasIndex("ReferenceEntityType", "ReferenceEntityId");
+
+ b.ToTable("UploadedFiles", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugSection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("InitialDescription")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("OriginalAssignedUserId")
+ .HasColumnType("bigint");
+
+ b.Property("Priority")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("TaskId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TaskId");
+
+ b.ToTable("BugSections", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("PhaseId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SkillId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PhaseId");
+
+ b.HasIndex("SkillId");
+
+ b.ToTable("PhaseSections");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("HasAssignmentOverride")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("PlannedEndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("PlannedStartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Projects", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DeployStatus")
+ .IsRequired()
+ .HasMaxLength(30)
+ .HasColumnType("nvarchar(30)");
+
+ b.Property("Description")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("HasAssignmentOverride")
+ .HasColumnType("bit");
+
+ b.Property("IsArchived")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("OrderIndex")
+ .HasColumnType("int");
+
+ b.Property("ProjectId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProjectId");
+
+ b.ToTable("ProjectPhases", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectSection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ProjectId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SkillId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProjectId");
+
+ b.HasIndex("SkillId");
+
+ b.ToTable("ProjectSections");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AllocatedTime")
+ .HasMaxLength(30)
+ .HasColumnType("nvarchar(30)");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Description")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("DueDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("HasAssignmentOverride")
+ .HasColumnType("bit");
+
+ b.Property("HasTimeOverride")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.Property("OrderIndex")
+ .HasColumnType("int");
+
+ b.Property("PhaseId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Priority")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PhaseId");
+
+ b.ToTable("ProjectTasks", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("CurrentAssignedUserId")
+ .HasColumnType("bigint");
+
+ b.Property("InitialDescription")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("InitialEstimatedHours")
+ .IsRequired()
+ .HasMaxLength(30)
+ .HasColumnType("nvarchar(30)");
+
+ b.Property("OriginalAssignedUserId")
+ .HasColumnType("bigint");
+
+ b.Property("SkillId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("TaskId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SkillId");
+
+ b.HasIndex("TaskId");
+
+ b.ToTable("TaskSections", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionActivity", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EndDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EndNotes")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("IsActive")
+ .HasColumnType("bit");
+
+ b.Property("Notes")
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("SectionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("StartDate")
+ .HasColumnType("datetime2");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SectionId");
+
+ b.ToTable("TaskSectionActivities", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionAdditionalTime", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("AddedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("AddedByUserId")
+ .HasColumnType("bigint");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Hours")
+ .IsRequired()
+ .HasMaxLength(30)
+ .HasColumnType("nvarchar(30)");
+
+ b.Property("Reason")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("TaskSectionId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TaskSectionId");
+
+ b.ToTable("TaskSectionAdditionalTimes", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.RoleAgg.Entities.Role", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("GozareshgirRoleId")
+ .HasColumnType("bigint");
+
+ b.Property("RoleName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.HasKey("Id");
+
+ b.ToTable("PmRoles", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.SalaryPaymentSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EndSettingDate")
+ .HasColumnType("datetime2");
+
+ b.Property("HolidayWorking")
+ .HasColumnType("bit");
+
+ b.Property("MonthlySalary")
+ .HasColumnType("float");
+
+ b.Property("StartSettingDate")
+ .HasColumnType("datetime2");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.ToTable("SalaryPaymentSetting", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("nvarchar(200)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Skills", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.TaskChatAgg.Entities.TaskChatMessage", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("DeletedDate")
+ .HasColumnType("datetime2");
+
+ b.Property("EditedDate")
+ .HasColumnType("datetime2");
+
+ b.Property("FileId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsDeleted")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bit")
+ .HasDefaultValue(false);
+
+ b.Property("IsEdited")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bit")
+ .HasDefaultValue(false);
+
+ b.Property("IsPinned")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bit")
+ .HasDefaultValue(false);
+
+ b.Property("MessageType")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("PinnedByUserId")
+ .HasColumnType("bigint");
+
+ b.Property("PinnedDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ReplyToMessageId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("SenderUserId")
+ .HasColumnType("bigint");
+
+ b.Property("TaskId")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("TextContent")
+ .HasMaxLength(4000)
+ .HasColumnType("nvarchar(4000)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreationDate");
+
+ b.HasIndex("FileId");
+
+ b.HasIndex("IsDeleted");
+
+ b.HasIndex("ReplyToMessageId");
+
+ b.HasIndex("SenderUserId");
+
+ b.HasIndex("TaskId");
+
+ b.HasIndex("TaskId", "IsPinned");
+
+ b.ToTable("TaskChatMessages", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("AccountId")
+ .HasColumnType("bigint");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("Email")
+ .HasMaxLength(150)
+ .HasColumnType("nvarchar(150)");
+
+ b.Property("FullName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("IsActive")
+ .HasColumnType("bit");
+
+ b.Property("Mobile")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("nvarchar(20)");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("nvarchar(1000)");
+
+ b.Property("ProfilePhotoPath")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("UserName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("nvarchar(100)");
+
+ b.Property("VerifyCode")
+ .HasMaxLength(10)
+ .HasColumnType("nvarchar(10)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Users", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.UserRefreshToken", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ExpiresAt")
+ .HasColumnType("datetime2");
+
+ b.Property("IpAddress")
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("RevokedAt")
+ .HasColumnType("datetime2");
+
+ b.Property("Token")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("UserAgent")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("UserId")
+ .HasColumnType("bigint");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ExpiresAt");
+
+ b.HasIndex("Token")
+ .IsUnique();
+
+ b.HasIndex("UserId");
+
+ b.ToTable("UserRefreshTokens", (string)null);
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugSection", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", "ProjectTask")
+ .WithMany("BugSectionList")
+ .HasForeignKey("TaskId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsMany("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugDocument", "BugDocuments", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b1.Property("BugSectionId")
+ .HasColumnType("uniqueidentifier");
+
+ b1.Property("FileId")
+ .HasColumnType("uniqueidentifier");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("BugSectionId");
+
+ b1.ToTable("BugDocuments", (string)null);
+
+ b1.WithOwner("BugSection")
+ .HasForeignKey("BugSectionId");
+
+ b1.Navigation("BugSection");
+ });
+
+ b.Navigation("BugDocuments");
+
+ b.Navigation("ProjectTask");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase")
+ .WithMany("PhaseSections")
+ .HasForeignKey("PhaseId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill")
+ .WithMany()
+ .HasForeignKey("SkillId")
+ .OnDelete(DeleteBehavior.Restrict);
+
+ b.Navigation("Phase");
+
+ b.Navigation("Skill");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", "Project")
+ .WithMany("Phases")
+ .HasForeignKey("ProjectId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Project");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectSection", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", "Project")
+ .WithMany("ProjectSections")
+ .HasForeignKey("ProjectId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill")
+ .WithMany()
+ .HasForeignKey("SkillId")
+ .OnDelete(DeleteBehavior.Restrict);
+
+ b.Navigation("Project");
+
+ b.Navigation("Skill");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase")
+ .WithMany("Tasks")
+ .HasForeignKey("PhaseId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Phase");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", "Skill")
+ .WithMany("Sections")
+ .HasForeignKey("SkillId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", "Task")
+ .WithMany("Sections")
+ .HasForeignKey("TaskId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Skill");
+
+ b.Navigation("Task");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionActivity", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", "Section")
+ .WithMany("Activities")
+ .HasForeignKey("SectionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Section");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSectionAdditionalTime", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", null)
+ .WithMany("AdditionalTimes")
+ .HasForeignKey("TaskSectionId");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.RoleAgg.Entities.Role", b =>
+ {
+ b.OwnsMany("GozareshgirProgramManager.Domain.PermissionAgg.Entities.Permission", "Permissions", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id"));
+
+ b1.Property("Code")
+ .HasColumnType("int");
+
+ b1.Property("RoleId")
+ .HasColumnType("bigint");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("RoleId");
+
+ b1.ToTable("PmRolePermissions", (string)null);
+
+ b1.WithOwner("Role")
+ .HasForeignKey("RoleId");
+
+ b1.Navigation("Role");
+ });
+
+ b.Navigation("Permissions");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.SalaryPaymentSetting", b =>
+ {
+ b.OwnsMany("GozareshgirProgramManager.Domain.SalaryPaymentSettingAgg.Entities.WorkingHours", "WorkingHoursList", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id"));
+
+ b1.Property("EndShiftOne")
+ .HasColumnType("time(0)");
+
+ b1.Property("EndShiftTwo")
+ .HasColumnType("time(0)");
+
+ b1.Property("HasRestTime")
+ .HasColumnType("bit");
+
+ b1.Property("HasShiftOne")
+ .HasColumnType("bit");
+
+ b1.Property("HasShiftTow")
+ .HasColumnType("bit");
+
+ b1.Property("IsActiveDay")
+ .HasColumnType("bit");
+
+ b1.Property("PersianDayOfWeek")
+ .HasColumnType("int");
+
+ b1.Property("RestTime")
+ .HasColumnType("time(0)");
+
+ b1.Property("SalaryPaymentSettingId")
+ .HasColumnType("bigint");
+
+ b1.Property("ShiftDurationInMinutes")
+ .HasColumnType("int");
+
+ b1.Property("StartShiftOne")
+ .HasColumnType("time(0)");
+
+ b1.Property("StartShiftTwo")
+ .HasColumnType("time(0)");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("SalaryPaymentSettingId");
+
+ b1.ToTable("WorkingHours", (string)null);
+
+ b1.WithOwner("SalaryPaymentSetting")
+ .HasForeignKey("SalaryPaymentSettingId");
+
+ b1.Navigation("SalaryPaymentSetting");
+ });
+
+ b.Navigation("WorkingHoursList");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.TaskChatAgg.Entities.TaskChatMessage", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.TaskChatAgg.Entities.TaskChatMessage", "ReplyToMessage")
+ .WithMany()
+ .HasForeignKey("ReplyToMessageId")
+ .OnDelete(DeleteBehavior.NoAction);
+
+ b.Navigation("ReplyToMessage");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b =>
+ {
+ b.OwnsMany("GozareshgirProgramManager.Domain.RoleUserAgg.RoleUser", "RoleUser", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b1.Property("Id"));
+
+ b1.Property("RoleId")
+ .HasColumnType("bigint");
+
+ b1.Property("UserId")
+ .HasColumnType("bigint");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("UserId");
+
+ b1.ToTable("RoleUsers", (string)null);
+
+ b1.WithOwner("User")
+ .HasForeignKey("UserId");
+
+ b1.Navigation("User");
+ });
+
+ b.Navigation("RoleUser");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.UserRefreshToken", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.UserAgg.Entities.User", "User")
+ .WithMany("RefreshTokens")
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("User");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project", b =>
+ {
+ b.Navigation("Phases");
+
+ b.Navigation("ProjectSections");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", b =>
+ {
+ b.Navigation("PhaseSections");
+
+ b.Navigation("Tasks");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b =>
+ {
+ b.Navigation("BugSectionList");
+
+ b.Navigation("Sections");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.TaskSection", b =>
+ {
+ b.Navigation("Activities");
+
+ b.Navigation("AdditionalTimes");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.SkillAgg.Entities.Skill", b =>
+ {
+ b.Navigation("Sections");
+ });
+
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.UserAgg.Entities.User", b =>
+ {
+ b.Navigation("RefreshTokens");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.cs
new file mode 100644
index 00000000..e3bfc2c9
--- /dev/null
+++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/20260127100843_BugSectioninit.cs
@@ -0,0 +1,77 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace GozareshgirProgramManager.Infrastructure.Migrations
+{
+ ///
+ public partial class BugSectioninit : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "BugSections",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ TaskId = table.Column(type: "uniqueidentifier", nullable: false),
+ InitialDescription = table.Column(type: "nvarchar(500)", maxLength: 500, nullable: true),
+ Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false),
+ OriginalAssignedUserId = table.Column(type: "bigint", nullable: false),
+ Priority = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false),
+ CreationDate = table.Column(type: "datetime2", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BugSections", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BugSections_ProjectTasks_TaskId",
+ column: x => x.TaskId,
+ principalTable: "ProjectTasks",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "BugDocuments",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ FileId = table.Column(type: "uniqueidentifier", nullable: false),
+ BugSectionId = table.Column(type: "uniqueidentifier", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_BugDocuments", x => x.Id);
+ table.ForeignKey(
+ name: "FK_BugDocuments_BugSections_BugSectionId",
+ column: x => x.BugSectionId,
+ principalTable: "BugSections",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BugDocuments_BugSectionId",
+ table: "BugDocuments",
+ column: "BugSectionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_BugSections_TaskId",
+ table: "BugSections",
+ column: "TaskId");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "BugDocuments");
+
+ migrationBuilder.DropTable(
+ name: "BugSections");
+ }
+ }
+}
diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs
index 2ac44b92..f022a8af 100644
--- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs
+++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Migrations/AppDbContextModelSnapshot.cs
@@ -227,6 +227,41 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations
b.ToTable("UploadedFiles", (string)null);
});
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugSection", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("CreationDate")
+ .HasColumnType("datetime2");
+
+ b.Property("InitialDescription")
+ .HasMaxLength(500)
+ .HasColumnType("nvarchar(500)");
+
+ b.Property("OriginalAssignedUserId")
+ .HasColumnType("bigint");
+
+ b.Property("Priority")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("nvarchar(50)");
+
+ b.Property("TaskId")
+ .HasColumnType("uniqueidentifier");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TaskId");
+
+ b.ToTable("BugSections", (string)null);
+ });
+
modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b =>
{
b.Property("Id")
@@ -792,6 +827,43 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations
b.ToTable("UserRefreshTokens", (string)null);
});
+ modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugSection", b =>
+ {
+ b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", "ProjectTask")
+ .WithMany("BugSectionList")
+ .HasForeignKey("TaskId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsMany("GozareshgirProgramManager.Domain.ProjectAgg.Entities.BugDocument", "BugDocuments", b1 =>
+ {
+ b1.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b1.Property("BugSectionId")
+ .HasColumnType("uniqueidentifier");
+
+ b1.Property("FileId")
+ .HasColumnType("uniqueidentifier");
+
+ b1.HasKey("Id");
+
+ b1.HasIndex("BugSectionId");
+
+ b1.ToTable("BugDocuments", (string)null);
+
+ b1.WithOwner("BugSection")
+ .HasForeignKey("BugSectionId");
+
+ b1.Navigation("BugSection");
+ });
+
+ b.Navigation("BugDocuments");
+
+ b.Navigation("ProjectTask");
+ });
+
modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.PhaseSection", b =>
{
b.HasOne("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectPhase", "Phase")
@@ -1047,6 +1119,8 @@ namespace GozareshgirProgramManager.Infrastructure.Migrations
modelBuilder.Entity("GozareshgirProgramManager.Domain.ProjectAgg.Entities.ProjectTask", b =>
{
+ b.Navigation("BugSectionList");
+
b.Navigation("Sections");
});
diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/ProgramManagerDbContext.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/ProgramManagerDbContext.cs
index 01979e6f..dbf13a07 100644
--- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/ProgramManagerDbContext.cs
+++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Context/ProgramManagerDbContext.cs
@@ -25,6 +25,7 @@ public class ProgramManagerDbContext : DbContext, IProgramManagerDbContext
public DbSet TaskSections { get; set; } = null!;
public DbSet ProjectSections { get; set; } = null!;
public DbSet PhaseSections { get; set; } = null!;
+ public DbSet BugSections { get; set; } = null!;
// New Hierarchy entities
public DbSet Projects { get; set; } = null!;
diff --git a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/BugSectionMapping.cs b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/BugSectionMapping.cs
index 31ba9296..96abe1f5 100644
--- a/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/BugSectionMapping.cs
+++ b/ProgramManager/src/Infrastructure/GozareshgirProgramManager.Infrastructure/Persistence/Mappings/BugSectionMapping.cs
@@ -34,6 +34,14 @@ public class BugSectionMapping : IEntityTypeConfiguration
.IsRequired(false);
+ builder.OwnsMany(x => x.BugDocuments, navigationBuilder =>
+ {
+
+ navigationBuilder.ToTable("BugDocuments");
+ navigationBuilder.HasKey(x => x.Id);
+ navigationBuilder.WithOwner(x => x.BugSection);
+ });
+
// Navigation to ProjectTask (Task level)
builder.HasOne(x => x.ProjectTask)
.WithMany(t => t.BugSectionList)