*/ protected $casts = [ 'purpose' => FormPurpose::class, 'submission_mode' => FormSubmissionMode::class, 'snapshot_mode' => FormSchemaSnapshotMode::class, 'is_published' => 'bool', 'freeze_on_submit' => 'bool', 'section_level_submit' => 'bool', 'auto_save_enabled' => 'bool', 'settings' => 'array', 'submission_deadline' => 'datetime', 'public_token_rotated_at' => 'datetime', 'edit_lock_expires_at' => 'datetime', 'version' => 'int', 'retention_days' => 'int', 'max_submissions' => 'int', ]; public function organisation(): BelongsTo { return $this->belongsTo(Organisation::class); } public function owner(): MorphTo { return $this->morphTo(); } public function fields(): HasMany { return $this->hasMany(FormField::class); } public function sections(): HasMany { return $this->hasMany(FormSchemaSection::class); } public function submissions(): HasMany { return $this->hasMany(FormSubmission::class); } public function webhooks(): HasMany { return $this->hasMany(FormSchemaWebhook::class); } public function createdBy(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } public function lastUpdatedBy(): BelongsTo { return $this->belongsTo(User::class, 'last_updated_by_user_id'); } public function editLockUser(): BelongsTo { return $this->belongsTo(User::class, 'edit_lock_user_id'); } /** * Nuanced activity log (ARCH §17.1; S1 Phase 4b). Callers choose which * events are worth logging — e.g. created/deleted/restored, published * toggled, purpose changed, freeze_on_submit toggled, retention_days * changed, consent_version changed, public_token rotated, snapshot_mode * changed. NOT logged (noise): name/description/slug, settings, locale. * * Bulk-fixture suppression: the activitylog.enabled config key is the * kill-switch. Seeders and one-shot commands wrap themselves in * App\Support\ActivityLog::suppressed(...). activity()->log() becomes * a silent no-op while disabled, so no guard is needed here. * * @param array $properties */ public function logSchemaChange(string $event, array $properties = []): void { activity() ->performedOn($this) ->withProperties($properties) ->log($event); } }