option('from') ?: null; $to = $this->option('to') ?: null; $this->info('Punkte-Differenzen'.($from || $to ? " ({$from} bis {$to})" : ' (gesamter Zeitraum)')); $this->line('Vorzeichen: + = Berater bekam ZU WENIG (Gutschrift), − = ZU VIEL'); $this->newLine(); $report = $service->report($from, $to); if ($report['rows'] === []) { $this->info('Keine Differenzen gefunden.'); return self::SUCCESS; } if ($this->option('details')) { $this->info('Je Berater und Monat:'); $this->table( ['Monat', 'Berater', 'Abo-Addon', 'Sammelbest.', 'Homeparty', 'Summe'], array_map(fn (array $row) => [ sprintf('%02d/%d', $row['month'], $row['year']), mb_strimwidth($row['consultant'], 0, 38, '…'), $this->fmt($row['addon']), $this->fmt($row['collect']), $this->fmt($row['homeparty']), $this->fmt($row['delta']), ], $report['rows']) ); $this->newLine(); } $this->info('Je Monat:'); $this->table( ['Monat', 'Berater', 'Abo-Addon', 'Sammelbest.', 'Homeparty', 'Summe'], array_map(fn (array $row) => [ sprintf('%02d/%d', $row['month'], $row['year']), $row['users'], $this->fmt($row['addon']), $this->fmt($row['collect']), $this->fmt($row['homeparty']), $this->fmt($row['delta']), ], $report['by_month']) ); $totals = $report['totals']; $this->newLine(); $this->info('Gesamt:'); $this->line(' Abo-Einmalartikel (zu wenig): '.$this->fmt($totals['addon'])); $this->line(' Sammelbestellungen (zu viel): '.$this->fmt($totals['collect'])); $this->line(' Homeparty (zu viel, Obergrenze): '.$this->fmt($totals['homeparty'])); $this->line(' ── Netto: '.$this->fmt($totals['delta'])); $this->newLine(); $this->line(' Gutschriften an Berater: '.$this->fmt($report['credits_owed'])); $this->line(' Zu viel gebucht: '.$this->fmt($report['overbooked'])); $this->line(' Betroffene Berater: '.$totals['users']); if ($csv = $this->option('csv')) { $this->writeCsv($csv, $report['rows']); $this->newLine(); $this->info("CSV geschrieben: {$csv}"); } return self::SUCCESS; } private function fmt(float $value): string { return ($value > 0 ? '+' : '').number_format($value, 2, ',', '.'); } /** * @param list> $rows */ private function writeCsv(string $path, array $rows): void { $handle = fopen($path, 'w'); fputcsv($handle, ['Jahr', 'Monat', 'UserId', 'Berater', 'AboAddon', 'Sammelbestellung', 'Homeparty', 'Summe'], ';'); foreach ($rows as $row) { fputcsv($handle, [ $row['year'], sprintf('%02d', $row['month']), $row['user_id'], $row['consultant'], number_format((float) $row['addon'], 2, ',', ''), number_format((float) $row['collect'], 2, ',', ''), number_format((float) $row['homeparty'], 2, ',', ''), number_format((float) $row['delta'], 2, ',', ''), ], ';'); } fclose($handle); } }