From 004e87e6b51b8af0a6bca4eff3171e7b6f6b230a Mon Sep 17 00:00:00 2001 From: salam Date: Fri, 6 Feb 2026 15:49:18 +0100 Subject: [PATCH] alarm messages --- .../Services/Tasks/Notification/CheckSend.php | 24 ++++ .../Tasks/Notification/LoadAlarmEvents.php | 40 +++++++ .../Services/Tasks/Notification/StoreSend.php | 20 ++++ .../Commands/Services/Tasks/NotifyAlarms.php | 111 +++++++++++++++++- .../Supervisors/Tables/SupervisorsTable.php | 5 +- app/Livewire/UserNotifications.php | 16 --- app/Mail/AlarmNotification.php | 62 ++++++++++ app/Models/OddsName.php | 15 +++ app/Models/OddsTable.php | 51 ++++++++ app/Models/PersonalNotificationSend.php | 10 +- ...eate_personal_notification_sends_table.php | 3 + ...6_02_06_135749_create_odds_names_table.php | 31 +++++ database/seeders/DatabaseSeeder.php | 1 + database/seeders/OddsNameSeeder.php | 52 ++++++++ database/seeders/SupervisorSeeder.php | 5 +- resources/views/mail/user/alarm.blade.php | 34 ++++++ 16 files changed, 452 insertions(+), 28 deletions(-) create mode 100644 app/Console/Commands/Services/Tasks/Notification/CheckSend.php create mode 100644 app/Console/Commands/Services/Tasks/Notification/LoadAlarmEvents.php create mode 100644 app/Console/Commands/Services/Tasks/Notification/StoreSend.php create mode 100644 app/Mail/AlarmNotification.php create mode 100644 app/Models/OddsName.php create mode 100644 database/migrations/2026_02_06_135749_create_odds_names_table.php create mode 100644 database/seeders/OddsNameSeeder.php create mode 100644 resources/views/mail/user/alarm.blade.php diff --git a/app/Console/Commands/Services/Tasks/Notification/CheckSend.php b/app/Console/Commands/Services/Tasks/Notification/CheckSend.php new file mode 100644 index 00000000..0fec46bd --- /dev/null +++ b/app/Console/Commands/Services/Tasks/Notification/CheckSend.php @@ -0,0 +1,24 @@ +where('user_id', $user_id) + ->where('bookmaker_id', $bookmaker_id) + ->where('alarm_level_id', $alarm_level_id) + ->where('fieldname', $fieldname) + ->where($sendtype, 1) + ->first(); + if (! $res) { + return false; + } + + return $res->id; + } +} diff --git a/app/Console/Commands/Services/Tasks/Notification/LoadAlarmEvents.php b/app/Console/Commands/Services/Tasks/Notification/LoadAlarmEvents.php new file mode 100644 index 00000000..6ef87100 --- /dev/null +++ b/app/Console/Commands/Services/Tasks/Notification/LoadAlarmEvents.php @@ -0,0 +1,40 @@ +orwhere('notify_by_email', 1)->orderby('bookmaker_id')->get(); + + $alarms = []; + + foreach ($users as $user) { + + $events = EventBookmaker::where('bookmaker_id', $user->bookmaker_id)->get(); + + foreach ($events as $event) { + + foreach ($map[$user->sport_id] as $field) { + if ($event[$field] == $user->alarm_level_id) { + if ($user->notify_by_system) { + $alarms[$event->event_id][$user->user_id][$user->bookmaker_id]['system'][$field] = $event[$field]; + } + if ($user->notify_by_email) { + $alarms[$event->event_id][$user->user_id][$user->bookmaker_id]['mail'][$field] = $event[$field]; + } + } + } + } + } + + return $alarms; + } +} diff --git a/app/Console/Commands/Services/Tasks/Notification/StoreSend.php b/app/Console/Commands/Services/Tasks/Notification/StoreSend.php new file mode 100644 index 00000000..c678f186 --- /dev/null +++ b/app/Console/Commands/Services/Tasks/Notification/StoreSend.php @@ -0,0 +1,20 @@ + $event_id, + 'user_id' => $user_id, + 'bookmaker_id' => $bookmaker_id, + 'alarm_level_id' => $alarm_level_id, + 'fieldname' => $fieldname, + $sendtype => 1, + ]); + } +} diff --git a/app/Console/Commands/Services/Tasks/NotifyAlarms.php b/app/Console/Commands/Services/Tasks/NotifyAlarms.php index 16e9a895..90f1e93f 100644 --- a/app/Console/Commands/Services/Tasks/NotifyAlarms.php +++ b/app/Console/Commands/Services/Tasks/NotifyAlarms.php @@ -3,8 +3,19 @@ namespace App\Console\Commands\Services\Tasks; use App\Console\Commands\Nuh; +use App\Console\Commands\Services\Tasks\Notification\CheckSend; +use App\Console\Commands\Services\Tasks\Notification\LoadAlarmEvents; +use App\Console\Commands\Services\Tasks\Notification\StoreSend; +use App\Mail\AlarmNotification; +use App\Models\Bookmaker; +use App\Models\Event; +use App\Models\OddsName; +use App\Models\PersonalNotificationSend; use App\Models\User; use App\Utilities\Notice; +use Filament\Notifications\Notification; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Mail; class NotifyAlarms { @@ -16,13 +27,101 @@ class NotifyAlarms Notice::note('Notify Alarms', 'b'); } - /** - * USER - */ - $users = User::all(); + $stored_alarms = []; - foreach ($users as $user) { - dd($user); + $alarms = LoadAlarmEvents::load(); + + foreach ($alarms as $event_id => $alarm) { + + $event = Event::with('competition_group')->with('home')->with('away')->find($event_id); + + foreach ($alarm as $user_id => $alarm_user) { + + $user = User::find($user_id); + + foreach ($alarm_user as $bookmaker_id => $alarm_user_bookmaker) { + + $bookmaker = Bookmaker::find($bookmaker_id); + + foreach ($alarm_user_bookmaker as $mode => $alarm_user_bookmaker_mode) { + + foreach ($alarm_user_bookmaker_mode as $fieldname => $alarm_level_id) { + + $bet = OddsName::where('alarm', $fieldname)->select('table', 'bettype', 'name')->first()->toArray(); + + $quote = DB::table($bet['table'])->where('event_id', $event_id)->where('bookmaker_id', $bookmaker_id)->value($bet['name']); + + switch ($mode) { + case 'mail': + + $send = CheckSend::check($event_id, $user_id, $bookmaker_id, $alarm_level_id, $fieldname, 'notify_by_email'); + + if (! $send) { + $send = StoreSend::store($event_id, $user_id, $bookmaker_id, $alarm_level_id, $fieldname, 'notify_by_mail'); + + $message = 'ALARM LEVEL '.$alarm_level_id; + $table = [ + ['key' => 'League', 'value' => $event->competition_group->name], + ['key' => 'Event', 'value' => $event->home.' vs '.$event->away], + ['key' => 'Startime', 'value' => $event->starttime], + ['key' => 'Bookmaker', 'value' => $bookmaker->name], + ['key' => 'Bettype', 'value' => $bet['bettype']], + ['key' => 'Odd Name', 'value' => strtoupper($bet['name'])], + ['key' => 'Value', 'value' => $quote], + ]; + + Mail::to($user) + ->send(new AlarmNotification($message, $table)); + + } + $stored_alarms[] = $send; + + break; + case 'system': + + $send = CheckSend::check($event_id, $user_id, $bookmaker_id, $alarm_level_id, $fieldname, 'notify_by_system'); + + if (! $send) { + + $send = StoreSend::store($event_id, $user_id, $bookmaker_id, $alarm_level_id, $fieldname, 'notify_by_system'); + + switch ($alarm_level_id) { + case 1: + $title = '
ALARM LEVEL '.$alarm_level_id.'
'; + break; + case 2: + $title = '
ALARM LEVEL '.$alarm_level_id.'
'; + break; + default: + $title = '
ALARM LEVEL '.$alarm_level_id.'
'; + break; + } + $message = '
'; + $message .= '
League
'.$event->competition_group->name.'
'; + $message .= '
Event
'.$event->home->name.' vs '.$event->away->name.'
'; + $message .= '
Startime
'.$event->starttime.'
'; + $message .= '
Bookmaker
'.$bookmaker->name.'
'; + $message .= '
Bettype
'.$bet['bettype'].'
'; + $message .= '
Odd Name
'.$bet['name'].'
'; + $message .= '
Value
'.$quote.'
'; + + Notification::make() + ->title($title) + ->icon('phosphor-envelope-duotone') + ->body($message) + ->sendToDatabase($user); + + break; + } + $stored_alarms[] = $send; + } + } + } + } + } + } + if ($stored_alarms) { + PersonalNotificationSend::whereNotIn('id', $stored_alarms)->delete(); } } } diff --git a/app/Filament/Resources/Supervisors/Tables/SupervisorsTable.php b/app/Filament/Resources/Supervisors/Tables/SupervisorsTable.php index b6a901a6..1e953125 100644 --- a/app/Filament/Resources/Supervisors/Tables/SupervisorsTable.php +++ b/app/Filament/Resources/Supervisors/Tables/SupervisorsTable.php @@ -114,11 +114,11 @@ class SupervisorsTable Stack::make([ TextInputColumn::make('days_from')->prefix('Days Fr') ->hidden(function (ListSupervisors $livewire) { - return $livewire->tableFilters['provider_id']['value'] == 8; + return in_array($livewire->tableFilters['provider_id']['value'], [7, 8]); }), TextInputColumn::make('days_to')->prefix('Days To') ->hidden(function (ListSupervisors $livewire) { - return $livewire->tableFilters['provider_id']['value'] == 8; + return in_array($livewire->tableFilters['provider_id']['value'], [7, 8]); }), ])->space(3), Stack::make([ @@ -149,7 +149,6 @@ class SupervisorsTable ->relationship('provider', 'name') ->label('Provider'), SelectFilter::make('sport_id') - ->default(1) ->relationship('sport', 'name') ->label('Sport'), TernaryFilter::make('is_supervisor')->label('Run by supervisor'), diff --git a/app/Livewire/UserNotifications.php b/app/Livewire/UserNotifications.php index a6ac126b..02a91a14 100644 --- a/app/Livewire/UserNotifications.php +++ b/app/Livewire/UserNotifications.php @@ -3,7 +3,6 @@ namespace App\Livewire; use App\Mail\UserNotification; -use App\Models\PersonalNotification; use App\Models\User; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; @@ -14,7 +13,6 @@ use Filament\Notifications\Notification; use Filament\Schemas\Concerns\InteractsWithSchemas; use Filament\Schemas\Contracts\HasSchemas; use Filament\Support\Enums\Width; -use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Concerns\InteractsWithTable; use Filament\Tables\Contracts\HasTable; @@ -78,20 +76,6 @@ class UserNotifications extends Component implements HasActions, HasSchemas, Has ]); } - public function table2(Table $table): Table - { - return $table - ->query(PersonalNotification::query()->where('user_id', auth()->user()->id)) - ->columns([ - IconColumn::make('sport.icon') - ->label('') - ->icon(fn ($record) => $record->sport->icon) - ->tooltip(fn ($record) => $record->id) - ->visibleFrom('lg'), - ]); - - } - public function render(): View { return view('livewire.user-notifications'); diff --git a/app/Mail/AlarmNotification.php b/app/Mail/AlarmNotification.php new file mode 100644 index 00000000..a38c74fa --- /dev/null +++ b/app/Mail/AlarmNotification.php @@ -0,0 +1,62 @@ +message = $message; + + $this->table = $table; + } + + /** + * Get the message envelope. + */ + public function envelope(): Envelope + { + return new Envelope( + subject: 'NUH-Odds Alarm', + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + markdown: 'mail.user.alarm', + with: [ + 'table' => $this->table, + 'message' => $this->message, + ], + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Models/OddsName.php b/app/Models/OddsName.php new file mode 100644 index 00000000..7d2803eb --- /dev/null +++ b/app/Models/OddsName.php @@ -0,0 +1,15 @@ +oddnames); + // $fields = explode(',', $value->fieldnames); + // $base = []; + // $base['table'] = $value->name; + // $base['bettype'] = $value->fulltitle; + // $tmp = array_combine($fields, $names); + // foreach ($tmp as $alarm => $name) { + // $base['name'] = $name; + // $base['alarm'] = $alarm; + // $arr[] = $base; + // } + // } + // return $arr; + // } + public static function oddnames() { $res = OddsTable::get(); @@ -20,6 +40,37 @@ class OddsTable extends Model return $arr; } + public static function alarm_fieldnames_by_sport() + { + $arr = []; + $arr[1] = []; + $arr[2] = []; + $arr[3] = []; + $arr[5] = []; + + $res = OddsTable::get(); + foreach ($res as $value) { + $fields = explode(',', $value->fieldnames); + + $selectfields = implode("'", $fields); + + if ($value->soccer == 1) { + $arr[1] = array_merge($arr[1], $fields); + } + if ($value->icehockey == 1) { + $arr[2] = array_merge($arr[2], $fields); + } + if ($value->basketball == 1) { + $arr[3] = array_merge($arr[3], $fields); + } + if ($value->tennis == 1) { + $arr[5] = array_merge($arr[5], $fields); + } + } + + return $arr; + } + public static function fields() { $res = OddsTable::get(); diff --git a/app/Models/PersonalNotificationSend.php b/app/Models/PersonalNotificationSend.php index 7f8e9e05..2b72750c 100644 --- a/app/Models/PersonalNotificationSend.php +++ b/app/Models/PersonalNotificationSend.php @@ -6,5 +6,13 @@ use Illuminate\Database\Eloquent\Model; class PersonalNotificationSend extends Model { - // + protected $fillable = [ + 'event_id', + 'user_id', + 'bookmaker_id', + 'alarm_level_id', + 'fieldname', + 'notify_by_system', + 'notify_by_email', + ]; } diff --git a/database/migrations/2026_02_05_172318_create_personal_notification_sends_table.php b/database/migrations/2026_02_05_172318_create_personal_notification_sends_table.php index 3be1f530..942256af 100644 --- a/database/migrations/2026_02_05_172318_create_personal_notification_sends_table.php +++ b/database/migrations/2026_02_05_172318_create_personal_notification_sends_table.php @@ -17,6 +17,9 @@ return new class extends Migration $table->integer('user_id')->index()->references('id')->on('users'); $table->integer('bookmaker_id')->index()->references('id')->on('bookmakers'); $table->integer('alarm_level_id')->default(0); + $table->string('fieldname'); + $table->boolean('notify_by_system')->default(0); + $table->boolean('notify_by_email')->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2026_02_06_135749_create_odds_names_table.php b/database/migrations/2026_02_06_135749_create_odds_names_table.php new file mode 100644 index 00000000..43d61627 --- /dev/null +++ b/database/migrations/2026_02_06_135749_create_odds_names_table.php @@ -0,0 +1,31 @@ +id(); + $table->string('name'); + $table->string('alarm'); + $table->string('table'); + $table->string('bettype'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('odds_names'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 00d5036d..0fda56dc 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -25,6 +25,7 @@ class DatabaseSeeder extends Seeder CountryItalianSeeder::class, OddsTableSeeder::class, AlarmLevelSeeder::class, + OddsNameSeeder::class, ]); } } diff --git a/database/seeders/OddsNameSeeder.php b/database/seeders/OddsNameSeeder.php new file mode 100644 index 00000000..bb5aacbd --- /dev/null +++ b/database/seeders/OddsNameSeeder.php @@ -0,0 +1,52 @@ + + +Message from NUH-Odds Alarm Monitoring +

+{{ $message }} + + + +{{ $table[0]['key'] }} +${{ $table[0]['value'] }} + +{{ $table[1]['key'] }} +${{ $table[1]['value'] }} + +{{ $table[2]['key'] }} +${{ $table[2]['value'] }} + +{{ $table[3]['key'] }} +${{ $table[3]['value'] }} + +{{ $table[4]['key'] }} +${{ $table[4]['value'] }} + +{{ $table[5]['key'] }} +${{ $table[5]['value'] }} + +{{ $table[6]['key'] }} +${{ $table[6]['value'] }} + + + +Thanks,
+Alarm Monitoring Team + \ No newline at end of file