00001 <?php
00002
00016
00017
00018
00019 import('submission.reviewer.ReviewerSubmission');
00020
00021 class ReviewerSubmissionDAO extends DAO {
00022 var $articleDao;
00023 var $authorDao;
00024 var $userDao;
00025 var $reviewAssignmentDao;
00026 var $editAssignmentDao;
00027 var $articleFileDao;
00028 var $suppFileDao;
00029 var $articleCommentDao;
00030
00034 function ReviewerSubmissionDAO() {
00035 parent::DAO();
00036 $this->articleDao = &DAORegistry::getDAO('ArticleDAO');
00037 $this->authorDao = &DAORegistry::getDAO('AuthorDAO');
00038 $this->userDao = &DAORegistry::getDAO('UserDAO');
00039 $this->reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
00040 $this->editAssignmentDao = &DAORegistry::getDAO('EditAssignmentDAO');
00041 $this->articleFileDao = &DAORegistry::getDAO('ArticleFileDAO');
00042 $this->suppFileDao = &DAORegistry::getDAO('SuppFileDAO');
00043 $this->articleCommentDao = &DAORegistry::getDAO('ArticleCommentDAO');
00044 }
00045
00052 function &getReviewerSubmission($reviewId) {
00053 $primaryLocale = Locale::getPrimaryLocale();
00054 $locale = Locale::getLocale();
00055 $result = &$this->retrieve(
00056 'SELECT a.*,
00057 r.*,
00058 r2.review_revision,
00059 u.first_name, u.last_name,
00060 COALESCE(stl.setting_value, stpl.setting_value) AS section_title,
00061 COALESCE(sal.setting_value, sapl.setting_value) AS section_abbrev
00062 FROM articles a
00063 LEFT JOIN review_assignments r ON (a.article_id = r.article_id)
00064 LEFT JOIN sections s ON (s.section_id = a.section_id)
00065 LEFT JOIN users u ON (r.reviewer_id = u.user_id)
00066 LEFT JOIN review_rounds r2 ON (a.article_id = r2.article_id AND r.round = r2.round)
00067 LEFT JOIN section_settings stpl ON (s.section_id = stpl.section_id AND stpl.setting_name = ? AND stpl.locale = ?)
00068 LEFT JOIN section_settings stl ON (s.section_id = stl.section_id AND stl.setting_name = ? AND stl.locale = ?)
00069 LEFT JOIN section_settings sapl ON (s.section_id = sapl.section_id AND sapl.setting_name = ? AND sapl.locale = ?)
00070 LEFT JOIN section_settings sal ON (s.section_id = sal.section_id AND sal.setting_name = ? AND sal.locale = ?)
00071 WHERE r.review_id = ?',
00072 array(
00073 'title',
00074 $primaryLocale,
00075 'title',
00076 $locale,
00077 'abbrev',
00078 $primaryLocale,
00079 'abbrev',
00080 $locale,
00081 $reviewId
00082 )
00083 );
00084
00085 $returner = null;
00086 if ($result->RecordCount() != 0) {
00087 $returner = &$this->_returnReviewerSubmissionFromRow($result->GetRowAssoc(false));
00088 }
00089
00090 $result->Close();
00091 unset($result);
00092
00093 return $returner;
00094 }
00095
00101 function &_returnReviewerSubmissionFromRow(&$row) {
00102 $reviewerSubmission = &new ReviewerSubmission();
00103
00104
00105 $editAssignments =& $this->editAssignmentDao->getEditAssignmentsByArticleId($row['article_id']);
00106 $reviewerSubmission->setEditAssignments($editAssignments->toArray());
00107
00108
00109 $reviewerSubmission->setSubmissionFile($this->articleFileDao->getArticleFile($row['submission_file_id']));
00110 $reviewerSubmission->setRevisedFile($this->articleFileDao->getArticleFile($row['revised_file_id']));
00111 $reviewerSubmission->setSuppFiles($this->suppFileDao->getSuppFilesByArticle($row['article_id']));
00112 $reviewerSubmission->setReviewFile($this->articleFileDao->getArticleFile($row['review_file_id']));
00113 $reviewerSubmission->setReviewerFile($this->articleFileDao->getArticleFile($row['reviewer_file_id']));
00114 $reviewerSubmission->setReviewerFileRevisions($this->articleFileDao->getArticleFileRevisions($row['reviewer_file_id']));
00115
00116
00117 $reviewerSubmission->setMostRecentPeerReviewComment($this->articleCommentDao->getMostRecentArticleComment($row['article_id'], COMMENT_TYPE_PEER_REVIEW, $row['review_id']));
00118
00119
00120 for ($i = 1; $i <= $row['current_round']; $i++) {
00121 $reviewerSubmission->setDecisions($this->getEditorDecisions($row['article_id'], $i), $i);
00122 }
00123
00124
00125 $reviewerSubmission->setReviewId($row['review_id']);
00126 $reviewerSubmission->setReviewerId($row['reviewer_id']);
00127 $reviewerSubmission->setReviewerFullName($row['first_name'].' '.$row['last_name']);
00128 $reviewerSubmission->setCompetingInterests($row['competing_interests']);
00129 $reviewerSubmission->setRecommendation($row['recommendation']);
00130 $reviewerSubmission->setDateAssigned($this->datetimeFromDB($row['date_assigned']));
00131 $reviewerSubmission->setDateNotified($this->datetimeFromDB($row['date_notified']));
00132 $reviewerSubmission->setDateConfirmed($this->datetimeFromDB($row['date_confirmed']));
00133 $reviewerSubmission->setDateCompleted($this->datetimeFromDB($row['date_completed']));
00134 $reviewerSubmission->setDateAcknowledged($this->datetimeFromDB($row['date_acknowledged']));
00135 $reviewerSubmission->setDateDue($this->datetimeFromDB($row['date_due']));
00136 $reviewerSubmission->setDeclined($row['declined']);
00137 $reviewerSubmission->setReplaced($row['replaced']);
00138 $reviewerSubmission->setCancelled($row['cancelled']==1?1:0);
00139 $reviewerSubmission->setReviewerFileId($row['reviewer_file_id']);
00140 $reviewerSubmission->setQuality($row['quality']);
00141 $reviewerSubmission->setRound($row['round']);
00142 $reviewerSubmission->setReviewFileId($row['review_file_id']);
00143 $reviewerSubmission->setReviewRevision($row['review_revision']);
00144
00145
00146 $this->articleDao->_articleFromRow($reviewerSubmission, $row);
00147
00148 HookRegistry::call('ReviewerSubmissionDAO::_returnReviewerSubmissionFromRow', array(&$reviewerSubmission, &$row));
00149
00150 return $reviewerSubmission;
00151 }
00152
00157 function updateReviewerSubmission(&$reviewerSubmission) {
00158 return $this->update(
00159 sprintf('UPDATE review_assignments
00160 SET article_id = ?,
00161 reviewer_id = ?,
00162 round = ?,
00163 competing_interests = ?,
00164 recommendation = ?,
00165 declined = ?,
00166 replaced = ?,
00167 cancelled = ?,
00168 date_assigned = %s,
00169 date_notified = %s,
00170 date_confirmed = %s,
00171 date_completed = %s,
00172 date_acknowledged = %s,
00173 date_due = %s,
00174 reviewer_file_id = ?,
00175 quality = ?
00176 WHERE review_id = ?',
00177 $this->datetimeToDB($reviewerSubmission->getDateAssigned()), $this->datetimeToDB($reviewerSubmission->getDateNotified()), $this->datetimeToDB($reviewerSubmission->getDateConfirmed()), $this->datetimeToDB($reviewerSubmission->getDateCompleted()), $this->datetimeToDB($reviewerSubmission->getDateAcknowledged()), $this->datetimeToDB($reviewerSubmission->getDateDue())),
00178 array(
00179 $reviewerSubmission->getArticleId(),
00180 $reviewerSubmission->getReviewerId(),
00181 $reviewerSubmission->getRound(),
00182 $reviewerSubmission->getCompetingInterests(),
00183 $reviewerSubmission->getRecommendation(),
00184 $reviewerSubmission->getDeclined(),
00185 $reviewerSubmission->getReplaced(),
00186 $reviewerSubmission->getCancelled(),
00187 $reviewerSubmission->getReviewerFileId(),
00188 $reviewerSubmission->getQuality(),
00189 $reviewerSubmission->getReviewId()
00190 )
00191 );
00192 }
00193
00201 function &getReviewerSubmissionsByReviewerId($reviewerId, $journalId, $active = true, $rangeInfo = null) {
00202 $primaryLocale = Locale::getPrimaryLocale();
00203 $locale = Locale::getLocale();
00204 $sql = 'SELECT a.*,
00205 r.*,
00206 r2.review_revision,
00207 u.first_name, u.last_name,
00208 COALESCE(stl.setting_value, stpl.setting_value) AS section_title,
00209 COALESCE(sal.setting_value, sapl.setting_value) AS section_abbrev
00210 FROM articles a
00211 LEFT JOIN review_assignments r ON (a.article_id = r.article_id)
00212 LEFT JOIN sections s ON (s.section_id = a.section_id)
00213 LEFT JOIN users u ON (r.reviewer_id = u.user_id)
00214 LEFT JOIN review_rounds r2 ON (r.article_id = r2.article_id AND r.round = r2.round)
00215 LEFT JOIN section_settings stpl ON (s.section_id = stpl.section_id AND stpl.setting_name = ? AND stpl.locale = ?)
00216 LEFT JOIN section_settings stl ON (s.section_id = stl.section_id AND stl.setting_name = ? AND stl.locale = ?)
00217 LEFT JOIN section_settings sapl ON (s.section_id = sapl.section_id AND sapl.setting_name = ? AND sapl.locale = ?)
00218 LEFT JOIN section_settings sal ON (s.section_id = sal.section_id AND sal.setting_name = ? AND sal.locale = ?)
00219 WHERE a.journal_id = ?
00220 AND r.reviewer_id = ?
00221 AND r.date_notified IS NOT NULL';
00222
00223 if ($active) {
00224 $sql .= ' AND r.date_completed IS NULL AND r.declined <> 1 AND (r.cancelled = 0 OR r.cancelled IS NULL)';
00225 } else {
00226 $sql .= ' AND (r.date_completed IS NOT NULL OR r.cancelled = 1 OR r.declined = 1)';
00227 }
00228
00229 $result = &$this->retrieveRange(
00230 $sql,
00231 array(
00232 'title',
00233 $primaryLocale,
00234 'title',
00235 $locale,
00236 'abbrev',
00237 $primaryLocale,
00238 'abbrev',
00239 $locale,
00240 $journalId,
00241 $reviewerId
00242 ),
00243 $rangeInfo
00244 );
00245
00246 $returner = &new DAOResultFactory($result, $this, '_returnReviewerSubmissionFromRow');
00247 return $returner;
00248 }
00249
00255 function getSubmissionsCount($reviewerId, $journalId) {
00256 $submissionsCount = array();
00257 $submissionsCount[0] = 0;
00258 $submissionsCount[1] = 0;
00259
00260 $sql = 'SELECT r.date_completed, r.declined, r.cancelled FROM articles a LEFT JOIN review_assignments r ON (a.article_id = r.article_id) LEFT JOIN sections s ON (s.section_id = a.section_id) LEFT JOIN users u ON (r.reviewer_id = u.user_id) LEFT JOIN review_rounds r2 ON (r.article_id = r2.article_id AND r.round = r2.round) WHERE a.journal_id = ? AND r.reviewer_id = ? AND r.date_notified IS NOT NULL';
00261
00262 $result = &$this->retrieve($sql, array($journalId, $reviewerId));
00263
00264 while (!$result->EOF) {
00265 if ($result->fields['date_completed'] == null && $result->fields['declined'] != 1 && $result->fields['cancelled'] != 1) {
00266 $submissionsCount[0] += 1;
00267 } else {
00268 $submissionsCount[1] += 1;
00269 }
00270 $result->moveNext();
00271 }
00272
00273 $result->Close();
00274 unset($result);
00275
00276 return $submissionsCount;
00277 }
00278
00284 function getEditorDecisions($articleId, $round = null) {
00285 $decisions = array();
00286
00287 if ($round == null) {
00288 $result = &$this->retrieve(
00289 'SELECT edit_decision_id, editor_id, decision, date_decided FROM edit_decisions WHERE article_id = ? ORDER BY date_decided ASC', $articleId
00290 );
00291 } else {
00292 $result = &$this->retrieve(
00293 'SELECT edit_decision_id, editor_id, decision, date_decided FROM edit_decisions WHERE article_id = ? AND round = ? ORDER BY date_decided ASC',
00294 array($articleId, $round)
00295 );
00296 }
00297
00298 while (!$result->EOF) {
00299 $decisions[] = array(
00300 'editDecisionId' => $result->fields['edit_decision_id'],
00301 'editorId' => $result->fields['editor_id'],
00302 'decision' => $result->fields['decision'],
00303 'dateDecided' => $this->datetimeFromDB($result->fields['date_decided'])
00304 );
00305 $result->moveNext();
00306 }
00307
00308 $result->Close();
00309 unset($result);
00310
00311 return $decisions;
00312 }
00313 }
00314
00315 ?>