fix: treat dates without price as unavailable

This commit is contained in:
Björn Fromme committed 2026-08-04 11:29:58 +02:00
1 parent 331c88c38e
commit 8ff13614d2
8 files changed
+407 -23

No files matched your search

+13 -2
View File
@@ -6,12 +6,14 @@ namespace App\Controller\Api;
use App\BpnConnect\ContingentsClient;
use App\BpnConnect\Exception\BpnConnectException;
use App\BpnConnect\Model\ContingentStatus;
use App\Entity\Groups\AccommodationPrice;
use App\Enum\Groups\PriceType;
use App\Model\ContingentCalendarQuery;
use App\Model\ContingentPricesQuery;
use App\Repository\Groups\AccommodationPriceRepository;
use App\Repository\Groups\AccommodationRepository;
use App\Service\AccommodationPriceCoverage;
use App\Service\PriceTimelineBuilder;
use Psr\Cache\InvalidArgumentException;
use Psr\Log\LoggerInterface;
@@ -34,6 +36,7 @@ class ContingentController extends AbstractController
private readonly AccommodationPriceRepository $priceRepository,
private readonly CacheInterface $cache,
private readonly PriceTimelineBuilder $priceTimelineBuilder,
private readonly AccommodationPriceCoverage $priceCoverage,
private readonly LoggerInterface $logger,
) {
}
@@ -96,8 +99,10 @@ class ContingentController extends AbstractController
$currency = $accommodation->getCurrency();
$covered = $this->priceCoverage->coveredDatesFor($prices, $dateFrom, $dateTo);
$data = array_map(
fn ($entry) => $this->enrichEntry($entry->date, $entry->status->value, $prices, $currency),
fn ($entry) => $this->enrichEntry($entry->date, $entry->status->value, $prices, $covered, $currency),
$calendar->data,
);
@@ -106,13 +111,19 @@ class ContingentController extends AbstractController
/**
* @param AccommodationPrice[] $prices
* @param array<string, true> $covered
*
* @return array{date: string, status: string, type: string|null, pricePerNight: float|null, defaultPricePerNight: float|null, priceAdditionalPerson: float|null, defaultPriceAdditionalPerson: float|null, includedPax: int|null, minNights: int|null}
*/
private function enrichEntry(string $date, string $status, array $prices, string $currency): array
private function enrichEntry(string $date, string $status, array $prices, array $covered, string $currency): array
{
$day = (new \DateTimeImmutable($date))->setTime(0, 0);
// A day without a price is not sold, no matter what the contingent says.
if (!isset($covered[$day->format('Y-m-d')])) {
$status = ContingentStatus::Blocked->value;
}
// dateFrom and dateTo are both inclusive (last night, not checkout day)
$candidates = array_filter(
$prices,