16 import(
'lib.pkp.classes.scheduledTask.ScheduledTask');
18 define(
'REVIEW_REMIND_AUTO',
'REVIEW_REMIND_AUTO');
19 define(
'REVIEW_REQUEST_REMIND_AUTO',
'REVIEW_REQUEST_REMIND_AUTO');
28 return __(
'admin.scheduledTask.reviewReminder');
39 function sendReminder ($reviewAssignment, $submission, $context, $reminderType = REVIEW_REMIND_AUTO) {
42 $reviewId = $reviewAssignment->getId();
44 $reviewer = $userDao->getById($reviewAssignment->getReviewerId());
45 if (!isset($reviewer))
return false;
47 import(
'lib.pkp.classes.mail.SubmissionMailTemplate');
48 $emailKey = $reminderType;
49 $reviewerAccessKeysEnabled = $context->getData(
'reviewerAccessKeysEnabled');
51 case $reviewerAccessKeysEnabled && ($reminderType == REVIEW_REMIND_AUTO):
52 $emailKey =
'REVIEW_REMIND_AUTO_ONECLICK';
54 case $reviewerAccessKeysEnabled && ($reminderType == REVIEW_REQUEST_REMIND_AUTO):
55 $emailKey =
'REVIEW_REQUEST_REMIND_AUTO_ONECLICK';
58 $email =
new SubmissionMailTemplate($submission, $emailKey, $context->getPrimaryLocale(), $context,
false);
59 $email->setContext($context);
60 $email->setReplyTo(
null);
61 $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName());
62 $email->setSubject($email->getSubject($context->getPrimaryLocale()));
63 $email->setBody($email->getBody($context->getPrimaryLocale()));
64 $email->setFrom($context->getData(
'contactEmail'), $context->getData(
'contactName'));
66 $reviewUrlArgs = array(
'submissionId' => $reviewAssignment->getSubmissionId());
67 if ($reviewerAccessKeysEnabled) {
68 import(
'lib.pkp.classes.security.AccessKeyManager');
72 $keyLifetime = ($context->getData(
'numWeeksPerReview') + 4) * 7;
73 $accessKey = $accessKeyManager->createKey($context->getId(), $reviewer->getId(), $reviewId, $keyLifetime);
74 $reviewUrlArgs = array_merge($reviewUrlArgs, array(
'reviewId' => $reviewId,
'key' => $accessKey));
80 $submissionReviewUrl = $dispatcher->url($request, ROUTE_PAGE, $context->getPath(),
'reviewer',
'submission',
null, $reviewUrlArgs);
83 $reviewDueDate = strtotime($reviewAssignment->getDateDue());
84 $dateFormatShort = $context->getLocalizedDateFormatShort();
85 if ($reviewDueDate === -1 || $reviewDueDate ===
false) {
87 $reviewDueDate =
'_____';
89 $reviewDueDate = strftime($dateFormatShort, $reviewDueDate);
92 $responseDueDate = strtotime($reviewAssignment->getDateResponseDue());
93 if ($responseDueDate === -1 || $responseDueDate ===
false) {
95 $responseDueDate =
'_____';
97 $responseDueDate = strftime($dateFormatShort, $responseDueDate);
103 'reviewerName' => $reviewer->getFullName(),
104 'reviewerUserName' => $reviewer->getUsername(),
105 'reviewDueDate' => $reviewDueDate,
106 'responseDueDate' => $responseDueDate,
107 'editorialContactSignature' => $context->getData(
'contactName') .
"\n" . $context->getLocalizedName(),
108 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath(),
'login',
'resetPassword', $reviewer->getUsername(), array(
'confirm' =>
Validation::generatePasswordResetHash($reviewer->getId()))),
109 'submissionReviewUrl' => $submissionReviewUrl,
110 'messageToReviewer' => __(
'reviewer.step1.requestBoilerplate'),
111 'abstractTermIfEnabled' => ($submission->getLocalizedAbstract() ==
'' ?
'' : __(
'common.abstract')),
113 $email->assignParams($paramArray);
118 $reviewAssignment->setReminderWasAutomatic(1);
119 $reviewAssignmentDao->updateObject($reviewAssignment);
134 $incompleteAssignments = $reviewAssignmentDao->getIncompleteReviewAssignments();
135 $inviteReminderDays = $submitReminderDays =
null;
136 foreach ($incompleteAssignments as $reviewAssignment) {
138 if ($reviewAssignment->getDateReminded() !==
null)
continue;
141 if ($submission ==
null || $submission->getId() != $reviewAssignment->getSubmissionId()) {
143 $submission = $submissionDao->getById($reviewAssignment->getSubmissionId());
145 if (!$submission)
continue;
149 if ($submission->getStatus() != STATUS_QUEUED)
continue;
152 if ($context ==
null || $context->getId() != $submission->getContextId()) {
154 $context = $contextDao->getById($submission->getContextId());
156 $inviteReminderDays = $context->getData(
'numDaysBeforeInviteReminder');
157 $submitReminderDays = $context->getData(
'numDaysBeforeSubmitReminder');
160 $reminderType =
false;
161 if ($submitReminderDays>=1 && $reviewAssignment->getDateDue() !=
null) {
162 $checkDate = strtotime($reviewAssignment->getDateDue());
163 if (time() - $checkDate > 60 * 60 * 24 * $submitReminderDays) {
164 $reminderType = REVIEW_REMIND_AUTO;
167 if ($inviteReminderDays>=1 && $reviewAssignment->getDateConfirmed() ==
null) {
168 $checkDate = strtotime($reviewAssignment->getDateResponseDue());
169 if (time() - $checkDate > 60 * 60 * 24 * $inviteReminderDays) {
170 $reminderType = REVIEW_REQUEST_REMIND_AUTO;
174 if ($reminderType) $this->
sendReminder ($reviewAssignment, $submission, $context, $reminderType);