2019-04-25 13:47:21 -07:00
< ? php
2019-04-25 13:54:39 -07:00
namespace ProcessMaker\Model ;
2019-04-25 13:47:21 -07:00
2020-10-02 12:53:58 -04:00
use DateTime ;
2019-04-25 15:32:23 -07:00
use G ;
2019-04-25 17:28:15 -07:00
use Illuminate\Database\Eloquent\Model ;
2019-04-25 18:02:32 -07:00
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 ;
2019-04-25 13:47:21 -07:00
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' ];
2019-04-25 13:47:21 -07:00
protected $table = " APP_DELEGATION " ;
2019-04-25 14:15:41 -07:00
// We don't have our standard timestamp columns
2019-04-25 15:32:23 -07:00
public $timestamps = false ;
2019-04-25 14:15:41 -07:00
2019-12-24 15:14:24 -04:00
// Static properties to preserve values
public static $usrUid = '' ;
public static $groups = [];
2019-04-25 13:47:21 -07:00
/**
* 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' );
}
2019-04-25 15:32:23 -07:00
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
}
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
}
2019-04-25 15:32:23 -07: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
*
2019-05-01 13:49:05 -07:00
* @ param integer $userId The USR_ID to search for ( Note , this is no longer the USR_UID )
2019-04-25 15:32:23 -07:00
* @ 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 (
2019-05-01 13:49:05 -07:00
$userId = null ,
// Default pagination values
$start = 0 ,
$limit = 25 ,
2019-04-25 15:32:23 -07:00
$search = null ,
$process = null ,
$status = null ,
$dir = null ,
$sort = null ,
$category = null ,
$dateFrom = null ,
$dateTo = null ,
$filterBy = 'APP_TITLE'
2019-04-25 17:28:15 -07:00
) {
2019-04-25 16:10:12 -07:00
$search = trim ( $search );
2019-04-25 18:02:32 -07:00
// 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' ,
2019-04-25 18:02:32 -07:00
'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 )));
2019-04-25 15:32:23 -07:00
2019-04-25 15:58:26 -07:00
// 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
2019-04-25 17:28:15 -07:00
$query -> join ( 'TASK' , function ( $join ) use ( $filterBy , $search ) {
2019-04-25 15:58:26 -07:00
$join -> on ( 'APP_DELEGATION.TAS_ID' , '=' , 'TASK.TAS_ID' )
-> whereNotIn ( 'TASK.TAS_TYPE' , [
'WEBENTRYEVENT' ,
'END-MESSAGE-EVENT' ,
'START-MESSAGE-EVENT' ,
2019-04-25 17:28:15 -07:00
'INTERMEDIATE-THROW' ,
2019-04-25 15:58:26 -07:00
]);
2019-04-25 17:28:15 -07:00
if ( $filterBy == 'TAS_TITLE' && $search ) {
2019-04-25 15:58:26 -07:00
$join -> where ( 'TASK.TAS_TITLE' , 'LIKE' , " % ${ search } % " );
}
});
2019-04-25 17:28:15 -07:00
// 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' );
2019-04-25 17:28:15 -07:00
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
}
2019-04-25 17:28:15 -07: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
}
});
2019-04-25 16:50:52 -07:00
// 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' ) {
2019-04-25 17:28:15 -07:00
$query -> join ( 'PROCESS' , function ( $join ) use ( $category ) {
2019-04-25 16:50:52 -07:00
$join -> on ( 'APP_DELEGATION.PRO_ID' , '=' , 'PROCESS.PRO_ID' );
2019-04-25 17:28:15 -07:00
if ( $category ) {
2019-04-25 16:50:52 -07:00
$join -> where ( 'PROCESS.PRO_CATEGORY' , $category );
}
});
}
// Add join for user, but only for certain scenarios as sorting
2019-04-25 17:28:15 -07:00
if ( $sort == 'APP_CURRENT_USER' ) {
2019-05-01 13:49:05 -07:00
$query -> join ( 'USERS' , function ( $join ) use ( $userId ) {
2019-04-25 16:50:52 -07:00
$join -> on ( 'APP_DELEGATION.USR_ID' , '=' , 'USERS.USR_ID' );
});
}
// Search for specified user
2019-05-01 13:49:05 -07:00
if ( $userId ) {
$query -> where ( 'APP_DELEGATION.USR_ID' , $userId );
2019-04-25 16:50:52 -07:00
}
// Search for specified process
2019-04-25 17:28:15 -07:00
if ( $process ) {
2019-04-25 16:50:52 -07:00
$query -> where ( 'APP_DELEGATION.PRO_ID' , $process );
}
// Search for an app/case number
2019-04-25 17:28:15 -07:00
if ( $filterBy == 'APP_NUMBER' && $search ) {
2019-07-12 15:46:00 -04:00
$query -> where ( 'APP_DELEGATION.APP_NUMBER' , '=' , $search );
2019-04-25 16:10:12 -07:00
}
2019-04-25 16:50:52 -07:00
// 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 );
}
2019-04-25 17:28:15 -07:00
// 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 ;
}
2019-04-25 16:50:52 -07:00
2019-04-25 16:10:12 -07:00
// Add any sort if needed
2019-06-11 07:51:19 -04:00
if ( $sort ) {
2019-05-01 13:49:05 -07:00
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 );
}
2019-04-25 16:10:12 -07:00
}
2019-04-25 15:32:23 -07:00
// Add pagination to the query
$query = $query -> offset ( $start )
-> limit ( $limit );
// Fetch results and transform to a laravel collection
2019-04-25 18:02:32 -07:00
$results = $query -> get ();
2019-04-25 15:32:23 -07:00
// Transform with additional data
2019-04-25 17:28:15 -07:00
$priorities = [ '1' => 'VL' , '2' => 'L' , '3' => 'N' , '4' => 'H' , '5' => 'VH' ];
$results -> transform ( function ( $item , $key ) use ( $priorities ) {
2019-04-25 18:02:32 -07:00
// Convert to an array as our results must be an array
$item = json_decode ( json_encode ( $item ), true );
2019-05-02 14:06:55 -07:00
// If it's assigned, fetch the user
2019-06-11 07:51:19 -04:00
if ( $item [ 'USR_ID' ]) {
2019-05-02 14:06:55 -07:00
$user = User :: where ( 'USR_ID' , $item [ 'USR_ID' ]) -> first ();
2019-06-11 07:51:19 -04:00
} else {
2019-05-02 14:06:55 -07:00
$user = null ;
2019-04-25 15:32:23 -07:00
}
2019-05-02 14:06:55 -07:00
$process = Process :: where ( 'PRO_ID' , $item [ 'PRO_ID' ]) -> first ();
2019-04-25 17:28:15 -07:00
2019-04-25 15:32:23 -07:00
// Rewrite priority string
2019-04-25 17:28:15 -07:00
if ( $item [ 'DEL_PRIORITY' ]) {
2019-05-07 12:32:34 -04:00
$item [ 'DEL_PRIORITY' ] = G :: LoadTranslation ( " ID_PRIORITY_ { $priorities [ $item [ 'DEL_PRIORITY' ]] } " );
2019-04-25 15:32:23 -07:00
}
// Merge in desired application data
2019-04-25 17:28:15 -07:00
if ( $item [ 'APP_STATUS' ]) {
2019-05-07 12:32:34 -04:00
$item [ 'APP_STATUS_LABEL' ] = G :: LoadTranslation ( " ID_ ${ item['APP_STATUS'] } " );
2019-04-25 15:32:23 -07:00
} else {
2019-05-07 12:32:34 -04:00
$item [ 'APP_STATUS_LABEL' ] = $item [ 'APP_STATUS' ];
2019-04-25 15:32:23 -07:00
}
// Merge in desired process data
2019-05-02 14:06:55 -07:00
// Handle situation where the process might not be in the system anymore
$item [ 'APP_PRO_TITLE' ] = $process ? $process -> PRO_TITLE : '' ;
2019-04-25 15:32:23 -07:00
// Merge in desired user data
2019-05-02 14:06:55 -07:00
$item [ 'USR_LASTNAME' ] = $user ? $user -> USR_LASTNAME : '' ;
$item [ 'USR_FIRSTNAME' ] = $user ? $user -> USR_FIRSTNAME : '' ;
$item [ 'USR_USERNAME' ] = $user ? $user -> USR_USERNAME : '' ;
2019-04-25 15:32:23 -07:00
//@todo: this section needs to use 'User Name Display Format', currently in the extJs is defined this
2019-04-25 17:28:15 -07:00
$item [ " APP_CURRENT_USER " ] = $item [ " USR_LASTNAME " ] . ' ' . $item [ " USR_FIRSTNAME " ];
2019-04-25 15:32:23 -07:00
$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 ,
2019-04-25 16:10:12 -07:00
'sql' => $query -> toSql (),
2019-04-25 16:50:52 -07:00
'bindings' => $query -> getBindings (),
2019-05-02 10:53:43 -04:00
'data' => $results -> values () -> toArray (),
2019-04-25 15:32:23 -07:00
];
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 ) {
$data [] = get_object_vars ( $item );
});
} 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' ,
'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
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 = [])
{
// 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 );
$threadTitle = $thread [ 'DEL_TITLE' ];
} 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
'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' ]];
return $item ;
});
return $results ;
}
2019-04-25 13:47:21 -07:00
}