This commit is contained in:
+17
-9
@@ -65,7 +65,7 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
'Name' => 'Verbraucher einstufig',
|
'Name' => 'Verbraucher einstufig',
|
||||||
],
|
],
|
||||||
'{A31C9274-54F7-4BD2-9804-7AF23E86C4D1}' => [
|
'{A31C9274-54F7-4BD2-9804-7AF23E86C4D1}' => [
|
||||||
'Katalog' => 'consumer_single',
|
'Katalog' => 'heat_pump',
|
||||||
'Name' => 'Waermepumpe',
|
'Name' => 'Waermepumpe',
|
||||||
],
|
],
|
||||||
'{0D94913C-0F31-4C29-A685-6EB4AE58E55D}' => [
|
'{0D94913C-0F31-4C29-A685-6EB4AE58E55D}' => [
|
||||||
@@ -1127,19 +1127,23 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
private function pruefeVerbraucherlizenzen(array $ids): void
|
private function pruefeVerbraucherlizenzen(array $ids): void
|
||||||
{
|
{
|
||||||
[$mengen, $namen] = $this->verbraucherLizenzbelegung($ids);
|
[$mengen, $namen] = $this->verbraucherLizenzbelegung($ids);
|
||||||
|
$lease = $this->leseLizenzLease();
|
||||||
|
$pruefmengen = Lizenzpruefung::beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
$lease,
|
||||||
|
$mengen
|
||||||
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Lizenzpruefung::pruefeVerbrauchermengen($this->leseLizenzLease(), $mengen);
|
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
|
||||||
} catch (InvalidArgumentException $fehler) {
|
} catch (InvalidArgumentException $fehler) {
|
||||||
foreach ($mengen as $kennung => $verwendet) {
|
foreach ($pruefmengen as $kennung => $verwendet) {
|
||||||
$lizenziert = Lizenzpruefung::berechtigungsMenge(
|
$lizenziert = Lizenzpruefung::berechtigungsMenge($lease, $kennung);
|
||||||
$this->leseLizenzLease(),
|
|
||||||
$kennung
|
|
||||||
);
|
|
||||||
if ($verwendet > $lizenziert) {
|
if ($verwendet > $lizenziert) {
|
||||||
|
$name = $namen[$kennung]
|
||||||
|
?? ($kennung === 'consumer_single' ? 'Waermepumpe (Bestandslizenz)' : $kennung);
|
||||||
throw new InvalidArgumentException(sprintf(
|
throw new InvalidArgumentException(sprintf(
|
||||||
'%s: %d aktiviert, aber nur %d lizenziert. Bitte Auswahl reduzieren oder Lizenz erweitern.',
|
'%s: %d aktiviert, aber nur %d lizenziert. Bitte Auswahl reduzieren oder Lizenz erweitern.',
|
||||||
$namen[$kennung],
|
$name,
|
||||||
$verwendet,
|
$verwendet,
|
||||||
$lizenziert
|
$lizenziert
|
||||||
), 0, $fehler);
|
), 0, $fehler);
|
||||||
@@ -2329,7 +2333,11 @@ class Manager extends IPSModule implements ManagerSchnittstelle
|
|||||||
[$mengen] = $this->verbraucherLizenzbelegung(
|
[$mengen] = $this->verbraucherLizenzbelegung(
|
||||||
$this->konfigurierteAktiveVerbraucherIDs()
|
$this->konfigurierteAktiveVerbraucherIDs()
|
||||||
);
|
);
|
||||||
Lizenzpruefung::pruefeVerbrauchermengen($lease, $mengen);
|
$pruefmengen = Lizenzpruefung::beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
$lease,
|
||||||
|
$mengen
|
||||||
|
);
|
||||||
|
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Throwable $fehler) {
|
} catch (Throwable $fehler) {
|
||||||
|
|||||||
@@ -117,6 +117,42 @@ final class Lizenzpruefung
|
|||||||
return $menge;
|
return $menge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rechnet freie, bestehende Einzellizenzen auf nicht separat lizenzierte Waermepumpen an.
|
||||||
|
*
|
||||||
|
* @param array<string, mixed> $lease
|
||||||
|
* @param array<string, int> $verwendeteMengen
|
||||||
|
* @return array<string, int>
|
||||||
|
*/
|
||||||
|
public static function beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
array $lease,
|
||||||
|
array $verwendeteMengen
|
||||||
|
): array {
|
||||||
|
$waermepumpen = $verwendeteMengen['heat_pump'] ?? 0;
|
||||||
|
if ($waermepumpen <= 0) {
|
||||||
|
return $verwendeteMengen;
|
||||||
|
}
|
||||||
|
|
||||||
|
$nichtSeparatLizenziert = max(
|
||||||
|
0,
|
||||||
|
$waermepumpen - self::berechtigungsMenge($lease, 'heat_pump')
|
||||||
|
);
|
||||||
|
$verbraucher = $verwendeteMengen['consumer_single'] ?? 0;
|
||||||
|
$freieBestandslizenzen = max(
|
||||||
|
0,
|
||||||
|
self::berechtigungsMenge($lease, 'consumer_single') - $verbraucher
|
||||||
|
);
|
||||||
|
$angerechnet = min($nichtSeparatLizenziert, $freieBestandslizenzen);
|
||||||
|
if ($angerechnet === 0) {
|
||||||
|
return $verwendeteMengen;
|
||||||
|
}
|
||||||
|
|
||||||
|
$verwendeteMengen['heat_pump'] = $waermepumpen - $angerechnet;
|
||||||
|
$verwendeteMengen['consumer_single'] = $verbraucher + $angerechnet;
|
||||||
|
|
||||||
|
return $verwendeteMengen;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<string, mixed> $lease
|
* @param array<string, mixed> $lease
|
||||||
* @param array<string, int> $verwendeteMengen
|
* @param array<string, int> $verwendeteMengen
|
||||||
|
|||||||
@@ -173,6 +173,61 @@ final class LizenzpruefungTest extends TestCase
|
|||||||
self::assertTrue(true);
|
self::assertTrue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSeparateWaermepumpenlizenzBleibtUnveraendert(): void
|
||||||
|
{
|
||||||
|
$lease = $this->lease('manager_standard');
|
||||||
|
$lease['entitlements'][] = [
|
||||||
|
'catalog_key' => 'heat_pump',
|
||||||
|
'quantity' => 1,
|
||||||
|
'status' => 'active',
|
||||||
|
];
|
||||||
|
$verwendung = ['heat_pump' => 1];
|
||||||
|
|
||||||
|
$pruefmengen = Lizenzpruefung::beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
$lease,
|
||||||
|
$verwendung
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame($verwendung, $pruefmengen);
|
||||||
|
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFreieBestandslizenzDecktEineWaermepumpeAb(): void
|
||||||
|
{
|
||||||
|
$lease = $this->lease('manager_standard');
|
||||||
|
$lease['entitlements'][] = [
|
||||||
|
'catalog_key' => 'consumer_single',
|
||||||
|
'quantity' => 1,
|
||||||
|
'status' => 'active',
|
||||||
|
];
|
||||||
|
|
||||||
|
$pruefmengen = Lizenzpruefung::beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
$lease,
|
||||||
|
['heat_pump' => 1]
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertSame(['heat_pump' => 0, 'consumer_single' => 1], $pruefmengen);
|
||||||
|
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testBestandslizenzDarfNichtDoppeltVerwendetWerden(): void
|
||||||
|
{
|
||||||
|
$lease = $this->lease('manager_standard');
|
||||||
|
$lease['entitlements'][] = [
|
||||||
|
'catalog_key' => 'consumer_single',
|
||||||
|
'quantity' => 1,
|
||||||
|
'status' => 'active',
|
||||||
|
];
|
||||||
|
$pruefmengen = Lizenzpruefung::beruecksichtigeBestandslizenzFuerWaermepumpen(
|
||||||
|
$lease,
|
||||||
|
['consumer_single' => 1, 'heat_pump' => 1]
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->expectException(InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('Lizenzkontingent fuer heat_pump ueberschritten');
|
||||||
|
Lizenzpruefung::pruefeVerbrauchermengen($lease, $pruefmengen);
|
||||||
|
}
|
||||||
|
|
||||||
public function testLizenzcodeWirdWieAufDemServerNormalisiert(): void
|
public function testLizenzcodeWirdWieAufDemServerNormalisiert(): void
|
||||||
{
|
{
|
||||||
self::assertSame(
|
self::assertSame(
|
||||||
|
|||||||
@@ -169,12 +169,13 @@ final class ManagerModulstrukturTest extends TestCase
|
|||||||
'Konstant und Monatlich benoetigen eine Peak-Shaving-Lizenz.',
|
'Konstant und Monatlich benoetigen eine Peak-Shaving-Lizenz.',
|
||||||
$inhalt
|
$inhalt
|
||||||
);
|
);
|
||||||
foreach (['battery', 'buffer_storage', 'ev_charger', 'consumer_single', 'boiler_multi'] as $katalog) {
|
foreach (['battery', 'buffer_storage', 'ev_charger', 'consumer_single', 'heat_pump', 'boiler_multi'] as $katalog) {
|
||||||
self::assertStringContainsString("'Katalog' => '" . $katalog . "'", $inhalt);
|
self::assertStringContainsString("'Katalog' => '" . $katalog . "'", $inhalt);
|
||||||
}
|
}
|
||||||
foreach ([
|
foreach ([
|
||||||
'{B7C54AF4-AD7D-4FE4-B75D-203693906251}',
|
'{B7C54AF4-AD7D-4FE4-B75D-203693906251}',
|
||||||
'{15879A4E-D0C2-4495-83DE-46E1E462591E}',
|
'{15879A4E-D0C2-4495-83DE-46E1E462591E}',
|
||||||
|
'{A31C9274-54F7-4BD2-9804-7AF23E86C4D1}',
|
||||||
'{0D94913C-0F31-4C29-A685-6EB4AE58E55D}',
|
'{0D94913C-0F31-4C29-A685-6EB4AE58E55D}',
|
||||||
'{32F65988-BE55-4FD6-9FFF-CF1C4C8628F8}',
|
'{32F65988-BE55-4FD6-9FFF-CF1C4C8628F8}',
|
||||||
'{C92D5EEF-9632-47A5-9659-4B02BF40FBE9}',
|
'{C92D5EEF-9632-47A5-9659-4B02BF40FBE9}',
|
||||||
|
|||||||
Reference in New Issue
Block a user