mivita/dev/app-bak/Services/NextLevelBadgeHelper.php
2025-10-20 17:42:08 +02:00

125 lines
No EOL
4.6 KiB
PHP

<?php
namespace App\Services;
use App\Models\UserBusiness;
/**
* Helper-Klasse für die optimierte Generierung von Next-Level-Badges
*
* Diese Klasse nutzt ausschließlich bereits berechnete und gespeicherte Daten
* aus der UserBusiness-Tabelle, anstatt für jeden User eine neue TreeCalcBot-Instanz
* zu erstellen. Dies führt zu erheblichen Performance-Verbesserungen bei DataTables.
*/
class NextLevelBadgeHelper
{
/**
* Generiert Badge für nächsten Level Qualifikation basierend auf UserBusiness-Daten
*
* @param UserBusiness $userBusiness Bereits gespeicherte Business-Daten
* @return string HTML Badge
*/
public static function generateBadgeFromUserBusiness(UserBusiness $userBusiness): string
{
return self::renderBadge($userBusiness);
}
/**
* Generiert Badge basierend auf BusinessUser-Objekt (für TreeCalcBot-Kompatibilität)
*
* @param object $businessUser Business-User-Objekt mit Level-Daten
* @return string HTML Badge
*/
public static function generateBadgeFromBusinessUser($businessUser): string
{
return self::renderBadge($businessUser);
}
/**
* Zentrale Badge-Rendering-Logik
*
* @param mixed $source UserBusiness Model oder BusinessUser Objekt
* @return string HTML Badge
*/
private static function renderBadge($source): string
{
// Prüfe ob User für den nächsten Level qualifiziert ist (grün)
if (!empty($source->next_qual_user_level)) {
return self::renderQualifiedBadge($source);
}
// Prüfe ob User den Level erreichen könnte, aber noch nicht qualifiziert ist (gelb)
if (!empty($source->next_can_user_level)) {
return self::renderCanReachBadge($source);
}
// Kein nächster Level verfügbar (rot)
return self::renderNoLevelBadge();
}
/**
* Rendert Badge für qualifizierte User (grün)
*/
private static function renderQualifiedBadge($source): string
{
$level = $source->next_qual_user_level;
$ku = formatNumber($source->sales_volume_points_KP_sum ?? 0, 0);
$ku_required = formatNumber($level['qual_kp'] ?? 0, 0);
$tp = formatNumber($source->payline_points_qual_kp ?? 0, 0);
$tp_required = formatNumber($level['qual_pp'] ?? 0, 0);
$levelName = TranslationHelper::transUserLevelName($level['name'] ?? 'Unbekannt');
return '<span class="badge badge-outline-success" title="Qualifiziert für nächsten Level">
<i class="fa fa-check"></i> ' . e($levelName) . '<br/>
<small>KU: ' . $ku . '/' . $ku_required . ' | TP: ' . $tp . '/' . $tp_required . '</small>
</span>';
}
/**
* Rendert Badge für User die den Level erreichen könnten (gelb)
*/
private static function renderCanReachBadge($source): string
{
$level = $source->next_can_user_level;
$ku = formatNumber($source->sales_volume_points_KP_sum ?? 0, 0);
$ku_required = formatNumber($level['qual_kp'] ?? 0, 0);
$tp = formatNumber($source->payline_points_qual_kp ?? 0, 0);
$tp_required = formatNumber($level['qual_pp'] ?? 0, 0);
$levelName = TranslationHelper::transUserLevelName($level['name'] ?? 'Unbekannt');
return '<span class="badge badge-outline-warning-dark" title="Noch nicht qualifiziert">
<i class="fa fa-clock"></i> ' . e($levelName) . '<br/>
<small>KU: ' . $ku . '/' . $ku_required . ' | TP: ' . $tp . '/' . $tp_required . '</small>
</span>';
}
/**
* Rendert Badge wenn kein nächster Level verfügbar ist (rot)
*/
private static function renderNoLevelBadge(): string
{
return '<span class="badge badge-outline-warning" title="Kein nächster Level verfügbar">
<i class="fa fa-times"></i>
</span>';
}
/**
* Fallback-Badge bei Fehlern oder fehlenden Daten
*/
public static function renderErrorBadge(string $message = 'Fehler bei der Berechnung'): string
{
return '<span class="badge badge-outline-danger" title="' . e($message) . '">
<i class="fa fa-exclamation"></i> Fehler
</span>';
}
/**
* Badge für fehlende Daten
*/
public static function renderNoDataBadge(): string
{
return '<span class="badge badge-outline-secondary" title="Keine Daten verfügbar">
<i class="fa fa-question"></i> Keine Daten
</span>';
}
}