diff --git a/src/BusProNet/Model/Address.php b/src/BusProNet/Model/Address.php index 6b4dbca..66503dc 100644 --- a/src/BusProNet/Model/Address.php +++ b/src/BusProNet/Model/Address.php @@ -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; /** diff --git a/src/Command/ImportGroupsLegacyDataCommand.php b/src/Command/ImportGroupsLegacyDataCommand.php index 021304e..aaeee31 100644 --- a/src/Command/ImportGroupsLegacyDataCommand.php +++ b/src/Command/ImportGroupsLegacyDataCommand.php @@ -334,10 +334,10 @@ class ImportGroupsLegacyDataCommand extends Command } /** - * @param list> $rows + * @param list> $rows * @param array $accommodationByUid - * @param list $knownUids - * @param list $seasonRanges + * @param list $knownUids + * @param list $seasonRanges * * @return array{0: int, 1: list, 2: int} */ @@ -526,11 +526,11 @@ class ImportGroupsLegacyDataCommand extends Command } /** - * @param array $accommodationByUid - * @param list $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(). + * @param array $accommodationByUid + * @param list $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() */ private function applyDateRangeToServices(array $accommodationByUid, array $additionalServicesNeedingDefaultRange): void { diff --git a/src/Controller/Account/PersonalDataController.php b/src/Controller/Account/PersonalDataController.php index 26b1eaa..f75708a 100644 --- a/src/Controller/Account/PersonalDataController.php +++ b/src/Controller/Account/PersonalDataController.php @@ -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; diff --git a/src/Controller/Admin/Accommodation/CalendarController.php b/src/Controller/Admin/Accommodation/CalendarController.php index 1e0e93d..0c40c0d 100644 --- a/src/Controller/Admin/Accommodation/CalendarController.php +++ b/src/Controller/Admin/Accommodation/CalendarController.php @@ -19,7 +19,7 @@ class CalendarController extends AbstractController { return $this->render('admin/accommodation/_calendar_section.html.twig', [ 'accommodation' => $accommodation, - 'startMonth' => $request->query->get('month'), + 'startMonth' => $request->query->get('month'), ]); } } diff --git a/src/Controller/Admin/AccommodationPrice/CreateController.php b/src/Controller/Admin/AccommodationPrice/CreateController.php index 8cd82b5..92f52cf 100644 --- a/src/Controller/Admin/AccommodationPrice/CreateController.php +++ b/src/Controller/Admin/AccommodationPrice/CreateController.php @@ -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', [ diff --git a/src/Controller/Admin/AccommodationPrice/EditController.php b/src/Controller/Admin/AccommodationPrice/EditController.php index f08dfd5..1a5e762 100644 --- a/src/Controller/Admin/AccommodationPrice/EditController.php +++ b/src/Controller/Admin/AccommodationPrice/EditController.php @@ -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', [ diff --git a/src/Controller/Admin/AdditionalService/EditController.php b/src/Controller/Admin/AdditionalService/EditController.php index 1db5b3e..e31b781 100644 --- a/src/Controller/Admin/AdditionalService/EditController.php +++ b/src/Controller/Admin/AdditionalService/EditController.php @@ -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; diff --git a/src/Controller/Groups/Booking/Step2Controller.php b/src/Controller/Groups/Booking/Step2Controller.php index 6585f71..95e42b3 100644 --- a/src/Controller/Groups/Booking/Step2Controller.php +++ b/src/Controller/Groups/Booking/Step2Controller.php @@ -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, @@ -168,7 +168,7 @@ class Step2Controller extends AbstractController return array_values(array_filter( $additionalServices, - fn(AdditionalService $s) => isset($selectedIds[$s->getId()]), + fn (AdditionalService $s) => isset($selectedIds[$s->getId()]), )); } diff --git a/src/Enum/Groups/PriceType.php b/src/Enum/Groups/PriceType.php index 366bd59..f012e58 100644 --- a/src/Enum/Groups/PriceType.php +++ b/src/Enum/Groups/PriceType.php @@ -9,7 +9,7 @@ enum PriceType: string public function priority(): int { - return match($this) { + return match ($this) { self::OVERRIDE => 1, self::DISCOUNT => 2, }; @@ -17,7 +17,7 @@ enum PriceType: string public function label(): string { - return match($this) { + return match ($this) { self::OVERRIDE => 'Override', self::DISCOUNT => 'Rabatt', }; diff --git a/src/Form/AccommodationStep2Type.php b/src/Form/AccommodationStep2Type.php index 41f35e9..322f4db 100644 --- a/src/Form/AccommodationStep2Type.php +++ b/src/Form/AccommodationStep2Type.php @@ -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; /** @@ -96,6 +96,6 @@ class AccommodationStep2Type extends AbstractType 'max_adolescent_age' => 0, ]); $resolver->setAllowedTypes('max_adolescent_age', 'int'); - $resolver->setAllowedTypes('additional_services', AdditionalService::class . '[]'); + $resolver->setAllowedTypes('additional_services', AdditionalService::class.'[]'); } } diff --git a/src/Form/Admin/Groups/AccommodationPriceType.php b/src/Form/Admin/Groups/AccommodationPriceType.php index 5700ecd..8d81c4b 100644 --- a/src/Form/Admin/Groups/AccommodationPriceType.php +++ b/src/Form/Admin/Groups/AccommodationPriceType.php @@ -37,12 +37,12 @@ class AccommodationPriceType extends AbstractType 'class' => PriceType::class, 'required' => false, 'placeholder' => 'Standard', - 'choice_label' => fn($item) => $item->label(), + 'choice_label' => fn ($item) => $item->label(), ]) ->add('season', EnumType::class, [ 'label' => 'Saison', 'class' => Season::class, - 'choice_label' => fn($item) => $item->token(), + 'choice_label' => fn ($item) => $item->token(), ]) ->add('includedPax', IntegerType::class, [ 'label' => 'Inklusiv-Personen', diff --git a/src/Form/Admin/Groups/AdditionalServiceType.php b/src/Form/Admin/Groups/AdditionalServiceType.php index 8884045..eaa572f 100644 --- a/src/Form/Admin/Groups/AdditionalServiceType.php +++ b/src/Form/Admin/Groups/AdditionalServiceType.php @@ -35,7 +35,7 @@ class AdditionalServiceType extends AbstractType ->add('type', EnumType::class, [ 'label' => 'Preistyp', 'class' => AdditionalServiceTypeEnum::class, - 'choice_label' => fn($item) => $item->label(), + 'choice_label' => fn ($item) => $item->label(), ]) ->add('price', MoneyType::class, [ 'label' => 'Preis', diff --git a/src/Form/Model/AccommodationBookingDto.php b/src/Form/Model/AccommodationBookingDto.php index 2f5c658..9738940 100644 --- a/src/Form/Model/AccommodationBookingDto.php +++ b/src/Form/Model/AccommodationBookingDto.php @@ -28,7 +28,7 @@ class AccommodationBookingDto #[Assert\NotNull(message: 'required', groups: ['step_2'])] public ?int $selectedBoardServiceId = null; - /** @var list*/ + /** @var list */ public array $selectedAdditionalServiceIds = []; public bool $isInquiry = false; diff --git a/src/Form/Model/BookingEditContext.php b/src/Form/Model/BookingEditContext.php index 42994da..60b9c08 100644 --- a/src/Form/Model/BookingEditContext.php +++ b/src/Form/Model/BookingEditContext.php @@ -13,7 +13,7 @@ class BookingEditContext { /** * @param array|null $cardsData - * @param array> $missingValueLabelsByParticipantIndex + * @param array> $missingValueLabelsByParticipantIndex */ public function __construct( public readonly BookingDto $bookingDto, diff --git a/src/Form/Model/ParticipantEditDto.php b/src/Form/Model/ParticipantEditDto.php index 5779ad6..26e273f 100644 --- a/src/Form/Model/ParticipantEditDto.php +++ b/src/Form/Model/ParticipantEditDto.php @@ -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; /** diff --git a/src/Form/Service/ParticipantTransportationDiscountReplacementFieldHandler.php b/src/Form/Service/ParticipantTransportationDiscountReplacementFieldHandler.php index bbd2898..57ed99a 100644 --- a/src/Form/Service/ParticipantTransportationDiscountReplacementFieldHandler.php +++ b/src/Form/Service/ParticipantTransportationDiscountReplacementFieldHandler.php @@ -199,7 +199,7 @@ class ParticipantTransportationDiscountReplacementFieldHandler extends AbstractP $services[$oldService->id]->mapping = array_values( array_filter( $services[$oldService->id]->mapping, - fn(int $idx): bool => $idx !== $participantIndex, + fn (int $idx): bool => $idx !== $participantIndex, ) ); } diff --git a/src/Service/AdditionalServiceExclusionResolver.php b/src/Service/AdditionalServiceExclusionResolver.php index 3a55b2e..84a32a3 100644 --- a/src/Service/AdditionalServiceExclusionResolver.php +++ b/src/Service/AdditionalServiceExclusionResolver.php @@ -43,7 +43,7 @@ class AdditionalServiceExclusionResolver $submittedIds = array_filter( $submittedIds, - fn(int $id) => !$this->conflicts($rules, $addedId, $id), + fn (int $id) => !$this->conflicts($rules, $addedId, $id), ); } diff --git a/src/Service/BpnXmlAnonymizer.php b/src/Service/BpnXmlAnonymizer.php index c6f9827..bae67e5 100644 --- a/src/Service/BpnXmlAnonymizer.php +++ b/src/Service/BpnXmlAnonymizer.php @@ -510,5 +510,4 @@ class BpnXmlAnonymizer return null; } - } diff --git a/src/Service/CalendarGridBuilder.php b/src/Service/CalendarGridBuilder.php index 5d80310..135d59d 100644 --- a/src/Service/CalendarGridBuilder.php +++ b/src/Service/CalendarGridBuilder.php @@ -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, diff --git a/src/Service/GroupsPriceCalculator.php b/src/Service/GroupsPriceCalculator.php index cae205c..23c6951 100644 --- a/src/Service/GroupsPriceCalculator.php +++ b/src/Service/GroupsPriceCalculator.php @@ -30,6 +30,7 @@ class GroupsPriceCalculator /** * @param array $config + * * @return array */ private function resolveConfig(array $config): array @@ -47,8 +48,8 @@ class GroupsPriceCalculator } /** - * @param AccommodationPrice[] $prices all prices overlapping the booking window - * @param AdditionalService[] $additionalServices only the selected services + * @param AccommodationPrice[] $prices all prices overlapping the booking window + * @param AdditionalService[] $additionalServices only the selected services * * @return array{ * effectivePax: int, @@ -88,7 +89,7 @@ class GroupsPriceCalculator $prices, $boardService?->getPrice(), array_map( - fn(AdditionalService $s) => [ + fn (AdditionalService $s) => [ 'label' => $s->getLabel() ?? '', 'price' => $s->getPrice() ?? 0, 'type' => $s->getType(), @@ -103,7 +104,7 @@ class GroupsPriceCalculator * Same calculation but using frozen snapshot data from an AccommodationBooking entity * instead of live catalog entities. * - * @param AccommodationPrice[] $prices all prices overlapping the booking window + * @param AccommodationPrice[] $prices all prices overlapping the booking window * @param list $additionalServiceSnapshots * * @return array{ @@ -136,7 +137,7 @@ class GroupsPriceCalculator string $currency, ): array { $items = array_map( - fn(array $s) => [ + fn (array $s) => [ 'label' => $s['label'], 'price' => $s['price'], 'type' => AdditionalServiceType::tryFrom($s['type']) ?? AdditionalServiceType::Flat, @@ -158,7 +159,7 @@ class GroupsPriceCalculator } /** - * @param AccommodationPrice[] $prices + * @param AccommodationPrice[] $prices * @param list $additionalItems * * @return array{ @@ -193,7 +194,7 @@ class GroupsPriceCalculator // Derive effectivePax: children 0–3 don't count, but never drop below includedPax $firstCandidates = array_values(array_filter( $prices, - fn(AccommodationPrice $p) => $p->getDateFrom() <= $dateFrom && $p->getDateTo() >= $dateFrom, + fn (AccommodationPrice $p) => $p->getDateFrom() <= $dateFrom && $p->getDateTo() >= $dateFrom, )); $firstWinner = $this->priceTimelineBuilder->resolveWinner($firstCandidates); $includedPaxFloor = $firstWinner?->getIncludedPax() ?? 1; @@ -224,11 +225,11 @@ class GroupsPriceCalculator $candidates = array_values(array_filter( $prices, - fn(AccommodationPrice $p) => $p->getDateFrom() <= $segStart && $p->getDateTo() >= $segStart, + fn (AccommodationPrice $p) => $p->getDateFrom() <= $segStart && $p->getDateTo() >= $segStart, )); $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; } diff --git a/src/Service/InsuranceManager.php b/src/Service/InsuranceManager.php index 4d1b246..5244256 100644 --- a/src/Service/InsuranceManager.php +++ b/src/Service/InsuranceManager.php @@ -115,10 +115,10 @@ class InsuranceManager * participant's price - this splits the given insurances by type and evaluates * each group against the appropriate price before merging the results back together. * - * @param array $insurances Available insurances to filter - * @param ParticipantDto $participant The participant to match insurances for - * @param BookingDto $booking The booking context for additional criteria - * @param float $individualPrice The participant's individual travel price (excluding insurance) + * @param array $insurances Available insurances to filter + * @param ParticipantDto $participant The participant to match insurances for + * @param BookingDto $booking The booking context for additional criteria + * @param float $individualPrice The participant's individual travel price (excluding insurance) * @param float $totalBookingPrice The total booking price across all participants (excluding insurance) * * @return array Filtered array of eligible insurances, sorted by price diff --git a/src/Service/ParticipantCardAssembler.php b/src/Service/ParticipantCardAssembler.php index b6043c8..d85c22e 100644 --- a/src/Service/ParticipantCardAssembler.php +++ b/src/Service/ParticipantCardAssembler.php @@ -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, @@ -262,7 +259,7 @@ class ParticipantCardAssembler } /** - * @param array $validationGroups + * @param array $validationGroups * @param array|null $precomputedPrices */ private function getCardDataWithValidationInternal( diff --git a/src/Service/ParticipantDataPrefiller.php b/src/Service/ParticipantDataPrefiller.php index a77af38..6bd3a4e 100644 --- a/src/Service/ParticipantDataPrefiller.php +++ b/src/Service/ParticipantDataPrefiller.php @@ -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; diff --git a/src/Service/ParticipantFormSupport.php b/src/Service/ParticipantFormSupport.php index 7bf1295..7c9b305 100644 --- a/src/Service/ParticipantFormSupport.php +++ b/src/Service/ParticipantFormSupport.php @@ -86,6 +86,7 @@ class ParticipantFormSupport /** * @param array $options + * * @return array */ private function resolveOptions(array $options): array diff --git a/src/Service/PriceTimelineBuilder.php b/src/Service/PriceTimelineBuilder.php index 8aca208..5c814e8 100644 --- a/src/Service/PriceTimelineBuilder.php +++ b/src/Service/PriceTimelineBuilder.php @@ -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]; @@ -81,12 +81,12 @@ class PriceTimelineBuilder $candidates = array_filter( $prices, - fn($p) => $p->getDateFrom() <= $segStart && $p->getDateTo() >= $segStart, + fn ($p) => $p->getDateFrom() <= $segStart && $p->getDateTo() >= $segStart, ); $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; } diff --git a/src/Twig/Components/Calendar.php b/src/Twig/Components/Calendar.php index 4196ef0..4dd0980 100644 --- a/src/Twig/Components/Calendar.php +++ b/src/Twig/Components/Calendar.php @@ -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,8 +55,8 @@ class Calendar $this->accommodation = $accommodation; $this->startMonth = $startMonth; - if ($startMonth !== null && preg_match('/^\d{4}-\d{2}$/', $startMonth)) { - $start = CarbonImmutable::createFromFormat('Y-m-d', $startMonth . '-01'); + if (null !== $startMonth && preg_match('/^\d{4}-\d{2}$/', $startMonth)) { + $start = CarbonImmutable::createFromFormat('Y-m-d', $startMonth.'-01'); } else { $allDates = $this->collectAllDates(); $start = empty($allDates) @@ -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(); } @@ -81,22 +81,22 @@ class Calendar $this->months = $months; $prevStart = $start->subMonths(3); - $prevEnd = $prevStart->addMonths(2); + $prevEnd = $prevStart->addMonths(2); $this->prevMonth = $prevStart->format('Y-m'); - $this->prevLabel = self::MONTHS[$prevStart->month] . ' – ' . self::MONTHS[$prevEnd->month] . ' ' . $prevEnd->year; + $this->prevLabel = self::MONTHS[$prevStart->month].' – '.self::MONTHS[$prevEnd->month].' '.$prevEnd->year; $nextStart = $start->addMonths(3); - $nextEnd = $nextStart->addMonths(2); + $nextEnd = $nextStart->addMonths(2); $this->nextMonth = $nextStart->format('Y-m'); - $this->nextLabel = self::MONTHS[$nextStart->month] . ' – ' . self::MONTHS[$nextEnd->month] . ' ' . $nextEnd->year; + $this->nextLabel = self::MONTHS[$nextStart->month].' – '.self::MONTHS[$nextEnd->month].' '.$nextEnd->year; } /** - * @return array keyed by Y-m-d, only BLOCKED dates present + * @return array keyed by Y-m-d, only BLOCKED dates present */ 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,11 +198,11 @@ class Calendar $map = []; foreach ($this->accommodation->getAccommodationPrices() as $price) { - if ($price->getDateFrom() === null || $price->getDateTo() === null) { + if (null === $price->getDateFrom() || null === $price->getDateTo()) { continue; } - $priceFormatted = number_format($price->getPricePerNight() / 100, 2, ',', '.') . ' €'; + $priceFormatted = number_format($price->getPricePerNight() / 100, 2, ',', '.').' €'; $label = sprintf('Preis: %s/Nacht (min. %d Nächte)', $priceFormatted, $price->getMinNights()); $day = CarbonImmutable::instance($price->getDateFrom()); @@ -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,11 +227,11 @@ class Calendar } foreach ($this->accommodation->getBoardServices() as $service) { - if ($service->getDateFrom() === null || $service->getDateTo() === null) { + if (null === $service->getDateFrom() || null === $service->getDateTo()) { continue; } - $label = 'Verpflegung: ' . $service->getLabel(); + $label = 'Verpflegung: '.$service->getLabel(); $day = CarbonImmutable::instance($service->getDateFrom()); $end = CarbonImmutable::instance($service->getDateTo()); @@ -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,8 +293,8 @@ class Calendar $firstDow = ($start->dayOfWeek + 6) % 7; $days = []; - for ($d = 1; $d <= $start->daysInMonth; $d++) { - $dateStr = $month->format('Y-m') . '-' . str_pad((string) $d, 2, '0', STR_PAD_LEFT); + for ($d = 1; $d <= $start->daysInMonth; ++$d) { + $dateStr = $month->format('Y-m').'-'.str_pad((string) $d, 2, '0', STR_PAD_LEFT); $coverage = $map[$dateStr] ?? []; $parts = []; @@ -325,7 +325,7 @@ class Calendar } return new CalendarMonth( - label: self::MONTHS[$month->month] . ' ' . $month->year, + label: self::MONTHS[$month->month].' '.$month->year, firstDow: $firstDow, days: $days, );