17 use Illuminate\Database\Capsule\Manager as Capsule;
114 public function orderBy($column, $direction =
'DESC') {
115 if ($column ===
'givenName') {
116 $this->orderColumn =
'user_given';
117 } elseif ($column ===
'familyName') {
118 $this->orderColumn =
'user_family';
120 $this->orderColumn =
'u.user_id';
122 $this->orderDirection = $direction;
161 $this->assignedToCategoryId = $categoryId;
173 $this->assignedToSectionId = $sectionId;
185 $this->assignedToSubmissionId = $submissionId;
186 if ($submissionStage && $this->assignedToSubmissionId) {
187 $this->assignedToSubmissionStageId = $submissionStage;
361 public function limitTo($count) {
362 $this->limit = $count;
384 $q->groups = [
'u.user_id'];
386 return $q->select(
'u.user_id')
394 public function getIds() {
397 $q->groups = [
'u.user_id'];
399 return $q->select(
'u.user_id')
414 $primaryLocale = $site->getPrimaryLocale();
416 $this->columns[] =
'u.*';
417 $this->columns[] = Capsule::raw(
'COALESCE(ugl.setting_value, ugpl.setting_value) AS user_given');
418 $this->columns[] = Capsule::raw(
'CASE WHEN ugl.setting_value <> \'\' THEN ufl.setting_value ELSE ufpl.setting_value END AS user_family');
419 $q = Capsule::table(
'users as u')
420 ->leftJoin(
'user_user_groups as uug',
'uug.user_id',
'=',
'u.user_id')
421 ->leftJoin(
'user_groups as ug',
'ug.user_group_id',
'=',
'uug.user_group_id')
422 ->leftJoin(
'user_settings as ugl',
function ($join) use ($locale) {
423 $join->on(
'ugl.user_id',
'=',
'u.user_id')
424 ->where(
'ugl.setting_name',
'=', IDENTITY_SETTING_GIVENNAME)
425 ->where(
'ugl.locale',
'=', $locale);
427 ->leftJoin(
'user_settings as ugpl',
function ($join) use ($primaryLocale) {
428 $join->on(
'ugpl.user_id',
'=',
'u.user_id')
429 ->where(
'ugpl.setting_name',
'=', IDENTITY_SETTING_GIVENNAME)
430 ->where(
'ugpl.locale',
'=', $primaryLocale);
432 ->leftJoin(
'user_settings as ufl',
function ($join) use ($locale) {
433 $join->on(
'ufl.user_id',
'=',
'u.user_id')
434 ->where(
'ufl.setting_name',
'=', IDENTITY_SETTING_FAMILYNAME)
435 ->where(
'ufl.locale',
'=', $locale);
437 ->leftJoin(
'user_settings as ufpl',
function ($join) use ($primaryLocale) {
438 $join->on(
'ufpl.user_id',
'=',
'u.user_id')
439 ->where(
'ufpl.setting_name',
'=', IDENTITY_SETTING_FAMILYNAME)
440 ->where(
'ufpl.locale',
'=', $primaryLocale);
446 if (is_null($this->contextId)) {
447 $q->where(
'ug.context_id',
'=', CONTEXT_ID_NONE);
448 } elseif ($this->contextId !==
'*') {
449 $q->where(
'ug.context_id',
'=' , $this->contextId);
453 if (!is_null($this->roleIds)) {
454 $q->whereIn(
'ug.role_id', $this->roleIds);
463 if (!is_null($this->status)) {
464 if ($this->status ===
'disabled') {
465 $q->where(
'u.disabled',
'=', 1);
466 } elseif ($this->status ===
'active') {
467 $q->where(
'u.disabled',
'=', 0);
472 if (!is_null($this->assignedToSubmissionId)) {
475 $q->leftJoin(
'stage_assignments as sa',
function($table) use ($submissionId) {
476 $table->on(
'u.user_id',
'=',
'sa.user_id');
477 $table->on(
'sa.submission_id',
'=', Capsule::raw((
int) $submissionId));
480 $q->whereNotNull(
'sa.stage_assignment_id');
482 if (!is_null($this->assignedToSubmissionStageId)) {
485 $q->leftJoin(
'user_group_stage as ugs',
'sa.user_group_id',
'=',
'ugs.user_group_id');
486 $q->where(
'ugs.stage_id',
'=', Capsule::raw((
int) $stageId));
497 $dateTime->add(
new \DateInterval(
'P1D'));
498 $q->where(
'u.date_registered',
'<', $dateTime->format(
'Y-m-d'));
502 if (!is_null($this->reviewStageId)) {
503 $q->leftJoin(
'user_group_stage as ugs',
'uug.user_group_id',
'=',
'ugs.user_group_id');
504 $q->where(
'ugs.stage_id',
'=', Capsule::raw((
int) $this->reviewStageId));
511 $q->leftJoin(
'user_settings as us',
'u.user_id',
'=',
'us.user_id');
512 $q->leftJoin(
'user_interests as ui',
'u.user_id',
'=',
'ui.user_id');
513 $q->leftJoin(
'controlled_vocab_entry_settings as cves',
'ui.controlled_vocab_entry_id',
'=',
'cves.controlled_vocab_entry_id');
514 foreach ($words as $word) {
515 $word = strtolower(addcslashes($word,
'%_'));
516 $q->where(
function($q) use ($word) {
517 $q->where(Capsule::raw(
'lower(u.username)'),
'LIKE',
"%{$word}%")
518 ->orWhere(Capsule::raw(
'lower(u.email)'),
'LIKE',
"%{$word}%")
519 ->orWhere(
function($q) use ($word) {
520 $q->where(
'us.setting_name', IDENTITY_SETTING_GIVENNAME);
521 $q->where(Capsule::raw(
'lower(us.setting_value)'),
'LIKE',
"%{$word}%");
523 ->orWhere(
function($q) use ($word) {
524 $q->where(
'us.setting_name', IDENTITY_SETTING_FAMILYNAME);
525 $q->where(Capsule::raw(
'lower(us.setting_value)'),
'LIKE',
"%{$word}%");
527 ->orWhere(
function($q) use ($word) {
528 $q->where(
'us.setting_name',
'affiliation');
529 $q->where(Capsule::raw(
'lower(us.setting_value)'),
'LIKE',
"%{$word}%");
531 ->orWhere(
function($q) use ($word) {
532 $q->where(
'us.setting_name',
'biography');
533 $q->where(Capsule::raw(
'lower(us.setting_value)'),
'LIKE',
"%{$word}%");
535 ->orWhere(
function($q) use ($word) {
536 $q->where(
'us.setting_name',
'orcid');
537 $q->where(Capsule::raw(
'lower(us.setting_value)'),
'LIKE',
"%{$word}%");
539 ->orWhere(Capsule::raw(
'lower(cves.setting_value)'),
'LIKE',
"%{$word}%");
547 $q->leftJoin(
'review_assignments as ra',
'u.user_id',
'=',
'ra.reviewer_id');
548 $this->columns[] = Capsule::raw(
'MAX(ra.date_assigned) as last_assigned');
549 $this->columns[] = Capsule::raw(
'(SELECT SUM(CASE WHEN ra.date_completed IS NULL AND ra.declined <> 1 THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id) as incomplete_count');
550 $this->columns[] = Capsule::raw(
'(SELECT SUM(CASE WHEN ra.date_completed IS NOT NULL AND ra.declined <> 1 THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id) as complete_count');
551 $this->columns[] = Capsule::raw(
'(SELECT SUM(CASE WHEN ra.declined = 1 THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id) as declined_count');
552 $this->columns[] = Capsule::raw(
'(SELECT SUM(CASE WHEN ra.cancelled = 1 THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id) as cancelled_count');
556 $dateDiffClause =
'DATEDIFF(ra.date_completed, ra.date_notified)';
559 $dateDiffClause =
'DATE_PART(\'day\', ra.date_completed - ra.date_notified)';
561 $this->columns[] = Capsule::raw(
'AVG(' . $dateDiffClause .
') as average_time');
562 $this->columns[] = Capsule::raw(
'(SELECT AVG(ra.quality) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id AND ra.quality IS NOT NULL) as reviewer_rating');
565 if (!empty($this->reviewerRating)) {
566 $q->havingRaw(
'(SELECT AVG(ra.quality) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id AND ra.quality IS NOT NULL) >= ' . (
int) $this->reviewerRating);
570 if (!empty($this->reviewsCompleted)) {
572 $subqueryStatement =
'(SELECT SUM(CASE WHEN ra.date_completed IS NOT NULL THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id)';
573 $q->having(Capsule::raw($subqueryStatement),
'>=', $doneMin);
574 if (is_array($this->reviewsCompleted) && !empty($this->reviewsCompleted[1])) {
575 $q->having(Capsule::raw($subqueryStatement),
'<=', $this->reviewsCompleted[1]);
580 if (!empty($this->reviewsActive)) {
582 $subqueryStatement =
'(SELECT SUM(CASE WHEN ra.date_completed IS NULL AND ra.declined <> 1 THEN 1 ELSE 0 END) FROM review_assignments AS ra WHERE u.user_id = ra.reviewer_id)';
583 $q->having(Capsule::raw($subqueryStatement),
'>=', $activeMin);
584 if (is_array($this->reviewsActive) && !empty($this->reviewsActive[1])) {
585 $q->having(Capsule::raw($subqueryStatement),
'<=', $this->reviewsActive[1]);
590 if (!empty($this->daysSinceLastAssignment)) {
593 $dbTimeMin = $userDao->dateTimeToDB(time() - ((
int) $daysSinceMin * 86400));
594 $q->havingRaw(
'MAX(ra.date_assigned) <= ' . $dbTimeMin);
595 if (is_array($this->daysSinceLastAssignment) && !empty($this->daysSinceLastAssignment[1])) {
596 $daysSinceMax = $this->daysSinceLastAssignment[1];
599 $dbTimeMax = $userDao->dateTimeToDB(time() - ((
int) $daysSinceMax * 86400) - 84600);
600 $q->havingRaw(
'MAX(ra.date_assigned) >= ' . $dbTimeMax);
605 if (!empty($this->averageCompletion)) {
606 $q->havingRaw(
'AVG(' . $dateDiffClause .
') <= ' . (
int) $this->averageCompletion);
617 if (!is_null($this->limit)) {
618 $q->limit($this->limit);
620 if (!empty($this->offset)) {
621 $q->offset($this->offset);
625 if (!is_null($this->assignedToSectionId)) {
628 $q->leftJoin(
'subeditor_submission_group as ssg',
function($table) use ($sectionId) {
629 $table->on(
'u.user_id',
'=',
'ssg.user_id');
630 $table->on(
'ssg.assoc_type',
'=', Capsule::raw((
int) ASSOC_TYPE_SECTION));
631 $table->on(
'ssg.assoc_id',
'=', Capsule::raw((
int) $sectionId));
634 $q->whereNotNull(
'ssg.assoc_id');
638 if (!is_null($this->assignedToCategoryId)) {
641 $q->leftJoin(
'subeditor_submission_group as ssg',
function($table) use ($categoryId) {
642 $table->on(
'u.user_id',
'=',
'ssg.user_id');
643 $table->on(
'ssg.assoc_type',
'=', Capsule::raw((
int) ASSOC_TYPE_CATEGORY));
644 $table->on(
'ssg.assoc_id',
'=', Capsule::raw((
int) $categoryId));
647 $q->whereNotNull(
'ssg.assoc_id');
653 $q->select($this->columns)
654 ->groupBy(
'u.user_id',
'user_given',
'user_family')
655 ->orderBy($this->orderColumn, $this->orderDirection);