first commit

This commit is contained in:
Saufi
2026-06-24 20:32:14 +08:00
commit 10fb30ad69
201 changed files with 21356 additions and 0 deletions

152
app/Models/Submission.php Normal file
View File

@@ -0,0 +1,152 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Activitylog\Support\LogOptions;
use Spatie\Activitylog\Models\Concerns\LogsActivity;
class Submission extends Model
{
use HasFactory, SoftDeletes, LogsActivity;
public const STATUSES = [
'draf' => 'Draf',
'baru' => 'Baru',
'dalam_tindakan' => 'Dalam Tindakan',
'pembetulan_perunding' => 'Pembetulan Perunding',
'selesai' => 'Selesai',
];
protected $fillable = [
'data_centre_id',
'reporting_cycle_id',
'consultant_id',
'checklist_template_id',
'status',
'is_locked',
'locked_by',
'locked_at',
'lock_reason',
'assigned_officer_id',
'hardcopy_received',
'hardcopy_received_date',
'hardcopy_sent_date',
'submitted_at',
'submitted_by',
'review_notes',
];
protected function casts(): array
{
return [
'is_locked' => 'boolean',
'locked_at' => 'datetime',
'hardcopy_received' => 'boolean',
'hardcopy_received_date' => 'date',
'hardcopy_sent_date' => 'date',
'submitted_at' => 'datetime',
];
}
public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->logOnly(['status', 'is_locked', 'assigned_officer_id', 'hardcopy_received', 'hardcopy_sent_date'])
->logOnlyDirty()
->dontLogEmptyChanges()
->useLogName('serahan');
}
public function dataCentre(): BelongsTo
{
return $this->belongsTo(DataCentre::class);
}
public function reportingCycle(): BelongsTo
{
return $this->belongsTo(ReportingCycle::class);
}
public function consultant(): BelongsTo
{
return $this->belongsTo(Consultant::class);
}
public function checklistTemplate(): BelongsTo
{
return $this->belongsTo(ChecklistTemplate::class);
}
public function assignedOfficer(): BelongsTo
{
return $this->belongsTo(User::class, 'assigned_officer_id');
}
public function answers(): HasMany
{
return $this->hasMany(SubmissionAnswer::class);
}
public function results(): HasMany
{
return $this->hasMany(SubmissionResult::class);
}
public function documents(): HasMany
{
return $this->hasMany(SubmissionDocument::class)->orderByDesc('version');
}
public function activeDocument(): HasOne
{
return $this->hasOne(SubmissionDocument::class)->where('is_active', true);
}
public function statusHistories(): HasMany
{
return $this->hasMany(SubmissionStatusHistory::class)->latest();
}
public function correctionRequests(): HasMany
{
return $this->hasMany(SubmissionCorrectionRequest::class)->latest();
}
public function comments(): HasMany
{
return $this->hasMany(SubmissionComment::class)->oldest();
}
/** Perunding boleh edit selagi belum dikunci dan belum selesai. */
public function isEditableByConsultant(): bool
{
return ! $this->is_locked && $this->status !== 'selesai';
}
public function isSubmitted(): bool
{
return ! in_array($this->status, ['draf'], true);
}
public function statusLabel(): string
{
return self::STATUSES[$this->status] ?? $this->status;
}
public function statusBadgeClass(): string
{
return [
'draf' => 'secondary',
'baru' => 'info',
'dalam_tindakan' => 'primary',
'pembetulan_perunding' => 'warning',
'selesai' => 'success',
][$this->status] ?? 'secondary';
}
}