This commit is contained in:
+32
-14
@@ -128,7 +128,8 @@ final class ManagerRegler
|
||||
}
|
||||
|
||||
$festwert = self::istFestwert($daten['Leistungswerte_W']);
|
||||
if ($festwert) {
|
||||
$festgehalten = !$daten['AenderungMoeglich'];
|
||||
if ($festwert || $festgehalten) {
|
||||
$nichtSteuerbar += $leistung;
|
||||
}
|
||||
|
||||
@@ -144,6 +145,8 @@ final class ManagerRegler
|
||||
'Energiegruppe' => (int) round((float) $energie / 2000.0),
|
||||
'Leistungswerte_W' => $daten['Leistungswerte_W'],
|
||||
'Festwert' => $festwert,
|
||||
'Festgehalten' => $festgehalten,
|
||||
'Sollwert' => self::angenommenerSollwert($daten),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -160,6 +163,7 @@ final class ManagerRegler
|
||||
});
|
||||
|
||||
$verteilbudget = (int) round($aktuelleLeistung + $zielnetzleistung - $netzleistung);
|
||||
$positiveRichtung = $verteilbudget - $nichtSteuerbar >= 0;
|
||||
$sollwerte = [];
|
||||
$ausgangssumme = 0;
|
||||
foreach ($steuerbar as $eintrag) {
|
||||
@@ -169,26 +173,41 @@ final class ManagerRegler
|
||||
);
|
||||
continue;
|
||||
}
|
||||
if ($eintrag['Festgehalten']) {
|
||||
if ($eintrag['Sollwert'] !== null) {
|
||||
$sollwerte[$eintrag['InstanzID']] = $eintrag['Sollwert'];
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
$ausgangswert = self::neutralerLeistungswert($eintrag['Leistungswerte_W']);
|
||||
$ausgangswert = self::richtungsneutralerLeistungswert(
|
||||
$eintrag['Leistungswerte_W'],
|
||||
$positiveRichtung
|
||||
);
|
||||
$sollwerte[$eintrag['InstanzID']] = $ausgangswert;
|
||||
$ausgangssumme += $ausgangswert;
|
||||
}
|
||||
|
||||
$rest = $verteilbudget - $nichtSteuerbar - $ausgangssumme;
|
||||
foreach ($steuerbar as $eintrag) {
|
||||
if ($eintrag['Festwert']) {
|
||||
if ($eintrag['Festwert'] || $eintrag['Festgehalten']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$instanzID = $eintrag['InstanzID'];
|
||||
$ausgangswert = $sollwerte[$instanzID];
|
||||
if ($rest >= 0) {
|
||||
if ($positiveRichtung) {
|
||||
if ($rest <= 0) {
|
||||
continue;
|
||||
}
|
||||
$neuerSollwert = self::groessterLeistungswertBis(
|
||||
$eintrag['Leistungswerte_W'],
|
||||
$ausgangswert + $rest
|
||||
);
|
||||
} else {
|
||||
if ($rest >= 0) {
|
||||
continue;
|
||||
}
|
||||
$neuerSollwert = self::kleinsterLeistungswertAb(
|
||||
$eintrag['Leistungswerte_W'],
|
||||
$ausgangswert + $rest
|
||||
@@ -200,7 +219,7 @@ final class ManagerRegler
|
||||
|
||||
$zugeteilt = $nichtSteuerbar;
|
||||
foreach ($steuerbar as $eintrag) {
|
||||
if (!$eintrag['Festwert']) {
|
||||
if (!$eintrag['Festwert'] && !$eintrag['Festgehalten']) {
|
||||
$zugeteilt += $sollwerte[$eintrag['InstanzID']];
|
||||
}
|
||||
}
|
||||
@@ -274,8 +293,10 @@ final class ManagerRegler
|
||||
/**
|
||||
* @param list<int|array{Von_W: int, Bis_W: int}> $leistungswerte
|
||||
*/
|
||||
private static function neutralerLeistungswert(array $leistungswerte): int
|
||||
{
|
||||
private static function richtungsneutralerLeistungswert(
|
||||
array $leistungswerte,
|
||||
bool $positiveRichtung
|
||||
): int {
|
||||
$negativ = null;
|
||||
$positiv = null;
|
||||
foreach ($leistungswerte as $eintrag) {
|
||||
@@ -298,14 +319,11 @@ final class ManagerRegler
|
||||
: $positiv;
|
||||
}
|
||||
|
||||
if ($negativ === null) {
|
||||
return $positiv;
|
||||
}
|
||||
if ($positiv === null) {
|
||||
return $negativ;
|
||||
if ($positiveRichtung) {
|
||||
return $positiv ?? $negativ;
|
||||
}
|
||||
|
||||
return abs($negativ) <= abs($positiv) ? $negativ : $positiv;
|
||||
return $negativ ?? $positiv;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -361,6 +379,6 @@ final class ManagerRegler
|
||||
return max($eintrag['Von_W'], $untergrenze);
|
||||
}
|
||||
|
||||
return self::neutralerLeistungswert($leistungswerte);
|
||||
return self::richtungsneutralerLeistungswert($leistungswerte, false);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user