Skip to content

Commit 2b5a20f

Browse files
Merge branch 'sendReminderAreaModerators-711' into 'stable-3_3_0'
Adiciona envio de lembretes a moderadores de área no envio manual See merge request softwares-pkp/plugins_ojs/scieloModerationStages!22
2 parents 294afbf + 16becbd commit 2b5a20f

14 files changed

Lines changed: 406 additions & 84 deletions

classes/ModerationReminderEmailBuilder.inc.php

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,58 @@
11
<?php
22

33
import('lib.pkp.classes.mail.Mail');
4+
import('plugins.generic.scieloModerationStages.classes.ModerationStageDAO');
5+
6+
define('REMINDER_TYPE_PRE_MODERATION', 'preModeration');
7+
define('REMINDER_TYPE_AREA_MODERATION', 'areaModeration');
48

59
class ModerationReminderEmailBuilder
610
{
711
private $context;
812
private $moderator;
913
private $submissions;
1014
private $locale;
11-
private $preModerationTimeLimit;
15+
private $reminderType;
16+
private $moderationTimeLimit;
17+
private $moderationStageDao;
1218

13-
public function __construct($context, $moderator, $submissions, $locale, $preModerationTimeLimit)
19+
public function __construct($context, $moderator, $submissions, $locale, $reminderType, $moderationTimeLimit)
1420
{
1521
$this->context = $context;
1622
$this->moderator = $moderator;
1723
$this->submissions = $submissions;
1824
$this->locale = $locale;
19-
$this->preModerationTimeLimit = $preModerationTimeLimit;
25+
$this->reminderType = $reminderType;
26+
$this->moderationTimeLimit = $moderationTimeLimit;
27+
28+
$this->moderationStageDao = new ModerationStageDAO();
29+
}
30+
31+
public function setModerationStageDao($moderationStageDao)
32+
{
33+
$this->moderationStageDao = $moderationStageDao;
34+
}
35+
public function setReminderType($reminderType)
36+
{
37+
$this->reminderType = $reminderType;
2038
}
2139

2240
public function buildEmail(): Mail
2341
{
42+
$reminderTemplateName = ($this->reminderType == REMINDER_TYPE_PRE_MODERATION ? 'preModerationReminder' : 'areaModerationReminder');
2443
$email = new Mail();
2544

2645
$email->setFrom($this->context->getContactEmail(), $this->context->getContactName());
2746
$email->addRecipient($this->moderator->getEmail(), $this->moderator->getFullName());
2847
$email->addCc($this->context->getContactEmail(), $this->context->getContactName());
2948

30-
$email->setSubject(__('plugins.generic.scieloModerationStages.emails.moderationReminder.subject', [], $this->locale));
49+
$email->setSubject(__("plugins.generic.scieloModerationStages.emails.$reminderTemplateName.subject", [], $this->locale));
3150

3251
$bodyParams = [
3352
'moderatorName' => $this->moderator->getFullName(),
3453
'submissions' => $this->getSubmissionsString()
3554
];
36-
$email->setBody(__('plugins.generic.scieloModerationStages.emails.moderationReminder.body', $bodyParams, $this->locale));
55+
$email->setBody(__("plugins.generic.scieloModerationStages.emails.$reminderTemplateName.body", $bodyParams, $this->locale));
3756

3857
return $email;
3958
}
@@ -58,21 +77,27 @@ private function getSubmissionsString(): string
5877
private function getSubmissionDaysString($submission): string
5978
{
6079
$dateSubmitted = new DateTime($submission->getData('dateSubmitted'));
80+
$dateModeratorAssigned = new DateTime($this->moderationStageDao->getDateOfUserAssignment($this->moderator->getId(), $submission->getId()));
81+
6182
$today = new DateTime();
62-
$daysBetween = (int) $today->diff($dateSubmitted)->format('%a');
83+
$daysSinceSubmission = (int) $today->diff($dateSubmitted)->format('%a');
84+
$daysSinceAssignment = (int) $today->diff($dateModeratorAssigned)->format('%a');
6385

64-
if ($daysBetween < 1) {
86+
if ($daysSinceSubmission < 1) {
6587
return __('plugins.generic.scieloModerationStages.submissionMade.lessThanADayAgo', [], $this->locale);
6688
}
6789

68-
if ($daysBetween == 1) {
90+
if ($daysSinceSubmission == 1) {
6991
return __('plugins.generic.scieloModerationStages.submissionMade.aDayAgo', [], $this->locale);
7092
}
7193

72-
if ($daysBetween > $this->preModerationTimeLimit) {
73-
return __('plugins.generic.scieloModerationStages.submissionMade.nDaysAgo.bold', ['numberOfDays' => $daysBetween], $this->locale);
94+
if (
95+
($this->reminderType == REMINDER_TYPE_PRE_MODERATION && $daysSinceSubmission > $this->moderationTimeLimit)
96+
|| ($this->reminderType == REMINDER_TYPE_AREA_MODERATION && $daysSinceAssignment > $this->moderationTimeLimit)
97+
) {
98+
return __('plugins.generic.scieloModerationStages.submissionMade.nDaysAgo.bold', ['numberOfDays' => $daysSinceSubmission], $this->locale);
7499
}
75100

76-
return __('plugins.generic.scieloModerationStages.submissionMade.nDaysAgo.regular', ['numberOfDays' => $daysBetween], $this->locale);
101+
return __('plugins.generic.scieloModerationStages.submissionMade.nDaysAgo.regular', ['numberOfDays' => $daysSinceSubmission], $this->locale);
77102
}
78103
}

classes/ModerationReminderHelper.inc.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,29 @@ public function setModerationStageDao($moderationStageDao)
1717
}
1818

1919
public function getResponsiblesUserGroup(int $contextId)
20+
{
21+
return $this->getUserGroupByAbbrev($contextId, 'resp');
22+
}
23+
24+
public function getAreaModeratorsUserGroup(int $contextId)
25+
{
26+
return $this->getUserGroupByAbbrev($contextId, 'am');
27+
}
28+
29+
private function getUserGroupByAbbrev(int $contextId, string $abbrev)
2030
{
2131
$userGroupDao = DAORegistry::getDAO('UserGroupDAO');
2232
$contextUserGroups = $userGroupDao->getByContextId($contextId)->toArray();
2333

2434
foreach ($contextUserGroups as $userGroup) {
2535
$userGroupAbbrev = strtolower($userGroupDao->getSetting($userGroup->getId(), 'abbrev', 'en_US'));
2636

27-
if ($userGroupAbbrev === 'resp') {
28-
$responsiblesUserGroup = $userGroup;
29-
break;
37+
if ($userGroupAbbrev === $abbrev) {
38+
return $userGroup;
3039
}
3140
}
3241

33-
return $responsiblesUserGroup;
42+
return null;
3443
}
3544

3645
public function mapUsersAndSubmissions($users, $assignments)

classes/ModerationStageDAO.inc.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,15 @@ public function getAssignmentsByUserGroupAndModerationStage(int $userGroupId, in
7373

7474
return $assignments;
7575
}
76+
77+
public function getDateOfUserAssignment(int $userId, int $submissionId): ?string
78+
{
79+
$result = Capsule::table('stage_assignments AS sa')
80+
->where('user_id', $userId)
81+
->where('submission_id', $submissionId)
82+
->select('date_assigned')
83+
->first();
84+
85+
return $result ? get_object_vars($result)['date_assigned'] : null;
86+
}
7687
}

classes/tasks/SendModerationReminders.inc.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,14 @@ public function executeActions()
3838

3939
foreach ($mapModeratorsAndOverdueSubmissions as $userId => $submissions) {
4040
$moderator = DAORegistry::getDAO('UserDAO')->getById($userId);
41-
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder($context, $moderator, $submissions, $locale, $preModerationTimeLimit);
41+
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder(
42+
$context,
43+
$moderator,
44+
$submissions,
45+
$locale,
46+
REMINDER_TYPE_PRE_MODERATION,
47+
$preModerationTimeLimit
48+
);
4249

4350
$reminderEmail = $moderationReminderEmailBuilder->buildEmail();
4451
$reminderEmail->send();

controllers/ScieloModerationStagesHandler.inc.php

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,27 @@ class ScieloModerationStagesHandler extends Handler
1414

1515
public function getReminderBody($args, $request)
1616
{
17-
$responsiblesUserGroupId = (int) $args['responsiblesUserGroup'];
18-
$responsible = DAORegistry::getDAO('UserDAO')->getById((int) $args['responsible']);
17+
$userGroupId = (int) $args['userGroup'];
18+
$role = $args['role'];
19+
$userToRemind = DAORegistry::getDAO('UserDAO')->getById((int) $args['user']);
20+
1921
$context = $request->getContext();
22+
$locale = AppLocale::getLocale();
23+
$plugin = PluginRegistry::getPlugin('generic', 'scielomoderationstagesplugin');
24+
25+
if ($role == REMINDER_TYPE_PRE_MODERATION) {
26+
$moderationStage = SCIELO_MODERATION_STAGE_CONTENT;
27+
$moderationTimeLimit = $plugin->getSetting($context->getId(), 'preModerationTimeLimit');
28+
} elseif ($role == REMINDER_TYPE_AREA_MODERATION) {
29+
$moderationStage = SCIELO_MODERATION_STAGE_AREA;
30+
$moderationTimeLimit = $plugin->getSetting($context->getId(), 'areaModerationTimeLimit');
31+
}
2032

2133
$moderationStageDao = new ModerationStageDAO();
2234
$assignments = $moderationStageDao->getAssignmentsByUserGroupAndModerationStage(
23-
$responsiblesUserGroupId,
24-
SCIELO_MODERATION_STAGE_CONTENT,
25-
$responsible->getId()
35+
$userGroupId,
36+
$moderationStage,
37+
$userToRemind->getId()
2638
);
2739

2840
$submissions = [];
@@ -35,11 +47,14 @@ public function getReminderBody($args, $request)
3547
}
3648
}
3749

38-
$locale = AppLocale::getLocale();
39-
$plugin = PluginRegistry::getPlugin('generic', 'scielomoderationstagesplugin');
40-
$preModerationTimeLimit = $plugin->getSetting($context->getId(), 'preModerationTimeLimit');
41-
42-
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder($context, $responsible, $submissions, $locale, $preModerationTimeLimit);
50+
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder(
51+
$context,
52+
$userToRemind,
53+
$submissions,
54+
$locale,
55+
$role,
56+
$moderationTimeLimit
57+
);
4358
$reminderEmail = $moderationReminderEmailBuilder->buildEmail();
4459

4560
return json_encode(['reminderBody' => $reminderEmail->getBody()]);

form/ScieloModerationStagesSettingsForm.inc.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class ScieloModerationStagesSettingsForm extends Form
66
{
77
public const CONFIG_VARS = array(
88
'preModerationTimeLimit' => 'int',
9+
'areaModerationTimeLimit' => 'int'
910
);
1011

1112
public $contextId;
@@ -20,6 +21,9 @@ public function __construct($plugin, $contextId)
2021
$this->addCheck(new FormValidatorCustom($this, 'preModerationTimeLimit', 'required', 'plugins.generic.scieloModerationStages.settings.timeLimitError', function ($timeLimit) {
2122
return is_numeric($timeLimit) && intval($timeLimit) > 0;
2223
}));
24+
$this->addCheck(new FormValidatorCustom($this, 'areaModerationTimeLimit', 'required', 'plugins.generic.scieloModerationStages.settings.timeLimitError', function ($timeLimit) {
25+
return is_numeric($timeLimit) && intval($timeLimit) > 0;
26+
}));
2327
}
2428

2529
public function initData()

form/SendModerationReminderForm.inc.php

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,50 +18,76 @@ public function __construct($plugin, $contextId)
1818
parent::__construct($plugin->getTemplateResource('sendModerationReminderForm.tpl'));
1919
}
2020

21-
private function getResponsiblesUserGroupId(int $contextId): int
21+
private function getResponsiblesUserGroupId($contextId)
2222
{
2323
$moderationReminderHelper = new ModerationReminderHelper();
2424
$responsiblesUserGroup = $moderationReminderHelper->getResponsiblesUserGroup($contextId);
2525

26-
return $responsiblesUserGroup->getId();
26+
return ($responsiblesUserGroup ? $responsiblesUserGroup->getId() : null);
2727
}
2828

29-
private function getResponsibles(int $responsiblesUserGroupId): array
29+
private function getAreaModeratorsUserGroupId($contextId)
30+
{
31+
$moderationReminderHelper = new ModerationReminderHelper();
32+
$areaModeratorsUserGroup = $moderationReminderHelper->getAreaModeratorsUserGroup($contextId);
33+
34+
return ($areaModeratorsUserGroup ? $areaModeratorsUserGroup->getId() : null);
35+
}
36+
37+
private function getUsersAssignedByGroupAndModerationStage(int $userGroupId, int $moderationStage): array
3038
{
3139
$moderationStageDao = new ModerationStageDAO();
32-
$responsibleAssignments = $moderationStageDao->getAssignmentsByUserGroupAndModerationStage(
33-
$responsiblesUserGroupId,
34-
SCIELO_MODERATION_STAGE_CONTENT
40+
$userAssignments = $moderationStageDao->getAssignmentsByUserGroupAndModerationStage(
41+
$userGroupId,
42+
$moderationStage
3543
);
3644

37-
if (empty($responsibleAssignments)) {
45+
if (empty($userAssignments)) {
3846
return [];
3947
}
4048

41-
$responsibles = [null => null];
49+
$usersAssigned = [null => null];
4250
$userDao = DAORegistry::getDAO('UserDAO');
43-
foreach ($responsibleAssignments as $assignment) {
51+
foreach ($userAssignments as $assignment) {
4452
$user = $userDao->getById($assignment['userId']);
45-
$fullName = $user->getFullName();
46-
$responsibles[$user->getId()] = $fullName;
53+
$usersAssigned[$user->getId()] = $user->getFullName();
4754
}
4855

49-
asort($responsibles, SORT_STRING);
56+
asort($usersAssigned, SORT_STRING);
5057

51-
return $responsibles;
58+
return $usersAssigned;
5259
}
5360

5461
public function fetch($request, $template = null, $display = false)
5562
{
5663
$templateMgr = TemplateManager::getManager($request);
5764
$contextId = $request->getContext()->getId();
5865

66+
$roles = [
67+
REMINDER_TYPE_PRE_MODERATION => __('plugins.generic.scieloModerationStages.sendModerationReminder.responsible.title'),
68+
REMINDER_TYPE_AREA_MODERATION => __('plugins.generic.scieloModerationStages.sendModerationReminder.areaModerator.title')
69+
];
70+
5971
$responsiblesUserGroupId = $this->getResponsiblesUserGroupId($contextId);
60-
$responsibles = $this->getResponsibles($responsiblesUserGroupId);
72+
if (!is_null($responsiblesUserGroupId)) {
73+
$responsibles = $this->getUsersAssignedByGroupAndModerationStage($responsiblesUserGroupId, SCIELO_MODERATION_STAGE_CONTENT);
74+
$templateMgr->assign([
75+
'responsiblesUserGroupId' => $responsiblesUserGroupId,
76+
'responsibles' => $responsibles
77+
]);
78+
}
79+
80+
$areaModeratorsUserGroupId = $this->getAreaModeratorsUserGroupId($contextId);
81+
if (!is_null($areaModeratorsUserGroupId)) {
82+
$areaModerators = $this->getUsersAssignedByGroupAndModerationStage($areaModeratorsUserGroupId, SCIELO_MODERATION_STAGE_AREA);
83+
$templateMgr->assign([
84+
'areaModeratorsUserGroupId' => $areaModeratorsUserGroupId,
85+
'areaModerators' => $areaModerators
86+
]);
87+
}
6188

6289
$templateMgr->assign([
63-
'responsiblesUserGroupId' => $responsiblesUserGroupId,
64-
'responsibles' => $responsibles,
90+
'roles' => $roles,
6591
'pluginName' => $this->plugin->getName(),
6692
'applicationName' => Application::get()->getName()
6793
]);
@@ -71,21 +97,33 @@ public function fetch($request, $template = null, $display = false)
7197

7298
public function readInputData()
7399
{
74-
$this->readUserVars(['responsible', 'reminderBody']);
100+
$this->readUserVars(['reminderRole', 'responsible', 'areaModerator', 'reminderBody']);
75101
}
76102

77103
public function execute(...$functionArgs)
78104
{
79-
$responsibleUserId = $this->getData('responsible');
80-
$reminderBody = $this->getData('reminderBody');
81-
82-
$responsible = DAORegistry::getDAO('UserDAO')->getById($responsibleUserId);
105+
$reminderRole = $this->getData('reminderRole');
106+
$locale = AppLocale::getLocale();
83107
$context = Application::get()->getRequest()->getContext();
108+
$reminderBody = $this->getData('reminderBody');
84109

85-
$locale = AppLocale::getLocale();
86-
$preModerationTimeLimit = $this->plugin->getSetting($this->contextId, 'preModerationTimeLimit');
110+
if ($reminderRole == REMINDER_TYPE_PRE_MODERATION) {
111+
$userId = $this->getData('responsible');
112+
$moderationTimeLimit = $this->plugin->getSetting($this->contextId, 'preModerationTimeLimit');
113+
} elseif ($reminderRole == REMINDER_TYPE_AREA_MODERATION) {
114+
$userId = $this->getData('areaModerator');
115+
$moderationTimeLimit = $this->plugin->getSetting($this->contextId, 'areaModerationTimeLimit');
116+
}
87117

88-
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder($context, $responsible, [], $locale, $preModerationTimeLimit);
118+
$user = DAORegistry::getDAO('UserDAO')->getById($userId);
119+
$moderationReminderEmailBuilder = new ModerationReminderEmailBuilder(
120+
$context,
121+
$user,
122+
[],
123+
$locale,
124+
$reminderRole,
125+
$moderationTimeLimit
126+
);
89127
$reminderEmail = $moderationReminderEmailBuilder->buildEmail();
90128
$reminderEmail->setBody($reminderBody);
91129

0 commit comments

Comments
 (0)