fix: avoid null pointer exceptions, log warning about removed services

This commit is contained in:
Björn Fromme
2026-01-06 16:08:51 +01:00
parent 7fb5466eb4
commit 62fc734f82
@@ -7,6 +7,7 @@ namespace App\BusProNet\DataProcessor;
use App\BusProNet\Model\Booking; use App\BusProNet\Model\Booking;
use App\BusProNet\Model\Travel; use App\BusProNet\Model\Travel;
use App\Form\Model\ParticipantDto; use App\Form\Model\ParticipantDto;
use Psr\Log\LoggerInterface;
/** /**
* Processes participant service selections for booking updates. * Processes participant service selections for booking updates.
@@ -17,6 +18,11 @@ use App\Form\Model\ParticipantDto;
*/ */
class ParticipantServiceProcessor class ParticipantServiceProcessor
{ {
public function __construct(
private readonly LoggerInterface $logger,
) {
}
/** /**
* Resets all existing participant-to-service mappings to start with a clean slate. * Resets all existing participant-to-service mappings to start with a clean slate.
* *
@@ -154,11 +160,18 @@ class ParticipantServiceProcessor
foreach ($servicesToMap as $service) { foreach ($servicesToMap as $service) {
if (false === isset($bookingData->additionalServices[$service->id])) { if (false === isset($bookingData->additionalServices[$service->id])) {
$serviceToAdd = $travelData->additionalServices[$service->id] ?? null; $serviceToAdd = $travelData->additionalServices[$service->id] ?? null;
if (null !== $serviceToAdd) { if (null === $serviceToAdd) {
$bookingData->additionalServices[$service->id] = $serviceToAdd; $this->logger->warning('Additional service not found in travel data, skipping mapping', [
$bookingData->additionalServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price; 'bookingId' => $bookingData->id,
'serviceId' => $service->id,
'participantIndex' => $participant->index,
]);
continue;
} }
$bookingData->additionalServices[$service->id] = $serviceToAdd;
$bookingData->additionalServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price;
} }
$bookingData->additionalServices[$service->id]->mapping[] = $participant->index; $bookingData->additionalServices[$service->id]->mapping[] = $participant->index;
} }
} }
@@ -176,13 +189,24 @@ class ParticipantServiceProcessor
private function processTransportationServices(ParticipantDto $participant, Booking $bookingData, Travel $travelData): void private function processTransportationServices(ParticipantDto $participant, Booking $bookingData, Travel $travelData): void
{ {
foreach ([$participant->transportationOutbound, $participant->transportationInbound] as $service) { foreach ([$participant->transportationOutbound, $participant->transportationInbound] as $service) {
if (null === $service) {
continue;
}
if (false === isset($bookingData->transportationServices[$service->id])) { if (false === isset($bookingData->transportationServices[$service->id])) {
$serviceToAdd = $travelData->transportationServices[$service->id] ?? null; $serviceToAdd = $travelData->transportationServices[$service->id] ?? null;
if (null !== $serviceToAdd) { if (null === $serviceToAdd) {
$bookingData->transportationServices[$service->id] = $serviceToAdd; $this->logger->warning('Transportation service not found in travel data, skipping mapping', [
$bookingData->transportationServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price; 'bookingId' => $bookingData->id,
'serviceId' => $service->id,
'participantIndex' => $participant->index,
]);
continue;
} }
$bookingData->transportationServices[$service->id] = $serviceToAdd;
$bookingData->transportationServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price;
} }
$bookingData->transportationServices[$service->id]->mapping[] = $participant->index; $bookingData->transportationServices[$service->id]->mapping[] = $participant->index;
} }
} }