Open Monograph Press  3.3.0
ReviewAssignmentDAO.inc.php
1 <?php
2 
18 import('lib.pkp.classes.submission.reviewAssignment.ReviewAssignment');
19 
20 class ReviewAssignmentDAO extends DAO {
21  var $userDao;
22 
26  function __construct() {
27  parent::__construct();
28  $this->userDao = DAORegistry::getDAO('UserDAO');
29  }
30 
31 
37  function getByReviewRoundId($reviewRoundId) {
38  $params = array((int)$reviewRoundId);
39  $query = $this->_getSelectQuery() .
40  ' WHERE r.review_round_id = ? ORDER BY review_id';
41  return $this->_getReviewAssignmentsArray($query, $params);
42  }
43 
49  function getOpenReviewsByReviewRoundId($reviewRoundId) {
50  $params = array((int)$reviewRoundId, SUBMISSION_REVIEW_METHOD_OPEN);
51  $query = $this->_getSelectQuery() .
52  ' WHERE r.review_round_id = ? AND r.review_method = ? AND r.date_confirmed IS NOT NULL AND r.declined <> 1 ORDER BY review_id';
53  return $this->_getReviewAssignmentsArray($query, $params);
54  }
55 
63  function _getReviewAssignmentsArray($query, $queryParams) {
64  $reviewAssignments = array();
65 
66  $result = $this->retrieve($query, $queryParams);
67 
68  while (!$result->EOF) {
69  $reviewAssignments[$result->fields['review_id']] = $this->_fromRow($result->GetRowAssoc(false));
70  $result->MoveNext();
71  }
72 
73  $result->Close();
74  return $reviewAssignments;
75  }
76 
82  function getReviewRoundJoin() {
83  return 'r.review_round_id = r2.review_round_id';
84  }
85 
86 
87  //
88  // Public methods.
89  //
96  function getReviewAssignment($reviewRoundId, $reviewerId) {
97  $result = $this->retrieve(
98  $this->_getSelectQuery() .
99  ' WHERE r.review_round_id = ? AND
100  r.reviewer_id = ?',
101  array(
102  (int) $reviewRoundId,
103  (int) $reviewerId
104  )
105  );
106 
107  $returner = null;
108  if ($result->RecordCount() != 0) {
109  $returner = $this->_fromRow($result->GetRowAssoc(false));
110  }
111 
112  $result->Close();
113  return $returner;
114  }
115 
116 
122  function getById($reviewId) {
123  $reviewRoundJoinString = $this->getReviewRoundJoin();
124  if ($reviewRoundJoinString) {
125  $result = $this->retrieve(
126  'SELECT r.*, r2.review_revision
127  FROM review_assignments r
128  LEFT JOIN review_rounds r2 ON (' . $reviewRoundJoinString . ')
129  WHERE r.review_id = ?',
130  (int) $reviewId
131  );
132 
133  $returner = null;
134  if ($result->RecordCount() != 0) {
135  $returner = $this->_fromRow($result->GetRowAssoc(false));
136  }
137 
138  $result->Close();
139  return $returner;
140  } else {
141  assert(false);
142  }
143  }
144 
151  $reviewAssignments = array();
152  $reviewRoundJoinString = $this->getReviewRoundJoin();
153  if ($reviewRoundJoinString) {
154  $result = $this->retrieve(
155  'SELECT r.*, r2.review_revision
156  FROM review_assignments r
157  LEFT JOIN review_rounds r2 ON (' . $reviewRoundJoinString . ')
159  ' ORDER BY r.submission_id'
160  );
161 
162  while (!$result->EOF) {
163  $reviewAssignments[] = $this->_fromRow($result->GetRowAssoc(false));
164  $result->MoveNext();
165  }
166 
167  $result->Close();
168  } else {
169  assert(false);
170  }
171 
172  return $reviewAssignments;
173  }
174 
181  return ' r.date_notified IS NOT NULL AND
182  r.date_completed IS NULL AND
183  r.declined <> 1 AND
184  r.cancelled <> 1';
185  }
186 
194  function getBySubmissionId($submissionId, $reviewRoundId = null, $stageId = null) {
195  $query = $this->_getSelectQuery() .
196  ' WHERE r.submission_id = ?';
197 
198  $orderBy = ' ORDER BY review_id';
199 
200  $queryParams[] = (int) $submissionId;
201 
202  if ($reviewRoundId != null) {
203  $query .= ' AND r2.review_round_id = ?';
204  $queryParams[] = (int) $reviewRoundId;
205  } else {
206  $orderBy .= ', r2.review_round_id';
207  }
208 
209  if ($stageId != null) {
210  $query .= ' AND r2.stage_id = ?';
211  $queryParams[] = (int) $stageId;
212  } else {
213  $orderBy .= ', r2.stage_id';
214  }
215 
216  $query .= $orderBy;
217 
218  return $this->_getReviewAssignmentsArray($query, $queryParams);
219  }
220 
226  function getByUserId($userId) {
227  $reviewAssignments = array();
228  $reviewRoundJoinString = $this->getReviewRoundJoin();
229 
230  if ($reviewRoundJoinString) {
231  $result = $this->retrieve(
232  'SELECT r.*, r2.review_revision
233  FROM review_assignments r
234  LEFT JOIN review_rounds r2 ON (' . $reviewRoundJoinString . ')
235  WHERE r.reviewer_id = ?
236  ORDER BY round, review_id',
237  (int) $userId
238  );
239 
240  while (!$result->EOF) {
241  $reviewAssignments[] = $this->_fromRow($result->GetRowAssoc(false));
242  $result->MoveNext();
243  }
244 
245  $result->Close();
246  } else {
247  assert(false);
248  }
249 
250  return $reviewAssignments;
251  }
252 
259  function reviewerExists($reviewRoundId, $reviewerId) {
260  $result = $this->retrieve(
261  'SELECT COUNT(*)
262  FROM review_assignments
263  WHERE review_round_id = ? AND
264  reviewer_id = ?',
265  array((int) $reviewRoundId, (int) $reviewerId)
266  );
267  $returner = isset($result->fields[0]) && $result->fields[0] == 1 ? true : false;
268 
269  $result->Close();
270  return $returner;
271  }
272 
278  function getByReviewFormId($reviewFormId) {
279  $reviewAssignments = array();
280  $reviewRoundJoinString = $this->getReviewRoundJoin();
281 
282  if ($reviewRoundJoinString) {
283  $result = $this->retrieve(
284  'SELECT r.*, r2.review_revision
285  FROM review_assignments r
286  LEFT JOIN review_rounds r2 ON (' . $reviewRoundJoinString . ')
287  WHERE r.review_form_id = ?
288  ORDER BY round, review_id',
289  (int) $reviewFormId
290  );
291 
292  while (!$result->EOF) {
293  $reviewAssignments[] = $this->_fromRow($result->GetRowAssoc(false));
294  $result->MoveNext();
295  }
296 
297  $result->Close();
298  } else {
299  assert(false);
300  }
301 
302  return $reviewAssignments;
303  }
304 
311  function getReviewIndexesForRound($submissionId, $reviewRoundId) {
312  $result = $this->retrieve(
313  'SELECT review_id
314  FROM review_assignments
315  WHERE submission_id = ? AND
316  review_round_id = ?
317  ORDER BY review_id',
318  array((int) $submissionId, (int) $reviewRoundId)
319  );
320 
321  $index = 0;
322  $returner = array();
323  while (!$result->EOF) {
324  $row = $result->GetRowAssoc(false);
325  $returner[$row['review_id']] = $index++;
326  $result->MoveNext();
327  }
328 
329  $result->Close();
330  return $returner;
331  }
332 
337  function insertObject($reviewAssignment) {
338  $result = $this->update(
339  sprintf('INSERT INTO review_assignments (
340  submission_id,
341  reviewer_id,
342  stage_id,
343  review_method,
344  round,
345  competing_interests,
346  recommendation,
347  declined,
348  cancelled,
349  date_assigned, date_notified, date_confirmed,
350  date_completed, date_acknowledged, date_due, date_response_due,
351  quality, date_rated,
352  last_modified,
353  date_reminded, reminder_was_automatic,
354  review_form_id,
355  review_round_id,
356  unconsidered
357  ) VALUES (
358  ?, ?, ?, ?, ?, ?, ?, ?, ?, %s, %s, %s, %s, %s, %s, %s, ?, %s, %s, %s, ?, ?, ?, ?
359  )',
360  $this->datetimeToDB($reviewAssignment->getDateAssigned()),
361  $this->datetimeToDB($reviewAssignment->getDateNotified()),
362  $this->datetimeToDB($reviewAssignment->getDateConfirmed()),
363  $this->datetimeToDB($reviewAssignment->getDateCompleted()),
364  $this->datetimeToDB($reviewAssignment->getDateAcknowledged()),
365  $this->datetimeToDB($reviewAssignment->getDateDue()),
366  $this->datetimeToDB($reviewAssignment->getDateResponseDue()),
367  $this->datetimeToDB($reviewAssignment->getDateRated()),
368  $this->datetimeToDB($reviewAssignment->getLastModified()),
369  $this->datetimeToDB($reviewAssignment->getDateReminded())
370  ), array(
371  (int) $reviewAssignment->getSubmissionId(),
372  (int) $reviewAssignment->getReviewerId(),
373  (int) $reviewAssignment->getStageId(),
374  (int) $reviewAssignment->getReviewMethod(),
375  max((int) $reviewAssignment->getRound(), 1),
376  $reviewAssignment->getCompetingInterests(),
377  $reviewAssignment->getRecommendation(),
378  (int) $reviewAssignment->getDeclined(),
379  (int) $reviewAssignment->getCancelled(),
380  $reviewAssignment->getQuality(),
381  (int) $reviewAssignment->getReminderWasAutomatic(),
382  $reviewAssignment->getReviewFormId(),
383  (int) $reviewAssignment->getReviewRoundId(),
384  (int) $reviewAssignment->getUnconsidered(),
385  )
386  );
387 
388  $reviewAssignment->setId($this->getInsertId());
389 
390  // Update review stage status whenever a review assignment is changed
391  $this->updateReviewRoundStatus($reviewAssignment);
392  }
393 
398  function updateObject($reviewAssignment) {
399  $result = $this->update(
400  sprintf('UPDATE review_assignments
401  SET submission_id = ?,
402  reviewer_id = ?,
403  stage_id = ?,
404  review_method = ?,
405  round = ?,
406  competing_interests = ?,
407  recommendation = ?,
408  declined = ?,
409  cancelled = ?,
410  date_assigned = %s,
411  date_notified = %s,
412  date_confirmed = %s,
413  date_completed = %s,
414  date_acknowledged = %s,
415  date_due = %s,
416  date_response_due = %s,
417  quality = ?,
418  date_rated = %s,
419  last_modified = %s,
420  date_reminded = %s,
421  reminder_was_automatic = ?,
422  review_form_id = ?,
423  review_round_id = ?,
424  unconsidered = ?
425  WHERE review_id = ?',
426  $this->datetimeToDB($reviewAssignment->getDateAssigned()), $this->datetimeToDB($reviewAssignment->getDateNotified()), $this->datetimeToDB($reviewAssignment->getDateConfirmed()), $this->datetimeToDB($reviewAssignment->getDateCompleted()), $this->datetimeToDB($reviewAssignment->getDateAcknowledged()), $this->datetimeToDB($reviewAssignment->getDateDue()), $this->datetimeToDB($reviewAssignment->getDateResponseDue()), $this->datetimeToDB($reviewAssignment->getDateRated()), $this->datetimeToDB($reviewAssignment->getLastModified()), $this->datetimeToDB($reviewAssignment->getDateReminded())),
427  array(
428  (int) $reviewAssignment->getSubmissionId(),
429  (int) $reviewAssignment->getReviewerId(),
430  (int) $reviewAssignment->getStageId(),
431  (int) $reviewAssignment->getReviewMethod(),
432  (int) $reviewAssignment->getRound(),
433  $reviewAssignment->getCompetingInterests(),
434  $reviewAssignment->getRecommendation(),
435  (int) $reviewAssignment->getDeclined(),
436  (int) $reviewAssignment->getCancelled(),
437  $reviewAssignment->getQuality(),
438  $reviewAssignment->getReminderWasAutomatic(),
439  $reviewAssignment->getReviewFormId(),
440  (int) $reviewAssignment->getReviewRoundId(),
441  (int) $reviewAssignment->getUnconsidered(),
442  (int) $reviewAssignment->getId()
443  )
444  );
445 
446  // Update review stage status whenever a review assignment is changed
447  $this->updateReviewRoundStatus($reviewAssignment);
448  }
449 
456  public function updateReviewRoundStatus($reviewAssignment) {
457  import('lib.pkp.classes.submission.reviewRound/ReviewRoundDAO');
458  $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
459  $reviewRound = $reviewRoundDao->getReviewRound(
460  $reviewAssignment->getSubmissionId(),
461  $reviewAssignment->getStageId(),
462  $reviewAssignment->getRound()
463  );
464 
465  // Review round may not exist if submission is being deleted
466  if ($reviewRound) {
467  return $reviewRoundDao->updateStatus($reviewRound);
468  }
469 
470  return false;
471  }
472 
478  function _fromRow($row) {
479  $reviewAssignment = $this->newDataObject();
480  $user = $this->userDao->getById($row['reviewer_id']);
481 
482  $reviewAssignment->setId((int) $row['review_id']);
483  $reviewAssignment->setSubmissionId((int) $row['submission_id']);
484  $reviewAssignment->setReviewerId((int) $row['reviewer_id']);
485  $reviewAssignment->setReviewerFullName($user->getFullName());
486  $reviewAssignment->setCompetingInterests($row['competing_interests']);
487  $reviewAssignment->setRecommendation($row['recommendation']);
488  $reviewAssignment->setDateAssigned($this->datetimeFromDB($row['date_assigned']));
489  $reviewAssignment->setDateNotified($this->datetimeFromDB($row['date_notified']));
490  $reviewAssignment->setDateConfirmed($this->datetimeFromDB($row['date_confirmed']));
491  $reviewAssignment->setDateCompleted($this->datetimeFromDB($row['date_completed']));
492  $reviewAssignment->setDateAcknowledged($this->datetimeFromDB($row['date_acknowledged']));
493  $reviewAssignment->setDateDue($this->datetimeFromDB($row['date_due']));
494  $reviewAssignment->setDateResponseDue($this->datetimeFromDB($row['date_response_due']));
495  $reviewAssignment->setLastModified($this->datetimeFromDB($row['last_modified']));
496  $reviewAssignment->setDeclined((int) $row['declined']);
497  $reviewAssignment->setCancelled((int) $row['cancelled']);
498  $reviewAssignment->setQuality($row['quality']);
499  $reviewAssignment->setDateRated($this->datetimeFromDB($row['date_rated']));
500  $reviewAssignment->setDateReminded($this->datetimeFromDB($row['date_reminded']));
501  $reviewAssignment->setReminderWasAutomatic((int) $row['reminder_was_automatic']);
502  $reviewAssignment->setRound((int) $row['round']);
503  $reviewAssignment->setReviewFormId($row['review_form_id']);
504  $reviewAssignment->setReviewRoundId((int) $row['review_round_id']);
505  $reviewAssignment->setReviewMethod((int) $row['review_method']);
506  $reviewAssignment->setStageId((int) $row['stage_id']);
507  $reviewAssignment->setUnconsidered((int) $row['unconsidered']);
508 
509  return $reviewAssignment;
510  }
511 
516  function newDataObject() {
517  return new ReviewAssignment();
518  }
519 
524  function deleteById($reviewId) {
525  $reviewFormResponseDao = DAORegistry::getDAO('ReviewFormResponseDAO'); /* @var $reviewFormResponseDao ReviewFormResponseDAO */
526  $reviewFormResponseDao->deleteByReviewId($reviewId);
527 
528  $reviewFilesDao = DAORegistry::getDAO('ReviewFilesDAO'); /* @var $reviewFilesDao ReviewFilesDAO */
529  $reviewFilesDao->revokeByReviewId($reviewId);
530 
531  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
532  $notificationDao->deleteByAssoc(ASSOC_TYPE_REVIEW_ASSIGNMENT, $reviewId);
533 
534  // Retrieve the review assignment before it's deleted, so it can be
535  // be used to fire an update on the review round status.
536  import('lib.pkp.classes.submission.reviewRound/ReviewRoundDAO');
537  $reviewAssignment = $this->getById($reviewId);
538 
539  $result = $this->update(
540  'DELETE FROM review_assignments WHERE review_id = ?',
541  (int) $reviewId
542  );
543 
544  $this->updateReviewRoundStatus($reviewAssignment);
545 
546  return $result;
547  }
548 
554  function deleteBySubmissionId($submissionId) {
555  $returner = false;
556  $result = $this->retrieve(
557  'SELECT review_id FROM review_assignments WHERE submission_id = ?',
558  array((int) $submissionId)
559  );
560 
561  while (!$result->EOF) {
562  $row = $result->GetRowAssoc(false);
563  $this->deleteById($row['review_id']);
564  $result->MoveNext();
565  $returner = true;
566  }
567  $result->Close();
568  return $returner;
569  }
570 
575  function getInsertId() {
576  return $this->_getInsertId('review_assignments', 'review_id');
577  }
578 
585  function getLastReviewRoundReviewAssignmentByReviewer($submissionId, $reviewerId) {
586  $params = array(
587  (int) $submissionId,
588  (int) $reviewerId
589  );
590 
591  $result = $this->retrieveLimit(
592  $this->_getSelectQuery() .
593  ' WHERE r.submission_id = ? AND
594  r.reviewer_id = ?
595  ORDER BY r2.stage_id DESC, r2.round DESC',
596  $params,
597  1
598  );
599 
600  $returner = null;
601  if ($result->RecordCount() != 0) {
602  $returner = $this->_fromRow($result->GetRowAssoc(false));
603  }
604 
605  $result->Close();
606  return $returner;
607  }
608 
614  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_EDITOR);
615  return array(
616  SUBMISSION_REVIEW_METHOD_DOUBLEBLIND => 'editor.submissionReview.doubleBlind',
617  SUBMISSION_REVIEW_METHOD_BLIND => 'editor.submissionReview.blind',
618  SUBMISSION_REVIEW_METHOD_OPEN => 'editor.submissionReview.open',
619  );
620  }
621 
626  function _getSelectQuery() {
627  return 'SELECT r.*, r2.review_revision FROM review_assignments r
628  LEFT JOIN review_rounds r2 ON (r.review_round_id = r2.review_round_id)';
629  }
630 }
631 
632 
ReviewAssignmentDAO\getLastReviewRoundReviewAssignmentByReviewer
getLastReviewRoundReviewAssignmentByReviewer($submissionId, $reviewerId)
Definition: ReviewAssignmentDAO.inc.php:585
ReviewAssignmentDAO\getOpenReviewsByReviewRoundId
getOpenReviewsByReviewRoundId($reviewRoundId)
Definition: ReviewAssignmentDAO.inc.php:49
ReviewAssignmentDAO\_getReviewAssignmentsArray
_getReviewAssignmentsArray($query, $queryParams)
Definition: ReviewAssignmentDAO.inc.php:63
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
ReviewAssignmentDAO\getByReviewRoundId
getByReviewRoundId($reviewRoundId)
Definition: ReviewAssignmentDAO.inc.php:37
ReviewAssignmentDAO\getReviewIndexesForRound
getReviewIndexesForRound($submissionId, $reviewRoundId)
Definition: ReviewAssignmentDAO.inc.php:311
ReviewAssignmentDAO\getByUserId
getByUserId($userId)
Definition: ReviewAssignmentDAO.inc.php:226
ReviewAssignmentDAO\getByReviewFormId
getByReviewFormId($reviewFormId)
Definition: ReviewAssignmentDAO.inc.php:278
ReviewAssignmentDAO\_fromRow
_fromRow($row)
Definition: ReviewAssignmentDAO.inc.php:478
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ReviewAssignmentDAO\updateObject
updateObject($reviewAssignment)
Definition: ReviewAssignmentDAO.inc.php:398
ReviewAssignmentDAO\__construct
__construct()
Definition: ReviewAssignmentDAO.inc.php:26
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
ReviewAssignmentDAO\deleteById
deleteById($reviewId)
Definition: ReviewAssignmentDAO.inc.php:524
ReviewAssignmentDAO\getInsertId
getInsertId()
Definition: ReviewAssignmentDAO.inc.php:575
ReviewAssignmentDAO\getIncompleteReviewAssignments
getIncompleteReviewAssignments()
Definition: ReviewAssignmentDAO.inc.php:150
ReviewAssignment
Describes review assignment properties.
Definition: ReviewAssignment.inc.php:50
ReviewAssignmentDAO\reviewerExists
reviewerExists($reviewRoundId, $reviewerId)
Definition: ReviewAssignmentDAO.inc.php:259
DAO\datetimeFromDB
datetimeFromDB($dt)
Definition: DAO.inc.php:319
ReviewAssignmentDAO\getReviewRoundJoin
getReviewRoundJoin()
Definition: ReviewAssignmentDAO.inc.php:82
ReviewAssignmentDAO\updateReviewRoundStatus
updateReviewRoundStatus($reviewAssignment)
Definition: ReviewAssignmentDAO.inc.php:456
ReviewAssignmentDAO\getById
getById($reviewId)
Definition: ReviewAssignmentDAO.inc.php:122
DAO\update
update($sql, $params=false, $callHooks=true, $dieOnError=true)
Definition: DAO.inc.php:214
DAO\datetimeToDB
datetimeToDB($dt)
Definition: DAO.inc.php:299
ReviewAssignmentDAO\insertObject
insertObject($reviewAssignment)
Definition: ReviewAssignmentDAO.inc.php:337
ReviewAssignmentDAO\getReviewAssignment
getReviewAssignment($reviewRoundId, $reviewerId)
Definition: ReviewAssignmentDAO.inc.php:96
DAO\_getInsertId
_getInsertId($table='', $id='')
Definition: DAO.inc.php:255
ReviewAssignmentDAO\$userDao
$userDao
Definition: ReviewAssignmentDAO.inc.php:21
ReviewAssignmentDAO\getBySubmissionId
getBySubmissionId($submissionId, $reviewRoundId=null, $stageId=null)
Definition: ReviewAssignmentDAO.inc.php:194
ReviewAssignmentDAO\getIncompleteReviewAssignmentsWhereString
getIncompleteReviewAssignmentsWhereString()
Definition: ReviewAssignmentDAO.inc.php:180
ReviewAssignmentDAO\_getSelectQuery
_getSelectQuery()
Definition: ReviewAssignmentDAO.inc.php:626
ReviewAssignmentDAO\newDataObject
newDataObject()
Definition: ReviewAssignmentDAO.inc.php:516
DAO\retrieveLimit
& retrieveLimit($sql, $params=false, $numRows=false, $offset=false, $callHooks=true)
Definition: DAO.inc.php:148
DAO
Operations for retrieving and modifying objects from a database.
Definition: DAO.inc.php:31
ReviewAssignmentDAO\deleteBySubmissionId
deleteBySubmissionId($submissionId)
Definition: ReviewAssignmentDAO.inc.php:554
ReviewAssignmentDAO
Class for DAO relating reviewers to submissions.
Definition: ReviewAssignmentDAO.inc.php:20
ReviewAssignmentDAO\getReviewMethodsTranslationKeys
getReviewMethodsTranslationKeys()
Definition: ReviewAssignmentDAO.inc.php:613