149 lines
4.8 KiB
PHP
149 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Services\LevelReportService;
|
|
use Illuminate\Console\Command;
|
|
|
|
class BusinessLevelReports extends Command
|
|
{
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'business:level-reports {--month= : Filter by specific month} {--year= : Filter by specific year} {--user-id= : Filter by specific user ID} {--csv : Export as CSV file} {--not-updated : Show only users not yet updated to their new level}';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Generate reports showing who achieved new career levels and when';
|
|
|
|
private $levelReportService;
|
|
|
|
public function __construct(LevelReportService $levelReportService)
|
|
{
|
|
parent::__construct();
|
|
$this->levelReportService = $levelReportService;
|
|
}
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*
|
|
* @return int
|
|
*/
|
|
public function handle()
|
|
{
|
|
try {
|
|
$this->info('Generiere Level-Aufstieg-Report...');
|
|
|
|
// Filter Parameter
|
|
$filters = [
|
|
'month' => $this->option('month'),
|
|
'year' => $this->option('year'),
|
|
'user_id' => $this->option('user-id'),
|
|
'only_not_updated' => $this->option('not-updated')
|
|
];
|
|
|
|
$exportCsv = $this->option('csv');
|
|
|
|
// Lade Level-Aufstiege über Service
|
|
$levelPromotions = $this->levelReportService->getLevelPromotions($filters);
|
|
|
|
if ($levelPromotions->isEmpty()) {
|
|
$this->info('Keine Level-Aufstiege gefunden.');
|
|
return 0;
|
|
}
|
|
|
|
if ($exportCsv) {
|
|
$filepath = $this->levelReportService->exportToCsv($levelPromotions);
|
|
$this->info('');
|
|
$this->info('CSV-Export erstellt: ' . $filepath);
|
|
$this->info('Anzahl Datensätze: ' . $levelPromotions->count());
|
|
} else {
|
|
$this->displayReport($levelPromotions);
|
|
}
|
|
|
|
$this->info('Report erfolgreich generiert.');
|
|
return 0;
|
|
} catch (\Exception $e) {
|
|
$this->error('Fehler beim Generieren des Reports: ' . $e->getMessage());
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
private function displayReport($promotions)
|
|
{
|
|
$statistics = $this->levelReportService->getStatistics($promotions);
|
|
|
|
$this->info('');
|
|
$this->info('=== LEVEL-AUFSTIEG REPORT ===');
|
|
$this->info('');
|
|
|
|
if ($promotions->isEmpty()) {
|
|
$this->info('Keine Level-Aufstiege gefunden.');
|
|
return;
|
|
}
|
|
|
|
$headers = [
|
|
'Datum',
|
|
'User ID',
|
|
'Name',
|
|
'E-Mail',
|
|
'Von Level',
|
|
'Zu Level',
|
|
'Aktueller Level',
|
|
'Margin',
|
|
'KP Req',
|
|
'PP Req',
|
|
'Growth Bonus',
|
|
'User PP',
|
|
'User KP',
|
|
'Level Update',
|
|
'Aktiv'
|
|
];
|
|
|
|
$rows = [];
|
|
foreach ($promotions->toArray() as $promotion) {
|
|
$rows[] = [
|
|
$promotion['date'],
|
|
$promotion['user_id'],
|
|
$promotion['first_name'] . ' ' . $promotion['last_name'],
|
|
$promotion['email'],
|
|
$promotion['from_level_name'] . ' (ID:' . $promotion['from_level_id'] . ')',
|
|
$promotion['to_level_name'] . ' (ID:' . $promotion['to_level_id'] . ')',
|
|
$promotion['current_user_level_name'] . ' (ID:' . ($promotion['current_user_level_id'] ?? 'N/A') . ')',
|
|
$promotion['to_level_margin'] . '%',
|
|
number_format($promotion['to_level_qual_kp'], 0, ',', '.'),
|
|
number_format($promotion['to_level_qual_pp'], 0, ',', '.'),
|
|
$promotion['to_level_growth_bonus'] . '%',
|
|
number_format($promotion['total_pp'], 0, ',', '.'),
|
|
number_format($promotion['sales_volume_points_sum'], 0, ',', '.'),
|
|
$promotion['level_updated'],
|
|
$promotion['active_account'],
|
|
];
|
|
}
|
|
|
|
$this->table($headers, $rows);
|
|
|
|
// Zusammenfassung
|
|
$this->info('');
|
|
$this->info('=== ZUSAMMENFASSUNG ===');
|
|
$this->info('Anzahl Level-Aufstiege: ' . $statistics['total_count']);
|
|
|
|
$this->info('');
|
|
$this->info('Aufstiege nach Ziel-Level:');
|
|
foreach ($statistics['level_stats'] as $level => $count) {
|
|
$this->info(" - {$level}: {$count}");
|
|
}
|
|
|
|
$this->info('');
|
|
$this->info('Aufstiege nach Zeitraum:');
|
|
foreach ($statistics['period_stats'] as $period => $count) {
|
|
$this->info(" - {$period}: {$count}");
|
|
}
|
|
}
|
|
|
|
}
|