Commit 40cb6832 authored by hasan khaddour's avatar hasan khaddour

fix s/.

parent bca956a3
......@@ -17,6 +17,7 @@ using PSManagement.Application.Projects.UseCases.Commands.AddProjectStep;
using PSManagement.Application.Projects.UseCases.Commands.ChangeProjectTeamLeader;
using PSManagement.Application.Projects.UseCases.Commands.ApproveProject;
using PSManagement.Application.Projects.UseCases.Queries.GetParticipants;
using PSManagement.Application.Projects.UseCases.Queries.GetProjectAttachments;
namespace PSManagement.Api.Controllers.Projects
{
......@@ -56,7 +57,7 @@ namespace PSManagement.Api.Controllers.Projects
}
[HttpGet("ByProjectManager")]
public async Task<IActionResult> GetByBrojectManager(GetProjectsByProjectManagerRequest request )
public async Task<IActionResult> GetByBrojectManager([FromQuery] GetProjectsByProjectManagerRequest request )
{
GetProjectsByFilterQuery query = _mapper.Map<GetProjectsByFilterQuery>(request);
......@@ -173,5 +174,15 @@ namespace PSManagement.Api.Controllers.Projects
return Ok(result);
}
[HttpGet("Attachments{id}")]
public async Task<IActionResult> GetAttachments([FromQuery]GetProjectAttachmentsRequest request)
{
var query = _mapper.Map<GetProjectAttachmentsQuery>(request);
var result = await _sender.Send(query);
return Ok(_mapper.Map<Result<IEnumerable<AttachmentReponse>>>(result));
}
}
}
......@@ -42,7 +42,7 @@ namespace PSManagement.Api.Controllers.Steps
}
[HttpGet("ByProject")]
public async Task<IActionResult> GetByProject(GetStepsByProjectRequest request)
public async Task<IActionResult> GetByProject([FromQuery] GetStepsByProjectRequest request)
{
GetStepsByProjectQuery query = _mapper.Map<GetStepsByProjectQuery>(request);
......@@ -66,7 +66,7 @@ namespace PSManagement.Api.Controllers.Steps
[HttpGet("StepTrackHistory")]
public async Task<IActionResult> Get(GetStepTrackHistoryRequest request)
public async Task<IActionResult> Get([FromQuery] GetStepTrackHistoryRequest request)
{
var query =_mapper.Map<GetStepTrackHistoryQuery>(request);
......
......@@ -66,7 +66,7 @@ namespace PSManagement.Api.Controllers.Tracks
}
[HttpGet("GetTracksByProject")]
public async Task<IActionResult> GetTracksByProject(GetTracksByProjectRequest request)
public async Task<IActionResult> GetTracksByProject([FromQuery] GetTracksByProjectRequest request)
{
var query = _mapper.Map<GetTracksByProjectQuery>(request);
......@@ -100,7 +100,7 @@ namespace PSManagement.Api.Controllers.Tracks
{
var command = _mapper.Map<CompleteTrackCommand>(request);
var result = _mapper.Map<Result>(await _sender.Send(command));
var result =await _sender.Send(command);
return Ok(result);
}
......@@ -110,7 +110,7 @@ namespace PSManagement.Api.Controllers.Tracks
{
var command = _mapper.Map<RemoveTrackCommand>(request);
var result = _mapper.Map<Result>(await _sender.Send(command));
var result =await _sender.Send(command);
return Ok(result);
}
......@@ -144,7 +144,7 @@ namespace PSManagement.Api.Controllers.Tracks
{
var command = _mapper.Map<UpdateEmployeeWorkTrackCommand>(request);
var result = _mapper.Map<Result>(await _sender.Send(command));
var result =await _sender.Send(command);
return Ok(result);
}
......@@ -153,7 +153,7 @@ namespace PSManagement.Api.Controllers.Tracks
{
var command = _mapper.Map<UpdateStepTrackCommand>(request);
var result = _mapper.Map<Result>(await _sender.Send(command));
var result = await _sender.Send(command);
return Ok(result);
}
......
......@@ -12,10 +12,12 @@ using PSManagement.Application.Projects.UseCases.Commands.ChangeProjectTeamLeade
using PSManagement.Application.Projects.UseCases.Commands.CreateProject;
using PSManagement.Application.Projects.UseCases.Commands.RemoveParticipant;
using PSManagement.Application.Projects.UseCases.Queries.ListAllProject;
using PSManagement.Application.Tracks.Common;
using PSManagement.Contracts.Customers.Requests;
using PSManagement.Contracts.Customers.Responses;
using PSManagement.Contracts.Projects.Requests;
using PSManagement.Contracts.Projects.Response;
using PSManagement.Contracts.Tracks.Response;
using PSManagement.SharedKernel.Utilities;
using System;
using System.Collections.Generic;
......@@ -53,10 +55,13 @@ namespace PSManagement.Api.Mappers
CreateMap<AddProjectStepRequest, AddProjectStepCommand>().ReverseMap();
CreateMap<ChangeProjectTeamLeaderRequest, ChangeProjectTeamLeaderCommand>().ReverseMap();
CreateMap<RemoveParticipantRequest, RemoveParticipantCommand>().ReverseMap();
CreateMap<ProjectDTO,ProjectResponse>().ReverseMap();
CreateMap<EmployeeResponse, EmployeeDTO>().ReverseMap();
CreateMap<EmployeeParticipateResponse, EmployeeParticipateDTO>().ReverseMap();
CreateMap<TrackDTO, TrackResponse>().ReverseMap();
}
}
}
......@@ -5,6 +5,9 @@ using PSManagement.Application.FinancialSpends.Common;
using PSManagement.Application.FinancialSpends.UseCases.Commands.CreateFinancialSpendItem;
using PSManagement.Application.Projects.Common;
using PSManagement.Application.Tracks.Common;
using PSManagement.Application.Tracks.UseCaes.Commands.AddEmployeeTrack;
using PSManagement.Application.Tracks.UseCaes.Commands.AddStepTrack;
using PSManagement.Application.Tracks.UseCaes.Commands.CreateTrack;
using PSManagement.Domain.Customers.Entities;
using PSManagement.Domain.Customers.ValueObjects;
using PSManagement.Domain.Employees.Entities;
......@@ -53,6 +56,12 @@ namespace PSManagement.Application.Mappers
CreateMap<Track, TrackDTO>();
CreateMap<CreateTrackCommand, Track>().ReverseMap();
CreateMap<AddEmployeeTrackCommand, EmployeeTrack>().ReverseMap();
CreateMap<AddStepTrackCommand, StepTrack>()
.ForMember(e => e.OldExecutionRatio, op => op.Ignore());
CreateMap<FinancialSpendingDTO, FinancialSpending>().ReverseMap();
......
using Ardalis.Result;
using PSManagement.Application.Contracts.Storage;
using PSManagement.Domain.Projects.Builders;
using PSManagement.Domain.Projects.DomainErrors;
using PSManagement.Domain.Projects.Entities;
using PSManagement.Domain.Projects.Repositories;
using PSManagement.SharedKernel.CQRS.Command;
......@@ -16,20 +17,28 @@ namespace PSManagement.Application.Projects.UseCases.Commands.AddAttachment
private readonly IFileService _fileService;
private readonly IRepository<Attachment> _attachmentRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IProjectsRepository _projectsRepository;
public AddAttachmentCommandHandler(
IFileService fileService,
IRepository<Attachment> repository,
IUnitOfWork unitOfWork)
IUnitOfWork unitOfWork,
IProjectsRepository projectsRepository)
{
_fileService = fileService;
_attachmentRepository = repository;
_unitOfWork = unitOfWork;
_projectsRepository = projectsRepository;
}
public async Task<Result<int>> Handle(AddAttachmentCommand request, CancellationToken cancellationToken)
{
Result<string> pathResult = await _fileService.StoreFile(request.AttachmentName+Guid.NewGuid(),request.File);
Project project = await _projectsRepository.GetByIdAsync(request.ProjectId);
if (project is null) {
return Result.Invalid(ProjectsErrors.InvalidEntryError);
}
if (pathResult.IsSuccess)
{
Attachment attachment = new(pathResult.Value, request.AttachmentName, request.AttachmentDescription, request.ProjectId);
......
......@@ -48,7 +48,7 @@ namespace PSManagement.Application.Projects.UseCases.Commands.RemoveParticipant
return Result.Invalid(ProjectsErrors.ParticipantUnExistError);
}
var employeeParticipate =project.EmployeeParticipates.Where(e => e.ProjectId == request.ParticipantId).FirstOrDefault();
var employeeParticipate =project.EmployeeParticipates.Where(e => e.EmployeeId == request.ParticipantId).FirstOrDefault();
if (employeeParticipate is null) {
return Result.Invalid(ProjectsErrors.ParticipantUnExistError);
......
......@@ -15,7 +15,8 @@ namespace PSManagement.Application.Tracks.Common
public TrackInfo TrackInfo { get; set; }
public String ExecutionState { get; set; }
public int ExecutionRatio { get; set; }
public int TrackExecutionRatio { get; set; }
public int OldExecutionRatio { get; set; }
}
}
\ No newline at end of file
......@@ -9,6 +9,6 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.AddStepTrack
int TrackId,
string ExecutionState,
DateTime TrackDate,
int ExecutionRatio
int TrackExecutionRatio
) : ICommand<Result<int>>;
}
\ No newline at end of file
using Ardalis.Result;
using AutoMapper;
using PSManagement.Domain.Projects.DomainErrors;
using PSManagement.Domain.Projects.Entities;
using PSManagement.Domain.Projects.Repositories;
using PSManagement.Domain.Steps.Repositories;
using PSManagement.Domain.Tracking;
using PSManagement.Domain.Tracking.DomainErrors;
......@@ -22,18 +25,21 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.AddStepTrack
private readonly IUnitOfWork _unitOfWork;
private readonly IMapper _mapper;
private readonly BaseSpecification<Track> _specification;
private readonly IStepsRepository _stepsRepository;
public AddStepTrackCommandHandler(
IUnitOfWork unitOfWork,
ITracksRepository tracksRepository,
IRepository<StepTrack> stepTracksRepository,
IMapper mapper)
IMapper mapper,
IStepsRepository stepsRepository)
{
_unitOfWork = unitOfWork;
_tracksRepository = tracksRepository;
_stepTracksRepository = stepTracksRepository;
_mapper = mapper;
_specification = new TrackSpecification();
_stepsRepository = stepsRepository;
}
public async Task<Result<int>> Handle(AddStepTrackCommand request, CancellationToken cancellationToken)
......@@ -59,8 +65,17 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.AddStepTrack
return Result.Invalid(TracksErrors.StepTrackExistError);
}
Step step = await _stepsRepository.GetByIdAsync(request.StepId);
if (step is null) {
StepTrack stepTrack = await _stepTracksRepository.AddAsync(_mapper.Map<StepTrack>(request));
return Result.Invalid(StepsErrors.InvalidEntryError);
}
StepTrack stepTrack = _mapper.Map<StepTrack>(request);
stepTrack.OldExecutionRatio = step.CurrentCompletionRatio;
stepTrack = await _stepTracksRepository.AddAsync(stepTrack);
await _unitOfWork.SaveChangesAsync();
......
using Ardalis.Result;
using AutoMapper;
using PSManagement.Domain.Employees.Repositories;
using PSManagement.Domain.Projects.Entities;
using PSManagement.Domain.Projects.Repositories;
using PSManagement.Domain.Steps.Repositories;
using PSManagement.Domain.Tracking;
using PSManagement.Domain.Tracking.DomainErrors;
using PSManagement.Domain.Tracking.DomainEvents;
using PSManagement.Domain.Tracking.Entities;
using PSManagement.Domain.Tracking.Specification;
using PSManagement.SharedKernel.CQRS.Command;
using PSManagement.SharedKernel.Interfaces;
using PSManagement.SharedKernel.Specification;
using System.Threading;
using System.Threading.Tasks;
......@@ -14,22 +20,34 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.CompleteTrack
public class CompleteTrackCommandHandler : ICommandHandler<CompleteTrackCommand, Result>
{
private readonly ITracksRepository _tracksRepository;
private readonly IStepsRepository _stepsRepository;
private readonly IEmployeesRepository _employeesRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly BaseSpecification<Track> _specification;
public CompleteTrackCommandHandler(
IUnitOfWork unitOfWork,
ITracksRepository tracksRepository
)
ITracksRepository tracksRepository,
IStepsRepository stepsRepository,
IEmployeesRepository employeesRepository)
{
_unitOfWork = unitOfWork;
_specification = new TrackSpecification();
_tracksRepository = tracksRepository;
_stepsRepository = stepsRepository;
_employeesRepository = employeesRepository;
}
public async Task<Result> Handle(CompleteTrackCommand request, CancellationToken cancellationToken)
{
Track track = await _tracksRepository.GetByIdAsync(request.TrackId);
_specification.AddInclude(e => e.StepTracks);
_specification.AddInclude(e => e.EmployeeTracks);
_specification.AddInclude("EmployeeTracks.Employee");
Track track = await _tracksRepository.GetByIdAsync(request.TrackId,_specification);
if (track is null)
{
......@@ -38,6 +56,14 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.CompleteTrack
}
foreach (StepTrack stepTrack in track?.StepTracks) {
Step step =await _stepsRepository.GetByIdAsync(stepTrack.StepId);
step.CurrentCompletionRatio += stepTrack.TrackExecutionRatio;
}
track.Complete(request.CompletionDate);
await _unitOfWork.SaveChangesAsync();
......
......@@ -10,7 +10,7 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.UpdateStepTrack
int StepId,
string ExecutionState,
DateTime TrackDate,
int ExecutionRatio
int TrackExecutionRatio
) : ILoggableCommand<Result>;
}
......@@ -60,7 +60,7 @@ namespace PSManagement.Application.Tracks.UseCaes.Commands.UpdateStepTrack
return Result.Invalid(TracksErrors.InvalidEntryError);
}
stepTrack.ExecutionRatio = request.ExecutionRatio;
stepTrack.TrackExecutionRatio = request.TrackExecutionRatio;
stepTrack.ExecutionState = request.ExecutionState;
await _stepTracksRepository.UpdateAsync(stepTrack);
......
......@@ -8,5 +8,4 @@ namespace PSManagement.Contracts.Projects.Requests
String AttachmentDescription,
String AttachmentName,
IFormFile File);
}
namespace PSManagement.Contracts.Projects.Requests
{
public record GetProjectAttachmentsRequest(
int ProjectId,
int? PageNumber,
int? PageSize
);
}
using System;
using PSManagement.Domain.Tracking.ValueObjects;
using System;
namespace PSManagement.Contracts.Projects.Response
{
......@@ -7,7 +8,7 @@ namespace PSManagement.Contracts.Projects.Response
public int StepId { get; set; }
public int TrackId { get; set; }
public String ExecutionState { get; set; }
public DateTime TrackDate { get; set; }
public TrackInfo TrackInfo { get; set; }
public int ExecutionRatio { get; set; }
......
......@@ -11,6 +11,6 @@ namespace PSManagement.Contracts.Tracks.Requests
int TrackId,
string ExecutionState,
DateTime TrackDate,
int ExecutionRatio
int TrackExecutionRatio
);
}
......@@ -8,6 +8,6 @@ namespace PSManagement.Contracts.Tracks.Requests
int StepId,
string ExecutionState,
DateTime TrackDate,
int ExecutionRatio
int TrackExecutionRatio
);
}
......@@ -11,7 +11,8 @@ namespace PSManagement.Contracts.Tracks.Response
StepInfo StepInfo ,
TrackInfo TrackInfo,
String ExecutionState,
DateTime TrackDate ,
int ExecutionRatio
int TrackExecutionRatio,
int OldExecutionRatio
);
}
......@@ -5,7 +5,6 @@ namespace PSManagement.Contracts.Tracks.Response
{
public record TrackResponse (
int Id ,
bool IsCompleted ,
TrackInfo TrackInfo ,
String Notes ,
int ProjectId
......
......@@ -20,12 +20,25 @@ namespace PSManagement.Domain.Projects.Entities
public ProposalInfo ProposalInfo { get; set; }
public ProjectInfo ProjectInfo { get; set; }
public Aggreement ProjectAggreement { get; set; }
// state management
public string CurrentState { get; private set; } // Persisted in the database
[NotMapped]
private IProjectState _state;
private IProjectState _state ;
[NotMapped]
public IProjectState State {
get {
if (_state is null) {
SetStateFromString(CurrentState);
}
return _state;
}
set => _state = value;
}
// information about who lead and execute the project
public int TeamLeaderId { get; set; }
......@@ -100,7 +113,6 @@ namespace PSManagement.Domain.Projects.Entities
}
public Project()
{
SetStateFromString(CurrentState);
}
public void SetState(IProjectState newState)
{
......@@ -109,27 +121,27 @@ namespace PSManagement.Domain.Projects.Entities
}
public void Complete()
{
_state.Complete(this);
State.Complete(this);
}
public void Plan()
{
_state.Plan(this);
State.Plan(this);
}
public void Approve(Aggreement projectAggreement)
{
_state.Approve(this,projectAggreement);
State.Approve(this,projectAggreement);
}
public void Cancel(DateTime canellationTime)
{
_state.Cancel(this,canellationTime);
State.Cancel(this,canellationTime);
}
public void Propose()
{
_state.Propose(this);
State.Propose(this);
}
......
......@@ -12,8 +12,8 @@ namespace PSManagement.Domain.Tracking.Entities
public int TrackId { get; set; }
public Track Track { get; set; }
public String ExecutionState { get; set; }
public int ExecutionRatio { get; set; }
public int TrackExecutionRatio { get; set; }
public int OldExecutionRatio { get; set; }
public StepTrack()
{
......
......@@ -37,7 +37,8 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
}
);
builder.HasOne(e => e.TeamLeader)
.WithMany()
.HasForeignKey(e => e.TeamLeaderId)
......
......@@ -11,7 +11,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
table: "Projects",
type: "nvarchar(max)",
nullable: true,
defaultValueSql: "Proposed",
defaultValue: "Proposed",
oldClrType: typeof(string),
oldType: "nvarchar(max)",
oldNullable: true,
......
using Microsoft.EntityFrameworkCore.Migrations;
namespace PSManagement.Infrastructure.Persistence.Migrations
{
public partial class FixProjectEntity1 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "ExecutionRatio",
table: "StepTracks",
newName: "TrackExecutionRatio");
migrationBuilder.AddColumn<int>(
name: "OldExecutionRatio",
table: "StepTracks",
type: "int",
nullable: false,
defaultValue: 0);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "OldExecutionRatio",
table: "StepTracks");
migrationBuilder.RenameColumn(
name: "TrackExecutionRatio",
table: "StepTracks",
newName: "ExecutionRatio");
}
}
}
......@@ -483,15 +483,18 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int>("ExecutionRatio")
.HasColumnType("int");
b.Property<string>("ExecutionState")
.HasColumnType("nvarchar(max)");
b.Property<int>("OldExecutionRatio")
.HasColumnType("int");
b.Property<int>("StepId")
.HasColumnType("int");
b.Property<int>("TrackExecutionRatio")
.HasColumnType("int");
b.Property<int>("TrackId")
.HasColumnType("int");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment