Haushaltsbuch/diagramme.php

244 lines
8.4 KiB
PHP

<?php
require_once __DIR__ . '/includes/db_connect.php';
$system = getenv('POSTGRES_SYSTEM') ?? 'test';
$stmt = $pdo->query("SELECT DISTINCT EXTRACT(YEAR FROM CAST(kb.datum_abgebucht AS DATE)) AS jahr,
m.name_kurz,
m.wert
FROM kontobewegung kb
JOIN monat m ON 1=1
WHERE kb.datum_abgebucht IS NOT NULL
ORDER BY jahr, m.wert;");
$zeitraeume = $stmt->fetchAll(PDO::FETCH_ASSOC);
$xAchse = [];
foreach($zeitraeume as $zeitraum) {
$xAchse[] = $zeitraum['name_kurz'] . ' ' . $zeitraum['jahr'];
}
$konten = [];
$farben = ['gesamt Thomas' => '#007bffff', 'gesamt Caro' => '#fcd3daff', 'gesamt Emil' => '#91c89aff'];
$gesamt = [];
$gesamtThomas = [];
$gesamtCaro = [];
$gesamtEmil = [];
$relevantFuerGesamtThomas = false;
$relevantFuerGesamtCaro = false;
$relevantFuerGesamtEmil = false;
$kontenRelevantFuerDiagramm = [1, 2, 3, 4, 5, 6, 9, 10];
foreach($kontenRelevantFuerDiagramm as $konto) {
switch($konto) {
case 1:
$relevantFuerGesamtThomas = true;
$relevantFuerGesamtCaro = true;
$relevantFuerGesamtEmil = false;
break;
case 2:
$relevantFuerGesamtThomas = true;
$relevantFuerGesamtCaro = true;
$relevantFuerGesamtEmil = false;
break;
case 3:
$relevantFuerGesamtThomas = true;
$relevantFuerGesamtCaro = true;
$relevantFuerGesamtEmil = false;
break;
case 4:
$relevantFuerGesamtThomas = true;
$relevantFuerGesamtCaro = true;
$relevantFuerGesamtEmil = false;
break;
case 5:
$relevantFuerGesamtThomas = false;
$relevantFuerGesamtCaro = false;
$relevantFuerGesamtEmil = true;
break;
case 6:
$relevantFuerGesamtThomas = false;
$relevantFuerGesamtCaro = false;
$relevantFuerGesamtEmil = true;
break;
case 9:
$relevantFuerGesamtThomas = false;
$relevantFuerGesamtCaro = true;
$relevantFuerGesamtEmil = false;
break;
case 10:
$relevantFuerGesamtThomas = true;
$relevantFuerGesamtCaro = false;
$relevantFuerGesamtEmil = false;
break;
}
$stmt = $pdo->query("SELECT SUM(kb.betrag) AS monatsbetrag,
m.name_kurz || ' ' || EXTRACT(YEAR FROM CAST(kb.datum_abgebucht AS DATE)) AS jahr,
k.bezeichnung,
COALESCE(ad.startbetrag, 0) AS startbetrag,
m.wert,
k.darstellungsfarbe
FROM kontobewegung kb
JOIN konto k ON k.id = kb.konto_id
JOIN monat m ON m.wert = CASE WHEN EXTRACT(MONTH FROM CAST(kb.datum_abgebucht AS DATE)) < 10 THEN '0' || EXTRACT(MONTH FROM CAST(kb.datum_abgebucht AS DATE))
WHEN EXTRACT(MONTH FROM CAST(kb.datum_abgebucht AS DATE)) >= 10 THEN '' || EXTRACT(MONTH FROM CAST(kb.datum_abgebucht AS DATE))
END
LEFT OUTER JOIN ausgangsdaten ad ON ad.konto_id = k.id
WHERE kb.konto_id = $konto
AND kb.datum_abgebucht IS NOT NULL
GROUP BY EXTRACT(YEAR FROM CAST(kb.datum_abgebucht AS DATE)),
m.wert,
m.name_kurz,
k.bezeichnung,
startbetrag,
k.darstellungsfarbe
ORDER BY k.bezeichnung,
EXTRACT(YEAR FROM CAST(kb.datum_abgebucht AS DATE)),
m.wert;");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$kontoBezeichnung = $rows[0]['bezeichnung'];
$vormonatsBetrag = $rows[0]['startbetrag'];
$farben[$kontoBezeichnung] = $rows[0]['darstellungsfarbe'];
$konten[$kontoBezeichnung] = [];
foreach($xAchse as $x) {
if($relevantFuerGesamtThomas) {
if(!isset($gesamtThomas[$x])) $gesamtThomas[$x] = $vormonatsBetrag;
else $gesamtThomas[$x] += $vormonatsBetrag;
}
if($relevantFuerGesamtCaro) {
if(!isset($gesamtCaro[$x])) $gesamtCaro[$x] = $vormonatsBetrag;
else $gesamtCaro[$x] += $vormonatsBetrag;
}
if($relevantFuerGesamtEmil) {
if(!isset($gesamtEmil[$x])) $gesamtEmil[$x] = $vormonatsBetrag;
else $gesamtEmil[$x] += $vormonatsBetrag;
}
$enthalten = false;
foreach($rows as $row) {
if($x == $row['jahr']) {
$vormonatsBetrag += $row['monatsbetrag'];
$konten[$kontoBezeichnung][] = $vormonatsBetrag;
$enthalten = true;
}
}
if(!$enthalten) $konten[$kontoBezeichnung][] = $vormonatsBetrag;
}
}
foreach($gesamtThomas as $g => $f) {
$gesamt['gesamt Thomas'][] = $f;
}
foreach($gesamtCaro as $g => $f) {
$gesamt['gesamt Caro'][] = $f;
}
foreach($gesamtEmil as $g => $f) {
$gesamt['gesamt Emil'][] = $f;
}
$monateJson = json_encode($xAchse);
$kontenJson = json_encode($konten);
$gesamtJson = json_encode($gesamt);
$farbenJson = json_encode($farben);
?>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css">
<script src="https://cdn.plot.ly/plotly-3.3.1.min.js"></script>
</head>
<body>
<div class="header">
<h2 class="seitentitel">
Diagramme
</h2>
<a href="index.php"
class="konto_header"
id="konto_navigationRechts">
<img src="img\home.svg" alt="Home" class="menue">
</a>
</div>
<div class="inhalt">
<div class="diagramm" id="chartKonten"></div>
<div class="diagramm" id="chartGesamt"></div>
</div>
<script>
const monate = <?= $monateJson ?>;
const konten = <?= $kontenJson ?>;
const gesamt = <?= $gesamtJson ?>;
const farben = <?= $farbenJson ?>;
const tracesKonten = [];
const tracesGesamt = [];
var layout = {
margin: { t: 20 },
xaxis: {
title: { text: 'Monat'},
showgrid: true,
zeroline: true
},
yaxis: {
title: { text: 'Kontostand Monatsende'},
showgrid: true,
showline: true,
separatethousands: false
},
plot_bgcolor: '#b9b9b9',
paper_bgcolor: '#b9b9b9'
};
var modeBar = {modeBarButtonsToRemove: ['lasso2d', 'select2d', 'zoom2d', 'pan2d', 'autoScale2d'],
displaylogo: false
}
for (const kontoId in konten) {
tracesKonten.push({
x: monate,
y: konten[kontoId],
type: 'scatter',
mode: 'lines+markers',
name: kontoId,
hovertemplate: "%{y:,.2f} €<extra></extra>",
line: {
color: farben[kontoId],
width: 2
}
});
}
Plotly.newPlot('chartKonten', tracesKonten, layout, modeBar);
for (const gesamtId in gesamt) {
tracesGesamt.push({
x: monate,
y: gesamt[gesamtId],
type: 'scatter',
mode: 'lines+markers',
name: gesamtId,
hovertemplate: "%{y:,.2f} €<extra></extra>",
line: {
color: farben[gesamtId],
width: 2
}
});
}
Plotly.newPlot('chartGesamt', tracesGesamt, layout, modeBar);
</script>
<?= $system === 'test' ? '<div class="menue"><h2 class="seitentitel">Testsystem</h2></div>' : '' ?>
</body>
</html>