'array', 'clips_data' => 'array', 'progress' => 'integer', 'cost_usd' => 'decimal:4', ]; protected static function booted(): void { static::addGlobalScope(new TenantScope); } public function user() { return $this->belongsTo(\App\Models\User::class); } /** * 상태 상수 */ const STATUS_PENDING = 'pending'; const STATUS_TITLES_GENERATED = 'titles_generated'; const STATUS_SCENARIO_READY = 'scenario_ready'; const STATUS_GENERATING_TTS = 'generating_tts'; const STATUS_GENERATING_CLIPS = 'generating_clips'; const STATUS_GENERATING_BGM = 'generating_bgm'; const STATUS_ASSEMBLING = 'assembling'; const STATUS_COMPLETED = 'completed'; const STATUS_FAILED = 'failed'; /** * 진행 상태 업데이트 헬퍼 */ public function updateProgress(string $status, int $progress, string $step): void { $this->update([ 'status' => $status, 'progress' => $progress, 'current_step' => $step, ]); } /** * 실패 처리 */ public function markFailed(string $errorMessage): void { $this->update([ 'status' => self::STATUS_FAILED, 'error_message' => $errorMessage, ]); } }