diff --git a/app/Cron/Nightly/RecalculateStats.php b/app/Cron/Nightly/RecalculateStats.php new file mode 100644 index 00000000..71947836 --- /dev/null +++ b/app/Cron/Nightly/RecalculateStats.php @@ -0,0 +1,49 @@ +userRepo = $userRepo; + $this->userSvc = $userService; + } + + /** + * Recalculate the stats for active users + * @param CronNightly $event + * @throws \UnexpectedValueException + * @throws \InvalidArgumentException + */ + public function handle(CronNightly $event): void + { + Log::info('Recalculating balances'); + + $w = [ + ['state', '!=', UserState::REJECTED] + ]; + + $users = $this->userRepo->findWhere($w, ['id', 'name', 'airline_id']); + foreach ($users as $user) { + $this->userSvc->recalculateStats($user); + } + + Log::info('Done recalculating stats'); + } +} diff --git a/app/Providers/CronServiceProvider.php b/app/Providers/CronServiceProvider.php new file mode 100644 index 00000000..f686afa5 --- /dev/null +++ b/app/Providers/CronServiceProvider.php @@ -0,0 +1,36 @@ + [ + ApplyExpenses::class, + RecalculateBalances::class, + PilotLeave::class, + SetActiveFlights::class, + RecalculateStats::class, + ], + + CronWeekly::class => [ + ], + + CronMonthly::class => [ + \App\Cron\Monthly\ApplyExpenses::class + ], + ]; + + protected $subscribe = []; +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 5be19e72..7f6f5750 100755 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,16 +2,9 @@ namespace App\Providers; -use App\Cron\Nightly\SetActiveFlights; -use App\Events\CronMonthly; -use App\Events\CronNightly; -use App\Events\CronWeekly; use App\Events\Expenses; use App\Events\UserStatsChanged; use App\Listeners\AwardListener; -use App\Cron\Nightly\ApplyExpenses; -use App\Cron\Nightly\PilotLeave; -use App\Cron\Nightly\RecalculateBalances; use App\Listeners\ExpenseListener; use App\Listeners\FinanceEvents; use App\Listeners\NotificationEvents; @@ -20,26 +13,10 @@ use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvi class EventServiceProvider extends ServiceProvider { protected $listen = [ - - Expenses::class => [ + Expenses::class => [ ExpenseListener::class ], - # Cron hooks - CronNightly::class => [ - ApplyExpenses::class, - RecalculateBalances::class, - PilotLeave::class, - SetActiveFlights::class, - ], - - CronWeekly::class => [ - ], - - CronMonthly::class => [ - \App\Cron\Monthly\ApplyExpenses::class - ], - UserStatsChanged::class => [ AwardListener::class, ], diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 502ab35f..6a952572 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -6,7 +6,9 @@ use App\Events\UserRegistered; use App\Events\UserStateChanged; use App\Events\UserStatsChanged; use App\Interfaces\Service; +use App\Models\Enums\PirepState; use App\Models\Enums\UserState; +use App\Models\Pirep; use App\Models\Rank; use App\Models\Role; use App\Models\User; @@ -236,6 +238,21 @@ class UserService extends Service */ public function recalculateStats(User $user): User { + # Recalc their hours + $w = [ + 'user_id' => $user->id, + 'state' => PirepState::ACCEPTED, + ]; + + $flight_time = Pirep::where($w)->sum('flight_time'); + $user->flight_time = $flight_time; + + # Recalc the rank + $this->calculatePilotRank($user); + + Log::info('User '.$user->ident.' updated; rank='.$user->rank->name.'; flight_time='.$user->flight_time.' minutes'); + + $user->save(); return $user; } } diff --git a/config/app.php b/config/app.php index 4718aeb3..6b496b9a 100755 --- a/config/app.php +++ b/config/app.php @@ -84,6 +84,7 @@ return [ * Application Service Providers... */ App\Providers\AppServiceProvider::class, + App\Providers\CronServiceProvider::class, App\Providers\BroadcastServiceProvider::class, App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class,