'integer', 'file_expiry_date' => 'datetime', 'created_at' => 'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', ]; public const STATUS_PENDING = 'PENDING'; public const STATUS_PROCESSING = 'PROCESSING'; public const STATUS_COMPLETED = 'COMPLETED'; public const STATUS_FAILED = 'FAILED'; public function user(): BelongsTo { return $this->belongsTo(User::class); } public function getFormattedDurationAttribute(): string { if (! $this->duration_seconds) { return '00:00'; } $minutes = floor($this->duration_seconds / 60); $seconds = $this->duration_seconds % 60; return sprintf('%02d:%02d', $minutes, $seconds); } public function getStatusLabelAttribute(): string { return match ($this->status) { self::STATUS_PENDING => '대기중', self::STATUS_PROCESSING => '처리중', self::STATUS_COMPLETED => '완료', self::STATUS_FAILED => '실패', default => $this->status, }; } public function getStatusColorAttribute(): string { return match ($this->status) { self::STATUS_PENDING => 'badge-warning', self::STATUS_PROCESSING => 'badge-info', self::STATUS_COMPLETED => 'badge-success', self::STATUS_FAILED => 'badge-error', default => 'badge-ghost', }; } public function isCompleted(): bool { return $this->status === self::STATUS_COMPLETED; } public function isProcessing(): bool { return $this->status === self::STATUS_PROCESSING; } }