Exemple #1
0
 public function __construct($data, $postalCodeStatus)
 {
     $this->add(array('name' => 'first-name', 'required' => true, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 250, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 250'))))));
     $this->add(array('name' => 'last-name', 'required' => true, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 250, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 250'))))));
     $this->add(array('name' => 'email', 'required' => true, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'EmailAddress', 'options' => array('useDomainCheck' => false, 'messages' => array(EmailAddress::INVALID => 'Please provide correct email address', EmailAddress::INVALID_FORMAT => 'Please provide correct formated email address'))))));
     if (Helper::isBackofficeUser()) {
         $requiredPhone = false;
     } else {
         $requiredPhone = true;
         // Has filtered in booking process
     }
     $this->add(array('name' => 'phone', 'required' => $requiredPhone, 'filters' => array(array('name' => 'StringTrim'))));
     $this->add(array('name' => 'remarks', 'required' => false, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 1000, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 1000'))))));
     $this->add(array('name' => 'aff-id', 'required' => false, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'Digits', 'options' => array('messages' => array(Digits::NOT_DIGITS => 'Can contain only digits.'))))));
     $this->add(array('name' => 'aff-ref', 'required' => false, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 200, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 200'))))));
     $this->add(array('name' => 'address', 'required' => true, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 400, 'min' => 2, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 400'))))));
     $this->add(array('name' => 'country', 'required' => true, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'Digits', 'options' => array('messages' => array(Digits::NOT_DIGITS => 'Can contain only digits.'))))));
     $this->add(array('name' => 'city', 'required' => true, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 100, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 100'))))));
     $this->add(array('name' => 'zip', 'required' => $postalCodeStatus == Location::POSTAL_CODE_REQUIRED ? true : false, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 50, 'min' => 3, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 50'))))));
     $isBackofficeUser = Helper::isBackofficeUser() && isset($data['noCreditCard']) ? true : false;
     $this->add(array('name' => 'number', 'required' => !$isBackofficeUser, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'CreditCard', 'options' => array('type' => array(CreditCard::AMERICAN_EXPRESS, CreditCard::VISA, CreditCard::MASTERCARD, CreditCard::DISCOVER, CreditCard::JCB, CreditCard::DINERS_CLUB), 'messages' => array(CreditCard::CHECKSUM => "Invalid CreditCard", CreditCard::CONTENT => "Invalid CreditCard", CreditCard::INVALID => "Invalid CreditCard", CreditCard::LENGTH => "Invalid CreditCard", CreditCard::PREFIX => "Invalid CreditCard", CreditCard::SERVICE => "Invalid CreditCard", CreditCard::SERVICEFAILURE => "Invalid CreditCard"))))));
     $this->add(array('name' => 'credit_card_type', 'required' => !$isBackofficeUser, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'Digits', 'options' => array('messages' => array(Digits::NOT_DIGITS => 'Can contain only digits.'))))));
     $this->add(array('name' => 'holder', 'required' => !$isBackofficeUser, 'filters' => array(array('name' => 'StringTrim'), array('name' => 'StripTags')), 'validators' => array(array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 300, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 300'))))));
     $this->add(array('name' => 'cvc', 'required' => false, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'Digits', 'options' => array('messages' => array(Digits::NOT_DIGITS => 'Can contain only digits.'))), array('name' => 'StringLength', 'options' => array('encoding' => 'UTF-8', 'max' => 4, 'min' => 3, 'messages' => array(StringLength::TOO_LONG => 'maximum symbols 10', StringLength::TOO_SHORT => 'minimum symbols 3'))))));
     $validatorYear = array('name' => 'Date', 'options' => array('format' => 'Y', 'messages' => array(Date::INVALID => 'Invalid data', Date::INVALID_DATE => 'Invalid data', Date::FALSEFORMAT => 'Invalid data')));
     $validatorMonth = array('name' => 'Date', 'options' => array('format' => 'm', 'messages' => array(Date::INVALID => 'Invalid data', Date::INVALID_DATE => 'Invalid data', Date::FALSEFORMAT => 'Invalid data')));
     if (!$isBackofficeUser) {
         $validatorYear[] = array('name' => 'Callback', 'options' => array('messages' => array(Callback::INVALID_VALUE => 'Invalid data', Callback::INVALID_CALLBACK => 'Invalid data'), 'callback' => function ($value, $context = array()) {
             $current = date('Y');
             return $value >= $current;
         }));
         $validatorMonth[] = array('name' => 'Callback', 'options' => array('messages' => array(Callback::INVALID_VALUE => 'Invalid data', Callback::INVALID_CALLBACK => 'Invalid data'), 'callback' => function ($value, $context = array()) {
             if ($context['year'] == date('Y') && $value < date('m')) {
                 return false;
             }
             return true;
         }));
     }
     $this->add(array('name' => 'year', 'required' => $isBackofficeUser, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array($validatorYear)));
     $this->add(array('name' => 'month', 'required' => $isBackofficeUser, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array($validatorMonth)));
     $this->add(['name' => 'apartel', 'required' => false, 'filters' => [array('name' => 'StringTrim')], 'validators' => [['name' => 'Digits', 'options' => ['messages' => [Digits::NOT_DIGITS => 'Can contain only digits.']]]]]);
     $this->add(array('name' => 'not_send_mail', 'required' => false, 'filters' => array(array('name' => 'StringTrim')), 'validators' => array(array('name' => 'Digits', 'options' => array('messages' => array(Digits::NOT_DIGITS => 'Can contain only digits.'))))));
     $this->add(array('name' => 'noCreditCard', 'required' => false));
 }
Exemple #2
0
 private function getUserCountry()
 {
     $userCountry = Helper::getUserCountry();
     return !Helper::isBackofficeUser() && isset($userCountry['country_id']) && $userCountry['country_id'] ? $userCountry['country_id'] : 0;
 }
Exemple #3
0
 /**
  * @param array $userAndPayData
  * @return array
  */
 public function bookingProcess($userAndPayData)
 {
     /**
      * @var BookingTicket $bookingTicketService
      * @var ChannelManager $channelManagerService
      * @var PenaltyCalculation $penaltyService
      * @var ApartmentGroup $apartmentGroupService
      * @var \DDD\Service\Finance\Customer $customerFinanceService
      * @var Logger $logger
      * @var \DDD\Service\Reservation\Main $reservationService
      * @var \DDD\Service\Partners $partnerService
      * @var \DDD\Service\Queue\InventorySynchronizationQueue $syncService
      */
     $bookingTicketService = $this->getServiceLocator()->get('service_booking_booking_ticket');
     $channelManagerService = $this->getServiceLocator()->get('service_channel_manager');
     $apartmentGroupService = $this->getServiceLocator()->get('service_apartment_group');
     $reservationService = $this->getServiceLocator()->get('service_reservation_main');
     $partnerService = $this->getServiceLocator()->get('service_partners');
     $syncService = $this->getServiceLocator()->get('service_queue_inventory_synchronization_queue');
     $session_booking = Helper::getSessionContainer('booking');
     if (empty($userAndPayData) || !$session_booking->offsetExists('reservation')) {
         return ['status' => 'error'];
     }
     $reservationData = $session_booking->reservation;
     //bookingProcess
     $data = $tankYou = [];
     $data['apartment_id_assigned'] = $reservationData['prod_id'];
     $data['apartment_id_origin'] = $reservationData['prod_id'];
     $data['room_id'] = $reservationData['room_id'];
     $data['acc_name'] = $reservationData['prod_name'];
     $data['acc_country_id'] = $reservationData['country_id'];
     $data['acc_province_id'] = $reservationData['province_id'];
     $data['acc_city_id'] = $reservationData['city_id'];
     $data['acc_province_name'] = $reservationData['province_name'];
     $data['acc_city_name'] = $reservationData['city_name'];
     $data['acc_address'] = $reservationData['address'];
     $data['building_name'] = $apartmentGroupService->getBuildingName($reservationData['prod_id']);
     $data['date_from'] = $reservationData['date_from'];
     $data['date_to'] = $reservationData['date_to'];
     // Currency Rate
     /** @var \DDD\Service\Currency\Currency $currencyService */
     $currencyService = $this->getServiceLocator()->get('service_currency_currency');
     $data['currency_rate'] = $currencyService->getCurrencyConversionRate($this->getCurrencySite(), $reservationData['code']);
     $data['currency_rate_usd'] = $currencyService->getCurrencyConversionRate('USD', $reservationData['code']);
     $data['booker_price'] = $reservationData['amount_price'];
     $data['guest_currency_code'] = $this->getCurrencySite();
     $data['occupancy'] = $reservationData['guest'];
     $resNumber = $tankYou['res_number'] = $bookingTicketService->generateResNumber();
     $data['res_number'] = $resNumber;
     $data['timestamp'] = date('Y-m-d H:i:s');
     $data['apartment_currency_code'] = $reservationData['code'];
     $data['ki_page_status'] = BookingTicket::NOT_SEND_KI_PAGE_STATUS;
     $data['ki_page_hash'] = $bookingTicketService->generatePageHash($data['res_number'], $data['timestamp']);
     $data['review_page_hash'] = $bookingTicketService->generatePageHash($data['res_number'], $data['apartment_id_origin']);
     $data['remarks'] = isset($userAndPayData['remarks']) ? $userAndPayData['remarks'] : '';
     if (isset($reservationData['arrival_time']) && !empty($reservationData['arrival_time'])) {
         $data['guest_arrival_time'] = $reservationData['arrival_time'];
     }
     // Affiliate Data
     $webSiteAff = WebSite::WEB_SITE_PARTNER;
     $visitor = new Container('visitor');
     if (isset($userAndPayData['aff-id']) && (int) $userAndPayData['aff-id'] > 0 && $userAndPayData['aff-id'] != WebSite::WEB_SITE_PARTNER && Helper::isBackofficeUser()) {
         $webSiteAff = $userAndPayData['aff-id'];
     } elseif (!is_null($visitor->partnerId) && (int) $visitor->partnerId) {
         $webSiteAff = (int) $visitor->partnerId;
     }
     $partnerData = $partnerService->getPartnerDataForReservation($webSiteAff, $reservationData['prod_id'], true);
     $data['partner_ref'] = isset($userAndPayData['aff-ref']) ? $userAndPayData['aff-ref'] : '';
     $data['partner_id'] = $webSiteAff;
     $data['partner_name'] = $partnerData->getPartnerName();
     $data['partner_commission'] = $partnerData->getCommission();
     $data['model'] = $partnerData->getBusinessModel();
     // Is backoffice user
     if (Helper::isBackofficeUser()) {
         if (isset($userAndPayData['not_send_mail']) && $userAndPayData['not_send_mail'] > 0) {
             $otherInfo['no_send_guest_mail'] = true;
         }
     }
     // check apartel
     if (isset($userAndPayData['apartel']) && $userAndPayData['apartel'] > 0) {
         /** @var $apartelGeneralDao \DDD\Dao\Apartel\General */
         $apartelGeneralDao = $this->getServiceLocator()->get('dao_apartel_general');
         if ($apartelGeneralDao->checkApartmentFromThisApartel($userAndPayData['apartel'], $reservationData['prod_id'])) {
             $data['apartel_id'] = $userAndPayData['apartel'];
         }
     }
     $userAndPayData['phone'] = $this->clearPhone($userAndPayData['phone']);
     // Personal Data
     $data['guest_first_name'] = $tankYou['first_name'] = $userAndPayData['first-name'];
     $data['guest_last_name'] = $tankYou['last_name'] = $userAndPayData['last-name'];
     $data['guest_email'] = $tankYou['email'] = $userAndPayData['email'];
     $data['guest_address'] = $tankYou['address'] = $userAndPayData['address'];
     $data['guest_city_name'] = $tankYou['city'] = $userAndPayData['city'];
     $data['guest_country_id'] = $tankYou['country'] = $userAndPayData['country'];
     $data['guest_language_iso'] = 'en';
     $data['guest_zip_code'] = $userAndPayData['zip'];
     $data['guest_phone'] = $tankYou['phone'] = $userAndPayData['phone'] ? $userAndPayData['phone'] : '';
     $tankYou['partner'] = $partnerData->getPartnerName();
     $tankYou['partner_id'] = $webSiteAff;
     $tankYou['totalTax'] = isset($tankYou['totalTax']) ? number_format($tankYou['totalTax'], 2, '.', '') : '';
     $tankYou['totalWithoutTax'] = number_format($reservationData['acc_price'] * $data['currency_rate_usd'], 2, '.', '');
     /** @var \DDD\Dao\Booking\Booking $bookingDao */
     $bookingDao = $this->getServiceLocator()->get('dao_booking_booking');
     $bookingDao->setEntity(new \ArrayObject());
     $customerData['email'] = $data['guest_email'];
     // Credit Card Data
     $ccNotProvided = Helper::isBackofficeUser() && isset($userAndPayData['noCreditCard']);
     if ($ccNotProvided) {
         $customerData['cc_provided'] = false;
     } else {
         $customerData['cc_provided'] = true;
         $customerData['number'] = $cr_number = $userAndPayData['number'];
         $customerData['holder'] = $userAndPayData['holder'];
         $customerData['month'] = $userAndPayData['month'];
         $customerData['year'] = $userAndPayData['year'];
         $customerData['cvc'] = isset($userAndPayData['cvc']) ? $userAndPayData['cvc'] : false;
     }
     if (Helper::isBackofficeUser()) {
         $customerData['source'] = Card::CC_SOURCE_WEBSITE_RESERVATION_EMPLOYEE;
     } else {
         $customerData['source'] = Card::CC_SOURCE_WEBSITE_RESERVATION_GUEST;
     }
     try {
         $bookingDao->beginTransaction();
         $newAvailability = 0;
         $otherInfo['cc_provided'] = $customerData['cc_provided'];
         $otherInfo['availability'] = $newAvailability;
         $data['customer_data'] = $customerData;
         $ratesData = $reservationService->getRateDataByRateIdDates($reservationData['rateId'], $reservationData['date_from'], $reservationData['date_to']);
         $otherInfo['ratesData'] = $ratesData;
         $reservationId = $reservationService->registerReservation($data, $otherInfo, true);
         $tankYou['reservation_id'] = $reservationId;
         $session_booking->tankyou = $tankYou;
         // discount for Ginosiks
         $discountValidator = $bookingTicketService->validateAndCheckDiscountData(['email' => $data['guest_email'], 'aff_id' => $data['partner_id']]);
         if ($discountValidator['valid'] && ceil($discountValidator['discount_value']) && $discountValidator['aff_id'] == BookingTicket::SECRET_DISCOUNT_AFFILIATE_ID) {
             $discountSave['is_refundable'] = ApartmentRate::APARTMENT_RATE_NON_REFUNDABLE;
             $discountSave['penalty'] = ApartmentRate::PENALTY_TYPE_PERCENT;
             $discountSave['penalty_val'] = 100;
             $discountSave['funds_confirmed'] = BookingTicket::CC_STATUS_VALID;
             $bookingDao->save($discountSave, ['id' => $reservationId]);
             $logger = $this->getServiceLocator()->get('ActionLogger');
             $logger->save(Logger::MODULE_BOOKING, $reservationId, Logger::ACTION_BOOKING_CC_STATUS, BookingTicket::CC_STATUS_VALID + 1);
         }
         // Push into synchronization queue
         $syncService->push($reservationData['prod_id'], $reservationData['date_from'], $reservationData['date_to']);
         $bookingDao->commitTransaction();
         return ['status' => 'success'];
     } catch (\Exception $e) {
         $this->gr2logException($e, 'Cannot booking from Website', ['apartment_id' => $data['apartment_id_origin'], 'room_id' => $data['room_id'], 'rate_id' => isset($data['rate_id']) ? $data['rate_id'] : '', 'date_from' => $data['date_from'], 'date_to' => $data['date_to'], 'partner_id' => $data['partner_id'], 'partner_reference' => $data['partner_ref']]);
         $bookingDao->rollbackTransaction();
         return ['status' => 'error'];
     }
 }
Exemple #4
0
 public function getAvailableRates($apartmentUrl, $city, $guestCount, $arrivalDate, $departureDate)
 {
     $bookNightCount = Helper::getDaysFromTwoDate($arrivalDate, $departureDate);
     $checkNightCount = Helper::getDaysFromTwoDate($arrivalDate, date('Y-m-d'));
     $sql = "\n            select * from (\n                select\n                    product_rates.id               AS id,\n                    product_rates.name             AS name,\n                    product_rates.capacity         AS capacity,\n                    product_rates.type             AS type,\n                    product_rates.is_refundable    AS is_refundable,\n                    product_rates.refundable_before_hours AS refundable_before_hours,\n                    product_rates.penalty_percent  AS penalty_percent,\n                    product_rates.penalty_nights     AS penalty_nights,\n                    product_rates.penalty_fixed_amount   AS penalty_fixed_amount,\n                    product_rates.penalty_type     AS penalty_type,\n                    avg(rate_av.price)             AS price,\n                    min(rate_av.availability)     AS availability,\n                    apartments.currency_id         AS currency_id,\n                    geo_details.name            AS city_name,\n                    currency.code                  AS code,\n                    currency.symbol                AS symbol\n                from " . DbTables::TBL_APARTMENT_INVENTORY . " as rate_av\n                    left join " . DbTables::TBL_APARTMENT_RATES . "    as product_rates on product_rates.id = rate_av.rate_id\n                    left join " . DbTables::TBL_APARTMENTS . "       as apartments    on apartments.id = rate_av.apartment_id\n                    left join " . DbTables::TBL_CITIES . "           as cities        on cities.id = apartments.city_id\n                    left join " . DbTables::TBL_LOCATION_DETAILS . " as geo_details   on geo_details.id = cities.detail_id and lower(geo_details.name) = ?\n                    left join " . DbTables::TBL_CURRENCY . "         as currency      on currency.id = apartments.currency_id\n                where\n                    apartments.url         = ? and\n                    product_rates.active   = 1 and\n                    product_rates.capacity >= ? and\n                    product_rates.min_stay <= ? and\n                    product_rates.max_stay >= ? and\n                    product_rates.release_period_start <= ? and\n                    product_rates.release_period_end >= ? and\n                    rate_av.date           >= ? and\n                    rate_av.date           < ?\n                group by rate_av.rate_id\n                order by\n                  rate_av.price asc,\n                  product_rates.capacity asc\n            ) as result where result.availability > 0";
     if (!Helper::isBackofficeUser()) {
         $sql .= " limit 4";
     }
     $statement = $this->adapter->createStatement($sql, [$city, $apartmentUrl, $guestCount, $bookNightCount, $bookNightCount, $checkNightCount, $checkNightCount, $arrivalDate, $departureDate]);
     $result = $statement->execute();
     return $result;
 }