18 use Illuminate\Database\Capsule\Manager as Capsule;
85 public function orderBy($column, $direction =
'DESC') {
87 import(
'classes.submission.SubmissionDAO');
88 if ($column ===
'lastModified') {
89 $this->orderColumn =
's.last_modified';
90 } elseif ($column ===
'dateLastActivity') {
91 $this->orderColumn =
's.date_last_activity';
92 } elseif ($column ===
'title') {
93 $this->orderColumn = Capsule::raw(
'COALESCE(publication_tlps.setting_value, publication_tlpsl.setting_value)');
94 } elseif ($column ===
'seq') {
95 $this->orderColumn =
'po.seq';
96 } elseif ($column === ORDERBY_DATE_PUBLISHED) {
97 $this->orderColumn =
'po.date_published';
99 $this->orderColumn =
's.date_submitted';
101 $this->orderDirection = $direction;
218 public function limitTo($count) {
219 $this->limit = $count;
241 ->select(
's.submission_id')
249 public function getIds() {
252 ->select(
's.submission_id')
253 ->pluck(
's.submission_id')
261 $this->columns[] =
's.*';
262 $q = Capsule::table(
'submissions as s')
263 ->orderBy($this->orderColumn, $this->orderDirection)
264 ->groupBy(
's.submission_id');
269 if (is_null($this->contextId)) {
270 $q->where(
's.context_id',
'=', CONTEXT_ID_NONE);
271 } elseif ($this->contextId !==
'*') {
272 $q->where(
's.context_id',
'=' , $this->contextId);
276 if (is_object($this->orderColumn) && $this->orderColumn->getValue() ===
'COALESCE(publication_tlps.setting_value, publication_tlpsl.setting_value)') {
278 $this->columns[] = Capsule::raw(
'COALESCE(publication_tlps.setting_value, publication_tlpsl.setting_value)');
279 $q->leftJoin(
'publications as publication_tlp',
's.current_publication_id',
'=',
'publication_tlp.publication_id')
280 ->leftJoin(
'publication_settings as publication_tlps',
'publication_tlp.publication_id',
'=',
'publication_tlps.publication_id')
281 ->where(
'publication_tlps.setting_name',
'=',
'title')
282 ->where(
'publication_tlps.locale',
'=', $locale);
283 $q->leftJoin(
'publications as publication_tlpl',
's.current_publication_id',
'=',
'publication_tlpl.publication_id')
284 ->leftJoin(
'publication_settings as publication_tlpsl',
'publication_tlp.publication_id',
'=',
'publication_tlpsl.publication_id')
285 ->where(
'publication_tlpsl.setting_name',
'=',
'title')
286 ->where(
'publication_tlpsl.locale',
'=', Capsule::raw(
'publication_tlpl.locale'));
287 $q->groupBy(Capsule::raw(
'COALESCE(publication_tlps.setting_value, publication_tlpsl.setting_value)'));
291 if ($this->orderColumn ===
'po.seq') {
292 $this->columns[] =
'po.seq';
293 $q->leftJoin(
'publications as po',
's.current_publication_id',
'=',
'po.publication_id');
294 $q->groupBy(
'po.seq');
297 }
else if ($this->orderColumn ===
'po.date_published') {
298 $this->columns[] =
'po.date_published';
299 $q->leftJoin(
'publications as po',
's.current_publication_id',
'=',
'po.publication_id');
303 if (!is_null($this->statuses)) {
304 $q->whereIn(
's.status', $this->statuses);
308 if (!is_null($this->stageIds)) {
309 $q->whereIn(
's.stage_id', $this->stageIds);
313 if ($this->isIncomplete) {
314 $q->where(
's.submission_progress',
'>', 0);
318 if ($this->daysInactive) {
319 $q->where(
's.date_last_activity',
'<', \
Core::getCurrentDate(strtotime(
'-'.$this->daysInactive.
' days')));
323 if ($this->isOverdue) {
324 $q->leftJoin(
'review_assignments as raod',
'raod.submission_id',
'=',
's.submission_id')
325 ->leftJoin(
'review_rounds as rr',
function($table) {
326 $table->on(
'rr.submission_id',
'=',
's.submission_id');
327 $table->on(
'raod.review_round_id',
'=',
'rr.review_round_id');
330 import(
'lib.pkp.classes.submission.reviewRound.ReviewRound');
331 $q->where(
'rr.status',
'!=', REVIEW_ROUND_STATUS_RESUBMIT_FOR_REVIEW);
332 $q->where(
'rr.status',
'!=', REVIEW_ROUND_STATUS_SENT_TO_EXTERNAL);
333 $q->where(
'rr.status',
'!=', REVIEW_ROUND_STATUS_ACCEPTED);
334 $q->where(
'rr.status',
'!=', REVIEW_ROUND_STATUS_DECLINED);
335 $q->where(
function ($q) {
336 $q->where(
'raod.declined',
'<>', 1);
337 $q->where(
'raod.cancelled',
'<>', 1);
338 $q->where(
function ($q) {
340 $q->whereNull(
'raod.date_completed');
342 $q->orWhere(
function ($q) {
344 $q->whereNull(
'raod.date_confirmed');
351 if ($isAssignedOnly) {
355 $q->leftJoin(
'stage_assignments as sa',
function($table) use (
$assignedTo) {
356 $table->on(
's.submission_id',
'=',
'sa.submission_id');
361 $q->leftJoin(
'review_assignments as ra',
function($table) use (
$assignedTo) {
362 $table->on(
's.submission_id',
'=',
'ra.submission_id');
363 $table->on(
'ra.declined',
'=', Capsule::raw((
int) 0));
367 $q->where(
function($q) {
368 $q->whereNotNull(
'sa.stage_assignment_id');
369 $q->orWhereNotNull(
'ra.review_id');
372 $sub = Capsule::table(
'stage_assignments')
373 ->select(Capsule::raw(
'count(stage_assignments.stage_assignment_id)'))
374 ->leftJoin(
'user_groups',
'stage_assignments.user_group_id',
'=',
'user_groups.user_group_id')
375 ->where(
'stage_assignments.submission_id',
'=', Capsule::raw(
's.submission_id'))
376 ->whereIn(
'user_groups.role_id', array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR));
378 $q->whereNotNull(
's.date_submitted')
379 ->mergeBindings($sub)
380 ->where(Capsule::raw(
'(' . $sub->toSql() .
')'),
'=',
'0')
381 ->groupBy(
's.date_submitted');
388 $q->leftJoin(
'publications as p',
'p.submission_id',
'=',
's.submission_id')
389 ->leftJoin(
'publication_settings as ps',
'p.publication_id',
'=',
'ps.publication_id')
390 ->leftJoin(
'authors as au',
'p.publication_id',
'=',
'au.publication_id')
391 ->leftJoin(
'author_settings as aus',
'aus.author_id',
'=',
'au.author_id');
393 foreach ($words as $word) {
394 $word = strtolower(addcslashes($word,
'%_'));
395 $q->where(
function($q) use ($word, $isAssignedOnly) {
396 $q->where(
function($q) use ($word) {
397 $q->where(
'ps.setting_name',
'title');
398 $q->where(Capsule::raw(
'lower(ps.setting_value)'),
'LIKE',
"%{$word}%");
400 ->orWhere(
function($q) use ($word) {
401 $q->where(
'aus.setting_name', IDENTITY_SETTING_GIVENNAME);
402 $q->where(Capsule::raw(
'lower(aus.setting_value)'),
'LIKE',
"%{$word}%");
404 ->orWhere(
function($q) use ($word, $isAssignedOnly) {
405 $q->where(
'aus.setting_name', IDENTITY_SETTING_FAMILYNAME);
406 $q->where(Capsule::raw(
'lower(aus.setting_value)'),
'LIKE',
"%{$word}%");
408 ->orWhere(
function($q) use ($word, $isAssignedOnly) {
409 $q->where(
'aus.setting_name',
'orcid');
410 $q->where(Capsule::raw(
'lower(aus.setting_value)'),
'=',
"{$word}");
413 if ($isAssignedOnly) {
414 $q->whereNull(
'ra.reviewer_id');
416 if (ctype_digit((
string) $word)) {
417 $q->orWhere(
's.submission_id',
'=', $word);
426 if (!empty($this->categoryIds)) {
427 $q->leftJoin(
'publication_categories as pc',
's.current_publication_id',
'=',
'pc.publication_id')
428 ->whereIn(
'pc.category_id', $this->categoryIds);
432 if (!is_null($this->limit)) {
433 $q->limit($this->limit);
435 if (!empty($this->offset)) {
436 $q->offset($this->offset);
442 $q->select($this->columns);
453 abstract function appGet($q);