diff --git a/src/php/Entities/Games/Game.php b/src/php/Entities/Games/Game.php index 90ed9be..c6d954d 100644 --- a/src/php/Entities/Games/Game.php +++ b/src/php/Entities/Games/Game.php @@ -15,6 +15,8 @@ class Game private int|null $id; #[ORM\Column] private string $name; + #[ORM\Column(nullable: true)] + private string|null $internalName; public function getName(): string { @@ -25,12 +27,23 @@ class Game { return $this->id; } + + public function getInternalName(): string + { + return $this->internalName ?? $this->name; + } + + public function setInternalName(string $internalName): void + { + $this->internalName = $internalName; + } /** * @param string $name */ - public function __construct(string $name) + public function __construct(string $internalName, string $name) { + $this->internalName = $internalName; $this->name = $name; } } \ No newline at end of file diff --git a/src/php/Importer/GameImporter.php b/src/php/Importer/GameImporter.php index dd275db..965cbf3 100644 --- a/src/php/Importer/GameImporter.php +++ b/src/php/Importer/GameImporter.php @@ -3,14 +3,17 @@ declare(strict_types=1); namespace GamesShop\Importer; +use Doctrine\Common\Collections\Criteria; use Doctrine\ORM\EntityManagerInterface; use Exception; +use GamesShop\ContainerHandler; use GamesShop\Entities\Account\User; use GamesShop\Entities\Games\Game; use GamesShop\Entities\Games\Key; use GamesShop\Entities\Games\KeyAttribute; use GamesShop\Entities\Games\Store; use GamesShop\Entities\GamesList; +use Monolog\Logger; use PhpOffice\PhpSpreadsheet\IOFactory; final class GameImporter @@ -127,19 +130,27 @@ final class GameImporter continue; } - $game = array_key_exists($values['name'], $foundGames) ? $foundGames[$values['name']] : null; + $internalName = $this->prepareGameName($values['name']); + $game = array_key_exists($internalName, $foundGames) ? $foundGames[$internalName] : null; + + ContainerHandler::get(Logger::class)->debug('importing game ' . $internalName); if ($game === null) { - $game = $this->entityManager->getRepository(Game::class)->findOneBy([ 'name' => $values['name'] ]); + $game = $this->entityManager->getRepository(Game::class)->matching( + Criteria::create() + ->where(Criteria::expr()->eq('name', $values['name'])) + ->orWhere(Criteria::expr()->eq('internalName', $internalName)) + )->first(); } - if ($game === null) { - $game = new Game($values['name']); + if ($game === false) { + $game = new Game($internalName, $values['name']); $this->entityManager->persist($game); } - $foundGames[$values['name']] = $game; - + $foundGames[$internalName] = $game; + $game->setInternalName($internalName); + $key = new Key( $game, $list, @@ -174,4 +185,20 @@ final class GameImporter return Store::EXTERNAL; } + + private function prepareGameName(string $name): string + { + $replacements = [ + ':' => '', + '-' => '', + ',' => '', + '!' => '', + '?' => '', + ' ' => ' ', + ' ' => '_', + ]; + + $name = strtoupper($name); + return str_replace(array_keys($replacements), array_values($replacements), $name); + } } \ No newline at end of file