Incentive (E1): Titelbild der Challenge, Dashboard-Karte mit einem Button, VIP-Sichtbarkeit auf dem Dashboard getestet

Titelbild liegt unter public/img/incentive/recruiting-challenge-2026-27/,
der Seeder traegt den Dateinamen ein. Die Dashboard-Karte verlinkt nur
noch auf die eine Incentive-Seite, der Ranglisten-Button entfaellt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-09-22 14:06:15 +00:00
parent 9b6717ca8a
commit fb4313fbf7
5 changed files with 24 additions and 9 deletions

View file

@ -14,7 +14,8 @@ use Illuminate\Database\Seeder;
* *
* php artisan db:seed --class=RecruitingChallenge2026Seeder * php artisan db:seed --class=RecruitingChallenge2026Seeder
* *
* Danach im Admin pruefen, Bild eintragen und auf "Aktiv" stellen. Zur Abstimmung ist * Danach im Admin pruefen und auf "Aktiv" stellen. Das Titelbild liegt unter
* public/img/incentive/recruiting-challenge-2026-27/. Zur Abstimmung ist
* "Nur fuer VIP sichtbar" gesetzt; nach Freigabe den Haken entfernen. * "Nur fuer VIP sichtbar" gesetzt; nach Freigabe den Haken entfernen.
*/ */
class RecruitingChallenge2026Seeder extends Seeder class RecruitingChallenge2026Seeder extends Seeder
@ -46,7 +47,7 @@ class RecruitingChallenge2026Seeder extends Seeder
'include_sales_points' => false, 'include_sales_points' => false,
'status' => 0, 'status' => 0,
'vip_only' => true, 'vip_only' => true,
'image' => null, 'image' => 'incentive-recruiting-2026.jpg',
]; ];
$incentive = Incentive::withTrashed()->where('slug', self::SLUG)->first(); $incentive = Incentive::withTrashed()->where('slug', self::SLUG)->first();

View file

@ -91,7 +91,7 @@ So im Seeder hinterlegt. Die Punkte 2 (Bestätigung als Voraussetzung), 6 (Gleic
## 7. Bild und Gestaltung ## 7. Bild und Gestaltung
Hero-Bild liefert Kevin: Querformat, ca. 1600 × 600 px, JPG. Kein Strandmotiv, sonst sieht es aus wie Montenegro. Ablage unter `public/img/incentive/`, Dateiname im Admin ins Feld "Bild". Titelbild liegt vor: `public/img/incentive/recruiting-challenge-2026-27/incentive-recruiting-2026.jpg`, der Seeder trägt den Dateinamen ein.
Galerie (seit 22.09. getrennt): Jedes Incentive hat seinen eigenen Bildordner `public/img/incentive/<slug>/`. Die Challenge bekommt nur ein Titelbild, also `public/img/incentive/recruiting-challenge-2026-27/<dateiname>.jpg`, keine Impressionen. Die Montenegro-Fotos liegen jetzt unter `montenegro-incentive-2026/`. Die Seite beginnt mit dem Teilnahme-Block (Checkbox, Button, aufklappbare Bedingungen), darunter Titelbild, Text und die drei Kacheln Zeitraum, Prämie je Teampartner und Top 3 Bonus, dann "So funktioniert die Challenge" und das Live-Ranking. Bestätigte Teilnehmer sehen oben statt des Blocks ihren Stand mit Rang, Neupartnern und Prämie. Galerie (seit 22.09. getrennt): Jedes Incentive hat seinen eigenen Bildordner `public/img/incentive/<slug>/`. Die Challenge bekommt nur ein Titelbild, also `public/img/incentive/recruiting-challenge-2026-27/<dateiname>.jpg`, keine Impressionen. Die Montenegro-Fotos liegen jetzt unter `montenegro-incentive-2026/`. Die Seite beginnt mit dem Teilnahme-Block (Checkbox, Button, aufklappbare Bedingungen), darunter Titelbild, Text und die drei Kacheln Zeitraum, Prämie je Teampartner und Top 3 Bonus, dann "So funktioniert die Challenge" und das Live-Ranking. Bestätigte Teilnehmer sehen oben statt des Blocks ihren Stand mit Rang, Neupartnern und Prämie.
@ -152,7 +152,7 @@ Beim Deploy den Ordner `public/img/incentive/montenegro-incentive-2026/` mit hoc
- [ ] Fragen 1 bis 10 mit Dani/Alois entschieden - [ ] Fragen 1 bis 10 mit Dani/Alois entschieden
- [ ] Texte freigegeben (Name, Untertitel, Beschreibung, Bedingungen), ggf. Übersetzungen - [ ] Texte freigegeben (Name, Untertitel, Beschreibung, Bedingungen), ggf. Übersetzungen
- [ ] Hero-Bild geliefert und abgelegt - [x] Titelbild geliefert und abgelegt
- [ ] Gleichstandsregel deployt - [ ] Gleichstandsregel deployt
- [ ] Deploy E1 und Seeder auf Produktion - [ ] Deploy E1 und Seeder auf Produktion
- [ ] Challenge im Admin geprüft, Teaser und Rangliste angesehen - [ ] Challenge im Admin geprüft, Teaser und Rangliste angesehen

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View file

@ -128,11 +128,6 @@
<i class="ion ion-md-trophy mr-1"></i> <i class="ion ion-md-trophy mr-1"></i>
{{ __('incentive.dashboard_btn_teaser') }} {{ __('incentive.dashboard_btn_teaser') }}
</a> </a>
<a href="{{ route('user_incentive_teaser', [$activeIncentive->slug]) }}#ranking"
class="btn inc-dash-btn-secondary">
<i class="ion ion-md-list mr-1"></i>
{{ __('incentive.dashboard_btn_ranking') }}
</a>
@if ($incentiveParticipant) @if ($incentiveParticipant)
<a href="{{ route('user_incentive_details', [$activeIncentive->slug]) }}" <a href="{{ route('user_incentive_details', [$activeIncentive->slug]) }}"
class="btn inc-dash-btn-secondary"> class="btn inc-dash-btn-secondary">

View file

@ -42,6 +42,7 @@ function vipTestUser(int $admin = 0): User
'payment_account' => now()->addYear(), 'payment_account' => now()->addYear(),
'wizard' => 100, 'wizard' => 100,
'active' => 1, 'active' => 1,
'active_date' => now()->subMonths(6),
]); ]);
} }
@ -108,6 +109,24 @@ it('zeigt in der Navigation ein VIP-Badge am VIP-Incentive', function () {
->and($publicEntry)->not->toContain('badge badge-secondary'); ->and($publicEntry)->not->toContain('badge badge-secondary');
}); });
it('zeigt die Dashboard-Karte eines VIP-Incentives normalen Beratern nicht', function () {
vipOnlyChallenge(['name' => 'VIP Dashboard Challenge']);
$this->actingAs(vipTestUser());
$this->get(route('home'))->assertOk()->assertDontSee('VIP Dashboard Challenge');
});
it('zeigt die Dashboard-Karte eines VIP-Incentives VIP-Konten mit nur einem Button zur Seite', function () {
vipOnlyChallenge(['name' => 'VIP Dashboard Challenge']);
$this->actingAs(vipTestUser(admin: 1));
$this->get(route('home'))->assertOk()
->assertSee('VIP Dashboard Challenge')
->assertSee(__('incentive.dashboard_btn_teaser'))
->assertDontSee(__('incentive.dashboard_btn_ranking'))
->assertDontSee('#ranking');
});
it('zeigt allen Beratern ein Incentive ohne VIP-Sperre', function () { it('zeigt allen Beratern ein Incentive ohne VIP-Sperre', function () {
$incentive = vipOnlyChallenge(['vip_only' => false]); $incentive = vipOnlyChallenge(['vip_only' => false]);