diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 4bf92dd..591341e 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -241,42 +241,38 @@ private function GetValueAt(int $varId, int $timestamp, bool $nearestAfter = fal private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) { - $startVal = $this->GetValueAt($meter['var_consumption'], $from, false); // letzter Wert ≤ Start - $endVal = $this->GetValueAt($meter['var_consumption'], $to, true); // erster Wert ≥ Ende + $startValTotal = $this->GetValueAt($meter['var_consumption'], $from, false); // letzter Wert ≤ Start + $endValTotal = $this->GetValueAt($meter['var_consumption'], $to, true); // erster Wert ≥ Ende + IPS_LogMessage('Abrechnung', "Meter {$meter['name']} ($type) von " . date('d.m.Y H:i', $from) . " bis " . date('d.m.Y H:i', $to) . ": start=$startValTotal, end=$endValTotal"); - IPS_LogMessage('Abrechnung', "Meter {$meter['name']} ($type) von " . date('d.m.Y H:i', $from) . " bis " . date('d.m.Y H:i', $to) . ": start=$startVal, end=$endVal"); + if ($startValTotal === null || $endValTotal === null) return ['row' => '', 'value' => 0]; - if ($startVal === null || $endVal === null) return ['row' => '', 'value' => 0]; - - $totalDiff = max(0, $endVal - $startVal); + $totalDiff = max(0, $endValTotal - $startValTotal); if ($totalDiff <= 0) return ['row' => '', 'value' => 0]; $rows = ''; $totalCost = 0.0; - // Alle Tarife dieses Typs prüfen foreach ($tariffs as $t) { if (strtolower($t['unit_type']) != strtolower($type)) continue; $tariffStart = strtotime($t['start']); $tariffEnd = strtotime($t['end']); - // Überschneidung mit Abrechnungszeitraum prüfen - if ($tariffEnd < $from || $tariffStart > $to) continue; - - // Überschneidung bestimmen + // Überschneidung mit Abrechnungszeitraum $sectionStart = max($from, $tariffStart); $sectionEnd = min($to, $tariffEnd); - $sectionDuration = $sectionEnd - $sectionStart; - $totalDuration = $to - $from; + if ($sectionEnd <= $sectionStart) continue; - if ($sectionDuration <= 0) continue; - - // Verbrauch anteilig nach Dauer - $sectionFraction = $sectionDuration / $totalDuration; + // Verbrauch anteilig + $sectionFraction = ($sectionEnd - $sectionStart) / ($to - $from); $sectionDiff = $totalDiff * $sectionFraction; + // Start-/Endwert für diese Tarifzeit berechnen + $sectionStartVal = $startValTotal + $totalDiff * (($sectionStart - $from) / ($to - $from)); + $sectionEndVal = $sectionStartVal + $sectionDiff; + $tariffRp = floatval($t['price']); $costCHF = ($tariffRp / 100) * $sectionDiff; @@ -286,6 +282,8 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $type " . date('d.m.Y H:i', $sectionStart) . " " . date('d.m.Y H:i', $sectionEnd) . " + " . number_format($sectionStartVal, 2) . " + " . number_format($sectionEndVal, 2) . " " . number_format($sectionDiff, 2) . " " . number_format($tariffRp, 2) . " " . number_format($costCHF, 2) . " @@ -302,6 +300,8 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $type " . date('d.m.Y H:i', $from) . " " . date('d.m.Y H:i', $to) . " + " . number_format($startValTotal, 2) . " + " . number_format($endValTotal, 2) . " " . number_format($totalDiff, 2) . " 0 0.00 @@ -312,4 +312,5 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } + } \ No newline at end of file