no message

This commit is contained in:
2025-11-06 15:07:53 +01:00
parent 00e9e12105
commit 0b685261a0
2 changed files with 20 additions and 51 deletions

View File

@@ -104,7 +104,7 @@
"caption": "Einheit",
"name": "unit_type",
"width": "20%",
"add": "Strombezug",
"add": "Netztarif",
"edit": {
"type": "Select",
"options": [

View File

@@ -141,6 +141,8 @@ class Abrechnung extends IPSModule
private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to)
{
IPS_LogMessage('Abrechnung', "⚡ Starte Stromkostenberechnung von " . date('d.m.Y H:i', $from) . " bis " . date('d.m.Y H:i', $to));
$html = "<table border='1' cellspacing='0' cellpadding='3' width='100%' style='font-size:8px;'>
<tr style='background-color:#f0f0f0;'>
<th>Zähler</th>
@@ -158,9 +160,8 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
// Initialisierung
$acc = [];
// Benutzerzähler laden
$meters = [];
foreach ($powerMeters as $m) {
if ($m['user_id'] != $userId) continue;
$name = $m['name'];
@@ -179,6 +180,7 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
}
if (empty($meters)) {
IPS_LogMessage('Abrechnung', "⚠️ Keine Stromzähler für Benutzer $userId gefunden.");
$html .= "<tr><td colspan='11' align='center'>Keine Stromzähler für diesen Benutzer</td></tr></table><br>";
return ['html'=>$html, 'sum'=>0.0];
}
@@ -187,12 +189,16 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
for ($ts = $from; $ts < $to; $ts += 900) {
$slotEnd = min($to, $ts + 900);
// Tarife für diesen Zeitraum holen
// Tarife abrufen
$pGrid = $this->getTariffPriceAt($tariffs, ['Netztarif'], $ts);
$pSolar = $this->getTariffPriceAt($tariffs, ['Solartarif'], $ts);
$pFeed = $this->getTariffPriceAt($tariffs, ['Einspeisetarif'], $ts);
// Deltas
IPS_LogMessage('Abrechnung', sprintf("⏱ %s %s | Tarife: Netz=%.3f Rp, Solar=%.3f Rp, Einspeise=%.3f Rp",
date('d.m.Y H:i', $ts), date('H:i', $slotEnd),
$pGrid ?? 0, $pSolar ?? 0, $pFeed ?? 0
));
$impTotal = 0.0;
$expTotal = 0.0;
$slot = [];
@@ -211,6 +217,8 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
$slot[$name] = ['imp'=>$impDelta, 'exp'=>$expDelta];
$impTotal += $impDelta;
$expTotal += $expDelta;
IPS_LogMessage('Abrechnung', sprintf(" → %s: imp=%.4f, exp=%.4f", $name, $impDelta, $expDelta));
}
if ($impTotal <= 0 && $expTotal <= 0) continue;
@@ -223,7 +231,6 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
$imp = $slot[$name]['imp'];
$exp = $slot[$name]['exp'];
// Mengen
$acc[$name]['imp'] += $imp;
$acc[$name]['exp'] += $exp;
@@ -232,10 +239,11 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
$acc[$name]['solareinspeisung']+= (1 - $ratio) * $exp;
$acc[$name]['solarverkauf'] += $ratio * $exp;
// Kosten / Erträge
if ($pSolar !== null) $acc[$name]['cost_solar'] += ($imp * $pSolar) / 100;
if ($pFeed !== null) $acc[$name]['rev_feedin'] += ((1 - $ratio) * $exp * $pFeed) / 100;
}
IPS_LogMessage('Abrechnung', sprintf(" ⚙️ Fall 1 (imp<=exp): ratio=%.3f", $ratio));
}
// ===== Fall 2: import > export =====
@@ -257,10 +265,12 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
if ($pSolar !== null) $acc[$name]['cost_solar'] += ($ratio * $imp * $pSolar) / 100;
if ($pFeed !== null) $acc[$name]['rev_feedin'] += ($exp * $pFeed) / 100;
}
IPS_LogMessage('Abrechnung', sprintf(" ⚙️ Fall 2 (imp>exp): ratio=%.3f", $ratio));
}
}
// Ausgabe
// Ausgabe erzeugen
$grand = 0.0;
foreach ($acc as $name => $v) {
$sum = $v['cost_solar'] + $v['cost_grid'] - $v['rev_feedin'];
@@ -286,52 +296,11 @@ private function CalculatePowerCosts($powerMeters, $tariffs, $userId, $from, $to
<td align='right'>" . number_format($grand, 2) . "</td>
</tr></table><br>";
IPS_LogMessage('Abrechnung', sprintf("✅ Stromkosten fertig: %.2f CHF total", $grand));
return ['html'=>$html, 'sum'=>$grand];
}
// ====================== Nebenkosten ======================
private function CalculateAdditionalCosts($waterMeters, $tariffs, $userId, $from, $to)
{
$html = "<table border='1' cellspacing='0' cellpadding='3' width='100%' style='font-size:8px;'>
<tr style='background-color:#f0f0f0;'>
<th>Zähler</th><th>Typ</th><th>Start</th><th>Ende</th>
<th>Zähler Start</th><th>Zähler Ende</th><th>Verbrauch</th><th>Tarif (Rp)</th><th>Kosten (CHF)</th>
</tr>";
$total = 0.0;
$usedTariffs = [];
foreach ($waterMeters as $m) {
if ($m['user_id'] != $userId) continue;
$type = $m['meter_type'] ?? 'Warmwasser';
$cost = $this->AddMeterToPDFRow($m, $tariffs, $from, $to, $type);
$html .= $cost['row'];
$total += $cost['value'];
$usedTariffs = array_merge($usedTariffs, $cost['tariffs']);
}
$html .= "<tr style='background-color:#f9f9f9; font-weight:bold;'>
<td colspan='8' align='right'>Total Nebenkosten:</td>
<td align='right'>" . number_format($total, 2) . "</td>
</tr></table><br>";
// 👇 Tarifliste anhängen
if (!empty($usedTariffs)) {
$html .= "<p><strong>Angewendete Nebenkostentarife:</strong></p><ul>";
foreach ($usedTariffs as $t) {
$html .= "<li>" . date('d.m.Y', $t['start']) . " " . date('d.m.Y', $t['end']) . ": " .
number_format($t['price'], 2) . " Rp</li>";
}
$html .= "</ul><br>";
}
return ['html' => $html, 'sum' => $total];
}
// ====================== Kernberechnung ======================
private function AddMeterToPDFRow($meter, $tariffs, $from, $to, $type)