checkMandatoryFields($command); $type = $command->getField('type') ?: Entities::APPOINTMENT; /** @var BookingApplicationService $bookingAS */ $bookingAS = $this->container->get('application.booking.booking.service'); /** @var CustomerBookingRepository $customerBookingRepository */ $customerBookingRepository = $this->container->get('domain.booking.appointment.repository'); /** @var ReservationServiceInterface $reservationService */ $reservationService = $this->container->get('application.reservation.service')->get($type); $customerBookingRepository->beginTransaction(); $appointmentData = $bookingAS->getAppointmentData($command->getFields()); try { $bookingData = $reservationService->process($result, $appointmentData, true, true, true); } catch (QueryExecutionException $e) { $customerBookingRepository->rollback(); throw $e; } if ($result->getResult() === CommandResult::RESULT_ERROR) { $customerBookingRepository->rollback(); return $result; } /** @var AbstractBooking $reservation */ $reservation = $bookingData[$type]; /** @var CustomerBooking $booking */ $booking = $bookingData['booking']; /** @var AbstractBookable $bookable */ $bookable = $bookingData['bookable']; $paymentData = $command->getField('payment'); $paymentAmount = $reservationService->getPaymentAmount($booking, $bookable); switch ($paymentData['gateway']) { case ('payPal'): /** @var PayPalService $paymentService */ $paymentService = $this->container->get('infrastructure.payment.payPal.service'); $response = $paymentService->complete([ 'transactionReference' => $paymentData['data']['transactionReference'], 'PayerID' => $paymentData['data']['PayerId'], 'amount' => $paymentAmount, ]); if (!$response->isSuccessful()) { $result->setResult(CommandResult::RESULT_ERROR); $result->setMessage(FrontendStrings::getCommonStrings()['payment_error']); $result->setData([ 'paymentSuccessful' => false ]); $customerBookingRepository->rollback(); return $result; } break; case ('stripe'): /** @var StripeService $paymentService */ $paymentService = $this->container->get('infrastructure.payment.stripe.service'); try { $response = $paymentService->execute([ 'amount' => $paymentAmount, 'token' => $paymentData['data']['token'] ]); if (!$response->isSuccessful()) { $result->setResult(CommandResult::RESULT_ERROR); $result->setMessage($response->getData()['error']['message']); $result->setData([ 'paymentSuccessful' => false ]); $customerBookingRepository->rollback(); return $result; } } catch (\Exception $e) { $result->setResult(CommandResult::RESULT_ERROR); $result->setMessage($e->getMessage()); $result->setData([ 'paymentSuccessful' => false ]); $customerBookingRepository->rollback(); return $result; } break; } $result->setResult(CommandResult::RESULT_SUCCESS); $result->setMessage('Successfully added booking'); $result->setData([ 'type' => $type, $type => $reservation->toArray(), Entities::BOOKING => $booking->toArray(), 'utcTime' => $reservationService->getBookingPeriods($reservation, $booking, $bookable), 'appointmentStatusChanged' => $bookingData['appointmentStatusChanged'] ]); $customerBookingRepository->commit(); return $result; } }