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:


"; - } - - // ========================= 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 = " + + + + + + + + + + + + + + "; + + foreach ($result['data'] ?? $this->powerCostCache as $user => $meters) { + foreach ($meters as $m) { + $total = $m['cost_grid'] + $m['cost_solar'] - $m['rev_feedin']; + + $html .= " + + + + + + + + + + + + + "; + } + break; + } + + $html .= "
ZählerImport (kWh)Export (kWh)Solarbezug (kWh)Netzbezug (kWh)Solareinspeisung (kWh)Solarverkauf (kWh)Kosten Solar (CHF)Kosten Netz (CHF)Einnahmen (CHF)Total (CHF)
{$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) . "
"; + + // 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 = " + + + + + + + + + + + + + " . $result['html'] . " +
ZählerTypStartEndeZähler StartZähler EndeVerbrauchTarif (Rp)Kosten (CHF)
"; + + // 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; +} + } ?>