From 3f8fd1fa10abb3166f0f971cf717ebceb85c951b Mon Sep 17 00:00:00 2001 From: Taslan Graham Date: Tue, 22 Oct 2024 13:50:47 -0500 Subject: [PATCH 1/2] pkp/pkp-lib#10537 Add available editorial decisions to submission's stages data --- classes/submission/maps/Schema.php | 93 ++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/classes/submission/maps/Schema.php b/classes/submission/maps/Schema.php index c5be7660697..f569e3b09b6 100644 --- a/classes/submission/maps/Schema.php +++ b/classes/submission/maps/Schema.php @@ -14,9 +14,27 @@ namespace APP\submission\maps; use APP\core\Application; +use APP\decision\types\Accept; +use APP\decision\types\SkipExternalReview; +use APP\facades\Repo; use APP\submission\Submission; use Illuminate\Support\Collection; +use PKP\db\DAORegistry; +use PKP\decision\DecisionType; +use PKP\decision\types\BackFromCopyediting; +use PKP\decision\types\BackFromProduction; +use PKP\decision\types\CancelReviewRound; +use PKP\decision\types\Decline; +use PKP\decision\types\InitialDecline; +use PKP\decision\types\RequestRevisions; +use PKP\decision\types\RevertDecline; +use PKP\decision\types\RevertInitialDecline; +use PKP\decision\types\SendExternalReview; +use PKP\decision\types\SendToProduction; +use PKP\plugins\Hook; +use PKP\security\Role; use PKP\submission\PKPSubmission; +use PKP\submission\reviewRound\ReviewRoundDAO; class Schema extends \PKP\submission\maps\Schema { @@ -62,4 +80,79 @@ protected function appSpecificProps(): array 'scheduledIn', ]; } + + + /** + * Gets the Editorial decisions available to editors for a given stage of a submission + * + * This method returns decisions only for active stages. For inactive stages, it returns an empty array. + * + * @return DecisionType[] + * + * @hook Workflow::Decisions [[&$decisionTypes, $stageId]] + */ + protected function getAvailableEditorialDecisions(int $stageId, Submission $submission): array + { + $request = Application::get()->getRequest(); + $user = $request->getUser(); + $isActiveStage = $submission->getData('stageId') == $stageId; + $permissions = $this->checkDecisionPermissions($stageId, $submission, $user, $request->getContext()->getId()); + $userHasAccessibleRoles = $user->hasRole([Role::ROLE_ID_SUB_EDITOR, Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_ASSISTANT], $request->getContext()->getId()); + + if (!$userHasAccessibleRoles || !$isActiveStage || !$permissions['canMakeDecision']) { + return []; + } + + $decisionTypes = []; /** @var DecisionType[] $decisionTypes */ + $isOnlyRecommending = $permissions['isOnlyRecommending']; + + if ($isOnlyRecommending && $stageId == WORKFLOW_STAGE_ID_SUBMISSION) { + $decisionTypes[] = Repo::decision()->getDecisionTypesMadeByRecommendingUsers($stageId); + } else { + switch ($stageId) { + case WORKFLOW_STAGE_ID_SUBMISSION: + $decisionTypes = [ + new SendExternalReview(), + new SkipExternalReview(), + ]; + if ($submission->getData('status') === Submission::STATUS_DECLINED) { + $decisionTypes[] = new RevertInitialDecline(); + } elseif ($submission->getData('status') === Submission::STATUS_QUEUED) { + $decisionTypes[] = new InitialDecline(); + } + break; + case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW: + $decisionTypes = [ + new RequestRevisions(), + new Accept(), + ]; + $cancelReviewRound = new CancelReviewRound(); + $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /** @var ReviewRoundDAO $reviewRoundDao */ + $reviewRound = $reviewRoundDao->getLastReviewRoundBySubmissionId($submission->getId(), $stageId); + + if ($cancelReviewRound->canRetract($submission, $reviewRound->getId())) { + $decisionTypes[] = $cancelReviewRound; + } + if ($submission->getData('status') === Submission::STATUS_DECLINED) { + $decisionTypes[] = new RevertDecline(); + } elseif ($submission->getData('status') === Submission::STATUS_QUEUED) { + $decisionTypes[] = new Decline(); + } + break; + case WORKFLOW_STAGE_ID_EDITING: + $decisionTypes = [ + new SendToProduction(), + new BackFromCopyediting(), + ]; + break; + case WORKFLOW_STAGE_ID_PRODUCTION: + $decisionTypes[] = new BackFromProduction(); + break; + } + } + + Hook::call('Workflow::Decisions', [&$decisionTypes, $stageId]); + + return $decisionTypes; + } } From 378c2b95ad6a0ee4eb0346505dc4bacf940d4ab9 Mon Sep 17 00:00:00 2001 From: Taslan Graham Date: Thu, 24 Oct 2024 15:19:26 -0500 Subject: [PATCH 2/2] Submodule update --- lib/pkp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pkp b/lib/pkp index 9e75633e480..af501d2e3d0 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 9e75633e4809dc79ce26b8e8a3287073478020bb +Subproject commit af501d2e3d0bcec2b0b57986349bc1280f21b6dc