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
*
* 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.
*/
class RecruitingChallenge2026Seeder extends Seeder
@ -46,7 +47,7 @@ class RecruitingChallenge2026Seeder extends Seeder
'include_sales_points' => false,
'status' => 0,
'vip_only' => true,
'image' => null,
'image' => 'incentive-recruiting-2026.jpg',
];
$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
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.
@ -152,7 +152,7 @@ Beim Deploy den Ordner `public/img/incentive/montenegro-incentive-2026/` mit hoc
- [ ] Fragen 1 bis 10 mit Dani/Alois entschieden
- [ ] Texte freigegeben (Name, Untertitel, Beschreibung, Bedingungen), ggf. Übersetzungen
- [ ] Hero-Bild geliefert und abgelegt
- [x] Titelbild geliefert und abgelegt
- [ ] Gleichstandsregel deployt
- [ ] Deploy E1 und Seeder auf Produktion
- [ ] 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>
{{ __('incentive.dashboard_btn_teaser') }}
</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)
<a href="{{ route('user_incentive_details', [$activeIncentive->slug]) }}"
class="btn inc-dash-btn-secondary">

View file

@ -42,6 +42,7 @@ function vipTestUser(int $admin = 0): User
'payment_account' => now()->addYear(),
'wizard' => 100,
'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');
});
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 () {
$incentive = vipOnlyChallenge(['vip_only' => false]);