diff --git a/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java index 218e6bb351..212eea2a9c 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java @@ -145,10 +145,10 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO) boolean submitDateUpdateAttempted = !Objects.equals(originalFeedback.getSubmitDate(), feedbackRequest.getSubmitDate()); // If a status update is made to anything other than submitted by the requestee, throw an error. - if (!feedbackRequest.getStatus().equals("submitted") && !Objects.equals(originalFeedback.getStatus(), feedbackRequest.getStatus())) { - if (currentUserServices.getCurrentUser().getId().equals(originalFeedback.getRequesteeId())) { - throw new PermissionException(NOT_AUTHORIZED_MSG); - } + if (!"submitted".equals(feedbackRequest.getStatus()) + && !Objects.equals(originalFeedback.getStatus(), feedbackRequest.getStatus()) + && currentUserServices.getCurrentUser().getId().equals(originalFeedback.getRequesteeId())) { + throw new PermissionException(NOT_AUTHORIZED_MSG); } if (reassignAttempted) { @@ -270,7 +270,8 @@ public List findByValues(UUID creatorId, UUID requesteeId, UUID } private boolean isSupervisor(UUID requesteeId, UUID currentUserId) { - return requesteeId != null ? memberProfileServices.getSupervisorsForId(requesteeId).stream().filter(profile -> currentUserId.equals(profile.getId())).findAny().isPresent() : false; + return requesteeId != null + && memberProfileServices.getSupervisorsForId(requesteeId).stream().anyMatch(profile -> currentUserId.equals(profile.getId())); } private boolean createIsPermitted(UUID requesteeId) { @@ -313,12 +314,8 @@ private boolean isCurrentUserAdminOrOwner(FeedbackRequest feedbackRequest) { private boolean updateSubmitDateIsPermitted(FeedbackRequest feedbackRequest) { boolean isAdmin = currentUserServices.isAdmin(); UUID currentUserId = currentUserServices.getCurrentUser().getId(); - if (isAdmin) { + if (isAdmin || (currentUserId.equals(feedbackRequest.getCreatorId()) && feedbackRequest.getSubmitDate() != null)) { return true; - } else if (currentUserId.equals(feedbackRequest.getCreatorId())) { - if (feedbackRequest.getSubmitDate() != null) { - return true; - } } return currentUserId.equals(feedbackRequest.getRecipientId()); diff --git a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillLevelDTO.java b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillLevelDTO.java index 3f503329b1..df4ecb2f2f 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillLevelDTO.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillLevelDTO.java @@ -4,13 +4,17 @@ import io.micronaut.core.annotation.Nullable; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.UUID; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor @Introspected public class SkillLevelDTO { diff --git a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java index e7d922e3a5..e37ba880f9 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java @@ -32,53 +32,54 @@ public SkillsReportServicesImpl(MemberSkillRepository memberSkillRepo, public @NotNull SkillsReportResponseDTO report(@NotNull SkillsReportRequestDTO request) { - SkillsReportResponseDTO response = null; - if (request != null) { - final List skills = request.getSkills(); - final Set members = request.getMembers(); - final Boolean inclusive = request.isInclusive(); - - for (SkillLevelDTO skill : skills) { - if (!skillRepo.existsById(skill.getId())) { - throw new BadArgException(String.format("Invalid skill ID %s", skill.getId())); - } - } + final List skills = request.getSkills(); + final Set members = request.getMembers(); + final boolean inclusive = Boolean.TRUE.equals(request.isInclusive()); - if (members != null) { - for (UUID member : members) { - if (!memberProfileRepo.existsById(member)) { - throw new BadArgException(String.format("Invalid member profile ID %s", member)); - } - } - } + validateSkills(skills); + validateMembers(members); - response = new SkillsReportResponseDTO(); + SkillsReportResponseDTO response = new SkillsReportResponseDTO(); - final List potentialMembers = getPotentialQualifyingMembers(skills); - if (members == null || members.isEmpty()) { - if (inclusive == null || !inclusive) { - response.setTeamMembers(potentialMembers); - } else { - final List qualifiedMembers = getMembersSatisfyingAllSkills(potentialMembers, skills); - response.setTeamMembers(qualifiedMembers); - } + final List potentialMembers = getPotentialQualifyingMembers(skills); + if (members == null || members.isEmpty()) { + if (inclusive) { + response.setTeamMembers(getMembersSatisfyingAllSkills(potentialMembers, skills)); + } else { + response.setTeamMembers(potentialMembers); + } + } else { + final List membersInList = removeMembersNotRequested(potentialMembers, members); + if (inclusive) { + response.setTeamMembers(getMembersSatisfyingAllSkills(membersInList, skills)); } else { - final List membersInList = removeMembersNotRequested(potentialMembers, members); - if (inclusive == null || !inclusive) { - response.setTeamMembers(membersInList); - } else { - final List qualifiedMembers = getMembersSatisfyingAllSkills(membersInList, skills); - response.setTeamMembers(qualifiedMembers); + response.setTeamMembers(membersInList); + } + } + return response; + } + + private void validateMembers(Set members) { + if (members != null) { + for (UUID member : members) { + if (!memberProfileRepo.existsById(member)) { + throw new BadArgException(String.format("Invalid member profile ID %s", member)); } } } + } - return response; + private void validateSkills(List skills) { + for (SkillLevelDTO skill : skills) { + if (!skillRepo.existsById(skill.getId())) { + throw new BadArgException(String.format("Invalid skill ID %s", skill.getId())); + } + } } private List getPotentialQualifyingMembers(List skills) { // Get all member_skill entries that satisfy a requested skill - final List entries = new ArrayList<>(); + List entries = new ArrayList<>(); for (SkillLevelDTO skill : skills) { if (skill.getId() == null) { @@ -86,12 +87,10 @@ private List getPotentialQualifyingMembers(List temp = memberSkillRepo.findBySkillid(skill.getId()); - if (skill.getLevel() != null && temp.size() > 0) { + if (skill.getLevel() != null && !temp.isEmpty()) { for (MemberSkill memSkill : temp) { - if (memSkill.getSkilllevel() != null) { - if (isSkillLevelSatisfied(memSkill.getSkilllevel(), skill.getLevel())) { - entries.add(memSkill); - } + if (memSkill.getSkilllevel() != null && isSkillLevelSatisfied(memSkill.getSkilllevel(), skill.getLevel())) { + entries.add(memSkill); } } } else { @@ -101,33 +100,29 @@ private List getPotentialQualifyingMembers(List map = collectEntries(entries); + + return new ArrayList<>(map.values()); + } + + private HashMap collectEntries(List entries) { final HashMap map = new HashMap<>(); + for (MemberSkill ms : entries) { final UUID memberId = ms.getMemberid(); - final SkillLevelDTO skill = new SkillLevelDTO(); - skill.setId(ms.getSkillid()); - skill.setLevel(SkillLevel.convertFromString(ms.getSkilllevel())); - - if (map.containsKey(memberId)) { - final TeamMemberSkillDTO dto = map.get(memberId); - dto.getSkills().add(skill); - } else { - final TeamMemberSkillDTO dto = new TeamMemberSkillDTO(); - dto.setId(memberId); - - final MemberProfile memProfile = memberProfileServices.getById(memberId); - final String memberName = MemberProfileUtils.getFullName(memProfile); - dto.setName(memberName); - final List memberSkills = new ArrayList<>(); - memberSkills.add(skill); - dto.setSkills(memberSkills); + final SkillLevelDTO skill = new SkillLevelDTO(ms.getSkillid(), SkillLevel.convertFromString(ms.getSkilllevel())); - map.put(memberId, dto); - } + var dto = map.computeIfAbsent(memberId, mId -> + new TeamMemberSkillDTO( + mId, + MemberProfileUtils.getFullName(memberProfileServices.getById(mId)), + new ArrayList<>() + ) + ); + dto.getSkills().add(skill); } - - return new ArrayList<>(map.values()); + return map; } private List getMembersSatisfyingAllSkills(List potentialMembers, diff --git a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/TeamMemberSkillDTO.java b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/TeamMemberSkillDTO.java index 8cfd2164dc..039db5dc63 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/TeamMemberSkillDTO.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/TeamMemberSkillDTO.java @@ -4,7 +4,9 @@ import io.micronaut.core.annotation.Nullable; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.List; @@ -13,7 +15,10 @@ @Getter @Setter @Introspected +@AllArgsConstructor +@NoArgsConstructor public class TeamMemberSkillDTO { + @NotNull @Schema(description = "UUID of the team member profile") private UUID id; @@ -25,6 +30,5 @@ public class TeamMemberSkillDTO { @NotNull @Schema(description = "Skills of the team member") private List skills; - } diff --git a/server/src/main/java/com/objectcomputing/checkins/services/memberprofile/retentionreport/RetentionReportServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/memberprofile/retentionreport/RetentionReportServicesImpl.java index 619c9ccb2d..ea8e5f5259 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/memberprofile/retentionreport/RetentionReportServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/memberprofile/retentionreport/RetentionReportServicesImpl.java @@ -45,34 +45,21 @@ public RetentionReportResponseDTO report(RetentionReportDTO request) { private LocalDate getIntervalStartDate(LocalDate periodStartDate, FrequencyType frequency) { LocalDate startDate; - if (frequency == FrequencyType.DAILY) { - startDate = periodStartDate; - } else if (frequency == FrequencyType.WEEKLY) { - DayOfWeek day = periodStartDate.getDayOfWeek(); - switch (day) { - case SUNDAY: - startDate = periodStartDate.plusDays(6); - break; - case MONDAY: - startDate = periodStartDate.plusDays(5); - break; - case TUESDAY: - startDate = periodStartDate.plusDays(4); - break; - case WEDNESDAY: - startDate = periodStartDate.plusDays(3); - break; - case THURSDAY: - startDate = periodStartDate.plusDays(2); - break; - case FRIDAY: - startDate = periodStartDate.plusDays(1); - break; - default: - startDate = periodStartDate; + switch (frequency) { + case FrequencyType.DAILY -> startDate = periodStartDate; + case FrequencyType.WEEKLY -> { + DayOfWeek day = periodStartDate.getDayOfWeek(); + startDate = switch (day) { + case SUNDAY -> periodStartDate.plusDays(6); + case MONDAY -> periodStartDate.plusDays(5); + case TUESDAY -> periodStartDate.plusDays(4); + case WEDNESDAY -> periodStartDate.plusDays(3); + case THURSDAY -> periodStartDate.plusDays(2); + case FRIDAY -> periodStartDate.plusDays(1); + default -> periodStartDate; + }; } - } else { - startDate = periodStartDate.withDayOfMonth(periodStartDate.lengthOfMonth()); + default -> startDate = periodStartDate.withDayOfMonth(periodStartDate.lengthOfMonth()); } return startDate; @@ -84,28 +71,15 @@ private LocalDate getIntervalEndDate(LocalDate periodEndDate, FrequencyType freq endDate = periodEndDate; } else if (frequency == FrequencyType.WEEKLY) { DayOfWeek day = periodEndDate.getDayOfWeek(); - switch (day) { - case SUNDAY: - endDate = periodEndDate.minusDays(1); - break; - case MONDAY: - endDate = periodEndDate.minusDays(2); - break; - case TUESDAY: - endDate = periodEndDate.minusDays(3); - break; - case WEDNESDAY: - endDate = periodEndDate.minusDays(4); - break; - case THURSDAY: - endDate = periodEndDate.minusDays(5); - break; - case FRIDAY: - endDate = periodEndDate.minusDays(6); - break; - default: - endDate = periodEndDate.minusDays(7); - } + endDate = switch (day) { + case SUNDAY -> periodEndDate.minusDays(1); + case MONDAY -> periodEndDate.minusDays(2); + case TUESDAY -> periodEndDate.minusDays(3); + case WEDNESDAY -> periodEndDate.minusDays(4); + case THURSDAY -> periodEndDate.minusDays(5); + case FRIDAY -> periodEndDate.minusDays(6); + default -> periodEndDate.minusDays(7); + }; } else { LocalDate newDate = periodEndDate.minusMonths(1); endDate = newDate.withDayOfMonth(newDate.lengthOfMonth()); @@ -163,12 +137,10 @@ private RetentionReportResponseDTO getReportValues(LocalDate periodStartDate, Lo public float getTurnoverRate(LocalDate dateToStudy, List memberProfiles, FrequencyType frequency) { LocalDate beginningDate; - if (frequency == FrequencyType.DAILY) { - beginningDate = dateToStudy.minusDays(1); - } else if (frequency == FrequencyType.WEEKLY) { - beginningDate = dateToStudy.minusMonths(1); - } else { - beginningDate = dateToStudy.minusMonths(1); + switch (frequency) { + case FrequencyType.DAILY -> beginningDate = dateToStudy.minusDays(1); + case FrequencyType.WEEKLY -> beginningDate = dateToStudy.minusMonths(1); + default -> beginningDate = dateToStudy.minusMonths(1); } float beginningEmployees = getNumberOfEmployees(beginningDate, memberProfiles); float endingEmployees = getNumberOfEmployees(dateToStudy, memberProfiles); @@ -178,12 +150,10 @@ public float getTurnoverRate(LocalDate dateToStudy, List memberPr public float getVoluntaryTurnoverRate(LocalDate dateToStudy, List memberProfiles, FrequencyType frequency) { LocalDate beginningDate; - if (frequency == FrequencyType.DAILY) { - beginningDate = dateToStudy.minusDays(1); - } else if (frequency == FrequencyType.WEEKLY) { - beginningDate = dateToStudy.minusMonths(1); - } else { - beginningDate = dateToStudy.minusMonths(1); + switch (frequency) { + case FrequencyType.DAILY -> beginningDate = dateToStudy.minusDays(1); + case FrequencyType.WEEKLY -> beginningDate = dateToStudy.minusMonths(1); + default -> beginningDate = dateToStudy.minusMonths(1); } float beginningEmployees = getNumberOfEmployees(beginningDate, memberProfiles); float endingEmployees = getNumberOfEmployees(dateToStudy, memberProfiles); @@ -227,11 +197,11 @@ public float getNewHireRetentionRate(LocalDate dateToStudy, List public int getNumberOfEmployees(LocalDate dateToStudy, List memberProfiles) { int numberOfEmployees = 0; for (MemberProfile mp : memberProfiles) { - if (mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getStartDate() != null && (mp.getStartDate().isBefore(dateToStudy) || mp.getStartDate().isEqual(dateToStudy)) && - (mp.getTerminationDate() == null || mp.getTerminationDate().isAfter(dateToStudy))) { - numberOfEmployees += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getStartDate() != null + && (mp.getStartDate().isBefore(dateToStudy) || mp.getStartDate().isEqual(dateToStudy)) + && (mp.getTerminationDate() == null || mp.getTerminationDate().isAfter(dateToStudy))) { + numberOfEmployees += 1; } } return numberOfEmployees; @@ -240,10 +210,10 @@ public int getNumberOfEmployees(LocalDate dateToStudy, List membe public int getNumberOfNewHires(LocalDate dateToStudy, List memberProfiles) { int numberOfEmployees = 0; for (MemberProfile mp : memberProfiles) { - if (mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getStartDate() != null && (mp.getStartDate().isAfter(dateToStudy) || mp.getStartDate().isEqual(dateToStudy))) { - numberOfEmployees += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getStartDate() != null + && (mp.getStartDate().isAfter(dateToStudy) || mp.getStartDate().isEqual(dateToStudy))) { + numberOfEmployees += 1; } } @@ -254,11 +224,11 @@ public int getTerminationsForMonth(LocalDate dateToStudy, List me int numberOfTerms = 0; LocalDate beginningDate = dateToStudy.minusMonths(1); for (MemberProfile mp : memberProfiles) { - if (mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getTerminationDate() != null && mp.getTerminationDate().isAfter(beginningDate) && - (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { - numberOfTerms += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getTerminationDate() != null + && mp.getTerminationDate().isAfter(beginningDate) + && (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { + numberOfTerms += 1; } } return numberOfTerms; @@ -268,12 +238,12 @@ public int getVoluntaryTerminationsForMonth(LocalDate dateToStudy, List mem int numberOfTerms = 0; LocalDate beginningDate = dateToStudy.minusYears(1); for (MemberProfile mp : memberProfiles) { - if (mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getTerminationDate() != null && mp.getTerminationDate().isAfter(beginningDate) && - (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { - numberOfTerms += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getTerminationDate() != null + && mp.getTerminationDate().isAfter(beginningDate) + && (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { + numberOfTerms += 1; } } return numberOfTerms; @@ -297,13 +267,12 @@ public int getVoluntaryTerminationsForYear(LocalDate dateToStudy, List mem int numberOfTerms = 0; LocalDate beginningDate = dateToStudy.minusYears(1); for (MemberProfile mp : memberProfiles) { - if (mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getStartDate() != null && (mp.getStartDate().isEqual(beginningDate) || mp.getStartDate().isAfter(beginningDate)) && - mp.getTerminationDate() != null && - (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { - numberOfTerms += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getStartDate() != null + && (mp.getStartDate().isEqual(beginningDate) || mp.getStartDate().isAfter(beginningDate)) + && mp.getTerminationDate() != null + && (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { + numberOfTerms += 1; } } return numberOfTerms; @@ -328,13 +297,12 @@ public int getTerminationsWithinYear(LocalDate dateToStudy, List int numberOfTerms = 0; LocalDate beginningDate = dateToStudy.minusYears(1); for (MemberProfile mp : memberProfiles) { - if(mp.getExcluded() == null || !mp.getExcluded()) { - if (mp.getStartDate() != null && (mp.getStartDate().isEqual(beginningDate) || - mp.getStartDate().isAfter(beginningDate)) - && mp.getTerminationDate() != null && - (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { - numberOfTerms += 1; - } + if (!Boolean.TRUE.equals(mp.getExcluded()) + && mp.getStartDate() != null + && (mp.getStartDate().isEqual(beginningDate) || mp.getStartDate().isAfter(beginningDate)) + && mp.getTerminationDate() != null + && (mp.getTerminationDate().isBefore(dateToStudy) || mp.getTerminationDate().isEqual(dateToStudy))) { + numberOfTerms += 1; } } return numberOfTerms; @@ -344,17 +312,15 @@ public int getVoluntaryTerminationsWithinYear(LocalDate dateToStudy, List