5.6 KiB
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:
- Er ein Level erreicht hat (
isQualLevel()). - Dieses Level einen
growth_bonus > 0hat.
Das ist bereits in GrowthBonusCalculator::getVolumeByProtectionLevel und collectLegLevels implementiert:
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.
// 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
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.