Open Journal Systems  3.3.0
ReviewRound.inc.php
1 <?php
2 
19 // The first four statuses are set explicitly by EditorDecisions, which override
20 // the current status.
21 define('REVIEW_ROUND_STATUS_REVISIONS_REQUESTED', 1);
22 define('REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW', 2);
23 define('REVIEW_ROUND_STATUS_SENT_TO_EXTERNAL', 3);
24 define('REVIEW_ROUND_STATUS_ACCEPTED', 4);
25 define('REVIEW_ROUND_STATUS_DECLINED', 5);
26 
27 // The following statuses are calculated based on the statuses of ReviewAssignments
28 // in this round.
29 define('REVIEW_ROUND_STATUS_PENDING_REVIEWERS', 6); // No reviewers have been assigned
30 define('REVIEW_ROUND_STATUS_PENDING_REVIEWS', 7); // Waiting for reviews to be submitted by reviewers
31 define('REVIEW_ROUND_STATUS_REVIEWS_READY', 8); // One or more reviews is ready for an editor to view
32 define('REVIEW_ROUND_STATUS_REVIEWS_COMPLETED', 9); // All assigned reviews have been confirmed by an editor
33 define('REVIEW_ROUND_STATUS_REVIEWS_OVERDUE', 10); // One or more reviews is overdue
34 // The following status is calculated when the round is in REVIEW_ROUND_STATUS_REVISIONS_REQUESTED and
35 // at least one revision file has been uploaded.
36 define('REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED', 11);
37 
38 // The following statuses are calculated based on the statuses of recommendOnly EditorAssignments
39 // and their decisions in this round.
40 define('REVIEW_ROUND_STATUS_PENDING_RECOMMENDATIONS', 12); // Waiting for recommendations to be submitted by recommendOnly editors
41 define('REVIEW_ROUND_STATUS_RECOMMENDATIONS_READY', 13); // One or more recommendations are ready for an editor to view
42 define('REVIEW_ROUND_STATUS_RECOMMENDATIONS_COMPLETED', 14); // All assigned recommendOnly editors have made a recommendation
43 
44 // The following status is calculated when the round is in REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW and
45 // at least one revision file has been uploaded.
46 define('REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED', 15);
47 
48 class ReviewRound extends DataObject {
49 
50  //
51  // Get/set methods
52  //
53 
58  function getSubmissionId() {
59  return $this->getData('submissionId');
60  }
61 
66  function setSubmissionId($submissionId) {
67  $this->setData('submissionId', $submissionId);
68  }
69 
74  function getStageId() {
75  return $this->getData('stageId');
76  }
77 
82  function setStageId($stageId) {
83  $this->setData('stageId', $stageId);
84  }
85 
90  function getRound() {
91  return $this->getData('round');
92  }
93 
98  function setRound($round) {
99  $this->setData('round', $round);
100  }
101 
106  function getStatus() {
107  return $this->getData('status');
108  }
109 
114  function setStatus($status) {
115  $this->setData('status', $status);
116  }
117 
128  public function determineStatus() {
129  import('lib.pkp.classes.submission.SubmissionFile'); // Submission file constants
130 
131  // Check if revisions requested or received, if this is latest review round and then check files
132  $roundStatus = $this->getStatus();
133 
134  // If revisions have been requested, check to see if any have been
135  // submitted
136  if ($this->getStatus() == REVIEW_ROUND_STATUS_REVISIONS_REQUESTED || $this->getStatus() == REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED) {
137  // get editor decisions
138  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
139  $pendingRevisionDecision = $editDecisionDao->findValidPendingRevisionsDecision($this->getSubmissionId(), $this->getStageId(), SUBMISSION_EDITOR_DECISION_PENDING_REVISIONS);
140 
141  if ($pendingRevisionDecision) {
142  if ($editDecisionDao->responseExists($pendingRevisionDecision, $this->getSubmissionId())) {
143  return REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED;
144  }
145  }
146  return REVIEW_ROUND_STATUS_REVISIONS_REQUESTED;
147  }
148 
149  // If revisions have been requested for re-submission, check to see if any have been
150  // submitted
151  if ($this->getStatus() == REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW || $this->getStatus() == REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED) {
152  // get editor decisions
153  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
154  $pendingRevisionDecision = $editDecisionDao->findValidPendingRevisionsDecision($this->getSubmissionId(), $this->getStageId(), SUBMISSION_EDITOR_DECISION_RESUBMIT);
155 
156  if ($pendingRevisionDecision) {
157  if ($editDecisionDao->responseExists($pendingRevisionDecision, $this->getSubmissionId())) {
158  return REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED;
159  }
160  }
161  return REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW;
162  }
163 
164  $statusFinished = in_array(
165  $this->getStatus(), array(
166  REVIEW_ROUND_STATUS_SENT_TO_EXTERNAL,
167  REVIEW_ROUND_STATUS_ACCEPTED,
168  REVIEW_ROUND_STATUS_DECLINED
169  )
170  );
171  if ($statusFinished) {
172  return $this->getStatus();
173  }
174 
175  // Determine the round status by looking at the recommendOnly editor assignment statuses
176  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
177  $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); /* @var $editDecisionDao EditDecisionDAO */
178  $pendingRecommendations = false;
179  $recommendationsFinished = true;
180  $recommendationsReady = false;
181  $editorsStageAssignments = $stageAssignmentDao->getEditorsAssignedToStage($this->getSubmissionId(), $this->getStageId());
182  foreach ($editorsStageAssignments as $editorsStageAssignment) {
183  if ($editorsStageAssignment->getRecommendOnly()) {
184  $pendingRecommendations = true;
185  // Get recommendation from the assigned recommendOnly editor
186  $editorId = $editorsStageAssignment->getUserId();
187  $editorRecommendations = $editDecisionDao->getEditorDecisions($this->getSubmissionId(), $this->getStageId(), $this->getRound(), $editorId);
188  if (empty($editorRecommendations)) {
189  $recommendationsFinished = false;
190  } else {
191  $recommendationsReady = true;
192  }
193  }
194  }
195  if ($pendingRecommendations) {
196  if ($recommendationsFinished) {
197  return REVIEW_ROUND_STATUS_RECOMMENDATIONS_COMPLETED;
198  } elseif ($recommendationsReady) {
199  return REVIEW_ROUND_STATUS_RECOMMENDATIONS_READY;
200  }
201  }
202 
203  // Determine the round status by looking at the assignment statuses
204  $anyOverdueReview = false;
205  $anyIncompletedReview = false;
206  $anyUnreadReview = false;
207  import('lib.pkp.classes.submission.reviewAssignment.ReviewAssignmentDAO');
208  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
209  $reviewAssignments = $reviewAssignmentDao->getByReviewRoundId($this->getId());
210  foreach ($reviewAssignments as $reviewAssignment) {
211  assert(is_a($reviewAssignment, 'ReviewAssignment'));
212 
213  $assignmentStatus = $reviewAssignment->getStatus();
214 
215  switch ($assignmentStatus) {
216  case REVIEW_ASSIGNMENT_STATUS_DECLINED:
217  case REVIEW_ASSIGNMENT_STATUS_CANCELLED:
218  break;
219 
220  case REVIEW_ASSIGNMENT_STATUS_RESPONSE_OVERDUE:
221  case REVIEW_ASSIGNMENT_STATUS_REVIEW_OVERDUE:
222  $anyOverdueReview = true;
223  break;
224 
225  case REVIEW_ASSIGNMENT_STATUS_AWAITING_RESPONSE:
226  case REVIEW_ASSIGNMENT_STATUS_ACCEPTED:
227  $anyIncompletedReview = true;
228  break;
229 
230  case REVIEW_ASSIGNMENT_STATUS_RECEIVED:
231  $anyUnreadReview = true;
232  break;
233  }
234  }
235 
236  // Find the correct review round status based on the state of
237  // the current review assignments. The check order matters: the
238  // first conditions override the others.
239  if (empty($reviewAssignments)) {
240  return REVIEW_ROUND_STATUS_PENDING_REVIEWERS;
241  } elseif ($anyOverdueReview) {
242  return REVIEW_ROUND_STATUS_REVIEWS_OVERDUE;
243  } elseif ($anyUnreadReview) {
244  return REVIEW_ROUND_STATUS_REVIEWS_READY;
245  } elseif ($anyIncompletedReview) {
246  return REVIEW_ROUND_STATUS_PENDING_REVIEWS;
247  } elseif ($pendingRecommendations) {
248  return REVIEW_ROUND_STATUS_PENDING_RECOMMENDATIONS;
249  }
250  return REVIEW_ROUND_STATUS_REVIEWS_COMPLETED;
251  }
252 
258  function getStatusKey($isAuthor = false) {
259  switch ($this->determineStatus()) {
260  case REVIEW_ROUND_STATUS_REVISIONS_REQUESTED:
261  return 'editor.submission.roundStatus.revisionsRequested';
262  case REVIEW_ROUND_STATUS_REVISIONS_SUBMITTED:
263  return 'editor.submission.roundStatus.revisionsSubmitted';
264  case REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW:
265  return 'editor.submission.roundStatus.resubmitForReview';
266  case REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW_SUBMITTED:
267  return 'editor.submission.roundStatus.submissionResubmitted';
268  case REVIEW_ROUND_STATUS_SENT_TO_EXTERNAL:
269  return 'editor.submission.roundStatus.sentToExternal';
270  case REVIEW_ROUND_STATUS_ACCEPTED:
271  return 'editor.submission.roundStatus.accepted';
272  case REVIEW_ROUND_STATUS_DECLINED:
273  return 'editor.submission.roundStatus.declined';
274  case REVIEW_ROUND_STATUS_PENDING_REVIEWERS:
275  return 'editor.submission.roundStatus.pendingReviewers';
276  case REVIEW_ROUND_STATUS_PENDING_REVIEWS:
277  return 'editor.submission.roundStatus.pendingReviews';
278  case REVIEW_ROUND_STATUS_REVIEWS_READY:
279  return $isAuthor ? 'author.submission.roundStatus.reviewsReady' : 'editor.submission.roundStatus.reviewsReady';
280  case REVIEW_ROUND_STATUS_REVIEWS_COMPLETED:
281  return 'editor.submission.roundStatus.reviewsCompleted';
282  case REVIEW_ROUND_STATUS_REVIEWS_OVERDUE:
283  return 'editor.submission.roundStatus.reviewOverdue';
284  case REVIEW_ROUND_STATUS_PENDING_RECOMMENDATIONS:
285  return 'editor.submission.roundStatus.pendingRecommendations';
286  case REVIEW_ROUND_STATUS_RECOMMENDATIONS_READY:
287  return 'editor.submission.roundStatus.recommendationsReady';
288  case REVIEW_ROUND_STATUS_RECOMMENDATIONS_COMPLETED:
289  return 'editor.submission.roundStatus.recommendationsCompleted';
290  default: return null;
291  }
292  }
293 
294 }
295 
296 
DataObject\getData
& getData($key, $locale=null)
Definition: DataObject.inc.php:100
ReviewRound\getSubmissionId
getSubmissionId()
Definition: ReviewRound.inc.php:58
ReviewRound\setRound
setRound($round)
Definition: ReviewRound.inc.php:98
ReviewRound\setStageId
setStageId($stageId)
Definition: ReviewRound.inc.php:82
ReviewRound\setSubmissionId
setSubmissionId($submissionId)
Definition: ReviewRound.inc.php:66
DataObject
Any class with an associated DAO should extend this class.
Definition: DataObject.inc.php:18
ReviewRound\determineStatus
determineStatus()
Definition: ReviewRound.inc.php:128
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ReviewRound
Basic class describing a review round.
Definition: ReviewRound.inc.php:48
ReviewRound\getStatusKey
getStatusKey($isAuthor=false)
Definition: ReviewRound.inc.php:258
DataObject\getId
getId()
Definition: DataObject.inc.php:206
ReviewRound\setStatus
setStatus($status)
Definition: ReviewRound.inc.php:114
ReviewRound\getStatus
getStatus()
Definition: ReviewRound.inc.php:106
ReviewRound\getStageId
getStageId()
Definition: ReviewRound.inc.php:74
DataObject\setData
setData($key, $value, $locale=null)
Definition: DataObject.inc.php:132
ReviewRound\getRound
getRound()
Definition: ReviewRound.inc.php:90