Skip to content

Commit 03167ee

Browse files
committed
pkp#9455 Add support for multiple occurrences on review reminders
1 parent c6a9c9b commit 03167ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+362
-129
lines changed

classes/components/forms/context/PKPReviewSetupForm.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,23 @@ public function __construct($action, $locales, $context)
9898
'value' => $context->getData('numDaysBeforeInviteReminder'),
9999
'size' => 'small',
100100
]))
101+
->addField(new FieldText('numOccurrencesForInviteReminder', [
102+
'label' => __('manager.setup.reviewOptions.occurrencesForInvite'),
103+
'description' => __('manager.setup.reviewOptions.occurrencesForInvite.description'),
104+
'value' => $context->getData('numOccurrencesForInviteReminder'),
105+
'size' => 'small',
106+
]))
101107
->addField(new FieldText('numDaysBeforeSubmitReminder', [
102108
'label' => __('manager.setup.reviewOptions.reminders.submit'),
103109
'description' => __('manager.setup.reviewOptions.reminders.submit.description'),
104110
'value' => $context->getData('numDaysBeforeSubmitReminder'),
105111
'size' => 'small',
112+
]))
113+
->addField(new FieldText('numOccurrencesForSubmitReminder', [
114+
'label' => __('manager.setup.reviewOptions.occurrencesForSubmit'),
115+
'description' => __('manager.setup.reviewOptions.occurrencesForSubmit.description'),
116+
'value' => $context->getData('numOccurrencesForSubmitReminder'),
117+
'size' => 'small',
106118
]));
107119
} else {
108120
$this->addField(new FieldHTML('reviewRemindersDisabled', [

classes/controllers/grid/users/reviewer/PKPReviewerGridHandler.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
use PKP\mail\mailables\ReviewerReinstate;
5151
use PKP\mail\mailables\ReviewerResendRequest;
5252
use PKP\mail\mailables\ReviewerUnassign;
53+
use PKP\mail\mailables\ReviewRemindAuto;
5354
use PKP\mail\traits\Sender;
5455
use PKP\notification\NotificationDAO;
5556
use PKP\notification\PKPNotification;
@@ -979,7 +980,8 @@ public function reviewHistory($args, $request)
979980
$dates = [
980981
'common.assigned' => $reviewAssignment->getDateAssigned(),
981982
'common.notified' => $reviewAssignment->getDateNotified(),
982-
'common.reminder' => $reviewAssignment->getDateReminded(),
983+
'common.invite.reminder' => $reviewAssignment->getDateInviteReminded(),
984+
'common.submit.reminder' => $reviewAssignment->getDateSubmitReminded(),
983985
'common.confirm' => $reviewAssignment->getDateConfirmed(),
984986
'common.completed' => $reviewAssignment->getDateCompleted(),
985987
'common.acknowledged' => $reviewAssignment->getDateAcknowledged(),
@@ -1045,11 +1047,20 @@ public function fetchTemplateBody(array $args, PKPRequest $request): ?JSONMessag
10451047
return null;
10461048
}
10471049

1050+
$reviewAssignment = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_REVIEW_ASSIGNMENT);
1051+
if ($mailable instanceof ReviewRemindAuto) {
1052+
$occurrence = $reviewAssignment->getCountSubmitReminder();
1053+
}
1054+
else {
1055+
$occurrence = $reviewAssignment->getCountInviteReminder();
1056+
}
1057+
10481058
$user = $request->getUser();
10491059
$mailable->sender($user);
10501060
$mailable->addData([
10511061
'messageToReviewer' => __('reviewer.step1.requestBoilerplate'),
10521062
'abstractTermIfEnabled' => ($this->getSubmission()->getLocalizedAbstract() == '' ? '' : __('common.abstract')), // Deprecated; for OJS 2.x templates
1063+
'occurrence' => $occurrence,
10531064
]);
10541065

10551066
$body = Mail::compileParams($template->getLocalizedData('body'), $mailable->getData(Locale::getLocale()));

classes/migration/install/ReviewsMigration.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ public function up(): void
7171
$table->smallInteger('declined')->default(0);
7272
$table->smallInteger('cancelled')->default(0);
7373
$table->datetime('date_rated')->nullable();
74-
$table->datetime('date_reminded')->nullable();
74+
$table->datetime('date_invite_reminded')->nullable();
75+
$table->smallInteger('count_invite_reminder')->default(0);
76+
$table->datetime('date_submit_reminded')->nullable();
77+
$table->smallInteger('count_submit_reminder')->default(0);
7578
$table->smallInteger('quality')->nullable();
7679

7780
$table->bigInteger('review_round_id');
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
/**
4+
* @file classes/migration/upgrade/v3_5_0/I9455_ReviewRemindersOccurrences.php
5+
*
6+
* Copyright (c) 2014-2023 Simon Fraser University
7+
* Copyright (c) 2000-2023 John Willinsky
8+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
9+
*
10+
* @class I9455_ReviewRemindersOccurrences
11+
*/
12+
13+
namespace PKP\migration\upgrade\v3_5_0;
14+
15+
use Illuminate\Database\Schema\Blueprint;
16+
use Illuminate\Support\Facades\Schema;
17+
use PKP\migration\Migration;
18+
19+
class I9455_ReviewRemindersOccurrences extends Migration
20+
{
21+
/**
22+
* Run the migrations.
23+
*/
24+
public function up(): void
25+
{
26+
Schema::table('review_assignments', function (Blueprint $table) {
27+
$table->after('date_rated', function (Blueprint $table) {
28+
$table->dateTime('date_invite_reminded')->nullable();
29+
$table->smallInteger('count_invite_reminder')->default(0);
30+
});
31+
32+
// Rename date_reminded to date_submit_reminded to avoid confusion with another column with a similar name
33+
$table->renameColumn('date_reminded', 'date_submit_reminded');
34+
35+
$table->after('date_reminded', function (Blueprint $table) {
36+
$table->smallInteger('count_submit_reminder')->default(0);
37+
});
38+
});
39+
}
40+
41+
/**
42+
* Reverse the migration.
43+
*/
44+
public function down(): void
45+
{
46+
Schema::table('review_assignments', function (Blueprint $table) {
47+
$table->dropColumn('date_invite_reminded');
48+
$table->dropColumn('count_invite_reminder');
49+
$table->renameColumn('date_submit_reminded', 'date_reminded');
50+
$table->dropColumn('count_submit_reminder');
51+
});
52+
}
53+
}

classes/submission/reviewAssignment/DAO.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ class DAO extends EntityDAO
5454
'declined' => 'declined',
5555
'cancelled' => 'cancelled',
5656
'dateRated' => 'date_rated',
57-
'dateReminded' => 'date_reminded',
57+
'dateInviteReminded' => 'date_invite_reminded',
58+
'countInviteReminder' => 'count_invite_reminder',
59+
'dateSubmitReminded' => 'date_submit_reminded',
60+
'countSubmitReminder' => 'count_submit_reminder',
5861
'quality' => 'quality',
5962
'reviewRoundId' => 'review_round_id',
6063
'stageId' => 'stage_id',

classes/submission/reviewAssignment/ReviewAssignment.php

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -418,23 +418,83 @@ public function setDateAcknowledged($dateAcknowledged)
418418
}
419419

420420
/**
421-
* Get the reviewer's last reminder date.
421+
* Get the reviewer's last invite reminder date.
422422
*
423423
* @return string
424424
*/
425-
public function getDateReminded()
425+
public function getDateInviteReminded()
426426
{
427-
return $this->getData('dateReminded');
427+
return $this->getData('dateInviteReminded');
428428
}
429429

430430
/**
431-
* Set the reviewer's last reminder date.
431+
* Set the reviewer's last invite reminder date.
432432
*
433-
* @param string $dateReminded
433+
* @param string $dateInviteReminded
434434
*/
435-
public function setDateReminded($dateReminded)
435+
public function setDateInviteReminded($dateInviteReminded)
436436
{
437-
$this->setData('dateReminded', $dateReminded);
437+
$this->setData('dateInviteReminded', $dateInviteReminded);
438+
}
439+
440+
/**
441+
* Get the reviewer's invite reminder count.
442+
*
443+
* @return int
444+
*/
445+
function getCountInviteReminder()
446+
{
447+
return $this->getData('countInviteReminder');
448+
}
449+
450+
/**
451+
* Set the reviewer's invite reminder count.
452+
*
453+
* @param $countInviteReminder int
454+
*/
455+
function setCountInviteReminder($countInviteReminder)
456+
{
457+
$this->setData('countInviteReminder', $countInviteReminder);
458+
}
459+
460+
/**
461+
* Get the reviewer's last submit reminder date.
462+
*
463+
* @return string
464+
*/
465+
function getDateSubmitReminded()
466+
{
467+
return $this->getData('dateSubmitReminded');
468+
}
469+
470+
/**
471+
* Set the reviewer's last submit reminder date.
472+
*
473+
* @param $dateSubmitReminded string
474+
*/
475+
function setDateSubmitReminded($dateSubmitReminded)
476+
{
477+
$this->setData('dateSubmitReminded', $dateSubmitReminded);
478+
}
479+
480+
/**
481+
* Get the reviewer's submit reminder count.
482+
*
483+
* @return int
484+
*/
485+
function getCountSubmitReminder()
486+
{
487+
return $this->getData('countSubmitReminder');
488+
}
489+
490+
/**
491+
* Set the reviewer's submit reminder count.
492+
*
493+
* @param $countSubmitReminder int
494+
*/
495+
function setCountSubmitReminder($countSubmitReminder)
496+
{
497+
$this->setData('countSubmitReminder', $countSubmitReminder);
438498
}
439499

440500
/**

classes/submission/reviewer/ReviewerAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public function confirmReview(
9090
}
9191

9292
Repo::reviewAssignment()->edit($reviewAssignment, [
93-
'dateReminded' => null,
93+
'dateSubmitReminded' => null,
9494
'reminderWasAutomatic' => 0,
9595
'declined' => $decline,
9696
'dateConfirmed' => Core::getCurrentDate(),

classes/task/ReviewReminder.php

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,33 @@ public function sendReminder(
7575
$reviewInvitation->dispatch();
7676
}
7777

78+
if ($mailable instanceof ReviewRemindAuto) {
79+
$occurrence = $reviewAssignment->getCountSubmitReminder() + 1;
80+
}
81+
else {
82+
$occurrence = $reviewAssignment->getCountInviteReminder() + 1;
83+
}
84+
7885
// deprecated template variables OJS 2.x
7986
$mailable->addData([
8087
'messageToReviewer' => __('reviewer.step1.requestBoilerplate'),
8188
'abstractTermIfEnabled' => ($submission->getLocalizedAbstract() == '' ? '' : __('common.abstract')),
89+
'occurrence' => $occurrence,
8290
]);
8391

8492
Mail::send($mailable);
8593

94+
if ($mailable instanceof ReviewRemindAuto) {
95+
$dateFieldToUpdate = 'dateSubmitReminded';
96+
$countFieldToUpdate = 'countSubmitReminder';
97+
}
98+
else {
99+
$dateFieldToUpdate = 'dateInviteReminded';
100+
$countFieldToUpdate = 'countInviteReminder';
101+
}
86102
Repo::reviewAssignment()->edit($reviewAssignment, [
87-
'dateReminded' => Core::getCurrentDate(),
103+
$dateFieldToUpdate => Core::getCurrentDate(),
104+
$countFieldToUpdate => $occurrence,
88105
'reminderWasAutomatic' => 1
89106
]);
90107

@@ -114,12 +131,8 @@ public function executeActions()
114131

115132
$incompleteAssignments = Repo::reviewAssignment()->getCollector()->filterByIsIncomplete(true)->getMany();
116133
$inviteReminderDays = $submitReminderDays = null;
134+
$occurrencesInviteReminder = $occurrencesSubmitReminder = null;
117135
foreach ($incompleteAssignments as $reviewAssignment) {
118-
// Avoid review assignments that a reminder exists for.
119-
if ($reviewAssignment->getDateReminded() !== null) {
120-
continue;
121-
}
122-
123136
// Fetch the submission
124137
if ($submission == null || $submission->getId() != $reviewAssignment->getSubmissionId()) {
125138
unset($submission);
@@ -141,19 +154,36 @@ public function executeActions()
141154

142155
$inviteReminderDays = $context->getData('numDaysBeforeInviteReminder');
143156
$submitReminderDays = $context->getData('numDaysBeforeSubmitReminder');
157+
$occurrencesInviteReminder = $context->getData('numOccurrencesForInviteReminder');
158+
$occurrencesSubmitReminder = $context->getData('numOccurrencesForSubmitReminder');
144159
}
145160

146161
$mailable = null;
147-
if ($submitReminderDays >= 1 && $reviewAssignment->getDateDue() != null) {
148-
$checkDate = strtotime($reviewAssignment->getDateDue());
149-
if (time() - $checkDate > 60 * 60 * 24 * $submitReminderDays) {
150-
$mailable = new ReviewRemindAuto($context, $submission, $reviewAssignment);
162+
163+
$countSubmitReminder = $reviewAssignment->getCountSubmitReminder();
164+
if ($countSubmitReminder == 0 || !$occurrencesSubmitReminder || $countSubmitReminder < $occurrencesSubmitReminder) {
165+
$dateDue = $reviewAssignment->getDateDue();
166+
if ($submitReminderDays >= 1 && $dateDue) {
167+
$dateSubmitReminded = $reviewAssignment->getDateSubmitReminded();
168+
$time = $dateSubmitReminded ? strtotime($dateSubmitReminded) : strtotime($dateDue);
169+
$checkDate = $time + (60 * 60 * 24 * $submitReminderDays);
170+
if (time() > $checkDate) {
171+
$mailable = new ReviewRemindAuto($context, $submission, $reviewAssignment);
172+
}
151173
}
152174
}
153-
if ($inviteReminderDays >= 1 && $reviewAssignment->getDateConfirmed() == null) {
154-
$checkDate = strtotime($reviewAssignment->getDateResponseDue());
155-
if (time() - $checkDate > 60 * 60 * 24 * $inviteReminderDays) {
156-
$mailable = new ReviewResponseRemindAuto($context, $submission, $reviewAssignment);
175+
176+
$countInviteReminder = $reviewAssignment->getCountInviteReminder();
177+
if ($countInviteReminder == 0 || !$occurrencesInviteReminder || $countInviteReminder < $occurrencesInviteReminder) {
178+
$dateConfirmed = $reviewAssignment->getDateConfirmed();
179+
if ($inviteReminderDays >= 1 && !$dateConfirmed) {
180+
$dateResponseDue = $reviewAssignment->getDateResponseDue();
181+
$dateInviteReminded = $reviewAssignment->getDateInviteReminded();
182+
$time = $dateInviteReminded ? strtotime($dateInviteReminded) : strtotime($dateResponseDue);
183+
$checkDate = $time + (60 * 60 * 24 * $inviteReminderDays);
184+
if (time() > $checkDate) {
185+
$mailable = new ReviewResponseRemindAuto($context, $submission, $reviewAssignment);
186+
}
157187
}
158188
}
159189

controllers/grid/users/reviewer/form/ReviewReminderForm.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public function execute(...$functionArgs)
168168
Repo::eventLog()->add($eventLog);
169169

170170
Repo::reviewAssignment()->edit($reviewAssignment, [
171-
'dateReminded' => Core::getCurrentDate(),
171+
'dateSubmitReminded' => Core::getCurrentDate(),
172172
]);
173173
} catch (TransportException $e) {
174174
$notificationMgr = new NotificationManager();

controllers/grid/users/reviewer/form/ReviewerForm.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,7 @@ protected function getMailable(): ReviewRequest
464464
$mailable->addData([
465465
'messageToReviewer' => __('reviewer.step1.requestBoilerplate'),
466466
'abstractTermIfEnabled' => ($submission->getLocalizedAbstract() == '' ? '' : __('common.abstract')), // Deprecated; for OJS 2.x templates
467+
'occurrence' => 0,
467468
]);
468469

469470
// Remove template variables that haven't been set yet during form initialization

locale/ar/common.po

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -744,10 +744,10 @@ msgstr "تحديث"
744744
msgid "common.related"
745745
msgstr "ذو صلة"
746746

747-
msgid "common.reminder"
747+
msgid "common.submit.reminder"
748748
msgstr "تذكير"
749749

750-
msgid "common.reminded.date"
750+
msgid "common.submit.reminded.date"
751751
msgstr "مذكَّر بتاريخ: {$dateReminded}"
752752

753753
msgid "common.remote"

locale/az/common.po

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,10 +1047,10 @@ msgstr "Yenilə"
10471047
msgid "common.related"
10481048
msgstr "Əlaqəli"
10491049

1050-
msgid "common.reminder"
1050+
msgid "common.submit.reminder"
10511051
msgstr "Xatırlatma"
10521052

1053-
msgid "common.reminded.date"
1053+
msgid "common.submit.reminded.date"
10541054
msgstr "Xatırladıldı: {$dateReminded}"
10551055

10561056
msgid "common.remote"

locale/bg/common.po

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,10 +742,10 @@ msgstr "Обновяване"
742742
msgid "common.related"
743743
msgstr "Свързани"
744744

745-
msgid "common.reminder"
745+
msgid "common.submit.reminder"
746746
msgstr "Напомняне"
747747

748-
msgid "common.reminded.date"
748+
msgid "common.submit.reminded.date"
749749
msgstr "Напомняне на дата: {$dateReminded}"
750750

751751
msgid "common.remote"

0 commit comments

Comments
 (0)