mivita/app/Cron/UserLevelUpdate.php
2026-01-23 17:35:23 +01:00

154 lines
5.2 KiB
PHP

<?php
namespace App\Cron;
use App\User;
use App\Models\UserBusiness;
use App\Models\UserLevel;
use App\Services\HTMLHelper;
use App\Models\UserCreditItem;
use App\Mail\MailUserLevelUpdate;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
use App\Repositories\CreditRepository;
class UserLevelUpdate
{
private $month;
private $year;
private $userLevels;
public function __construct($month, $year)
{
$this->month = $month;
$this->year = $year;
// Lade UserLevels für POS-Vergleich (wird für Prüfung benötigt)
$this->userLevels = UserLevel::where('active', 1)->orderBy('pos')->get()->keyBy('id');
}
/**
* Holt alle UserBusiness Einträge die Level-Updates benötigen
* Mit Eager Loading für bessere Performance
*/
public function getUserBusinessByMonthYear()
{
return UserBusiness::select('user_businesses.*')
->with('user') // Eager Loading für User
->where('user_businesses.month', '=', $this->month)
->where('user_businesses.year', '=', $this->year)
->whereNotNull('user_businesses.next_qual_user_level')
->whereRaw("JSON_LENGTH(user_businesses.next_qual_user_level) > 0")
->get();
}
/**
* Aktualisiert das User-Level basierend auf next_qual_user_level
* Berücksichtigt Arrays und einzelne Level-Objekte
* Prüft ob das neue Level höher ist als das aktuelle
*/
public function makeUserLevelUpdate(UserBusiness $userBusiness, $send_update_mail = false)
{
$ret = false;
if (!$userBusiness->user) {
Log::warning("UserLevelUpdate: UserBusiness {$userBusiness->id} hat kein User-Objekt");
return $ret;
}
$nextQualUserLevel = $userBusiness->next_qual_user_level;
if (!is_array($nextQualUserLevel) || empty($nextQualUserLevel)) {
return $ret;
}
// next_qual_user_level ist ein einzelnes Level-Objekt
if (is_array($nextQualUserLevel) && isset($nextQualUserLevel['id'])) {
// return wenn bereits aktualisierte Level
if (isset($nextQualUserLevel['hasUpdated']) && $nextQualUserLevel['hasUpdated'] == 1) {
return $ret;
}
$newLevelId = $nextQualUserLevel['id'];
$newLevelPos = null;
// Lade Level-Objekt für POS-Vergleich
$newLevel = $this->userLevels->get($newLevelId);
if ($newLevel) {
$newLevelPos = $newLevel->pos;
}
// Prüfe ob das neue Level höher ist als das aktuelle
$currentUserLevel = null;
if ($userBusiness->user->m_level) {
$currentUserLevel = $this->userLevels->get($userBusiness->user->m_level);
}
// Nur updaten wenn das neue Level höher ist (POS > aktuelles Level POS)
if (!$currentUserLevel || !$newLevelPos) {
return $ret;
}
if ($newLevelPos <= $currentUserLevel->pos) {
return $ret;
}
}
// Update durchführen wenn ein höheres Level gefunden wurde
try {
$userBusiness->user->m_level = $newLevel['id'];
$userBusiness->user->save();
// Markiere das Level als aktualisiert in next_qual_user_level
$nextQualUserLevel['hasUpdated'] = 1;
$userBusiness->next_qual_user_level = $nextQualUserLevel;
$userBusiness->save();
$ret = $newLevelId . ' ' . ($newLevel->name ?? 'Unbekannt');
if ($send_update_mail) {
try {
$this->sendUpdateMail(
$userBusiness->user,
$userBusiness->payline_points_qual_kp ?? 0,
$newLevel->name ?? 'Unbekannt'
);
} catch (\Exception $e) {
Log::warning("UserLevelUpdate: E-Mail konnte nicht gesendet werden für User {$userBusiness->user->id}: " . $e->getMessage());
// E-Mail-Fehler sollten das Update nicht verhindern
}
}
Log::info("UserLevelUpdate: User {$userBusiness->user->id} Level aktualisiert zu {$ret}");
} catch (\Exception $e) {
Log::error("UserLevelUpdate: Fehler beim Update von User {$userBusiness->user->id}: " . $e->getMessage());
throw $e;
}
return $ret;
}
private function sendUpdateMail(User $user, $tp, $to)
{
$bcc = [];
$email = $user->email;
if (!$email) {
if ($user->mode === 'test') {
} else {
$email = config('app.checkout_mail');
}
}
if ($user->mode === 'test') {
$bcc[] = config('app.checkout_test_mail');
} else {
$bcc[] = config('app.checkout_mail');
}
if (\App\Services\Util::isTestSystem()) {
$email = config('app.checkout_test_mail');
$bcc[] = config('app.checkout_test_mail');
}
Mail::to($email)->bcc($bcc)->locale($user->getLocale())->send(new MailUserLevelUpdate($tp, $to));
}
}