- Added GET /board/{id:guid} endpoint to ProjectController for detailed project board info.
- Enforced max length of 15 characters for project names in CreateProjectCommandValidator.
- Improved SetTimeProjectCommandHandler: skip zero/negative initial times, removed duplicate error message, and cleaned up formatting.
- Enhanced RollCallApplication to use employee-specific workshop shift settings when available.
171 lines
6.6 KiB
C#
171 lines
6.6 KiB
C#
using GozareshgirProgramManager.Application._Common.Interfaces;
|
||
using GozareshgirProgramManager.Application._Common.Models;
|
||
using GozareshgirProgramManager.Application.Modules.Projects.DTOs;
|
||
using GozareshgirProgramManager.Domain._Common;
|
||
using GozareshgirProgramManager.Domain._Common.Exceptions;
|
||
using GozareshgirProgramManager.Domain.ProjectAgg.Entities;
|
||
using GozareshgirProgramManager.Domain.ProjectAgg.Enums;
|
||
using GozareshgirProgramManager.Domain.ProjectAgg.Repositories;
|
||
|
||
namespace GozareshgirProgramManager.Application.Modules.Projects.Commands.SetTimeProject;
|
||
|
||
public class SetTimeProjectCommandHandler : IBaseCommandHandler<SetTimeProjectCommand>
|
||
{
|
||
private readonly IProjectRepository _projectRepository;
|
||
private readonly IProjectPhaseRepository _projectPhaseRepository;
|
||
private readonly IProjectTaskRepository _projectTaskRepository;
|
||
private readonly IUnitOfWork _unitOfWork;
|
||
private readonly IAuthHelper _authHelper;
|
||
private long? _userId;
|
||
|
||
|
||
public SetTimeProjectCommandHandler(
|
||
IProjectRepository projectRepository,
|
||
IProjectPhaseRepository projectPhaseRepository,
|
||
IProjectTaskRepository projectTaskRepository,
|
||
IUnitOfWork unitOfWork, IAuthHelper authHelper)
|
||
{
|
||
_projectRepository = projectRepository;
|
||
_projectPhaseRepository = projectPhaseRepository;
|
||
_projectTaskRepository = projectTaskRepository;
|
||
_unitOfWork = unitOfWork;
|
||
_authHelper = authHelper;
|
||
_userId = authHelper.GetCurrentUserId();
|
||
}
|
||
|
||
public async Task<OperationResult> Handle(SetTimeProjectCommand request, CancellationToken cancellationToken)
|
||
{
|
||
switch (request.Level)
|
||
{
|
||
case ProjectHierarchyLevel.Task:
|
||
return await SetTimeForProjectTask(request, cancellationToken);
|
||
default:
|
||
return OperationResult.Failure("سطح پروژه نامعتبر است");
|
||
}
|
||
}
|
||
|
||
private async Task<OperationResult> SetTimeForProject(SetTimeProjectCommand request,
|
||
CancellationToken cancellationToken)
|
||
{
|
||
var project = await _projectRepository.GetWithFullHierarchyAsync(request.Id);
|
||
if (project == null)
|
||
{
|
||
return OperationResult.NotFound("پروژه یافت نشد");
|
||
return OperationResult.NotFound("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>");
|
||
}
|
||
|
||
long? addedByUserId = _userId;
|
||
|
||
// تنظیم زمان برای تمام sections در تمام فازها و تسکهای پروژه
|
||
foreach (var phase in project.Phases)
|
||
{
|
||
foreach (var task in phase.Tasks)
|
||
{
|
||
foreach (var section in task.Sections)
|
||
{
|
||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
||
if (sectionItem != null)
|
||
{
|
||
SetSectionTime(section, sectionItem, addedByUserId);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||
return OperationResult.Success();
|
||
}
|
||
|
||
private async Task<OperationResult> SetTimeForProjectPhase(SetTimeProjectCommand request,
|
||
CancellationToken cancellationToken)
|
||
{
|
||
var phase = await _projectPhaseRepository.GetWithTasksAsync(request.Id);
|
||
if (phase == null)
|
||
{
|
||
return OperationResult.NotFound("فاز پروژه یافت نشد");
|
||
return OperationResult.NotFound("<22><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>");
|
||
}
|
||
|
||
long? addedByUserId = _userId;
|
||
|
||
// تنظیم زمان برای تمام sections در تمام تسکهای این فاز
|
||
foreach (var task in phase.Tasks)
|
||
{
|
||
foreach (var section in task.Sections)
|
||
{
|
||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
||
if (sectionItem != null)
|
||
{
|
||
SetSectionTime(section, sectionItem, addedByUserId);
|
||
}
|
||
}
|
||
}
|
||
|
||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||
return OperationResult.Success();
|
||
}
|
||
|
||
private async Task<OperationResult> SetTimeForProjectTask(SetTimeProjectCommand request,
|
||
CancellationToken cancellationToken)
|
||
{
|
||
var task = await _projectTaskRepository.GetWithSectionsAsync(request.Id);
|
||
if (task == null)
|
||
{
|
||
return OperationResult.NotFound("تسک یافت نشد");
|
||
}
|
||
|
||
long? addedByUserId = _userId;
|
||
|
||
// تنظیم زمان مستقیماً برای sections این تسک
|
||
foreach (var section in task.Sections)
|
||
{
|
||
var sectionItem = request.SectionItems.FirstOrDefault(si => si.SectionId == section.Id);
|
||
if (sectionItem != null)
|
||
{
|
||
SetSectionTime(section, sectionItem, addedByUserId);
|
||
}
|
||
}
|
||
|
||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||
return OperationResult.Success();
|
||
}
|
||
|
||
private void SetSectionTime(TaskSection section, SetTimeProjectSectionItem sectionItem, long? addedByUserId)
|
||
{
|
||
var initData = sectionItem.InitData;
|
||
var initialTime = TimeSpan.FromHours(initData.Hours);
|
||
|
||
if (initialTime <= TimeSpan.Zero)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// تنظیم زمان اولیه
|
||
section.UpdateInitialEstimatedHours(initialTime, initData.Description);
|
||
|
||
section.ClearAdditionalTimes();
|
||
// افزودن زمانهای اضافی
|
||
foreach (var additionalTime in sectionItem.AdditionalTime)
|
||
{
|
||
var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours);
|
||
section.AddAdditionalTime(additionalTimeSpan, additionalTime.Description, addedByUserId);
|
||
}
|
||
}
|
||
|
||
// private void SetSectionTime(ProjectSection section, SetTimeProjectSectionItem sectionItem, long? addedByUserId)
|
||
// {
|
||
// var initData = sectionItem.InitData;
|
||
// var initialTime = TimeSpan.FromHours(initData.Hours);
|
||
//
|
||
// // تنظیم زمان اولیه
|
||
// section.UpdateInitialEstimatedHours(initialTime, initData.Description);
|
||
//
|
||
// section.ClearAdditionalTimes();
|
||
// // افزودن زمانهای اضافی
|
||
// foreach (var additionalTime in sectionItem.AdditionalTime)
|
||
// {
|
||
// var additionalTimeSpan = TimeSpan.FromHours(additionalTime.Hours);
|
||
// section.AddAdditionalTime(additionalTimeSpan, additionalTime.Description, addedByUserId);
|
||
// }
|
||
// }
|
||
} |