mivita/app/Services/BusinessPlan/Growth-Bonus-Block-Logic.md
2026-01-23 17:35:23 +01:00

136 lines
5.6 KiB
Markdown

# Ergänzung: Block-Status Erkennung
Das Problem ist aktuell, dass wir zwar den `growth_bonus` aus dem Qualifikations-Level auslesen, aber nicht explizit wissen, ob dieser User für den Upline-Partner als "Blocker" gilt oder nicht.
## Die Logik:
Ein User gilt als "Blocker" (bzw. er beansprucht Schutz), wenn:
1. Er ein Level erreicht hat (`isQualLevel()`).
2. Dieses Level einen `growth_bonus > 0` hat.
Das ist bereits in `GrowthBonusCalculator::getVolumeByProtectionLevel` und `collectLegLevels` implementiert:
```php
if ($item->isQualLevel()) {
$qual = $item->qual_user_level;
$growthBonus = is_array($qual) ? ($qual['growth_bonus'] ?? 0) : ($qual->growth_bonus ?? 0);
if ($growthBonus > 0) {
$myProtectionPercent = (float) $growthBonus;
}
}
```
## Was fehlt / optimiert werden muss:
Wenn du sagst "User die einen Level haben wo tiefebonus und der level auch erreicht ist ... wird der bonus geblockt oder geteilt", dann meinst du wahrscheinlich, dass wir sicherstellen müssen, dass `qual_user_level` korrekt gesetzt ist **UND** wir diesen Status auch in der Matrix-Ansicht korrekt als "Block" visualisieren.
Aktuell zeigt die Matrix "Block (0%)" nur an, wenn die rechnerische Differenz <= 0 ist.
Es wäre hilfreich, in der Matrix anzuzeigen, **WARUM** blockiert wird (z.B. "Blocked by Silver").
### Anpassung in `GrowthBonusCalculator::getMatrixDetails` (bzw. `collectLegLevels`)
Wir erweitern die Detail-Informationen in der Matrix um den Status des Users, der den Schutz erhöht hat.
In `collectLegLevels`:
Wir müssen erkennen, ob der aktuelle User den Schutz erhöht hat.
```php
// Protection Check
$userProtection = 0.0;
$blockerLevelName = null;
if ($item->isQualLevel()) {
$qual = $item->qual_user_level;
$growth = is_array($qual) ? ($qual['growth_bonus'] ?? 0) : ($qual->growth_bonus ?? 0);
if ($growth > 0) {
$userProtection = (float) $growth;
$blockerLevelName = is_array($qual) ? ($qual['name'] ?? '') : ($qual->name ?? '');
}
}
// Hat dieser User den Schutz erhöht?
$isBlocker = $userProtection > $incomingProtection;
$effectiveProtection = max($incomingProtection, $userProtection);
```
Diese Info speichern wir in `$legData['levels'][$level]`.
## Code-Anpassung
Ich werde `GrowthBonusCalculator.php` anpassen, um diese Meta-Daten zu erfassen, damit wir sie in der View anzeigen können.
### Schritt 1: `GrowthBonusCalculator.php` - `collectLegLevels` erweitern
```php
private function collectLegLevels(BusinessUserItemOptimized $item, int $level, float $incomingProtection, float $myPercent, array &$legData)
{
// 1. Eigenen Status ermitteln
$userProtection = 0.0;
$userLevelName = '';
if ($item->isQualLevel()) {
$qual = $item->qual_user_level;
$growth = is_array($qual) ? ($qual['growth_bonus'] ?? 0) : ($qual->growth_bonus ?? 0);
if ($growth > 0) {
$userProtection = (float) $growth;
$userLevelName = is_array($qual) ? ($qual['name'] ?? '') : ($qual->name ?? '');
}
}
// Berechnung
$volume = (float) ($item->sales_volume_points_TP_sum ?? 0);
if ($volume > 0) {
$diffPercent = max(0, $myPercent - $incomingProtection);
$commission = round($volume / 100 * $diffPercent, 2);
if (!isset($legData['levels'][$level])) {
$legData['levels'][$level] = [
'volume' => 0.0,
'commission' => 0.0,
'details' => []
];
}
$legData['levels'][$level]['volume'] += $volume;
$legData['levels'][$level]['commission'] += $commission;
// Erweiterte Details speichern
$legData['levels'][$level]['details'][] = [
'u' => $item->user_id,
'name' => $item->first_name . ' ' . $item->last_name,
'level' => $userLevelName, // Welchen Status hat dieser User?
'prot_own' => $userProtection, // Welchen Schutz baut er selbst auf?
'prot_in' => $incomingProtection, // Welcher Schutz kam von oben?
'percent' => $diffPercent
];
$legData['total_volume'] += $volume;
$legData['total_commission'] += $commission;
}
// Protection für nächste Ebene
$nextProtection = max($incomingProtection, $userProtection);
// Rekursion ...
}
```
### Schritt 2: View Update
In der View können wir nun anzeigen, wenn ein User auf einer Ebene einen Status hat (Tooltip oder Icon).
Da wir in der Matrix pro Ebene aggregieren (falls ein Bein sich verzweigt, was hier in `collectLegLevels` durch die Rekursion über `businessUserItems` passiert - Moment, ein "Bein" ist hier linear in der Tiefe, aber in jeder Tiefe kann es Breite geben).
Warte, `collectLegLevels` geht `foreach ($item->businessUserItems as $child)`.
Das bedeutet, ein "Leg" in der Matrix ist eigentlich ein ganzer Unterbaum.
In Ebene 2 können also mehrere User sein (alle Enkel in diesem Bein).
Wenn wir in der Matrix nur EINE Zelle pro Ebene haben, müssen wir entscheiden, was wir anzeigen.
Die Summe (€/Volumen) ist korrekt.
Aber der Status ("Block") kann unterschiedlich sein (ein Enkel ist Silber, der andere nicht).
Lösung: Wir markieren die Zelle als "Teilweise Blockiert" oder zeigen Details im Tooltip an.
Ich passe zuerst den `GrowthBonusCalculator` an, um diese Daten bereitzustellen.