get($reviewAssignment->getReviewerId()); if (!isset($reviewer)) { return; } // Only confirm the review for the reviewer if // he has not previously done so. if ($reviewAssignment->getDateConfirmed() == null) { $mailable = $this->getResponseEmail($submission, $reviewAssignment, $decline, $emailText); Hook::call('ReviewerAction::confirmReview', [$request, $submission, $mailable, $decline]); if (!empty($mailable->to)) { try { Mail::send($mailable); $submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO'); /** @var SubmissionEmailLogDAO $submissionEmailLogDao */ $submissionEmailLogDao->logMailable( $decline ? SubmissionEmailLogEntry::SUBMISSION_EMAIL_REVIEW_DECLINE : SubmissionEmailLogEntry::SUBMISSION_EMAIL_REVIEW_CONFIRM, $mailable, $submission, $mailable->getSenderUser() ); } catch (TransportException $e) { $notificationMgr = new NotificationManager(); $notificationMgr->createTrivialNotification( $request->getUser()->getId(), PKPNotification::NOTIFICATION_TYPE_ERROR, ['contents' => __('email.compose.error')] ); trigger_error($e->getMessage(), E_USER_WARNING); } } $reviewAssignment->setDateReminded(null); $reviewAssignment->setReminderWasAutomatic(0); $reviewAssignment->setDeclined($decline); $reviewAssignment->setDateConfirmed(Core::getCurrentDate()); $reviewAssignment->stampModified(); $reviewAssignmentDao->updateObject($reviewAssignment); // Add log $eventLog = Repo::eventLog()->newDataObject([ 'assocType' => PKPApplication::ASSOC_TYPE_SUBMISSION, 'assocId' => $submission->getId(), 'eventType' => $decline ? SubmissionEventLogEntry::SUBMISSION_LOG_REVIEW_DECLINE : SubmissionEventLogEntry::SUBMISSION_LOG_REVIEW_ACCEPT, 'userId' => Validation::loggedInAs() ?? $request->getUser()->getId(), 'message' => $decline ? 'log.review.reviewDeclined' : 'log.review.reviewAccepted', 'isTranslate' => 0, 'dateLogged' => Core::getCurrentDate(), 'reviewAssignmentId' => $reviewAssignment->getId(), 'reviewerName' => $reviewer->getFullName(), 'submissionId' => $reviewAssignment->getSubmissionId(), 'round' => $reviewAssignment->getRound() ]); Repo::eventLog()->add($eventLog); } } /** * Get the reviewer response email template. */ public function getResponseEmail( PKPSubmission $submission, ReviewAssignment $reviewAssignment, bool $decline, ?string $emailText ): ReviewConfirm|ReviewDecline { $context = Application::getContextDAO()->getById($submission->getData('contextId')); /** @var Context $context */ $mailable = $decline ? new ReviewDecline($submission, $reviewAssignment, $context) : new ReviewConfirm($submission, $reviewAssignment, $context); // Get reviewer $reviewer = Repo::user()->get($reviewAssignment->getReviewerId()); $mailable->sender($reviewer); $mailable->replyTo($reviewer->getEmail(), $reviewer->getFullName()); // Get editorial contact name $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /** @var StageAssignmentDAO $stageAssignmentDao */ $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId($submission->getId(), $reviewAssignment->getStageId()); $recipients = []; while ($stageAssignment = $stageAssignments->next()) { $userGroup = Repo::userGroup()->get($stageAssignment->getUserGroupId()); if (!in_array($userGroup->getRoleId(), [Role::ROLE_ID_MANAGER, Role::ROLE_ID_SUB_EDITOR])) { continue; } $recipients[] = Repo::user()->get($stageAssignment->getUserId()); } // Create dummy user if no one assigned if (empty($recipients)) { $contextUser = Repo::user()->getUserFromContextContact($context); if ($contextUser->getData('email')) { $recipients[] = $contextUser; } } $mailable->recipients($recipients); // Set email body and subject $template = Repo::emailTemplate()->getByKey($context->getId(), $mailable->getEmailTemplateKey()); $emailText ? $mailable->body($emailText) : $mailable->body($template->getLocalizedData('body')); $mailable->subject($template->getLocalizedData('subject')); return $mailable; } } if (!PKP_STRICT_MODE) { class_alias('\PKP\submission\reviewer\ReviewerAction', '\ReviewerAction'); }