154 lines
5.2 KiB
PHP
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));
|
|
}
|
|
}
|