diff --git a/Abrechnung/module.php b/Abrechnung/module.php
index 6be8786..abe30db 100644
--- a/Abrechnung/module.php
+++ b/Abrechnung/module.php
@@ -108,82 +108,144 @@ class Abrechnung extends IPSModule
private function BuildUserInvoice($pdf, $user, $power, $water, $tariffs, $from, $to)
{
$pdf->AddPage();
+ $pdf->SetFont('dejavusans', '', 8);
- // Kopfbereich
- $html = "
-
Elektro- und Nebenkostenabrechnung
-
-
-
-
- Zählpunkte: ";
+ // Titel
+ $html = "
+ Elektro- und Nebenkostenabrechnung
+ Zählpunkte: ";
- // Alle Zählerpunkte des Users auflisten
- foreach ($power as $m) {
- if ($m['user_id'] == $user['id']) {
- $html .= htmlspecialchars($m['name']) . " ";
+ foreach ($power as $pm) {
+ if ($pm['user_id'] == $user['id']) {
+ $html .= "• " . htmlspecialchars($pm['name']) . " ";
}
}
- foreach ($water as $m) {
- if ($m['user_id'] == $user['id']) {
- $html .= htmlspecialchars($m['name']) . " ";
+ foreach ($water as $wm) {
+ if ($wm['user_id'] == $user['id']) {
+ $html .= "• " . htmlspecialchars($wm['name']) . " ";
}
}
- $html .= "
- |
-
- Rechnungsadresse:
- {$user['name']}
- {$user['address']}
- {$user['city']}
- |
-
-
-
- Abrechnungszeitraum: " . date('d.m.Y', $from) . " – " . date('d.m.Y', $to) . "
-
-
- ";
-
- // ========================= Elektrizität =========================
- $html .= "Elektrizität
";
+ $html .= "
+ Rechnungsadresse:
"
+ . htmlspecialchars($user['name']) . "
"
+ . htmlspecialchars($user['address']) . "
"
+ . htmlspecialchars($user['city']) . "
+ Zeitraum: " . date('d.m.Y', $from) . " – " . date('d.m.Y', $to) . "
+
Elektrizität
";
+ // Stromkosten
$powerResult = $this->GetCalculatedPowerCosts($user['id']);
- $html .= $powerResult['html'];
- $totalPower = $powerResult['sum'];
-
- // ========== Stromtarife anzeigen ==========
- $appliedTariffs = $this->CollectTariffsForUser($tariffs, ['Netztarif','Solartarif','Einspeisetarif']);
- if (!empty($appliedTariffs)) {
- $html .= "Angewendete Elektrizitätstarife:
";
- foreach ($appliedTariffs as $t) {
- $html .= "- "
- . date('d.m.Y', $t['start']) . "–" . date('d.m.Y', $t['end'])
- . " — " . number_format($t['price'], 2) . " Rp/kWh"
- . "
";
- }
- $html .= "
";
- }
-
- // ========================= Nebenkosten =========================
- $html .= "Nebenkosten
";
+ $html .= $this->FormatPowerTable($powerResult);
+ // Nebenkosten
+ $html .= "Nebenkosten
";
$additionalResult = $this->CalculateAdditionalCosts($water, $tariffs, $user['id'], $from, $to);
- $html .= $additionalResult['html'];
- $totalAdditional = $additionalResult['sum'];
+ $html .= $this->FormatAdditionalTable($additionalResult);
- // ========================= Gesamttotal =========================
- $grandTotal = $totalPower + $totalAdditional;
+ // Gesamtsumme
+ $grand = $powerResult['sum'] + $additionalResult['sum'];
$html .= "
-
- Gesamttotal: " . number_format($grandTotal, 2) . " CHF
-
- ";
+
+
+ | Gesamttotal: |
+ " . number_format($grand, 2) . " CHF |
+
+
";
+ // Render PDF
$pdf->writeHTML($html, true, false, true, false, '');
}
+/* ============================ STROM – SCHÖNE TABELLE ============================ */
+
+private function FormatPowerTable($result)
+{
+ $html = "
+
+
+ | Zähler |
+ Import (kWh) |
+ Export (kWh) |
+ Solarbezug (kWh) |
+ Netzbezug (kWh) |
+ Solareinspeisung (kWh) |
+ Solarverkauf (kWh) |
+ Kosten Solar (CHF) |
+ Kosten Netz (CHF) |
+ Einnahmen (CHF) |
+ Total (CHF) |
+
";
+
+ foreach ($result['data'] ?? $this->powerCostCache as $user => $meters) {
+ foreach ($meters as $m) {
+ $total = $m['cost_grid'] + $m['cost_solar'] - $m['rev_feedin'];
+
+ $html .= "
+
+ | {$m['name']} |
+ " . number_format($m['imp'], 3) . " |
+ " . number_format($m['exp'], 3) . " |
+ " . number_format($m['solar_bezug'], 3) . " |
+ " . number_format($m['netz_bezug'], 3) . " |
+ " . number_format($m['solareinspeisung'], 3) . " |
+ " . number_format($m['solarverkauf'], 3) . " |
+ " . number_format($m['cost_solar'], 2) . " |
+ " . number_format($m['cost_grid'], 2) . " |
+ " . number_format($m['rev_feedin'], 2) . " |
+ " . number_format($total, 2) . " |
+
";
+ }
+ break;
+ }
+
+ $html .= "
";
+
+ // Total in separater Tabelle
+ $html .= "
+
+
+ | Total Elektrizität: |
+ " . number_format($result['sum'], 2) . " CHF |
+
+
";
+
+ return $html;
+}
+
+/* ========================== NEBENKOSTEN – SCHÖNE TABELLE ========================== */
+
+private function FormatAdditionalTable($result)
+{
+ $html = "
+
+
+ | Zähler |
+ Typ |
+ Start |
+ Ende |
+ Zähler Start |
+ Zähler Ende |
+ Verbrauch |
+ Tarif (Rp) |
+ Kosten (CHF) |
+
+ " . $result['html'] . "
+
";
+
+ // Total
+ $html .= "
+
+
+ | Total Nebenkosten: |
+ " . number_format($result['sum'], 2) . " CHF |
+
+
";
+
+ return $html;
+}
+
+
// ====================== Stromkosten (15-Minuten, alle User) ======================
private function CalculateAllPowerCosts($powerMeters, $tariffs, $from, $to)
@@ -644,5 +706,27 @@ $html = "
}
return end($cands);
}
+ private function CollectTariffsForUser($tariffs, $types)
+{
+ $result = [];
+ $wanted = array_map('strtolower', $types);
+
+ foreach ($tariffs as $t) {
+ $type = strtolower(trim($t['unit_type'] ?? ''));
+ if (!in_array($type, $wanted)) continue;
+
+ $start = $this->toUnixTs($t['start'], false);
+ $end = $this->toUnixTs($t['end'], true);
+
+ $result[] = [
+ 'start' => $start,
+ 'end' => $end,
+ 'price' => (float)$t['price']
+ ];
+ }
+
+ return $result;
+}
+
}
?>