181 lines
4.6 KiB
PHP
181 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Modules\ManagementTools\Entities;
|
|
|
|
use App\User;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class MtUserTask extends Model
|
|
{
|
|
public const SOURCE_SYSTEM = 'system';
|
|
|
|
public const SOURCE_USER = 'user';
|
|
|
|
public const APPROVAL_PENDING = 'pending';
|
|
|
|
public const APPROVAL_APPROVED = 'approved';
|
|
|
|
public const APPROVAL_REJECTED = 'rejected';
|
|
|
|
protected $table = 'mt_user_tasks';
|
|
|
|
protected $guarded = ['id'];
|
|
|
|
protected $casts = [
|
|
'due_date' => 'date',
|
|
'approved_at' => 'datetime',
|
|
];
|
|
|
|
public function user()
|
|
{
|
|
return $this->belongsTo(User::class);
|
|
}
|
|
|
|
public function scopeForBusiness($query, $business_id)
|
|
{
|
|
return $query->where('business_id', $business_id);
|
|
}
|
|
|
|
public function scopeActive($query)
|
|
{
|
|
return $query->where('task_status', 0);
|
|
}
|
|
|
|
public function scopeAssignable($query)
|
|
{
|
|
return $query->where(function ($q) {
|
|
$q->where('task_source', self::SOURCE_SYSTEM)
|
|
->orWhere('approval_status', self::APPROVAL_APPROVED);
|
|
});
|
|
}
|
|
|
|
public function scopeSystemTasks($query)
|
|
{
|
|
return $query->where('task_source', self::SOURCE_SYSTEM);
|
|
}
|
|
|
|
public function scopeUserSubmitted($query)
|
|
{
|
|
return $query->where('task_source', self::SOURCE_USER);
|
|
}
|
|
|
|
public function scopePendingApproval($query)
|
|
{
|
|
return $query->userSubmitted()->where('approval_status', self::APPROVAL_PENDING);
|
|
}
|
|
|
|
public function creator()
|
|
{
|
|
return $this->belongsTo(User::class, 'created_by');
|
|
}
|
|
|
|
public function approver()
|
|
{
|
|
return $this->belongsTo(User::class, 'approved_by');
|
|
}
|
|
|
|
public function timeLines()
|
|
{
|
|
return $this->hasMany(MtUserTimeLine::class, 'user_task_id');
|
|
}
|
|
|
|
public function dailyReports()
|
|
{
|
|
return $this->hasMany(MtDailyReport::class, 'mt_user_task_id');
|
|
}
|
|
|
|
public function ppProject()
|
|
{
|
|
return $this->belongsTo(\Modules\ProfessionalProject\Entities\PpProject::class, 'project_id');
|
|
}
|
|
|
|
public function isSystemTask(): bool
|
|
{
|
|
return $this->task_source === self::SOURCE_SYSTEM;
|
|
}
|
|
|
|
public function isUserSubmitted(): bool
|
|
{
|
|
return $this->task_source === self::SOURCE_USER;
|
|
}
|
|
|
|
public function isPendingApproval(): bool
|
|
{
|
|
return $this->isUserSubmitted() && $this->approval_status === self::APPROVAL_PENDING;
|
|
}
|
|
|
|
public function isAssignable(): bool
|
|
{
|
|
return $this->isSystemTask() || $this->approval_status === self::APPROVAL_APPROVED;
|
|
}
|
|
|
|
public static function statusLabels(): array
|
|
{
|
|
return [
|
|
0 => __('managementtools::lang.task_status_active'),
|
|
1 => __('managementtools::lang.task_status_completed'),
|
|
2 => __('managementtools::lang.task_status_cancelled'),
|
|
];
|
|
}
|
|
|
|
public static function sourceLabels(): array
|
|
{
|
|
return [
|
|
self::SOURCE_SYSTEM => __('managementtools::lang.task_source_system'),
|
|
self::SOURCE_USER => __('managementtools::lang.task_source_user'),
|
|
];
|
|
}
|
|
|
|
public static function approvalLabels(): array
|
|
{
|
|
return [
|
|
self::APPROVAL_PENDING => __('managementtools::lang.approval_pending'),
|
|
self::APPROVAL_APPROVED => __('managementtools::lang.approval_approved'),
|
|
self::APPROVAL_REJECTED => __('managementtools::lang.approval_rejected'),
|
|
];
|
|
}
|
|
|
|
public function statusLabel(): string
|
|
{
|
|
return self::statusLabels()[$this->task_status] ?? '—';
|
|
}
|
|
|
|
public function sourceLabel(): string
|
|
{
|
|
return self::sourceLabels()[$this->task_source] ?? '—';
|
|
}
|
|
|
|
public function approvalLabel(): ?string
|
|
{
|
|
if ($this->isSystemTask()) {
|
|
return null;
|
|
}
|
|
|
|
return self::approvalLabels()[$this->approval_status] ?? '—';
|
|
}
|
|
|
|
public function sourceBadgeHtml(): string
|
|
{
|
|
if ($this->isSystemTask()) {
|
|
return '<span class="label label-primary">'.e($this->sourceLabel()).'</span>';
|
|
}
|
|
|
|
return '<span class="label label-warning">'.e($this->sourceLabel()).'</span>';
|
|
}
|
|
|
|
public function approvalBadgeHtml(): string
|
|
{
|
|
if ($this->isSystemTask()) {
|
|
return '<span class="text-muted">—</span>';
|
|
}
|
|
|
|
$class = match ($this->approval_status) {
|
|
self::APPROVAL_APPROVED => 'label-success',
|
|
self::APPROVAL_REJECTED => 'label-danger',
|
|
default => 'label-warning',
|
|
};
|
|
|
|
return '<span class="label '.$class.'">'.e($this->approvalLabel()).'</span>';
|
|
}
|
|
}
|