23-01-2026

This commit is contained in:
Kevin Adametz 2026-01-23 17:35:23 +01:00
parent a939cd51ef
commit a8b395e20d
248 changed files with 29342 additions and 4805 deletions

View file

@ -13,6 +13,7 @@ use App\Services\BusinessPlan\TreeCalcBot;
use App\Services\BusinessPlan\TreeCalcBotOptimized;
use App\Services\BusinessPlan\TreeHelperOptimized;
use App\Services\HTMLHelper;
use App\Services\LevelReportService;
use App\Services\NextLevelBadgeHelper;
use App\Services\TranslationHelper;
use App\User;
@ -134,7 +135,7 @@ class TeamController extends Controller
$user = User::find(\Auth::user()->id);
if (config('app.debug')) {
$user = User::find(454);
// $user = User::find(454);
}
$this->setFilterVars();
@ -491,6 +492,141 @@ class TeamController extends Controller
}
}
/**
* Zeigt Level-Aufstieg Reports für das eigene Team
* Nur für einen ausgewählten Monat/Jahr basierend auf TreeCalcBotOptimized
*/
public function levelReports(Request $request)
{
$startTime = microtime(true);
try {
$user = User::find(\Auth::user()->id);
$this->setFilterVars();
// Monat und Jahr aus Request oder Session
$month = Request::get('month') ?: session('team_user_filter_month_prev', intval(date('m') - 1));
$year = Request::get('year') ?: session('team_user_filter_year', date('Y'));
$onlyNotUpdated = Request::boolean('not_updated', false);
// Prüfe ob Live-Berechnung erzwungen werden soll
$forceLiveCalculation = false; //Request::get('force_live_calculation', false) || Request::get('live', false);
\Log::info("TeamController: Building level reports for user {$user->id} ({$month}/{$year})");
// Lade Team-Struktur mit TreeCalcBotOptimized
$treeCalcBot = new TreeCalcBotOptimized($month, $year, 'member', $forceLiveCalculation);
$treeCalcBot->initStructureUser($user->id, $forceLiveCalculation);
// Lade Level-Reports für Team
$levelReportService = new LevelReportService();
$filters = ['only_not_updated' => $onlyNotUpdated];
$promotions = $levelReportService->getTeamLevelPromotions($treeCalcBot, $month, $year, $filters);
$statistics = $levelReportService->getStatistics($promotions);
$endTime = microtime(true);
$executionTime = round(($endTime - $startTime) * 1000, 2);
\Log::info("TeamController: Level reports loaded for user {$user->id} in {$executionTime}ms - " . $promotions->count() . " promotions found");
$availableYears = range(date('Y'), date('Y') - 5);
$availableMonths = [
1 => __('cal.months.January'),
2 => __('cal.months.February'),
3 => __('cal.months.March'),
4 => __('cal.months.April'),
5 => __('cal.months.May'),
6 => __('cal.months.June'),
7 => __('cal.months.July'),
8 => __('cal.months.August'),
9 => __('cal.months.September'),
10 => __('cal.months.October'),
11 => __('cal.months.November'),
12 => __('cal.months.December')
];
$data = [
'promotions' => $promotions,
'statistics' => $statistics,
'filters' => [
'month' => $month,
'year' => $year,
'only_not_updated' => $onlyNotUpdated
],
'availableYears' => $availableYears,
'availableMonths' => $availableMonths,
'performance' => [
'execution_time' => $executionTime,
'user_id' => $user->id
]
];
return view('user.team.level-reports', $data);
} catch (\Exception $e) {
\Log::error("TeamController: Error loading level reports: " . $e->getMessage());
return view('user.team.level-reports', [
'error' => 'Fehler beim Laden der Level-Reports: ' . $e->getMessage(),
'promotions' => collect([]),
'statistics' => ['total_count' => 0, 'level_stats' => [], 'period_stats' => []],
'filters' => ['month' => date('m'), 'year' => date('Y'), 'only_not_updated' => false],
'availableYears' => range(date('Y'), date('Y') - 5),
'availableMonths' => [
1 => __('cal.months.January'),
2 => __('cal.months.February'),
3 => __('cal.months.March'),
4 => __('cal.months.April'),
5 => __('cal.months.May'),
6 => __('cal.months.June'),
7 => __('cal.months.July'),
8 => __('cal.months.August'),
9 => __('cal.months.September'),
10 => __('cal.months.October'),
11 => __('cal.months.November'),
12 => __('cal.months.December')
]
]);
}
}
/**
* CSV Export für Team Level-Reports
*/
public function levelReportsExport(Request $request)
{
try {
$user = User::find(\Auth::user()->id);
$this->setFilterVars();
$month = Request::get('month') ?: session('team_user_filter_month_prev', intval(date('m') - 1));
$year = Request::get('year') ?: session('team_user_filter_year', date('Y'));
$onlyNotUpdated = Request::boolean('not_updated', false);
$forceLiveCalculation = Request::get('force_live_calculation', false) || Request::get('live', false);
// Lade Team-Struktur
$treeCalcBot = new TreeCalcBotOptimized($month, $year, 'member', $forceLiveCalculation);
$treeCalcBot->initStructureUser($user->id, $forceLiveCalculation);
// Lade Level-Reports
$levelReportService = new LevelReportService();
$filters = ['only_not_updated' => $onlyNotUpdated];
$promotions = $levelReportService->getTeamLevelPromotions($treeCalcBot, $month, $year, $filters);
if ($promotions->isEmpty()) {
return redirect()->back()->with('error', 'Keine Daten für Export gefunden.');
}
// CSV erstellen
$filename = 'team_level_promotions_' . date('Y-m-d_H-i-s') . '.csv';
$filepath = $levelReportService->exportToCsv($promotions, $filename);
return response()->download($filepath, $filename)->deleteFileAfterSend(true);
} catch (\Exception $e) {
\Log::error("TeamController: Error exporting level reports: " . $e->getMessage());
return redirect()->back()->with('error', 'Fehler beim Export: ' . $e->getMessage());
}
}
/**
* Zeigt den Marketingplan für User an
* Übersichtliche Darstellung aller Karriere-Level mit wichtigen Informationen
@ -553,6 +689,94 @@ class TeamController extends Controller
return view('user.team.members', $data);
}
/**
* Zeigt die Abos der Team-Mitglieder an
*/
public function showAbos()
{
$user = User::find(\Auth::user()->id);
$this->setFilterVars();
// Nutze TreeCalcBotOptimized um das Team zu bekommen
$month = session('team_user_filter_month');
$year = session('team_user_filter_year');
// Lade Team-Struktur
$TreeCalcBot = new TreeCalcBotOptimized($month, $year, 'member', false);
$TreeCalcBot->initStructureUser($user->id, false);
// Hole flache Liste aller Team-Mitglieder
$teamUsersRaw = $this->getTeamUsersFromStructure($TreeCalcBot);
// Sammle User-IDs für Abo-Abfrage
$teamUserIds = [];
foreach ($teamUsersRaw as $teamUser) {
if ($teamUser->user_id && $teamUser->user_id != $user->id) {
$teamUserIds[] = $teamUser->user_id;
}
}
// Hole Abos der Team-Mitglieder
$abos = \App\Models\UserAbo::whereIn('user_id', $teamUserIds)
->where('is_for', 'me')
->with(['user', 'user.account', 'user_abo_items', 'user_abo_items.product'])
->orderBy('next_date', 'asc')
->get();
$data = [
'filter_months' => HTMLHelper::getTransMonths(),
'filter_years' => HTMLHelper::getYearRange(2022),
'abos' => $abos,
];
return view('user.team.abos', $data);
}
/**
* Zeigt die Detail-Ansicht eines Team-Abos an
*/
public function detailAbo($id)
{
$user = User::find(\Auth::user()->id);
$user_abo = \App\Models\UserAbo::findOrFail($id);
// Prüfe ob das Abo zu einem Team-Mitglied gehört
$this->setFilterVars();
$month = session('team_user_filter_month');
$year = session('team_user_filter_year');
$TreeCalcBot = new TreeCalcBotOptimized($month, $year, 'member', false);
$TreeCalcBot->initStructureUser($user->id, false);
$teamUsersRaw = $this->getTeamUsersFromStructure($TreeCalcBot);
$teamUserIds = [];
foreach ($teamUsersRaw as $teamUser) {
if ($teamUser->user_id) {
$teamUserIds[] = $teamUser->user_id;
}
}
// Prüfe Berechtigung
if (!in_array($user_abo->user_id, $teamUserIds)) {
abort(403, 'Unauthorized action. This subscription does not belong to your team.');
}
// Lade Abo-Details (ähnlich wie AboController)
\App\Services\AboOrderCart::initYard($user_abo);
$customer_detail = \App\Services\AboOrderCart::getCustomerDetail();
\App\Services\AboOrderCart::makeOrderYard($user_abo);
$data = [
'user_abo' => $user_abo,
'isAdmin' => false,
'customer_detail' => $customer_detail,
'view' => 'team',
'comp_products' => [],
];
return view('user.team.abo_detail', $data);
}
/**
* Initialisiert die Team-Suche für den eingeloggten User
*/
@ -674,6 +898,9 @@ class TeamController extends Controller
if (!session('team_user_filter_month')) {
session(['team_user_filter_month' => intval(date('m'))]);
}
if (!session('team_user_filter_month_prev')) {
session(['team_user_filter_month_prev' => intval(date('m') - 1)]);
}
if (!session('team_user_filter_year')) {
session(['team_user_filter_year' => intval(date('Y'))]);
}
@ -696,6 +923,9 @@ class TeamController extends Controller
if (Request::get('team_user_filter_month')) {
session(['team_user_filter_month' => Request::get('team_user_filter_month')]);
}
if (Request::get('team_user_filter_month_prev')) {
session(['team_user_filter_month_prev' => Request::get('team_user_filter_month_prev')]);
}
if (Request::get('team_user_filter_year')) {
session(['team_user_filter_year' => Request::get('team_user_filter_year')]);
}