/// <summary>
        /// this method will add employee to the project
        /// </summary>
        /// <param name="addEmployeeToProject">EmployeesInProjectDto object</param>
        /// <returns>returns the employee added to the project</returns>
        public async Task <EmployeesInProjectDto> AddEmployeeToProject(EmployeesInProjectDto addEmployeeToProject)
        {
            var employeeExists = await _projectManagementRepository.FindProjectEmployee(addEmployeeToProject.ProjectId, addEmployeeToProject.EmployeeDetails.EmployeeId);

            var requirement = await _projectRequirementsRepository.GetRequirement((Guid)addEmployeeToProject.RequirementId);

            if (employeeExists == null && requirement != null)
            {
                var employee = _mapper.Map <ProjectManagement>(addEmployeeToProject.EmployeeDetails);
                employee.ProjectId            = addEmployeeToProject.ProjectId;
                employee.RequirementId        = (Guid)addEmployeeToProject.RequirementId;
                requirement.ResourceAllocated = addEmployeeToProject.EmployeeDetails.EmployeeId;
                requirement.LastModifiedAt    = DateTime.UtcNow;
                //requirement.ModifiedBy = id; TODO
                requirement.IsFullfilled = true;

                using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    _projectManagementRepository.AddEmployeeToProject(employee);
                    await _projectManagementRepository.SaveChangesAsync();

                    await _projectRequirementsRepository.SaveChangesAsync();

                    ts.Complete();
                }
                return(addEmployeeToProject);
            }
            else if (employeeExists.IsDeleted == true && requirement != null)
            {
                employeeExists.IsDeleted               = false;
                employeeExists.ProjectManager          = addEmployeeToProject.EmployeeDetails.ProjectManager;
                employeeExists.ProjectReportingManager = addEmployeeToProject.EmployeeDetails.ProjectReportingManager;
                employeeExists.Role                = addEmployeeToProject.EmployeeDetails.Role;
                employeeExists.PrimaryStatus       = addEmployeeToProject.EmployeeDetails.PrimaryStatus;
                employeeExists.SecondaryStatus     = addEmployeeToProject.EmployeeDetails.SecondaryStatus;
                employeeExists.AllocationStartDate = addEmployeeToProject.EmployeeDetails.AllocationStartDate;
                employeeExists.AllocationEndDate   = addEmployeeToProject.EmployeeDetails.AllocationEndDate;
                employeeExists.IsManager           = addEmployeeToProject.EmployeeDetails.IsManager;
                employeeExists.RequirementId       = (Guid)addEmployeeToProject.RequirementId;

                requirement.ResourceAllocated = addEmployeeToProject.EmployeeDetails.EmployeeId;
                requirement.LastModifiedAt    = DateTime.UtcNow;
                //requirement.ModifiedBy = id; TODO
                requirement.IsFullfilled = true;

                using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                {
                    await _projectManagementRepository.SaveChangesAsync();

                    await _projectRequirementsRepository.SaveChangesAsync();

                    ts.Complete();
                }
                return(addEmployeeToProject);
            }
            throw new Exception("Employee already exists !");
        }
        /// <summary>
        /// this method is used to soft delete an existing employee's data in the system
        /// </summary>
        /// <param name="employeeId">id to indentify the employee to be deleted</param>
        public async Task DeleteEmployeeAsync(Guid employeeId)
        {
            var empId = await _employeeRepository.GetEmployeeByIdAsync(employeeId);

            if (empId == null)
            {
                throw new Exception("Employee not found");
            }
            empId.IsDeleted = true;

            await _employeeRepository.SaveChangesAsync();

            var empSkills = await _employeeSkillRepository.GetEmployeeSkills(empId.Id);

            if (empSkills == null)
            {
                throw new Exception("Employee skills not found");
            }
            empSkills.IsDeleted = true;
            await _employeeSkillRepository.SaveChangesAsync();

            //* These methods of Project management Service (RemoveProjectManagerForEmployee,RemoveReportingManagerForEmployee,RemoveEmployeeFromProject) should have been used but we could not call the interface because of cyclic dependency*//
            // this will set ProjectReportingManager to null for employee who had this Employee as an ProjectReportingManager
            var reportee = await _reportingManagerRepository.GetAllReporteeAsync(empId.Id);

            foreach (var employee in reportee)
            {
                var empDetails = await _reportingManagerRepository.GetReportingManager(employee);

                _reportingManagerRepository.DeleteRecord(empDetails);
                await _reportingManagerRepository.SaveChangesAsync();
            }
            var listOfReportees = await _projectManagementRepository.GetAllReporteeAsync(empId.Id);

            foreach (var employee in listOfReportees)
            {
                employee.ProjectReportingManager = null;
                await _projectManagementRepository.SaveChangesAsync();
            }
            var empProject = await _projectManagementRepository.GetAllProjectsOfEmployee(empId.Id);

            foreach (var project in empProject)
            {
                if (project.IsManager == true)
                {
                    var listOfEmployees = await _projectManagementRepository.GetEmployeesOfProjectManager(empId.Id);

                    foreach (var employee in listOfEmployees)
                    {
                        employee.ProjectManager = null;
                        await _projectManagementRepository.SaveChangesAsync();
                    }

                    var projectManagement = await _projectManagementRepository.FindProjectEmployee((Guid)project.ProjectId, empId.Id);

                    var projectRequirement = await _projectRequirementsRepository.GetRequirement(projectManagement.RequirementId);

                    projectManagement.IsDeleted         = true;
                    projectManagement.AllocationEndDate = DateTime.UtcNow;

                    if (projectRequirement != null)
                    {
                        projectRequirement.IsFullfilled = false;
                    }

                    using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                    {
                        await _projectManagementRepository.SaveChangesAsync();

                        await _projectRequirementsRepository.SaveChangesAsync();

                        ts.Complete();
                    }
                }
            }
        }