125 lines
No EOL
4.6 KiB
PHP
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>';
|
|
}
|
|
} |