Incentive (E1): Recruiting-Challenge mit Geldpraemie, Auszahlungs-Export und parallelen Incentives
Neue Felder amount_per_partner, bonus_rank_1..3 und include_sales_points an incentives. Mit ausgeschalteten Umsatzpunkten zaehlt die Wertung nur die Einmalpunkte je Neupartner, die Rangliste entspricht damit der Anzahl Neupartner mit Starterpaket. IncentivePayoutService rechnet Neupartner mal Betrag plus Rang-Bonus fuer qualifizierte Gewinner; Admin-Detailseite bekommt Praemienspalte, Summen und XLSX-Export fuer die Auszahlung. Sidenav und Dashboard zeigen alle aktiven Incentives, damit Montenegro und die Challenge parallel laufen koennen. Teaser, Rangliste und Details zeigen bei Geldpraemie die Praemien-Kachel und "Deine Praemie bisher" und blenden Abo-Bloecke aus, wenn Abos keine Rolle spielen. Montenegro bleibt unveraendert. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
03416b0afe
commit
e3efa2f5f0
27 changed files with 1418 additions and 129 deletions
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* Recruiting-Challenge (Entwicklungsplan September 2026, E1).
|
||||
*
|
||||
* Ein Incentive kann neben Punkten eine Geldpraemie tragen: ein fester Betrag je
|
||||
* Neupartner mit Starterpaket und ein Zusatz-Bonus fuer die ersten drei Plaetze.
|
||||
* Beides ist optional (NULL = reines Punkte-Incentive wie Montenegro).
|
||||
*
|
||||
* `include_sales_points` steuert, ob die Umsatzpunkte der Neupartner und Neuabos
|
||||
* in die Wertung einfliessen. Fuer eine Recruiting-Challenge steht der Schalter
|
||||
* auf 0: die Punkte entsprechen dann der Anzahl Neupartner (Einmalpunkte 1).
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('incentives', function (Blueprint $table) {
|
||||
if (! Schema::hasColumn('incentives', 'amount_per_partner')) {
|
||||
$table->decimal('amount_per_partner', 8, 2)->nullable()->after('max_winners')
|
||||
->comment('Geldpraemie je Neupartner in EUR (NULL = keine)');
|
||||
}
|
||||
if (! Schema::hasColumn('incentives', 'bonus_rank_1')) {
|
||||
$table->decimal('bonus_rank_1', 8, 2)->nullable()->after('amount_per_partner')->comment('Zusatz-Bonus Platz 1 in EUR');
|
||||
$table->decimal('bonus_rank_2', 8, 2)->nullable()->after('bonus_rank_1')->comment('Zusatz-Bonus Platz 2 in EUR');
|
||||
$table->decimal('bonus_rank_3', 8, 2)->nullable()->after('bonus_rank_2')->comment('Zusatz-Bonus Platz 3 in EUR');
|
||||
}
|
||||
if (! Schema::hasColumn('incentives', 'include_sales_points')) {
|
||||
$table->boolean('include_sales_points')->default(true)->after('bonus_rank_3')
|
||||
->comment('Umsatzpunkte der Neupartner/Neuabos mitzaehlen (0 = nur Einmalpunkte)');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('incentives', function (Blueprint $table) {
|
||||
$columns = array_values(array_filter(
|
||||
['amount_per_partner', 'bonus_rank_1', 'bonus_rank_2', 'bonus_rank_3', 'include_sales_points'],
|
||||
fn (string $column) => Schema::hasColumn('incentives', $column)
|
||||
));
|
||||
if ($columns !== []) {
|
||||
$table->dropColumn($columns);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue