Open Journal Systems  3.3.0
ReviewReminder.inc.php
1 <?php
2 
16 import('lib.pkp.classes.scheduledTask.ScheduledTask');
17 
18 define('REVIEW_REMIND_AUTO', 'REVIEW_REMIND_AUTO');
19 define('REVIEW_REQUEST_REMIND_AUTO', 'REVIEW_REQUEST_REMIND_AUTO');
20 
22 
23 
27  function getName() {
28  return __('admin.scheduledTask.reviewReminder');
29  }
30 
39  function sendReminder ($reviewAssignment, $submission, $context, $reminderType = REVIEW_REMIND_AUTO) {
40  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
41  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
42  $reviewId = $reviewAssignment->getId();
43 
44  $reviewer = $userDao->getById($reviewAssignment->getReviewerId());
45  if (!isset($reviewer)) return false;
46 
47  import('lib.pkp.classes.mail.SubmissionMailTemplate');
48  $emailKey = $reminderType;
49  $reviewerAccessKeysEnabled = $context->getData('reviewerAccessKeysEnabled');
50  switch (true) {
51  case $reviewerAccessKeysEnabled && ($reminderType == REVIEW_REMIND_AUTO):
52  $emailKey = 'REVIEW_REMIND_AUTO_ONECLICK';
53  break;
54  case $reviewerAccessKeysEnabled && ($reminderType == REVIEW_REQUEST_REMIND_AUTO):
55  $emailKey = 'REVIEW_REQUEST_REMIND_AUTO_ONECLICK';
56  break;
57  }
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'));
65 
66  $reviewUrlArgs = array('submissionId' => $reviewAssignment->getSubmissionId());
67  if ($reviewerAccessKeysEnabled) {
68  import('lib.pkp.classes.security.AccessKeyManager');
69  $accessKeyManager = new AccessKeyManager();
70 
71  // Key lifetime is the typical review period plus four weeks
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));
75  }
76 
78  $request = $application->getRequest();
79  $dispatcher = $application->getDispatcher();
80  $submissionReviewUrl = $dispatcher->url($request, ROUTE_PAGE, $context->getPath(), 'reviewer', 'submission', null, $reviewUrlArgs);
81 
82  // Format the review due date
83  $reviewDueDate = strtotime($reviewAssignment->getDateDue());
84  $dateFormatShort = $context->getLocalizedDateFormatShort();
85  if ($reviewDueDate === -1 || $reviewDueDate === false) {
86  // Default to something human-readable if no date specified
87  $reviewDueDate = '_____';
88  } else {
89  $reviewDueDate = strftime($dateFormatShort, $reviewDueDate);
90  }
91  // Format the review response due date
92  $responseDueDate = strtotime($reviewAssignment->getDateResponseDue());
93  if ($responseDueDate === -1 || $responseDueDate === false) {
94  // Default to something human-readable if no date specified
95  $responseDueDate = '_____';
96  } else {
97  $responseDueDate = strftime($dateFormatShort, $responseDueDate);
98  }
99 
100  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_REVIEWER);
101  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_COMMON);
102  $paramArray = array(
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')),
112  );
113  $email->assignParams($paramArray);
114 
115  $email->send();
116 
117  $reviewAssignment->setDateReminded(Core::getCurrentDate());
118  $reviewAssignment->setReminderWasAutomatic(1);
119  $reviewAssignmentDao->updateObject($reviewAssignment);
120 
121  }
122 
126  function executeActions() {
127  $submission = null;
128  $context = null;
129 
130  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
131  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
132  $contextDao = Application::getContextDAO();
133 
134  $incompleteAssignments = $reviewAssignmentDao->getIncompleteReviewAssignments();
135  $inviteReminderDays = $submitReminderDays = null;
136  foreach ($incompleteAssignments as $reviewAssignment) {
137  // Avoid review assignments that a reminder exists for.
138  if ($reviewAssignment->getDateReminded() !== null) continue;
139 
140  // Fetch the submission
141  if ($submission == null || $submission->getId() != $reviewAssignment->getSubmissionId()) {
142  unset($submission);
143  $submission = $submissionDao->getById($reviewAssignment->getSubmissionId());
144  // Avoid review assignments without submission in database.
145  if (!$submission) continue;
146 
147  }
148 
149  if ($submission->getStatus() != STATUS_QUEUED) continue;
150 
151  // Fetch the context
152  if ($context == null || $context->getId() != $submission->getContextId()) {
153  unset($context);
154  $context = $contextDao->getById($submission->getContextId());
155 
156  $inviteReminderDays = $context->getData('numDaysBeforeInviteReminder');
157  $submitReminderDays = $context->getData('numDaysBeforeSubmitReminder');
158  }
159 
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;
165  }
166  }
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;
171  }
172  }
173 
174  if ($reminderType) $this->sendReminder ($reviewAssignment, $submission, $context, $reminderType);
175  }
176 
177  return true;
178  }
179 }
180 
181 
Application\getContextDAO
static getContextDAO()
Definition: Application.inc.php:137
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
$application
$application
Definition: index.php:65
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
AccessKeyManager
Class defining operations for AccessKey management.
Definition: AccessKeyManager.inc.php:18
SubmissionMailTemplate
Subclass of MailTemplate for sending emails related to submissions.
Definition: SubmissionMailTemplate.inc.php:20
ReviewReminder\getName
getName()
Definition: ReviewReminder.inc.php:27
ReviewReminder\executeActions
executeActions()
Definition: ReviewReminder.inc.php:126
ScheduledTask
Base class for executing scheduled tasks. All scheduled task classes must extend this class and imple...
Definition: ScheduledTask.inc.php:20
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Validation\generatePasswordResetHash
static generatePasswordResetHash($userId, $expiry=null)
Definition: Validation.inc.php:305
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
ReviewReminder\sendReminder
sendReminder($reviewAssignment, $submission, $context, $reminderType=REVIEW_REMIND_AUTO)
Definition: ReviewReminder.inc.php:39
ReviewReminder
Class to perform automated reminders for reviewers.
Definition: ReviewReminder.inc.php:21