diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 0496c51..06e636f 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -306,28 +306,27 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) return ['row' => '', 'value' => 0]; } - // 2️⃣ Zeitstempel konvertieren und sortieren - foreach ($filteredTariffs as &$t) {// --- Fix: falls Start/End als verschachteltes JSON vorliegen --- + // 2️⃣ Zeitstempel konvertieren, JSON-Objekte erkennen & sortieren + foreach ($filteredTariffs as &$t) { + // JSON-Fix: Start/Ende evtl. verschachtelt if (is_string($t['start']) && str_starts_with(trim($t['start']), '{')) { - $startObj = json_decode($t['start'], true); - if (is_array($startObj)) { - $t['start'] = sprintf('%04d-%02d-%02d 00:00:00', $startObj['year'], $startObj['month'], $startObj['day']); + $s = json_decode($t['start'], true); + if (is_array($s)) { + $t['start'] = sprintf('%04d-%02d-%02d 00:00:00', $s['year'], $s['month'], $s['day']); } } if (is_string($t['end']) && str_starts_with(trim($t['end']), '{')) { - $endObj = json_decode($t['end'], true); - if (is_array($endObj)) { - $t['end'] = sprintf('%04d-%02d-%02d 23:59:59', $endObj['year'], $endObj['month'], $endObj['day']); + $e = json_decode($t['end'], true); + if (is_array($e)) { + $t['end'] = sprintf('%04d-%02d-%02d 23:59:59', $e['year'], $e['month'], $e['day']); } } - // --- danach wie bisher --- $t['start_ts'] = is_numeric($t['start']) ? intval($t['start']) : strtotime($t['start']); $t['end_ts'] = is_numeric($t['end']) ? intval($t['end']) : strtotime($t['end']); - if (!$t['start_ts'] || !$t['end_ts']) { - IPS_LogMessage('Abrechnung', "⚠ Ungültiger Tarifzeitraum in Tarifdefinition: " . json_encode($t)); + IPS_LogMessage('Abrechnung', "⚠ Ungültiger Tarifzeitraum: " . json_encode($t)); } else { IPS_LogMessage('Abrechnung', sprintf( " 🕓 Tarif gültig von %s bis %s @ %.3f Rp", @@ -338,28 +337,26 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } } unset($t); - usort($filteredTariffs, fn($a, $b) => $a['start_ts'] <=> $b['start_ts']); - // 3️⃣ Abrechnungslogik starten + // 3️⃣ Abrechnungslogik $currentStart = $from; $segmentIndex = 1; while ($currentStart < $to) { IPS_LogMessage('Abrechnung', "➡️ Segment {$segmentIndex} Startzeit: " . date('d.m.Y H:i', $currentStart)); - // Aktiven Tarif bestimmen + // 🔹 Aktiven Tarif bestimmen (FIX: <= auch am Ende erlaubt) $activeTariff = null; foreach ($filteredTariffs as $t) { $startTs = intval($t['start_ts']); $endTs = intval($t['end_ts']); - if ($startTs === 0 || $endTs === 0) continue; - if ($startTs <= $currentStart && $currentStart < $endTs) { + if ($startTs <= $currentStart && $currentStart <= $endTs) { $activeTariff = $t; IPS_LogMessage('Abrechnung', sprintf( - " ✅ Aktiver Tarif gefunden: %.2f Rp (gültig %s → %s)", + " ✅ Tarif erkannt: %.2f Rp gültig %s → %s", floatval($t['price']), date('d.m.Y H:i', $startTs), date('d.m.Y H:i', $endTs) @@ -368,6 +365,7 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } } + // 🔹 Falls kein aktiver Tarif → 0 Rp if (!$activeTariff) { IPS_LogMessage('Abrechnung', "⚠ Kein Tarif aktiv bei " . date('d.m.Y H:i', $currentStart) . " → 0 Rp"); $activeTariff = [ @@ -382,23 +380,21 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $tariffPrice = floatval($activeTariff['price']); $tariffLabel = number_format($tariffPrice, 2, ',', ''); - // Archivwerte abrufen + // 🔹 Start- & Endwerte aus Archiv $startValue = $this->GetValueAt($varId, $currentStart, true); if ($startValue === null) { IPS_LogMessage('Abrechnung', "⚠ Kein Startwert für " . date('d.m.Y H:i', $currentStart)); break; } - // Wenn Tarif endet vor Rechnungsende → Segment bis Tarifende $segmentEnd = ($tariffEnd < $to) ? $tariffEnd : $to; - $endValue = $this->GetValueAt($varId, $segmentEnd, true); if ($endValue === null) { IPS_LogMessage('Abrechnung', "⚠ Kein Endwert für " . date('d.m.Y H:i', $segmentEnd)); break; } - // Verbrauch und Kosten + // 🔹 Verbrauch & Kosten $verbrauch = max(0, $endValue - $startValue); $kosten = round(($tariffPrice / 100) * $verbrauch, 2); $totalCost += $kosten; @@ -408,7 +404,7 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $segmentIndex, $startValue, $endValue, $verbrauch, $tariffPrice, $kosten )); - // Tabellenzeile + // 🔹 Tabellenzeile $rows .= "