diff --git a/trunk/src/AppBundle/Controller/BookingController.php b/trunk/src/AppBundle/Controller/BookingController.php
index 584221f4..05cbb6e8 100644
--- a/trunk/src/AppBundle/Controller/BookingController.php
+++ b/trunk/src/AppBundle/Controller/BookingController.php
@@ -1,871 +1,874 @@
-
- * @date 12/08/2016
- */
-
-namespace AppBundle\Controller;
-
-
-use AppBundle\Entity\BookingRequest;
-use AppBundle\Entity\BreadcrumbEntry;
-use AppBundle\Entity\Page;
-use AppBundle\Entity\TravelDate;
-use AppBundle\Entity\Traveler;
-use AppBundle\Entity\TravelPeriodPrice;
-use AppBundle\Entity\TravelPeriodPriceType;
-use AppBundle\Form\BookingRequestType;
-use AppBundle\Util;
-use Symfony\Bundle\FrameworkBundle\Controller\Controller;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
-
-class BookingController extends Controller
-{
- /** @var TravelPeriodPriceType[] $priceTypeById */
- private $priceTypeById;
-
- /**
- * The routing for this action is entirely controlled by KernelControllerListener!
- *
- * @param Page $travelProgramPage
- * @param Request $request
- * @param $action
- *
- * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
- * @throws \Exception
- */
-
- private function getErrorMessages(\Symfony\Component\Form\Form $form) {
- $errors = array();
-
- foreach ($form->getErrors() as $key => $error) {
- if ($form->isRoot()) {
- $errors['#'][] = $error->getMessage();
- } else {
- $errors[] = $error->getMessage();
- }
- }
-
- foreach ($form->all() as $child) {
- if (!$child->isValid()) {
- $errors[$child->getName()] = $this->getErrorMessages($child);
- }
- }
-
- return $errors;
- }
-
- public function indexAction(Page $travelProgramPage, $action, Request $request)
- {
- $travelProgram = $travelProgramPage->getTravelProgram();
- if (!$request->query->has('nr'))
- {
- return $this->redirect($travelProgramPage->getUrlPath());
- }
- $this->getDoctrine()->getRepository('AppBundle:TravelPeriod')->getTrueTravelPeriods($travelProgram);
-
- $this->priceTypeById = $this->getDoctrine()->getRepository('AppBundle:TravelPeriodPriceType')->findAllIndexedById();
-
- // #TODO Consider changing key of travel dates
- foreach ($travelProgram->getTravelDates() as $curTravelDate)
- {
-
-
- if($curTravelDate->getStatus() != 0){
- if ($curTravelDate->getName() == $request->query->get('nr'))
- {
- $travelDate = $curTravelDate;
- break;
- }
- }
- }
-
- if (!isset($travelDate))
- {
- throw $this->createNotFoundException();
- }
-
- /** @var BookingRequest $bookingRequest */
- $bookingRequest = new BookingRequest();
- if ($request->getMethod() != 'POST')
- {
- $bookingRequest->setRoomCount(0);
- }
- $form = $this->createForm(BookingRequestType::class, $bookingRequest, [
- 'travel_date' => $travelDate,
- 'travel_program' => $travelProgram
- ]);
- if ($request->getMethod() == 'POST')
- {
- $form->handleRequest($request);
- $bookingRequest = $form->getData();
- }
- $htmlSummary = [];
- $bookingPriceInfo = [];
- $totalPrice = $this->calculatePrice($travelDate, $bookingRequest, $travelProgram->getCategory()->getId(), $travelProgram->getDepositPercent(), $htmlSummary, $bookingPriceInfo);
-
- if ($action == '/buchen')
- {
- $breadcrumbEntries = Util::createBreadcrumb($travelProgramPage);
- $breadcrumbEntries[] = new BreadcrumbEntry('Buchen');
-
- if ($request->getMethod() == 'POST' && $form->isValid())
- {
-
- $errors = array();
- foreach ($form as $fieldName => $formField) {
- foreach ($formField->getErrors(true) as $error) {
- $errors[$fieldName] = $error->getMessage();
- }
- }
-
-
- $booking = $this->getDoctrine()->getRepository('AppBundle:TravelBooking')->createFromBookingRequest(
- $bookingRequest, $travelDate, $bookingPriceInfo);
-
- $em = $this->getDoctrine()->getManager();
- $em->persist($booking);
- $em->flush();
-
-
- $crmBookingUrl = $this->get('app.booking_exporter')->process($bookingRequest, $travelDate, $bookingPriceInfo);
-
- if (!$crmBookingUrl)
- {
- $crmBookingUrl = '[CRM-EXPORT FEHLGESCHLAGEN]';
- }
- else
- {
- $crmBookingUrl = preg_replace('/\\/api/', '', $crmBookingUrl).'/edit';
- }
-
- $this->get('mailer')->send(\Swift_Message::newInstance()
- ->setSubject('Ihr Buchungsauftrag bei STERN TOURS')
- ->setFrom('stern@stern-tours.de', 'STERN TOURS')
- ->setTo($bookingRequest->getEmail()) //
- ->setBody(
- $this->renderView('default/email/bookingConfirmationEmail.txt.twig', [
- 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
- 'booking_request' => $bookingRequest,
- 'booking_price_info' => $bookingPriceInfo,
- 'travel_date' => $travelDate,
- 'breadcrumb_entries' => $breadcrumbEntries,
- 'summary' => $htmlSummary,
-
- ]),
- 'text/plain', 'utf-8'
- )
- );
-
- $this->get('mailer')->send(\Swift_Message::newInstance()
- ->setSubject('BUCHUNG: '. $travelProgram->getTitle() .'('. $travelDate->getName() .')')
- ->setFrom('stern@stern-tours.de', 'STERN TOURS')
- ->setTo("stern@stern-tours.de")
- ->setBody(
- $this->renderView('default/email/bookingServiceEmail.txt.twig', [
- 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
- 'crm_url' => $crmBookingUrl,
- 'travel_program_url' => Util::getBaseUrl() . $travelProgramPage->getUrlPath(),
- 'booking_request' => $bookingRequest,
- 'booking_price_info' => $bookingPriceInfo,
- 'travel_date' => $travelDate,
- 'breadcrumb_entries' => $breadcrumbEntries,
- 'summary' => $htmlSummary,
-
- ]),
- 'text/plain', 'utf-8'
- )
- );
-
- // #TODO This will lead to multiple bookings due to multiple form submission. Redirect instead!
- return $this->render('default/pages/bookingConfirmation.html.twig', [
- 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
- 'page' => $travelProgramPage,
- 'breadcrumb_entries' => $breadcrumbEntries,
- 'show_nav_sidebar_widget' => false,
- 'show_travel_guide_sidebar_widget' => false,
- 'show_travel_magazine_sidebar_widget' => false,
- 'show_offers_sidebar_widget' => false,
- 'show_search_sidebar_widget' => false,
- 'show_feedbacks_sidebar_widget' => false,
- 'show_seal_of_approval' => true,
- 'booking' => $booking,
- 'travel_program' => $travelProgram,
- 'summary' => $htmlSummary,
- 'total_price' => $totalPrice,
- 'booking_price_info' => $bookingPriceInfo,
-
- ]);
- }
- /* $string = (string) $form->getErrors(true, true);
- var_dump($string);
- var_dump( $form->isValid());
- var_dump($this->getErrorMessages($form));
-
- die();
-*/
- return $this->render('default/pages/booking.html.twig', [
- 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
- 'page' => $travelProgramPage,
- 'breadcrumb_entries' => $breadcrumbEntries,
- 'show_nav_sidebar_widget' => false,
- 'show_travel_guide_sidebar_widget' => false,
- 'show_travel_magazine_sidebar_widget' => false,
- 'show_offers_sidebar_widget' => false,
- 'show_search_sidebar_widget' => false,
- 'show_feedbacks_sidebar_widget' => false,
- 'show_seal_of_approval' => true,
- 'travel_program' => $travelProgram,
- 'travel_date' => $travelDate,
- 'form' => $form->createView(),
- 'price_type_by_id' => $this->priceTypeById,
- 'summary' => $htmlSummary,
- 'total_price' => $totalPrice,
- 'booking_price_info' => $bookingPriceInfo,
- 'mediator_terms_filename' => $travelProgram->getIsMediated()
- ? $this->getDoctrine()->getRepository('AppBundle:TravelOrganizer')->find(1)->getFileName()
- : null
- ]);
- }
-
- elseif ($action == '/berechne-gesamtpreis')
- {
- return $this->render('default/components/booking/summary.html.twig', [
- 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
- 'summary' => $htmlSummary,
- 'total_price' => $totalPrice,
- 'booking_price_info' => $bookingPriceInfo,
- 'show_detail' => true,
-
- ]);
- }
- throw new \Exception('Unknow BookingController action: '. $action);
- }
-
- private function calcNumTravelerLabel($number)
- {
- $ret = 0;
- if($number > 0)
- $ret = 1;
-
- return $ret;
- }
-
- public function calculatePrice(TravelDate $travelDate, BookingRequest $bookingRequest, $categoryId, $depositPercent = null, &$outHtmlSummary = null, &$outPriceInfo = null)
- {
- $ret = 0;
- $insuranceAssessmentBasis = 0;
- $insuranceAssessmentChildBasis = 0;
-
- $travelerCount = $bookingRequest->getTravelerCount();
-
- $singleRoomCount = $bookingRequest->getSingleRoomCount();
- $doubleRoomCount = $bookingRequest->getDoubleRoomCount();
- $tripleRoomCount = $bookingRequest->getTripleRoomCount();
-
- $singleRoomChildCount = $bookingRequest->getSingleRoomChildCount();
- $doubleRoomChildCount = $bookingRequest->getDoubleRoomChildCount();
- $tripleRoomChildCount = $bookingRequest->getTripleRoomChildCount();
-
- $childrenCount = $bookingRequest->getChildrenCount();
-
- if (isset($outHtmlSummary))
- {
- $insuranceHtmlSummary = [];
- }
-
- if (isset($outPriceInfo))
- {
- $outPriceInfo['rooms'] = [];
- $outPriceInfo['insurances'] = [];
- $outPriceInfo['insurancesOut'] = [];
- $outPriceInfo['options'] = [];
- $outPriceInfo['classOptions'] = [];
- $outPriceInfo['departure'] = 0;
- $outPriceInfo['departure_extra'] = 0;
- $outPriceInfo['flight_price'] = 0;
- $outPriceInfo['final_payment_date'] = $travelDate->getFinalPaymentDate();
- $outPriceInfo['final_payment_date_str'] = $travelDate->getFinalPaymentDateStr();
- $outPriceInfo['discount'] = [];
- }
-
- $tempDepartureHTML = array();
- //ABFLUG
- if($bookingRequest->getDeparture() != null)
- {
- $departure = Util\DepartureUtil::limitIndividualArrivalPrice($bookingRequest->getDeparture(),
- $travelDate->getFlightPrice());
- if (isset($outPriceInfo))
- {
- $outPriceInfo['departure'] = $departure;
- }
-
- if ($departure->getExtraCharge() != 0)
- {
- $insuranceAssessmentBasis += $departure->getExtraCharge();
- $insuranceAssessmentChildBasis += $departure->getExtraCharge();
- $a = ($travelerCount + $childrenCount) * $departure->getExtraCharge();
- $ret += $a;
- $outPriceInfo['departure_extra'] += $a;
-
- if (isset($outHtmlSummary))
- {
- $key = $departure->getExtraCharge();
- if(!empty($tempDepartureHTML[$key])) {
- $tempDepartureHTML[$key]['count'] = $tempDepartureHTML[$key]['count'] + ($travelerCount + $childrenCount);
- $tempDepartureHTML[$key]['value'] = $tempDepartureHTML[$key]['value'] + $a;
- }else{
- $tempDepartureHTML[$key] = array(
- 'value' => $a,
- 'label_first' => ($departure->getExtraCharge() > 0 ? 'Aufschlag' : 'Abzug') . ' für Abfahrts-/Abflugort "'. $departure->getName(),
- 'label_last' => Util::formatPrice($departure->getExtraCharge()) . ' pro Person',
- 'count' => ($travelerCount + $childrenCount),
- );
- }
- }
- }
- }
-
- //OPTIONEN
- $tempOptionHTML = array();
- foreach ($bookingRequest->getTravelOptions() as $travelOption)
- {
- $insuranceAssessmentBasis += $travelOption->getPrice();
- $insuranceAssessmentChildBasis += $travelOption->getPriceChildren();
- $a = $travelerCount * $travelOption->getPrice();
- $a += $childrenCount * $travelOption->getPriceChildren();
- $ret += $a;
- //OPTIONS
- if (isset($outHtmlSummary))
- {
- $key = $travelOption->getId();
- if(!empty($tempOptionHTML[$key])) {
- // $tempOptionHTML[$key]['count'] = $tempOptionHTML[$key]['count'] + $travelerCount;
- $tempOptionHTML[$key]['value'] = $tempOptionHTML[$key]['value'] + $a;
- }else{
- $tempOptionHTML[$key] = array(
- 'value' => $a,
- 'label_first' => $travelOption->getName(),
- 'label_last' => Util::formatPrice($travelOption->getPrice()) . ' pro Person',
- 'count' => $travelerCount + $childrenCount,
- 'childCount' => $childrenCount,
- 'price_child' => Util::formatPrice($travelOption->getPriceChildren()) . ' pro Kind',
- );
- }
- }
- if (isset($outPriceInfo))
- {
- $outPriceInfo['options'][] = $travelOption;
- }
- }
-
- $persons = [
- 'total' => $travelerCount,
- 'adults' => $travelerCount,
- 'singleRoomPersons' => $singleRoomCount,
- 'singleRoomChildPersons' => $singleRoomChildCount,
- 'doubleRoomPersons' => $doubleRoomCount * 2,
- 'doubleRoomChildPersons' => $doubleRoomChildCount * 2,
- 'tripleRoomPersons' => $tripleRoomCount * 3,
- 'tripleRoomChildPersons' => $tripleRoomChildCount * 3,
- 'children' => 0 //TODO
- ];
-
- //Komfort
- $possibleRooms = $this->getRooms($travelDate->getPrices(), $persons);
- $tempComfortHTML = array();
- if ($bookingRequest->getComfort())
- {
- foreach ($possibleRooms as $room)
- {
- $insuranceAssessmentBasis += $room['price']->getEffectiveComfortPrice();
- $insuranceAssessmentChildBasis += $room['price']->getEffectiveComfortPrice();
-
- $adultCount = $room['persons']['adults'];
- $childrenCount = $room['persons']['children'];
-
- $a = $adultCount * $room['price']->getEffectiveComfortPrice();;
- $b = $childrenCount * $room['price']->getEffectiveComfortPrice();
- $ret += $a + $b;
-
- if (isset($outHtmlSummary))
- {
- $key = intval($room['price']->getEffectiveComfortPrice());
- if(!empty($tempComfortHTML[$key])) {
- $tempComfortHTML[$key]['count'] = $tempComfortHTML[$key]['count'] + $adultCount + $childrenCount;
- $tempComfortHTML[$key]['value'] = $tempComfortHTML[$key]['value'] + $a + $b;
- }else{
- $tempComfortHTML[$key] = array(
- 'value' => $a + $b,
- 'label_first' => 'Komfort-Kategorie',
- 'label_last' => Util::formatPrice($room['price']->getEffectiveComfortPrice()) . ' pro Person',
- 'count' => $adultCount + $childrenCount,
- );
- }
- }
- if (isset($outPriceInfo))
- {
- $outPriceInfo['classOptions'][] = [
- 'count' => $room['persons']['total'],
- 'name' => 'zugebuchte Leistung: Komfort (4 Sterne)',
- 'price' => $room['price']->getEffectiveComfortPrice()
- ];
- }
- }
- }
-
- $insuranceTotal = 0;
- $tempInsuranceHTML = array();
- $tempRoomHTML = array();
- $tempDiscountHTML = array();
- //ROOMS DISCOUNT Versicherungen
- foreach ($possibleRooms as $room)
- {
- $adultCount = $room['persons']['adults'];
- $childrenCount = $room['persons']['children'];
-
- $singleFullPrice = $room['price']->getEffectivePrice();
- $childPrice = $room['price']->getEffectiveChildPrice();
-
- $roomPrice = ($singleFullPrice * $adultCount) + ($childPrice * $room['persons']['children']);
-
- $singleDiscountPrice = $room['price']->getEffectiveDiscountPrice();
- $singleChildDiscountPrice = $room['price']->getEffectiveChildDiscountPrice();
- $discount = ($singleDiscountPrice === null) ? 0 : ($adultCount * ($singleDiscountPrice - $singleFullPrice));
- $childDiscount = ($singleChildDiscountPrice === null) ? 0 : ($childrenCount * ($singleChildDiscountPrice - $childPrice));
- $ret += $roomPrice + $discount + $childDiscount;
-
- $singel_flight_price = $travelDate->getFlightCalcPrice();
- $outPriceInfo['flight_price'] += (($singel_flight_price * $adultCount) + ($singel_flight_price * $room['persons']['children']));
-
- //Room price
- if (isset($outPriceInfo))
- {
- $price = $singleDiscountPrice ?? $singleFullPrice;
- $price += $singleChildDiscountPrice ?? $childPrice;
-
- $outPriceInfo['rooms'][] = [
- 'name' => $room['priceType']->getName(),
- 'adults' => $adultCount,
- 'children' => $childrenCount,
- 'price' => $singleDiscountPrice ?? $singleFullPrice,
- 'price_children' => $singleChildDiscountPrice ?? $childPrice,
- 'price_total' => $roomPrice + $discount + $childDiscount,
- ];
- }
-
-
- //Room html
- if (isset($outHtmlSummary))
- {
- //ROOMS
- $key = $room['priceType']->getId();
- if(!empty($tempRoomHTML[$key])) {
- $tempRoomHTML[$key]['count'] = $tempRoomHTML[$key]['count'] + 1;
- $tempRoomHTML[$key]['value'] = $tempRoomHTML[$key]['value'] + $roomPrice;
- }else{
- $tempRoomHTML[$key] = array(
- 'value' => $roomPrice,
- 'label_first' => $room['priceType']->getName(),
- 'label_last' => Util::formatPrice($singleFullPrice) . ' pro Person',
- 'count' => 1,
- 'childCount' => $room['persons']['children'],
- 'price_child' => Util::formatPrice($room['price']->getEffectiveChildPrice()),
- );
- }
- //DISCOUNT
- if ($singleDiscountPrice !== null)
- {
- $key = intval(($singleFullPrice - $singleDiscountPrice)*100);
- if(!empty($tempDiscountHTML[$key])) {
- $tempDiscountHTML[$key]['count'] = $tempDiscountHTML[$key]['count'] + $adultCount;
- $tempDiscountHTML[$key]['value'] = $tempDiscountHTML[$key]['value'] + $discount;
- }else{
- $tempDiscountHTML[$key] = array(
- 'value' => $discount,
- 'label_first' => 'Rabatt',
- 'label_last' => Util::formatPrice($singleFullPrice - $singleDiscountPrice) . ' pro Person',
- 'count' => $adultCount,
- );
- }
- if($childDiscount > 0){
- $key = intval(($childPrice - $singleChildDiscountPrice)*100);
- if(!empty($tempDiscountHTML[$key])) {
- $tempDiscountHTML[$key]['count'] = $tempDiscountHTML[$key]['count'] + $childrenCount;
- $tempDiscountHTML[$key]['value'] = $tempDiscountHTML[$key]['value'] + $childDiscount;
- }else{
- $tempDiscountHTML[$key] = array(
- 'value' => $childDiscount,
- 'label_first' => 'Rabatt',
- 'label_last' => Util::formatPrice($childPrice - $singleChildDiscountPrice) . ' pro Person',
- 'count' => $childrenCount,
- );
- }
- }
- if (isset($outPriceInfo))
- {
- $key = intval(($singleFullPrice - $singleDiscountPrice)*100);
- if(!empty($outPriceInfo['discount'][$key])) {
- $outPriceInfo['discount'][$key]['count'] = $outPriceInfo['discount'][$key]['count'] + $adultCount;
- $outPriceInfo['discount'][$key]['value'] = $outPriceInfo['discount'][$key]['value'] + $discount;
- }else{
- $outPriceInfo['discount'][$key] = array(
- 'value' => $discount,
- 'label_first' => 'Rabatt',
- 'label_last' => Util::formatPrice($singleFullPrice - $singleDiscountPrice) . ' pro Person',
- 'count' => $adultCount,
- );
- }
- if($childDiscount > 0){
- $key = intval(($childPrice - $singleChildDiscountPrice)*100);
- if(!empty($outPriceInfo['discount'][$key])) {
- $outPriceInfo['discount'][$key]['count'] = $outPriceInfo['discount'][$key]['count'] + $childrenCount;
- $outPriceInfo['discount'][$key]['value'] = $outPriceInfo['discount'][$key]['value'] + $childDiscount;
- }else{
- $outPriceInfo['discount'][$key] = array(
- 'value' => $childDiscount,
- 'label_first' => 'Rabatt',
- 'label_last' => Util::formatPrice($childPrice - $singleChildDiscountPrice) . ' pro Person',
- 'count' => $childrenCount,
- );
- }
- }
- }
-
- }
-
- //Versicherung price + html
- if ($bookingRequest->getInsurance() && $adultCount > 0)
- {
- $curAssessmentBasis = $insuranceAssessmentBasis + ($singleDiscountPrice ?? $singleFullPrice);
- $curAssessmentChildBasis = $insuranceAssessmentChildBasis + ($singleChildDiscountPrice ?? $childPrice);
- $insurancePrice = $this->getDoctrine()->getRepository('AppBundle:TravelInsurancePrice')
- ->findOneByInsuranceIdAndAssessmentBasis($bookingRequest->getInsurance()->getId(), $curAssessmentBasis);
- $insuranceChildPrice = $this->getDoctrine()->getRepository('AppBundle:TravelInsurancePrice')
- ->findOneByInsuranceIdAndAssessmentBasis($bookingRequest->getInsurance()->getId(), $curAssessmentChildBasis);
- $insurancePriceValue = $insurancePrice->getPrice() > 0 ? $insurancePrice->getPrice() : round($insurancePrice->getPercent() * $curAssessmentBasis / 100, 2);
- $insuranceChildPriceValue = $insuranceChildPrice->getPrice() > 0 ? $insuranceChildPrice->getPrice() : round($insuranceChildPrice->getPercent() * $curAssessmentChildBasis / 100, 2);
-
-
- $a = $adultCount * $insurancePriceValue;
- $b = $childrenCount * $insuranceChildPriceValue;
- $insuranceTotal += $a + $b;
- $ret += $a + $b;
-
- if (isset($insuranceHtmlSummary))
- {
- if(!empty($tempInsuranceHTML[$insurancePriceValue])){
- $tempInsuranceHTML[$insurancePriceValue]['count'] = intval($tempInsuranceHTML[$insurancePriceValue]['count']) + $adultCount;
- $tempInsuranceHTML[$insurancePriceValue]['value'] = $tempInsuranceHTML[$insurancePriceValue]['value'] + $a;
- }else{
- $tempInsuranceHTML[$insurancePriceValue] = array(
- 'value' => $a,
- 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insurancePrice->getCode() .') ',
- 'label_last' => Util::formatPrice($insurancePriceValue) . ' pro Person',
- 'count' => $adultCount,
-
- );
- }
- if($b > 0){
- if(!empty($tempInsuranceHTML[$insuranceChildPriceValue])){
- $tempInsuranceHTML[$insuranceChildPriceValue]['count'] = intval($tempInsuranceHTML[$insuranceChildPriceValue]['count']) + $childrenCount;
- $tempInsuranceHTML[$insuranceChildPriceValue]['value'] = $tempInsuranceHTML[$insuranceChildPriceValue]['value'] + $b;
- }else{
- $tempInsuranceHTML[$insuranceChildPriceValue] = array(
- 'value' => $b,
- 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insuranceChildPrice->getCode() .') ',
- 'label_last' => Util::formatPrice($insuranceChildPriceValue) . ' pro Kind',
- 'count' => $childrenCount,
-
- );
- }
- }
- }
- if (isset($outPriceInfo))
- {
- if(!empty($outPriceInfo['insurancesOut'][$insurancePriceValue])){
- $outPriceInfo['insurancesOut'][$insurancePriceValue]['count'] = intval($outPriceInfo['insurancesOut'][$insurancePriceValue]['count']) + $childrenCount;
- $outPriceInfo['insurancesOut'][$insurancePriceValue]['value'] = $outPriceInfo['insurancesOut'][$insurancePriceValue]['value'] + $b;
- }else{
- $outPriceInfo['insurancesOut'][$insurancePriceValue] = [
- 'value' => $a,
- 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insurancePrice->getCode() .') ',
- 'label_last' => Util::formatPrice($insurancePriceValue) . ' pro Person',
- 'count' => $adultCount,
- ];
- }
- if($b > 0){
- if(!empty($outPriceInfo['insurancesOut'][$insuranceChildPriceValue])){
- $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['count'] = intval($outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['count']) + $childrenCount;
- $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['value'] = $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['value'] + $b;
- }else{
- $outPriceInfo['insurancesOut'][$insuranceChildPriceValue] = [
- 'value' => $b,
- 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insuranceChildPrice->getCode() .') ',
- 'label_last' => Util::formatPrice($insuranceChildPriceValue) . ' pro Kind',
- 'count' => $childrenCount,
- ];
- }
- }
-
- $outPriceInfo['insurances'][] = [
- 'insurance' => $bookingRequest->getInsurance(),
- 'insurancePriceValue' => $insurancePriceValue,
- 'insurancePrice' => $insurancePrice,
- 'count' => $adultCount,
- 'insuranceChildPriceValue' => $insuranceChildPriceValue,
- 'insuranceChildPrice' => $insuranceChildPrice,
- 'countChild' => $childrenCount,
- ];
- }
- }
- }
- }
-
-
-
-
- //ROOMS
- if(count($tempRoomHTML) > 0){
- foreach ($tempRoomHTML as $item) {
- $label = ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].']';
- if($item['childCount'] > 0){
- $label .= ' [ + Kind: '.$item['price_child'];
- }
- $label .= ']';
- $outHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => $label,
- ];
- }
- }
-
- //Comfort
- if(count($tempComfortHTML) > 0){
- foreach ($tempComfortHTML as $item) {
- $outHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
- ];
- }
- }
-
- //Departure
- if(count($tempDepartureHTML) > 0){
- foreach ($tempDepartureHTML as $item) {
- $outHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
- ];
- }
- }
-
- //DISCOUNT
- if(count($tempDiscountHTML) > 0){
- foreach ($tempDiscountHTML as $item) {
- $insuranceHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
- ];
- }
- }
- //options
- if(count($tempOptionHTML) > 0){
- foreach ($tempOptionHTML as $item) {
- $label = ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].']';
- if($item['childCount'] > 0){
- $label .= ' ['.$item['price_child'].']';
- }
- $outHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => $label,
- ];
- }
- }
-
-
- //Versicherungen
- if(count($tempInsuranceHTML) > 0 ){
- foreach ($tempInsuranceHTML as $item) {
- $insuranceHtmlSummary[] =[
- 'value' => $item['value'],
- 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
- ];
- }
- }
-
-
-
-
- if (isset($insuranceHtmlSummary))
- {
- $outHtmlSummary = array_merge($outHtmlSummary, $insuranceHtmlSummary);
- }
- if (isset($outPriceInfo))
- {
- $outPriceInfo['total'] = $ret;
- $outPriceInfo['totalWithoutInsurance'] = $ret - $insuranceTotal;
-
- if($outPriceInfo['departure_extra'] >= 0){
- $outPriceInfo['flight_price'] = $outPriceInfo['flight_price'] + $outPriceInfo['departure_extra'];
- }else{
- $outPriceInfo['flight_price'] = 0;
- }
-
- if($depositPercent === null) {
- $depositPercent = 20;
- }
- //Aeqypten (20% from price)
- if($categoryId == 1){
- $deposit = ($outPriceInfo['total'] / 100 * $depositPercent);
- $outPriceInfo['deposit_total'] = $deposit;
- $outPriceInfo['final_payment'] = ($outPriceInfo['total'] - $outPriceInfo['deposit_total']);
- }else{
- //all 100% vom Flugpreis und 20% von der Landleistung.
- $deposit = (($outPriceInfo['total'] - $outPriceInfo['flight_price']) / 100 * $depositPercent);
- $outPriceInfo['deposit_total'] = ($deposit + $outPriceInfo['flight_price']);
- $outPriceInfo['final_payment'] = ($outPriceInfo['total'] - $outPriceInfo['deposit_total']);
- }
- }
-
- return $ret;
- }
-
- /**
- * @param TravelPeriodPrice[] $prices
- * @param $persons
- *
- * @return array
- */
- private function getRooms($prices, $persons)
- {
- $ret = [];
-
- foreach($prices as $price)
- {
- $priceTypeId = $price->getPriceTypeId();
- //with children
- $priceType = $this->priceTypeById[$priceTypeId];
-
- if($priceTypeId == 1 && $persons['singleRoomPersons'] > 0)
- {
- for($i = 0; $i < $persons['singleRoomPersons']; $i++)
- {
- $currentPersons = [
- 'total' => 1,
- 'adults' => 1,
- 'children' => 0 //TODO
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
-
- if($priceTypeId == 1 && $persons['singleRoomChildPersons'] > 0)
- {
- $priceTypeId = 2;
- $priceType = $this->priceTypeById[$priceTypeId];
-
- for($i = 0; $i < $persons['singleRoomChildPersons']; $i++)
- {
- $currentPersons = [
- 'total' => 1,
- 'adults' => 1,
- 'children' => 1
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
-
- if($priceTypeId == 3 && $persons['doubleRoomPersons'] > 0)
- {
- for($j = 0; $j < ($persons['doubleRoomPersons'] / 2); $j++)
- {
- $currentPersons = [
- 'total' => 2,
- 'adults' => 2,
- 'children' => 0
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
-
- if($priceTypeId == 3 && $persons['doubleRoomChildPersons'] > 0)
- {
- $priceTypeId = 4;
- $priceType = $this->priceTypeById[$priceTypeId];
-
- for($j = 0; $j < ($persons['doubleRoomChildPersons'] / 2); $j++)
- {
- $currentPersons = [
- 'total' => 2,
- 'adults' => 2,
- 'children' => 1
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
-
- if($priceTypeId == 5 && $persons['tripleRoomPersons'] > 0)
- {
- for($k = 0; $k < ($persons['tripleRoomPersons'] / 3); $k++)
- {
- $currentPersons = [
- 'total' => 3,
- 'adults' => 3,
- 'children' => 0
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
-
- if($priceTypeId == 5 && $persons['tripleRoomChildPersons'] > 0)
- {
- $priceTypeId = 7;
- $priceType = $this->priceTypeById[$priceTypeId];
-
- for($k = 0; $k < ($persons['tripleRoomChildPersons'] / 3); $k++)
- {
- $currentPersons = [
- 'total' => 3,
- 'adults' => 3,
- 'children' => 1
- ];
-
- $ret[] = [
- 'priceType' => $priceType,
- 'persons' => $currentPersons,
- 'price' => $price
- ];
- }
- }
- }
-
- return $ret;
- }
+
+ * @date 12/08/2016
+ */
+
+namespace AppBundle\Controller;
+
+
+use AppBundle\Entity\BookingRequest;
+use AppBundle\Entity\BreadcrumbEntry;
+use AppBundle\Entity\Page;
+use AppBundle\Entity\TravelDate;
+use AppBundle\Entity\Traveler;
+use AppBundle\Entity\TravelPeriodPrice;
+use AppBundle\Entity\TravelPeriodPriceType;
+use AppBundle\Form\BookingRequestType;
+use AppBundle\Util;
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class BookingController extends Controller
+{
+ /** @var TravelPeriodPriceType[] $priceTypeById */
+ private $priceTypeById;
+
+ /**
+ * The routing for this action is entirely controlled by KernelControllerListener!
+ *
+ * @param Page $travelProgramPage
+ * @param Request $request
+ * @param $action
+ *
+ * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
+ * @throws \Exception
+ */
+
+ private function getErrorMessages(\Symfony\Component\Form\Form $form) {
+ $errors = array();
+
+ foreach ($form->getErrors() as $key => $error) {
+ if ($form->isRoot()) {
+ $errors['#'][] = $error->getMessage();
+ } else {
+ $errors[] = $error->getMessage();
+ }
+ }
+
+ foreach ($form->all() as $child) {
+ if (!$child->isValid()) {
+ $errors[$child->getName()] = $this->getErrorMessages($child);
+ }
+ }
+
+ return $errors;
+ }
+
+ public function indexAction(Page $travelProgramPage, $action, Request $request)
+ {
+ $travelProgram = $travelProgramPage->getTravelProgram();
+ if (!$request->query->has('nr'))
+ {
+ return $this->redirect($travelProgramPage->getUrlPath());
+ }
+ $this->getDoctrine()->getRepository('AppBundle:TravelPeriod')->getTrueTravelPeriods($travelProgram);
+
+ $this->priceTypeById = $this->getDoctrine()->getRepository('AppBundle:TravelPeriodPriceType')->findAllIndexedById();
+
+ // #TODO Consider changing key of travel dates
+ foreach ($travelProgram->getTravelDates() as $curTravelDate)
+ {
+
+
+ if($curTravelDate->getStatus() != 0){
+ if ($curTravelDate->getName() == $request->query->get('nr'))
+ {
+ $travelDate = $curTravelDate;
+ break;
+ }
+ }
+ }
+
+ if (!isset($travelDate))
+ {
+ throw $this->createNotFoundException();
+ }
+
+ /** @var BookingRequest $bookingRequest */
+ $bookingRequest = new BookingRequest();
+ if ($request->getMethod() != 'POST')
+ {
+ $bookingRequest->setRoomCount(0);
+ }
+ $form = $this->createForm(BookingRequestType::class, $bookingRequest, [
+ 'travel_date' => $travelDate,
+ 'travel_program' => $travelProgram
+ ]);
+ if ($request->getMethod() == 'POST')
+ {
+ $form->handleRequest($request);
+ $bookingRequest = $form->getData();
+ }
+ $htmlSummary = [];
+ $bookingPriceInfo = [];
+ $totalPrice = $this->calculatePrice($travelDate, $bookingRequest, $travelProgram->getCategory()->getId(), $travelProgram->getDepositPercent(), $htmlSummary, $bookingPriceInfo);
+
+ if ($action == '/buchen')
+ {
+ $breadcrumbEntries = Util::createBreadcrumb($travelProgramPage);
+ $breadcrumbEntries[] = new BreadcrumbEntry('Buchen');
+
+ if ($request->getMethod() == 'POST' && $form->isValid())
+ {
+
+ $errors = array();
+ foreach ($form as $fieldName => $formField) {
+ foreach ($formField->getErrors(true) as $error) {
+ $errors[$fieldName] = $error->getMessage();
+ }
+ }
+
+
+ $booking = $this->getDoctrine()->getRepository('AppBundle:TravelBooking')->createFromBookingRequest(
+ $bookingRequest, $travelDate, $bookingPriceInfo);
+
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($booking);
+ $em->flush();
+
+
+ $crmBookingUrl = $this->get('app.booking_exporter')->process($bookingRequest, $travelDate, $bookingPriceInfo);
+
+ if (!$crmBookingUrl)
+ {
+ $crmBookingUrl = '[CRM-EXPORT FEHLGESCHLAGEN]';
+ }
+ else
+ {
+ $crmBookingUrl = preg_replace('/\\/api/', '', $crmBookingUrl).'/edit';
+ }
+
+ $this->get('mailer')->send(\Swift_Message::newInstance()
+ ->setSubject('Ihr Buchungsauftrag bei STERN TOURS')
+ ->setFrom('stern@stern-tours.de', 'STERN TOURS')
+ ->setTo($bookingRequest->getEmail()) //
+ ->setBody(
+ $this->renderView('default/email/bookingConfirmationEmail.txt.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
+ 'booking_request' => $bookingRequest,
+ 'booking_price_info' => $bookingPriceInfo,
+ 'travel_date' => $travelDate,
+ 'breadcrumb_entries' => $breadcrumbEntries,
+ 'summary' => $htmlSummary,
+
+ ]),
+ 'text/plain', 'utf-8'
+ )
+ );
+
+ $this->get('mailer')->send(\Swift_Message::newInstance()
+ ->setSubject('BUCHUNG: '. $travelProgram->getTitle() .'('. $travelDate->getName() .')')
+ ->setFrom('stern@stern-tours.de', 'STERN TOURS')
+ ->setTo("stern@stern-tours.de")
+ ->setBody(
+ $this->renderView('default/email/bookingServiceEmail.txt.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
+ 'crm_url' => $crmBookingUrl,
+ 'travel_program_url' => Util::getBaseUrl() . $travelProgramPage->getUrlPath(),
+ 'booking_request' => $bookingRequest,
+ 'booking_price_info' => $bookingPriceInfo,
+ 'travel_date' => $travelDate,
+ 'breadcrumb_entries' => $breadcrumbEntries,
+ 'summary' => $htmlSummary,
+
+ ]),
+ 'text/plain', 'utf-8'
+ )
+ );
+
+ // #TODO This will lead to multiple bookings due to multiple form submission. Redirect instead!
+ return $this->render('default/pages/bookingConfirmation.html.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
+ 'page' => $travelProgramPage,
+ 'breadcrumb_entries' => $breadcrumbEntries,
+ 'show_nav_sidebar_widget' => false,
+ 'show_travel_guide_sidebar_widget' => false,
+ 'show_travel_magazine_sidebar_widget' => false,
+ 'show_offers_sidebar_widget' => false,
+ 'show_search_sidebar_widget' => false,
+ 'show_feedbacks_sidebar_widget' => false,
+ 'show_seal_of_approval' => true,
+ 'booking' => $booking,
+ 'travel_program' => $travelProgram,
+ 'summary' => $htmlSummary,
+ 'total_price' => $totalPrice,
+ 'booking_price_info' => $bookingPriceInfo,
+
+ ]);
+ }
+ /* $string = (string) $form->getErrors(true, true);
+ var_dump($string);
+ var_dump( $form->isValid());
+ var_dump($this->getErrorMessages($form));
+
+ die();
+*/
+ return $this->render('default/pages/booking.html.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
+ 'page' => $travelProgramPage,
+ 'breadcrumb_entries' => $breadcrumbEntries,
+ 'show_nav_sidebar_widget' => false,
+ 'show_travel_guide_sidebar_widget' => false,
+ 'show_travel_magazine_sidebar_widget' => false,
+ 'show_offers_sidebar_widget' => false,
+ 'show_search_sidebar_widget' => false,
+ 'show_feedbacks_sidebar_widget' => false,
+ 'show_seal_of_approval' => true,
+ 'travel_program' => $travelProgram,
+ 'travel_date' => $travelDate,
+ 'form' => $form->createView(),
+ 'price_type_by_id' => $this->priceTypeById,
+ 'summary' => $htmlSummary,
+ 'total_price' => $totalPrice,
+ 'booking_price_info' => $bookingPriceInfo,
+ 'mediator_terms_filename' => $travelProgram->getIsMediated()
+ ? $this->getDoctrine()->getRepository('AppBundle:TravelOrganizer')->find(1)->getFileName()
+ : null
+ ]);
+ }
+
+ elseif ($action == '/berechne-gesamtpreis')
+ {
+ return $this->render('default/components/booking/summary.html.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
+ 'summary' => $htmlSummary,
+ 'total_price' => $totalPrice,
+ 'booking_price_info' => $bookingPriceInfo,
+ 'show_detail' => true,
+
+ ]);
+ }
+ throw new \Exception('Unknow BookingController action: '. $action);
+ }
+
+ private function calcNumTravelerLabel($number)
+ {
+ $ret = 0;
+ if($number > 0)
+ $ret = 1;
+
+ return $ret;
+ }
+
+ public function calculatePrice(TravelDate $travelDate, BookingRequest $bookingRequest, $categoryId, $depositPercent = null, &$outHtmlSummary = null, &$outPriceInfo = null)
+ {
+ $ret = 0;
+ $insuranceAssessmentBasis = 0;
+ $insuranceAssessmentChildBasis = 0;
+
+ $travelerCount = $bookingRequest->getTravelerCount();
+
+ $singleRoomCount = $bookingRequest->getSingleRoomCount();
+ $doubleRoomCount = $bookingRequest->getDoubleRoomCount();
+ $tripleRoomCount = $bookingRequest->getTripleRoomCount();
+
+ $singleRoomChildCount = $bookingRequest->getSingleRoomChildCount();
+ $doubleRoomChildCount = $bookingRequest->getDoubleRoomChildCount();
+ $tripleRoomChildCount = $bookingRequest->getTripleRoomChildCount();
+
+ $childrenCount = $bookingRequest->getChildrenCount();
+
+ if (isset($outHtmlSummary))
+ {
+ $insuranceHtmlSummary = [];
+ }
+
+ if (isset($outPriceInfo))
+ {
+ $outPriceInfo['rooms'] = [];
+ $outPriceInfo['insurances'] = [];
+ $outPriceInfo['insurancesOut'] = [];
+ $outPriceInfo['options'] = [];
+ $outPriceInfo['classOptions'] = [];
+ $outPriceInfo['departure'] = 0;
+ $outPriceInfo['departure_extra'] = 0;
+ $outPriceInfo['flight_price'] = 0;
+ $outPriceInfo['final_payment_date'] = $travelDate->getFinalPaymentDate();
+ $outPriceInfo['final_payment_date_str'] = $travelDate->getFinalPaymentDateStr();
+ $outPriceInfo['discount'] = [];
+ }
+
+ $tempDepartureHTML = array();
+ //ABFLUG
+ if($bookingRequest->getDeparture() != null)
+ {
+ $departure = Util\DepartureUtil::limitIndividualArrivalPrice($bookingRequest->getDeparture(),
+ $travelDate->getFlightPrice());
+ if (isset($outPriceInfo))
+ {
+ $outPriceInfo['departure'] = $departure;
+ }
+
+ if ($departure->getExtraCharge() != 0)
+ {
+ $insuranceAssessmentBasis += $departure->getExtraCharge();
+ $insuranceAssessmentChildBasis += $departure->getExtraCharge();
+ $a = ($travelerCount + $childrenCount) * $departure->getExtraCharge();
+ $ret += $a;
+ $outPriceInfo['departure_extra'] += $a;
+
+ if (isset($outHtmlSummary))
+ {
+ $key = $departure->getExtraCharge();
+ if(!empty($tempDepartureHTML[$key])) {
+ $tempDepartureHTML[$key]['count'] = $tempDepartureHTML[$key]['count'] + ($travelerCount + $childrenCount);
+ $tempDepartureHTML[$key]['value'] = $tempDepartureHTML[$key]['value'] + $a;
+ }else{
+ $tempDepartureHTML[$key] = array(
+ 'value' => $a,
+ 'label_first' => ($departure->getExtraCharge() > 0 ? 'Aufschlag' : 'Abzug') . ' für Abfahrts-/Abflugort "'. $departure->getName(),
+ 'label_last' => Util::formatPrice($departure->getExtraCharge()) . ' pro Person',
+ 'count' => ($travelerCount + $childrenCount),
+ );
+ }
+ }
+ }
+ }
+
+ //OPTIONEN
+ $tempOptionHTML = array();
+ foreach ($bookingRequest->getTravelOptions() as $travelOption)
+ {
+ $insuranceAssessmentBasis += $travelOption->getPrice();
+ $insuranceAssessmentChildBasis += $travelOption->getPriceChildren();
+ $a = $travelerCount * $travelOption->getPrice();
+ $a += $childrenCount * $travelOption->getPriceChildren();
+ $ret += $a;
+ //OPTIONS
+ if (isset($outHtmlSummary))
+ {
+ $key = $travelOption->getId();
+ if(!empty($tempOptionHTML[$key])) {
+ // $tempOptionHTML[$key]['count'] = $tempOptionHTML[$key]['count'] + $travelerCount;
+ $tempOptionHTML[$key]['value'] = $tempOptionHTML[$key]['value'] + $a;
+ }else{
+ $tempOptionHTML[$key] = array(
+ 'value' => $a,
+ 'label_first' => $travelOption->getName(),
+ 'label_last' => Util::formatPrice($travelOption->getPrice()) . ' pro Person',
+ 'count' => $travelerCount + $childrenCount,
+ 'childCount' => $childrenCount,
+ 'price_child' => Util::formatPrice($travelOption->getPriceChildren()) . ' pro Kind',
+ );
+ }
+ }
+ if (isset($outPriceInfo))
+ {
+ $outPriceInfo['options'][] = $travelOption;
+ }
+ }
+
+ $persons = [
+ 'total' => $travelerCount,
+ 'adults' => $travelerCount,
+ 'singleRoomPersons' => $singleRoomCount,
+ 'singleRoomChildPersons' => $singleRoomChildCount,
+ 'doubleRoomPersons' => $doubleRoomCount * 2,
+ 'doubleRoomChildPersons' => $doubleRoomChildCount * 2,
+ 'tripleRoomPersons' => $tripleRoomCount * 3,
+ 'tripleRoomChildPersons' => $tripleRoomChildCount * 3,
+ 'children' => 0 //TODO
+ ];
+
+ //Komfort
+ $possibleRooms = $this->getRooms($travelDate->getPrices(), $persons);
+ $tempComfortHTML = array();
+ if ($bookingRequest->getComfort())
+ {
+ foreach ($possibleRooms as $room)
+ {
+ $insuranceAssessmentBasis += $room['price']->getEffectiveComfortPrice();
+ $insuranceAssessmentChildBasis += $room['price']->getEffectiveComfortPrice();
+
+ $adultCount = $room['persons']['adults'];
+ $childrenCount = $room['persons']['children'];
+
+ $a = $adultCount * $room['price']->getEffectiveComfortPrice();;
+ $b = $childrenCount * $room['price']->getEffectiveComfortPrice();
+ $ret += $a + $b;
+
+ if (isset($outHtmlSummary))
+ {
+ $key = intval($room['price']->getEffectiveComfortPrice());
+ if(!empty($tempComfortHTML[$key])) {
+ $tempComfortHTML[$key]['count'] = $tempComfortHTML[$key]['count'] + $adultCount + $childrenCount;
+ $tempComfortHTML[$key]['value'] = $tempComfortHTML[$key]['value'] + $a + $b;
+ }else{
+ $tempComfortHTML[$key] = array(
+ 'value' => $a + $b,
+ 'label_first' => 'Komfort-Kategorie',
+ 'label_last' => Util::formatPrice($room['price']->getEffectiveComfortPrice()) . ' pro Person',
+ 'count' => $adultCount + $childrenCount,
+ );
+ }
+ }
+ if (isset($outPriceInfo))
+ {
+ $outPriceInfo['classOptions'][] = [
+ 'count' => $room['persons']['total'],
+ 'name' => 'zugebuchte Leistung: Komfort (4 Sterne)',
+ 'price' => $room['price']->getEffectiveComfortPrice()
+ ];
+ }
+ }
+ }
+
+ $insuranceTotal = 0;
+ $tempInsuranceHTML = array();
+ $tempRoomHTML = array();
+ $tempDiscountHTML = array();
+ //ROOMS DISCOUNT Versicherungen
+ foreach ($possibleRooms as $room)
+ {
+ $adultCount = $room['persons']['adults'];
+ $childrenCount = $room['persons']['children'];
+
+ $singleFullPrice = $room['price']->getEffectivePrice();
+ $childPrice = $room['price']->getEffectiveChildPrice();
+
+ $roomPrice = ($singleFullPrice * $adultCount) + ($childPrice * $room['persons']['children']);
+
+ $singleDiscountPrice = $room['price']->getEffectiveDiscountPrice();
+ $singleChildDiscountPrice = $room['price']->getEffectiveChildDiscountPrice();
+ $discount = ($singleDiscountPrice === null) ? 0 : ($adultCount * ($singleDiscountPrice - $singleFullPrice));
+ $childDiscount = ($singleChildDiscountPrice === null) ? 0 : ($childrenCount * ($singleChildDiscountPrice - $childPrice));
+ $ret += $roomPrice + $discount + $childDiscount;
+
+ $singel_flight_price = $travelDate->getFlightCalcPrice();
+ $outPriceInfo['flight_price'] += (($singel_flight_price * $adultCount) + ($singel_flight_price * $room['persons']['children']));
+
+ //Room price
+ if (isset($outPriceInfo))
+ {
+ $price = $singleDiscountPrice ?? $singleFullPrice;
+ $price += $singleChildDiscountPrice ?? $childPrice;
+
+ $outPriceInfo['rooms'][] = [
+ 'name' => $room['priceType']->getName(),
+ 'adults' => $adultCount,
+ 'children' => $childrenCount,
+ 'price' => $singleDiscountPrice ?? $singleFullPrice,
+ 'price_children' => $singleChildDiscountPrice ?? $childPrice,
+ 'price_total' => $roomPrice + $discount + $childDiscount,
+ ];
+ }
+
+
+ //Room html
+ if (isset($outHtmlSummary))
+ {
+ //ROOMS
+ $key = $room['priceType']->getId();
+ if(!empty($tempRoomHTML[$key])) {
+ $tempRoomHTML[$key]['count'] = $tempRoomHTML[$key]['count'] + 1;
+ $tempRoomHTML[$key]['value'] = $tempRoomHTML[$key]['value'] + $roomPrice;
+ }else{
+ $tempRoomHTML[$key] = array(
+ 'value' => $roomPrice,
+ 'label_first' => $room['priceType']->getName(),
+ 'label_last' => Util::formatPrice($singleFullPrice) . ' pro Person',
+ 'count' => 1,
+ 'childCount' => $room['persons']['children'],
+ 'price_child' => Util::formatPrice($room['price']->getEffectiveChildPrice()),
+ );
+ }
+ //DISCOUNT
+ if ($singleDiscountPrice !== null)
+ {
+ $key = intval(($singleFullPrice - $singleDiscountPrice)*100);
+ if(!empty($tempDiscountHTML[$key])) {
+ $tempDiscountHTML[$key]['count'] = $tempDiscountHTML[$key]['count'] + $adultCount;
+ $tempDiscountHTML[$key]['value'] = $tempDiscountHTML[$key]['value'] + $discount;
+ }else{
+ $tempDiscountHTML[$key] = array(
+ 'value' => $discount,
+ 'label_first' => 'Rabatt',
+ 'label_last' => Util::formatPrice($singleFullPrice - $singleDiscountPrice) . ' pro Person',
+ 'count' => $adultCount,
+ );
+ }
+ if($childDiscount > 0){
+ $key = intval(($childPrice - $singleChildDiscountPrice)*100);
+ if(!empty($tempDiscountHTML[$key])) {
+ $tempDiscountHTML[$key]['count'] = $tempDiscountHTML[$key]['count'] + $childrenCount;
+ $tempDiscountHTML[$key]['value'] = $tempDiscountHTML[$key]['value'] + $childDiscount;
+ }else{
+ $tempDiscountHTML[$key] = array(
+ 'value' => $childDiscount,
+ 'label_first' => 'Rabatt',
+ 'label_last' => Util::formatPrice($childPrice - $singleChildDiscountPrice) . ' pro Person',
+ 'count' => $childrenCount,
+ );
+ }
+ }
+ if (isset($outPriceInfo))
+ {
+ $key = intval(($singleFullPrice - $singleDiscountPrice)*100);
+ if(!empty($outPriceInfo['discount'][$key])) {
+ $outPriceInfo['discount'][$key]['count'] = $outPriceInfo['discount'][$key]['count'] + $adultCount;
+ $outPriceInfo['discount'][$key]['value'] = $outPriceInfo['discount'][$key]['value'] + $discount;
+ }else{
+ $outPriceInfo['discount'][$key] = array(
+ 'value' => $discount,
+ 'label_first' => 'Rabatt',
+ 'label_last' => Util::formatPrice($singleFullPrice - $singleDiscountPrice) . ' pro Person',
+ 'count' => $adultCount,
+ );
+ }
+ if($childDiscount > 0){
+ $key = intval(($childPrice - $singleChildDiscountPrice)*100);
+ if(!empty($outPriceInfo['discount'][$key])) {
+ $outPriceInfo['discount'][$key]['count'] = $outPriceInfo['discount'][$key]['count'] + $childrenCount;
+ $outPriceInfo['discount'][$key]['value'] = $outPriceInfo['discount'][$key]['value'] + $childDiscount;
+ }else{
+ $outPriceInfo['discount'][$key] = array(
+ 'value' => $childDiscount,
+ 'label_first' => 'Rabatt',
+ 'label_last' => Util::formatPrice($childPrice - $singleChildDiscountPrice) . ' pro Person',
+ 'count' => $childrenCount,
+ );
+ }
+ }
+ }
+
+ }
+
+ //Versicherung price + html
+ if ($bookingRequest->getInsurance() && $adultCount > 0)
+ {
+ $curAssessmentBasis = $insuranceAssessmentBasis + ($singleDiscountPrice ?? $singleFullPrice);
+ $curAssessmentChildBasis = $insuranceAssessmentChildBasis + ($singleChildDiscountPrice ?? $childPrice);
+ $insurancePrice = $this->getDoctrine()->getRepository('AppBundle:TravelInsurancePrice')
+ ->findOneByInsuranceIdAndAssessmentBasis($bookingRequest->getInsurance()->getId(), $curAssessmentBasis);
+ $insuranceChildPrice = $this->getDoctrine()->getRepository('AppBundle:TravelInsurancePrice')
+ ->findOneByInsuranceIdAndAssessmentBasis($bookingRequest->getInsurance()->getId(), $curAssessmentChildBasis);
+ $insurancePriceValue = $insurancePrice->getPrice() > 0 ? $insurancePrice->getPrice() : round($insurancePrice->getPercent() * $curAssessmentBasis / 100, 2);
+ $insuranceChildPriceValue = $insuranceChildPrice->getPrice() > 0 ? $insuranceChildPrice->getPrice() : round($insuranceChildPrice->getPercent() * $curAssessmentChildBasis / 100, 2);
+
+
+ $a = $adultCount * $insurancePriceValue;
+ $b = $childrenCount * $insuranceChildPriceValue;
+ $insuranceTotal += $a + $b;
+ $ret += $a + $b;
+
+ if (isset($insuranceHtmlSummary))
+ {
+ if(!empty($tempInsuranceHTML[$insurancePriceValue])){
+ $tempInsuranceHTML[$insurancePriceValue]['count'] = intval($tempInsuranceHTML[$insurancePriceValue]['count']) + $adultCount;
+ $tempInsuranceHTML[$insurancePriceValue]['value'] = $tempInsuranceHTML[$insurancePriceValue]['value'] + $a;
+ }else{
+ $tempInsuranceHTML[$insurancePriceValue] = array(
+ 'value' => $a,
+ 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insurancePrice->getCode() .') ',
+ 'label_last' => Util::formatPrice($insurancePriceValue) . ' pro Person',
+ 'count' => $adultCount,
+
+ );
+ }
+ if($b > 0){
+ if(!empty($tempInsuranceHTML[$insuranceChildPriceValue])){
+ $tempInsuranceHTML[$insuranceChildPriceValue]['count'] = intval($tempInsuranceHTML[$insuranceChildPriceValue]['count']) + $childrenCount;
+ $tempInsuranceHTML[$insuranceChildPriceValue]['value'] = $tempInsuranceHTML[$insuranceChildPriceValue]['value'] + $b;
+ }else{
+ $tempInsuranceHTML[$insuranceChildPriceValue] = array(
+ 'value' => $b,
+ 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insuranceChildPrice->getCode() .') ',
+ 'label_last' => Util::formatPrice($insuranceChildPriceValue) . ' pro Kind',
+ 'count' => $childrenCount,
+
+ );
+ }
+ }
+ }
+ if (isset($outPriceInfo))
+ {
+ if(!empty($outPriceInfo['insurancesOut'][$insurancePriceValue])){
+ $outPriceInfo['insurancesOut'][$insurancePriceValue]['count'] = intval($outPriceInfo['insurancesOut'][$insurancePriceValue]['count']) + $childrenCount;
+ $outPriceInfo['insurancesOut'][$insurancePriceValue]['value'] = $outPriceInfo['insurancesOut'][$insurancePriceValue]['value'] + $b;
+ }else{
+ $outPriceInfo['insurancesOut'][$insurancePriceValue] = [
+ 'value' => $a,
+ 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insurancePrice->getCode() .') ',
+ 'label_last' => Util::formatPrice($insurancePriceValue) . ' pro Person',
+ 'count' => $adultCount,
+ ];
+ }
+ if($b > 0){
+ if(!empty($outPriceInfo['insurancesOut'][$insuranceChildPriceValue])){
+ $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['count'] = intval($outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['count']) + $childrenCount;
+ $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['value'] = $outPriceInfo['insurancesOut'][$insuranceChildPriceValue]['value'] + $b;
+ }else{
+ $outPriceInfo['insurancesOut'][$insuranceChildPriceValue] = [
+ 'value' => $b,
+ 'label_first' => 'RV '. $bookingRequest->getInsurance()->getName() .' ('. $insuranceChildPrice->getCode() .') ',
+ 'label_last' => Util::formatPrice($insuranceChildPriceValue) . ' pro Kind',
+ 'count' => $childrenCount,
+ ];
+ }
+ }
+
+ $outPriceInfo['insurances'][] = [
+ 'insurance' => $bookingRequest->getInsurance(),
+ 'insurancePriceValue' => $insurancePriceValue,
+ 'insurancePrice' => $insurancePrice,
+ 'count' => $adultCount,
+ 'insuranceChildPriceValue' => $insuranceChildPriceValue,
+ 'insuranceChildPrice' => $insuranceChildPrice,
+ 'countChild' => $childrenCount,
+ ];
+ }
+ }
+ }
+ }
+
+
+
+
+ //ROOMS
+ if(count($tempRoomHTML) > 0){
+ foreach ($tempRoomHTML as $item) {
+ $label = ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].']';
+ if($item['childCount'] > 0){
+ $label .= ' [ + Kind: '.$item['price_child'];
+ }
+ $label .= ']';
+ $outHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => $label,
+ ];
+ }
+ }
+
+ //Comfort
+ if(count($tempComfortHTML) > 0){
+ foreach ($tempComfortHTML as $item) {
+ $outHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
+ ];
+ }
+ }
+
+ //Departure
+ if(count($tempDepartureHTML) > 0){
+ foreach ($tempDepartureHTML as $item) {
+ $outHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
+ ];
+ }
+ }
+
+ //DISCOUNT
+ if(count($tempDiscountHTML) > 0){
+ foreach ($tempDiscountHTML as $item) {
+ $insuranceHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
+ ];
+ }
+ }
+ //options
+ if(count($tempOptionHTML) > 0){
+ foreach ($tempOptionHTML as $item) {
+ $label = ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].']';
+ if($item['childCount'] > 0){
+ $label .= ' ['.$item['price_child'].']';
+ }
+ $outHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => $label,
+ ];
+ }
+ }
+
+
+ //Versicherungen
+ if(count($tempInsuranceHTML) > 0 ){
+ foreach ($tempInsuranceHTML as $item) {
+ $insuranceHtmlSummary[] =[
+ 'value' => $item['value'],
+ 'label' => ''.$item['count'].' x '.$item['label_first'].' ['.$item['label_last'].' ]',
+ ];
+ }
+ }
+
+
+
+
+ if (isset($insuranceHtmlSummary))
+ {
+ $outHtmlSummary = array_merge($outHtmlSummary, $insuranceHtmlSummary);
+ }
+ if (isset($outPriceInfo))
+ {
+ $outPriceInfo['total'] = $ret;
+ $outPriceInfo['totalWithoutInsurance'] = $ret - $insuranceTotal;
+
+ if($outPriceInfo['departure_extra'] >= 0){
+ $outPriceInfo['flight_price'] = $outPriceInfo['flight_price'] + $outPriceInfo['departure_extra'];
+ }else{
+ $outPriceInfo['flight_price'] = 0;
+ }
+
+ if($depositPercent === null) {
+ $depositPercent = 20;
+ }
+
+ //Aeqypten (20% from price)
+ if($categoryId == 1){
+ $deposit = ($outPriceInfo['total'] / 100 * $depositPercent);
+ $outPriceInfo['deposit_total'] = $deposit;
+ $outPriceInfo['final_payment'] = ($outPriceInfo['total'] - $outPriceInfo['deposit_total']);
+ }else{
+ //all 100% vom Flugpreis und 20% von der Landleistung.
+ $deposit = (($outPriceInfo['total'] - $outPriceInfo['flight_price']) / 100 * $depositPercent);
+ $outPriceInfo['deposit_total'] = ($deposit + $outPriceInfo['flight_price']);
+ $outPriceInfo['final_payment'] = ($outPriceInfo['total'] - $outPriceInfo['deposit_total']);
+ }
+
+
+ }
+
+ return $ret;
+ }
+
+ /**
+ * @param TravelPeriodPrice[] $prices
+ * @param $persons
+ *
+ * @return array
+ */
+ private function getRooms($prices, $persons)
+ {
+ $ret = [];
+
+ foreach($prices as $price)
+ {
+ $priceTypeId = $price->getPriceTypeId();
+ //with children
+ $priceType = $this->priceTypeById[$priceTypeId];
+
+ if($priceTypeId == 1 && $persons['singleRoomPersons'] > 0)
+ {
+ for($i = 0; $i < $persons['singleRoomPersons']; $i++)
+ {
+ $currentPersons = [
+ 'total' => 1,
+ 'adults' => 1,
+ 'children' => 0 //TODO
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+
+ if($priceTypeId == 1 && $persons['singleRoomChildPersons'] > 0)
+ {
+ $priceTypeId = 2;
+ $priceType = $this->priceTypeById[$priceTypeId];
+
+ for($i = 0; $i < $persons['singleRoomChildPersons']; $i++)
+ {
+ $currentPersons = [
+ 'total' => 1,
+ 'adults' => 1,
+ 'children' => 1
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+
+ if($priceTypeId == 3 && $persons['doubleRoomPersons'] > 0)
+ {
+ for($j = 0; $j < ($persons['doubleRoomPersons'] / 2); $j++)
+ {
+ $currentPersons = [
+ 'total' => 2,
+ 'adults' => 2,
+ 'children' => 0
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+
+ if($priceTypeId == 3 && $persons['doubleRoomChildPersons'] > 0)
+ {
+ $priceTypeId = 4;
+ $priceType = $this->priceTypeById[$priceTypeId];
+
+ for($j = 0; $j < ($persons['doubleRoomChildPersons'] / 2); $j++)
+ {
+ $currentPersons = [
+ 'total' => 2,
+ 'adults' => 2,
+ 'children' => 1
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+
+ if($priceTypeId == 5 && $persons['tripleRoomPersons'] > 0)
+ {
+ for($k = 0; $k < ($persons['tripleRoomPersons'] / 3); $k++)
+ {
+ $currentPersons = [
+ 'total' => 3,
+ 'adults' => 3,
+ 'children' => 0
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+
+ if($priceTypeId == 5 && $persons['tripleRoomChildPersons'] > 0)
+ {
+ $priceTypeId = 7;
+ $priceType = $this->priceTypeById[$priceTypeId];
+
+ for($k = 0; $k < ($persons['tripleRoomChildPersons'] / 3); $k++)
+ {
+ $currentPersons = [
+ 'total' => 3,
+ 'adults' => 3,
+ 'children' => 1
+ ];
+
+ $ret[] = [
+ 'priceType' => $priceType,
+ 'persons' => $currentPersons,
+ 'price' => $price
+ ];
+ }
+ }
+ }
+
+ return $ret;
+ }
}
\ No newline at end of file