00001 <?php
00002
00016
00017
00018
00019 import('submission.sectionEditor.SectionEditorSubmission');
00020 import('submission.author.AuthorSubmission');
00021 import('submission.reviewer.ReviewerSubmission');
00022
00023 class SectionEditorSubmissionDAO extends DAO {
00024 var $articleDao;
00025 var $authorDao;
00026 var $userDao;
00027 var $editAssignmentDao;
00028 var $reviewAssignmentDao;
00029 var $copyeditorSubmissionDao;
00030 var $layoutAssignmentDao;
00031 var $articleFileDao;
00032 var $suppFileDao;
00033 var $galleyDao;
00034 var $articleEmailLogDao;
00035 var $articleCommentDao;
00036 var $proofAssignmentDao;
00037
00041 function SectionEditorSubmissionDAO() {
00042 parent::DAO();
00043 $this->articleDao = &DAORegistry::getDAO('ArticleDAO');
00044 $this->authorDao = &DAORegistry::getDAO('AuthorDAO');
00045 $this->userDao = &DAORegistry::getDAO('UserDAO');
00046 $this->editAssignmentDao = &DAORegistry::getDAO('EditAssignmentDAO');
00047 $this->reviewAssignmentDao = &DAORegistry::getDAO('ReviewAssignmentDAO');
00048 $this->copyeditorSubmissionDao = &DAORegistry::getDAO('CopyeditorSubmissionDAO');
00049 $this->layoutAssignmentDao = &DAORegistry::getDAO('LayoutAssignmentDAO');
00050 $this->articleFileDao = &DAORegistry::getDAO('ArticleFileDAO');
00051 $this->suppFileDao = &DAORegistry::getDAO('SuppFileDAO');
00052 $this->galleyDao = &DAORegistry::getDAO('ArticleGalleyDAO');
00053 $this->articleEmailLogDao = &DAORegistry::getDAO('ArticleEmailLogDAO');
00054 $this->articleCommentDao = &DAORegistry::getDAO('ArticleCommentDAO');
00055 $this->proofAssignmentDao = &DAORegistry::getDAO('ProofAssignmentDAO');
00056 }
00057
00063 function &getSectionEditorSubmission($articleId) {
00064 $primaryLocale = Locale::getPrimaryLocale();
00065 $locale = Locale::getLocale();
00066 $result = &$this->retrieve(
00067 'SELECT a.*,
00068 COALESCE(stl.setting_value, stpl.setting_value) AS section_title,
00069 COALESCE(sal.setting_value, sapl.setting_value) AS section_abbrev,
00070 c.copyed_id,
00071 c.copyeditor_id,
00072 c.copyedit_revision,
00073 c.date_notified AS copyeditor_date_notified,
00074 c.date_underway AS copyeditor_date_underway,
00075 c.date_completed AS copyeditor_date_completed,
00076 c.date_acknowledged AS copyeditor_date_acknowledged,
00077 c.date_author_notified AS ce_date_author_notified,
00078 c.date_author_underway AS ce_date_author_underway,
00079 c.date_author_completed AS ce_date_author_completed,
00080 c.date_author_acknowledged AS ce_date_author_acknowledged,
00081 c.date_final_notified AS ce_date_final_notified,
00082 c.date_final_underway AS ce_date_final_underway,
00083 c.date_final_completed AS ce_date_final_completed,
00084 c.date_final_acknowledged AS ce_date_final_acknowledged,
00085 c.initial_revision AS copyeditor_initial_revision,
00086 c.editor_author_revision AS ce_editor_author_revision,
00087 c.final_revision AS copyeditor_final_revision,
00088 r2.review_revision
00089 FROM articles a
00090 LEFT JOIN sections s ON (s.section_id = a.section_id)
00091 LEFT JOIN copyed_assignments c ON (a.article_id = c.article_id)
00092 LEFT JOIN review_rounds r2 ON (a.article_id = r2.article_id AND a.current_round = r2.round)
00093 LEFT JOIN section_settings stpl ON (s.section_id = stpl.section_id AND stpl.setting_name = ? AND stpl.locale = ?)
00094 LEFT JOIN section_settings stl ON (s.section_id = stl.section_id AND stl.setting_name = ? AND stl.locale = ?)
00095 LEFT JOIN section_settings sapl ON (s.section_id = sapl.section_id AND sapl.setting_name = ? AND sapl.locale = ?)
00096 LEFT JOIN section_settings sal ON (s.section_id = sal.section_id AND sal.setting_name = ? AND sal.locale = ?)
00097 WHERE a.article_id = ?',
00098 array(
00099 'title',
00100 $primaryLocale,
00101 'title',
00102 $locale,
00103 'abbrev',
00104 $primaryLocale,
00105 'abbrev',
00106 $locale,
00107 $articleId
00108 )
00109 );
00110
00111 $returner = null;
00112 if ($result->RecordCount() != 0) {
00113 $returner = &$this->_returnSectionEditorSubmissionFromRow($result->GetRowAssoc(false));
00114 }
00115
00116 $result->Close();
00117 unset($result);
00118
00119 return $returner;
00120 }
00121
00127 function &_returnSectionEditorSubmissionFromRow(&$row) {
00128 $sectionEditorSubmission = &new SectionEditorSubmission();
00129
00130
00131 $this->articleDao->_articleFromRow($sectionEditorSubmission, $row);
00132
00133
00134 $editAssignments =& $this->editAssignmentDao->getEditAssignmentsByArticleId($row['article_id']);
00135 $sectionEditorSubmission->setEditAssignments($editAssignments->toArray());
00136
00137
00138 for ($i = 1; $i <= $row['current_round']; $i++) {
00139 $sectionEditorSubmission->setDecisions($this->getEditorDecisions($row['article_id'], $i), $i);
00140 }
00141
00142
00143 $sectionEditorSubmission->setMostRecentEditorDecisionComment($this->articleCommentDao->getMostRecentArticleComment($row['article_id'], COMMENT_TYPE_EDITOR_DECISION, $row['article_id']));
00144 $sectionEditorSubmission->setMostRecentCopyeditComment($this->articleCommentDao->getMostRecentArticleComment($row['article_id'], COMMENT_TYPE_COPYEDIT, $row['article_id']));
00145 $sectionEditorSubmission->setMostRecentLayoutComment($this->articleCommentDao->getMostRecentArticleComment($row['article_id'], COMMENT_TYPE_LAYOUT, $row['article_id']));
00146 $sectionEditorSubmission->setMostRecentProofreadComment($this->articleCommentDao->getMostRecentArticleComment($row['article_id'], COMMENT_TYPE_PROOFREAD, $row['article_id']));
00147
00148
00149 $sectionEditorSubmission->setSubmissionFile($this->articleFileDao->getArticleFile($row['submission_file_id']));
00150 $sectionEditorSubmission->setRevisedFile($this->articleFileDao->getArticleFile($row['revised_file_id']));
00151 $sectionEditorSubmission->setReviewFile($this->articleFileDao->getArticleFile($row['review_file_id']));
00152 $sectionEditorSubmission->setSuppFiles($this->suppFileDao->getSuppFilesByArticle($row['article_id']));
00153 $sectionEditorSubmission->setEditorFile($this->articleFileDao->getArticleFile($row['editor_file_id']));
00154 $sectionEditorSubmission->setCopyeditFile($this->articleFileDao->getArticleFile($row['copyedit_file_id']));
00155
00156
00157 if ($row['copyeditor_initial_revision'] != null) {
00158 $sectionEditorSubmission->setInitialCopyeditFile($this->articleFileDao->getArticleFile($row['copyedit_file_id'], $row['copyeditor_initial_revision']));
00159 }
00160
00161
00162 if ($row['ce_editor_author_revision'] != null) {
00163 $sectionEditorSubmission->setEditorAuthorCopyeditFile($this->articleFileDao->getArticleFile($row['copyedit_file_id'], $row['ce_editor_author_revision']));
00164 }
00165
00166
00167 if ($row['copyeditor_final_revision'] != null) {
00168 $sectionEditorSubmission->setFinalCopyeditFile($this->articleFileDao->getArticleFile($row['copyedit_file_id'], $row['copyeditor_final_revision']));
00169 }
00170
00171 $sectionEditorSubmission->setCopyeditFileRevisions($this->articleFileDao->getArticleFileRevisionsInRange($row['copyedit_file_id']));
00172
00173 for ($i = 1; $i <= $row['current_round']; $i++) {
00174 $sectionEditorSubmission->setEditorFileRevisions($this->articleFileDao->getArticleFileRevisions($row['editor_file_id'], $i), $i);
00175 $sectionEditorSubmission->setAuthorFileRevisions($this->articleFileDao->getArticleFileRevisions($row['revised_file_id'], $i), $i);
00176 }
00177
00178
00179 $sectionEditorSubmission->setReviewRevision($row['review_revision']);
00180
00181
00182 for ($i = 1; $i <= $row['current_round']; $i++) {
00183 $sectionEditorSubmission->setReviewAssignments($this->reviewAssignmentDao->getReviewAssignmentsByArticleId($row['article_id'], $i), $i);
00184 }
00185
00186
00187 $sectionEditorSubmission->setCopyedId($row['copyed_id']);
00188 $sectionEditorSubmission->setCopyeditorId($row['copyeditor_id']);
00189 $sectionEditorSubmission->setCopyeditor($this->userDao->getUser($row['copyeditor_id']), true);
00190 $sectionEditorSubmission->setCopyeditorDateNotified($this->datetimeFromDB($row['copyeditor_date_notified']));
00191 $sectionEditorSubmission->setCopyeditorDateUnderway($this->datetimeFromDB($row['copyeditor_date_underway']));
00192 $sectionEditorSubmission->setCopyeditorDateCompleted($this->datetimeFromDB($row['copyeditor_date_completed']));
00193 $sectionEditorSubmission->setCopyeditorDateAcknowledged($this->datetimeFromDB($row['copyeditor_date_acknowledged']));
00194 $sectionEditorSubmission->setCopyeditorDateAuthorNotified($this->datetimeFromDB($row['ce_date_author_notified']));
00195 $sectionEditorSubmission->setCopyeditorDateAuthorUnderway($this->datetimeFromDB($row['ce_date_author_underway']));
00196 $sectionEditorSubmission->setCopyeditorDateAuthorCompleted($this->datetimeFromDB($row['ce_date_author_completed']));
00197 $sectionEditorSubmission->setCopyeditorDateAuthorAcknowledged($this->datetimeFromDB($row['ce_date_author_acknowledged']));
00198 $sectionEditorSubmission->setCopyeditorDateFinalNotified($this->datetimeFromDB($row['ce_date_final_notified']));
00199 $sectionEditorSubmission->setCopyeditorDateFinalUnderway($this->datetimeFromDB($row['ce_date_final_underway']));
00200 $sectionEditorSubmission->setCopyeditorDateFinalCompleted($this->datetimeFromDB($row['ce_date_final_completed']));
00201 $sectionEditorSubmission->setCopyeditorDateFinalAcknowledged($this->datetimeFromDB($row['ce_date_final_acknowledged']));
00202 $sectionEditorSubmission->setCopyeditorInitialRevision($row['copyeditor_initial_revision']);
00203 $sectionEditorSubmission->setCopyeditorEditorAuthorRevision($row['ce_editor_author_revision']);
00204 $sectionEditorSubmission->setCopyeditorFinalRevision($row['copyeditor_final_revision']);
00205
00206
00207 $sectionEditorSubmission->setLayoutAssignment($this->layoutAssignmentDao->getLayoutAssignmentByArticleId($row['article_id']));
00208
00209 $sectionEditorSubmission->setGalleys($this->galleyDao->getGalleysByArticle($row['article_id']));
00210
00211
00212 $sectionEditorSubmission->setProofAssignment($this->proofAssignmentDao->getProofAssignmentByArticleId($row['article_id']));
00213
00214 HookRegistry::call('SectionEditorSubmissionDAO::_returnSectionEditorSubmissionFromRow', array(&$sectionEditorSubmission, &$row));
00215
00216 return $sectionEditorSubmission;
00217 }
00218
00223 function updateSectionEditorSubmission(&$sectionEditorSubmission) {
00224
00225 $editAssignments =& $sectionEditorSubmission->getEditAssignments();
00226 foreach ($editAssignments as $editAssignment) {
00227 if ($editAssignment->getEditId() > 0) {
00228 $this->editAssignmentDao->updateEditAssignment($editAssignment);
00229 } else {
00230 $this->editAssignmentDao->insertEditAssignment($editAssignment);
00231 }
00232 }
00233
00234
00235 for ($i = 1; $i <= $sectionEditorSubmission->getCurrentRound(); $i++) {
00236 $editorDecisions = $sectionEditorSubmission->getDecisions($i);
00237 if (is_array($editorDecisions)) {
00238 foreach ($editorDecisions as $editorDecision) {
00239 if ($editorDecision['editDecisionId'] == null) {
00240 $this->update(
00241 sprintf('INSERT INTO edit_decisions
00242 (article_id, round, editor_id, decision, date_decided)
00243 VALUES (?, ?, ?, ?, %s)',
00244 $this->datetimeToDB($editorDecision['dateDecided'])),
00245 array($sectionEditorSubmission->getArticleId(), $sectionEditorSubmission->getCurrentRound(), $editorDecision['editorId'], $editorDecision['decision'])
00246 );
00247 }
00248 }
00249 }
00250 }
00251 if ($this->reviewRoundExists($sectionEditorSubmission->getArticleId(), $sectionEditorSubmission->getCurrentRound())) {
00252 $this->update(
00253 'UPDATE review_rounds
00254 SET
00255 review_revision = ?
00256 WHERE article_id = ? AND round = ?',
00257 array(
00258 $sectionEditorSubmission->getReviewRevision(),
00259 $sectionEditorSubmission->getArticleId(),
00260 $sectionEditorSubmission->getCurrentRound()
00261 )
00262 );
00263 } elseif ($sectionEditorSubmission->getReviewRevision()!=null) {
00264 $this->createReviewRound(
00265 $sectionEditorSubmission->getArticleId(),
00266 $sectionEditorSubmission->getCurrentRound() === null ? 1 : $sectionEditorSubmission->getCurrentRound(),
00267 $sectionEditorSubmission->getReviewRevision()
00268 );
00269 }
00270
00271
00272 if ($sectionEditorSubmission->getCopyedId()) {
00273 $copyeditorSubmission = &$this->copyeditorSubmissionDao->getCopyeditorSubmission($sectionEditorSubmission->getArticleId());
00274 } else {
00275 $copyeditorSubmission = &new CopyeditorSubmission();
00276 }
00277
00278
00279 $copyeditorSubmission->setArticleId($sectionEditorSubmission->getArticleId());
00280 $copyeditorSubmission->setCopyeditorId($sectionEditorSubmission->getCopyeditorId());
00281 $copyeditorSubmission->setDateUnderway($sectionEditorSubmission->getCopyeditorDateUnderway());
00282 $copyeditorSubmission->setDateNotified($sectionEditorSubmission->getCopyeditorDateNotified());
00283 $copyeditorSubmission->setDateCompleted($sectionEditorSubmission->getCopyeditorDateCompleted());
00284 $copyeditorSubmission->setDateAcknowledged($sectionEditorSubmission->getCopyeditorDateAcknowledged());
00285 $copyeditorSubmission->setDateAuthorUnderway($sectionEditorSubmission->getCopyeditorDateAuthorUnderway());
00286 $copyeditorSubmission->setDateAuthorNotified($sectionEditorSubmission->getCopyeditorDateAuthorNotified());
00287 $copyeditorSubmission->setDateAuthorCompleted($sectionEditorSubmission->getCopyeditorDateAuthorCompleted());
00288 $copyeditorSubmission->setDateAuthorAcknowledged($sectionEditorSubmission->getCopyeditorDateAuthorAcknowledged());
00289 $copyeditorSubmission->setDateFinalUnderway($sectionEditorSubmission->getCopyeditorDateFinalUnderway());
00290 $copyeditorSubmission->setDateFinalNotified($sectionEditorSubmission->getCopyeditorDateFinalNotified());
00291 $copyeditorSubmission->setDateFinalCompleted($sectionEditorSubmission->getCopyeditorDateFinalCompleted());
00292 $copyeditorSubmission->setDateFinalAcknowledged($sectionEditorSubmission->getCopyeditorDateFinalAcknowledged());
00293 $copyeditorSubmission->setInitialRevision($sectionEditorSubmission->getCopyeditorInitialRevision());
00294 $copyeditorSubmission->setEditorAuthorRevision($sectionEditorSubmission->getCopyeditorEditorAuthorRevision());
00295 $copyeditorSubmission->setFinalRevision($sectionEditorSubmission->getCopyeditorFinalRevision());
00296 $copyeditorSubmission->setDateStatusModified($sectionEditorSubmission->getDateStatusModified());
00297 $copyeditorSubmission->setLastModified($sectionEditorSubmission->getLastModified());
00298
00299 if ($copyeditorSubmission->getCopyedId() != null) {
00300 $this->copyeditorSubmissionDao->updateCopyeditorSubmission($copyeditorSubmission);
00301 } else {
00302 $this->copyeditorSubmissionDao->insertCopyeditorSubmission($copyeditorSubmission);
00303 }
00304
00305
00306 foreach ($sectionEditorSubmission->getReviewAssignments() as $roundReviewAssignments) {
00307 foreach ($roundReviewAssignments as $reviewAssignment) {
00308 if ($reviewAssignment->getReviewId() > 0) {
00309 $this->reviewAssignmentDao->updateReviewAssignment($reviewAssignment);
00310 } else {
00311 $this->reviewAssignmentDao->insertReviewAssignment($reviewAssignment);
00312 }
00313 }
00314 }
00315
00316
00317 $removedReviewAssignments = $sectionEditorSubmission->getRemovedReviewAssignments();
00318 for ($i=0, $count=count($removedReviewAssignments); $i < $count; $i++) {
00319 $this->reviewAssignmentDao->deleteReviewAssignmentById($removedReviewAssignments[$i]);
00320 }
00321
00322
00323 $layoutAssignment =& $sectionEditorSubmission->getLayoutAssignment();
00324 if (isset($layoutAssignment)) {
00325 if ($layoutAssignment->getLayoutId() > 0) {
00326 $this->layoutAssignmentDao->updateLayoutAssignment($layoutAssignment);
00327 } else {
00328 $this->layoutAssignmentDao->insertLayoutAssignment($layoutAssignment);
00329 }
00330 }
00331
00332
00333 if ($sectionEditorSubmission->getArticleId()) {
00334
00335 $article = &$this->articleDao->getArticle($sectionEditorSubmission->getArticleId());
00336
00337
00338 $article->setSectionId($sectionEditorSubmission->getSectionId());
00339 $article->setCurrentRound($sectionEditorSubmission->getCurrentRound());
00340 $article->setReviewFileId($sectionEditorSubmission->getReviewFileId());
00341 $article->setEditorFileId($sectionEditorSubmission->getEditorFileId());
00342 $article->setStatus($sectionEditorSubmission->getStatus());
00343 $article->setCopyeditFileId($sectionEditorSubmission->getCopyeditFileId());
00344 $article->setDateStatusModified($sectionEditorSubmission->getDateStatusModified());
00345 $article->setLastModified($sectionEditorSubmission->getLastModified());
00346 $article->setCommentsStatus($sectionEditorSubmission->getCommentsStatus());
00347
00348 $this->articleDao->updateArticle($article);
00349 }
00350
00351 }
00352
00353 function createReviewRound($articleId, $round, $reviewRevision) {
00354 $this->update(
00355 'INSERT INTO review_rounds
00356 (article_id, round, review_revision)
00357 VALUES
00358 (?, ?, ?)',
00359 array($articleId, $round, $reviewRevision)
00360 );
00361 }
00362
00369 function &getSectionEditorSubmissions($sectionEditorId, $journalId, $status = true) {
00370 $primaryLocale = Locale::getPrimaryLocale();
00371 $locale = Locale::getLocale();
00372
00373 $sectionEditorSubmissions = array();
00374
00375 $result = &$this->retrieve(
00376 'SELECT a.*,
00377 COALESCE(stl.setting_value, stpl.setting_value) AS section_title,
00378 COALESCE(sal.setting_value, sapl.setting_value) AS section_abbrev,
00379 c.copyed_id,
00380 c.copyeditor_id,
00381 c.copyedit_revision,
00382 c.date_notified AS copyeditor_date_notified,
00383 c.date_underway AS copyeditor_date_underway,
00384 c.date_completed AS copyeditor_date_completed,
00385 c.date_acknowledged AS copyeditor_date_acknowledged,
00386 c.date_author_notified AS ce_date_author_notified,
00387 c.date_author_underway AS ce_date_author_underway,
00388 c.date_author_completed AS ce_date_author_completed,
00389 c.date_author_acknowledged AS ce_date_author_acknowledged,
00390 c.date_final_notified AS ce_date_final_notified,
00391 c.date_final_underway AS ce_date_final_underway,
00392 c.date_final_completed AS ce_date_final_completed,
00393 c.date_final_acknowledged AS ce_date_final_acknowledged,
00394 c.initial_revision AS copyeditor_initial_revision,
00395 c.editor_author_revision AS ce_editor_author_revision,
00396 c.final_revision AS copyeditor_final_revision,
00397 r2.review_revision
00398 FROM articles a
00399 LEFT JOIN edit_assignments e ON (e.article_id = a.article_id)
00400 LEFT JOIN sections s ON (s.section_id = a.section_id)
00401 LEFT JOIN copyed_assignments c ON (a.article_id = c.article_id)
00402 LEFT JOIN review_rounds r2 ON (a.article_id = r2.article_id AND a.current_round = r2.round)
00403 LEFT JOIN section_settings stpl ON (s.section_id = stpl.section_id AND stpl.setting_name = ? AND stpl.locale = ?)
00404 LEFT JOIN section_settings stl ON (s.section_id = stl.section_id AND stl.setting_name = ? AND stl.locale = ?)
00405 LEFT JOIN section_settings sapl ON (s.section_id = sapl.section_id AND sapl.setting_name = ? AND sapl.locale = ?)
00406 LEFT JOIN section_settings sal ON (s.section_id = sal.section_id AND sal.setting_name = ? AND sal.locale = ?)
00407 WHERE a.journal_id = ?
00408 AND e.editor_id = ?
00409 AND a.status = ?',
00410 array(
00411 'title',
00412 $primaryLocale,
00413 'title',
00414 $locale,
00415 'abbrev',
00416 $primarylocale,
00417 'abbrev',
00418 $locale,
00419 $journalId,
00420 $sectionEditorId,
00421 $status
00422 )
00423 );
00424
00425 while (!$result->EOF) {
00426 $sectionEditorSubmissions[] = &$this->_returnSectionEditorSubmissionFromRow($result->GetRowAssoc(false));
00427 $result->MoveNext();
00428 }
00429
00430 $result->Close();
00431 unset($result);
00432
00433 return $sectionEditorSubmissions;
00434 }
00435
00439 function &getUnfilteredSectionEditorSubmissions($sectionEditorId, $journalId, $sectionId = 0, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, $status = true, $additionalWhereSql = '', $rangeInfo = null) {
00440 $primaryLocale = Locale::getPrimaryLocale();
00441 $locale = Locale::getLocale();
00442
00443 $params = array(
00444 'title',
00445 $primaryLocale,
00446 'title',
00447 $locale,
00448 'abbrev',
00449 $primaryLocale,
00450 'abbrev',
00451 $locale,
00452 'title',
00453 $journalId,
00454 $sectionEditorId
00455 );
00456
00457 $searchSql = '';
00458
00459 if (!empty($search)) switch ($searchField) {
00460 case SUBMISSION_FIELD_TITLE:
00461 if ($searchMatch === 'is') {
00462 $searchSql = ' AND LOWER(atl.setting_value) = LOWER(?)';
00463 } else {
00464 $searchSql = ' AND LOWER(atl.setting_value) LIKE LOWER(?)';
00465 $search = '%' . $search . '%';
00466 }
00467 $params[] = $search;
00468 break;
00469 case SUBMISSION_FIELD_AUTHOR:
00470 $first_last = $this->_dataSource->Concat('aa.first_name', '\' \'', 'aa.last_name');
00471 $first_middle_last = $this->_dataSource->Concat('aa.first_name', '\' \'', 'aa.middle_name', '\' \'', 'aa.last_name');
00472 $last_comma_first = $this->_dataSource->Concat('aa.last_name', '\', \'', 'aa.first_name');
00473 $last_comma_first_middle = $this->_dataSource->Concat('aa.last_name', '\', \'', 'aa.first_name', '\' \'', 'aa.middle_name');
00474
00475 if ($searchMatch === 'is') {
00476 $searchSql = " AND (LOWER(aa.last_name) = LOWER(?) OR LOWER($first_last) = LOWER(?) OR LOWER($first_middle_last) = LOWER(?) OR LOWER($last_comma_first) = LOWER(?) OR LOWER($last_comma_first_middle) = LOWER(?))";
00477 } else {
00478 $searchSql = " AND (LOWER(aa.last_name) LIKE LOWER(?) OR LOWER($first_last) LIKE LOWER(?) OR LOWER($first_middle_last) LIKE LOWER(?) OR LOWER($last_comma_first) LIKE LOWER(?) OR LOWER($last_comma_first_middle) LIKE LOWER(?))";
00479 $search = '%' . $search . '%';
00480 }
00481 $params[] = $params[] = $params[] = $params[] = $params[] = $search;
00482 break;
00483 case SUBMISSION_FIELD_EDITOR:
00484 $first_last = $this->_dataSource->Concat('ed.first_name', '\' \'', 'ed.last_name');
00485 $first_middle_last = $this->_dataSource->Concat('ed.first_name', '\' \'', 'ed.middle_name', '\' \'', 'ed.last_name');
00486 $last_comma_first = $this->_dataSource->Concat('ed.last_name', '\', \'', 'ed.first_name');
00487 $last_comma_first_middle = $this->_dataSource->Concat('ed.last_name', '\', \'', 'ed.first_name', '\' \'', 'ed.middle_name');
00488 if ($searchMatch === 'is') {
00489 $searchSql = " AND (LOWER(ed.last_name) = LOWER(?) OR LOWER($first_last) = LOWER(?) OR LOWER($first_middle_last) = LOWER(?) OR LOWER($last_comma_first) = LOWER(?) OR LOWER($last_comma_first_middle) = LOWER(?))";
00490 } else {
00491 $searchSql = " AND (LOWER(ed.last_name) LIKE LOWER(?) OR LOWER($first_last) LIKE LOWER(?) OR LOWER($first_middle_last) LIKE LOWER(?) OR LOWER($last_comma_first) LIKE LOWER(?) OR LOWER($last_comma_first_middle) LIKE LOWER(?))";
00492 $search = '%' . $search . '%';
00493 }
00494 $params[] = $params[] = $params[] = $params[] = $params[] = $search;
00495 break;
00496 }
00497
00498 if (!empty($dateFrom) || !empty($dateTo)) switch($dateField) {
00499 case SUBMISSION_FIELD_DATE_SUBMITTED:
00500 if (!empty($dateFrom)) {
00501 $searchSql .= ' AND a.date_submitted >= ' . $this->datetimeToDB($dateFrom);
00502 }
00503 if (!empty($dateTo)) {
00504 $searchSql .= ' AND a.date_submitted <= ' . $this->datetimeToDB($dateTo);
00505 }
00506 break;
00507 case SUBMISSION_FIELD_DATE_COPYEDIT_COMPLETE:
00508 if (!empty($dateFrom)) {
00509 $searchSql .= ' AND c.date_final_completed >= ' . $this->datetimeToDB($dateFrom);
00510 }
00511 if (!empty($dateTo)) {
00512 $searchSql .= ' AND c.date_final_completed <= ' . $this->datetimeToDB($dateTo);
00513 }
00514 break;
00515 case SUBMISSION_FIELD_DATE_LAYOUT_COMPLETE:
00516 if (!empty($dateFrom)) {
00517 $searchSql .= ' AND l.date_completed >= ' . $this->datetimeToDB($dateFrom);
00518 }
00519 if (!empty($dateTo)) {
00520 $searchSql .= ' AND l.date_completed <= ' . $this->datetimeToDB($dateTo);
00521 }
00522 break;
00523 case SUBMISSION_FIELD_DATE_PROOFREADING_COMPLETE:
00524 if (!empty($dateFrom)) {
00525 $searchSql .= ' AND p.date_proofreader_completed >= ' . $this->datetimeToDB($dateFrom);
00526 }
00527 if (!empty($dateTo)) {
00528 $searchSql .= 'AND p.date_proofreader_completed <= ' . $this->datetimeToDB($dateTo);
00529 }
00530 break;
00531 }
00532
00533 $sql = 'SELECT DISTINCT
00534 a.*,
00535 e.can_review AS can_review,
00536 e.can_edit AS can_edit,
00537 COALESCE(stl.setting_value, stpl.setting_value) AS section_title,
00538 COALESCE(sal.setting_value, sapl.setting_value) AS section_abbrev,
00539 c.copyed_id,
00540 c.copyeditor_id,
00541 c.copyedit_revision,
00542 c.date_notified AS copyeditor_date_notified,
00543 c.date_underway AS copyeditor_date_underway,
00544 c.date_completed AS copyeditor_date_completed,
00545 c.date_acknowledged AS copyeditor_date_acknowledged,
00546 c.date_author_notified AS ce_date_author_notified,
00547 c.date_author_underway AS ce_date_author_underway,
00548 c.date_author_completed AS ce_date_author_completed,
00549 c.date_author_acknowledged AS ce_date_author_acknowledged,
00550 c.date_final_notified AS ce_date_final_notified,
00551 c.date_final_underway AS ce_date_final_underway,
00552 c.date_final_completed AS ce_date_final_completed,
00553 c.date_final_acknowledged AS ce_date_final_acknowledged,
00554 c.initial_revision AS copyeditor_initial_revision,
00555 c.editor_author_revision AS ce_editor_author_revision,
00556 c.final_revision AS copyeditor_final_revision,
00557 r2.review_revision
00558 FROM
00559 articles a
00560 INNER JOIN article_authors aa ON (aa.article_id = a.article_id)
00561 LEFT JOIN edit_assignments e ON (e.article_id = a.article_id)
00562 LEFT JOIN users ed ON (e.editor_id = ed.user_id)
00563 LEFT JOIN sections s ON (s.section_id = a.section_id)
00564 LEFT JOIN copyed_assignments c ON (a.article_id = c.article_id)
00565 LEFT JOIN users ce ON (c.copyeditor_id = ce.user_id)
00566 LEFT JOIN proof_assignments p ON (p.article_id = a.article_id)
00567 LEFT JOIN users pe ON (pe.user_id = p.proofreader_id)
00568 LEFT JOIN review_rounds r2 ON (a.article_id = r2.article_id and a.current_round = r2.round)
00569 LEFT JOIN layouted_assignments l ON (l.article_id = a.article_id) LEFT JOIN users le ON (le.user_id = l.editor_id)
00570 LEFT JOIN section_settings stpl ON (s.section_id = stpl.section_id AND stpl.setting_name = ? AND stpl.locale = ?)
00571 LEFT JOIN section_settings stl ON (s.section_id = stl.section_id AND stl.setting_name = ? AND stl.locale = ?)
00572 LEFT JOIN section_settings sapl ON (s.section_id = sapl.section_id AND sapl.setting_name = ? AND sapl.locale = ?)
00573 LEFT JOIN section_settings sal ON (s.section_id = sal.section_id AND sal.setting_name = ? AND sal.locale = ?)
00574 LEFT JOIN article_settings atl ON (a.article_id = atl.article_id AND atl.setting_name = ?)
00575 WHERE a.journal_id = ?
00576 AND e.editor_id = ?
00577 AND a.submission_progress = 0' . (!empty($additionalWhereSql)?" AND ($additionalWhereSql)":"");
00578
00579
00580
00581 if ($status) $sql .= ' AND a.status = ' . STATUS_QUEUED;
00582 else $sql .= ' AND a.status <> ' . STATUS_QUEUED;
00583
00584 if ($sectionId) {
00585 $params[] = $sectionId;
00586 $searchSql .= ' AND a.section_id = ?';
00587 }
00588
00589 $result = &$this->retrieveRange($sql . ' ' . $searchSql . ' ORDER BY article_id ASC',
00590 $params,
00591 $rangeInfo
00592 );
00593
00594 return $result;
00595 }
00596
00610 function &getSectionEditorSubmissionsInReview($sectionEditorId, $journalId, $sectionId, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, $rangeInfo = null) {
00611 $submissions = array();
00612
00613
00614 $result = $this->getUnfilteredSectionEditorSubmissions($sectionEditorId, $journalId, $sectionId, $searchField, $searchMatch, $search, $dateField, $dateFrom, $dateTo, true, 'e.can_review = 1');
00615
00616 while (!$result->EOF) {
00617 $row = $result->GetRowAssoc(false);
00618 $submission = &$this->_returnSectionEditorSubmissionFromRow($row);
00619 $articleId = $submission->getArticleId();
00620
00621
00622 $inReview = true;
00623 $decisions = $submission->getDecisions();
00624 $decision = array_pop($decisions);
00625 if (!empty($decision)) {
00626 $latestDecision = array_pop($decision);
00627 if ($latestDecision['decision'] == SUBMISSION_EDITOR_DECISION_ACCEPT) {
00628 $inReview = false;
00629 }
00630 }
00631 if ($inReview) $submissions[] =& $submission;
00632
00633 unset($submission);
00634 $result->MoveNext();
00635 }
00636
00637 $result->Close();
00638 unset($result);
00639
00640 if (isset($rangeInfo) && $rangeInfo->isValid()) {
00641 $returner = &new ArrayItemIterator($submissions, $rangeInfo->getPage(), $rangeInfo->getCount());
00642 } else {
00643 $returner = &new ArrayItemIterator($submissions);
00644 }
00645 return $returner;
00646
00647 }
00648
00662 function &getSectionEditorSubmissionsInEditing($sectionEditorId, $journalId, $sectionId, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, $rangeInfo = null) {
00663 $submissions = array();
00664
00665
00666 $result = $this->getUnfilteredSectionEditorSubmissions($sectionEditorId, $journalId, $sectionId, $searchField, $searchMatch, $search, $dateField, $dateFrom, $dateTo, true, 'e.can_edit = 1');
00667
00668 while (!$result->EOF) {
00669 $row = $result->GetRowAssoc(false);
00670 $submission = &$this->_returnSectionEditorSubmissionFromRow($row);
00671
00672
00673 $inReview = true;
00674 $decisions = $submission->getDecisions();
00675 $decision = array_pop($decisions);
00676 if (!empty($decision)) {
00677 $latestDecision = array_pop($decision);
00678 if ($latestDecision['decision'] == SUBMISSION_EDITOR_DECISION_ACCEPT) {
00679 $inReview = false;
00680 }
00681 }
00682 if (!$inReview) $submissions[] =& $submission;
00683
00684 unset($submission);
00685 $result->MoveNext();
00686 }
00687
00688 $result->Close();
00689 unset($result);
00690
00691 if (isset($rangeInfo) && $rangeInfo->isValid()) {
00692 $returner = &new ArrayItemIterator($submissions, $rangeInfo->getPage(), $rangeInfo->getCount());
00693 } else {
00694 $returner = &new ArrayItemIterator($submissions);
00695 }
00696 return $returner;
00697 }
00698
00712 function &getSectionEditorSubmissionsArchives($sectionEditorId, $journalId, $sectionId, $searchField = null, $searchMatch = null, $search = null, $dateField = null, $dateFrom = null, $dateTo = null, $rangeInfo = null) {
00713 $submissions = array();
00714
00715 $result = $this->getUnfilteredSectionEditorSubmissions($sectionEditorId, $journalId, $sectionId, $searchField, $searchMatch, $search, $dateField, $dateFrom, $dateTo, false, '', $rangeInfo);
00716
00717 while (!$result->EOF) {
00718 $submission = &$this->_returnSectionEditorSubmissionFromRow($result->GetRowAssoc(false));
00719 $submissions[] =& $submission;
00720 unset($submission);
00721 $result->MoveNext();
00722 }
00723
00724 if (isset($rangeInfo) && $rangeInfo->isValid()) {
00725 $returner = &new VirtualArrayIterator($submissions, $result->MaxRecordCount(), $rangeInfo->getPage(), $rangeInfo->getCount());
00726 } else {
00727 $returner = &new ArrayItemIterator($submissions);
00728 }
00729
00730 $result->Close();
00731 unset($result);
00732
00733 return $returner;
00734 }
00735
00739 function &getSectionEditorSubmissionsCount($sectionEditorId, $journalId) {
00740
00741 $submissionsCount = array();
00742 for($i = 0; $i < 4; $i++) {
00743 $submissionsCount[$i] = 0;
00744 }
00745
00746 $result = $this->getUnfilteredSectionEditorSubmissions($sectionEditorId, $journalId);
00747
00748 while (!$result->EOF) {
00749 $row = $result->GetRowAssoc(false);
00750 $sectionEditorSubmission = &$this->_returnSectionEditorSubmissionFromRow($row);
00751
00752
00753 $inReview = true;
00754 $decisions = $sectionEditorSubmission->getDecisions();
00755 $decision = array_pop($decisions);
00756 if (!empty($decision)) {
00757 $latestDecision = array_pop($decision);
00758 if ($latestDecision['decision'] == SUBMISSION_EDITOR_DECISION_ACCEPT) {
00759 $inReview = false;
00760 }
00761 }
00762
00763 if ($inReview) {
00764 if ($row['can_review']) {
00765
00766 $submissionsCount[0] += 1;
00767 }
00768 } else {
00769
00770 if ($row['can_edit']) {
00771 $submissionsCount[1] += 1;
00772 }
00773 }
00774 unset($sectionEditorSubmission);
00775 $result->MoveNext();
00776 }
00777
00778 $result->Close();
00779 unset($result);
00780
00781 return $submissionsCount;
00782 }
00783
00784
00785
00786
00787
00792 function deleteDecisionsByArticle($articleId) {
00793 return $this->update(
00794 'DELETE FROM edit_decisions WHERE article_id = ?',
00795 $articleId
00796 );
00797 }
00798
00803 function deleteReviewRoundsByArticle($articleId) {
00804 return $this->update(
00805 'DELETE FROM review_rounds WHERE article_id = ?',
00806 $articleId
00807 );
00808 }
00809
00815 function getEditorDecisions($articleId, $round = null) {
00816 $decisions = array();
00817
00818 if ($round == null) {
00819 $result = &$this->retrieve(
00820 'SELECT edit_decision_id, editor_id, decision, date_decided FROM edit_decisions WHERE article_id = ? ORDER BY date_decided ASC', $articleId
00821 );
00822 } else {
00823 $result = &$this->retrieve(
00824 'SELECT edit_decision_id, editor_id, decision, date_decided FROM edit_decisions WHERE article_id = ? AND round = ? ORDER BY date_decided ASC',
00825 array($articleId, $round)
00826 );
00827 }
00828
00829 while (!$result->EOF) {
00830 $decisions[] = array(
00831 'editDecisionId' => $result->fields['edit_decision_id'],
00832 'editorId' => $result->fields['editor_id'],
00833 'decision' => $result->fields['decision'],
00834 'dateDecided' => $this->datetimeFromDB($result->fields['date_decided'])
00835 );
00836 $result->moveNext();
00837 }
00838 $result->Close();
00839 unset($result);
00840
00841 return $decisions;
00842 }
00843
00849 function getMaxReviewRound($articleId) {
00850 $result = &$this->retrieve(
00851 'SELECT MAX(round) FROM review_rounds WHERE article_id = ?', $articleId
00852 );
00853 $returner = isset($result->fields[0]) ? $result->fields[0] : 0;
00854
00855 $result->Close();
00856 unset($result);
00857
00858 return $returner;
00859 }
00860
00867 function reviewRoundExists($articleId, $round) {
00868 $result = &$this->retrieve(
00869 'SELECT COUNT(*) FROM review_rounds WHERE article_id = ? AND round = ?', array($articleId, $round)
00870 );
00871 $returner = isset($result->fields[0]) && $result->fields[0] == 1 ? true : false;
00872
00873 $result->Close();
00874 unset($result);
00875
00876 return $returner;
00877 }
00878
00885 function reviewerExists($articleId, $reviewerId, $round) {
00886 $result = &$this->retrieve(
00887 'SELECT COUNT(*) FROM review_assignments WHERE article_id = ? AND reviewer_id = ? AND round = ? AND cancelled = 0', array($articleId, $reviewerId, $round)
00888 );
00889 $returner = isset($result->fields[0]) && $result->fields[0] == 1 ? true : false;
00890
00891 $result->Close();
00892 unset($result);
00893
00894 return $returner;
00895 }
00896
00903 function &getReviewersForArticle($journalId, $articleId, $round, $searchType = null, $search = null, $searchMatch = null, $rangeInfo = null) {
00904 $paramArray = array('interests', $articleId, $round, $journalId, RoleDAO::getRoleIdFromPath('reviewer'));
00905 $searchSql = '';
00906
00907 if (isset($search)) switch ($searchType) {
00908 case USER_FIELD_USERID:
00909 $searchSql = 'AND user_id=?';
00910 $paramArray[] = $search;
00911 break;
00912 case USER_FIELD_FIRSTNAME:
00913 $searchSql = 'AND LOWER(first_name) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
00914 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
00915 break;
00916 case USER_FIELD_LASTNAME:
00917 $searchSql = 'AND LOWER(last_name) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
00918 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
00919 break;
00920 case USER_FIELD_USERNAME:
00921 $searchSql = 'AND LOWER(username) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
00922 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
00923 break;
00924 case USER_FIELD_EMAIL:
00925 $searchSql = 'AND LOWER(email) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
00926 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
00927 break;
00928 case USER_FIELD_INTERESTS:
00929 $searchSql = 'AND LOWER(s.setting_value) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
00930 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
00931 break;
00932 case USER_FIELD_INITIAL:
00933 $searchSql = 'AND (LOWER(last_name) LIKE LOWER(?) OR LOWER(username) LIKE LOWER(?))';
00934 $paramArray[] = $search . '%';
00935 $paramArray[] = $search . '%';
00936 break;
00937 }
00938
00939 $result = &$this->retrieveRange(
00940 'SELECT DISTINCT
00941 u.*,
00942 a.review_id
00943 FROM users u
00944 LEFT JOIN user_settings s ON (u.user_id = s.user_id AND s.setting_name = ?)
00945 LEFT JOIN roles r ON (r.user_id = u.user_id)
00946 LEFT JOIN review_assignments a ON (a.reviewer_id = u.user_id AND a.cancelled = 0 AND a.article_id = ? AND a.round = ?)
00947 WHERE u.user_id = r.user_id AND
00948 r.journal_id = ? AND
00949 r.role_id = ? ' . $searchSql . '
00950 ORDER BY last_name, first_name',
00951 $paramArray, $rangeInfo
00952 );
00953
00954 $returner = &new DAOResultFactory($result, $this, '_returnReviewerUserFromRow');
00955 return $returner;
00956 }
00957
00958 function &_returnReviewerUserFromRow(&$row) {
00959 $user = &$this->userDao->_returnUserFromRowWithData($row);
00960 $user->review_id = $row['review_id'];
00961
00962 HookRegistry::call('SectionEditorSubmissionDAO::_returnReviewerUserFromRow', array(&$user, &$row));
00963
00964 return $user;
00965 }
00966
00973 function &getReviewersNotAssignedToArticle($journalId, $articleId) {
00974 $users = array();
00975
00976 $result = &$this->retrieve(
00977 'SELECT u.*
00978 FROM users u
00979 LEFT JOIN roles r ON (r.user_id = u.user_id)
00980 LEFT JOIN review_assignments a ON (a.reviewer_id = u.user_id AND a.article_id = ?)
00981 WHERE r.journal_id = ? AND
00982 r.role_id = ? AND
00983 a.article_id IS NULL
00984 ORDER BY last_name, first_name',
00985 array($articleId, $journalId, RoleDAO::getRoleIdFromPath('reviewer'))
00986 );
00987
00988 while (!$result->EOF) {
00989 $users[] = &$this->userDao->_returnUserFromRowWithData($result->GetRowAssoc(false));
00990 $result->moveNext();
00991 }
00992
00993 $result->Close();
00994 unset($result);
00995
00996 return $users;
00997 }
00998
01005 function copyeditorExists($articleId, $copyeditorId) {
01006 $result = &$this->retrieve(
01007 'SELECT COUNT(*) FROM copyed_assignments WHERE article_id = ? AND copyeditor_id = ?', array($articleId, $copyeditorId)
01008 );
01009 return isset($result->fields[0]) && $result->fields[0] == 1 ? true : false;
01010 }
01011
01018 function &getCopyeditorsNotAssignedToArticle($journalId, $articleId, $searchType = null, $search = null, $searchMatch = null) {
01019 $users = array();
01020
01021 $paramArray = array('interests', $articleId, $journalId, RoleDAO::getRoleIdFromPath('copyeditor'));
01022 $searchSql = '';
01023
01024 if (isset($search)) switch ($searchType) {
01025 case USER_FIELD_USERID:
01026 $searchSql = 'AND user_id=?';
01027 $paramArray[] = $search;
01028 break;
01029 case USER_FIELD_FIRSTNAME:
01030 $searchSql = 'AND LOWER(first_name) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
01031 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
01032 break;
01033 case USER_FIELD_LASTNAME:
01034 $searchSql = 'AND LOWER(last_name) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
01035 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
01036 break;
01037 case USER_FIELD_USERNAME:
01038 $searchSql = 'AND LOWER(username) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
01039 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
01040 break;
01041 case USER_FIELD_EMAIL:
01042 $searchSql = 'AND LOWER(email) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
01043 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
01044 break;
01045 case USER_FIELD_INTERESTS:
01046 $searchSql = 'AND LOWER(setting_value) ' . ($searchMatch=='is'?'=':'LIKE') . ' LOWER(?)';
01047 $paramArray[] = ($searchMatch=='is'?$search:'%' . $search . '%');
01048 break;
01049 case USER_FIELD_INITIAL:
01050 $searchSql = 'AND (LOWER(last_name) LIKE LOWER(?) OR LOWER(username) LIKE LOWER(?))';
01051 $paramArray[] = $search . '%';
01052 $paramArray[] = $search . '%';
01053 break;
01054 }
01055
01056 $result = &$this->retrieve(
01057 'SELECT u.*
01058 FROM users u
01059 LEFT JOIN user_settings s ON (u.user_id = s.user_id AND s.setting_name = ?)
01060 LEFT JOIN roles r ON (r.user_id = u.user_id)
01061 LEFT JOIN copyed_assignments a ON (a.copyeditor_id = u.user_id AND a.article_id = ?)
01062 WHERE r.journal_id = ? AND
01063 r.role_id = ? AND
01064 a.article_id IS NULL
01065 ' . $searchSql . '
01066 ORDER BY last_name, first_name',
01067 $paramArray
01068 );
01069
01070 while (!$result->EOF) {
01071 $users[] = &$this->userDao->_returnUserFromRowWithData($result->GetRowAssoc(false));
01072 $result->moveNext();
01073 }
01074
01075 $result->Close();
01076 unset($result);
01077
01078 return $users;
01079 }
01080
01085 function getLayoutEditorStatistics($journalId) {
01086 $statistics = Array();
01087
01088
01089 $result = &$this->retrieve('SELECT la.editor_id AS editor_id, COUNT(la.article_id) AS complete FROM layouted_assignments la, articles a INNER JOIN proof_assignments p ON (p.article_id = a.article_id) WHERE la.article_id = a.article_id AND (la.date_completed IS NOT NULL AND p.date_layouteditor_completed IS NOT NULL) AND la.date_notified IS NOT NULL AND a.journal_id = ? GROUP BY la.editor_id', $journalId);
01090 while (!$result->EOF) {
01091 $row = $result->GetRowAssoc(false);
01092 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01093 $statistics[$row['editor_id']]['complete'] = $row['complete'];
01094 $result->MoveNext();
01095 }
01096
01097 $result->Close();
01098 unset($result);
01099
01100
01101 $result = &$this->retrieve('SELECT la.editor_id AS editor_id, COUNT(la.article_id) AS incomplete FROM layouted_assignments la, articles a INNER JOIN proof_assignments p ON (p.article_id = a.article_id) WHERE la.article_id = a.article_id AND (la.date_completed IS NULL OR p.date_layouteditor_completed IS NULL) AND la.date_notified IS NOT NULL AND a.journal_id = ? GROUP BY la.editor_id', $journalId);
01102 while (!$result->EOF) {
01103 $row = $result->GetRowAssoc(false);
01104 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01105 $statistics[$row['editor_id']]['incomplete'] = $row['incomplete'];
01106 $result->MoveNext();
01107 }
01108
01109 $result->Close();
01110 unset($result);
01111
01112
01113 $result = &$this->retrieve('SELECT la.editor_id AS editor_id, MAX(la.date_notified) AS last_assigned FROM layouted_assignments la, articles a WHERE la.article_id=a.article_id AND a.journal_id=? GROUP BY la.editor_id', $journalId);
01114 while (!$result->EOF) {
01115 $row = $result->GetRowAssoc(false);
01116 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01117 $statistics[$row['editor_id']]['last_assigned'] = $this->datetimeFromDB($row['last_assigned']);
01118 $result->MoveNext();
01119 }
01120
01121 $result->Close();
01122 unset($result);
01123
01124 return $statistics;
01125 }
01126
01131 function getReviewerStatistics($journalId) {
01132 $statistics = Array();
01133
01134
01135 $result = &$this->retrieve('SELECT ra.reviewer_id AS editor_id, MAX(ra.date_notified) AS last_notified FROM review_assignments ra, articles a WHERE ra.article_id = a.article_id AND a.journal_id = ? GROUP BY ra.reviewer_id', $journalId);
01136 while (!$result->EOF) {
01137 $row = $result->GetRowAssoc(false);
01138 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01139 $statistics[$row['editor_id']]['last_notified'] = $this->datetimeFromDB($row['last_notified']);
01140 $result->MoveNext();
01141 }
01142
01143 $result->Close();
01144 unset($result);
01145
01146
01147 $result =& $this->retrieve('SELECT r.reviewer_id, COUNT(*) AS incomplete FROM review_assignments r, articles a WHERE r.article_id = a.article_id AND r.date_notified IS NOT NULL AND r.date_completed IS NULL AND r.cancelled = 0 AND a.journal_id = ? GROUP BY r.reviewer_id', $journalId);
01148 while (!$result->EOF) {
01149 $row = $result->GetRowAssoc(false);
01150 if (!isset($statistics[$row['reviewer_id']])) $statistics[$row['reviewer_id']] = array();
01151 $statistics[$row['reviewer_id']]['incomplete'] = $row['incomplete'];
01152 $result->MoveNext();
01153 }
01154
01155 $result->Close();
01156 unset($result);
01157
01158
01159 $result = &$this->retrieve('SELECT r.reviewer_id, r.date_notified, r.date_completed FROM review_assignments r, articles a WHERE r.article_id = a.article_id AND r.date_notified IS NOT NULL AND r.date_completed IS NOT NULL AND r.declined = 0 AND a.journal_id = ?', $journalId);
01160 while (!$result->EOF) {
01161 $row = $result->GetRowAssoc(false);
01162 if (!isset($statistics[$row['reviewer_id']])) $statistics[$row['reviewer_id']] = array();
01163
01164 $completed = strtotime($this->datetimeFromDB($row['date_completed']));
01165 $notified = strtotime($this->datetimeFromDB($row['date_notified']));
01166 if (isset($statistics[$row['reviewer_id']]['total_span'])) {
01167 $statistics[$row['reviewer_id']]['total_span'] += $completed - $notified;
01168 $statistics[$row['reviewer_id']]['completed_review_count'] += 1;
01169 } else {
01170 $statistics[$row['reviewer_id']]['total_span'] = $completed - $notified;
01171 $statistics[$row['reviewer_id']]['completed_review_count'] = 1;
01172 }
01173
01174
01175 $statistics[$row['reviewer_id']]['average_span'] = (($statistics[$row['reviewer_id']]['total_span'] / $statistics[$row['reviewer_id']]['completed_review_count']) / 60 / 60 / 24 / 7);
01176 $result->MoveNext();
01177 }
01178
01179 $result->Close();
01180 unset($result);
01181
01182 return $statistics;
01183 }
01184
01189 function getCopyeditorStatistics($journalId) {
01190 $statistics = Array();
01191
01192
01193 $result = &$this->retrieve('SELECT ca.copyeditor_id AS editor_id, COUNT(ca.article_id) AS complete FROM copyed_assignments ca, articles a WHERE ca.article_id = a.article_id AND ca.date_completed IS NOT NULL AND a.journal_id = ? GROUP BY ca.copyeditor_id', $journalId);
01194 while (!$result->EOF) {
01195 $row = $result->GetRowAssoc(false);
01196 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01197 $statistics[$row['editor_id']]['complete'] = $row['complete'];
01198 $result->MoveNext();
01199 }
01200
01201 $result->Close();
01202 unset($result);
01203
01204
01205 $result = &$this->retrieve('SELECT ca.copyeditor_id AS editor_id, COUNT(ca.article_id) AS incomplete FROM copyed_assignments ca, articles a WHERE ca.article_id = a.article_id AND ca.date_completed IS NULL AND a.journal_id = ? GROUP BY ca.copyeditor_id', $journalId);
01206 while (!$result->EOF) {
01207 $row = $result->GetRowAssoc(false);
01208 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01209 $statistics[$row['editor_id']]['incomplete'] = $row['incomplete'];
01210 $result->MoveNext();
01211 }
01212
01213 $result->Close();
01214 unset($result);
01215
01216
01217 $result = &$this->retrieve('SELECT ca.copyeditor_id AS editor_id, MAX(ca.date_notified) AS last_assigned FROM copyed_assignments ca, articles a WHERE ca.article_id = a.article_id AND a.journal_id = ? GROUP BY ca.copyeditor_id', $journalId);
01218 while (!$result->EOF) {
01219 $row = $result->GetRowAssoc(false);
01220 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01221 $statistics[$row['editor_id']]['last_assigned'] = $this->datetimeFromDB($row['last_assigned']);
01222 $result->MoveNext();
01223 }
01224
01225 $result->Close();
01226 unset($result);
01227
01228 return $statistics;
01229 }
01230
01235 function getProofreaderStatistics($journalId) {
01236 $statistics = Array();
01237
01238
01239 $result = &$this->retrieve('SELECT pa.proofreader_id AS editor_id, COUNT(pa.article_id) AS complete FROM proof_assignments pa, articles a WHERE pa.article_id = a.article_id AND pa.date_proofreader_completed IS NOT NULL AND a.journal_id = ? GROUP BY pa.proofreader_id', $journalId);
01240 while (!$result->EOF) {
01241 $row = $result->GetRowAssoc(false);
01242 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01243 $statistics[$row['editor_id']]['complete'] = $row['complete'];
01244 $result->MoveNext();
01245 }
01246
01247 $result->Close();
01248 unset($result);
01249
01250
01251 $result = &$this->retrieve('SELECT pa.proofreader_id AS editor_id, COUNT(pa.article_id) AS incomplete FROM proof_assignments pa, articles a WHERE pa.article_id = a.article_id AND pa.date_proofreader_completed IS NULL AND a.journal_id = ? GROUP BY pa.proofreader_id', $journalId);
01252 while (!$result->EOF) {
01253 $row = $result->GetRowAssoc(false);
01254 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01255 $statistics[$row['editor_id']]['incomplete'] = $row['incomplete'];
01256 $result->MoveNext();
01257 }
01258
01259 $result->Close();
01260 unset($result);
01261
01262
01263 $result = &$this->retrieve('SELECT pa.proofreader_id AS editor_id, MAX(pa.date_proofreader_notified) AS last_assigned FROM proof_assignments pa, articles a WHERE pa.article_id = a.article_id AND a.journal_id = ? GROUP BY pa.proofreader_id', $journalId);
01264 while (!$result->EOF) {
01265 $row = $result->GetRowAssoc(false);
01266 if (!isset($statistics[$row['editor_id']])) $statistics[$row['editor_id']] = array();
01267 $statistics[$row['editor_id']]['last_assigned'] = $this->datetimeFromDB($row['last_assigned']);
01268 $result->MoveNext();
01269 }
01270 $result->Close();
01271 unset($result);
01272
01273 return $statistics;
01274 }
01275 }
01276
01277 ?>