'array', 'reclamation_settings' => 'array', 'schedule_settings' => 'array', ]; } public function user(): BelongsTo { return $this->belongsTo(User::class); } public static function defaultsForUser(int $userId): array { return [ 'user_id' => $userId, 'order_settings' => [], 'reclamation_settings' => [], 'schedule_settings' => [], ]; } /** * Проверяет, включены ли уведомления хотя бы для одного статуса/источника в секции. * Секция считается активной если есть хотя бы один true-канал. */ public function isSectionEnabled(string $settingsKey): bool { $settings = $this->{$settingsKey}; if (!is_array($settings) || empty($settings)) { return false; } foreach ($settings as $channels) { if (is_array($channels) && array_filter($channels)) { return true; } } return false; } /** * Возвращает включённые каналы для конкретного статуса/источника. * @return array ['browser' => true, 'push' => false, 'email' => true] */ public function getChannelsForKey(string $settingsKey, int|string $key): array { $settings = $this->{$settingsKey}; if (!is_array($settings) || !isset($settings[$key])) { return []; } return array_filter($settings[$key]); } /** * Проверяет, включён ли хотя бы один канал для конкретного статуса/источника. */ public function hasEnabledChannelForKey(string $settingsKey, int|string $key): bool { return !empty($this->getChannelsForKey($settingsKey, $key)); } }