Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
d204718
Merge pull request #2084 from objectcomputing/develop
mkimberlin Dec 17, 2023
d790168
Merge pull request #2094 from objectcomputing/develop
mkimberlin Dec 18, 2023
0f8ac5e
Merge pull request #2098 from objectcomputing/develop
mkimberlin Jan 2, 2024
8b88e40
Merge pull request #2128 from objectcomputing/develop
mkimberlin Mar 15, 2024
3261365
Merge branch 'release/0.7.0'
mkimberlin Mar 25, 2024
092f86a
2363 - Notify new guild leaders
chrismckiernan May 31, 2024
c7eface
Forgot this change in 1948 PR
chrismckiernan May 31, 2024
8ebd838
Merge in origin develop
chrismckiernan May 31, 2024
dda5eae
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan May 31, 2024
98c15df
Working through bugs
chrismckiernan May 31, 2024
b0eb991
Fixed create not working
chrismckiernan May 31, 2024
a06b362
Peer review comments, log error when email not sent
chrismckiernan Jun 3, 2024
73acf60
Improving performance of guild leader send email
chrismckiernan Jun 3, 2024
e992db3
Merge branch 'develop' into feature/2363-email-guild-leaders
chrismckiernan Jun 3, 2024
5c0c2ad
Remove async not needed in send guild leader email
chrismckiernan Jun 3, 2024
128e161
Merge branch 'feature/2363-email-guild-leaders' of github.com:objectc…
chrismckiernan Jun 3, 2024
8febd30
Merge branch 'develop' into feature-2363/email-guild-leaders
chrismckiernan Jun 3, 2024
93048f5
Fix typo Unabl -> Unable
chrismckiernan Jun 3, 2024
2b3e265
Merge branch 'feature-2363/email-guild-leaders' of github.com:objectc…
chrismckiernan Jun 3, 2024
8eceffa
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan Jun 4, 2024
f94adb7
Email pdl/supervisor when a member marks any low score (<=2) in pulse…
chrismckiernan Jun 5, 2024
a26ed2c
Merge branch 'master' of github.com:objectcomputing/check-ins into fe…
chrismckiernan Jun 5, 2024
937801d
Reset sender back to nulls
chrismckiernan Jun 5, 2024
dbae30d
Code cleanup
chrismckiernan Jun 5, 2024
7b53aec
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
69ddaf7
Fix broken tests
chrismckiernan Jun 5, 2024
6c9ad76
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
9194e7b
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
2db57dd
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
7f49e1f
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
f82e419
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
40bb9ad
Update server/src/test/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
768f457
Update server/src/main/java/com/objectcomputing/checkins/services/pul…
chrismckiernan Jun 5, 2024
5e03c94
Merge
chrismckiernan Jun 5, 2024
cb1300d
Fixed emails not sending
chrismckiernan Jun 5, 2024
b955f69
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
3303781
Fix bug
chrismckiernan Jun 5, 2024
ec063d7
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
Jun 5, 2024
663f43e
Fix log text for non existent user
chrismckiernan Jun 5, 2024
9bc0054
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
1a80b6b
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
496b82a
Merge branch 'develop' into feature-2465/pulse-survey-low-score-email
chrismckiernan Jun 5, 2024
138c03f
Revert controller test import change
chrismckiernan Jun 5, 2024
cb0c9ca
Merge branch 'feature-2465/pulse-survey-low-score-email' of github.co…
chrismckiernan Jun 5, 2024
3d82d3c
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
chrismckiernan Jun 5, 2024
8a1579b
Initial commit
chrismckiernan Jun 5, 2024
56aa664
Add tests for member profile
Jun 6, 2024
7dc9125
Merge branch 'develop' of github.com:objectcomputing/check-ins into f…
Jun 6, 2024
f91a061
Fix test bug
Jun 6, 2024
e0f1c0a
Refactor guild leader emails to java side
chrismckiernan Jun 6, 2024
1ad32a5
Added more tests to guild test, member profile, and pulse response
chrismckiernan Jun 6, 2024
b2e5eda
Merge branch 'develop' into feature-2363/email-refactor
chrismckiernan Jun 6, 2024
1b6106e
Add missing mocked tags to pulse response
chrismckiernan Jun 6, 2024
02f9dd7
Initial commit
chrismckiernan Jun 7, 2024
3d22fbe
Add tests
chrismckiernan Jun 7, 2024
c0e10cf
Add review period name to the email
chrismckiernan Jun 7, 2024
fe8a4a4
Merge branch 'develop' into feature-2473/self-review-email
chrismckiernan Jun 7, 2024
3dbabfc
Change lists to set so we don't get duplicate emails sent
chrismckiernan Jun 7, 2024
69ef39d
Merge branch 'feature-2473/self-review-email' of github.com:objectcom…
chrismckiernan Jun 7, 2024
751d0dd
Merge branch 'develop' into feature-2473/self-review-email
mkimberlin Jun 11, 2024
968ce99
Removed System.out.println
mkimberlin Jun 11, 2024
2654420
Merge branch 'develop' into feature-2473/self-review-email
Jun 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
import com.objectcomputing.checkins.services.memberprofile.currentuser.CurrentUserServices;
import com.objectcomputing.checkins.services.reviews.ReviewPeriod;
import com.objectcomputing.checkins.services.reviews.ReviewPeriodRepository;
import com.objectcomputing.checkins.util.Util;
import io.micronaut.context.annotation.Property;
import jakarta.inject.Named;
Expand All @@ -30,21 +32,23 @@ public class FeedbackRequestServicesImpl implements FeedbackRequestServices {
private final FeedbackRequestRepository feedbackReqRepository;
private final CurrentUserServices currentUserServices;
private final MemberProfileServices memberProfileServices;
private final ReviewPeriodRepository reviewPeriodRepository;
private EmailSender emailSender;
private final String notificationSubject;
private final String webURL;

public FeedbackRequestServicesImpl(FeedbackRequestRepository feedbackReqRepository,
CurrentUserServices currentUserServices,
MemberProfileServices memberProfileServices,
ReviewPeriodRepository reviewPeriodRepository,
@Named(MailJetConfig.HTML_FORMAT) EmailSender emailSender,
@Property(name = FEEDBACK_REQUEST_NOTIFICATION_SUBJECT) String notificationSubject,
@Property(name = WEB_UI_URL) String webURL
)
{
) {
this.feedbackReqRepository = feedbackReqRepository;
this.currentUserServices = currentUserServices;
this.memberProfileServices = memberProfileServices;
this.reviewPeriodRepository = reviewPeriodRepository;
this.emailSender = emailSender;
this.notificationSubject = notificationSubject;
this.webURL = webURL;
Expand Down Expand Up @@ -86,7 +90,7 @@ public FeedbackRequest save(FeedbackRequest feedbackRequest) {
}


if (feedbackRequest.getDueDate() != null && feedbackRequest.getSendDate().isAfter(feedbackRequest.getDueDate())){
if (feedbackRequest.getDueDate() != null && feedbackRequest.getSendDate().isAfter(feedbackRequest.getDueDate())) {
throw new BadArgException("Send date of feedback request must be before the due date.");
}
String status = feedbackRequest.getSendDate().isAfter(LocalDate.now()) ? "pending" : "sent";
Expand All @@ -105,12 +109,12 @@ public void sendNewRequestEmail(FeedbackRequest storedRequest) {
String newContent = "<h1>You have received a feedback request.</h1>" +
"<p><b>" + senderName + "</b> is requesting feedback on <b>" + requestee.getFirstName() + " " + requestee.getLastName() + "</b> from you.</p>";
if (storedRequest.getDueDate() != null) {
newContent += "<p>This request is due on " + storedRequest.getDueDate().getMonth() + " " + storedRequest.getDueDate().getDayOfMonth()+ ", " + storedRequest.getDueDate().getYear() + ".";
newContent += "<p>This request is due on " + storedRequest.getDueDate().getMonth() + " " + storedRequest.getDueDate().getDayOfMonth() + ", " + storedRequest.getDueDate().getYear() + ".";
}
newContent += "<p>Please go to your unique link at " + webURL + "/feedback/submit?request=" + storedRequest.getId() + " to complete this request.</p>";

// LOG.warn("Pretending to send an email about the new request to "+memberProfileServices.getById(storedRequest.getRecipientId()).getFirstName());
if(!storedRequest.getRecipientId().equals(storedRequest.getRequesteeId())) {
if (!storedRequest.getRecipientId().equals(storedRequest.getRequesteeId())) {
emailSender.sendEmail(senderName, creator.getWorkEmail(), notificationSubject, newContent, memberProfileServices.getById(storedRequest.getRecipientId()).getWorkEmail());
}
}
Expand Down Expand Up @@ -142,13 +146,13 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)

// 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())) {
if (currentUserServices.getCurrentUser().getId().equals(originalFeedback.getRequesteeId())) {
throw new PermissionException("You are not authorized to do this operation");
}
}

if (reassignAttempted) {
if(!reassignIsPermitted(originalFeedback)) {
if (!reassignIsPermitted(originalFeedback)) {
throw new PermissionException("You are not authorized to do this operation");
}
feedbackRequest.setStatus("sent");
Expand All @@ -170,16 +174,16 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
throw new PermissionException("You are not authorized to do this operation");
}

if (feedbackRequest.getDueDate() != null && originalFeedback.getSendDate().isAfter(feedbackRequest.getDueDate())){
if (feedbackRequest.getDueDate() != null && originalFeedback.getSendDate().isAfter(feedbackRequest.getDueDate())) {
throw new BadArgException("Send date of feedback request must be before the due date.");
}

FeedbackRequest storedRequest = feedbackReqRepository.update(feedbackRequest);

MemberProfile requestee = memberProfileServices.getById(storedRequest.getRequesteeId());
// Send email if the feedback request has been reopened for edits
if (originalFeedback.getStatus().equals("submitted") && feedbackRequest.getStatus().equals("sent")) {
MemberProfile creator = memberProfileServices.getById(storedRequest.getCreatorId());
MemberProfile requestee = memberProfileServices.getById(storedRequest.getRequesteeId());

String senderName = creator.getFirstName() + " " + creator.getLastName();
String newContent = "<h1>You have received edit access to a feedback request.</h1>" +
"<p><b>" + senderName +
Expand All @@ -196,6 +200,11 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
sendNewRequestEmail(storedRequest);
}

// Send self-review completion email to supervisor and pdl if appropriate
if (currentUserServices.getCurrentUser().getId().equals(requestee.getId())) {
sendSelfReviewCompletionEmail(feedbackRequest);
}

return storedRequest;
}

Expand Down Expand Up @@ -237,7 +246,7 @@ public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID
}

List<FeedbackRequest> feedbackReqList = new ArrayList<>();
if(requesteeIds != null && !requesteeIds.isEmpty()) {
if (requesteeIds != null && !requesteeIds.isEmpty()) {
LOG.debug("Finding feedback requests for {} requesteeIds.", requesteeIds.size());
feedbackReqList.addAll(feedbackReqRepository.findByValues(Util.nullSafeUUIDToString(creatorId), Util.nullSafeUUIDToString(recipientId), oldestDate, Util.nullSafeUUIDToString(reviewPeriodId), Util.nullSafeUUIDToString(templateId), Util.nullSafeUUIDListToStringList(requesteeIds)));
} else {
Expand All @@ -247,12 +256,12 @@ public List<FeedbackRequest> findByValues(UUID creatorId, UUID requesteeId, UUID

feedbackReqList = feedbackReqList.stream().filter((FeedbackRequest request) -> {
boolean visible = false;
if(currentUserServices.isAdmin()){
if (currentUserServices.isAdmin()) {
visible = true;
} else if(request != null) {
if(currentUserId.equals(request.getCreatorId())) visible = true;
if(isSupervisor(request.getRequesteeId(), currentUserId)) visible = true;
if(currentUserId.equals(request.getRecipientId())) visible = true;
} else if (request != null) {
if (currentUserId.equals(request.getCreatorId())) visible = true;
if (isSupervisor(request.getRequesteeId(), currentUserId)) visible = true;
if (currentUserId.equals(request.getRecipientId())) visible = true;
}
return visible;
}).collect(Collectors.toList());
Expand Down Expand Up @@ -324,4 +333,64 @@ private FeedbackRequest getFromDTO(FeedbackRequestUpdateDTO dto) {

return feedbackRequest;
}

public void sendSelfReviewCompletionEmail(FeedbackRequest feedbackRequest) {
MemberProfile currentUserProfile = currentUserServices.getCurrentUser();
MemberProfile pdlProfile = null;
MemberProfile supervisorProfile = null;

try {
if (currentUserProfile.getPdlId() != null) {
pdlProfile = memberProfileServices.getById(currentUserProfile.getPdlId());
}
} catch (NullPointerException e) {
LOG.error("PDL could not be found for self-review completion email");
}

try {
if (currentUserProfile.getSupervisorid() != null) {
supervisorProfile = memberProfileServices.getById(currentUserProfile.getSupervisorid());
}
} catch (NullPointerException e) {
LOG.error("Supervisor could not be found for self-review completion email");
}

String reviewPeriodString = "";
if (feedbackRequest.getReviewPeriodId() != null) {
Optional<ReviewPeriod> reviewPeriodOpt = reviewPeriodRepository.findById(feedbackRequest.getReviewPeriodId());
if (reviewPeriodOpt.isPresent()) {
ReviewPeriod reviewPeriod = reviewPeriodOpt.get();
reviewPeriodString = String.format(" for %s", reviewPeriod.getName());
}
}

String subject = String.format("%s %s has finished their self-review%s.",
currentUserProfile.getFirstName(), currentUserProfile.getLastName(),
reviewPeriodString);
StringBuilder bodyBuilder = new StringBuilder(String.format("Self-review has been completed by %s %s%s.<br>",
currentUserProfile.getFirstName(), currentUserProfile.getLastName(), reviewPeriodString));

Set<String> recipients = new HashSet<>();
if (pdlProfile != null) {
bodyBuilder.append(String.format("PDL: %s %s<br>", pdlProfile.getFirstName(), pdlProfile.getLastName()));
recipients.add(pdlProfile.getWorkEmail());
}

if (supervisorProfile != null) {
bodyBuilder.append(String.format("Supervisor: %s %s<br>", supervisorProfile.getFirstName(), supervisorProfile.getLastName()));
recipients.add(supervisorProfile.getWorkEmail());
}

bodyBuilder.append("<br>It is now your turn in their review process. Please complete your portion in a timely manner.");

String body = bodyBuilder.toString();

if (pdlProfile != null || supervisorProfile != null) {
try {
emailSender.sendEmail(null, null, subject, body, recipients.toArray(new String[0]));
} catch (Exception e) {
LOG.error("Unable to send self-review completion email to PDL/Supervisor", e);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public Set<MemberProfile> findByValues(@Nullable String firstName,
@Nullable String workEmail,
@Nullable UUID supervisorId,
@Nullable Boolean terminated) {
HashSet<MemberProfile> memberProfiles = new HashSet<>(memberProfileRepository.search(firstName, null, lastName, null, title,
Set<MemberProfile> memberProfiles = new HashSet<>(memberProfileRepository.search(firstName, null, lastName, null, title,
nullSafeUUIDToString(pdlId), workEmail, nullSafeUUIDToString(supervisorId), terminated));
if (!currentUserServices.isAdmin()) {
for (MemberProfile memberProfile : memberProfiles) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void sendPulseLowScoreEmail(PulseResponse pulseResponse) {
bodyBuilder.append(String.format("External Feelings: %s<br>", pulseResponse.getExternalFeelings()));
}

List<String> recipients = new ArrayList<>();
Set<String> recipients = new HashSet<>();
UUID pdlId = surveyTakerMemberProfile.getPdlId();
if (pdlId != null && memberRepo.existsById(pdlId)) {
recipients.add(memberProfileServices.getById(pdlId).getWorkEmail());
Expand Down
Loading