UserNotificationSetting.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Factories\HasFactory;
  4. use Illuminate\Database\Eloquent\Model;
  5. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  6. class UserNotificationSetting extends Model
  7. {
  8. use HasFactory;
  9. protected $fillable = [
  10. 'user_id',
  11. 'order_settings',
  12. 'reclamation_settings',
  13. 'schedule_settings',
  14. 'production_order_settings',
  15. 'chat_settings',
  16. ];
  17. protected function casts(): array
  18. {
  19. return [
  20. 'order_settings' => 'array',
  21. 'reclamation_settings' => 'array',
  22. 'schedule_settings' => 'array',
  23. 'production_order_settings' => 'array',
  24. 'chat_settings' => 'array',
  25. ];
  26. }
  27. public function user(): BelongsTo
  28. {
  29. return $this->belongsTo(User::class);
  30. }
  31. public static function defaultsForUser(int $userId): array
  32. {
  33. return [
  34. 'user_id' => $userId,
  35. 'order_settings' => [],
  36. 'reclamation_settings' => [],
  37. 'schedule_settings' => [],
  38. 'production_order_settings' => [],
  39. 'chat_settings' => [],
  40. ];
  41. }
  42. /**
  43. * Проверяет, включены ли уведомления хотя бы для одного статуса/источника в секции.
  44. * Секция считается активной если есть хотя бы один true-канал.
  45. */
  46. public function isSectionEnabled(string $settingsKey): bool
  47. {
  48. $settings = $this->{$settingsKey};
  49. if (!is_array($settings) || empty($settings)) {
  50. return false;
  51. }
  52. foreach ($settings as $channels) {
  53. if (is_array($channels) && array_filter($channels)) {
  54. return true;
  55. }
  56. }
  57. return false;
  58. }
  59. /**
  60. * Возвращает включённые каналы для конкретного статуса/источника.
  61. * @return array<string, bool> ['browser' => true, 'push' => false, 'email' => true]
  62. */
  63. public function getChannelsForKey(string $settingsKey, int|string $key): array
  64. {
  65. $settings = $this->{$settingsKey};
  66. if (!is_array($settings) || !isset($settings[$key])) {
  67. return [];
  68. }
  69. return array_filter($settings[$key]);
  70. }
  71. /**
  72. * Проверяет, включён ли хотя бы один канал для конкретного статуса/источника.
  73. */
  74. public function hasEnabledChannelForKey(string $settingsKey, int|string $key): bool
  75. {
  76. return !empty($this->getChannelsForKey($settingsKey, $key));
  77. }
  78. }