Erweiterungstätigkeiten zur IPN-Vorschlagsliste anhand von Präfixen aus den Kategorien

This commit is contained in:
Marcel Diegelmann 2025-04-01 16:10:10 +02:00
parent e1418dfdc1
commit 38a2af9ce1
32 changed files with 1472 additions and 8 deletions

View file

@ -0,0 +1,73 @@
<?php
namespace App\EventSubscriber\UserSystem;
use App\Entity\Parts\Part;
use Doctrine\Common\EventSubscriber;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Doctrine\ORM\EntityManagerInterface;
class PartUniqueIpnSubscriber implements EventSubscriber
{
public function __construct(
private EntityManagerInterface $entityManager,
private readonly bool $enforceUniqueIpn = false
) {
}
public function getSubscribedEvents(): array
{
return [
Events::prePersist,
Events::preUpdate,
];
}
public function prePersist(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof Part) {
$this->ensureUniqueIpn($entity);
}
}
public function preUpdate(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if ($entity instanceof Part) {
$this->ensureUniqueIpn($entity);
}
}
private function ensureUniqueIpn(Part $part): void
{
if ($part->getIpn() === null || $part->getIpn() === '') {
return;
}
$existingPart = $this->entityManager
->getRepository(Part::class)
->findOneBy(['ipn' => $part->getIpn()]);
if ($existingPart && $existingPart->getId() !== $part->getId()) {
if ($this->enforceUniqueIpn) {
return;
}
// Anhang eines Inkrements bis ein einzigartiger Wert gefunden wird
$increment = 1;
$originalIpn = $part->getIpn();
while ($this->entityManager
->getRepository(Part::class)
->findOneBy(['ipn' => $originalIpn . "_$increment"])) {
$increment++;
}
$part->setIpn($originalIpn . "_$increment");
}
}
}