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:


"; + } + + // ========================= 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 = " - - - - - - - - - - - - - "; +$html = " +
ZählerImport (kWh)Export (kWh)Solarbezug (kWh)Netzbezug (kWh)Solareinspeisung (kWh)Solarverkauf (kWh)Kosten Solar (CHF)Kosten Netz (CHF)Ertrag Einspeisung (CHF)Summe (CHF)
+ + + + + + + + + + + + +"; + if (empty($this->powerCostCache) || !isset($this->powerCostCache[$userId])) { $html .= "
ZählerImportExportSolarbez.Netzbez.Solar Eins.Solarverk.Solar CHFNetz CHFEinspeis. CHFTotal CHF
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 = " - - - - "; +$html = " +
ZählerTypStartEndeZähler StartZähler EndeVerbrauchTarif (Rp)Kosten (CHF)
+ + + + + + + + + + +"; + $total = 0.0; $usedTariffs = []; @@ -343,8 +408,9 @@ class Abrechnung extends IPSModule } $html .= " - - + + +
ZählerTypStartEndeStand StartStand EndeVerbrauchTarifKosten CHF
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; +} + } ?>