Open Journal Systems  3.3.0
ReviewReportPlugin.inc.php
1 <?php
2 
17 import('lib.pkp.classes.plugins.ReportPlugin');
18 
23  function register($category, $path, $mainContextId = null) {
24  $success = parent::register($category, $path, $mainContextId);
25  if ($success && Config::getVar('general', 'installed')) {
26  $this->import('ReviewReportDAO');
27  $reviewReportDAO = new ReviewReportDAO();
28  DAORegistry::registerDAO('ReviewReportDAO', $reviewReportDAO);
29  }
30  $this->addLocaleData();
31  return $success;
32  }
33 
37  function getName() {
38  return 'ReviewReportPlugin';
39  }
40 
44  function getDisplayName() {
45  return __('plugins.reports.reviews.displayName');
46  }
47 
51  function getDescription() {
52  return __('plugins.reports.reviews.description');
53  }
54 
58  function display($args, $request) {
59  $context = $request->getContext();
60 
61  header('content-type: text/comma-separated-values');
62  header('content-disposition: attachment; filename=reviews-' . date('Ymd') . '.csv');
63  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION);
64 
65  $reviewReportDao = DAORegistry::getDAO('ReviewReportDAO');
66  list($commentsIterator, $reviewsIterator, $interestsArray) = $reviewReportDao->getReviewReport($context->getId());
67 
68  $comments = array();
69  while ($row = $commentsIterator->next()) {
70  if (isset($comments[$row['submission_id']][$row['author_id']])) {
71  $comments[$row['submission_id']][$row['author_id']] .= "; " . $row['comments'];
72  } else {
73  $comments[$row['submission_id']][$row['author_id']] = $row['comments'];
74  }
75  }
76 
77  import('lib.pkp.classes.submission.reviewAssignment.ReviewAssignment');
78  $recommendations = array(
79  SUBMISSION_REVIEWER_RECOMMENDATION_ACCEPT => 'reviewer.article.decision.accept',
80  SUBMISSION_REVIEWER_RECOMMENDATION_PENDING_REVISIONS => 'reviewer.article.decision.pendingRevisions',
81  SUBMISSION_REVIEWER_RECOMMENDATION_RESUBMIT_HERE => 'reviewer.article.decision.resubmitHere',
82  SUBMISSION_REVIEWER_RECOMMENDATION_RESUBMIT_ELSEWHERE => 'reviewer.article.decision.resubmitElsewhere',
83  SUBMISSION_REVIEWER_RECOMMENDATION_DECLINE => 'reviewer.article.decision.decline',
84  SUBMISSION_REVIEWER_RECOMMENDATION_SEE_COMMENTS => 'reviewer.article.decision.seeComments'
85  );
86 
87  $columns = array(
88  'stage_id' => __('workflow.stage'),
89  'round' => __('plugins.reports.reviews.round'),
90  'submission' => __('plugins.reports.reviews.submissionTitle'),
91  'submission_id' => __('plugins.reports.reviews.submissionId'),
92  'reviewer' => __('plugins.reports.reviews.reviewer'),
93  'user_given' => __('user.givenName'),
94  'user_family' => __('user.familyName'),
95  'orcid' => __('user.orcid'),
96  'country' => __('common.country'),
97  'affiliation' => __('user.affiliation'),
98  'email' => __('user.email'),
99  'interests' => __('user.interests'),
100  'dateassigned' => __('plugins.reports.reviews.dateAssigned'),
101  'datenotified' => __('plugins.reports.reviews.dateNotified'),
102  'dateconfirmed' => __('plugins.reports.reviews.dateConfirmed'),
103  'datecompleted' => __('plugins.reports.reviews.dateCompleted'),
104  'dateacknowledged' => __('plugins.reports.reviews.dateAcknowledged'),
105  'unconsidered' => __('plugins.reports.reviews.unconsidered'),
106  'datereminded' => __('plugins.reports.reviews.dateReminded'),
107  'dateresponsedue' => __('reviewer.submission.responseDueDate'),
108  'overdueresponse' => __('plugins.reports.reviews.responseOverdue'),
109  'datedue' => __('reviewer.submission.reviewDueDate'),
110  'overdue' => __('plugins.reports.reviews.reviewOverdue'),
111  'declined' => __('submissions.declined'),
112  'recommendation' => __('plugins.reports.reviews.recommendation'),
113  'comments' => __('plugins.reports.reviews.comments')
114  );
115 
116  $fp = fopen('php://output', 'wt');
117  //Add BOM (byte order mark) to fix UTF-8 in Excel
118  fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));
119  fputcsv($fp, array_values($columns));
120 
121  while ($row = $reviewsIterator->next()) {
122  if (substr($row['dateresponsedue'], 11) === '00:00:00') {
123  $row['dateresponsedue'] = substr($row['dateresponsedue'], 0, 11) . '23:59:59';
124  }
125  if (substr($row['datedue'], 11) === '00:00:00') {
126  $row['datedue'] = substr($row['datedue'], 0, 11) . '23:59:59';
127  }
128  list($overdueResponseDays, $overdueDays) = $this->getOverdueDays($row);
129  $row['overdueresponse'] = $overdueResponseDays;
130  $row['overdue'] = $overdueDays;
131 
132  foreach ($columns as $index => $junk) switch ($index) {
133  case 'stage_id':
134  $columns[$index] = __(WorkflowStageDAO::getTranslationKeyFromId($row[$index]));
135  break;
136  case 'declined':
137  $columns[$index] = __($row[$index]?'common.yes':'common.no');
138  break;
139  case 'unconsidered':
140  $columns[$index] = __($row[$index]?'common.yes':'');
141  break;
142  case 'recommendation':
143  if (isset($recommendations[$row[$index]])) {
144  $columns[$index] = (!isset($row[$index])) ? __('common.none') : __($recommendations[$row[$index]]);
145  } else {
146  $columns[$index] = '';
147  }
148  break;
149  case 'comments':
150  if (isset($comments[$row['submission_id']][$row['reviewer_id']])) {
151  $columns[$index] = $comments[$row['submission_id']][$row['reviewer_id']];
152  } else {
153  $columns[$index] = '';
154  }
155  break;
156  case 'interests':
157  if (isset($interestsArray[$row['reviewer_id']])) {
158  $columns[$index] = $interestsArray[$row['reviewer_id']];
159  } else {
160  $columns[$index] = '';
161  }
162  break;
163  default:
164  $columns[$index] = $row[$index];
165  }
166  fputcsv($fp, $columns);
167  }
168  fclose($fp);
169  }
170 
171  function getOverdueDays($row) {
172  $responseDueTime = strtotime($row['dateresponsedue']);
173  $reviewDueTime = strtotime($row['datedue']);
174  $overdueResponseDays = $overdueDays = '';
175  if (!$row['dateconfirmed']){ // no response
176  if($responseDueTime < time()) { // response overdue
177  $datediff = time() - $responseDueTime;
178  $overdueResponseDays = round($datediff / (60 * 60 * 24));
179  } elseif ($reviewDueTime < time()) { // review overdue but not response
180  $datediff = time() - $reviewDueTime;
181  $overdueDays = round($datediff / (60 * 60 * 24));
182  }
183  } elseif (!$row['datecompleted']) { // response given, but not completed
184  if ($reviewDueTime < time()) { // review due
185  $datediff = time() - $reviewDueTime;
186  $overdueDays = round($datediff / (60 * 60 * 24));
187  }
188  }
189  return array($overdueResponseDays, $overdueDays);
190  }
191 }
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
ReviewReportPlugin
Review report plugin.
Definition: ReviewReportPlugin.inc.php:19
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ReviewReportDAO
Review report DAO.
Definition: ReviewReportDAO.inc.php:20
ReviewReportPlugin\getName
getName()
Definition: ReviewReportPlugin.inc.php:37
ReviewReportPlugin\getOverdueDays
getOverdueDays($row)
Definition: ReviewReportPlugin.inc.php:171
ReportPlugin
Abstract class for report plugins.
Definition: ReportPlugin.inc.php:18
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
DAORegistry\registerDAO
static registerDAO($name, $dao)
Definition: DAORegistry.inc.php:40
Plugin\$request
$request
Definition: Plugin.inc.php:68
Plugin\addLocaleData
addLocaleData($locale=null)
Definition: Plugin.inc.php:454
ReviewReportPlugin\getDescription
getDescription()
Definition: ReviewReportPlugin.inc.php:51
ReviewReportPlugin\display
display($args, $request)
Definition: ReviewReportPlugin.inc.php:58
WorkflowStageDAO\getTranslationKeyFromId
static getTranslationKeyFromId($stageId)
Definition: WorkflowStageDAO.inc.php:62
ReviewReportPlugin\getDisplayName
getDisplayName()
Definition: ReviewReportPlugin.inc.php:44