booking; $travelData = $formData->travel; // Reset mappings foreach ([...$bookingData->additionalServices, ...$bookingData->transportationServices, ...$bookingData->pickupsTo, ...$bookingData->pickupsFro] as $service) { $service->mapping = []; } // Update mappings, add services and pickups foreach ($formData->participants as $participant) { // skip canceled participants if ('F' !== $participant->status) { continue; } $servicesToMap = [ ...$participant->courses, ...$participant->additionalServices, ...$participant->skiPass, ...$participant->board, ...$participant->rentals, ]; foreach ($servicesToMap as $service) { if (false === isset($this->additionalServices[$service->id])) { $serviceToAdd = $travelData->additionalServices[$service->id]; $bookingData->additionalServices[$service->id] = $serviceToAdd; $bookingData->additionalServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price; } $bookingData->additionalServices[$service->id]->mapping[] = $participant->index; } foreach ([$participant->transportationServiceTo, $participant->transportationServiceFro] as $service) { if (false === isset($this->transportationServices[$service->id])) { $serviceToAdd = $travelData->transportationServices[$service->id]; $bookingData->transportationServices[$service->id] = $serviceToAdd; $bookingData->transportationServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price; } $bookingData->transportationServices[$service->id]->mapping[] = $participant->index; } if ('BUS' === $participant->transportationServiceTo->subType && null !== $selectedPickup = $participant->pickupTo) { if (false === isset($bookingData->pickupsTo[$selectedPickup->id])) { $bookingData->pickupsTo[$selectedPickup->id] = $selectedPickup; } $bookingData->pickupsTo[$selectedPickup->id]->mapping[] = $participant->index; } } // Remove services/pickups with empty mappings foreach ($bookingData->additionalServices as $service) { if (0 === count($service->mapping)) { unset($bookingData->additionalServices[$service->id]); } } foreach ($bookingData->transportationServices as $service) { if (0 === count($service->mapping)) { unset($bookingData->transportationServices[$service->id]); } } foreach ($bookingData->pickupsTo as $pickup) { if (0 === count($pickup->mapping)) { unset($bookingData->pickupsTo[$pickup->id]); } } foreach ($bookingData->pickupsFro as $pickup) { if (0 === count($pickup->mapping)) { unset($bookingData->pickupsFro[$pickup->id]); } } // Update participants' personal data foreach ($formData->participants as $participant) { // skip canceled participants if ('F' !== $participant->status) { continue; } $bookingData->participants[$participant->index]->firstName = $participant->firstName; $bookingData->participants[$participant->index]->name = $participant->lastName; $bookingData->participants[$participant->index]->dateOfBirth = $participant->dateOfBirth; $bookingData->participants[$participant->index]->gender = $participant->gender; $bookingData->participants[$participant->index]->nationality = $participant->nationality; $bookingData->participants[$participant->index]->height = $participant->height; $bookingData->participants[$participant->index]->weight = $participant->weight; $bookingData->participants[$participant->index]->shoeSize = $participant->shoeSize; if ($participant->email || $participant->mobile) { if (null === $bookingData->participants[$participant->index]->communication) { $bookingData->participants[$participant->index]->communication = new Communication(); } $bookingData->participants[$participant->index]->communication->email = $participant->email; $bookingData->participants[$participant->index]->communication->mobile = $participant->mobile; } } // Update applicant's data with personal data of first participant if (false !== $firstParticipant = reset($bookingData->participants)) { $bookingData->applicant->height = $firstParticipant->height; $bookingData->applicant->weight = $firstParticipant->weight; $bookingData->applicant->shoeSize = $firstParticipant->shoeSize; } $payload = [ 'idbuchung' => $bookingData->id, 'status' => $bookingData->status, 'idagentur' => $bookingData->agencyId, 'idreise' => $bookingData->travelId, 'idpartner' => $bookingData->hotelId, 'anmelder' => $bookingData->applicant->toPayload(), 'zahlung' => [ '@idzahlungsart' => $bookingData->paymentId, '@bezeichnung' => $bookingData->paymentLabel, '@art' => $bookingData->paymentType, ], 'teilnehmerliste' => [ 'teilnehmer' => [], ], 'zusatzleistungen' => [ 'zusatzleistung' => [], ], 'beförderungen' => [ 'beförderung' => [], ], 'ferienzielunterbringungen' => [ 'ferienzielunterbringung' => [], ], ]; foreach ($bookingData->participants as $index => $participant) { $payload['teilnehmerliste']['teilnehmer'][] = [ '@id' => $index, 'status' => $bookingData->participantsStatus[$index], ...$participant->toPayload(), ]; } foreach ($bookingData->additionalServices as $service) { $payload['zusatzleistungen']['zusatzleistung'][] = [ '@idleistung' => $service->id, '@anzahl' => count($service->mapping), '@zuordnung' => implode(',', $service->mapping), ]; } foreach ($bookingData->transportationServices as $service) { $payload['beförderungen']['beförderung'][] = [ '@idleistung' => $service->id, '@anzahl' => count($service->mapping), '@zuordnung' => implode(',', $service->mapping), ]; } foreach ($bookingData->rooms as $room) { $payload['ferienzielunterbringungen']['ferienzielunterbringung'][] = [ '@idzimmer' => $room->id, '@kategorie' => $room->category, '@idverpflegung' => $room->boardId, '@anreise' => $room->dateFrom ? $room->dateFrom->format('d.m.Y') : null, '@abreise' => $room->dateTo ? $room->dateTo->format('d.m.Y') : null, '@anzahl' => $room->totalCount, '@zuordnung' => implode(',', $room->mapping), ]; } if (0 < count($bookingData->pickupsTo)) { $payload['zustiege']['zustieg'] = []; foreach ($bookingData->pickupsTo as $pickup) { $payload['zustiege']['zustieg'][] = [ '@idzustieg' => $pickup->id, '@anzahl' => count($pickup->mapping), '@zuordnung' => implode(',', $pickup->mapping), ]; } } return $payload; } }