wip: initial commit
This commit is contained in:
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
namespace App\BusProNet\Model;
|
||||
|
||||
use App\Form\Model\BookingData;
|
||||
|
||||
class Booking
|
||||
{
|
||||
public ?int $id = null;
|
||||
public ?int $bookingNumber = null;
|
||||
public ?Travel $travelData = null;
|
||||
public ?string $status = null;
|
||||
public ?PersonalData $applicant = null;
|
||||
public ?int $participantCount = null;
|
||||
public ?float $price = null;
|
||||
public ?\DateTimeImmutable $bookingDate = null;
|
||||
public ?string $travel = null;
|
||||
public ?int $travelId = null;
|
||||
public ?string $travelCode = null;
|
||||
public ?\DateTimeImmutable $travelDate = null;
|
||||
public ?int $hotelId = null;
|
||||
public ?string $hotelName = null;
|
||||
public ?bool $document = null;
|
||||
public ?float $payment = null;
|
||||
public array $participantsStatus = [];
|
||||
public array $participants = [];
|
||||
public array $transportationServices = [];
|
||||
public array $additionalServices = [];
|
||||
public array $rooms = [];
|
||||
public ?int $invoiceNumber = null;
|
||||
public ?float $totalPrice = null;
|
||||
|
||||
public function getBalance(): float
|
||||
{
|
||||
if (null === $this->payment) {
|
||||
return $this->price;
|
||||
}
|
||||
|
||||
return $this->price - $this->payment;
|
||||
}
|
||||
|
||||
public function getAdditionalServicesByGroup(mixed $group): array
|
||||
{
|
||||
$group = (array) $group;
|
||||
return array_filter($this->additionalServices, function (Service $service) use ($group) {
|
||||
return in_array($service->subType, $group);
|
||||
});
|
||||
}
|
||||
|
||||
public function getAdditionalServicesForParticipantByGroup(int $participantIndex, mixed $group): array
|
||||
{
|
||||
$services = $this->getAdditionalServicesByGroup($group);
|
||||
|
||||
return array_filter($services, function (Service $service) use ($participantIndex) {
|
||||
return in_array($participantIndex, $service->mapping);
|
||||
});
|
||||
}
|
||||
|
||||
public function getTransportationServiceForParticipantAndDirection(int $participantIndex, string $direction): ?Service
|
||||
{
|
||||
foreach ($this->transportationServices as $service) {
|
||||
if ($service->direction !== $direction) {
|
||||
continue;
|
||||
}
|
||||
if (in_array($participantIndex, $service->mapping)) {
|
||||
return $service;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getRoomForParticipant(int $participantIndex): ?Room
|
||||
{
|
||||
foreach ($this->rooms as $room) {
|
||||
if (in_array($participantIndex, $room->mapping)) {
|
||||
return $room;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function getPriceForParticipant(int $participantIndex): float
|
||||
{
|
||||
$price = 0.0;
|
||||
|
||||
foreach ([...$this->transportationServices, ...$this->additionalServices] as $service) {
|
||||
if (in_array($participantIndex, $service->mapping) && isset($service->individualPrice[$participantIndex])) {
|
||||
$price += $service->individualPrice[$participantIndex];
|
||||
} elseif ($service->price) {
|
||||
$price += $service->price;
|
||||
}
|
||||
}
|
||||
|
||||
$room = $this->getRoomForParticipant($participantIndex);
|
||||
|
||||
if (isset($room->individualPrice[$participantIndex])) {
|
||||
$price += $room->individualPrice[$participantIndex];
|
||||
} elseif ($room->price) {
|
||||
$price += $room->price;
|
||||
}
|
||||
|
||||
return $price;
|
||||
}
|
||||
|
||||
public function isEditable(): bool
|
||||
{
|
||||
return $this->travelDate > new \DateTimeImmutable() && false === in_array($this->status, ['S', 'U']);
|
||||
}
|
||||
|
||||
public function toPayload(?BookingData $formData): array
|
||||
{
|
||||
// Reset services to participants mappings
|
||||
foreach ([...$this->additionalServices, ...$this->transportationServices] as $service) {
|
||||
$service->mapping = [];
|
||||
}
|
||||
// Update mappings and add previously unselected services
|
||||
foreach ($formData->participants as $participant) {
|
||||
$servicesToMap = [
|
||||
...$participant->courses,
|
||||
...$participant->additionalServices,
|
||||
...$participant->skiPass,
|
||||
...$participant->board,
|
||||
...$participant->rentals,
|
||||
];
|
||||
foreach ($servicesToMap as $service) {
|
||||
if (false === isset($this->additionalServices[$service->id])) {
|
||||
$serviceToAdd = $this->travelData->additionalServices[$service->id];
|
||||
$this->additionalServices[$service->id] = $serviceToAdd;
|
||||
$this->additionalServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price;
|
||||
}
|
||||
$this->additionalServices[$service->id]->mapping[] = $participant->index;
|
||||
}
|
||||
foreach ([$participant->transportationServiceTo, $participant->transportationServiceFro] as $service) {
|
||||
if (false === isset($this->transportationServices[$service->id])) {
|
||||
$serviceToAdd = $this->travelData->transportationServices[$service->id];
|
||||
$this->transportationServices[$service->id] = $serviceToAdd;
|
||||
$this->transportationServices[$service->id]->individualPrice[$participant->index] = $serviceToAdd->price;
|
||||
}
|
||||
$this->transportationServices[$service->id]->mapping[] = $participant->index;
|
||||
}
|
||||
}
|
||||
// Remove services with empty mappings
|
||||
foreach ($this->additionalServices as $service) {
|
||||
if (0 === count($service->mapping)) {
|
||||
unset($this->additionalServices[$service->id]);
|
||||
}
|
||||
}
|
||||
foreach ($this->transportationServices as $service) {
|
||||
if (0 === count($service->mapping)) {
|
||||
unset($this->transportationServices[$service->id]);
|
||||
}
|
||||
}
|
||||
// Update participants' personal data
|
||||
foreach ($formData->participants as $participant) {
|
||||
$this->participants[$participant->index]->firstName = $participant->firstName;
|
||||
$this->participants[$participant->index]->lastName = $participant->lastName;
|
||||
$this->participants[$participant->index]->dateOfBirth = $participant->dateOfBirth;
|
||||
$this->participants[$participant->index]->gender = $participant->gender;
|
||||
$this->participants[$participant->index]->nationality = $participant->nationality;
|
||||
$this->participants[$participant->index]->height = $participant->height;
|
||||
$this->participants[$participant->index]->weight = $participant->weight;
|
||||
$this->participants[$participant->index]->shoeSize = $participant->shoeSize;
|
||||
$this->participants[$participant->index]->communication->email = $participant->email;
|
||||
$this->participants[$participant->index]->communication->mobile = $participant->mobile;
|
||||
}
|
||||
|
||||
return [
|
||||
'status' => $this->status,
|
||||
'idreise' => $this->travelId,
|
||||
'anmelder' => $this->applicant->toPayload(),
|
||||
'teilnehmerliste' => [],
|
||||
'beförderungen' => [],
|
||||
'unterbringungen' => [],
|
||||
'zusatzleistungen' => [],
|
||||
'zustiege' => [],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user