From 74deca22fb6b61d9a1d05aa6e550c9168e8323f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Wed, 5 Nov 2025 07:33:44 +0100 Subject: [PATCH] no message --- Abrechnung/module.php | 70 +++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/Abrechnung/module.php b/Abrechnung/module.php index c29b340..7c75168 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -252,64 +252,81 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) return ['row' => '', 'value' => 0]; } - // Filtere Tarife für diesen Typ (z. B. "Strombezug" oder "Warmwasser") - $tariffs = array_filter($tariffs, function ($t) use ($type) { + // Tarife für den passenden Typ herausfiltern + $filteredTariffs = array_filter($tariffs, function ($t) use ($type) { return strtolower($t['unit_type']) == strtolower($type); }); - if (empty($tariffs)) { + if (empty($filteredTariffs)) { IPS_LogMessage('Abrechnung', "⚠ Keine passenden Tarife für $type gefunden"); return ['row' => '', 'value' => 0]; } - // Sortiere Tarife chronologisch - usort($tariffs, function ($a, $b) { + // Nach Startdatum sortieren + usort($filteredTariffs, function ($a, $b) { return strtotime($a['start']) <=> strtotime($b['start']); }); $current = $from; + while ($current < $to) { - // passenden Tarif für aktuellen Zeitpunkt finden $activeTariff = null; - foreach ($tariffs as $t) { + $segmentStart = $current; + $segmentEnd = $to; + + // Passenden Tarif finden, der den aktuellen Zeitpunkt abdeckt + foreach ($filteredTariffs as $t) { $tariffStart = strtotime($t['start']); $tariffEnd = strtotime($t['end']); - if ($current >= $tariffStart && $current < $tariffEnd) { + + // Tarif ist aktiv, wenn er sich mit dem Abrechnungszeitraum überschneidet + if ($tariffEnd > $segmentStart && $tariffStart < $to) { + if ($tariffStart > $segmentStart) { + // Tarif beginnt später – setze Ende bis Tarifbeginn + $segmentEnd = min($tariffStart, $to); + $activeTariff = null; + break; + } + + // Tarif deckt diesen Bereich ab + $segmentEnd = min($tariffEnd, $to); $activeTariff = $t; break; } } - // wenn kein aktiver Tarif gefunden → Nulltarif bis nächster Start oder Rechnungsende + // Wenn kein Tarif aktiv ist, dann Nulltarif bis zum nächsten bekannten Start if ($activeTariff === null) { - $nextTariffStart = $to; - foreach ($tariffs as $t) { + $nextStart = $to; + foreach ($filteredTariffs as $t) { $ts = strtotime($t['start']); - if ($ts > $current && $ts < $nextTariffStart) { - $nextTariffStart = $ts; + if ($ts > $segmentStart && $ts < $nextStart) { + $nextStart = $ts; } } - $segmentStart = $current; - $segmentEnd = min($nextTariffStart, $to); - $segmentTariff = 0.0; + $segmentEnd = min($nextStart, $to); + $tariffPrice = 0.0; + $tariffLabel = 'kein Tarif'; } else { - $segmentStart = $current; - $segmentEnd = min(strtotime($activeTariff['end']), $to); - $segmentTariff = floatval($activeTariff['price']); + $tariffPrice = floatval($activeTariff['price']); + $tariffLabel = number_format($tariffPrice, 2); } - // Zählerstände direkt aus Archiv + // Archivwerte holen $startVal = $this->GetValueAt($varId, $segmentStart, false); $endVal = $this->GetValueAt($varId, $segmentEnd, true); if ($startVal === null || $endVal === null) { - IPS_LogMessage('Abrechnung', "⚠ Keine Werte im Archiv gefunden für {$meter['name']} ($type)"); - $current = $segmentEnd; + IPS_LogMessage('Abrechnung', "⚠ Keine Archivwerte für {$meter['name']} ($type) im Zeitraum " . date('d.m.Y H:i', $segmentStart) . " - " . date('d.m.Y H:i', $segmentEnd)); + $current = $segmentEnd + 1; continue; } $diff = max(0, $endVal - $startVal); - $costCHF = ($segmentTariff / 100) * $diff; + $costCHF = ($tariffPrice / 100) * $diff; + + // Log und Zeile schreiben + IPS_LogMessage('Abrechnung', "→ {$meter['name']} ($type): " . date('d.m.Y H:i', $segmentStart) . " bis " . date('d.m.Y H:i', $segmentEnd) . " | Tarif {$tariffLabel} Rp | Verbrauch {$diff}"); $rows .= " @@ -320,19 +337,20 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) " . number_format($startVal, 2) . " " . number_format($endVal, 2) . " " . number_format($diff, 2) . " - " . number_format($segmentTariff, 2) . " + " . number_format($tariffPrice, 2) . " " . number_format($costCHF, 2) . " "; $totalCost += $costCHF; - $current = $segmentEnd; + $current = $segmentEnd + 1; } + // Falls gar keine Zeilen zustande kommen if ($rows == '') { - // Falls keine Tarifzeile ermittelt wurde $startVal = $this->GetValueAt($varId, $from, false); $endVal = $this->GetValueAt($varId, $to, true); $diff = max(0, $endVal - $startVal); + $rows .= " {$meter['name']}