Skip to content

Commit fac01ce

Browse files
committed
Merge branch 'implementsModeratioRegress34' into 'main'
Implements Moderation Stage Regress See merge request softwares-pkp/plugins_ojs/scieloModerationStages!33
2 parents d9293c9 + a6685cc commit fac01ce

12 files changed

Lines changed: 297 additions & 33 deletions

classes/ModerationStage.php

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use APP\submission\Submission;
66
use PKP\core\Core;
7+
use Exception;
78

89
class ModerationStage
910
{
@@ -39,6 +40,20 @@ private function getNextModerationStage($stage)
3940
return $nextStageMap[$stage];
4041
}
4142

43+
private function getPreviousModerationStage($stage)
44+
{
45+
$previousStageMap = [
46+
self::SCIELO_MODERATION_STAGE_CONTENT => self::SCIELO_MODERATION_STAGE_FORMAT,
47+
self::SCIELO_MODERATION_STAGE_AREA => self::SCIELO_MODERATION_STAGE_CONTENT,
48+
];
49+
50+
if (!isset($previousStageMap[$stage])) {
51+
throw new Exception('There is no moderation stage previous to the current one');
52+
}
53+
54+
return $previousStageMap[$stage];
55+
}
56+
4257
private function getModerationStageEntryConfig($stage)
4358
{
4459
$stageMap = [
@@ -84,9 +99,17 @@ public function getNextStageName(): string
8499
return $this->getModerationStageName($nextStage);
85100
}
86101

102+
public function getPreviousStageName(): string
103+
{
104+
$currentStage = $this->submission->getData('currentModerationStage');
105+
$previousStage = $this->getPreviousModerationStage($currentStage);
106+
107+
return $this->getModerationStageName($previousStage);
108+
}
109+
87110
public function canAdvanceStage(): bool
88111
{
89-
if ($this->submission->getData('status') == Submission::STATUS_DECLINED || $this->submission->getData('status') == Submission::STATUS_PUBLISHED) {
112+
if ($this->submissionIsFinished()) {
90113
return false;
91114
}
92115

@@ -98,6 +121,26 @@ public function canAdvanceStage(): bool
98121
return true;
99122
}
100123

124+
public function canRegressStage(): bool
125+
{
126+
if ($this->submissionIsFinished()) {
127+
return false;
128+
}
129+
130+
$currentStage = $this->submission->getData('currentModerationStage');
131+
if (is_null($currentStage) || $currentStage == self::SCIELO_MODERATION_STAGE_FORMAT) {
132+
return false;
133+
}
134+
135+
return true;
136+
}
137+
138+
private function submissionIsFinished(): bool
139+
{
140+
return $this->submission->getData('status') == Submission::STATUS_DECLINED
141+
|| $this->submission->getData('status') == Submission::STATUS_PUBLISHED;
142+
}
143+
101144
public function submissionStageExists(): bool
102145
{
103146
return !is_null($this->submission->getData('currentModerationStage'));
@@ -116,6 +159,21 @@ public function sendNextStage()
116159
$this->setSubmissionToStage($nextStage);
117160
}
118161

162+
public function sendPreviousStage()
163+
{
164+
$currentStage = $this->submission->getData('currentModerationStage');
165+
$previousStage = $this->getPreviousModerationStage($currentStage);
166+
167+
$this->clearModerationStageEntryDate($currentStage);
168+
$this->setSubmissionToStage($previousStage);
169+
}
170+
171+
private function clearModerationStageEntryDate($stage)
172+
{
173+
$moderationStageEntryConfig = $this->getModerationStageEntryConfig($stage);
174+
$this->submission->setData($moderationStageEntryConfig, null);
175+
}
176+
119177
private function setSubmissionToStage($stage)
120178
{
121179
$moderationStageEntryConfig = $this->getModerationStageEntryConfig($stage);

classes/ModerationStageRegister.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ public function registerModerationStageOnDatabase(ModerationStage $stage)
1616
Repo::submission()->edit($stage->submission, []);
1717
}
1818

19-
public function registerModerationStageOnSubmissionlog(ModerationStage $stage)
20-
{
19+
public function registerModerationStageOnSubmissionLog(
20+
ModerationStage $stage,
21+
string $messageKey = 'plugins.generic.scieloModerationStages.log.submissionSentToModerationStage'
22+
) {
2123
$stageName = $stage->getCurrentStageName();
2224
$submission = $stage->submission;
2325

@@ -28,7 +30,7 @@ public function registerModerationStageOnSubmissionlog(ModerationStage $stage)
2830
'assocId' => $submission->getId(),
2931
'eventType' => PKPSubmissionEventLogEntry::SUBMISSION_LOG_METADATA_UPDATE,
3032
'userId' => Validation::loggedInAs() ?? $user->getId(),
31-
'message' => 'plugins.generic.scieloModerationStages.log.submissionSentToModerationStage',
33+
'message' => $messageKey,
3234
'moderationStageName' => $stageName,
3335
'isTranslated' => false,
3436
'dateLogged' => Core::getCurrentDate(),

classes/dispatchers/WorkflowDispatcher.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,27 @@ public function addToWorkflowTabs($hookName, $params)
4747
if ($moderationStage->submissionStageExists()) {
4848
$stageDates = $moderationStage->getStageEntryDates();
4949
$currentStageName = $moderationStage->getCurrentStageName(false);
50+
$canAdvanceStage = $moderationStage->canAdvanceStage();
51+
$canRegressStage = $moderationStage->canRegressStage();
5052

5153
$templateMgr->assign([
5254
...$stageDates,
5355
'submissionId' => $submission->getId(),
5456
'userIsAuthor' => $this->plugin->userIsAuthor($submission),
5557
'currentStage' => $currentStageName,
56-
'canAdvanceStage' => $moderationStage->canAdvanceStage(),
58+
'canAdvanceStage' => $canAdvanceStage,
59+
'canRegressStage' => $canRegressStage,
5760
'faqUrl' => $faqUrl
5861
]);
5962

60-
if ($moderationStage->canAdvanceStage()) {
63+
if ($canAdvanceStage) {
6164
$templateMgr->assign('nextStage', $moderationStage->getNextStageName());
6265
}
6366

67+
if ($canRegressStage) {
68+
$templateMgr->assign('previousStage', $moderationStage->getPreviousStageName());
69+
}
70+
6471
$output .= sprintf(
6572
'<tab id="scieloModerationStages" label="%s">%s</tab>',
6673
__('plugins.generic.scieloModerationStages.displayNameWorkflow'),

controllers/ScieloModerationStagesHandler.php

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PKP\facades\Locale;
99
use APP\facades\Repo;
1010
use PKP\security\Role;
11+
use PKP\security\authorization\ContextAccessPolicy;
1112
use PKP\db\DAORegistry;
1213
use APP\submission\Submission;
1314
use APP\decision\Decision;
@@ -22,6 +23,25 @@ class ScieloModerationStagesHandler extends Handler
2223
private const SUBMISSION_STAGE_ID = 5;
2324
private const THRESHOLD_TIME_EXHIBITORS = 2;
2425

26+
public function __construct()
27+
{
28+
parent::__construct();
29+
$this->addRoleAssignment(
30+
[Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_MANAGER, Role::ROLE_ID_SUB_EDITOR, Role::ROLE_ID_ASSISTANT],
31+
['getReminderBody', 'updateSubmissionStageData', 'getSubmissionExhibitData', 'getUserIsAuthor']
32+
);
33+
$this->addRoleAssignment(
34+
[Role::ROLE_ID_AUTHOR],
35+
['getSubmissionExhibitData', 'getUserIsAuthor']
36+
);
37+
}
38+
39+
public function authorize($request, &$args, $roleAssignments)
40+
{
41+
$this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
42+
return parent::authorize($request, $args, $roleAssignments);
43+
}
44+
2545
public function getReminderBody($args, $request)
2646
{
2747
$userGroupId = (int) $args['userGroup'];
@@ -86,24 +106,39 @@ public function updateSubmissionStageData($args, $request)
86106
$submission->setData('areaStageEntryDate', $args['areaStageEntryDate']);
87107
}
88108

89-
$userSelectedAdvanceStage = ($args['sendNextStage'] == 1);
90-
if ($userSelectedAdvanceStage and $moderationStage->canAdvanceStage()) {
109+
$stageChangeAction = $args['stageChangeAction'] ?? null;
110+
111+
if ($stageChangeAction === 'advance' and $moderationStage->canAdvanceStage()) {
91112
$moderationStage->sendNextStage();
92-
$moderationStageRegister = new ModerationStageRegister();
93-
$moderationStageRegister->registerModerationStageOnDatabase($moderationStage);
94-
$moderationStageRegister->registerModerationStageOnSubmissionLog($moderationStage);
113+
$this->registerStageChange(
114+
$moderationStage,
115+
'plugins.generic.scieloModerationStages.log.submissionSentToModerationStage'
116+
);
95117

96-
$emailBuilder = new StageAdvancementEmailBuilder();
97-
$email = $emailBuilder->setSubmission($submission)
118+
$email = (new StageAdvancementEmailBuilder())
119+
->setSubmission($submission)
98120
->buildEmailParams()
99121
->build();
100122
Mail::send($email);
123+
} elseif ($stageChangeAction === 'regress' and $moderationStage->canRegressStage()) {
124+
$moderationStage->sendPreviousStage();
125+
$this->registerStageChange(
126+
$moderationStage,
127+
'plugins.generic.scieloModerationStages.log.submissionReturnedToModerationStage'
128+
);
101129
}
102130

103131
Repo::submission()->edit($submission, []);
104132
return http_response_code(200);
105133
}
106134

135+
private function registerStageChange(ModerationStage $moderationStage, string $logMessageKey): void
136+
{
137+
$moderationStageRegister = new ModerationStageRegister();
138+
$moderationStageRegister->registerModerationStageOnDatabase($moderationStage);
139+
$moderationStageRegister->registerModerationStageOnSubmissionLog($moderationStage, $logMessageKey);
140+
}
141+
107142
public function getSubmissionExhibitData($args, $request)
108143
{
109144
$submissionId = (int) $args['submissionId'];

cypress/tests/Test3_workflowTab.cy.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ describe("SciELO Moderation Stages - Workflow tab", function() {
8080
cy.get('#publication-button').click();
8181
cy.get('#scieloModerationStages-button').click();
8282

83-
cy.get('#checkboxSendNextStageMenuYes').check();
83+
cy.get('#stageChangeActionAdvance').check();
8484
cy.get('#moderationStageSubmit').click();
8585

8686
cy.reload();
@@ -114,4 +114,19 @@ describe("SciELO Moderation Stages - Workflow tab", function() {
114114
cy.contains('Optionally, you may also provide an endorsement for the preprint, if you have one');
115115
cy.contains('For more information, we recommend reading our FAQs #10 and #19');
116116
});
117+
it("Editor returns submission to the previous moderation stage", function() {
118+
cy.login('dbarnes', null, 'publicknowledge');
119+
cy.findSubmission('active', submissionData.title);
120+
121+
cy.get('#publication-button').click();
122+
cy.get('#scieloModerationStages-button').click();
123+
124+
cy.get('#stageChangeActionRegress').check();
125+
cy.get('#moderationStageSubmit').click();
126+
127+
cy.reload();
128+
cy.get('#scieloModerationStages-button').click();
129+
cy.get('#stageChangeDiv').contains('This submission is in the Format Pre-Moderation stage');
130+
cy.get('input[name="formatStageEntryDate"]').should('have.value', today);
131+
});
117132
});

cypress/tests/Test4_submissionsPage.cy.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('SciELO Moderation Stages - Features on submissions page', function ()
2222
cy.get('.listPanel__itemSubtitle:visible:contains("' + submission3 + '")')
2323
.parent().within(() => {
2424
cy.contains('Moderation stage:');
25-
cy.contains('Manuscript Type Pre-Moderation');
25+
cy.contains('Format Pre-Moderation');
2626
});
2727
});
2828
it("Editor can view all submissions' exhibitors", function () {
@@ -41,7 +41,7 @@ describe('SciELO Moderation Stages - Features on submissions page', function ()
4141
cy.get('.listPanel__itemSubtitle:visible:contains("' + submission3 + '")')
4242
.parent().within(() => {
4343
cy.contains('Moderation stage:');
44-
cy.contains('Manuscript Type Pre-Moderation');
44+
cy.contains('Format Pre-Moderation');
4545

4646
cy.contains('Submission made less than a day ago');
4747
});
@@ -59,7 +59,7 @@ describe('SciELO Moderation Stages - Features on submissions page', function ()
5959
cy.get('li.listPanel__item:visible').should('have.length', 1);
6060
cy.contains(submission1);
6161

62-
cy.get('.pkpFilter__label:visible:contains("Manuscript Type Pre-Moderation")').click();
62+
cy.get('.pkpFilter__label:visible:contains("Format Pre-Moderation")').click();
6363
cy.waitJQuery();
6464
cy.get('li.listPanel__item:visible').should('have.length', 2);
6565
cy.contains(submission1);

locale/en/locale.po

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ msgstr "This plugin adds the stages of moderation defined by SciELO to OPS"
2626
msgid "plugins.generic.scieloModerationStages.log.submissionSentToModerationStage"
2727
msgstr "The submission has been sent to the {$moderationStageName} stage"
2828

29+
msgid "plugins.generic.scieloModerationStages.log.submissionReturnedToModerationStage"
30+
msgstr "The submission has been returned to the {$moderationStageName} stage"
31+
2932
msgid "plugins.generic.scieloModerationStages.stages.formatStage"
3033
msgstr "Format Pre-Moderation"
3134

@@ -61,8 +64,20 @@ msgstr "SciELO Moderation Stage"
6164
msgid "plugins.generic.scieloModerationStages.checkboxSendNextStage"
6265
msgstr "This submission is in the {$currentStage} stage, do you want to send it to the {$nextStage} stage?"
6366

64-
msgid "plugins.generic.scieloModerationStages.sendNextStageField"
65-
msgstr "Send to the next moderation stage"
67+
msgid "plugins.generic.scieloModerationStages.stageChangeField"
68+
msgstr "Moderation stage change"
69+
70+
msgid "plugins.generic.scieloModerationStages.stageChange.description"
71+
msgstr "This submission is in the {$currentStage} stage. Select what you want to do:"
72+
73+
msgid "plugins.generic.scieloModerationStages.stageChange.advance"
74+
msgstr "Send to the {$nextStage} stage"
75+
76+
msgid "plugins.generic.scieloModerationStages.stageChange.regress"
77+
msgstr "Return to the {$previousStage} stage"
78+
79+
msgid "plugins.generic.scieloModerationStages.stageChange.stay"
80+
msgstr "Remain in the current stage"
6681

6782
msgid "plugins.generic.scieloModerationStages.menuDates.fieldDescription"
6883
msgstr "The submission has entered in this moderation stage in the following data"

locale/es/locale.po

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ msgstr "Este módulo agrega las etapas de moderación definidas por SciELO a OPS
2626
msgid "plugins.generic.scieloModerationStages.log.submissionSentToModerationStage"
2727
msgstr "El envío ha sido enviado a la etapa de {$moderationStageName}"
2828

29+
msgid "plugins.generic.scieloModerationStages.log.submissionReturnedToModerationStage"
30+
msgstr "El envío ha sido devuelto a la etapa de {$moderationStageName}"
31+
2932
msgid "plugins.generic.scieloModerationStages.stages.formatStage"
3033
msgstr "Moderación Previa del Formato"
3134

@@ -61,8 +64,20 @@ msgstr "Etapa de Moderación SciELO"
6164
msgid "plugins.generic.scieloModerationStages.checkboxSendNextStage"
6265
msgstr "Este envío se encuentra en la etapa de {$currentStage}, ¿le gustaría enviarlo a la etapa de {$nextStage}?"
6366

64-
msgid "plugins.generic.scieloModerationStages.sendNextStageField"
65-
msgstr "Enviar a la siguiente etapa de moderación"
67+
msgid "plugins.generic.scieloModerationStages.stageChangeField"
68+
msgstr "Cambio de etapa de moderación"
69+
70+
msgid "plugins.generic.scieloModerationStages.stageChange.description"
71+
msgstr "Este envío se encuentra en la etapa de {$currentStage}. Seleccione lo que desea hacer:"
72+
73+
msgid "plugins.generic.scieloModerationStages.stageChange.advance"
74+
msgstr "Enviar a la etapa de {$nextStage}"
75+
76+
msgid "plugins.generic.scieloModerationStages.stageChange.regress"
77+
msgstr "Devolver a la etapa de {$previousStage}"
78+
79+
msgid "plugins.generic.scieloModerationStages.stageChange.stay"
80+
msgstr "Permanecer en la etapa actual"
6681

6782
msgid "plugins.generic.scieloModerationStages.menuDates.fieldDescription"
6883
msgstr "Lo envío entró en esta etapa de moderación en la siguiente fecha"

locale/pt_BR/emails.po

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ msgstr ""
5454
"Por favor, aguarde retorno da nossa equipe.<br>\n"
5555
"<br>\n"
5656
"Para mais informações, recomendamos a leitura da nossa <a href=\"{$faqUrl}\">FAQ n°19</a>.<br>\n"
57-
"<br>\n"
57+
"<br>\n"

locale/pt_BR/locale.po

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ msgstr "Este plugin adiciona os estágios de moderação definidos pela SciELO a
2626
msgid "plugins.generic.scieloModerationStages.log.submissionSentToModerationStage"
2727
msgstr "A submissão foi enviada para o estágio de {$moderationStageName}"
2828

29+
msgid "plugins.generic.scieloModerationStages.log.submissionReturnedToModerationStage"
30+
msgstr "A submissão foi retornada para o estágio de {$moderationStageName}"
31+
2932
msgid "plugins.generic.scieloModerationStages.stages.formatStage"
3033
msgstr "Pré-Moderação de Formato"
3134

@@ -61,8 +64,20 @@ msgstr "Estágio de Moderação SciELO"
6164
msgid "plugins.generic.scieloModerationStages.checkboxSendNextStage"
6265
msgstr "Esta submissão está no estágio de {$currentStage}, deseja a enviar para o estágio de {$nextStage}?"
6366

64-
msgid "plugins.generic.scieloModerationStages.sendNextStageField"
65-
msgstr "Enviar para o próximo estágio de moderação"
67+
msgid "plugins.generic.scieloModerationStages.stageChangeField"
68+
msgstr "Mudança de estágio de moderação"
69+
70+
msgid "plugins.generic.scieloModerationStages.stageChange.description"
71+
msgstr "Esta submissão está no estágio de {$currentStage}. Selecione o que deseja fazer:"
72+
73+
msgid "plugins.generic.scieloModerationStages.stageChange.advance"
74+
msgstr "Enviar para o estágio de {$nextStage}"
75+
76+
msgid "plugins.generic.scieloModerationStages.stageChange.regress"
77+
msgstr "Retornar para o estágio de {$previousStage}"
78+
79+
msgid "plugins.generic.scieloModerationStages.stageChange.stay"
80+
msgstr "Permanecer no estágio atual"
6681

6782
msgid "plugins.generic.scieloModerationStages.menuDates.fieldDescription"
6883
msgstr "A submissão entrou nesse estágio de moderação na seguinte data"

0 commit comments

Comments
 (0)