add task section revision and folderize the project domain

This commit is contained in:
2026-01-21 14:12:06 +03:30
parent 88f54b6310
commit 0e5a0a16ac
52 changed files with 114 additions and 39 deletions

View File

@@ -1,7 +1,7 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.SkillAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
/// <summary>
/// بخش فاز - برای ذخیره تخصیص کاربر و مهارت در سطح Phase

View File

@@ -1,8 +1,9 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
using GozareshgirProgramManager.Domain.ProjectAgg.Events;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
/// <summary>
/// فاز پروژه - سطح میانی در سلسله مراتب
@@ -28,7 +29,7 @@ public class ProjectPhase : ProjectHierarchyNode
}
public Guid ProjectId { get; private set; }
public Project Project { get; private set; } = null!;
public Project.Project Project { get; private set; } = null!;
public IReadOnlyList<ProjectTask> Tasks => _tasks.AsReadOnly();
public IReadOnlyList<PhaseSection> PhaseSections => _phaseSections.AsReadOnly();

View File

@@ -1,8 +1,8 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
using GozareshgirProgramManager.Domain.ProjectAgg.Events;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
/// <summary>
/// پروژه - بالاترین سطح در سلسله مراتب و Aggregate Root

View File

@@ -1,7 +1,7 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.SkillAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
/// <summary>
/// ProjectSection: shortcut container for UserId + SkillId at Project level

View File

@@ -1,32 +1,32 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
using GozareshgirProgramManager.Domain.ProjectAgg.Events;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
/// <summary>
/// تسک - پایین‌ترین سطح در سلسله مراتب که شامل بخش‌ها می‌شود
/// </summary>
public class ProjectTask : ProjectHierarchyNode
{
private readonly List<TaskSection> _sections;
private readonly List<TaskSection.TaskSection> _sections;
private ProjectTask()
{
_sections = new List<TaskSection>();
_sections = new List<TaskSection.TaskSection>();
}
public ProjectTask(string name, Guid phaseId, string? description = null) : base(name, description)
{
PhaseId = phaseId;
_sections = new List<TaskSection>();
_sections = new List<TaskSection.TaskSection>();
Priority = ProjectTaskPriority.Low;
AddDomainEvent(new TaskCreatedEvent(Id, phaseId, name));
}
public Guid PhaseId { get; private set; }
public ProjectPhase Phase { get; private set; } = null!;
public IReadOnlyList<TaskSection> Sections => _sections.AsReadOnly();
public IReadOnlyList<TaskSection.TaskSection> Sections => _sections.AsReadOnly();
// Task-specific properties
public Enums.TaskStatus Status { get; private set; } = Enums.TaskStatus.NotStarted;
@@ -40,7 +40,7 @@ public class ProjectTask : ProjectHierarchyNode
#region Section Management
public void AddSection(TaskSection section, bool cascadeToChildren = false)
public void AddSection(TaskSection.TaskSection section, bool cascadeToChildren = false)
{
var existingSection = _sections.FirstOrDefault(s => s.SkillId == section.SkillId);
if (existingSection != null)
@@ -84,7 +84,7 @@ public class ProjectTask : ProjectHierarchyNode
return;
}
var section = new TaskSection(Id, skillId, assignedUserId);
var section = new TaskSection.TaskSection(Id, skillId, assignedUserId);
_sections.Add(section);
AddDomainEvent(new TaskSectionAddedEvent(Id, section.Id, skillId));
}
@@ -204,12 +204,12 @@ public class ProjectTask : ProjectHierarchyNode
#region Query Helpers
public IEnumerable<TaskSection> GetSectionsBySkill(Guid skillId)
public IEnumerable<TaskSection.TaskSection> GetSectionsBySkill(Guid skillId)
{
return _sections.Where(s => s.SkillId == skillId);
}
public TaskSection? GetSectionBySkill(Guid skillId)
public TaskSection.TaskSection? GetSectionBySkill(Guid skillId)
{
return _sections.FirstOrDefault(s => s.SkillId == skillId);
}
@@ -219,7 +219,7 @@ public class ProjectTask : ProjectHierarchyNode
return _sections.Any(s => s.SkillId == skillId);
}
public IEnumerable<TaskSection> GetAssignedSections(long userId)
public IEnumerable<TaskSection.TaskSection> GetAssignedSections(long userId)
{
return _sections.Where(s => s.CurrentAssignedUserId == userId);
}

View File

@@ -1,12 +1,10 @@
using System.Linq;
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain._Common.Exceptions;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
using GozareshgirProgramManager.Domain.ProjectAgg.Events;
using GozareshgirProgramManager.Domain.ProjectAgg.Models;
using GozareshgirProgramManager.Domain.SkillAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
/// <summary>
/// بخش تسک - برای ذخیره کار واقعی که کاربر روی یک مهارت خاص انجام می‌دهد

View File

@@ -1,7 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using GozareshgirProgramManager.Domain._Common;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
/// <summary>
/// فعالیت کاری روی یک بخش

View File

@@ -1,6 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
/// <summary>
/// زمان اضافی اضافه شده بعد از تخمین اولیه

View File

@@ -0,0 +1,14 @@
using GozareshgirProgramManager.Domain._Common;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
public class TaskSectionRevision:EntityBase<Guid>
{
public Guid TaskSectionId { get; private set; }
public TaskSectionRevisionStatus Status { get; private set; }
public string Message { get; private set; }
public Guid CreatedByUserId { get; private set; }
public DateTime CreatedAt { get; private set; }
}

View File

@@ -1,7 +1,7 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
public class TaskSectionTimeRequest:EntityBase<Guid>
{

View File

@@ -1,5 +1,7 @@
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
public interface IPhaseSectionRepository : IRepository<Guid, PhaseSection>
{

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Phase;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Project;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,6 +1,7 @@
using System.Collections;
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
namespace GozareshgirProgramManager.Domain.ProjectAgg.Repositories;

View File

@@ -1,5 +1,6 @@
using GozareshgirProgramManager.Domain._Common;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
using GozareshgirProgramManager.Domain.ProjectAgg.Entities.Task.TaskSection;
namespace GozareshgirProgramManager.Domain.SkillAgg.Entities;