diff --git a/app/Console/Commands/Services/Tasks/Alarm/AlarmSettings.php b/app/Console/Commands/Services/Tasks/Alarm/AlarmSettings.php index 64a74b30..00a432d9 100644 --- a/app/Console/Commands/Services/Tasks/Alarm/AlarmSettings.php +++ b/app/Console/Commands/Services/Tasks/Alarm/AlarmSettings.php @@ -11,7 +11,7 @@ class AlarmSettings $res = AlarmSetting::where('sport_id', $sport_id) ->where('client_bookmaker_id', $client_bookmaker_id) ->where('disabled', 0) - ->select('multiline_setting_id', 'level_id', 'alarm_threshold') + ->select('multiline_setting_id', 'alarm_level_id', 'alarm_threshold') ->get(); $arr = []; diff --git a/app/Console/Commands/Services/Tasks/GenerateSetting.php b/app/Console/Commands/Services/Tasks/GenerateSetting.php index e2eafabc..1e84771f 100644 --- a/app/Console/Commands/Services/Tasks/GenerateSetting.php +++ b/app/Console/Commands/Services/Tasks/GenerateSetting.php @@ -3,6 +3,7 @@ namespace App\Console\Commands\Services\Tasks; use App\Console\Commands\Nuh; +use App\Models\AlarmLevel; use App\Models\AlarmSetting; use App\Models\BettypeUser; use App\Models\Bookmaker; @@ -25,6 +26,11 @@ class GenerateSetting Notice::note('GENERATE DEFAULT SETTING', 'b'); } + $clients = Client::get(); + $users = User::get(); + $alarm_levels = AlarmLevel::get(); + $sports = Sport::getActiveSports(); + /************************************************** * 1) ALARM BOOKMAKER **************************************************/ @@ -33,10 +39,6 @@ class GenerateSetting Notice::note('1) ALARM BOOKMAKER', 'p'); } - $alarm_thresholds = [1 => 0.01, 2 => 0.2, 3 => 0.3]; - - $clients = Client::get(); - foreach ($clients as $client) { foreach ($client->sport as $sport_id) { @@ -47,11 +49,11 @@ class GenerateSetting foreach ($multilines as $multiline_id) { - foreach ($alarm_thresholds as $level_id => $alarm_threshold) { + foreach ($alarm_levels as $alarm_level) { AlarmSetting::firstOrCreate( - ['client_bookmaker_id' => $client_bookmaker_id, 'sport_id' => $sport_id, 'multiline_setting_id' => $multiline_id, 'level_id' => $level_id], - ['name' => "LEVEL $level_id", 'alarm_threshold' => $alarm_threshold] + ['client_bookmaker_id' => $client_bookmaker_id, 'sport_id' => $sport_id, 'multiline_setting_id' => $multiline_id, 'alarm_level_id' => $alarm_level->id], + ['alarm_threshold' => $alarm_level->default_threshold] ); } } @@ -69,8 +71,6 @@ class GenerateSetting $bookmaker_slots = [1 => 6, 2 => 30, 3 => 649, 4 => 126]; - $clients = Client::get(); - foreach ($clients as $client) { foreach ($client->sport as $sport_id) { @@ -101,8 +101,6 @@ class GenerateSetting Notice::note('3) GENERATOR BETTYPES IM COMPARATORE FOR USERS', 'p'); } - $users = User::get(); - foreach ($users as $user) { $multilines = MultilineSetting::orderBy('sport_id')->pluck('sport_id', 'id'); @@ -126,13 +124,11 @@ class GenerateSetting Notice::note('4) COMPARING BOOKMAKER', 'p'); } - $res = Client::get(); - $bookmakers_soccer = Bookmaker::where('in_soccer', 1)->orderBy('name')->pluck('id')->toArray(); ComparingBookmaker::where('method_id', 1)->where('sport_id', 1)->whereNotIn('bookmaker_id', $bookmakers_soccer)->delete(); - foreach ($res as $client) { + foreach ($clients as $client) { $client_bookmakers = $client->bookmaker; @@ -159,7 +155,7 @@ class GenerateSetting ComparingBookmaker::where('method_id', 1)->whereIn('sport_id', $sports)->whereNotIn('bookmaker_id', $bookmakers_other)->delete(); - foreach ($res as $client) { + foreach ($clients as $client) { $client_bookmakers = $client->bookmaker; @@ -195,16 +191,16 @@ class GenerateSetting $sports = Client::find($user->client_id)->value('sport'); } foreach ($sports as $sport_id) { - foreach ([2, 3] as $alarm_level_id) { + foreach ($alarm_levels as $alarm_level) { PersonalNotification::firstOrCreate( - ['sport_id' => $sport_id, 'user_id' => $user->id, 'bookmaker_id' => $user->bookmaker_id, 'alarm_level_id' => $alarm_level_id], + ['sport_id' => $sport_id, 'user_id' => $user->id, 'bookmaker_id' => $user->bookmaker_id, 'alarm_level_id' => $alarm_level->id], ['notify_by_system' => 0, 'notify_by_email' => 0] ); if ($user->partner_bookmaker_id) { PersonalNotification::firstOrCreate( - ['sport_id' => $sport_id, 'user_id' => $user->id, 'bookmaker_id' => $user->partner_bookmaker_id, 'alarm_level_id' => $alarm_level_id], + ['sport_id' => $sport_id, 'user_id' => $user->id, 'bookmaker_id' => $user->partner_bookmaker_id, 'alarm_level_id' => $alarm_level->id], ['notify_by_system' => 0, 'notify_by_email' => 0] ); } diff --git a/app/Filament/Tables/Columns/BookmakerIcon.php b/app/Filament/Tables/Columns/BookmakerIcon.php index f48fc3ed..3c6e898b 100644 --- a/app/Filament/Tables/Columns/BookmakerIcon.php +++ b/app/Filament/Tables/Columns/BookmakerIcon.php @@ -23,9 +23,9 @@ class BookmakerIcon extends Column case 'xl': return 'h-6 w-30'; case 'lg': - return 'h-5 w-20'; + return 'h-5 w-24'; default: - return 'h-4 w-16'; + return 'h-4 w-18'; } } } diff --git a/app/Livewire/AlarmBookmaker.php b/app/Livewire/AlarmBookmaker.php index c91b2c5f..2ad95324 100644 --- a/app/Livewire/AlarmBookmaker.php +++ b/app/Livewire/AlarmBookmaker.php @@ -9,6 +9,7 @@ use Filament\Actions\Contracts\HasActions; use Filament\Forms\Components\Radio; use Filament\Schemas\Concerns\InteractsWithSchemas; use Filament\Schemas\Contracts\HasSchemas; +use Filament\Support\Enums\FontWeight; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextInputColumn; @@ -56,19 +57,15 @@ class AlarmBookmaker extends Component implements HasActions, HasSchemas, HasTab // ->icon(function ($record): string { // return $record->sport->icon; // }) - // ->color(fn ($record): string => match ($record->level_id) { + // ->color(fn ($record): string => match ($record->alarm_level_id) { // 1 => 'success', // 2 => 'warning', // 3 => 'danger', // }), // TextColumn::make('sport.name'), - TextColumn::make('name') - ->badge() - ->color(fn ($record): string => match ($record->level_id) { - 1 => 'info', - 2 => 'warning', - 3 => 'danger', - }), + TextColumn::make('alarm_level.name') + ->color(fn ($record) => $record->alarm_level->color) + ->weight(FontWeight::Black), TextInputColumn::make('alarm_threshold') ->tooltip('Between 0.01 - 2.00') ->width('2rem') @@ -77,7 +74,7 @@ class AlarmBookmaker extends Component implements HasActions, HasSchemas, HasTab TextColumn::make('multiline_setting.name')->label('Bettype'), ToggleColumn::make('disabled'), ]) - ->defaultSort('level_id') + ->defaultSort('alarm_level_id') ->deferFilters(false) ->filters([ Filter::make('multiline_setting_id') diff --git a/app/Livewire/PersonalNotificationTable.php b/app/Livewire/PersonalNotificationTable.php index 89f989fa..8d9cf384 100644 --- a/app/Livewire/PersonalNotificationTable.php +++ b/app/Livewire/PersonalNotificationTable.php @@ -3,15 +3,22 @@ namespace App\Livewire; use App\Filament\Tables\Columns\BookmakerIcon; +use App\Models\Bookmaker; use App\Models\PersonalNotification; +use App\Models\Sport; +use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; use Filament\Schemas\Concerns\InteractsWithSchemas; use Filament\Schemas\Contracts\HasSchemas; +use Filament\Support\Enums\FontWeight; +use Filament\Support\Enums\IconSize; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; +use Filament\Tables\Enums\FiltersLayout; +use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Table; use Illuminate\Contracts\View\View; use Livewire\Component; @@ -26,13 +33,59 @@ class PersonalNotificationTable extends Component implements HasActions, HasSche { return $table ->query(PersonalNotification::query()->with('bookmaker')->where('user_id', auth()->user()->id)) + ->description('Send a notification when favorit enters an alarm level.') + ->striped() ->columns([ - IconColumn::make('sport.icon') - ->label('') - ->icon(fn ($record) => $record->sport->icon) - ->tooltip(fn ($record) => $record->id), - TextColumn::make('sport.name'), - BookmakerIcon::make('bookmaker.icon')->label('Icon')->size('lg'), + // TextColumn::make('sport.name'), + BookmakerIcon::make('bookmaker.icon') + ->label('Bookmaker')->size('lg'), + // IconColumn::make('sport.icon') + // ->label('') + // ->color(fn ($record) => $record->sport->color) + // ->icon(fn ($record) => $record->sport->icon) + // ->size(IconSize::ExtraLarge), + TextColumn::make('alarm_level.name') + ->color(fn ($record) => $record->alarm_level->color) + ->weight(FontWeight::Black) + ->extraCellAttributes(['class' => 'alarm-level-style']), + ]) + ->defaultSort('alarm_level_id', 'desc') + ->deferFilters(false) + ->deferFilters(false) + ->filters([ + SelectFilter::make('bookmaker_id') + ->label('Bookmaker') + ->visible(fn () => auth()->user()->partner_bookmaker_id) + ->default(auth()->user()->bookmaker->id) + ->selectablePlaceholder(false) + ->options(Bookmaker::options([auth()->user()->partner_bookmaker_id, auth()->user()->bookmaker_id])) + ->preload(), + SelectFilter::make('sport_id') + ->label('Sport') + ->default(1) + ->selectablePlaceholder(false) + ->options(Sport::getSportForClient(auth()->user()->client_id)) + ->preload(), + ], FiltersLayout::AboveContent) + ->filtersFormColumns(3) + ->hiddenFilterIndicators() + ->recordActions([ + Action::make('notify_by_system') + ->button() + ->label('Send Notification') + ->color(fn ($record) => $record->notify_by_system ? 'primary' : 'gray') + ->icon('phosphor-bell-duotone') + ->action(function ($record) { + PersonalNotification::where('id', $record->id)->update(['notify_by_system' => ! $record->notify_by_system]); + }), + Action::make('notify_by_email') + ->label('Send E-Mail') + ->button() + ->color(fn ($record) => $record->notify_by_email ? 'primary' : 'gray') + ->icon('phosphor-envelope-duotone') + ->action(function ($record) { + PersonalNotification::where('id', $record->id)->update(['notify_by_email' => ! $record->notify_by_email]); + }), ]); } diff --git a/app/Models/AlarmSetting.php b/app/Models/AlarmSetting.php index 8389a79e..ac5ef354 100644 --- a/app/Models/AlarmSetting.php +++ b/app/Models/AlarmSetting.php @@ -11,8 +11,7 @@ class AlarmSetting extends Model 'sport_id', 'disabled', 'multiline_setting_id', - 'name', - 'level_id', + 'alarm_level_id', 'alarm_threshold', ]; @@ -25,4 +24,9 @@ class AlarmSetting extends Model { return $this->belongsTo(Sport::class); } + + public function alarm_level() + { + return $this->belongsTo(AlarmLevel::class); + } } diff --git a/app/Models/Bookmaker.php b/app/Models/Bookmaker.php index 1d6f1744..11136714 100644 --- a/app/Models/Bookmaker.php +++ b/app/Models/Bookmaker.php @@ -23,6 +23,11 @@ class Bookmaker extends Model return $this->belongsTo(Sport::class)->where('is_active', 1); } + public static function options($arr = []) + { + return Bookmaker::query()->whereIn('id', $arr)->pluck('name', 'id'); + } + public static function map() { $arr = []; diff --git a/app/Models/PersonalNotification.php b/app/Models/PersonalNotification.php index 6c2a9ef5..190a2283 100644 --- a/app/Models/PersonalNotification.php +++ b/app/Models/PersonalNotification.php @@ -24,4 +24,9 @@ class PersonalNotification extends Model { return $this->belongsTo(Bookmaker::class); } + + public function alarm_level() + { + return $this->belongsTo(AlarmLevel::class); + } } diff --git a/app/Models/Sport.php b/app/Models/Sport.php index 447c3c4a..c7046f1e 100644 --- a/app/Models/Sport.php +++ b/app/Models/Sport.php @@ -33,9 +33,9 @@ class Sport extends Model return Sport::query()->where('is_active', 1)->pluck('id')->toArray(); } - public static function getSportForClient() + public static function getSportForClient($client_id) { - $sports = Client::where('id', auth()->user()->client_id)->value('sport'); + $sports = Client::where('id', $client_id)->value('sport'); return Sport::query()->whereIn('id', $sports)->pluck('name', 'id'); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 2041bda3..769f90e5 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -54,6 +54,12 @@ class AppServiceProvider extends ServiceProvider Carbon::setLocale(app()->getLocale()); FilamentColor::register([ + 'primary' => Color::Gray, + 'danger' => Color::Red, + 'gray' => Color::Zinc, + 'info' => Color::Blue, + 'success' => Color::Green, + 'warning' => Color::Orange, 'home' => Color::Sky, 'away' => Color::Lime, ]); diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index d80d9d03..7dfff724 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -17,7 +17,6 @@ use Filament\Http\Middleware\DispatchServingFilamentEvent; use Filament\Pages\Dashboard; use Filament\Panel; use Filament\PanelProvider; -use Filament\Support\Colors\Color; use Filament\Support\Enums\Width; use Filament\Widgets\AccountWidget; use Filament\Widgets\FilamentInfoWidget; @@ -49,9 +48,6 @@ class AdminPanelProvider extends PanelProvider // ->databaseNotificationsPolling('15s') default is 30 ->profile(isSimple: false) ->default() - ->colors([ - 'primary' => Color::Gray, - ]) ->globalSearch(false) ->globalSearchKeyBindings(['command+k', 'ctrl+k']) ->brandLogo(asset('images/nuh-odds.svg')) diff --git a/composer.lock b/composer.lock index bcf1344a..da3fc360 100644 --- a/composer.lock +++ b/composer.lock @@ -12983,12 +12983,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.3" }, - "platform-dev": [], - "plugin-api-version": "2.6.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/database/migrations/2026_01_26_121301_create_alarm_settings_table.php b/database/migrations/2026_01_26_121301_create_alarm_settings_table.php index b4b3b4f2..482e65a6 100644 --- a/database/migrations/2026_01_26_121301_create_alarm_settings_table.php +++ b/database/migrations/2026_01_26_121301_create_alarm_settings_table.php @@ -17,8 +17,7 @@ return new class extends Migration $table->integer('sport_id')->index()->references('id')->on('sports'); $table->boolean('disabled')->default(0); $table->integer('multiline_setting_id')->default(1)->references('id')->on('multiline_settings'); - $table->string('name')->nullable(); - $table->integer('level_id')->default(0); + $table->integer('alarm_level_id')->default(0); $table->decimal('alarm_threshold', 3, 2)->default(0); $table->timestamps(); }); diff --git a/resources/css/filament/admin/theme.css b/resources/css/filament/admin/theme.css index f5dfbb25..104b0af3 100644 --- a/resources/css/filament/admin/theme.css +++ b/resources/css/filament/admin/theme.css @@ -35,6 +35,9 @@ button[wire\:click="resetTableFiltersForm"] { background-color: rgba(43, 127, 255, 0.1); } +.alarm-level-style { + @apply bg-gray-600/5; +} /* .fi-ta-header-toolbar { @apply flex-row-reverse;