FSCash/html/rep-month.php
fds2610-bot 6f377ea251 V.2.2: Unit-Tests für wichtige Funktionen, automatisch geprüft bei Update
Extrahiert die wichtigste DB-/netzwerkfreie Geschäftslogik (Monatsnavigation,
Admin-/Aktien-Rollenprüfung, Aktien-GuV-Berechnung, OpenFIGI-/Alpha-Vantage-
Antwortauswertung, Eingabevalidierung, CSV-Export, Migrations-Logik) nach
html/lib/fscash.php und deckt sie mit 31 PHPUnit-Tests ab. update.sh
installiert Composer-Abhängigkeiten bei Bedarf und führt die Tests jetzt vor
jedem Deploy aus - bei Fehlschlag wird nichts kopiert oder migriert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 17:54:30 +02:00

164 lines
4.4 KiB
PHP

<?php
require 'config.php';
require_once 'lib/fscash.php';
if (!isset($_SESSION['user_id'])) {
header('Location: index.php');
exit;
}
// Rollen des angemeldeten Benutzers ermitteln
$roles = fscash_user_roles((int)$_SESSION['user_id'], $admin_ids, $aktien_ids);
if ($roles['is_admin']) {
$is_admin = "true";
}
if ($roles['is_aktien']) {
$is_aktien = "true";
}
// Aktuelles Jahr und Monat ermitteln, ggf. aus GET-Parametern
$year = isset($_GET['year']) ? (int)$_GET['year'] : (int)date('Y');
$month = isset($_GET['month']) ? (int)$_GET['month'] : (int)date('m');
// Monats- und Jahresgrenzen prüfen und anpassen
['month' => $month, 'year' => $year] = fscash_normalize_month_year($month, $year);
// Daten für die Summen-Tabelle abrufen
$sql_sum = "
SELECT
c.category_id AS kategorie_id,
c.name AS kategorie_name,
COALESCE(SUM(e.amount), 0) AS summe_je_kategorie
FROM
categories c
LEFT JOIN
entries e
ON e.category = c.category_id
AND EXTRACT(YEAR FROM e.date) = :year
AND EXTRACT(MONTH FROM e.date) = :month
GROUP BY
c.category_id, c.name
ORDER BY
c.category_id ASC
";
$stmt_sum = $pdo->prepare($sql_sum);
$stmt_sum->execute([
'year' => $year,
'month' => $month
]);
$entries_sum = $stmt_sum->fetchAll();
// Daten für den CSV-Export (alle Einträge) abrufen
$sql_csv = "
SELECT
e.id AS id,
e.user_id AS benutzer_id,
u.username AS benutzer_name,
c.category_id AS kategorie_id,
c.name AS kategorie_name,
e.amount AS betrag,
pm.name AS zahlungsmethode,
e.subject AS betreff,
e.date AS datum
FROM
entries e
LEFT JOIN
categories c ON e.category = c.category_id
LEFT JOIN
users u ON e.user_id = u.id
LEFT JOIN
payment_methods pm ON e.payment_method = pm.payment_method_id
WHERE
EXTRACT(YEAR FROM e.date) = :year
AND EXTRACT(MONTH FROM e.date) = :month
ORDER BY
e.user_id, e.category ASC
";
$stmt_csv = $pdo->prepare($sql_csv);
$stmt_csv->execute([
'year' => $year,
'month' => $month
]);
$entries_csv = $stmt_csv->fetchAll();
// CSV-Export-Logik
if (isset($_GET['export']) && $_GET['export'] === 'csv') {
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=monatsreport_'.$year.'_'.$month.'.csv');
$output = fopen('php://output', 'w');
fputcsv($output, ['ID', 'Datum', 'Benutzer', 'Kat-ID', 'Kategorie', 'Betreff', 'Betrag', 'Zahlungsmethode'], ';');
foreach ($entries_csv as $entry) {
fputcsv($output, fscash_format_report_month_csv_row($entry), ';');
}
fclose($output);
exit;
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.8">
<title>FSCash - Monatsreport</title>
<link rel="stylesheet" href="assets/css/style.css">
</head>
<body>
<div class="container">
<!-- Navigation -->
<nav class="nav">
<button class="hamburger">☰</button>
<ul class="nav-list">
<li><a href="dashboard.php">Start</a></li>
<?php if ($is_aktien === "true") echo '<li><a href="aktien.php">Aktien</a></li>'; ?>
<?php if ($is_admin === "true") echo '<li><a href="register.php">Neue User</a></li>'; ?>
<li><a href="rep-person.php">Report Personen</a></li>
<li><a href="menu5.php" style="display: none;">Menüpunkt 5</a></li>
</ul>
<!-- Container für die rechten Buttons -->
<div class="nav-right">
<a href="?year=<?= $year ?>&month=<?= $month - 1 ?>" class="nav-button"> &lt; </a>
<a href="?year=<?= $year ?>&month=<?= $month + 1 ?>" class="nav-button"> &gt; </a>
<a href="logout.php" class="logout">Logout</a>
</div>
</nav>
<h2><?= strftime('%B %Y', mktime(0, 0, 0, $month, 1, $year)) ?></h2>
<table class="thin">
<thead>
<tr>
<th>ID</th>
<th>Kategorie</th>
<th>Summe</th>
</tr>
</thead>
<tbody>
<?php foreach ($entries_sum as $entry): ?>
<tr>
<td><?= htmlspecialchars($entry['kategorie_id'] ?? '') ?></td>
<td><?= htmlspecialchars($entry['kategorie_name'] ?? '') ?></td>
<td class="align-right">
<a href="dashboard.php?year=<?= $year ?>&month=<?= $month ?>&kategorie=<?= urlencode($entry['kategorie_name'] ?? '') ?>">
<?= htmlspecialchars(number_format($entry['summe_je_kategorie'], 2, ',', '.')) ?>
</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!-- Buttons -->
<div class="button-group">
<a href="new_entry.php" class="btn-xr">+</a>
<a href="?year=<?= $year ?>&month=<?= $month ?>&export=csv" class="btn-xr">CSV</a>
</div>
<script>
// Hamburger-Menü-Funktion
document.querySelector('.hamburger').addEventListener('click', function() {
document.querySelector('.nav-list').classList.toggle('show');
});
</script>
</body>
</html>