no message
This commit is contained in:
+45
-12
@@ -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 .= "
|
||||
<tr>
|
||||
<td>{$meter['name']}</td>
|
||||
@@ -370,11 +399,13 @@ private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type)
|
||||
<td>" . number_format($costCHF, 2) . "</td>
|
||||
</tr>";
|
||||
|
||||
$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)
|
||||
</tr>";
|
||||
}
|
||||
|
||||
IPS_LogMessage('Abrechnung', sprintf("✅ [AddMeterToPDFRow] Fertig: %.3f CHF total (%d Segmente)", $totalCost, $segIndex - 1));
|
||||
|
||||
return ['row' => $rows, 'value' => $totalCost];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user