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)); } }