feat: sync contingents for TYPO3 calendar hotels

This commit is contained in:
fromme committed 2026-10-29 15:05:04 +01:00
1 parent ec36b61275
commit 97c6330a9a
24 files changed
+1067 -180

No files matched your search

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Repository\Groups;
use App\Entity\Groups\Accommodation;
use App\Entity\Groups\ContingentSyncState;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -19,30 +18,37 @@ class ContingentSyncStateRepository extends ServiceEntityRepository
parent::__construct($registry, ContingentSyncState::class);
}
public function findOneByAccommodation(Accommodation $accommodation): ?ContingentSyncState
public function findOneByHotelCode(string $hotelCode): ?ContingentSyncState
{
return $this->findOneBy(['accommodation' => $accommodation]);
return $this->findOneBy(['hotelCode' => $hotelCode]);
}
/**
* Returns every sync state keyed by accommodation id, for the revisions endpoint.
*
* @return array<int, ContingentSyncState>
* @return array<string, ContingentSyncState>
*/
public function findAllIndexedByAccommodationId(): array
public function findAllIndexedByHotelCode(): array
{
$indexed = [];
foreach ($this->findAll() as $state) {
$accommodation = $state->getAccommodation();
if (null === $accommodation || null === $accommodation->getId()) {
continue;
}
$indexed[$accommodation->getId()] = $state;
$indexed[(string) $state->getHotelCode()] = $state;
}
return $indexed;
}
/**
* Drops the sync state of every hotel code that is no longer synced.
*
* @param non-empty-list<string> $hotelCodes the codes that are still synced
*/
public function deleteExceptHotelCodes(array $hotelCodes): int
{
return (int) $this->createQueryBuilder('s')
->delete()
->where('s.hotelCode NOT IN (:hotelCodes)')
->setParameter('hotelCodes', $hotelCodes)
->getQuery()
->execute();
}
}