ultimatepos/Modules/ManagementTools/Entities/MtUserTask.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>';
}
}