chore: cgl fixes

This commit is contained in:
2026-09-11 19:37:00 +02:00
parent 5f8a586385
commit 5b133f724d
26 changed files with 87 additions and 92 deletions
+1
View File
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\BusProNet\Model;
use Symfony\Component\Validator\Constraints as Assert;
use function Symfony\Component\String\u;
/**
@@ -530,7 +530,7 @@ class ImportGroupsLegacyDataCommand extends Command
* @param list<AdditionalService> $additionalServicesNeedingDefaultRange only these
* (titles without a leading year) get the accommodation-
* wide fallback range; year-prefixed ones already have
* their scoped range set in importAdditionalServices().
* their scoped range set in importAdditionalServices()
*/
private function applyDateRangeToServices(array $accommodationByUid, array $additionalServicesNeedingDefaultRange): void
{
@@ -8,7 +8,6 @@ use App\BusProNet\ApiClient;
use App\BusProNet\Exception\ApiClientException;
use App\BusProNet\Model\Notification;
use App\BusProNet\Model\PersonalData;
use App\BusProNet\Model\PersonalDataUpdateResponse;
use App\Entity\User;
use App\Exception\NewsletterProviderException;
use App\Form\PersonalDataType;
@@ -46,7 +46,7 @@ class CreateController extends AbstractController
'date_range' => [
'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'),
'to' => $accommodationPrice->getDateTo()->format('Y-m-d'),
]
],
]);
$returnUrl = $this->generateUrl('app_admin_accommodation_edit', [
@@ -52,7 +52,7 @@ class EditController extends AbstractController
'date_range' => [
'from' => $accommodationPrice->getDateFrom()->format('Y-m-d'),
'to' => $accommodationPrice->getDateTo()->format('Y-m-d'),
]
],
]);
$returnUrl = $this->generateUrl('app_admin_accommodation_edit', [
@@ -4,14 +4,11 @@ declare(strict_types=1);
namespace App\Controller\Admin\AdditionalService;
use App\Entity\Groups\Accommodation;
use App\Entity\Groups\AdditionalService;
use App\Form\Admin\Groups\AdditionalServiceType;
use App\Htmx\HxRedirectResponse;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
@@ -106,7 +106,7 @@ class Step2Controller extends AbstractController
$selectedAdditionalServices = $this->resolveSelectedAdditionalServices($dto, $services['additionalServices']);
$priceBreakdown = null;
if ($dto->dateFrom !== null && $dto->dateTo !== null) {
if (null !== $dto->dateFrom && null !== $dto->dateTo) {
$priceBreakdown = $this->priceCalculator->calculate(
$dto->paxCount,
$dto->minorsCount,
+1 -1
View File
@@ -10,9 +10,9 @@ use App\Service\AdditionalServiceExclusionResolver;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
+1
View File
@@ -7,6 +7,7 @@ namespace App\Form\Model;
use App\Validator\Constraints as AppAssert;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use function Symfony\Component\String\u;
/**
-1
View File
@@ -510,5 +510,4 @@ class BpnXmlAnonymizer
return null;
}
}
+2 -2
View File
@@ -21,7 +21,7 @@ class CalendarGridBuilder
$months = [];
$base = $from->modify('first day of this month')->setTime(0, 0, 0);
for ($i = 0; $i < $count; $i++) {
for ($i = 0; $i < $count; ++$i) {
$monthStart = $base->modify("+{$i} months");
$months[] = [
'month' => $monthStart,
@@ -54,7 +54,7 @@ class CalendarGridBuilder
while ($current <= $gridEnd) {
$week = [];
for ($d = 0; $d < 7; $d++) {
for ($d = 0; $d < 7; ++$d) {
$week[] = [
'date' => $current,
'inMonth' => $current->format('Y-m') === $monthKey,
+4 -3
View File
@@ -30,6 +30,7 @@ class GroupsPriceCalculator
/**
* @param array<string, int|float> $config
*
* @return array<string, int|float>
*/
private function resolveConfig(array $config): array
@@ -228,7 +229,7 @@ class GroupsPriceCalculator
));
$winner = $this->priceTimelineBuilder->resolveWinner($candidates) ?? $lastWinner;
if ($winner !== null) {
if (null !== $winner) {
$lastWinner = $winner;
$basePrice += ($winner->getPricePerNight() ?? 0) * $segNights;
$includedPax = $winner->getIncludedPax() ?? 0;
@@ -254,7 +255,7 @@ class GroupsPriceCalculator
// Rule 4: undersubscription surcharge (only when a paid board is selected)
$undersubscriptionSurcharge = 0;
$undersubscriptionThreshold = null;
if ($paidBoardPricePerPersonNight !== null) {
if (null !== $paidBoardPricePerPersonNight) {
$surcharge30 = (int) round(('CHF' === $currency ? $this->config['undersubscription30Chf'] : $this->config['undersubscription30Eur']) * 100);
$surcharge40 = (int) round(('CHF' === $currency ? $this->config['undersubscription40Chf'] : $this->config['undersubscription40Eur']) * 100);
@@ -269,7 +270,7 @@ class GroupsPriceCalculator
// Rule 5: board price
$boardPrice = 0;
if ($paidBoardPricePerPersonNight !== null) {
if (null !== $paidBoardPricePerPersonNight) {
$boardPrice = $paidBoardPricePerPersonNight * $effectivePax * $nights;
}
+3 -6
View File
@@ -39,8 +39,7 @@ class ParticipantCardAssembler
BookingDto $bookingDto,
int $index,
?array $precomputedPrices = null,
): ParticipantCardDataDto
{
): ParticipantCardDataDto {
$participant = $bookingDto->participants[$index] ?? null;
if (null === $participant) {
@@ -142,8 +141,7 @@ class ParticipantCardAssembler
BookingDto $bookingDto,
int $index,
?array $precomputedPrices = null,
): ParticipantCardPriceDto
{
): ParticipantCardPriceDto {
// Check if canceled (only possible in edit mode when booking property is set)
$isCanceled = ($bookingDto->booking?->participantsStatus[$index] ?? null) === 'S';
@@ -189,8 +187,7 @@ class ParticipantCardAssembler
BookingDto $bookingDto,
int $index,
bool $forceStrictRequired = false,
): ParticipantCardDataDto
{
): ParticipantCardDataDto {
return $this->getCardDataWithValidationInternal(
$bookingDto,
$index,
-1
View File
@@ -8,7 +8,6 @@ use App\BusProNet\ApiClient;
use App\BusProNet\Model\Address;
use App\BusProNet\Model\Notification;
use App\Entity\User;
use App\Form\Model\BookingDto;
use App\Form\Model\ParticipantDto;
use App\Security\Crypt;
use Carbon\CarbonImmutable;
+1
View File
@@ -86,6 +86,7 @@ class ParticipantFormSupport
/**
* @param array<string, int> $options
*
* @return array<string, int>
*/
private function resolveOptions(array $options): array
+7 -7
View File
@@ -69,7 +69,7 @@ class PriceTimelineBuilder
$lastDefault = null;
// Step 2: walk each segment [start, end) and resolve the effective price.
for ($i = 0, $count = count($boundaries) - 1; $i < $count; $i++) {
for ($i = 0, $count = count($boundaries) - 1; $i < $count; ++$i) {
$segStart = $boundaries[$i];
$segEndNext = $boundaries[$i + 1];
@@ -86,7 +86,7 @@ class PriceTimelineBuilder
$winner = $this->resolveWinner($candidates);
if ($winner === null) {
if (null === $winner) {
// Gap: reset merge state so the next winner always opens a new row.
$lastWinner = null;
$lastDefault = null;
@@ -94,8 +94,8 @@ class PriceTimelineBuilder
}
$defaultWinner = null;
if ($winner->getType() === PriceType::DISCOUNT) {
$defaults = array_filter($candidates, fn($p) => $p->getType() === null);
if (PriceType::DISCOUNT === $winner->getType()) {
$defaults = array_filter($candidates, fn ($p) => null === $p->getType());
$defaultWinner = $this->resolveWinner($defaults);
}
@@ -125,8 +125,8 @@ class PriceTimelineBuilder
includedPax: $winner->getIncludedPax(),
pricePerNight: round($winner->getPricePerNight() / 100, 2),
priceAdditionalPerson: round($winner->getPriceAdditionalPerson() / 100, 2),
defaultPricePerNight: $defaultWinner !== null ? round($defaultWinner->getPricePerNight() / 100, 2) : null,
defaultPriceAdditionalPerson: $defaultWinner !== null ? round($defaultWinner->getPriceAdditionalPerson() / 100, 2) : null,
defaultPricePerNight: null !== $defaultWinner ? round($defaultWinner->getPricePerNight() / 100, 2) : null,
defaultPriceAdditionalPerson: null !== $defaultWinner ? round($defaultWinner->getPriceAdditionalPerson() / 100, 2) : null,
currency: $currency,
type: $winner->getType()?->value,
);
@@ -150,7 +150,7 @@ class PriceTimelineBuilder
{
$winner = null;
foreach ($candidates as $candidate) {
if ($winner === null) {
if (null === $winner) {
$winner = $candidate;
continue;
}
+20 -20
View File
@@ -13,9 +13,9 @@ use App\Model\CalendarMonth;
use App\Service\AccommodationPriceCoverage;
use Carbon\CarbonImmutable;
use Psr\Cache\InvalidArgumentException;
use Symfony\UX\TwigComponent\Attribute\AsTwigComponent;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\UX\TwigComponent\Attribute\AsTwigComponent;
#[AsTwigComponent('calendar', template: 'components/calendar/index.html.twig')]
class Calendar
@@ -55,7 +55,7 @@ class Calendar
$this->accommodation = $accommodation;
$this->startMonth = $startMonth;
if ($startMonth !== null && preg_match('/^\d{4}-\d{2}$/', $startMonth)) {
if (null !== $startMonth && preg_match('/^\d{4}-\d{2}$/', $startMonth)) {
$start = CarbonImmutable::createFromFormat('Y-m-d', $startMonth.'-01');
} else {
$allDates = $this->collectAllDates();
@@ -73,7 +73,7 @@ class Calendar
$months = [];
$current = $start;
for ($i = 0; $i < 3; $i++) {
for ($i = 0; $i < 3; ++$i) {
$months[] = $this->buildMonth($current, $map, $blockedDates);
$current = $current->addMonth();
}
@@ -96,7 +96,7 @@ class Calendar
*/
private function fetchBlockedDates(string $hotelCode, string $dateFrom, string $dateTo): array
{
if ($hotelCode === '') {
if ('' === $hotelCode) {
return [];
}
@@ -116,7 +116,7 @@ class Calendar
$blocked = [];
foreach ($response->data as $entry) {
if ($entry->status === ContingentStatus::Blocked) {
if (ContingentStatus::Blocked === $entry->status) {
$blocked[(new \DateTimeImmutable($entry->date))->format('Y-m-d')] = true;
}
}
@@ -144,26 +144,26 @@ class Calendar
$dates = [];
foreach ($this->accommodation->getAccommodationPrices() as $price) {
if ($price->getDateFrom() !== null) {
if (null !== $price->getDateFrom()) {
$dates[] = CarbonImmutable::instance($price->getDateFrom());
}
if ($price->getDateTo() !== null) {
if (null !== $price->getDateTo()) {
$dates[] = CarbonImmutable::instance($price->getDateTo());
}
}
foreach ($this->accommodation->getBoardServices() as $service) {
if ($service->getDateFrom() !== null) {
if (null !== $service->getDateFrom()) {
$dates[] = CarbonImmutable::instance($service->getDateFrom());
}
if ($service->getDateTo() !== null) {
if (null !== $service->getDateTo()) {
$dates[] = CarbonImmutable::instance($service->getDateTo());
}
}
foreach ($this->accommodation->getAdditionalServices() as $service) {
if ($service->getDateFrom() !== null) {
if (null !== $service->getDateFrom()) {
$dates[] = CarbonImmutable::instance($service->getDateFrom());
}
if ($service->getDateTo() !== null) {
if (null !== $service->getDateTo()) {
$dates[] = CarbonImmutable::instance($service->getDateTo());
}
}
@@ -198,7 +198,7 @@ class Calendar
$map = [];
foreach ($this->accommodation->getAccommodationPrices() as $price) {
if ($price->getDateFrom() === null || $price->getDateTo() === null) {
if (null === $price->getDateFrom() || null === $price->getDateTo()) {
continue;
}
@@ -216,7 +216,7 @@ class Calendar
$key = $day->format('Y-m-d');
$map[$key] ??= ['price' => null, 'board' => null, 'additional' => null];
$existing = $map[$key]['price'];
$replace = $existing === null
$replace = null === $existing
|| $priority > $existing['priority']
|| ($priority === $existing['priority'] && $span < $existing['span']);
if ($replace) {
@@ -227,7 +227,7 @@ class Calendar
}
foreach ($this->accommodation->getBoardServices() as $service) {
if ($service->getDateFrom() === null || $service->getDateTo() === null) {
if (null === $service->getDateFrom() || null === $service->getDateTo()) {
continue;
}
@@ -241,7 +241,7 @@ class Calendar
while ($day <= $end && $day <= $limit) {
$key = $day->format('Y-m-d');
$map[$key] ??= ['price' => null, 'board' => null, 'additional' => null];
if ($map[$key]['board'] === null || $span < $map[$key]['board']['span']) {
if (null === $map[$key]['board'] || $span < $map[$key]['board']['span']) {
$map[$key]['board'] = ['label' => $label, 'span' => $span];
}
$day = $day->addDay();
@@ -249,14 +249,14 @@ class Calendar
}
foreach ($this->accommodation->getAdditionalServices() as $service) {
if ($service->getDateFrom() === null || $service->getDateTo() === null) {
if (null === $service->getDateFrom() || null === $service->getDateTo()) {
continue;
}
$typeLabel = $service->getType() !== null
$typeLabel = null !== $service->getType()
? self::TYPE_LABELS[$service->getType()->value]
: '';
$label = sprintf('Zusatz: %s%s', $service->getLabel(), $typeLabel !== '' ? ' (' . $typeLabel . ')' : '');
$label = sprintf('Zusatz: %s%s', $service->getLabel(), '' !== $typeLabel ? ' ('.$typeLabel.')' : '');
$day = CarbonImmutable::instance($service->getDateFrom());
$end = CarbonImmutable::instance($service->getDateTo());
@@ -266,7 +266,7 @@ class Calendar
while ($day <= $end && $day <= $limit) {
$key = $day->format('Y-m-d');
$map[$key] ??= ['price' => null, 'board' => null, 'additional' => null];
if ($map[$key]['additional'] === null || $span < $map[$key]['additional']['span']) {
if (null === $map[$key]['additional'] || $span < $map[$key]['additional']['span']) {
$map[$key]['additional'] = ['label' => $label, 'span' => $span];
}
$day = $day->addDay();
@@ -293,7 +293,7 @@ class Calendar
$firstDow = ($start->dayOfWeek + 6) % 7;
$days = [];
for ($d = 1; $d <= $start->daysInMonth; $d++) {
for ($d = 1; $d <= $start->daysInMonth; ++$d) {
$dateStr = $month->format('Y-m').'-'.str_pad((string) $d, 2, '0', STR_PAD_LEFT);
$coverage = $map[$dateStr] ?? [];