diff --git a/Abrechnung/module.php b/Abrechnung/module.php index ec5a8fd..72a1816 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -108,126 +108,124 @@ class Abrechnung extends IPSModule // 🧱 Layout / PDF-Aufbau pro Benutzerseite // =========================================================== private function BuildUserInvoice($user, $power, $water, $tariffs, $from, $to) - { - $stromRows = ''; - $stromTotal = 0.0; - $stromTariffsUsed = []; +{ + $stromRows = ''; + $stromTotal = 0.0; + $stromTariffsUsed = []; - $nebenRows = ''; - $nebenTotal = 0.0; - $nebenTariffsUsed = []; + $nebenRows = ''; + $nebenTotal = 0.0; + $nebenTariffsUsed = []; - // ---------- Stromkosten ---------- - foreach ($power as $m) { - if ($m['user_id'] != $user['id']) continue; - $res = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, 'Strombezug'); - $stromRows .= $res['row']; - $stromTotal += $res['value']; - - foreach ($tariffs as $t) { - if (strtolower($t['unit_type']) == 'strombezug') { - $sTs = $this->toUnixTs($t['start'], false); - $eTs = $this->toUnixTs($t['end'], true); - if ($sTs && $eTs) { - $period = date('d.m.Y', $sTs) . ' - ' . date('d.m.Y', $eTs); - $stromTariffsUsed[$period] = number_format(floatval($t['price']), 2); - } - } - } - } - - // ---------- Nebenkosten ---------- - foreach ($water as $m) { - if ($m['user_id'] != $user['id']) continue; - $type = $m['meter_type'] ?? 'Warmwasser'; - $res = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, $type); - $nebenRows .= $res['row']; - $nebenTotal += $res['value']; - - foreach ($tariffs as $t) { - $u = strtolower($t['unit_type'] ?? ''); - if (in_array($u, ['warmwasser', 'kaltwasser', 'wärme'])) { - $sTs = $this->toUnixTs($t['start'], false); - $eTs = $this->toUnixTs($t['end'], true); - if ($sTs && $eTs) { - $period = date('d.m.Y', $sTs) . ' - ' . date('d.m.Y', $eTs); - $nebenTariffsUsed[$period] = number_format(floatval($t['price']), 2); - } - } - } - } - - $gesamtTotal = $stromTotal + $nebenTotal; - $tableStyle = "border-collapse:collapse;width:100%;font-size:8px;"; - $cellStyle = "border:0.3px solid #999;padding:2px;"; - - $html = " -

Rechnung für {$user['name']}

-

{$user['address']}
{$user['city']}

-

Abrechnungszeitraum: " . date('d.m.Y', $from) . " – " . date('d.m.Y', $to) . "

- -

âš¡ Stromkosten

- - - - - - - - - - - - - {$stromRows} - - - - -
ZählerTypStartzeitEndzeitStartEndeVerbrauchTarif (Rp)Kosten (CHF)
Total Stromkosten:" . number_format($stromTotal, 2) . "
"; - - if (!empty($stromTariffsUsed)) { - $html .= "

Angewendete Tarife:
"; - foreach ($stromTariffsUsed as $period => $price) { - $html .= "  {$period}: {$price} Rp/kWh
"; - } - $html .= "

"; - } - - $html .= " -

💧 Nebenkosten (Wasser & Wärme)

- - - - - - - - - - - - - {$nebenRows} - - - - -
ZählerTypStartzeitEndzeitStartEndeVerbrauchTarif (Rp)Kosten (CHF)
Total Nebenkosten:" . number_format($nebenTotal, 2) . "
"; - - if (!empty($nebenTariffsUsed)) { - $html .= "

Angewendete Tarife:
"; - foreach ($nebenTariffsUsed as $period => $price) { - $html .= "  {$period}: {$price} Rp/m³ oder kWh
"; - } - $html .= "

"; - } - - $html .= "

💰 Gesamttotal: " . number_format($gesamtTotal, 2) . " CHF

"; - - return $html; + // ---------- Stromkosten ---------- + foreach ($power as $m) { + if ($m['user_id'] != $user['id']) continue; + $res = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, 'Strombezug'); + $stromRows .= $res['row']; + $stromTotal += $res['value']; } + // ---------- Nebenkosten ---------- + foreach ($water as $m) { + if ($m['user_id'] != $user['id']) continue; + $type = $m['meter_type'] ?? 'Warmwasser'; + $res = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, $type); + $nebenRows .= $res['row']; + $nebenTotal += $res['value']; + } + + // ---------- Alle Tarife gruppieren ---------- + $tariffGroups = []; + foreach ($tariffs as $t) { + $type = ucfirst(strtolower($t['unit_type'] ?? 'Unbekannt')); + $sTs = $this->toUnixTs($t['start'], false); + $eTs = $this->toUnixTs($t['end'], true); + if ($sTs && $eTs) { + $period = date('d.m.Y', $sTs) . ' – ' . date('d.m.Y', $eTs); + $price = number_format(floatval($t['price']), 2); + $tariffGroups[$type][] = "{$period}: {$price} Rp"; + } + } + + // ---------- Gesamtsummen ---------- + $gesamtTotal = $stromTotal + $nebenTotal; + + // ---------- Tabellenstil ---------- + $tableStyle = "border-collapse:collapse;width:100%;font-size:8px;"; + $cellStyle = "border:0.3px solid #bbb;padding:3px;vertical-align:middle;"; + + // ---------- Kopfbereich ---------- + $html = " +

Rechnung für {$user['name']}

+

{$user['address']}
{$user['city']}

+

Abrechnungszeitraum: " . date('d.m.Y', $from) . " – " . date('d.m.Y', $to) . "

"; + + // ---------- Stromkosten ---------- + $html .= " +

âš¡ Stromkosten

+ + + + + + + + + + + + + {$stromRows} + + + + +
ZählerTypStartzeitEndzeitStartEndeVerbrauchTarif (Rp)Kosten (CHF)
Total Stromkosten:" . number_format($stromTotal, 2) . "
"; + + // ---------- Nebenkosten ---------- + $html .= " +

💧 Nebenkosten (Wasser & Wärme)

+ + + + + + + + + + + + + {$nebenRows} + + + + +
ZählerTypStartzeitEndzeitStartEndeVerbrauchTarif (Rp)Kosten (CHF)
Total Nebenkosten:" . number_format($nebenTotal, 2) . "
"; + + // ---------- Tarife (alle Typen) ---------- + if (!empty($tariffGroups)) { + $html .= "

📋 Angewendete Tarife

"; + foreach ($tariffGroups as $type => $entries) { + $html .= ""; + foreach ($entries as $line) { + $html .= ""; + } + } + $html .= "
{$type}
{$line}
"; + } + + // ---------- Gesamttotal ---------- + $html .= " +

+ 💰 Gesamttotal: " . number_format($gesamtTotal, 2) . " CHF +

"; + + return $html; +} + + // =========================================================== // 🧮 Datumskonvertierung – robust für JSON, String, Timestamp // =========================================================== @@ -290,6 +288,7 @@ class Abrechnung extends IPSModule return floatval(GetValue($varId)); } + private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) { $rows = '';