예제 #1
0
파일: Charge.php 프로젝트: arbi/MyCode
 /**
  * @param \DDD\Domain\Booking\ChargeProcess $reservation
  * @param bool|false $isBookerPrice
  * @return array
  *
  */
 public function getToBeChargedItems($reservation, $isBookerPrice = false)
 {
     /**
      * @var $bookingTicketService \DDD\Service\Booking\BookingTicket
      * @var ApartmentMainService $apartmentMainService
      * @var \DDD\Service\Textline $textlineService
      */
     $bookingTicketService = $this->getServiceLocator()->get('service_booking_booking_ticket');
     $textlineService = $this->getServiceLocator()->get('service_textline');
     $discountParams = [];
     if ($reservation->getPartnerId()) {
         $discountParams = ['aff_id' => $reservation->getPartnerId(), 'email' => $reservation->getGuestEmail()];
     }
     if ($isBookerPrice) {
         $totalPrice = $reservation->getBookerPrice();
         $price = $reservation->getBookerPrice();
     } else {
         $totalPrice = $reservation->getPrice();
         $price = $reservation->getPrice();
     }
     $nightCount = Helper::getDaysFromTwoDate($reservation->getDateTo(), $reservation->getDateFrom());
     $currencySymbol = $reservation->getCurrencySymbol();
     // Night Charges
     $chargesList = [['label' => Helper::evaluateTextline($textlineService->getUniversalTextline(1580), ['{{NIGHT_COUNT}}' => $nightCount]), 'price_view' => $currencySymbol . number_format($totalPrice, 2, '.', ' '), 'price' => $totalPrice, 'percent' => 0, 'type' => 'night', 'class' => '', 'description' => '', 'tax_included' => '']];
     // Discount Charges
     $discountValidator = $bookingTicketService->validateAndCheckDiscountData($discountParams, false);
     $discounted = false;
     if (isset($discountValidator['discount_value']) && $discountValidator['valid'] && isset($discountValidator['discount_value']) && ceil($discountValidator['discount_value'])) {
         $discountValue = $totalPrice * $discountValidator['discount_value'] / 100;
         $price = $totalPrice - $discountValue;
         $discounted = true;
         $totalPrice = $totalPrice - $discountValue;
         array_push($chargesList, ['label' => (isset($discountValidator['partner_name']) ? $discountValidator['partner_name'] : '') . ' ' . $textlineService->getUniversalTextline(1503), 'price_view' => '- ' . $currencySymbol . number_format($discountValue, 2, '.', ' '), 'price' => $discountValue, 'percent' => 0, 'type' => 'discount', 'class' => 'text-danger', 'description' => '', 'tax_included' => '']);
     }
     // Taxes Charges
     /** @var \DDD\Service\Currency\Currency $currencyService */
     $currencyService = $this->getServiceLocator()->get('service_currency_currency');
     $currencyRate = 1;
     if ($reservation->getGuestCurrency() != $reservation->getApartmentCurrency()) {
         $currencyRate = $currencyService->getCurrencyConversionRate($reservation->getGuestCurrency(), $reservation->getApartmentCurrency());
     }
     if ($reservation->getCityTotType() > 0 && $reservation->getCityTot() > 0) {
         $taxDiscounted = false;
         $totDuration = $reservation->getTotMaxDuration() ? min($reservation->getTotMaxDuration(), $nightCount) : $nightCount;
         $totValue = $reservation->getCityTot() + $reservation->getTotAdditional();
         if ($reservation->getCityTotType() == Taxes::TAXES_TYPE_PERCENT) {
             $cityTot = $price / 100 * $totValue * $totDuration / $nightCount;
             $taxValue = $totValue . ' %';
             if ($discounted) {
                 $taxDiscounted = true;
             }
             $percent = $totValue;
         } else {
             $cityTot = $totDuration * $totValue * $currencyRate;
             $taxValue = $currencySymbol . ' ' . number_format($totValue * $currencyRate, 2, '.', ' ') . ' ' . $textlineService->getUniversalTextline(1473);
             $percent = 0;
         }
         array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1259) . ' (' . $taxValue . ($reservation->getTotIncluded() == 1 ? ', ' . $textlineService->getUniversalTextline(1472) : '') . ') ' . ($taxDiscounted ? $textlineService->getUniversalTextline(1633) : ''), 'price_view' => $currencySymbol . number_format($cityTot, 2, '.', ' '), 'price' => $cityTot, 'percent' => $percent, 'duration' => $totDuration, 'type' => 'tax', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1429), 'tax_included' => $reservation->getTotIncluded() == 1 ?: '', 'date' => $reservation->getDateFrom(), 'type_id' => BookingAddon::ADDON_TYPE_TAX_TOT]);
         if ($reservation->getTotIncluded() != 1) {
             $totalPrice += $cityTot;
         }
     }
     if ($reservation->getCityVatType() > 0 && $reservation->getCityVat() > 0) {
         $taxDiscounted = false;
         $vatDuration = $reservation->getVatMaxDuration() ? min($reservation->getVatMaxDuration(), $nightCount) : $nightCount;
         $vatValue = $reservation->getCityVat() + $reservation->getVatAdditional();
         if ($reservation->getCityVatType() == Taxes::TAXES_TYPE_PERCENT) {
             $cityVat = $price / 100 * $vatValue * $vatDuration / $nightCount;
             $taxValue = $vatValue . ' %';
             if ($discounted) {
                 $taxDiscounted = true;
             }
             $percent = $vatValue;
         } else {
             $cityVat = $vatDuration * $vatValue * $currencyRate;
             $taxValue = $currencySymbol . number_format($vatValue * $currencyRate, 2, '.', ' ') . ' ' . $textlineService->getUniversalTextline(1473);
             $percent = 0;
         }
         array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1260) . ' (' . $taxValue . ($reservation->getVatIncluded() == 1 ? ', ' . $textlineService->getUniversalTextline(1472) : '') . ') ' . ($taxDiscounted ? $textlineService->getUniversalTextline(1633) : ''), 'price_view' => $currencySymbol . number_format($cityVat, 2, '.', ' '), 'price' => $cityVat, 'percent' => $percent, 'duration' => $vatDuration, 'type' => 'tax', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1430), 'tax_included' => $reservation->getVatIncluded() == 1 ?: '', 'date' => $reservation->getDateFrom(), 'type_id' => BookingAddon::ADDON_TYPE_TAX_VAT]);
         if ($reservation->getVatIncluded() != 1) {
             $totalPrice += $cityVat;
         }
     }
     if ($reservation->getCitySalesTaxType() > 0 && $reservation->getCitySalesTax() > 0) {
         $taxDiscounted = false;
         $salesTaxDuration = $reservation->getSalesTaxMaxDuration() ? min($reservation->getSalesTaxMaxDuration(), $nightCount) : $nightCount;
         $salesTaxValue = $reservation->getCitySalesTax() + $reservation->getSalesTaxAdditional();
         if ($reservation->getCitySalesTaxType() == Taxes::TAXES_TYPE_PERCENT) {
             $citySalesTax = $price / 100 * $salesTaxValue * $salesTaxDuration / $nightCount;
             $taxValue = $salesTaxValue . ' %';
             if ($discounted) {
                 $taxDiscounted = true;
             }
             $percent = $salesTaxValue;
         } else {
             $citySalesTax = $salesTaxDuration * $salesTaxValue * $currencyRate;
             $taxValue = $currencySymbol . ' ' . number_format($salesTaxValue * $currencyRate, 2, '.', ' ') . ' ' . $textlineService->getUniversalTextline(1473);
             $percent = 0;
         }
         array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1261) . ' (' . $taxValue . ($reservation->getSalesTaxIncluded() == 1 ? ', ' . $textlineService->getUniversalTextline(1472) : '') . ') ' . ($taxDiscounted ? $textlineService->getUniversalTextline(1633) : ''), 'price_view' => $currencySymbol . number_format($citySalesTax, 2, '.', ' '), 'price' => $citySalesTax, 'percent' => $percent, 'duration' => $salesTaxDuration, 'type' => 'tax', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1431), 'tax_included' => $reservation->getSalesTaxIncluded() == 1 ?: '', 'date' => $reservation->getDateFrom(), 'type_id' => BookingAddon::ADDON_TYPE_SALES_TAX]);
         if ($reservation->getSalesTaxIncluded() != 1) {
             $totalPrice += $citySalesTax;
         }
     }
     if ($reservation->getCityTaxType() > 0 && $reservation->getCityTax() > 0) {
         $cityTaxDuration = $reservation->getCityTaxMaxDuration() ? min($reservation->getCityTaxMaxDuration(), $nightCount) : $nightCount;
         $cityTaxValue = $reservation->getCityTax() + $reservation->getCityTaxAdditional();
         $taxDiscounted = false;
         if ($reservation->getCityTaxType() == Taxes::TAXES_TYPE_PERCENT) {
             $cityTax = $price / 100 * $cityTaxValue * $cityTaxDuration / $nightCount;
             $taxValue = $cityTaxValue . ' %';
             if ($discounted) {
                 $taxDiscounted = true;
             }
             $percent = $cityTaxValue;
         } elseif ($reservation->getCityTaxType() == Taxes::TAXES_TYPE_PER_PERSON) {
             $cityTax = $cityTaxDuration * $cityTaxValue * $currencyRate * $reservation->getOccupancy();
             $taxValue = $currencySymbol . ' ' . number_format($cityTaxValue * $currencyRate, 2, '.', ' ') . ' ' . $textlineService->getUniversalTextline(1493);
             $percent = 0;
             // Per person per night
         } else {
             $cityTax = $cityTaxDuration * $cityTaxValue * $currencyRate;
             $taxValue = $currencySymbol . ' ' . number_format($cityTaxValue * $currencyRate, 2, '.', ' ') . ' ' . $textlineService->getUniversalTextline(1473);
             $percent = 0;
         }
         array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1262) . ' (' . $taxValue . ($reservation->getCityTaxIncluded() == 1 ? ', ' . $textlineService->getUniversalTextline(1472) : '') . ') ' . ($taxDiscounted ? $textlineService->getUniversalTextline(1633) : ''), 'price_view' => $currencySymbol . number_format($cityTax, 2, '.', ' '), 'price' => $cityTax, 'percent' => $percent, 'duration' => $cityTaxDuration, 'type' => 'tax', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1432), 'tax_included' => $reservation->getCityTaxIncluded() == 1 ?: '', 'date' => $reservation->getDateFrom(), 'type_id' => BookingAddon::ADDON_TYPE_CITY_TAX]);
         if ($reservation->getCityTaxIncluded() != 1) {
             $totalPrice += $cityTax;
         }
     }
     // parking taxes
     $parkingNights = $this->getParkingNightsFromRemarks($reservation->getRemarks());
     if ($parkingNights) {
         // get apartment dao`s
         $apartmentDao = $this->getServiceLocator()->get('dao_accommodation_accommodations');
         $apartmentSpotsDao = $this->getServiceLocator()->get('dao_apartment_spots');
         $reservationNightlyDao = $this->getServiceLocator()->get('dao_booking_reservation_nightly');
         $resStartDate = $reservation->getDateFrom();
         $resEndDate = $reservation->getDateTo();
         $date1 = date_create($resStartDate);
         $date2 = date_create($resEndDate);
         $dateDiff = date_diff($date2, $date1)->d + 1;
         $nightData = $reservationNightlyDao->fetchAll(['reservation_id' => $reservation->getId()], ['id', 'price', 'date', 'rate_name']);
         $nightlyArr = [];
         foreach ($nightData as $night) {
             array_push($nightlyArr, $night);
         }
         /**
          * @var \DDD\Dao\Parking\Spot\Inventory $parkingInventoryDao
          */
         $parkingStart = $reservation->getDateFrom();
         $parkingEnd = date('Y-m-j', strtotime($reservation->getDateFrom() . '+' . $parkingNights . ' days'));
         $newApartmentPreferedSpotId = $availableSpot = $selectedSpot = [];
         $apartmentPreferSpots = $apartmentSpotsDao->getApartmentSpots($reservation->getApartmentIdAssigned());
         if ($apartmentPreferSpots->count()) {
             foreach ($apartmentPreferSpots as $apartmentPreferSpot) {
                 array_push($newApartmentPreferedSpotId, $apartmentPreferSpot['spot_id']);
             }
             $reservationApartmentId = $reservation->getApartmentIdAssigned();
             $apartmentService = $this->getServiceLocator()->get('service_apartment_general');
             $apartmentTimezone = $apartmentService->getApartmentTimezoneById($reservationApartmentId)['timezone'];
             $datetime = new \DateTime('now');
             $datetime->setTimezone(new \DateTimeZone($apartmentTimezone));
             $dateToday = $datetime->format('Y-m-d');
             $availableSpot = $apartmentDao->getAvailableSpotsInLotForApartmentForDateRangeByPriority($reservationApartmentId, $parkingStart, $parkingEnd, [], false, [], $dateToday, true, $newApartmentPreferedSpotId);
             if (count($availableSpot)) {
                 foreach ($availableSpot as $row) {
                     $selectedSpot = $row;
                 }
             }
         }
         $parkingTotal = 0;
         if ($dateDiff >= $parkingNights && count($availableSpot) && count($selectedSpot)) {
             for ($iterator = 0; $iterator < $parkingNights; $iterator++) {
                 $parkingTotal += $selectedSpot['price'];
             }
         }
         if ($parkingTotal > 0) {
             $parkingTotal = $currencyRate * $parkingTotal;
             $totalPrice += $parkingTotal;
             array_push($chargesList, ['label' => 'Parking', 'price_view' => $currencySymbol . number_format($parkingTotal, 2, '.', ' '), 'price' => $parkingTotal, 'percent' => 0, 'type' => 'tax', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1430), 'tax_included' => $reservation->getVatIncluded() == 1 ?: '']);
         }
     }
     // Cleaning Fee
     $apartmentMainService = $this->getServiceLocator()->get('service_apartment_main');
     $cleaningFee = $apartmentMainService->getApartmentCleaningFeeInGuestCurrency($reservation->getApartmentId(), $reservation->getApartmentCurrency(), $reservation->getGuestCurrency(), $reservation->getCheckCurrency());
     if ($cleaningFee) {
         $cleaningFee = $cleaningFee * $currencyRate;
         $totalPrice += $cleaningFee;
         array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1497), 'price_view' => $currencySymbol . number_format($cleaningFee, 2, '.', ' '), 'price' => $cleaningFee, 'percent' => 0, 'type' => 'fee', 'class' => 'text-primary', 'description' => $textlineService->getUniversalTextline(1498), 'tax_included' => '']);
     }
     // Total
     array_push($chargesList, ['label' => $textlineService->getUniversalTextline(1305), 'price_view' => $currencySymbol . number_format($totalPrice, 2, '.', ' '), 'price' => $totalPrice, 'percent' => 0, 'type' => 'total', 'class' => '', 'description' => '', 'tax_included' => '']);
     return $chargesList;
 }