diff --git a/Abrechnung/module.php b/Abrechnung/module.php
index 6679f8f..8d12f70 100644
--- a/Abrechnung/module.php
+++ b/Abrechnung/module.php
@@ -105,30 +105,84 @@ class Abrechnung extends IPSModule
return $pdf->Output('Abrechnung.pdf', 'S');
}
- private function BuildUserInvoice($pdf, $user, $power, $water, $tariffs, $from, $to)
- {
- $pdf->AddPage();
+private function BuildUserInvoice($pdf, $user, $power, $water, $tariffs, $from, $to)
+{
+ $pdf->AddPage();
- $html = "
-
Rechnung für {$user['name']}
- {$user['address']}
{$user['city']}
- Zeitraum: " . date('d.m.Y', $from) . " – " . date('d.m.Y', $to) . "
";
+ // Kopfbereich
+ $html = "
+ Elektro- und Nebenkostenabrechnung
+
+
+
+
+ Zählpunkte: ";
- // Stromkosten (aus globaler Berechnung)
- $powerResult = $this->GetCalculatedPowerCosts($user['id']);
- $html .= "⚡ Stromkosten" . $powerResult['html'];
- $totalPower = $powerResult['sum'];
-
- // Nebenkosten (Wasser/Wärme) – einfache Differenz von Beginn bis Ende
- $additionalResult = $this->CalculateAdditionalCosts($water, $tariffs, $user['id'], $from, $to);
- $html .= "💧 Nebenkosten (Wasser/Wärme)" . $additionalResult['html'];
- $totalAdditional = $additionalResult['sum'];
-
- $grandTotal = $totalPower + $totalAdditional;
- $html .= "Gesamttotal: " . number_format($grandTotal, 2) . " CHF";
-
- $pdf->writeHTML($html, true, false, true, false, '');
+ // Alle Zählerpunkte des Users auflisten
+ foreach ($power as $m) {
+ if ($m['user_id'] == $user['id']) {
+ $html .= htmlspecialchars($m['name']) . " ";
+ }
}
+ foreach ($water as $m) {
+ if ($m['user_id'] == $user['id']) {
+ $html .= htmlspecialchars($m['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
";
+
+ $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
";
+
+ $additionalResult = $this->CalculateAdditionalCosts($water, $tariffs, $user['id'], $from, $to);
+ $html .= $additionalResult['html'];
+ $totalAdditional = $additionalResult['sum'];
+
+ // ========================= Gesamttotal =========================
+ $grandTotal = $totalPower + $totalAdditional;
+ $html .= "
+
+ Gesamttotal: " . number_format($grandTotal, 2) . " CHF
+
+ ";
+
+ $pdf->writeHTML($html, true, false, true, false, '');
+}
// ====================== Stromkosten (15-Minuten, alle User) ======================
@@ -269,20 +323,22 @@ class Abrechnung extends IPSModule
private function GetCalculatedPowerCosts($userId)
{
- $html = "
-
- | Zähler |
- Import (kWh) |
- Export (kWh) |
- Solarbezug (kWh) |
- Netzbezug (kWh) |
- Solareinspeisung (kWh) |
- Solarverkauf (kWh) |
- Kosten Solar (CHF) |
- Kosten Netz (CHF) |
- Ertrag Einspeisung (CHF) |
- Summe (CHF) |
-
";
+$html = "
+
+
+ | Zähler |
+ Import |
+ Export |
+ Solarbez. |
+ Netzbez. |
+ Solar Eins. |
+ Solarverk. |
+ Solar CHF |
+ Netz CHF |
+ Einspeis. CHF |
+ Total CHF |
+
";
+
if (empty($this->powerCostCache) || !isset($this->powerCostCache[$userId])) {
$html .= "| Keine Stromzähler für diesen Benutzer |
";
@@ -306,13 +362,13 @@ class Abrechnung extends IPSModule
" . number_format($a['cost_solar'], 2) . " |
" . number_format($a['cost_grid'], 2) . " |
" . number_format($a['rev_feedin'], 2) . " |
- " . number_format($subtotal, 2) . " |
+ " . number_format($subtotal, 2) . " CHF |
";
}
$html .= "
- | Total Stromkosten: |
- " . number_format($sum, 2) . " |
+ Total Elektrizität: |
+ " . number_format($sum, 2) . " CHF |
";
return ['html' => $html, 'sum' => $sum];
@@ -322,11 +378,20 @@ class Abrechnung extends IPSModule
private function CalculateAdditionalCosts($waterMeters, $tariffs, $userId, $from, $to)
{
- $html = "
-
- | Zähler | Typ | Start | Ende |
- Zähler Start | Zähler Ende | Verbrauch | Tarif (Rp) | Kosten (CHF) |
-
";
+$html = "
+
+
+ | Zähler |
+ Typ |
+ Start |
+ Ende |
+ Stand Start |
+ Stand Ende |
+ Verbrauch |
+ Tarif |
+ Kosten CHF |
+
";
+
$total = 0.0;
$usedTariffs = [];
@@ -343,8 +408,9 @@ class Abrechnung extends IPSModule
}
$html .= "
- | Total Nebenkosten: |
- " . number_format($total, 2) . " |
+ Total Nebenkosten: |
+ " . number_format($total, 2) . " CHF |
+
";
if (!empty($usedTariffs)) {
@@ -578,5 +644,27 @@ class Abrechnung extends IPSModule
}
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;
+}
+
}
?>