132 lines
3.7 KiB
PHP
132 lines
3.7 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/decision/Steps.php
|
|
*
|
|
* Copyright (c) 2014-2022 Simon Fraser University
|
|
* Copyright (c) 2000-2022 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Steps
|
|
*
|
|
* @brief A base class to define a step-by-step workflow to record a decision type
|
|
*/
|
|
|
|
namespace PKP\decision;
|
|
|
|
use APP\facades\Repo;
|
|
use APP\submission\Submission;
|
|
use PKP\context\Context;
|
|
use PKP\db\DAORegistry;
|
|
use PKP\stageAssignment\StageAssignment;
|
|
use PKP\stageAssignment\StageAssignmentDAO;
|
|
use PKP\submission\reviewRound\ReviewRound;
|
|
use PKP\user\User;
|
|
|
|
class Steps
|
|
{
|
|
public DecisionType $decisionType;
|
|
public Submission $submission;
|
|
public Context $context;
|
|
public ?ReviewRound $reviewRound;
|
|
public array $steps = [];
|
|
|
|
public function __construct(DecisionType $decisionType, Submission $submission, Context $context, ?ReviewRound $reviewRound = null)
|
|
{
|
|
$this->decisionType = $decisionType;
|
|
$this->submission = $submission;
|
|
$this->context = $context;
|
|
if ($reviewRound) {
|
|
$this->reviewRound = $reviewRound;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add a step to the workflow
|
|
*
|
|
* @param bool $prepend Pass true to add this step before other steps
|
|
*/
|
|
public function addStep(Step $step, bool $prepend = false)
|
|
{
|
|
if ($prepend) {
|
|
array_unshift($this->steps, $step);
|
|
} else {
|
|
$this->steps[$step->id] = $step;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Compile initial state data to pass to the frontend
|
|
*
|
|
* @see DecisionPage.vue
|
|
*/
|
|
public function getState(): array
|
|
{
|
|
$state = [];
|
|
foreach ($this->steps as $step) {
|
|
$state[] = $step->getState();
|
|
}
|
|
return $state;
|
|
}
|
|
|
|
/**
|
|
* Get all users assigned to a role in this decision's stage
|
|
*
|
|
* @param integer $roleId
|
|
*
|
|
* @return array<User>
|
|
*/
|
|
public function getStageParticipants(int $roleId): array
|
|
{
|
|
/** @var StageAssignmentDAO $stageAssignmentDao */
|
|
$stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO');
|
|
$userIds = [];
|
|
$result = $stageAssignmentDao->getBySubmissionAndRoleIds(
|
|
$this->submission->getId(),
|
|
[$roleId],
|
|
$this->decisionType->getStageId()
|
|
);
|
|
/** @var StageAssignment $stageAssignment */
|
|
while ($stageAssignment = $result->next()) {
|
|
$userIds[] = (int) $stageAssignment->getUserId();
|
|
}
|
|
$users = [];
|
|
foreach (array_unique($userIds) as $authorUserId) {
|
|
$users[] = Repo::user()->get($authorUserId);
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
|
|
/**
|
|
* Get all reviewers who completed a review in this decision's stage
|
|
*
|
|
* @param array<\PKP\submission\reviewAssignment\ReviewAssignment> $reviewAssignments
|
|
*
|
|
* @return array<User>
|
|
*/
|
|
public function getReviewersFromAssignments(array $reviewAssignments): array
|
|
{
|
|
$reviewers = [];
|
|
foreach ($reviewAssignments as $reviewAssignment) {
|
|
$reviewers[] = Repo::user()->get((int) $reviewAssignment->getReviewerId());
|
|
}
|
|
return $reviewers;
|
|
}
|
|
|
|
/**
|
|
* Get all assigned editors who can make a decision in this stage
|
|
*/
|
|
public function getDecidingEditors(): array
|
|
{
|
|
/** @var StageAssignmentDAO $stageAssignmentDao */
|
|
$stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO');
|
|
$userIds = $stageAssignmentDao->getDecidingEditorIds($this->submission->getId(), $this->decisionType->getStageId());
|
|
$users = [];
|
|
foreach (array_unique($userIds) as $authorUserId) {
|
|
$users[] = Repo::user()->get($authorUserId);
|
|
}
|
|
|
|
return $users;
|
|
}
|
|
}
|