'boolean', 'effective_date' => 'date', 'expiry_date' => 'date', 'tags' => 'array', ]; // Status constants untuk kejelasan const STATUS_DRAFT = 'draft'; const STATUS_PROCESSING = 'processing'; const STATUS_ACTIVE = 'active'; const STATUS_INACTIVE = 'inactive'; const STATUS_FAILED = 'failed'; // === Relationships === public function category(): BelongsTo { return $this->belongsTo(Category::class); } public function versions(): HasMany { return $this->hasMany(DocumentVersion::class)->orderBy('version_number'); } public function currentVersion(): HasOne { return $this->hasOne(DocumentVersion::class)->where('is_current', true); } public function chunks(): HasMany { return $this->hasMany(DocumentChunk::class); } public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function updater(): BelongsTo { return $this->belongsTo(User::class, 'updated_by'); } // === Scopes === public function scopeActive(Builder $query): Builder { return $query->where('is_active', true)->where('status', self::STATUS_ACTIVE); } public function scopeByCategory(Builder $query, int $categoryId): Builder { return $query->where('category_id', $categoryId); } // === Helpers === public function getLatestVersionNumber(): int { return $this->versions()->max('version_number') ?? 0; } public function isProcessing(): bool { return $this->status === self::STATUS_PROCESSING; } }