diff --git a/app/Http/Controllers/UserProfileController.php b/app/Http/Controllers/UserProfileController.php index c55c5bc..78cfb1d 100644 --- a/app/Http/Controllers/UserProfileController.php +++ b/app/Http/Controllers/UserProfileController.php @@ -171,6 +171,11 @@ class UserProfileController extends Controller default => null, }; + $majorAlliances = match($achievement->internal_name){ + 'airlines_alliances.all_major_alliances' => Alliance::MAJOR_ALLIANCES, + default => [], + }; + $continents = match($achievement->internal_name){ 'countries_continents.all_continent_pairs_one_way', 'countries_continents.all_continent_pairs_both_ways' => Continent::all()->toArray(), default => [], @@ -207,6 +212,7 @@ class UserProfileController extends Controller 'continents' => $continents, 'aircraft_families' => $aircraftFamilies, 'achievementCount' => $user->unlockedAchievements()->count(), + 'majorAlliances' => Alliance::whereIn('internal_name', $majorAlliances)->get(), 'canView' => $canView, ]); } diff --git a/app/Models/Alliance.php b/app/Models/Alliance.php index 7d91bf9..4c98dbe 100644 --- a/app/Models/Alliance.php +++ b/app/Models/Alliance.php @@ -26,6 +26,9 @@ class Alliance extends Model 'skyteam' => 'airlines_alliances.all_skyteam', ]; + const array MAJOR_ALLIANCES = ['skyteam', 'oneworld', 'star_alliance']; + + public function airlines(): HasMany { return $this->hasMany(Airline::class); diff --git a/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php b/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php index fe1585f..565e36f 100644 --- a/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php +++ b/app/Services/Achievements/Checkers/AirlinesAndAlliancesChecker.php @@ -28,6 +28,12 @@ class AirlinesAndAlliancesChecker extends BaseChecker $check = fn(string $alliance): int => $flownAllianceAirlines->get($alliance, 0); + $majorAlliancesFlown = collect(Alliance::MAJOR_ALLIANCES) + ->filter(fn(string $alliance) => $check($alliance) > 0) + ->count(); + + $this->awardProgress($majorAlliancesFlown, 'airlines_alliances.all_major_alliances'); + $this->awardProgress($check('skyteam'), 'airlines_alliances.all_skyteam'); $this->awardProgress($check('oneworld'), 'airlines_alliances.all_oneworld'); $this->awardProgress($check('star_alliance'), 'airlines_alliances.all_star_alliance'); @@ -40,6 +46,8 @@ class AirlinesAndAlliancesChecker extends BaseChecker $checkGroup = fn(array $group): int => $flownAirlines->intersect($group)->count(); + + $this->awardProgress($checkGroup(self::ME_3), 'airlines_alliances.me3'); $this->awardProgress($checkGroup(self::US_3), 'airlines_alliances.us3'); $this->awardProgress($checkGroup(self::CN_3), 'airlines_alliances.cn3'); diff --git a/database/migrations/2026_07_20_034908_add_aliiances_challenge.php b/database/migrations/2026_07_20_034908_add_aliiances_challenge.php new file mode 100644 index 0000000..798aa40 --- /dev/null +++ b/database/migrations/2026_07_20_034908_add_aliiances_challenge.php @@ -0,0 +1,58 @@ +first(); + $airlines_and_alliances = AchievementCategory::where('internal_name', 'airlines_and_alliances')->first(); + + Achievement::create([ + 'name' => 'Allied Forces', + 'internal_name' => 'airlines_alliances.all_major_alliances', + 'short_description' => 'Fly The 3 Major Airline Alliances (Skyteam, Star Alliance, Oneworld)', + 'progressive' => true, + 'difficulty_description' => 'For most people in most parts of the world this is quite achievable', + 'threshold' => 3, + 'achievement_category_id' => $airlines_and_alliances->id, + 'achievement_difficulty_id' => $moderate->id, + 'has_page' => true, + 'sort_order' => 1, + 'icon' => 'standard_achievement.png', + 'long_description' => '', + ]); + + Achievement::where('internal_name', 'airlines_alliances.cn3')->update(['sort_order' => 3]); + Achievement::where('internal_name', 'airlines_alliances.us3')->update(['sort_order' => 1]); + Achievement::where('internal_name', 'airlines_alliances.me3')->update(['sort_order' => 2]); + Achievement::where('internal_name', 'airlines_alliances.all_major_alliances')->update(['sort_order' => 4]); + Achievement::where('internal_name', 'airlines_alliances.all_skyteam')->update(['sort_order' => 5]); + Achievement::where('internal_name', 'airlines_alliances.all_oneworld')->update(['sort_order' => 6]); + Achievement::where('internal_name', 'airlines_alliances.all_star_alliance')->update(['sort_order' => 7]); + Achievement::where('internal_name', 'airlines_alliances.all_vanilla_alliance')->update(['sort_order' => 8]); + + + foreach(User::all() as $user){ + $user->calculateAchievements(); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue b/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue index 573026a..46f5064 100644 --- a/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue +++ b/resources/js/Components/FlightsGoneBy/AllianceChallenge.vue @@ -1,125 +1,115 @@