From f637640872b9b7155cd757a3c38b99de2ba8b6fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20H=C3=A4fliger?= Date: Wed, 5 Nov 2025 08:31:13 +0100 Subject: [PATCH] no message --- Abrechnung/module.php | 57 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/Abrechnung/module.php b/Abrechnung/module.php index 2a14cbe..d7a7419 100644 --- a/Abrechnung/module.php +++ b/Abrechnung/module.php @@ -286,12 +286,14 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $totalCost = 0.0; $varId = $meter['var_consumption']; + IPS_LogMessage('Abrechnung', "🔧 [AddMeterToPDFRow] Starte Berechnung für {$meter['name']} ($type) von " . date('d.m.Y H:i', $from) . " bis " . date('d.m.Y H:i', $to)); + if (!IPS_VariableExists($varId)) { IPS_LogMessage('Abrechnung', "❌ Variable {$varId} für {$meter['name']} nicht gefunden"); return ['row' => '', 'value' => 0]; } - // 🔹 1. Tarife nach Typ filtern + // --- 1. Relevante Tarife filtern --- $filteredTariffs = array_filter($tariffs, function ($t) use ($type) { $typeNorm = strtolower(trim($type)); $tariffType = strtolower(trim($t['unit_type'] ?? '')); @@ -304,22 +306,35 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) return in_array($tariffType, $map[$typeNorm] ?? []) || $tariffType === $typeNorm; }); + IPS_LogMessage('Abrechnung', "🔹 Gefundene Tarife für Typ '$type': " . count($filteredTariffs)); + if (empty($filteredTariffs)) { - IPS_LogMessage('Abrechnung', "⚠ Keine passenden Tarife für $type gefunden"); + IPS_LogMessage('Abrechnung', "⚠ Keine passenden Tarife gefunden → alles 0 Rp"); return ['row' => '', 'value' => 0]; } - // 🔹 2. Zeitstempel konvertieren & sortieren + // --- 2. Zeitstempel normalisieren & sortieren --- foreach ($filteredTariffs as &$t) { $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']); + IPS_LogMessage('Abrechnung', sprintf( + " 🕓 Tarif: %s - %s @ %.3f Rp", + date('d.m.Y H:i', $t['start_ts']), + date('d.m.Y H:i', $t['end_ts']), + floatval($t['price']) + )); } unset($t); usort($filteredTariffs, fn($a, $b) => $a['start_ts'] <=> $b['start_ts']); + // --- 3. Iteration über Tarifabschnitte --- $current = $from; + $segIndex = 1; + while ($current < $to) { - // 🔹 Aktiven Tarif finden + IPS_LogMessage('Abrechnung', "➡️ [Segment $segIndex] Start: " . date('d.m.Y H:i', $current)); + + // Aktiven Tarif finden $active = null; foreach ($filteredTariffs as $t) { if ($t['start_ts'] <= $current && $current < $t['end_ts']) { @@ -328,13 +343,13 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) } } - // 🔹 Zeitraumgrenzen bestimmen if ($active) { $segmentEnd = min($active['end_ts'], $to); $tariffPrice = floatval($active['price']); $tariffLabel = number_format($tariffPrice, 2); + IPS_LogMessage('Abrechnung', sprintf(" ✅ Aktiver Tarif gefunden: %.3f Rp (gültig bis %s)", $tariffPrice, date('d.m.Y H:i', $active['end_ts']))); } else { - // kein Tarif → bis zum nächsten bekannten oder Abrechnungsende + // Kein aktiver Tarif gefunden → Nulltarif $nextStart = $to; foreach ($filteredTariffs as $t) { if ($t['start_ts'] > $current && $t['start_ts'] < $nextStart) { @@ -344,19 +359,33 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) $segmentEnd = min($nextStart, $to); $tariffPrice = 0.0; $tariffLabel = 'kein Tarif'; + IPS_LogMessage('Abrechnung', sprintf(" ⚠ Kein Tarif aktiv – verwende 0 Rp bis %s", date('d.m.Y H:i', $segmentEnd))); } - // Sicherheitsnetz (kein 0-Länge-Segment) - if ($segmentEnd <= $current) break; + if ($segmentEnd <= $current) { + IPS_LogMessage('Abrechnung', " ⚠ SegmentEnd <= current – Abbruch (Ende erreicht oder Tariflücke fehlerhaft)"); + break; + } - // 🔹 Verbrauch holen & Kosten berechnen + // --- 4. Werte holen --- $startVal = $this->GetValueAt($varId, $current, false); $endVal = $this->GetValueAt($varId, $segmentEnd, true); $diff = max(0, $endVal - $startVal); $costCHF = round(($tariffPrice / 100) * $diff, 2); $totalCost += $costCHF; - // 🔹 HTML-Zeile schreiben + IPS_LogMessage('Abrechnung', sprintf( + " 📊 Werte: Start=%.3f (%.s), Ende=%.3f (%.s), Verbrauch=%.3f, Tarif=%.3f Rp, Kosten=%.3f CHF", + $startVal, + date('d.m.Y H:i', $current), + $endVal, + date('d.m.Y H:i', $segmentEnd), + $diff, + $tariffPrice, + $costCHF + )); + + // --- 5. HTML-Zeile erstellen --- $rows .= " {$meter['name']} @@ -370,11 +399,13 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) " . number_format($costCHF, 2) . " "; - $current = $segmentEnd + 1; // nächster Abschnitt + $segIndex++; + $current = $segmentEnd + 1; } - // 🔹 Fallback, falls keine Zeile + // --- 6. Falls keine Zeilen --- if ($rows === '') { + IPS_LogMessage('Abrechnung', "⚠ Keine Tarifabschnitte oder Werte berechnet – Erstelle Nullzeile"); $startVal = $this->GetValueAt($varId, $from, false); $endVal = $this->GetValueAt($varId, $to, true); $diff = max(0, $endVal - $startVal); @@ -392,6 +423,8 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type) "; } + IPS_LogMessage('Abrechnung', sprintf("✅ [AddMeterToPDFRow] Fertig: %.3f CHF total (%d Segmente)", $totalCost, $segIndex - 1)); + return ['row' => $rows, 'value' => $totalCost]; }