diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 42aca57..354effe 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -254,14 +254,14 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) { $rows = ''; $totalCost = 0.0; - $varId = $meter['var_consumption']; + $varId = $meter['var_consumption']; if (!IPS_VariableExists($varId)) { IPS_LogMessage('Abrechnung', "❌ Variable {$varId} für {$meter['name']} nicht gefunden"); return ['row' => '', 'value' => 0]; } - // --- Einheitstyp tolerant abgleichen --- + // 🧩 Einheitstyp tolerant abgleichen $filteredTariffs = []; foreach ($tariffs as $t) { $tariffType = strtolower(trim($t['unit_type'] ?? '')); @@ -280,8 +280,16 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } IPS_LogMessage('Abrechnung', "🔍 Suche Tarife für Typ '$type': gefunden " . count($filteredTariffs) . " Treffer"); + foreach ($filteredTariffs as $t) { + IPS_LogMessage('Abrechnung', " Tarif '{$t['unit_type']}' von " . json_encode($t['start']) . " bis " . json_encode($t['end']) . " | {$t['price']} Rp"); + } - // --- Datumsfelder aus Symcon-Formular umwandeln --- + if (empty($filteredTariffs)) { + IPS_LogMessage('Abrechnung', "⚠ Keine passenden Tarife für $type gefunden"); + return ['row' => '', 'value' => 0]; + } + + // 🔹 Datumsfelder sicher umwandeln foreach ($filteredTariffs as &$t) { if (is_array($t['start'])) { $t['start_ts'] = mktime(0, 0, 0, $t['start']['month'], $t['start']['day'], $t['start']['year']); @@ -290,36 +298,45 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } if (is_array($t['end'])) { - // Ende immer auf 23:59:59 setzen, sonst endet der Tarif zu früh $t['end_ts'] = mktime(23, 59, 59, $t['end']['month'], $t['end']['day'], $t['end']['year']); } else { $t['end_ts'] = strtotime($t['end'] . ' 23:59:59'); } - IPS_LogMessage('Abrechnung', "✅ Tarif '{$t['unit_type']}' von " . date('d.m.Y H:i', $t['start_ts']) . " bis " . date('d.m.Y H:i', $t['end_ts']) . " | {$t['price']} Rp"); + if ($t['start_ts'] === false || $t['end_ts'] === false) { + IPS_LogMessage('Abrechnung', "❌ Ungültiges Tarifdatum nach Umwandlung: " . json_encode($t)); + } else { + IPS_LogMessage('Abrechnung', "✅ Tarifzeitraum erkannt: " . date('d.m.Y', $t['start_ts']) . " - " . date('d.m.Y', $t['end_ts'])); + } } unset($t); - // Sortieren + // Nach Startzeit sortieren usort($filteredTariffs, fn($a, $b) => $a['start_ts'] <=> $b['start_ts']); $current = $from; + while ($current < $to) { $activeTariff = null; $segmentStart = $current; $segmentEnd = $to; - // Tarif finden, der diesen Zeitpunkt abdeckt + // --- passenden Tarif finden (einfach & robust) --- + $activeTariff = null; foreach ($filteredTariffs as $t) { - if ($t['end_ts'] > $segmentStart && $t['start_ts'] <= $segmentStart) { + if ($t['start_ts'] <= $segmentStart && $segmentStart <= $t['end_ts']) { $activeTariff = $t; - $segmentEnd = min($t['end_ts'], $to); break; } } - if ($activeTariff === null) { - // kein Tarif aktiv – nutze Nulltarif bis zum nächsten Start + if ($activeTariff) { + // Tarif aktiv: Segment geht bis Tarifende oder Rechnungsende + $segmentEnd = min($activeTariff['end_ts'], $to); + $tariffPrice = floatval($activeTariff['price']); + $tariffLabel = number_format($tariffPrice, 2); + } else { + // Kein Tarif aktiv: bis zum nächsten Tarifstart (oder Rechnungsende) mit 0 Rp $nextStart = $to; foreach ($filteredTariffs as $t) { if ($t['start_ts'] > $segmentStart && $t['start_ts'] < $nextStart) { @@ -328,11 +345,11 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } $segmentEnd = min($nextStart, $to); $tariffPrice = 0.0; - } else { - $tariffPrice = floatval($activeTariff['price']); + $tariffLabel = 'kein Tarif'; } - // --- Archivdaten auslesen --- + + // Archivwerte lesen $startVal = $this->GetValueAt($varId, $segmentStart, false); $endVal = $this->GetValueAt($varId, $segmentEnd, true); @@ -345,9 +362,8 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $diff = max(0, $endVal - $startVal); $costCHF = ($tariffPrice / 100) * $diff; - IPS_LogMessage('Abrechnung', "→ {$meter['name']} ($type): " . date('d.m.Y H:i', $segmentStart) . " bis " . date('d.m.Y H:i', $segmentEnd) . " | Tarif {$tariffPrice} Rp | Verbrauch {$diff}"); + 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}"); - // --- Tabellenzeile hinzufügen --- $rows .= "