mivita/tests/Feature/Incentive/RecruitingChallengeSeederTest.php
Kevin Adametz fe1a9478f4 Recruiting Challenge: Rangliste nach Umsatz der Neupartner, Steuerpflicht
- 50 EUR je Neupartner bleiben; die Top 3 (500/300/200 EUR) ermittelt
  jetzt der Umsatz der Neupartner (wie Montenegro, ohne Einmalpunkte/Abos)
- Gleichstand bei Umsatzwertung: vorn liegt, wessen letzte gezaehlte
  Umsatzbuchung frueher kam
- Challenge-Seite: Praemie und Top-3-Darstellung auch bei Umsatzwertung,
  Ranglisten-Hinweis auf Umsatz (DE/EN/ES/FR)
- Seeder: neue Texte und Bedingungen (Rangliste, Steuerpflicht,
  vergünstigter Einstieg bis 31.10.), gleicht Wertung beim Einspielen ab

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:19:30 +00:00

79 lines
4.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use App\Models\Incentive;
use Database\Seeders\RecruitingChallenge2026Seeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
/**
* E1: Der Seeder legt die Recruiting Challenge mit den abgestimmten Texten als Entwurf an
* und ueberschreibt bei einem zweiten Lauf nur Texte und Wertung, nicht die Admin-Werte.
* Seit 08.10.2026 zaehlt die Rangliste den Umsatz der Neupartner, die 50 EUR je Partner bleiben.
*/
it('legt die Challenge als Entwurf mit Praemie und Wertung nach Umsatz der Neupartner an', function () {
$this->seed(RecruitingChallenge2026Seeder::class);
$incentive = Incentive::where('slug', RecruitingChallenge2026Seeder::SLUG)->firstOrFail();
expect($incentive->isDraft())->toBeTrue()
->and($incentive->vip_only)->toBeTrue()
->and($incentive->name)->toBe('Recruiting Challenge 2026/27')
->and($incentive->qualification_start->toDateString())->toBe('2026-10-09')
->and($incentive->qualification_end->toDateString())->toBe('2027-01-31')
->and((float) $incentive->amount_per_partner)->toBe(50.0)
->and($incentive->rankBonuses())->toBe([1 => 500.0, 2 => 300.0, 3 => 200.0])
->and($incentive->max_winners)->toBe(3)
->and($incentive->ranksByPartnerCount())->toBeFalse()
->and($incentive->ranksBySalesOfNewPartners())->toBeTrue()
->and($incentive->isCashChallenge())->toBeTrue()
->and($incentive->includesAbos())->toBeFalse()
->and($incentive->hasMinimumRequirements())->toBeFalse()
->and($incentive->description)->toContain('50 €')
->and($incentive->terms)->toContain('6. Gleichstand')->toContain('5. Rangliste')->toContain('Umsatz der neuen Partner')
->and($incentive->terms)->toContain('Die Boni werden als Bruttobeiträge ausgewiesen und unterliegen der gesetzlichen Steuer- und Sozialversicherungspflicht.')
->and($incentive->description)->toContain('Steuerpflicht: Die Boni werden als Bruttobeiträge ausgewiesen')->toContain('31. Oktober')
->and($incentive->description.$incentive->subtitle.$incentive->terms)->not->toContain('–')
->and($incentive->description.$incentive->subtitle.$incentive->terms)->not->toContain('—')
->and($incentive->description.$incentive->terms)->toContain('9. Oktober')->not->toMatch('/(?<!3)1\. Oktober/');
});
it('liefert Name, Untertitel, Beschreibung und Bedingungen auf EN, ES und FR', function (string $locale, string $date, string $tax) {
$this->seed(RecruitingChallenge2026Seeder::class);
$incentive = Incentive::where('slug', RecruitingChallenge2026Seeder::SLUG)->firstOrFail();
app()->setLocale($locale);
expect($incentive->getLang('subtitle'))->toContain('50')->not->toBe($incentive->subtitle)
->and($incentive->getLang('description'))->toContain($date)->not->toBe($incentive->description)
->and($incentive->getLang('terms'))->toContain($date)->toContain('6.')->toContain($tax)
->and($incentive->getLang('description'))->toContain($tax)
->and($incentive->getLang('name'))->toBe('Recruiting Challenge 2026/27');
})->with([
'en' => ['en', '9 October', 'gross amounts'],
'es' => ['es', '9 de octubre', 'importes brutos'],
'fr' => ['fr', '9 octobre', 'montants bruts'],
]);
it('aktualisiert beim zweiten Lauf Texte, Beginn und Wertung und laesst Admin-Werte stehen', function () {
$this->seed(RecruitingChallenge2026Seeder::class);
$incentive = Incentive::where('slug', RecruitingChallenge2026Seeder::SLUG)->firstOrFail();
$incentive->update([
'status' => 1, 'image' => 'challenge.jpg', 'bonus_rank_1' => 999, 'description' => 'alt',
'qualification_start' => '2026-10-01', 'trans_description' => ['en' => null, 'es' => null, 'fr' => null],
'points_partner_onetime' => 1, 'include_sales_points' => false,
]);
$this->seed(RecruitingChallenge2026Seeder::class);
$incentive->refresh();
expect(Incentive::where('slug', RecruitingChallenge2026Seeder::SLUG)->count())->toBe(1)
->and($incentive->status)->toBe(1)
->and($incentive->image)->toBe('challenge.jpg')
->and((float) $incentive->bonus_rank_1)->toBe(999.0)
->and($incentive->description)->toContain('50 €')
->and($incentive->qualification_start->toDateString())->toBe('2026-10-09')
->and($incentive->points_partner_onetime)->toBe(0)
->and($incentive->includesSalesPoints())->toBeTrue()
->and($incentive->getTrans('description', 'en'))->toContain('9 October');
});