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