Files
luos/workflow/engine/src/ProcessMaker/Model/Delegation.php

1953 lines
64 KiB
PHP
Raw Normal View History

<?php
namespace ProcessMaker\Model;
2020-12-23 18:24:32 -04:00
use Cases;
2020-10-02 12:53:58 -04:00
use DateTime;
use G;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
2020-12-09 15:56:40 -04:00
use ProcessMaker\BusinessModel\Cases\AbstractCases;
2020-05-07 19:14:11 +00:00
use ProcessMaker\Core\System;
2020-11-19 17:21:05 -04:00
use ProcessMaker\Model\Task;
class Delegation extends Model
{
2019-06-10 15:04:14 -04:00
// Class constants
const PRIORITIES_MAP = [1 => 'VL', 2 => 'L', 3 => 'N', 4 => 'H', 5 => 'VH'];
protected $table = "APP_DELEGATION";
// We don't have our standard timestamp columns
public $timestamps = false;
2019-12-24 15:14:24 -04:00
// Static properties to preserve values
public static $usrUid = '';
public static $groups = [];
/**
* Returns the application this delegation belongs to
*/
public function application()
{
return $this->belongsTo(Application::class, 'APP_UID', 'APP_UID');
}
/**
* Returns the user this delegation belongs to
*/
public function user()
{
return $this->belongsTo(User::class, 'USR_ID', 'USR_ID');
}
/**
* Return the process task this belongs to
*/
public function task()
{
return $this->belongsTo(Task::class, 'TAS_ID', 'TAS_ID');
}
/**
* Return the process this delegation belongs to
*/
public function process()
{
return $this->belongsTo(Process::class, 'PRO_ID', 'PRO_ID');
}
2020-11-05 17:50:41 -04:00
/**
* Scope a query to only include specific priority
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $priority
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePriority($query, int $priority)
{
return $query->where('DEL_PRIORITY', $priority);
}
2020-11-25 18:11:22 -04:00
/**
* Scope a query to only include specific priorities
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $priorities
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePriorities($query, array $priorities)
{
return $query->whereIn('DEL_PRIORITY', $priorities);
}
2019-06-10 15:04:14 -04:00
/**
* Scope a query to only include open threads
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeThreadOpen($query)
{
2020-10-22 16:34:26 -04:00
return $query->where('APP_DELEGATION.DEL_THREAD_STATUS', '=', 'OPEN');
2019-06-10 15:04:14 -04:00
}
2020-11-25 18:11:22 -04:00
/**
* Scope to use when the case is IN_PROGRESS like DRAFT or TO_DO
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $ids
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCasesInProgress($query, array $ids)
{
$query->isThreadOpen()->statusIds($ids);
return $query;
}
/**
* Scope to use when the case is DONE like COMPLETED or CANCELED
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $ids
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCasesDone($query, array $ids)
{
$query->lastThread()->statusIds($ids);
return $query;
}
2019-06-10 15:04:14 -04:00
/**
* Scope a query to only include a specific index
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $index
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-05 17:50:41 -04:00
public function scopeIndex($query, int $index)
2019-06-10 15:04:14 -04:00
{
return $query->where('DEL_INDEX', '=', $index);
}
2020-10-16 15:53:54 -04:00
/**
* Scope a query to get the started by me
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCaseStarted($query)
{
return $query->where('DEL_INDEX', '=', 1);
}
2020-11-11 10:38:08 -04:00
/**
* Scope a query to get the in-progress
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCaseInProgress($query)
{
2020-12-09 19:04:05 -04:00
return $query->statusIds([Application::STATUS_DRAFT, Application::STATUS_TODO]);
}
/**
* Scope a query to get the to_do cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCaseTodo($query)
{
return $query->where('APPLICATION.APP_STATUS_ID', Application::STATUS_TODO);
2020-11-11 10:38:08 -04:00
}
2020-10-16 15:53:54 -04:00
/**
* Scope a query to get the completed by me
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCaseCompleted($query)
{
2020-12-09 19:04:05 -04:00
return $query->where('APPLICATION.APP_STATUS_ID', Application::STATUS_COMPLETED);
2020-11-25 18:11:22 -04:00
}
/**
* Scope a query to get specific status
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $statusId
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeStatus($query, int $statusId)
{
return $query->where('APPLICATION.APP_STATUS_ID', $statusId);
}
/**
* Scope a more status
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $statuses
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeStatusIds($query, array $statuses)
{
return $query->whereIn('APPLICATION.APP_STATUS_ID', $statuses);
}
/**
* Scope a query to only include a specific start date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $from
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeStartDateFrom($query, string $from)
{
return $query->where('APPLICATION.APP_CREATE_DATE', '>=', $from);
}
/**
* Scope a query to only include a specific start date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeStartDateTo($query, string $to)
{
return $query->where('APPLICATION.APP_CREATE_DATE', '<=', $to);
}
/**
* Scope a query to only include a specific finish date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $from
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFinishCaseFrom($query, string $from)
{
return $query->where('APPLICATION.APP_FINISH_DATE', '>=', $from);
}
/**
* Scope a query to only include a specific finish date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFinishCaseTo($query, string $to)
{
return $query->where('APPLICATION.APP_FINISH_DATE', '<=', $to);
2020-10-16 15:53:54 -04:00
}
2019-06-10 15:04:14 -04:00
/**
* Scope a query to only include a specific delegate date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $from
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-25 18:11:22 -04:00
public function scopeDelegateDateFrom($query, string $from)
2019-06-10 15:04:14 -04:00
{
return $query->where('DEL_DELEGATE_DATE', '>=', $from);
}
/**
* Scope a query to only include a specific delegate date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-25 18:11:22 -04:00
public function scopeDelegateDateTo($query, string $to)
2019-06-10 15:04:14 -04:00
{
return $query->where('DEL_DELEGATE_DATE', '<=', $to);
}
2020-11-25 18:11:22 -04:00
/**
* Scope a query to only include a specific finish date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $from
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFinishDateFrom($query, $from)
{
return $query->where('DEL_FINISH_DATE', '>=', $from);
}
/**
* Scope a query to only include a specific finish date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFinishDateTo($query, $to)
{
return $query->where('DEL_FINISH_DATE', '<=', $to);
}
/**
* Scope a query to only include a specific due date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $from
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDueFrom($query, $from)
{
return $query->where('DEL_TASK_DUE_DATE', '>=', $from);
}
/**
* Scope a query to only include a specific due date
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDueTo($query, $to)
{
return $query->where('DEL_TASK_DUE_DATE', '<=', $to);
}
2019-06-10 15:04:14 -04:00
/**
* Scope a query to get only the date on time
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeOnTime($query)
{
return $query->whereRaw('TIMEDIFF(DEL_RISK_DATE, NOW()) > 0');
}
/**
* Scope a query to get only the date at risk
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAtRisk($query)
{
return $query->whereRaw('TIMEDIFF(DEL_RISK_DATE, NOW()) < 0 AND TIMEDIFF(DEL_TASK_DUE_DATE, NOW()) > 0');
}
/**
* Scope a query to get only the date overdue
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeOverdue($query)
{
return $query->whereRaw('TIMEDIFF(DEL_TASK_DUE_DATE, NOW()) < 0');
}
/**
* Scope a query to only include a specific case
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $appNumber
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCase($query, $appNumber)
{
return $query->where('APP_DELEGATION.APP_NUMBER', '=', $appNumber);
}
2020-12-09 19:04:05 -04:00
/**
* Scope a query to only include a specific case title
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $search
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeTitle($query, string $search)
{
$config = System::getSystemConfiguration();
if ((int)$config['disable_advanced_search_case_title_fulltext'] === 0) {
// Cleaning "fulltext" operators in order to avoid unexpected results
$search = str_replace(
['-', '+', '<', '>', '(', ')', '~', '*', '"'],
['', '', '', '', '', '', '', '', ''],
$search
);
// Build the "fulltext" expression
$search = '+"' . preg_replace('/\s+/', '" +"', addslashes($search)) . '"';
// Searching using "fulltext" index
$query->whereRaw("MATCH(APP_DELEGATION.DEL_TITLE) AGAINST('{$search}' IN BOOLEAN MODE)");
} else {
// Searching using "like" operator
$query->where('APP_DELEGATION.DEL_TITLE', 'LIKE', "%${$search}%");
}
return $query;
}
2020-11-25 18:11:22 -04:00
/**
* Scope a query to only include specific cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $cases
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSpecificCases($query, array $cases)
{
return $query->whereIn('APP_DELEGATION.APP_NUMBER', $cases);
}
2020-11-05 17:50:41 -04:00
/**
* Scope a query to only include cases from a range
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $from
2020-11-25 18:11:22 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCasesFrom($query, int $from)
{
return $query->where('APP_DELEGATION.APP_NUMBER', '>=', $from);
}
/**
* Scope a query to only include cases from a range
*
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-05 17:50:41 -04:00
* @param int $to
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-25 18:11:22 -04:00
public function scopeCasesTo($query, int $to)
2020-11-05 17:50:41 -04:00
{
2020-11-25 18:11:22 -04:00
return $query->where('APP_DELEGATION.APP_NUMBER', '<=', $to);
2020-11-05 17:50:41 -04:00
}
2020-12-22 15:21:08 -04:00
/**
* Scope for query to get the positive cases for avoid the web entry
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePositiveCases($query)
{
return $query->where('APP_DELEGATION.APP_NUMBER', '>', 0);
}
2019-06-10 15:04:14 -04:00
/**
2020-11-25 18:11:22 -04:00
* Scope more than one range of cases
2019-06-10 15:04:14 -04:00
*
2020-11-25 18:11:22 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $rangeCases
2019-06-10 15:04:14 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-25 18:11:22 -04:00
public function scopeRangeOfCases($query, array $rangeCases)
2019-06-10 15:04:14 -04:00
{
2020-11-25 18:11:22 -04:00
foreach ($rangeCases as $fromTo) {
$fromTo = explode("-", $fromTo);
if (count($fromTo) === 2) {
$from = $fromTo[0];
$to = $fromTo[1];
if ($to > $from) {
$query->orWhere(function ($query) use ($from, $to) {
$query->casesFrom($from)->casesTo($to);
});
}
}
}
2019-06-10 15:04:14 -04:00
}
2019-05-20 13:23:31 -04:00
/**
* Scope a query to get the delegations from a case by APP_UID
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $appUid
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAppUid($query, $appUid)
{
2019-06-10 15:04:14 -04:00
return $query->where('APP_DELEGATION.APP_UID', '=', $appUid);
2019-05-20 13:23:31 -04:00
}
2019-08-15 15:18:35 -04:00
/**
* Scope a query to only include open threads
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeIsThreadOpen($query)
{
2020-10-13 23:20:30 +00:00
return $query->where('APP_DELEGATION.DEL_THREAD_STATUS', '=', 'OPEN');
2019-08-15 15:18:35 -04:00
}
2020-10-16 15:53:54 -04:00
/**
* Scope a query to get the last thread
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeLastThread($query)
{
return $query->where('APP_DELEGATION.DEL_LAST_INDEX', '=', 1);
}
2019-08-15 15:18:35 -04:00
/**
* Scope a query to only include threads without user
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeNoUserInThread($query)
{
2020-10-13 23:20:30 +00:00
return $query->where('APP_DELEGATION.USR_ID', '=', 0);
2019-08-15 15:18:35 -04:00
}
/**
* Scope a query to only include specific tasks
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $tasks
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeTasksIn($query, array $tasks)
{
return $query->whereIn('APP_DELEGATION.TAS_ID', $tasks);
}
2019-05-13 16:44:40 -04:00
/**
2019-06-10 15:04:14 -04:00
* Scope a query to only include specific cases by APP_UID
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $cases
2019-05-13 16:44:40 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-10 15:04:14 -04:00
public function scopeSpecificCasesByUid($query, array $cases)
2019-05-13 16:44:40 -04:00
{
2019-06-10 15:04:14 -04:00
return $query->whereIn('APP_DELEGATION.APP_UID', $cases);
}
/**
* Scope a query to only include specific user
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $user
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeUserId($query, $user)
{
return $query->where('APP_DELEGATION.USR_ID', '=', $user);
2019-05-13 16:44:40 -04:00
}
/**
* Scope a query to only include threads without user
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-10 15:04:14 -04:00
public function scopeWithoutUserId($query)
2019-05-13 16:44:40 -04:00
{
2019-06-10 15:04:14 -04:00
return $query->where('APP_DELEGATION.USR_ID', '=', 0);
}
/**
* Scope a query to only include specific process
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $process
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeProcessId($query, $process)
{
return $query->where('APP_DELEGATION.PRO_ID', $process);
}
/**
* Scope a query to only include a specific task
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $task
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-05 17:50:41 -04:00
public function scopeTask($query, int $task)
2019-06-10 15:04:14 -04:00
{
return $query->where('APP_DELEGATION.TAS_ID', '=', $task);
2019-05-13 16:44:40 -04:00
}
/**
* Scope a query to only include specific tasks
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $tasks
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-10 15:04:14 -04:00
public function scopeSpecificTasks($query, array $tasks)
2019-05-13 16:44:40 -04:00
{
return $query->whereIn('APP_DELEGATION.TAS_ID', $tasks);
}
/**
2019-06-10 15:04:14 -04:00
* Scope a join with task and include a specific task assign type:
* BALANCED|MANUAL|EVALUATE|REPORT_TO|SELF_SERVICE|STATIC_MI|CANCEL_MI|MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED
2019-05-13 16:44:40 -04:00
*
2019-06-10 15:04:14 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $taskType
2019-05-13 16:44:40 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-10 15:04:14 -04:00
public function scopeTaskAssignType($query, $taskType = 'SELF_SERVICE')
2019-05-13 16:44:40 -04:00
{
2019-06-10 15:04:14 -04:00
$query->join('TASK', function ($join) use ($taskType) {
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID')
->where('TASK.TAS_ASSIGN_TYPE', '=', $taskType);
});
return $query;
2019-05-13 16:44:40 -04:00
}
/**
2019-06-11 07:51:19 -04:00
* Scope a join with task and exclude a specific task assign type:
2019-06-10 15:04:14 -04:00
* NORMAL|ADHOC|SUBPROCESS|HIDDEN|GATEWAYTOGATEWAY|WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|
* INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|START-TIMER-EVENT|
* INTERMEDIATE-CATCH-TIMER-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|SERVICE-TASK
2019-05-13 16:44:40 -04:00
*
2019-06-10 15:04:14 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $taskTypes
2019-05-13 16:44:40 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-11 07:51:19 -04:00
public function scopeExcludeTaskTypes($query, array $taskTypes)
2019-05-13 16:44:40 -04:00
{
2019-06-10 15:04:14 -04:00
$query->join('TASK', function ($join) use ($taskTypes) {
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID')
2019-06-11 07:51:19 -04:00
->whereNotIn('TASK.TAS_TYPE', $taskTypes);
2019-06-10 15:04:14 -04:00
});
2019-05-13 16:44:40 -04:00
}
2019-06-14 13:05:21 -04:00
/**
* Scope a join with task and include a specific task assign type:
* NORMAL|ADHOC|SUBPROCESS|HIDDEN|GATEWAYTOGATEWAY|WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|
* INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|START-TIMER-EVENT|
* INTERMEDIATE-CATCH-TIMER-EVENT|END-EMAIL-EVENT|INTERMEDIATE-THROW-EMAIL-EVENT|SERVICE-TASK
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $taskTypes
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSpecificTaskTypes($query, array $taskTypes)
{
$query->join('TASK', function ($join) use ($taskTypes) {
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID')
->whereIn('TASK.TAS_TYPE', $taskTypes);
});
return $query;
}
2019-05-13 16:44:40 -04:00
/**
2019-06-10 15:04:14 -04:00
* Scope a join with APPLICATION with specific app status
2019-05-13 16:44:40 -04:00
*
2019-06-10 15:04:14 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
* @param integer $statusId
2019-05-13 16:44:40 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2019-06-10 15:04:14 -04:00
public function scopeAppStatusId($query, $statusId = 2)
2019-05-13 16:44:40 -04:00
{
2019-06-10 15:04:14 -04:00
$query->join('APPLICATION', function ($join) use ($statusId) {
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'APPLICATION.APP_NUMBER')
->where('APPLICATION.APP_STATUS_ID', $statusId);
});
return $query;
}
/**
* Scope a join with APPLICATION with specific app status
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $category
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinCategoryProcess($query, $category = '')
2019-06-10 15:04:14 -04:00
{
$query->join('PROCESS', function ($join) use ($category) {
$join->on('APP_DELEGATION.PRO_ID', '=', 'PROCESS.PRO_ID');
if ($category) {
$join->where('PROCESS.PRO_CATEGORY', $category);
}
});
return $query;
}
2019-06-11 07:51:19 -04:00
/**
* Scope the Inbox cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $userId
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeInbox($query, $userId)
{
// This scope is for the join with the APP_DELEGATION table
2020-11-25 18:11:22 -04:00
$query->joinApplication();
$query->status(Application::STATUS_TODO);
2019-06-11 07:51:19 -04:00
// Scope for the restriction of the task that must not be searched for
$query->excludeTaskTypes(Task::DUMMY_TASKS);
// Scope that establish that the DEL_THREAD_STATUS must be OPEN
$query->threadOpen();
// Scope that return the results for an specific user
$query->userId($userId);
return $query;
}
2020-10-16 15:53:54 -04:00
/**
* Scope the Inbox cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeInboxWithoutUser($query)
{
// This scope is for the join with the APP_DELEGATION table
2020-11-25 18:11:22 -04:00
$query->joinApplication();
$query->status(Application::STATUS_TODO);
2020-10-16 15:53:54 -04:00
// Scope for the restriction of the task that must not be searched for
$query->excludeTaskTypes(Task::DUMMY_TASKS);
// Scope that establish that the DEL_THREAD_STATUS must be OPEN
$query->threadOpen();
return $query;
}
2019-06-10 15:04:14 -04:00
/**
* Scope a self service cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $user
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSelfService($query, $user)
{
// Add Join with task filtering only the type self-service
$query->taskAssignType('SELF_SERVICE');
// Filtering the open threads and without users
$query->threadOpen()->withoutUserId();
// Filtering the cases unassigned that the user can view
$this->casesUnassigned($query, $user);
return $query;
}
2019-06-14 13:05:21 -04:00
/**
* Scope a draft cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $user
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDraft($query, $user)
{
// Add join for application, for get the case title when the case status is DRAFT
2020-11-25 18:11:22 -04:00
$query->joinApplication();
2020-12-11 17:36:07 -04:00
$query->status(Application::STATUS_DRAFT);
$query->threadOpen();
2019-06-14 13:05:21 -04:00
// Case assigned to the user
$query->userId($user);
return $query;
}
2020-10-16 15:53:54 -04:00
/**
* Scope a participated cases
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $user
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeParticipated($query, $user)
{
// Scope to set the user
$query->userId($user);
return $query;
}
2020-10-22 16:34:26 -04:00
/**
2020-11-11 10:38:08 -04:00
* Scope join with delegation for get the previous index
2020-10-22 16:34:26 -04:00
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeJoinPreviousIndex($query)
{
$query->leftJoin('APP_DELEGATION AS AD', function( $leftJoin) {
$leftJoin->on('APP_DELEGATION.APP_NUMBER', '=', 'AD.APP_NUMBER')
->on('APP_DELEGATION.DEL_PREVIOUS', '=', 'AD.DEL_INDEX');
});
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with user for get the previous user
2020-10-22 16:34:26 -04:00
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeJoinPreviousUser($query)
{
$query->leftJoin('USERS AS PREVIOUS', function ($leftJoin) {
$leftJoin->on('AD.USR_UID', '=', 'PREVIOUS.USR_UID');
});
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with process
*
2020-10-22 16:34:26 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
*
2020-10-22 16:34:26 -04:00
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinProcess($query)
2020-10-22 16:34:26 -04:00
{
2020-11-11 10:38:08 -04:00
$query->leftJoin('PROCESS', function ($leftJoin) {
$leftJoin->on('APP_DELEGATION.PRO_ID', '=', 'PROCESS.PRO_ID');
});
2020-10-22 16:34:26 -04:00
return $query;
}
2020-11-04 15:40:01 -04:00
/**
2020-11-11 10:38:08 -04:00
* Scope join with task
*
2020-11-04 15:40:01 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
*
2020-11-04 15:40:01 -04:00
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinTask($query)
2020-11-04 15:40:01 -04:00
{
2020-11-11 10:38:08 -04:00
$query->leftJoin('TASK', function ($leftJoin) {
$leftJoin->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID');
2020-11-04 15:40:01 -04:00
});
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with user
*
2020-11-04 15:40:01 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
*
2020-11-04 15:40:01 -04:00
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinUser($query)
2020-11-04 15:40:01 -04:00
{
$query->leftJoin('USERS', function ($leftJoin) {
2020-11-11 10:38:08 -04:00
$leftJoin->on('APP_DELEGATION.USR_ID', '=', 'USERS.USR_ID');
2020-11-04 15:40:01 -04:00
});
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with application
*
2020-11-04 15:40:01 -04:00
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
2020-11-04 15:40:01 -04:00
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinApplication($query)
2020-11-04 15:40:01 -04:00
{
$query->leftJoin('APPLICATION', function ($leftJoin) {
$leftJoin->on('APP_DELEGATION.APP_NUMBER', '=', 'APPLICATION.APP_NUMBER');
});
}
/**
2020-11-11 10:38:08 -04:00
* Scope the Process is in list
2020-11-04 15:40:01 -04:00
*
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
* @param array $processes
2020-11-04 15:40:01 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeProcessInList($query, array $processes)
2020-11-04 15:40:01 -04:00
{
2020-11-11 10:38:08 -04:00
$query->whereIn('APP_DELEGATION.PRO_ID', $processes);
2020-11-04 15:40:01 -04:00
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with AppDelay
2020-11-04 15:40:01 -04:00
*
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
* @param string $type
2020-11-04 15:40:01 -04:00
*
* @return \Illuminate\Database\Eloquent\Builder
*/
2020-11-11 10:38:08 -04:00
public function scopeJoinAppDelay($query, $type = 'PAUSE')
2020-11-04 15:40:01 -04:00
{
2020-11-11 10:38:08 -04:00
$query->leftJoin('APP_DELAY', function ($leftJoin) use ($type) {
$leftJoin->on('APP_DELAY.APP_NUMBER', '=', 'APP_DELEGATION.APP_NUMBER')
->on('APP_DELEGATION.DEL_INDEX', '=', 'APP_DELAY.APP_DEL_INDEX');
});
$query->where('APP_DELAY.APP_DISABLE_ACTION_USER', '=', '0');
$query->where('APP_DELAY.APP_TYPE', '=', $type);
2020-11-04 15:40:01 -04:00
return $query;
}
/**
2020-11-11 10:38:08 -04:00
* Scope join with AppDelay and users
2020-11-04 15:40:01 -04:00
*
* @param \Illuminate\Database\Eloquent\Builder $query
2020-11-11 10:38:08 -04:00
* @param int $userId
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeJoinAppDelayUsers($query, int $userId)
{
$query->leftJoin('USERS', function ($leftJoin) {
$leftJoin->on('APP_DELAY.APP_DELEGATION_USER', '=', 'USERS.USR_UID');
});
if ($userId) {
$query->where('USERS.USR_ID', $userId);
}
return $query;
}
/**
* Scope paused cases list
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $userId
* @param int $taskId
2020-11-04 15:40:01 -04:00
*
2020-11-11 10:38:08 -04:00
* @return \Illuminate\Database\Eloquent\Builder
2020-11-04 15:40:01 -04:00
*/
2020-11-25 18:11:22 -04:00
public function scopePaused($query, int $userId, int $taskId)
2020-11-04 15:40:01 -04:00
{
2020-11-11 10:38:08 -04:00
$query->joinAppDelay('PAUSE');
$query->joinAppDelayUsers($userId);
$query->joinApplication();
2020-11-25 18:11:22 -04:00
// Exclude some specific task
2020-11-11 10:38:08 -04:00
$query->excludeTaskTypes(Task::DUMMY_TASKS);
// Specific task
if (!empty($taskId)) {
$query->task($taskId);
2020-11-04 15:40:01 -04:00
}
return $query;
2020-11-11 10:38:08 -04:00
}
2020-11-04 15:40:01 -04:00
2019-06-10 15:04:14 -04:00
/**
* Get specific cases unassigned that the user can view
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $usrUid
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function casesUnassigned(&$query, $usrUid)
{
//Get the task self services related to the user
$taskSelfService = TaskUser::getSelfServicePerUser($usrUid);
//Get the task self services value based related to the user
$selfServiceValueBased = AppAssignSelfServiceValue::getSelfServiceCasesByEvaluatePerUser($usrUid);
//Get the cases unassigned
if (!empty($selfServiceValueBased)) {
$query->where(function ($query) use ($selfServiceValueBased, $taskSelfService) {
//Get the cases related to the task self service
$query->specificTasks($taskSelfService);
foreach ($selfServiceValueBased as $case) {
//Get the cases related to the task self service value based
$query->orWhere(function ($query) use ($case) {
$query->case($case['APP_NUMBER'])->index($case['DEL_INDEX'])->task($case['TAS_ID']);
});
}
});
} else {
//Get the cases related to the task self service
$query->specificTasks($taskSelfService);
}
return $query;
2019-05-13 16:44:40 -04:00
}
/**
* Searches for delegations which match certain criteria
*
* The query is related to advanced search with different filters
* We can search by process, status of case, category of process, users, delegate date from and to
*
* @param integer $userId The USR_ID to search for (Note, this is no longer the USR_UID)
* @param integer $start for the pagination
* @param integer $limit for the pagination
* @param string $search
* @param integer $process the pro_id
* @param integer $status of the case
* @param string $dir if the order is DESC or ASC
* @param string $sort name of column by sort, can be:
* [APP_NUMBER, APP_TITLE, APP_PRO_TITLE, APP_TAS_TITLE, APP_CURRENT_USER, APP_UPDATE_DATE, DEL_DELEGATE_DATE, DEL_TASK_DUE_DATE, APP_STATUS_LABEL]
* @param string $category uid for the process
* @param date $dateFrom
* @param date $dateTo
* @param string $filterBy name of column for a specific search, can be: [APP_NUMBER, APP_TITLE, TAS_TITLE]
* @return array $result result of the query
*/
public static function search(
$userId = null,
// Default pagination values
$start = 0,
$limit = 25,
$search = null,
$process = null,
$status = null,
$dir = null,
$sort = null,
$category = null,
$dateFrom = null,
$dateTo = null,
$filterBy = 'APP_TITLE'
) {
$search = trim($search);
// Start the query builder, selecting our base attributes
$selectColumns = [
'APPLICATION.APP_NUMBER',
'APPLICATION.APP_UID',
'APPLICATION.APP_STATUS',
'APPLICATION.APP_STATUS AS APP_STATUS_LABEL',
'APPLICATION.PRO_UID',
'APPLICATION.APP_CREATE_DATE',
'APPLICATION.APP_FINISH_DATE',
'APPLICATION.APP_UPDATE_DATE',
2020-12-07 09:21:51 -04:00
'APP_DELEGATION.DEL_TITLE AS APP_TITLE',
'APP_DELEGATION.USR_UID',
'APP_DELEGATION.TAS_UID',
'APP_DELEGATION.USR_ID',
'APP_DELEGATION.PRO_ID',
'APP_DELEGATION.DEL_INDEX',
'APP_DELEGATION.DEL_LAST_INDEX',
'APP_DELEGATION.DEL_DELEGATE_DATE',
'APP_DELEGATION.DEL_INIT_DATE',
'APP_DELEGATION.DEL_FINISH_DATE',
'APP_DELEGATION.DEL_TASK_DUE_DATE',
'APP_DELEGATION.DEL_RISK_DATE',
'APP_DELEGATION.DEL_THREAD_STATUS',
'APP_DELEGATION.DEL_PRIORITY',
'APP_DELEGATION.DEL_DURATION',
'APP_DELEGATION.DEL_QUEUE_DURATION',
'APP_DELEGATION.DEL_STARTED',
'APP_DELEGATION.DEL_DELAY_DURATION',
'APP_DELEGATION.DEL_FINISHED',
'APP_DELEGATION.DEL_DELAYED',
'APP_DELEGATION.DEL_DELAY_DURATION',
'TASK.TAS_TITLE AS APP_TAS_TITLE',
'TASK.TAS_TYPE AS APP_TAS_TYPE',
];
$query = DB::table('APP_DELEGATION')->select(DB::raw(implode(',', $selectColumns)));
// Add join for task, filtering for task title if needed
// It doesn't make sense for us to search for any delegations that match tasks that are events or web entry
$query->join('TASK', function ($join) use ($filterBy, $search) {
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID')
->whereNotIn('TASK.TAS_TYPE', [
'WEBENTRYEVENT',
'END-MESSAGE-EVENT',
'START-MESSAGE-EVENT',
'INTERMEDIATE-THROW',
]);
if ($filterBy == 'TAS_TITLE' && $search) {
$join->where('TASK.TAS_TITLE', 'LIKE', "%${search}%");
}
});
// Add join for application, taking care of status and filtering if necessary
$query->join('APPLICATION', function ($join) use ($filterBy, $search, $status, $query) {
2019-04-26 08:45:38 -07:00
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'APPLICATION.APP_NUMBER');
if ($filterBy == 'APP_TITLE' && $search) {
2020-05-07 19:14:11 +00:00
$config = System::getSystemConfiguration();
if ((int)$config['disable_advanced_search_case_title_fulltext'] === 0) {
// Cleaning "fulltext" operators in order to avoid unexpected results
2020-11-04 15:40:01 -04:00
$search = str_replace(
['-', '+', '<', '>', '(', ')', '~', '*', '"'],
['', '', '', '', '', '', '', '', ''],
$search
);
2019-07-26 10:01:39 -04:00
2020-05-07 19:14:11 +00:00
// Build the "fulltext" expression
$search = '+"' . preg_replace('/\s+/', '" +"', addslashes($search)) . '"';
// Searching using "fulltext" index
2020-12-07 09:21:51 -04:00
$join->whereRaw("MATCH(APP_DELEGATION.DEL_TITLE) AGAINST('{$search}' IN BOOLEAN MODE)");
2020-05-07 19:14:11 +00:00
} else {
// Searching using "like" operator
2020-12-07 09:21:51 -04:00
$join->where('APP_DELEGATION.DEL_TITLE', 'LIKE', "%${search}%");
2020-05-07 19:14:11 +00:00
}
}
// Based on the below, we can further limit the join so that we have a smaller data set based on join criteria
switch ($status) {
case 1: //DRAFT
$join->where('APPLICATION.APP_STATUS_ID', 1);
break;
case 2: //TO_DO
$join->where('APPLICATION.APP_STATUS_ID', 2);
break;
case 3: //COMPLETED
$join->where('APPLICATION.APP_STATUS_ID', 3);
break;
case 4: //CANCELLED
$join->where('APPLICATION.APP_STATUS_ID', 4);
break;
case "PAUSED":
$join->where('APPLICATION.APP_STATUS', 'TO_DO');
break;
default: //All status
// Don't do anything here, we'll need to do the more advanced where below
}
});
// Add join for process, but only for certain scenarios such as category or process
2019-05-22 10:27:00 -04:00
if ($category || $process || $sort == 'APP_PRO_TITLE') {
$query->join('PROCESS', function ($join) use ($category) {
$join->on('APP_DELEGATION.PRO_ID', '=', 'PROCESS.PRO_ID');
if ($category) {
$join->where('PROCESS.PRO_CATEGORY', $category);
}
});
}
// Add join for user, but only for certain scenarios as sorting
if ($sort == 'APP_CURRENT_USER') {
$query->join('USERS', function ($join) use ($userId) {
$join->on('APP_DELEGATION.USR_ID', '=', 'USERS.USR_ID');
});
}
// Search for specified user
if ($userId) {
$query->where('APP_DELEGATION.USR_ID', $userId);
}
// Search for specified process
if ($process) {
$query->where('APP_DELEGATION.PRO_ID', $process);
}
// Search for an app/case number
if ($filterBy == 'APP_NUMBER' && $search) {
2019-07-12 15:46:00 -04:00
$query->where('APP_DELEGATION.APP_NUMBER', '=', $search);
}
// Date range filter
if (!empty($dateFrom)) {
$query->where('APP_DELEGATION.DEL_DELEGATE_DATE', '>=', $dateFrom);
}
if (!empty($dateTo)) {
$dateTo = $dateTo . " 23:59:59";
// This is inclusive
$query->where('APP_DELEGATION.DEL_DELEGATE_DATE', '<=', $dateTo);
}
// Status Filter
// This is tricky, the below behavior is combined with the application join behavior above
switch ($status) {
case 1: //DRAFT
$query->where('APP_DELEGATION.DEL_THREAD_STATUS', 'OPEN');
break;
case 2: //TO_DO
$query->where('APP_DELEGATION.DEL_THREAD_STATUS', 'OPEN');
break;
case 3: //COMPLETED
$query->where('APP_DELEGATION.DEL_LAST_INDEX', 1);
break;
case 4: //CANCELLED
$query->where('APP_DELEGATION.DEL_LAST_INDEX', 1);
break;
case "PAUSED":
// Do nothing, as the app status check for TO_DO is performed in the join above
break;
default: //All statuses.
$query->where(function ($query) {
// Check to see if thread status is open
$query->where('APP_DELEGATION.DEL_THREAD_STATUS', 'OPEN')
->orWhere(function ($query) {
// Or, we make sure if the thread is closed, and it's the last delegation, and if the app is completed or cancelled
$query->where('APP_DELEGATION.DEL_THREAD_STATUS', 'CLOSED')
->where('APP_DELEGATION.DEL_LAST_INDEX', 1)
->whereIn('APPLICATION.APP_STATUS_ID', [3, 4]);
});
});
break;
}
// Add any sort if needed
2019-06-11 07:51:19 -04:00
if ($sort) {
switch ($sort) {
case 'APP_NUMBER':
$query->orderBy('APP_DELEGATION.APP_NUMBER', $dir);
break;
case 'APP_PRO_TITLE':
// We can do this because we joined the process table if sorting by it
$query->orderBy('PROCESS.PRO_TITLE', $dir);
break;
case 'APP_TAS_TITLE':
$query->orderBy('TASK.TAS_TITLE', $dir);
break;
case 'APP_CURRENT_USER':
// We can do this because we joined the user table if sorting by it
$query->orderBy('USERS.USR_LASTNAME', $dir);
$query->orderBy('USERS.USR_FIRSTNAME', $dir);
break;
default:
$query->orderBy($sort, $dir);
}
}
// Add pagination to the query
$query = $query->offset($start)
->limit($limit);
// Fetch results and transform to a laravel collection
$results = $query->get();
// Transform with additional data
$priorities = ['1' => 'VL', '2' => 'L', '3' => 'N', '4' => 'H', '5' => 'VH'];
$results->transform(function ($item, $key) use ($priorities) {
// Convert to an array as our results must be an array
$item = json_decode(json_encode($item), true);
// If it's assigned, fetch the user
2019-06-11 07:51:19 -04:00
if ($item['USR_ID']) {
$user = User::where('USR_ID', $item['USR_ID'])->first();
2019-06-11 07:51:19 -04:00
} else {
$user = null;
}
$process = Process::where('PRO_ID', $item['PRO_ID'])->first();
// Rewrite priority string
if ($item['DEL_PRIORITY']) {
2019-05-07 12:32:34 -04:00
$item['DEL_PRIORITY'] = G::LoadTranslation("ID_PRIORITY_{$priorities[$item['DEL_PRIORITY']]}");
}
// Merge in desired application data
if ($item['APP_STATUS']) {
2019-05-07 12:32:34 -04:00
$item['APP_STATUS_LABEL'] = G::LoadTranslation("ID_${item['APP_STATUS']}");
} else {
2019-05-07 12:32:34 -04:00
$item['APP_STATUS_LABEL'] = $item['APP_STATUS'];
}
// Merge in desired process data
// Handle situation where the process might not be in the system anymore
$item['APP_PRO_TITLE'] = $process ? $process->PRO_TITLE : '';
// Merge in desired user data
$item['USR_LASTNAME'] = $user ? $user->USR_LASTNAME : '';
$item['USR_FIRSTNAME'] = $user ? $user->USR_FIRSTNAME : '';
$item['USR_USERNAME'] = $user ? $user->USR_USERNAME : '';
//@todo: this section needs to use 'User Name Display Format', currently in the extJs is defined this
$item["APP_CURRENT_USER"] = $item["USR_LASTNAME"] . ' ' . $item["USR_FIRSTNAME"];
$item["APPDELCR_APP_TAS_TITLE"] = '';
$item["USRCR_USR_UID"] = $item["USR_UID"];
$item["USRCR_USR_FIRSTNAME"] = $item["USR_FIRSTNAME"];
$item["USRCR_USR_LASTNAME"] = $item["USR_LASTNAME"];
$item["USRCR_USR_USERNAME"] = $item["USR_USERNAME"];
$item["APP_OVERDUE_PERCENTAGE"] = '';
return $item;
});
// Remove any empty erroenous data
$results = $results->filter();
// Bundle into response array
$response = [
// Fake totalCount to show pagination
'totalCount' => $start + $limit + 1,
'sql' => $query->toSql(),
'bindings' => $query->getBindings(),
2019-05-02 10:53:43 -04:00
'data' => $results->values()->toArray(),
];
return $response;
}
2019-05-20 13:23:31 -04:00
/**
* Get participation information for a case
*
* @param string $appUid
* @return array
*
2019-06-10 15:04:14 -04:00
* @see \ProcessMaker\BusinessModel\Cases:getStatusInfo()
2019-05-20 13:23:31 -04:00
*/
public static function getParticipatedInfo($appUid)
{
// Build the query
$query = Delegation::query()->select([
'APP_UID',
'DEL_INDEX',
'PRO_UID'
]);
$query->appUid($appUid);
$query->orderBy('DEL_INDEX', 'ASC');
// Fetch results
$results = $query->get();
// Initialize the array to return
$arrayData = [];
// If the collection have at least one item, build the main array to return
if ($results->count() > 0) {
// Get the first item
$first = $results->first();
// Build the main array to return
$arrayData = [
2019-06-11 07:51:19 -04:00
'APP_STATUS' => 'PARTICIPATED',
// Value hardcoded because we need to return the same structure previously sent
'DEL_INDEX' => [],
// Initialize this item like an array
2019-05-20 13:23:31 -04:00
'PRO_UID' => $first->PRO_UID
];
// Populate the DEL_INDEX key with the values of the items collected
$results->each(function ($item) use (&$arrayData) {
$arrayData['DEL_INDEX'][] = $item->DEL_INDEX;
});
}
return $arrayData;
}
2019-05-13 16:44:40 -04:00
/**
2020-01-31 16:10:56 -04:00
* Get the self-services query by user
2019-05-13 16:44:40 -04:00
*
* @param string $usrUid
2020-01-31 16:10:56 -04:00
* @param bool $count
2020-10-13 23:20:30 +00:00
* @param array $selectedColumns
* @param string $categoryUid
* @param string $processUid
* @param string $textToSearch
* @param string $sort
* @param string $dir
2019-05-13 16:44:40 -04:00
*
2019-08-15 15:18:35 -04:00
* @return \Illuminate\Database\Query\Builder
2019-05-13 16:44:40 -04:00
*/
2020-11-04 15:40:01 -04:00
public static function getSelfServiceQuery(
$usrUid,
$count = false,
$selectedColumns = ['APP_DELEGATION.APP_NUMBER', 'APP_DELEGATION.DEL_INDEX'],
$categoryUid = null,
$processUid = null,
$textToSearch = null,
$sort = null,
$dir = null
) {
2019-12-24 15:14:24 -04:00
// Set the 'usrUid' property to preserve
Delegation::$usrUid = $usrUid;
// Get and build the groups parameter related to the user
$groups = GroupUser::getGroups($usrUid);
$groups = array_map(function ($value) {
return "'" . $value['GRP_ID'] . "'";
}, $groups);
// Add dummy value to avoid syntax error in complex join
$groups[] = "'-1'";
// Set the 'groups' property to preserve
Delegation::$groups = $groups;
2020-10-13 23:20:30 +00:00
// Add an extra column with alias if is needed to join with the previous delegation
if (array_search('APP_DELEGATION.DEL_PREVIOUS', $selectedColumns) !== false) {
$selectedColumns[] = 'ADP.USR_ID';
}
2019-12-24 15:14:24 -04:00
// Start the first query
2020-10-13 23:20:30 +00:00
$query1 = Delegation::query()->select($selectedColumns);
2019-12-24 15:14:24 -04:00
2020-10-13 23:20:30 +00:00
// Add join clause with the previous APP_DELEGATION record if required
if (array_search('APP_DELEGATION.DEL_PREVIOUS', $selectedColumns) !== false) {
2020-11-04 15:40:01 -04:00
$query1->join('APP_DELEGATION AS ADP', function ($join) {
2020-10-13 23:20:30 +00:00
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'ADP.APP_NUMBER');
$join->on('APP_DELEGATION.DEL_PREVIOUS', '=', 'ADP.DEL_INDEX');
});
}
2019-12-24 15:14:24 -04:00
2020-10-13 23:20:30 +00:00
// Add the join clause with TASK table
2019-12-24 15:14:24 -04:00
$query1->join('TASK', function ($join) {
// Build partial plain query for a complex Join, because Eloquent doesn't support this type of Join
$complexJoin = "
((`APP_DELEGATION`.`APP_NUMBER`, `APP_DELEGATION`.`DEL_INDEX`, `APP_DELEGATION`.`TAS_ID`) IN (
SELECT
`APP_ASSIGN_SELF_SERVICE_VALUE`.`APP_NUMBER`,
`APP_ASSIGN_SELF_SERVICE_VALUE`.`DEL_INDEX`,
`APP_ASSIGN_SELF_SERVICE_VALUE`.`TAS_ID`
FROM
`APP_ASSIGN_SELF_SERVICE_VALUE`
INNER JOIN `APP_ASSIGN_SELF_SERVICE_VALUE_GROUP` ON
`APP_ASSIGN_SELF_SERVICE_VALUE`.`ID` = `APP_ASSIGN_SELF_SERVICE_VALUE_GROUP`.`ID`
WHERE (
`APP_ASSIGN_SELF_SERVICE_VALUE_GROUP`.`GRP_UID` = '%s' OR (
`APP_ASSIGN_SELF_SERVICE_VALUE_GROUP`.`ASSIGNEE_ID` IN (%s) AND
`APP_ASSIGN_SELF_SERVICE_VALUE_GROUP`.`ASSIGNEE_TYPE` = '2')
)
))";
$groups = implode(',', Delegation::$groups);
$complexJoin = sprintf($complexJoin, Delegation::$usrUid, $groups);
// Add joins
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID');
$join->on('TASK.TAS_ASSIGN_TYPE', '=', DB::raw("'SELF_SERVICE'"));
$join->on('APP_DELEGATION.DEL_THREAD_STATUS', '=', DB::raw("'OPEN'"));
2020-11-04 15:40:01 -04:00
$join->on('APP_DELEGATION.USR_ID', '=', DB::raw("'0'"))->whereRaw($complexJoin);
2019-05-13 16:44:40 -04:00
});
2019-12-24 15:14:24 -04:00
2020-10-13 23:20:30 +00:00
// Add join clause with APPLICATION table if required
2020-12-07 09:21:51 -04:00
if (array_search('APP_DELEGATION.DEL_TITLE AS APP_TITLE', $selectedColumns) !== false || array_search('APPLICATION.APP_TITLE', $selectedColumns) !== false || !empty($textToSearch) || $sort == 'APP_TITLE') {
2020-10-13 23:20:30 +00:00
$query1->join('APPLICATION', function ($join) {
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'APPLICATION.APP_NUMBER');
});
}
// Add join clause with PROCESS table if required
if (array_search('PROCESS.PRO_TITLE', $selectedColumns) !== false || !empty($categoryUid) || !empty($processUid) || !empty($textToSearch) || $sort == 'PRO_TITLE') {
$query1->join('PROCESS', function ($join) use ($categoryUid, $processUid) {
$join->on('APP_DELEGATION.PRO_ID', '=', 'PROCESS.PRO_ID');
if (!empty($categoryUid)) {
$join->where('PROCESS.PRO_CATEGORY', $categoryUid);
}
if (!empty($processUid)) {
$join->where('PROCESS.PRO_UID', $processUid);
}
});
}
// Build where clause for the text to search
if (!empty($textToSearch)) {
2020-12-07 09:21:51 -04:00
$query1->where('APP_DELEGATION.DEL_TITLE', 'LIKE', "%$textToSearch%")
2020-10-13 23:20:30 +00:00
->orWhere('TASK.TAS_TITLE', 'LIKE', "%$textToSearch%")
->orWhere('PROCESS.PRO_TITLE', 'LIKE', "%$textToSearch%");
}
2020-01-31 16:10:56 -04:00
// Clean static properties
Delegation::$usrUid = '';
Delegation::$groups = [];
2019-12-24 15:14:24 -04:00
// Get self services tasks related to the user
$selfServiceTasks = TaskUser::getSelfServicePerUser($usrUid);
if (!empty($selfServiceTasks)) {
2020-03-10 09:14:17 -04:00
// Start the second query
2020-10-13 23:20:30 +00:00
$query2 = Delegation::query()->select($selectedColumns);
2019-12-24 15:14:24 -04:00
$query2->tasksIn($selfServiceTasks);
2020-03-10 09:14:17 -04:00
$query2->isThreadOpen();
2019-12-24 15:14:24 -04:00
$query2->noUserInThread();
2020-10-13 23:20:30 +00:00
// Add join clause with the previous APP_DELEGATION record if required
if (array_search('APP_DELEGATION.DEL_PREVIOUS', $selectedColumns) !== false) {
2020-11-04 15:40:01 -04:00
$query2->join('APP_DELEGATION AS ADP', function ($join) {
2020-10-13 23:20:30 +00:00
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'ADP.APP_NUMBER');
$join->on('APP_DELEGATION.DEL_PREVIOUS', '=', 'ADP.DEL_INDEX');
});
}
// Add the join clause with TASK table if required
if (array_search('TASK.TAS_TITLE', $selectedColumns) !== false || !empty($textToSearch) || $sort == 'TAS_TITLE') {
$query2->join('TASK', function ($join) {
$join->on('APP_DELEGATION.TAS_ID', '=', 'TASK.TAS_ID');
});
}
// Add join clause with APPLICATION table if required
2020-12-07 09:21:51 -04:00
if (array_search('APP_DELEGATION.DEL_TITLE AS APP_TITLE', $selectedColumns) !== false || !empty($textToSearch) || $sort == 'APP_TITLE') {
2020-10-13 23:20:30 +00:00
$query2->join('APPLICATION', function ($join) {
$join->on('APP_DELEGATION.APP_NUMBER', '=', 'APPLICATION.APP_NUMBER');
});
}
// Add join clause with PROCESS table if required
if (array_search('PROCESS.PRO_TITLE', $selectedColumns) !== false || !empty($categoryUid) || !empty($processUid) || !empty($textToSearch) || $sort == 'PRO_TITLE') {
$query2->join('PROCESS', function ($join) use ($categoryUid, $processUid) {
$join->on('APP_DELEGATION.PRO_ID', '=', 'PROCESS.PRO_ID');
if (!empty($categoryUid)) {
$join->where('PROCESS.PRO_CATEGORY', $categoryUid);
}
if (!empty($processUid)) {
$join->where('PROCESS.PRO_UID', $processUid);
}
});
}
// Build where clause for the text to search
if (!empty($textToSearch)) {
2020-12-07 09:21:51 -04:00
$query2->where('APP_DELEGATION.DEL_TITLE', 'LIKE', "%$textToSearch%")
2020-10-13 23:20:30 +00:00
->orWhere('TASK.TAS_TITLE', 'LIKE', "%$textToSearch%")
->orWhere('PROCESS.PRO_TITLE', 'LIKE', "%$textToSearch%");
}
2019-12-24 15:14:24 -04:00
// Build the complex query that uses "UNION DISTINCT" clause
2020-11-04 15:40:01 -04:00
$query = sprintf(
'select ' . ($count ? 'count(*) as aggregate' : '*') .
' from ((%s) union distinct (%s)) self_service_cases' . (!empty($sort) && !empty($dir) ? ' ORDER BY %s %s' : ''),
toSqlWithBindings($query1),
toSqlWithBindings($query2),
$sort,
$dir
);
2019-12-24 15:14:24 -04:00
2020-01-31 16:10:56 -04:00
return $query;
2019-05-13 16:44:40 -04:00
} else {
2020-10-13 23:20:30 +00:00
if (!empty($sort) && !empty($dir)) {
$query1->orderBy($sort, $dir);
}
2020-01-31 16:10:56 -04:00
return $query1;
2019-05-13 16:44:40 -04:00
}
2020-01-31 16:10:56 -04:00
}
2019-05-13 16:44:40 -04:00
2020-01-31 16:10:56 -04:00
/**
* Get the self-services cases by user
*
* @param string $usrUid
2020-10-13 23:20:30 +00:00
* @param array $selectedColumns
* @param string $categoryUid
* @param string $processUid
* @param string $textToSearch
* @param string $sort
* @param string $dir
* @param int $offset
* @param int $limit
2020-01-31 16:10:56 -04:00
* @return array
*/
2020-11-04 15:40:01 -04:00
public static function getSelfService(
$usrUid,
$selectedColumns = ['APP_DELEGATION.APP_NUMBER', 'APP_DELEGATION.DEL_INDEX'],
$categoryUid = null,
$processUid = null,
$textToSearch = null,
$sort = null,
$dir = null,
$offset = null,
$limit = null
) {
2020-01-31 16:10:56 -04:00
// Initializing the variable to return
$data = [];
// Get the query
2020-10-13 23:20:30 +00:00
$query = self::getSelfServiceQuery($usrUid, false, $selectedColumns, $categoryUid, $processUid, $textToSearch, $sort, $dir);
2020-01-31 16:10:56 -04:00
// Get data
if (!is_string($query)) {
2020-10-13 23:20:30 +00:00
// Set offset and limit if were sent
if (!is_null($offset) && !is_null($limit)) {
$query->offset($offset);
$query->limit($limit);
}
2020-01-31 16:10:56 -04:00
$items = $query->get();
$items->each(function ($item) use (&$data) {
2020-12-23 14:10:29 +00:00
$data[] = $item->toArray();
2020-01-31 16:10:56 -04:00
});
} else {
2020-10-13 23:20:30 +00:00
// Set offset and limit if were sent
if (!is_null($offset) && !is_null($limit)) {
$query .= " LIMIT {$offset}, {$limit}";
}
2020-01-31 16:10:56 -04:00
$items = DB::select($query);
foreach ($items as $item) {
$data[] = get_object_vars($item);
}
}
// Return data
return $data;
}
/**
* Count the self-services cases by user
*
* @param string $usrUid
2020-10-13 23:20:30 +00:00
* @param string $categoryUid
* @param string $processUid
* @param string $textToSearch
2020-01-31 16:10:56 -04:00
*
* @return integer
*/
2020-10-13 23:20:30 +00:00
public static function countSelfService($usrUid, $categoryUid = null, $processUid = null, $textToSearch = null)
2020-01-31 16:10:56 -04:00
{
// Get the query
2020-11-04 15:40:01 -04:00
$query = self::getSelfServiceQuery(
$usrUid,
true,
['APP_DELEGATION.APP_NUMBER', 'APP_DELEGATION.DEL_INDEX'],
$categoryUid,
$processUid,
$textToSearch
);
2020-01-31 16:10:56 -04:00
// Get count value
if (!is_string($query)) {
$count = $query->count();
} else {
$result = DB::selectOne($query);
$count = $result->aggregate;
}
// Return data
2019-12-24 15:14:24 -04:00
return $count;
2019-05-13 16:44:40 -04:00
}
2019-07-25 16:12:48 -04:00
/**
* This function get the current user related to the specific case and index
*
2020-11-25 18:11:22 -04:00
* @param int $appNumber, Case number
* @param int $index, Index to review
2019-07-25 16:12:48 -04:00
* @param string $status, The status of the thread
*
* @return string
*/
2020-11-25 18:11:22 -04:00
public static function getCurrentUser(int $appNumber, int $index, $status = 'OPEN')
2019-07-25 16:12:48 -04:00
{
$query = Delegation::query()->select('USR_UID');
$query->where('APP_NUMBER', $appNumber);
$query->where('DEL_INDEX', $index);
$query->where('DEL_THREAD_STATUS', $status);
$query->first();
$results = $query->get();
$userUid = '';
$results->each(function ($item, $key) use (&$userUid) {
$userUid = $item->USR_UID;
});
return $userUid;
}
/**
* Return the open thread related to the task
*
2020-11-25 18:11:22 -04:00
* @param int $appNumber, Case number
2019-07-25 16:12:48 -04:00
* @param string $tasUid, The task uid
*
* @return array
*/
2020-11-25 18:11:22 -04:00
public static function getOpenThreads(int $appNumber, string $tasUid)
2019-07-25 16:12:48 -04:00
{
$query = Delegation::query()->select();
$query->where('DEL_THREAD_STATUS', 'OPEN');
$query->where('DEL_FINISH_DATE', null);
$query->where('APP_NUMBER', $appNumber);
$query->where('TAS_UID', $tasUid);
$results = $query->get();
$arrayOpenThreads = [];
$results->each(function ($item, $key) use (&$arrayOpenThreads) {
$arrayOpenThreads = $item->toArray();
});
return $arrayOpenThreads;
}
2019-09-03 12:39:37 -04:00
/**
* Return if the user has participation in the case
*
* @param string $appUid, Case key
* @param string $userUid, User key
*
* @return boolean
*/
2020-11-25 18:11:22 -04:00
public static function participation(string $appUid, string $userUid)
2019-09-03 12:39:37 -04:00
{
$query = Delegation::query()->select();
$query->where('APP_UID', $appUid);
$query->where('USR_UID', $userUid);
$query->limit(1);
return ($query->count() > 0);
}
2020-10-02 12:53:58 -04:00
2020-11-19 17:21:05 -04:00
/**
* Return the task related to the thread
*
* @param int $appNumber
* @param int $index
*
* @return array
*/
public static function getThreadInfo(int $appNumber, int $index)
{
$query = Delegation::query()->select(['APP_NUMBER', 'TAS_UID', 'TAS_ID', 'DEL_PREVIOUS', 'DEL_TITLE']);
$query->where('APP_NUMBER', $appNumber);
$query->where('DEL_INDEX', $index);
$query->limit(1);
$result = $query->get()->toArray();
return head($result);
}
2020-10-02 12:53:58 -04:00
/**
* Return the thread related to the specific task-index
*
* @param string $appUid
* @param string $delIndex
* @param string $tasUid
* @param string $taskType
*
* @return array
*/
public static function getDatesFromThread(string $appUid, string $delIndex, string $tasUid, string $taskType)
{
$query = Delegation::query()->select([
'DEL_INIT_DATE',
'DEL_DELEGATE_DATE',
'DEL_FINISH_DATE',
'DEL_RISK_DATE',
'DEL_TASK_DUE_DATE'
]);
$query->where('APP_UID', $appUid);
$query->where('DEL_INDEX', $delIndex);
$query->where('TAS_UID', $tasUid);
$results = $query->get();
$thread = [];
$results->each(function ($item, $key) use (&$thread, $taskType) {
$thread = $item->toArray();
if (in_array($taskType, Task::$typesRunAutomatically)) {
$startDate = $thread['DEL_DELEGATE_DATE'];
} else {
$startDate = $thread['DEL_INIT_DATE'];
}
$endDate = $thread['DEL_FINISH_DATE'];
// Calculate the task-thread duration
if (!empty($startDate) && !empty($endDate)) {
$initDate = new DateTime($startDate);
$finishDate = new DateTime($endDate);
$diff = $initDate->diff($finishDate);
$format = ' %a ' . G::LoadTranslation('ID_DAY_DAYS');
2020-11-04 15:40:01 -04:00
$format .= ' %H ' . G::LoadTranslation('ID_HOUR_ABBREVIATE');
$format .= ' %I ' . G::LoadTranslation('ID_MINUTE_ABBREVIATE');
$format .= ' %S ' . G::LoadTranslation('ID_SECOND_ABBREVIATE');
2020-10-02 12:53:58 -04:00
$thread['DEL_THREAD_DURATION'] = $diff->format($format);
}
});
return $thread;
}
2020-11-25 18:11:22 -04:00
/**
* Return the open thread related to the task
*
* @param int $appNumber
*
* @return array
*/
public static function getPendingThreads(int $appNumber)
{
$query = Delegation::query()->select([
'TASK.TAS_TITLE',
2021-01-19 18:05:16 -04:00
'TASK.TAS_ASSIGN_TYPE',
2020-11-25 18:11:22 -04:00
'APP_DELEGATION.USR_ID',
'APP_DELEGATION.DEL_TASK_DUE_DATE'
]);
// Join with task
$query->joinTask();
// Get the open threads
$query->threadOpen();
// Related to the specific case number
$query->case($appNumber);
// Get the results
$results = $query->get()->values()->toArray();
return $results;
}
2020-12-09 12:26:20 -04:00
2021-02-09 12:14:08 -04:00
/**
* Return the last thread created
*
* @param int $appNumber
*
* @return array
*/
public static function getLastThread(int $appNumber)
{
$query = Delegation::query()->select([
'TASK.TAS_TITLE',
'TASK.TAS_ASSIGN_TYPE',
'APP_DELEGATION.USR_ID',
'APP_DELEGATION.DEL_TASK_DUE_DATE'
]);
// Join with task
$query->joinTask();
// Get the last thread created
$query->lastThread();
// Related to the specific case number
$query->case($appNumber);
// Get the results
$results = $query->get()->values()->toArray();
return $results;
}
2020-11-19 17:21:05 -04:00
/**
* Get the thread title related to the delegation
*
* @param string $tasUid
* @param int $appNumber
* @param int $delIndexPrevious
* @param array $caseData
*
* @return string
*/
public static function getThreadTitle(string $tasUid, int $appNumber, int $delIndexPrevious, $caseData = [])
{
2020-12-23 18:24:32 -04:00
$cases = new Cases;
if (!is_array($caseData)) {
$r = $cases->unserializeData($caseData);
if($r !== false) {
$caseData = $r;
}
}
2020-11-19 17:21:05 -04:00
// Get task title defined
$task = new Task();
$taskTitle = $task->taskCaseTitle($tasUid);
// If exist we will to replace the variables data
if (!empty($taskTitle)) {
$threadTitle = G::replaceDataField($taskTitle, $caseData, 'mysql', false);
} else {
// If is empty get the previous title
if ($delIndexPrevious > 0) {
$thread = self::getThreadInfo($appNumber, $delIndexPrevious);
2020-12-22 16:47:51 -04:00
if(empty($thread['DEL_TITLE'])) {
$threadTitle = '# '. $appNumber;
} else {
$threadTitle = $thread['DEL_TITLE'];
}
2020-11-19 17:21:05 -04:00
} else {
$threadTitle = '# '. $appNumber;
}
}
return $threadTitle;
}
2020-12-07 09:21:51 -04:00
/**
* Get the DEL_TITLE related to DELEGATION table
*
* @param int $appNumber
* @param int $delIndex
* @return string
*/
public static function getDeltitle($appNumber, $delIndex)
{
$query = Delegation::select(['DEL_TITLE'])->where('APP_NUMBER', $appNumber)->where('DEL_INDEX', $delIndex);
$res = $query->first();
return $res->DEL_TITLE;
}
2020-12-09 15:56:40 -04:00
/**
* Return the pending task related to the appNumber
*
* @param int $appNumber
*
* @return array
*/
public static function getPendingTask(int $appNumber)
{
$query = Delegation::query()->select([
'TASK.TAS_TITLE', // Task
2021-01-19 18:05:16 -04:00
'TASK.TAS_ASSIGN_TYPE', // Task assign rule
2020-12-09 15:56:40 -04:00
'APP_DELEGATION.DEL_TITLE', // Thread title
'APP_DELEGATION.DEL_THREAD_STATUS', // Thread status
'APP_DELEGATION.USR_ID', // Current UserId
'USERS.USR_USERNAME', // Current UserName
'USERS.USR_FIRSTNAME', // Current User FirstName
'USERS.USR_LASTNAME', // Current User LastName
'APP_DELEGATION.DEL_TASK_DUE_DATE', // Due Date
2020-12-18 12:27:28 -04:00
// Additional column for other functionalities
2020-12-09 15:56:40 -04:00
'APP_DELEGATION.APP_UID', // Case Uid for Open case
'APP_DELEGATION.DEL_INDEX', // Del Index for Open case
2020-12-18 12:27:28 -04:00
'APP_DELEGATION.PRO_UID', // Process Uid for Case notes
'APP_DELEGATION.TAS_UID', // Task Uid for Case notes
2020-12-09 15:56:40 -04:00
]);
// Join with task
$query->joinTask();
// Join with task
$query->joinUser();
// Get the open threads
$query->threadOpen();
// Related to the specific case number
$query->case($appNumber);
// Get the results
$results = $query->get();
$results->transform(function ($item) {
$abs = new AbstractCases();
$item['TAS_COLOR'] = $abs->getTaskColor($item['DEL_TASK_DUE_DATE']);
$item['TAS_COLOR_LABEL'] = AbstractCases::TASK_COLORS[$item['TAS_COLOR']];
2021-01-19 18:05:16 -04:00
$item['UNASSIGNED'] = ($item['TAS_ASSIGN_TYPE'] === 'SELF_SERVICE' ? true : false);
2020-12-09 15:56:40 -04:00
return $item;
});
return $results;
}
}