Open Monograph Press  3.3.0
PKPStatsHandler.inc.php
1 <?php
2 
16 import('classes.handler.Handler');
17 import('classes.statistics.StatisticsHelper');
18 
19 class PKPStatsHandler extends Handler {
20 
22  var $_isBackendPage = true;
23 
27  public function __construct() {
28  parent::__construct();
29  $this->addRoleAssignment(
30  [ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR],
31  ['editorial', 'publications', 'users']
32  );
33  }
34 
41  public function authorize($request, &$args, $roleAssignments) {
42  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
43  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
44  return parent::authorize($request, $args, $roleAssignments);
45  }
46 
47 
48  //
49  // Public handler methods.
50  //
57  public function editorial($args, $request) {
58  $dispatcher = $request->getDispatcher();
59  $context = $request->getContext();
60 
61  if (!$context) {
62  $dispatcher->handle404();
63  }
64 
65  $templateMgr = TemplateManager::getManager($request);
66  $this->setupTemplate($request);
67 
68  $dateStart = date('Y-m-d', strtotime('-91 days'));
69  $dateEnd = date('Y-m-d', strtotime('yesterday'));
70 
71  $args = [
72  'contextIds' => [$context->getId()],
73  ];
74 
75  $totals = Services::get('editorialStats')->getOverview($args);
76  $averages = Services::get('editorialStats')->getAverages($args);
77  $dateRangeTotals = Services::get('editorialStats')->getOverview(
78  array_merge(
79  $args,
80  [
81  'dateStart' => $dateStart,
82  'dateEnd' => $dateEnd,
83  ]
84  )
85  );
86 
87  // Stats that should be converted to percentages
88  $percentageStats = [
89  'acceptanceRate',
90  'declineRate',
91  'declinedDeskRate',
92  'declinedReviewRate',
93  ];
94 
95  // Stats that should be indented in the table
96  $indentStats = [
97  'submissionsDeclinedDeskReject',
98  'submissionsDeclinedPostReview',
99  'daysToAccept',
100  'daysToReject',
101  'declinedDeskRate',
102  'declinedReviewRate',
103  ];
104 
105  // Compile table rows
106  $tableRows = [];
107  foreach ($totals as $i => $stat) {
108  $row = [
109  'key' => $stat['key'],
110  'name' => __($stat['name']),
111  'total' => $stat['value'],
112  'dateRange' => $dateRangeTotals[$i]['value'],
113  ];
114  if (in_array($stat['key'], $indentStats)) {
115  $row['name'] = ' ' . $row['name'];
116  }
117  if (in_array($stat['key'], $percentageStats)) {
118  $row['total'] = ($stat['value'] * 100) . '%';
119  $row['dateRange'] = ($dateRangeTotals[$i]['value'] * 100) . '%';
120  }
121  $description = $this->_getStatDescription($stat['key']);
122  if ($description) {
123  $row['description'] = $description;
124  }
125  if (array_key_exists($stat['key'], $averages)
126  && $averages[$stat['key']] !== -1
127  && $row['total'] > 0) {
128  $row['total'] = __('stats.countWithYearlyAverage', [
129  'count' => $stat['value'],
130  'average' => $averages[$stat['key']],
131  ]);
132  }
133  $tableRows[] = $row;
134  }
135 
136  // Get the worflow stage counts
137  $activeByStage = [];
138  foreach (Application::get()->getApplicationStages() as $stageId) {
139  $activeByStage[] = [
140  'name' => __(Application::get()->getWorkflowStageName($stageId)),
141  'count' => Services::get('editorialStats')->countActiveByStages($stageId, $args),
142  'color' => Application::get()->getWorkflowStageColor($stageId),
143  ];
144  }
145 
146  $statsComponent = new \PKP\components\PKPStatsEditorialPage(
147  $dispatcher->url($request, ROUTE_API, $context->getPath(), 'stats/editorial'),
148  [
149  'activeByStage' => $activeByStage,
150  'averagesApiUrl' => $dispatcher->url($request, ROUTE_API, $context->getPath(), 'stats/editorial/averages'),
151  'dateStart' => $dateStart,
152  'dateEnd' => $dateEnd,
153  'dateRangeOptions' => [
154  [
155  'dateStart' => date('Y-m-d', strtotime('-91 days')),
156  'dateEnd' => $dateEnd,
157  'label' => __('stats.dateRange.last90Days'),
158  ],
159  [
160  'dateStart' => date('Y-m-d', strtotime(date('Y') . '-01-01')),
161  'dateEnd' => $dateEnd,
162  'label' => __('stats.dateRange.thisYear'),
163  ],
164  [
165  'dateStart' => date('Y-m-d', strtotime((date('Y') - 1) . '-01-01')),
166  'dateEnd' => date('Y-m-d', strtotime((date('Y') - 1) . '-12-31')),
167  'label' => __('stats.dateRange.lastYear'),
168  ],
169  [
170  'dateStart' => date('Y-m-d', strtotime((date('Y') - 2) . '-01-01')),
171  'dateEnd' => date('Y-m-d', strtotime((date('Y') - 1) . '-12-31')),
172  'label' => __('stats.dateRange.lastTwoYears'),
173  ],
174  ],
175  'percentageStats' => $percentageStats,
176  'tableColumns' => [
177  [
178  'name' => 'name',
179  'label' => __('common.name'),
180  'value' => 'name',
181  ],
182  [
183  'name' => 'dateRange',
184  'label' => $dateStart . ' — ' . $dateEnd,
185  'value' => 'dateRange',
186  ],
187  [
188  'name' => 'total',
189  'label' => __('stats.total'),
190  'value' => 'total',
191  ],
192  ],
193  'tableRows' => $tableRows,
194  ]
195  );
196 
197  $templateMgr->setLocaleKeys([
198  'stats.descriptionForStat',
199  'stats.countWithYearlyAverage',
200  ]);
201  $templateMgr->setState($statsComponent->getConfig());
202  $templateMgr->assign([
203  'pageComponent' => 'StatsEditorialPage',
204  'pageTitle' => __('stats.editorialActivity'),
205  ]);
206 
207  $templateMgr->display('stats/editorial.tpl');
208  }
209 
216  public function publications($args, $request) {
217  $dispatcher = $request->getDispatcher();
218  $context = $request->getContext();
219 
220  if (!$context) {
221  $dispatcher->handle404();
222  }
223 
224  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION);
225  AppLocale::requireComponents(LOCALE_COMPONENT_APP_SUBMISSION);
226 
227  $templateMgr = TemplateManager::getManager($request);
228  $this->setupTemplate($request);
229 
230  $dateStart = date('Y-m-d', strtotime('-31 days'));
231  $dateEnd = date('Y-m-d', strtotime('yesterday'));
232  $count = 30;
233 
234  $timeline = Services::get('stats')->getTimeline(STATISTICS_DIMENSION_DAY, [
235  'assocTypes' => ASSOC_TYPE_SUBMISSION,
236  'contextIds' => $context->getId(),
237  'count' => $count,
238  'dateStart' => $dateStart,
239  'dateEnd' => $dateEnd,
240  ]);
241 
242  $statsComponent = new \PKP\components\PKPStatsPublicationPage(
243  $dispatcher->url($request, ROUTE_API, $context->getPath(), 'stats/publications'),
244  [
245  'timeline' => $timeline,
246  'timelineInterval' => STATISTICS_DIMENSION_DAY,
247  'timelineType' => 'abstract',
248  'tableColumns' => [
249  [
250  'name' => 'title',
251  'label' => __('common.title'),
252  ],
253  [
254  'name' => 'abstractViews',
255  'label' => __('submission.abstractViews'),
256  'value' => 'abstractViews',
257  ],
258  [
259  'name' => 'galleyViews',
260  'label' => __('stats.fileViews'),
261  'value' => 'galleyViews',
262  ],
263  [
264  'name' => 'pdf',
265  'label' => __('stats.pdf'),
266  'value' => 'pdfViews',
267  ],
268  [
269  'name' => 'html',
270  'label' => __('stats.html'),
271  'value' => 'htmlViews',
272  ],
273  [
274  'name' => 'other',
275  'label' => __('common.other'),
276  'value' => 'otherViews',
277  ],
278  [
279  'name' => 'total',
280  'label' => __('stats.total'),
281  'value' => 'total',
282  'orderBy' => 'total',
283  'initialOrderDirection' => true,
284  ],
285  ],
286  'count' => $count,
287  'dateStart' => $dateStart,
288  'dateEnd' => $dateEnd,
289  'dateRangeOptions' => [
290  [
291  'dateStart' => $dateStart,
292  'dateEnd' => $dateEnd,
293  'label' => __('stats.dateRange.last30Days'),
294  ],
295  [
296  'dateStart' => date('Y-m-d', strtotime('-91 days')),
297  'dateEnd' => $dateEnd,
298  'label' => __('stats.dateRange.last90Days'),
299  ],
300  [
301  'dateStart' => date('Y-m-d', strtotime('-12 months')),
302  'dateEnd' => $dateEnd,
303  'label' => __('stats.dateRange.last12Months'),
304  ],
305  [
306  'dateStart' => '',
307  'dateEnd' => '',
308  'label' => __('stats.dateRange.allDates'),
309  ],
310  ],
311  'orderBy' => 'total',
312  'orderDirection' => true,
313  ]
314  );
315 
316  $templateMgr->setState($statsComponent->getConfig());
317  $templateMgr->assign([
318  'pageComponent' => 'StatsPublicationsPage',
319  'pageTitle' => __('stats.publicationStats'),
320  'pageWidth' => PAGE_WIDTH_WIDE,
321  ]);
322 
323  $templateMgr->display('stats/publications.tpl');
324  }
325 
332  public function users($args, $request) {
333  $dispatcher = $request->getDispatcher();
334  $context = $request->getContext();
335 
336  if (!$context) {
337  $dispatcher->handle404();
338  }
339 
340  $templateMgr = TemplateManager::getManager($request);
341  $this->setupTemplate($request);
342  $templateMgr->assign([
343  'pageTitle' => __('stats.userStatistics'),
344  'userStats' => array_map(
345  function ($item) {
346  $item['name'] = __($item['name']);
347  return $item;
348  },
349  Services::get('user')->getRolesOverview(['contextId' => $context->getId()])
350  ),
351  ]);
352  $templateMgr->display('stats/users.tpl');
353  }
354 
361  protected function _getStatDescription($key) {
362  switch ($key) {
363  case 'daysToDecision': return __('stats.description.daysToDecision');
364  case 'acceptanceRate': return __('stats.description.acceptRejectRate');
365  case 'declineRate': return __('stats.description.acceptRejectRate');
366  }
367  return '';
368  }
369 }
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
PKPStatsHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PKPStatsHandler.inc.php:41
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPStatsHandler\editorial
editorial($args, $request)
Definition: PKPStatsHandler.inc.php:57
PKPStatsHandler\__construct
__construct()
Definition: PKPStatsHandler.inc.php:27
PKPStatsHandler\publications
publications($args, $request)
Definition: PKPStatsHandler.inc.php:216
PKPStatsHandler\users
users($args, $request)
Definition: PKPStatsHandler.inc.php:332
PKPStatsHandler
Handle requests for statistics pages.
Definition: PKPStatsHandler.inc.php:19
PKPHandler\setupTemplate
setupTemplate($request)
Definition: PKPHandler.inc.php:466
PKPStatsHandler\$_isBackendPage
$_isBackendPage
Definition: PKPStatsHandler.inc.php:22
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
Handler
Base request handler application class.
Definition: Handler.inc.php:18
PKPStatsHandler\_getStatDescription
_getStatDescription($key)
Definition: PKPStatsHandler.inc.php:361
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49