render('layout/base.php', [ 'pageTitle' => 'EÜR – Einnahmen-Überschuss-Rechnung', 'content' => $this->renderView('tax/euer_index', ['years' => $years]), ]); } public function show(array $params): void { $year = (int)$params['year']; $calc = new EuerCalculator(); $euer = $calc->calculate($year); $anlageliste = Asset::anlageliste($year); $view = new View(); $view->render('layout/base.php', [ 'pageTitle' => "EÜR {$year}", 'content' => $this->renderView('tax/euer_show', [ 'euer' => $euer, 'year' => $year, 'anlageliste' => $anlageliste, ]), 'topbarActions' => '', ]); } public function kontoBookings(array $params): void { $year = (int)$params['year']; $kontoId = (int)$params['konto_id']; $calc = new EuerCalculator(); $bookings = $calc->fetchBookingsForKonto($year, $kontoId); $konto = \Steuerkram\Models\Account::find($kontoId); $view = new View(); $view->render('layout/base.php', [ 'pageTitle' => "EÜR {$year} – " . ($konto['bezeichnung'] ?? ''), 'content' => $this->renderView('tax/euer_konto_bookings', [ 'year' => $year, 'konto' => $konto, 'bookings' => $bookings, ]), ]); } public function pdf(array $params): void { $year = (int)$params['year']; $calc = new EuerCalculator(); $euer = $calc->calculate($year); $settings = Setting::get(); $svc = new PdfEuerService(); $svc->render($euer, $settings); } public function anlageCsv(array $params): void { $year = (int)$params['year']; $anlageliste = Asset::anlageliste($year); $settings = Setting::get(); $firma = $settings['firma'] ?? ''; $fmtDate = function ($v) { if (empty($v)) return ''; $ts = strtotime($v); return $ts ? date('d.m.Y', $ts) : $v; }; $fmtNum = fn($v) => number_format((float)$v, 2, ',', '.'); header('Content-Type: text/csv; charset=UTF-8'); header('Content-Disposition: attachment; filename="Anlageliste-' . $year . '.csv"'); header('Cache-Control: no-cache'); $out = fopen('php://output', 'w'); fprintf($out, chr(0xEF) . chr(0xBB) . chr(0xBF)); // UTF-8 BOM für Excel fputcsv($out, [ 'Anlage-ID', 'Bezeichnung', 'Anschaffungsdatum', 'Anschaffungskosten', 'Nutzungsdauer', 'AfA Vorjahre', 'Restbuchwert Vorjahr', 'AfA ' . $year, 'Restbuchwert 31.12.' . $year, ], ';'); $sumBasis = $sumAfaVj = $sumRbwVj = $sumAfaJ = $sumRbw = 0.0; foreach ($anlageliste as $al) { $sumBasis += $al['basis']; $sumAfaVj += $al['afa_vorjahre']; $sumRbwVj += $al['restbuchwert_vorjahr']; $sumAfaJ += $al['afa_jahr']; $sumRbw += $al['restbuchwert']; $nd = $al['nutzungsdauer'] !== null ? ($al['nutzungsdauer'] == 0 ? 'sofort' : $al['nutzungsdauer']) : ''; fputcsv($out, [ $al['anlage_nr'] ?: $al['lfd_nr'], $al['bezeichnung'], $fmtDate($al['anschaffungsdatum']), $fmtNum($al['basis']), $nd, $fmtNum($al['afa_vorjahre']), $fmtNum($al['restbuchwert_vorjahr']), $fmtNum($al['afa_jahr']), $fmtNum($al['restbuchwert']), ], ';'); } fputcsv($out, [ 'Summe', '', '', $fmtNum($sumBasis), '', $fmtNum($sumAfaVj), $fmtNum($sumRbwVj), $fmtNum($sumAfaJ), $fmtNum($sumRbw), ], ';'); fclose($out); } public function anlagePdf(array $params): void { $year = (int)$params['year']; $anlageliste = Asset::anlageliste($year); $settings = Setting::get(); $svc = new PdfAnlagelisteService(); $svc->render($year, $anlageliste, $settings); } }