MSV FM

[email protected]: ~ $
Path : /home/bethanyinvest/public_html/wp-content/plugins/motopress-hotel-booking/
File Upload :
Current < : /home/bethanyinvest/public_html/wp-content/plugins/motopress-hotel-booking/plugin.php

<?php

/*
 * This plugin contains hooks that allow you to edit, add and move content without needing to edit template files. This method protects against upgrade issues.
 * Alternatively, you can copy template files from './templates/' folder to '/your-theme/hotel-booking/' to override them.
 */

HotelBookingPlugin::setPluginDirPathAndUrl( MPHB_PLUGIN_FILE, ( isset( $plugin ) ? $plugin : null ), ( isset( $network_plugin ) ? $network_plugin : null ) );

class HotelBookingPlugin {

	/**
	 * @var \MPHB\HotelBookingPlugin
	 */
	private static $instance = null;

	private static $_pluginFile;
	private static $_pluginDirPath;
	private static $_pluginDirUrl;

	/**
	 * Fix for symlinked plugin
	 *
	 * @global string $wp_version
	 * @param string      $file
	 * @param string|null $plugin
	 * @param string|null $network_plugin
	 */
	public static function setPluginDirPathAndUrl( $file, $plugin, $network_plugin ) {
		global $wp_version;
		if ( version_compare( $wp_version, '3.9', '<' ) && isset( $network_plugin ) ) {
			self::$_pluginFile = $network_plugin;
		} else {
			self::$_pluginFile = MPHB_PLUGIN_FILE;
		}

		$realDirName    = basename( dirname( self::$_pluginFile ) );
		$symlinkDirName = isset( $plugin ) ? basename( dirname( $plugin ) ) : $realDirName;

		self::$_pluginDirPath = plugin_dir_path( self::$_pluginFile );

		if ( version_compare( $wp_version, '3.9', '<' ) ) {
			self::$_pluginDirUrl = plugin_dir_url( $symlinkDirName . '/' . basename( self::$_pluginFile ) );
		} else {
			self::$_pluginDirUrl = plugin_dir_url( self::$_pluginFile );
		}
	}

	private $name;
	/**
	 * @since 3.6.0
	 */
	private $pluginStoreUri; // Plugin URI from plugin headers: motopress.com/...
	private $author;
	private $version;
	private $pluginSlug; // "motopress-hotel-booking" or "motopress-hotel-booking-lite"
	private $productSlug; // Always "motopress-hotel-booking"
	private $productDir; // "motopress-hotel-booking" or "motopress-hotel-booking-lite"
	private $prefix;
	private $pluginDir;
	private $pluginDirUrl;

	/**
	 * @var \MPHB\Autoloader
	 */
	private $autoloader;

	/**
	 * @var \MPHB\Translation
	 */
	private $translation;

	/**
	 * @var \MPHB\Core\RoomsCoreAPIFacade
	 */
	private $roomsCoreAPIFacade = null;

	/**
	 * @var \MPHB\Core\RoomsAvailabilityCoreAPIFacade
	 */
	private $roomsAvailabilityCoreAPIFacade = null;

	/**
	 * @var \MPHB\Core\PricesCoreAPIFacade
	 */
	private $pricesCoreAPIFacade = null;

	/**
	 * @var \MPHB\Core\BookingsCoreAPIFacade
	 */
	private $bookingsCoreAPIFacade = null;

	/**
	 * @var \MPHB\Admin\MenuPages\SettingsMenuPage
	 */
	private $settingsMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\ShortcodesMenuPage
	 */
	private $shortcodesMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\LanguageMenuPage
	 */
	private $languageMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\RoomsGeneratorMenuPage
	 */
	private $roomsGeneratorMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\CustomersMenuPage
	 */
	private $customersMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\CalendarMenuPage
	 */
	private $calendarMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\BookingRulesMenuPage
	 */
	private $bookingRulesPage;

	/**
	 * @var \MPHB\Admin\MenuPages\TaxesAndFeesMenuPage
	 */
	private $taxesAndFeesPage;

	/**
	 * @var \MPHB\Admin\MenuPages\iCalMenuPage
	 */
	private $iCalMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\iCalImportMenuPage
	 */
	private $iCalImportMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\iCalSyncLogsMenuPage
	 */
	private $iCalSyncLogsMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\CreateBookingMenuPage
	 */
	private $createBookingMenuPage;

	/**
	 * @var \MPHB\Admin\MenuPages\EditBookingMenuPage
	 * @since 3.8
	 */
	private $editBookingMenuPage;



	/**
	 * @var \MPHB\Admin\MenuPages\ReportsMenuPage
	 *
	 * @since 3.5.0
	 */
	private $reportsPage;

	/**
	 * @var MPHB\Admin\MenuPages\ExtensionsMenuPage
	 */
	private $extensionsPage;

	/**
	 * @var \MPHB\CustomPostTypes
	 */
	private $postTypes;

	/**
	 * @var \MPHB\Session
	 */
	private $session;

	/**
	 * @var \MPHB\Ajax
	 */
	private $ajax;

	/**
	 * @var MPHB\Upgrader
	 */
	private $upgrader;

	/**
	 * @var MPHB\CalendarFeed
	 */
	private $calendarFeed;

	/**
	 * @var \MPHB\Wizard
	 */
	private $wizard;

	/**
	 * @var \MPHB\Importer
	 */
	private $importer;

	/**
	 * @var \MPHB\iCal\BackgroundProcesses\BackgroundSynchronizer
	 */
	private $iCalSynchronizer;

	/**
	 * @var MPHB\iCal\BackgroundProcesses\QueuedSynchronizer
	 */
	private $queuedSynchronizer;

	/**
	 * @var \MPHB\iCal\BackgroundProcesses\BackgroundUploader
	 */
	private $iCalUploader;

	/**
	 * @var \MPHB\CSV\Bookings\BookingsExporter
	 *
	 * @since 3.5.0
	 */
	private $bookingsExporter;

	/**
	 * @var \MPHB\ActionsHandler
	 *
	 * @since 3.6.0 (replaced the $downloader)
	 */
	private $actionsHandler;

	/**
	 * @var \MPHB\ScriptManagers\PublicScriptManager
	 */
	private $publicScriptManager;

	/**
	 * @var \MPHB\ScriptManagers\AdminScriptManager
	 */
	private $adminScriptManager;

	/**
	 * @var \MPHB\ScriptManagers\BlockScriptManager
	 */
	private $blockScriptManager;

	/**
	 * @var \MPHB\BlocksRender
	 */
	private $blocksRender;

	/**
	 * @var \MPHB\Emails\Emails
	 */
	private $emails;

	/**
	 * @var \MPHB\Shortcodes
	 */
	private $shortcodes;

	/**
	 * @var \MPHB\UserActions\UserActions
	 */
	private $userActions;

	/**
	 * @var \MPHB\Entities\RoomType
	 */
	private $currentRoomType;

	/**
	 * @var \MPHB\SearchParametersStorage
	 */
	private $searchParametersStorage;

	/**
	 * @var \MPHB\ReservationRequest
	 *
	 * @since 3.5.0
	 */
	private $reservationRequest;

	/**
	 * @var \MPHB\Settings\SettingsRegistry
	 */
	private $settings;

	/**
	 * @var \MPHB\Notices
	 */
	private $notices;

	/**
	 * @var \MPHB\Admin\Menus
	 */
	private $menus;

	/**
	 * @var \MPHB\Payments\Gateways\GatewayManager
	 */
	private $gatewayManager;

	/**
	 * @var \MPHB\Advanced\Advanced
	 */
	private $advanced;

	/**
	 * @var \MPHB\Payments\PaymentManager
	 */
	private $paymentManager;
	private $ratePersistence;
	private $roomTypePersistence;
	private $roomPersistence;
	private $attributesPersistence;
	private $bookingPersistence;
	private $servicePersistence;
	private $seasonPersistence;
	private $paymentPersistence;
	private $reservedRoomPersistence;
	private $couponPersistence;
	private $bookingRepository;
	private $serviceRepository;
	private $rateRepository;
	private $roomRepository;
	private $roomTypeRepository;
	private $seasonRepository;
	private $paymentRepository;
	private $reservedRoomRepository;
	private $couponRepository;
	private $syncUrlsRepository;
	private $attributeRepository;

	/**
	 * @var \MPHB\Crons\CronManager
	 */
	private $cronManager;

	/**
	 * @var \MPHB\UsersAndRoles\Roles
	 */
	private $roles;

	/**
	 * @var \MPHB\UsersAndRoles\CapabilitiesAndRoles
	 */
	private $capabilitiesAndRoles;

	/**
	 * @var \MPHB\UsersAndRoles\User
	 */
	private $account;

	private $roomTypeMicrodata = null;

	public static function getInstance() {

		if ( ! isset( self::$instance ) ) {

			self::$instance = new self();
			self::$instance->afterConstruct();
		}
		return self::$instance;
	}

	private function __construct() {

		$this->pluginDir    = self::$_pluginDirPath;
		$this->pluginDirUrl = self::$_pluginDirUrl;
		$this->pluginSlug = 'motopress-hotel-booking';
		$this->productSlug = 'motopress-hotel-booking';
		$this->productDir  = basename( dirname( MPHB_PLUGIN_FILE ) );
		$this->prefix      = 'mphb';

		$pluginData           = $this->getPluginData();
		$this->author         = isset( $pluginData['Author'] ) ? $pluginData['Author'] : '';
		$this->name           = isset( $pluginData['Name'] ) ? $pluginData['Name'] : '';
		$this->pluginStoreUri = isset( $pluginData['PluginURI'] ) ? $pluginData['PluginURI'] : '';
		$this->version        = isset( $pluginData['Version'] ) ? $pluginData['Version'] : '';
	}

	public function requireOnce( $relativePath ) {
		require_once $this->getPluginPath( $relativePath );
	}

	/**
	 * @since 3.7.2 added new action - "mphb_loaded".
	 */
	private function afterConstruct() {

		$this->requireOnce( 'includes/autoloader.php' );
		$this->requireOnce( 'functions.php' );
		$this->requireOnce( 'template-functions.php' );
		$this->requireOnce( 'includes/attribute-functions.php' );
		$this->requireOnce( 'includes/libraries/wp-session-manager/wp-session.php' );
		$this->requireOnce( 'includes/libraries/wp-background-processing/wp-background-processing.php' );

		add_action( 'plugins_loaded', array( $this, 'loadTextdomain' ) );
		add_action( 'init', array( $this, 'rewriteRules' ) );
		add_action( 'admin_init', array( $this, 'initAutoUpdater' ), 9 );
		// add_action( 'wp', array( $this, 'setupRoomTypeMicrodata' ) );
		// add_action( 'wp_head', array( $this, 'pushRoomTypeMicrodata' ) );
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueuePublicScripts' ), 11 );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueueAdminScripts' ), 11 );
		add_action( 'the_post', array( $this, 'setCurrentRoomType' ) );

		/**
		 * @since 3.9.4
		 */
		if ( version_compare( get_bloginfo( 'version' ), '5.1', '>=' ) ) {
			add_action( 'wp_insert_site', array( $this, 'createNewBlog' ) );
		} else {
			add_action( 'wpmu_new_blog', array( $this, 'createNewBlog' ) );
		}

		/**
		 * @since 3.9.4
		 */
		add_filter( 'wpmu_drop_tables', array( $this, 'deleteBlog' ), 10, 2 );

		$this->autoloader = new \MPHB\Autoloader( trailingslashit( $this->getPluginPath() ) );

		$this->roomsCoreAPIFacade             = new \MPHB\Core\RoomsCoreAPIFacade();
		$this->roomsAvailabilityCoreAPIFacade = new \MPHB\Core\RoomsAvailabilityCoreAPIFacade();
		$this->pricesCoreAPIFacade            = new \MPHB\Core\PricesCoreAPIFacade();
		$this->bookingsCoreAPIFacade          = new \MPHB\Core\BookingsCoreAPIFacade();

		new \MPHB\AjaxApi\AjaxApiHandler();

		$this->actionsHandler = new \MPHB\ActionsHandler();
		$this->settings       = new \MPHB\Settings\SettingsRegistry();
		$this->notices        = new \MPHB\Notices();
		$this->session        = new \MPHB\Session();
		$this->translation    = new \MPHB\Translation();

		$this->publicScriptManager = new \MPHB\ScriptManagers\PublicScriptManager();
		$this->adminScriptManager  = new \MPHB\ScriptManagers\AdminScriptManager();

		if ( function_exists( 'register_block_type' ) ) {
			$this->blockScriptManager = new \MPHB\ScriptManagers\BlockScriptManager();
			$this->blocksRender       = new \MPHB\BlocksRender();
		}

		$this->paymentManager = new \MPHB\Payments\PaymentManager();
		$this->gatewayManager = new \MPHB\Payments\Gateways\GatewayManager();

		$this->advanced  = new \MPHB\Advanced\Advanced();
		$this->postTypes = new \MPHB\CustomPostTypes();

		$this->initRepositories();
		$this->menus = new MPHB\Admin\Menus();

		$this->createPages();

		$this->shortcodes = new \MPHB\Shortcodes();

		$this->wizard   = new \MPHB\Wizard();
		$this->importer = new \MPHB\Importer();

		$this->iCalSynchronizer   = new \MPHB\iCal\BackgroundProcesses\BackgroundSynchronizer();
		$this->queuedSynchronizer = new \MPHB\iCal\BackgroundProcesses\QueuedSynchronizer( $this->iCalSynchronizer );
		$this->iCalUploader       = new \MPHB\iCal\BackgroundProcesses\BackgroundUploader();

		$this->bookingsExporter = new \MPHB\CSV\Bookings\BookingsExporter();
		new \MPHB\CSV\CSVExportHandler();

		$this->emails      = new \MPHB\Emails\Emails();
		$this->userActions = new \MPHB\UserActions\UserActions();

		$this->cronManager = new MPHB\Crons\CronManager();

		$this->roles                = new \MPHB\UsersAndRoles\Roles();
		$this->capabilitiesAndRoles = new \MPHB\UsersAndRoles\CapabilitiesAndRoles();
		$this->capabilitiesAndRoles::setup();

		$this->account = new \MPHB\UsersAndRoles\User();

		new \MPHB\Fixes();
		new \MPHB\Views\ViewActions();

		new \MPHB\LinkedRooms();

		\MPHB\Widgets\RoomsWidget::init();
		\MPHB\Widgets\SearchAvailabilityWidget::init();

		$this->searchParametersStorage = new \MPHB\SearchParametersStorage();
		$this->reservationRequest      = new \MPHB\ReservationRequest();

		$this->ajax = new \MPHB\Ajax();

		$this->upgrader = new MPHB\Upgrader();

		$this->calendarFeed = new MPHB\CalendarFeed();

		do_action( 'mphb_loaded', $this );
	}

	private function initRepositories() {

		$this->ratePersistence         = new \MPHB\Persistences\RatePersistence( $this->postTypes->rate()->getPostType() );
		$this->roomTypePersistence     = new \MPHB\Persistences\RoomTypePersistence( $this->postTypes->roomType()->getPostType() );
		$this->roomPersistence         = new \MPHB\Persistences\RoomPersistence( $this->postTypes->room()->getPostType() );
		$this->attributesPersistence   = new \MPHB\Persistences\AttributesPersistence( $this->postTypes->attributes()->getPostType() );
		$this->bookingPersistence      = new \MPHB\Persistences\BookingPersistence( $this->postTypes->booking()->getPostType() );
		$this->servicePersistence      = new \MPHB\Persistences\CPTPersistence( $this->postTypes->service()->getPostType() );
		$this->seasonPersistence       = new \MPHB\Persistences\CPTPersistence( $this->postTypes->season()->getPostType() );
		$this->paymentPersistence      = new \MPHB\Persistences\PaymentPersistence( $this->postTypes->payment()->getPostType() );
		$this->reservedRoomPersistence = new \MPHB\Persistences\ReservedRoomPersistence( $this->postTypes->reservedRoom()->getPostType() );
		$this->couponPersistence       = new \MPHB\Persistences\CPTPersistence( $this->postTypes->coupon()->getPostType() );

		$this->roomTypeRepository     = new \MPHB\Repositories\RoomTypeRepository( $this->roomTypePersistence );
		$this->roomRepository         = new \MPHB\Repositories\RoomRepository( $this->roomPersistence );
		$this->rateRepository         = new \MPHB\Repositories\RateRepository( $this->ratePersistence );
		$this->bookingRepository      = new \MPHB\Repositories\BookingRepository( $this->bookingPersistence );
		$this->serviceRepository      = new \MPHB\Repositories\ServiceRepository( $this->servicePersistence );
		$this->seasonRepository       = new \MPHB\Repositories\SeasonRepository( $this->seasonPersistence );
		$this->paymentRepository      = new \MPHB\Repositories\PaymentRepository( $this->paymentPersistence );
		$this->reservedRoomRepository = new \MPHB\Repositories\ReservedRoomRepository( $this->reservedRoomPersistence );
		$this->couponRepository       = new \MPHB\Repositories\CouponRepository( $this->couponPersistence );
		$this->syncUrlsRepository     = new \MPHB\Repositories\SyncUrlsRepository();
		$this->attributeRepository    = new \MPHB\Repositories\AttributeRepository( $this->attributesPersistence );
	}

	/**
	 *
	 * @since 4.0.0 - Custom capabilities used to allow access to admin pages.
	 */
	private function createPages() {

		$roomGeneratorAtts = array(
			'capability'  => 'edit_mphb_rooms',
			'parent_menu' => MPHB()->postTypes()->roomType()->getMenuSlug(),
			'order'       => 20,
		);

		$this->roomsGeneratorMenuPage = new \MPHB\Admin\MenuPages\RoomsGeneratorMenuPage( 'mphb_rooms_generator', $roomGeneratorAtts );

		$settingsAtts = array(
			'capability'  => \MPHB\UsersAndRoles\CapabilitiesAndRoles::MANAGE_SETTINGS,
			'parent_menu' => MPHB()->postTypes()->roomType()->getMenuSlug(),
			'order'       => 30,
		);

		$this->settingsMenuPage = new \MPHB\Admin\MenuPages\SettingsMenuPage( 'mphb_settings', $settingsAtts );

		$languageAtts = array(
			'capability'  => \MPHB\UsersAndRoles\CapabilitiesAndRoles::MANAGE_SETTINGS,
			'parent_menu' => MPHB()->postTypes()->roomType()->getMenuSlug(),
			'order'       => 35,
		);

		$this->languageMenuPage = new \MPHB\Admin\MenuPages\LanguageMenuPage( 'mphb_language', $languageAtts );

		$shortcodesAtts = array(
			'capability'  => 'edit_posts',
			'parent_menu' => MPHB()->postTypes()->roomType()->getMenuSlug(),
			'order'       => 40,
		);

		$this->shortcodesMenuPage = new \MPHB\Admin\MenuPages\ShortcodesMenuPage( 'mphb_shortcodes', $shortcodesAtts );

		$calendarAtts = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::VIEW_CALENDAR,
			'order'      => 50,
		);

		$this->calendarMenuPage = new \MPHB\Admin\MenuPages\CalendarMenuPage( 'mphb_calendar', $calendarAtts );

		$customersAtts = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::VIEW_CUSTOMERS,
			'order'      => 60,
		);

		$this->customersMenuPage = new \MPHB\Admin\MenuPages\CustomersMenuPage( 'mphb_customers', $customersAtts );

		$bookingRulesSettings = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::MANAGE_RULES,
			'order'      => 70,
		);

		$this->bookingRulesPage = new \MPHB\Admin\MenuPages\BookingRulesMenuPage( 'mphb_booking_rules', $bookingRulesSettings );

		$taxesAndFeesSettings = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::MANAGE_TAXES_AND_FEES,
			'order'      => 90,
		);

		$this->taxesAndFeesPage = new \MPHB\Admin\MenuPages\TaxesAndFeesMenuPage( 'mphb_taxes_and_fees', $taxesAndFeesSettings );

		$iCalSettings = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::SYNC_ICAL,
			'order'      => 110,
		);

		$this->iCalMenuPage = new \MPHB\Admin\MenuPages\iCalMenuPage( 'mphb_ical', $iCalSettings );

		$iCalImportSettings = array(
			'capability'  => \MPHB\UsersAndRoles\CapabilitiesAndRoles::IMPORT_ICAL,
			'order'       => 120,
			'parent_menu' => 'none',
		);

		$this->iCalImportMenuPage = new \MPHB\Admin\MenuPages\iCalImportMenuPage( 'mphb_ical_import', $iCalImportSettings );

		$iCalSyncLogsSettings = array(
			'capability'  => \MPHB\UsersAndRoles\CapabilitiesAndRoles::SYNC_ICAL,
			'order'       => 130,
			'parent_menu' => 'none',
		);

		$this->iCalSyncLogsMenuPage = new \MPHB\Admin\MenuPages\iCalSyncLogsMenuPage( 'mphb_sync_logs', $iCalSyncLogsSettings );

		$createBookingSettings = array(
			'capability'  => 'edit_mphb_bookings',
			'order'       => 140,
			'parent_menu' => 'none',
		);

		$this->createBookingMenuPage = new \MPHB\Admin\MenuPages\CreateBookingMenuPage( 'mphb_add_new_booking', $createBookingSettings );

		$this->editBookingMenuPage = new \MPHB\Admin\MenuPages\EditBookingMenuPage(
			'mphb_edit_booking',
			array(
				'order'       => 150,
				'parent_menu' => 'none',
				'capability'  => 'edit_mphb_bookings',
			)
		);





		$reportsPageSettings = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::VIEW_REPORTS,
			'order'      => 170,
		);

		$this->reportsPage = new \MPHB\Admin\MenuPages\ReportsMenuPage( 'mphb_reports', $reportsPageSettings );

		$extensionsPageSettings = array(
			'capability' => \MPHB\UsersAndRoles\CapabilitiesAndRoles::MANAGE_SETTINGS,
			'order'      => 180,
		);

		$this->extensionsPage = new \MPHB\Admin\MenuPages\ExtensionsMenuPage( 'mphb_extensions', $extensionsPageSettings );
	}

	/**
	 * @since 4.2.0
	 * @since 5.0.3 adds rewrite rules for the "My Account" page in all languages.
	 *
	 * @global \WP_Rewrite $wp_rewrite
	 */
	public function rewriteRules() {
		global $wp_rewrite;

		// Add rewrite rules for all languages
		$accountPageIds = MPHB()->translation()->getPostTranslationIds(
			MPHB()->settings()->pages()->getMyAccountPageId(),
			'page'
		);

		$rulesAdded = []; // Regex[] (string[])

		foreach ( $accountPageIds as $accountPageId ) {
			$accountPage = get_post( $accountPageId );

			if ( ! is_null( $accountPage ) ) {
				$ruleRegex = '^(' . $accountPage->post_name . ')/([^/]*)/?';

				add_rewrite_rule(
					$ruleRegex,
					'index.php?pagename=$matches[1]&tab=$matches[2]',
					'top'
				);

				$rulesAdded[] = $ruleRegex;
			}
		}

		// Check if WordPress already had these rules, or if we need to flush
		// them. See MPI-12202 for more details.
		$isFlushRequired = false;

		$storedWpRules = $wp_rewrite->wp_rewrite_rules();

		foreach ( $rulesAdded as $ruleRegex ) {
			if ( ! isset( $storedWpRules[ $ruleRegex ] ) ) {
				$isFlushRequired = true;

				break;
			}
		}

		// Flush rewrite rules?
		if ( $isFlushRequired ) {
			/**
			 * @since 5.0.3
			 *
			 * @param bool $isHardFlush False by default.
			 */
			$isHardFlush = apply_filters( 'mphb_my_account_rules_do_hard_flush', false );

			flush_rewrite_rules( $isHardFlush );
		}

		// Whitelist custom variables for WP_Query:
		//     https://developer.wordpress.org/reference/functions/add_rewrite_rule/#comment-3503
		add_filter(
			'query_vars',
			function( $vars ) {
				$vars[] = 'tab';
				return $vars;
			}
		);
	}

	public function enqueuePublicScripts() {
		if ( mphb_is_single_room_type_page() ) {
			$this->getPublicScriptManager()->enqueue();
		}

		if ( mphb_is_checkout_page() ) {
			$this->getPublicScriptManager()->enqueue();
		}
	}

	public function enqueueAdminScripts() {
		if ( mphb_is_attribute_taxonomy_edit_page() ) {
			wp_enqueue_script( 'jquery-ui-sortable' );
			$this->getAdminScriptManager()->enqueue();
		}
	}

	/**
	 * @return bool
	 *
	 * @see \MPHB\Translation::updateTextdomains()
	 */
	public function loadTextDomain() {
		// Get translation file by product slug
		$pluginSlug  = $this->getPluginSlug();  // "motopress-hotel-booking" or "motopress-hotel-booking-lite"
		$productSlug = $this->getProductSlug(); // "motopress-hotel-booking"
		$textDomain  = $this->getTextDomain();  // "motopress-hotel-booking"

		// Do as load_plugin_textdomain() does
		if ( function_exists( 'determine_locale' ) ) {
			$locale = determine_locale(); // Since WP 5.0
		} elseif ( function_exists( 'get_user_locale' ) ) {
			$locale = get_user_locale(); // Since WP 4.7
		} else {
			$locale = get_locale();
		}

		$locale = apply_filters( 'plugin_locale', $locale, $pluginSlug );

		// wp-content/languages/motopress-hotel-booking/motopress-hotel-booking-{$locale}.mo
		$customMoFile = sprintf( '%1$s/%2$s/%2$s-%3$s.mo', WP_LANG_DIR, $productSlug, $locale );

		// wp-content/languages/plugins/motopress-hotel-booking-{$locale}.mo
		$defaultMoFile = sprintf( '%s/plugins/%s-%s.mo', WP_LANG_DIR, $pluginSlug, $locale );

		// wp-content/plugins/motopress-hotel-booking/languages/motopress-hotel-booking-{$locale}.mo
		$localFile = $this->getPluginDir() . "languages/{$productSlug}-{$locale}.mo";

		return load_textdomain( $textDomain, $customMoFile )
			|| load_textdomain( $textDomain, $defaultMoFile )
			|| load_textdomain( $textDomain, $localFile );
	}

	public function getPrefix() {
		return $this->prefix;
	}

	public function addPrefix( $str, $separator = '-' ) {
		return $this->getPrefix() . $separator . $str;
	}

	/**
	 * Retrieve the slug of the plugin (basename of the plugin file).
	 *
	 * @return string
	 *
	 * @deprecated 3.8.2
	 *
	 * @see HotelBookingPlugin::getTextDomain()
	 * @see HotelBookingPlugin::getPluginSlug()
	 * @see HotelBookingPlugin::getProductSlug()
	 */
	public function getSlug() {
		return $this->pluginSlug;
	}

	/**
	 * @return string
	 *
	 * @since 3.8.2
	 */
	public function getTextDomain() {
		// Text domain is always the same and equal to EDD product slug
		return $this->productSlug;
	}

	/**
	 * Retrieve the slug of the plugin (basename of the plugin file).
	 *
	 * @return string
	 *
	 * @since 3.8.2
	 */
	public function getPluginSlug() {
		return $this->pluginSlug;
	}

	/**
	 * Retrieve the EDD product slug.
	 *
	 * @return string
	 *
	 * @since 3.8.2
	 */
	public function getProductSlug() {
		return $this->productSlug;
	}

	/**
	 * Retrieve path to plugin directory
	 *
	 * @return string
	 */
	public function getPluginDir() {
		return $this->pluginDir;
	}

	/**
	 * Retrieve full path for the relative to plugin root path.
	 *
	 * @param string $relativePath
	 * @return string
	 */
	public function getPluginPath( $relativePath = '' ) {
		return $this->pluginDir . $relativePath;
	}

	public function getPluginUrl( $relativePath = '' ) {
		return $this->pluginDirUrl . $relativePath;
	}

	/**
	 *
	 * @return string
	 */
	public function getAjaxUrl() {
		return admin_url( 'admin-ajax.php' );
	}

	/**
	 * Retreive version of plugin
	 *
	 * @return string
	 */
	public function getVersion() {
		return $this->version;
	}

	/**
	 * @return string
	 *
	 * @since 3.6.0
	 */
	public function getName() {
		return $this->name;
	}

	/**
	 * @return string
	 *
	 * @since 3.6.0
	 */
	public function getPluginStoreUri() {
		return $this->pluginStoreUri;
	}

	/**
	 * @return \MPHB\Core\RoomsCoreAPIFacade
	 */
	public function getRoomsCoreAPIFacade() {
		return $this->roomsCoreAPIFacade;
	}

	/**
	 * @return \MPHB\Core\RoomsAvailabilityCoreAPIFacade
	 */
	public function getRoomsAvailabilityCoreAPIFacade() {
		return $this->roomsAvailabilityCoreAPIFacade;
	}

	/**
	 * @return \MPHB\Core\PricesCoreAPIFacade
	 */
	public function getPricesCoreAPIFacade() {
		return $this->pricesCoreAPIFacade;
	}

	/**
	 * @return \MPHB\Core\BookingsCoreAPIFacade
	 */
	public function getBookingsCoreAPIFacade() {
		return $this->bookingsCoreAPIFacade;
	}

	/**
	 *
	 * @return \MPHB\Settings\SettingsRegistry
	 */
	public function settings() {
		return $this->settings;
	}

	/**
	 * @return \MPHB\Notices
	 *
	 * @since 3.7.0
	 */
	public function notices() {
		return $this->notices;
	}

	/**
	 *
	 * @return \MPHB\UserActions\UserActions
	 */
	public function userActions() {
		return $this->userActions;
	}

	/**
	 *
	 * @return \MPHB\Crons\CronManager
	 */
	public function cronManager() {
		return $this->cronManager;
	}

	/**
	 * @return \MPHB\Session
	 */
	public function getSession() {
		return $this->session;
	}

	/**
	 * Retrieve relative to theme root path to templates.
	 *
	 * @return string
	 */
	public function getTemplatePath() {
		return apply_filters( 'mphb_template_path', 'hotel-booking/' );
	}

	/**
	 *
	 * @param \WP_Post|int $post
	 */
	public function setCurrentRoomType( $post ) {
		$this->currentRoomType = null;

		if ( is_int( $post ) ) {
			$post = get_post( $post );
		}

		if ( ! empty( $post->post_type ) && $post->post_type === MPHB()->postTypes()->roomType()->getPostType() ) {
			$this->currentRoomType = MPHB()->getRoomTypeRepository()->findById( $post->ID );
		}
	}

	/**
	 * When a new Blog is created in multisite, see if plugin is network activated, and run the installer
	 *
	 * @param int|WP_Site $blog
	 *
	 * @since 3.9.4
	 */
	public function createNewBlog( $blog ) {

		/*
		 * Additional check in case the plugin is not network active.
		 */
		if ( ! is_plugin_active_for_network( plugin_basename( MPHB_PLUGIN_FILE ) ) ) {
			return;
		}

		if ( ! is_int( $blog ) ) {
			$blog = $blog->id;
		}

		switch_to_blog( $blog );
		self::install();
		add_action( 'init', array( 'HotelBookingPlugin', 'afterInstall' ) );
		restore_current_blog();
	}

	/**
	 *
	 * @param array $tables
	 * @param int   $blog_id
	 *
	 * @since 3.9.4
	 */
	public function deleteBlog( $tables, $blog_id ) {
		global $wpdb;

		switch_to_blog( $blog_id );

		$tables[] = $wpdb->prefix . 'mphb_sync_urls';
		$tables[] = $wpdb->prefix . 'mphb_sync_queue';
		$tables[] = $wpdb->prefix . 'mphb_sync_stats';
		$tables[] = $wpdb->prefix . 'mphb_sync_logs';
		$tables[] = $wpdb->prefix . 'mphb_customers';
		$tables[] = $wpdb->prefix . 'mphb_customers_meta';

		restore_current_blog();

		return $tables;
	}

	public function setupRoomTypeMicrodata() {
		if ( ! mphb_is_single_room_type_page() ) {
			return;
		}

		$microdata = array(
			'@context'    => 'http://schema.org',
			'@type'       => 'Hotel',
			'name'        => get_the_title(),
			'description' => get_the_excerpt(),
			'url'         => get_permalink(),
		);

		if ( has_post_thumbnail() ) {
			$microdata['image'] = wp_get_attachment_url( get_post_thumbnail_id() );
		}

		// Setup price range
		$roomTypeId = get_the_ID();
		$roomType   = $this->getRoomTypeRepository()->findById( $roomTypeId );
		$basePrice  = ! is_null( $roomType ) ? mphb_get_room_type_base_price( $roomType ) : 0;

		if ( $basePrice > 0 ) {

			// No need to check is_null($roomType) here again
			$nights = $this->getRoomsAvailabilityCoreAPIFacade()->getMinStayNightsCountForAllSeasons(
				$roomType->getOriginalId()
			);

			$periodPrice = $basePrice * $nights;

			$formattedPrice = $this->getPricesCoreAPIFacade()->formatPrice(
				$periodPrice,
				array(
					'period'        => true,
					'period_nights' => $nights,
					'as_html'       => false,
				)
			);

			$microdata['priceRange'] = sprintf( __( 'Prices start at: %s', 'motopress-hotel-booking' ), $formattedPrice );
		}

		$this->roomTypeMicrodata = apply_filters( 'mphb_single_room_type_microdata', $microdata, $roomTypeId, $roomType );
	}

	public function pushRoomTypeMicrodata() {
		if ( ! is_null( $this->roomTypeMicrodata ) ) {
			$json = json_encode( $this->roomTypeMicrodata );

			if ( $json !== false ) {
				// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				echo '<script type="application/ld+json">' . $json . '</script>';
			}
		}
	}

	/**
	 *
	 * @return \MPHB\Entities\RoomType
	 */
	public function getCurrentRoomType() {
		return $this->currentRoomType;
	}

	/**
	 *
	 * @return \MPHB\Advanced\Advanced
	 */
	public function getAdvanced() {
		return $this->advanced;
	}

	/**
	 *
	 * @return \MPHB\CustomPostTypes
	 */
	public function postTypes() {
		return $this->postTypes;
	}

	/**
	 *
	 * @return \MPHB\Admin\Menus
	 */
	public function menus() {
		return $this->menus;
	}

	/**
	 *
	 * @return \MPHB\Shortcodes
	 */
	public function getShortcodes() {
		return $this->shortcodes;
	}

	/**
	 *
	 * @return \MPHB\Ajax
	 */
	public function getAjax() {
		return $this->ajax;
	}

	/**
	 *
	 * @return MPHB\Upgrader
	 */
	public function upgrader() {
		return $this->upgrader;
	}

	/**
	 *
	 * @return \MPHB\Admin\MenuPages\SettingsMenuPage
	 */
	public function getSettingsMenuPage() {
		return $this->settingsMenuPage;
	}

	/**
	 *
	 * @return \MPHB\Admin\MenuPages\ShortcodesMenuPage
	 */
	public function getShortcodesMenuPage() {
		return $this->shortcodesMenuPage;
	}

	/**
	 *
	 * @return \MPHB\Admin\MenuPages\RoomsGeneratorMenuPage
	 */
	public function getRoomsGeneratorMenuPage() {
		return $this->roomsGeneratorMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\CalendarMenuPage
	 */
	public function getCalendarMenuPage() {
		return $this->calendarMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\CustomersMenuPage
	 */
	public function getCustomersMenuPage() {
		return $this->customersMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\BookingRulesMenuPage
	 */
	public function getBookingRulesPage() {
		return $this->bookingRulesPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\TaxesAndFeesMenuPage
	 */
	public function getTaxesAndFeesPage() {
		return $this->taxesAndFeesPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\iCalMenuPage
	 */
	public function getICalMenuPage() {
		return $this->iCalMenuPage;
	}

	/**
	 * @return MPHB\Admin\MenuPages\iCalImportMenuPage
	 */
	public function getICalImportMenuPage() {
		return $this->iCalImportMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\iCalSyncLogsMenuPage
	 */
	public function getICalSyncLogsMenuPage() {
		return $this->iCalSyncLogsMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\CreateBookingMenuPage
	 */
	public function getCreateBookingMenuPage() {
		return $this->createBookingMenuPage;
	}

	/**
	 * @return \MPHB\Admin\MenuPages\EditBookingMenuPage
	 *
	 * @since 3.8
	 */
	public function getEditBookingMenuPage() {
		return $this->editBookingMenuPage;
	}

	/**
	 * @return MPHB\Admin\MenuPages\ReportsMenuPage
	 *
	 * @since 3.5.0
	 */
	public function getReportsPage() {
		return $this->reportsPage;
	}

	/**
	 * @return MPHB\Admin\MenuPages\ExtensionsMenuPage
	 */
	public function getExtensionsPage() {
		return $this->extensionsPage;
	}

	/**
	 *
	 * @return \MPHB\Importer
	 */
	public function getImporter() {
		return $this->importer;
	}

	/**
	 *
	 * @return \MPHB\iCal\BackgroundProcesses\BackgroundUploader
	 */
	public function getICalUploader() {
		return $this->iCalUploader;
	}

	/**
	 *
	 * @return \MPHB\iCal\BackgroundProcesses\BackgroundSynchronizer
	 */
	public function getICalSynchronizer() {
		return $this->iCalSynchronizer;
	}

	/**
	 *
	 * @return MPHB\iCal\BackgroundProcesses\QueuedSynchronizer
	 */
	public function getQueuedSynchronizer() {
		return $this->queuedSynchronizer;
	}

	/**
	 * @return \MPHB\CSV\Bookings\BookingsExporter
	 *
	 * @since 3.5.0
	 */
	public function getBookingsExporter() {
		return $this->bookingsExporter;
	}

	/**
	 *
	 * @return \MPHB\UserActions
	 */
	public function getUserActions() {
		return $this->userActions;
	}

	/**
	 *
	 * @return \MPHB\ScriptManagers\PublicScriptManager
	 */
	public function getPublicScriptManager() {
		return $this->publicScriptManager;
	}

	/**
	 *
	 * @return \MPHB\ScriptManagers\AdminScriptManager
	 */
	public function getAdminScriptManager() {
		return $this->adminScriptManager;
	}

	/**
	 *
	 * @return \MPHB\BlocksRender
	 */
	public function getBlocksRender() {
		return $this->blocksRender;
	}

	/**
	 *
	 * @return \MPHB\Emails\Emails
	 */
	public function emails() {
		return $this->emails;
	}

	/**
	 *
	 * @return \MPHB\SearchParametersStorage
	 */
	public function searchParametersStorage() {
		return $this->searchParametersStorage;
	}

	/**
	 * @return \MPHB\ReservationRequest
	 *
	 * @since 3.5.0
	 */
	public function reservationRequest() {
		return $this->reservationRequest;
	}

	/**
	 *
	 * @param string $version version to compare with wp version
	 * @param string $operator Optional. Possible operators are: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne respectively. Default =.
	  This parameter is case-sensitive, values should be lowercase.
	 * @return bool
	 */
	public function isWPVersion( $version, $operator = '=' ) {
		global $wp_version;
		return version_compare( $wp_version, $version, $operator );
	}

	/**
	 *
	 * @since 3.9.4 bool $network_wide
	 */
	public static function activate( $network_wide = false ) {
		global $wpdb;

		if ( $network_wide && is_multisite() ) {

			/**
			 * @param int $limit Max number of site IDs to get.
			 *
			 * @since 3.9.6
			 */
			$limit   = apply_filters( 'mphb_multisite_limit', 100 );
			$blogIds = $wpdb->get_col( sprintf( "SELECT blog_id FROM $wpdb->blogs LIMIT %d", $limit ) );
			foreach ( $blogIds as $blogId ) {
				switch_to_blog( $blogId );
				self::install();
				self::afterInstall();
				restore_current_blog();
			}
		} else {
			self::install();
			self::afterInstall();
		}
	}

	/**
	 *
	 * @since 3.9.4
	 */
	public static function install() {
		self::createTables();
	}

	/**
	 *
	 * @since 3.9.4
	 */
	public static function afterInstall() {
		// This method will be called only once with first activated plugin - Premium or Lite
		MPHB()->postTypes()->flushRewriteRules();
		mphb_create_uploads_dir();

		if ( MPHB()->settings()->main()->deleteSyncLogsOlderThan() != 'never' ) {
			MPHB()->cronManager()->getCron( 'ical_auto_delete' )->schedule();
		}

		/**
		 * @since 3.9.4
		 */
		do_action( 'mphb_activated' );
	}

	public static function createTables() {
		global $wpdb;

		$syncUrls = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_sync_urls ("
			. ' url_id INT NOT NULL AUTO_INCREMENT,'
			. ' room_id INT NOT NULL,'
			. ' sync_id VARCHAR(32) NOT NULL,'
			. ' calendar_url VARCHAR(250) NOT NULL,'
			. ' PRIMARY KEY (url_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$syncQueue = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_sync_queue ("
			. ' queue_id INT NOT NULL AUTO_INCREMENT,'
			. ' queue_name TINYTEXT NOT NULL,'
			. ' queue_status VARCHAR(30) NOT NULL,'
			. ' PRIMARY KEY (queue_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$syncStats = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_sync_stats ("
			. ' stat_id INT NOT NULL AUTO_INCREMENT,'
			. ' queue_id INT NOT NULL,'
			. ' import_total INT NOT NULL DEFAULT 0,'
			. ' import_succeed INT NOT NULL DEFAULT 0,'
			. ' import_skipped INT NOT NULL DEFAULT 0,'
			. ' import_failed INT NOT NULL DEFAULT 0,'
			. ' clean_total INT NOT NULL DEFAULT 0,'
			. ' clean_done INT NOT NULL DEFAULT 0,'
			. ' clean_skipped INT NOT NULL DEFAULT 0,'
			. ' PRIMARY KEY (stat_id),'
			. ' UNIQUE KEY queue_id (queue_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$syncLogs = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_sync_logs ("
			. ' log_id INT NOT NULL AUTO_INCREMENT,'
			. ' queue_id INT NOT NULL,'
			. ' log_status VARCHAR(30) NOT NULL,'
			. ' log_message TEXT NOT NULL,'
			. ' log_context TEXT NOT NULL,'
			. ' PRIMARY KEY (log_id),'
			. ' KEY queue_id (queue_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$customers = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_customers ("
			. ' customer_id INT NOT NULL AUTO_INCREMENT,'
			. ' user_id INT NULL UNIQUE,'
			. ' email VARCHAR(60) NOT NULL UNIQUE,'
			. ' first_name VARCHAR(60) NOT NULL,'
			. ' last_name VARCHAR(60) NOT NULL,'
			. ' phone VARCHAR(20) NOT NULL,'
			. ' country VARCHAR(2) NOT NULL,'
			. ' state VARCHAR(20) NOT NULL,'
			. ' city VARCHAR(20) NOT NULL,'
			. ' address1 text NOT NULL,'
			. ' zip VARCHAR(10) NOT NULL,'
			. ' bookings INT NOT NULL,'
			. " date_registered DATETIME NOT NULL default '0000-00-00 00:00:00',"
			. ' last_active DATETIME NULL,'
			. ' KEY customer_id (customer_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$customersMeta = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_customers_meta ("
			. ' meta_id INT NOT NULL AUTO_INCREMENT,'
			. ' customer_id INT NULL,'
			. ' meta_key varchar(255) NULL,'
			. ' meta_value longtext NULL,'
			. ' KEY meta_id (meta_id)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$apiKeys = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}mphb_api_keys ("
			. ' key_id BIGINT UNSIGNED NOT NULL auto_increment,'
			. ' user_id BIGINT UNSIGNED NOT NULL,'
			. ' description varchar(200) NULL,'
			. ' permissions varchar(10) NOT NULL,'
			. ' consumer_key char(64) NOT NULL,'
			. ' consumer_secret char(43) NOT NULL,'
			. ' nonces longtext NULL,'
			. ' truncated_key char(7) NOT NULL,'
			. ' last_access datetime NULL default null,'
			. ' PRIMARY KEY  (key_id),'
			. ' KEY consumer_key (consumer_key),'
			. ' KEY consumer_secret (consumer_secret)'
			. ') CHARSET=utf8 AUTO_INCREMENT=1';

		$wpdb->query( $syncUrls );
		$wpdb->query( $syncQueue );
		$wpdb->query( $syncStats );
		$wpdb->query( $syncLogs );
		$wpdb->query( $customers );
		$wpdb->query( $customersMeta );
		$wpdb->query( $apiKeys );

	}

	/**
	 *
	 * @since 4.0.0
	 */
	public static function removeUserRoles() {
		global $wp_roles;

		if ( ! class_exists( 'WP_Roles' ) ) {
			return;
		}

		if ( ! isset( $wp_roles ) ) {
			$wp_roles = new WP_Roles();
		}

		$capabilitiesToRoles = MPHB()->capabilitiesAndRoles()->getRoles();

		if ( ! empty( $capabilitiesToRoles ) ) {
			foreach ( $capabilitiesToRoles as $role => $capabilities ) {
				if ( ! empty( $capabilities ) ) {
					foreach ( $capabilities as $cap ) {
						$wp_roles->remove_cap( $role, $cap );
					}
				}
			}
		}

		$roles = MPHB()->roles()->getRoles();

		if ( ! empty( $roles ) ) {
			foreach ( $roles as $role => $desc ) {
				remove_role( $role );
			}
		}

		self::setCustomRolesVersion( 0 );
	}

	public static function deactivate() {
		$mphbActiveCount  = (int) \MPHB\Utils\ThirdPartyPluginsUtils::isActiveMphb();
		$mphbActiveCount += (int) \MPHB\Utils\ThirdPartyPluginsUtils::isActiveMphbLite();

		// Check bulk actions
		if ( isset( $_POST['action'] ) && ( $_POST['action'] == 'deactivate-selected' || $_POST['action'] == 'delete-selected' ) ) {

			// phpcs:ignore WordPress.Security.ValidatedSanitizedInput
			$removedPlugins = isset( $_POST['checked'] ) && is_array( $_POST['checked'] ) ? mphb_clean( $_POST['checked'] ) : array();

			foreach ( $removedPlugins as $removedPlugin ) {
				if ( strpos( $removedPlugin, 'motopress-hotel-booking.php' ) !== false ) {
					$mphbActiveCount--;
				}
			}
		}

		if ( $mphbActiveCount <= 1 ) {
			flush_rewrite_rules();
			MPHB()->cronManager()->rescheduleAutoSynchronization( false );
			MPHB()->cronManager()->getCron( 'ical_auto_delete' )->unschedule();
		}
	}

	/**
	 *
	 * @return \MPHB\Persistences\RoomTypePersistence
	 */
	public function getRoomTypePersistence() {
		return $this->roomTypePersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\AttributesPersistence
	 */
	public function getAttributesPersistence() {
		return $this->attributesPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\RoomPersistence
	 */
	public function getRoomPersistence() {
		return $this->roomPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\RatePersistence
	 */
	public function getRatePersistence() {
		return $this->ratePersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\BookingPersistence
	 */
	public function getBookingPersistence() {
		return $this->bookingPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\CPTPersistence
	 */
	public function getServicePersistence() {
		return $this->servicePersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\CPTPersistence
	 */
	public function getSeasonPersistence() {
		return $this->seasonPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\CPTPersistence
	 */
	public function getPaymentPersistence() {
		return $this->paymentPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\ReservedRoomPersistence
	 */
	public function getReservedRoomPersistence() {
		return $this->reservedRoomPersistence;
	}

	/**
	 *
	 * @return \MPHB\Persistences\CPTPersistence
	 */
	public function getCouponPersistence() {
		return $this->couponPersistence;
	}

	/**
	 *
	 * @return \MPHB\Repositories\RoomTypeRepository
	 */
	public function getRoomTypeRepository() {
		return $this->roomTypeRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\RoomRepository
	 */
	public function getRoomRepository() {
		return $this->roomRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\RateRepository
	 */
	public function getRateRepository() {
		return $this->rateRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\BookingRepository
	 */
	public function getBookingRepository() {
		return $this->bookingRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\ServiceRepository
	 */
	public function getServiceRepository() {
		return $this->serviceRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\SeasonRepository
	 */
	public function getSeasonRepository() {
		return $this->seasonRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\PaymentRepository
	 */
	public function getPaymentRepository() {
		return $this->paymentRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\ReservedRoomRepository
	 */
	public function getReservedRoomRepository() {
		return $this->reservedRoomRepository;
	}

	/**
	 *
	 * @return \MPHB\Repositories\CouponRepository
	 */
	public function getCouponRepository() {
		return $this->couponRepository;
	}

	/**
	 * @return \MPHB\Repositories\SyncUrlsRepository
	 */
	public function getSyncUrlsRepository() {
		return $this->syncUrlsRepository;
	}

	/**
	 * @return \MPHB\Repositories\AttributeRepository
	 */
	public function getAttributeRepository() {
		return $this->attributeRepository;
	}

	/**
	 *
	 * @return \MPHB\Payments\Gateways\GatewayManager
	 */
	public function gatewayManager() {
		return $this->gatewayManager;
	}

	/**
	 *
	 * @return \MPHB\Payments\PaymentManager
	 */
	public function paymentManager() {
		return $this->paymentManager;
	}

	/**
	 *
	 * @return array
	 */
	public function getPluginData() {
		require_once ABSPATH . 'wp-admin/includes/plugin.php';
		return get_plugin_data( self::$_pluginFile, false, false );
	}

	public function initAutoUpdater() {

		if ( $this->settings->license()->isEnabled() ) {

			$pluginData = $this->getPluginData();

			$apiData = array(
				'version' => $this->getVersion(),
				'license' => MPHB()->settings()->license()->getLicenseKey(),
				'item_id' => MPHB()->settings()->license()->getProductId(),
				'author'  => isset( $pluginData['Author'] ) ? $pluginData['Author'] : '',
			);

			new MPHB\Libraries\EDD_Plugin_Updater\EDD_Plugin_Updater( MPHB()->settings()->license()->getStoreUrl(), self::$_pluginFile, $apiData );
			new MPHB\LicenseNotice( MPHB_PLUGIN_FILE );
		}
	}

	/**
	 * Determines whether the current request is a WordPress Ajax request.
	 *
	 * @return bool
	 */
	public function isAjax() {
		if ( function_exists( 'wp_doing_ajax' ) ) {
			// Since WordPress 4.7.0
			return wp_doing_ajax();
		} else {
			return defined( 'DOING_AJAX' ) && DOING_AJAX;
		}
	}

	/**
	 * Check if the home URL is https.
	 *
	 * @return bool
	 */
	public function isSiteSSL() {
		return false !== strstr( get_option( 'home' ), 'https:' );
	}

	/**
	 * Table wp_termmeta required, for instance, to add "custom order" feature
	 * for room attributes.
	 *
	 * @return bool
	 *
	 * @see https://codex.wordpress.org/Current_events
	 */
	public function isWpSupportsTermmeta() {
		return ( get_option( 'db_version' ) >= 35700 ); // Since WordPress 4.4
	}

	/**
	 *
	 * @return \MPHB\Translation
	 */
	public function translation() {
		return $this->translation;
	}

	public function capabilitiesAndRoles() {
		return $this->capabilitiesAndRoles;
	}

	public function roles() {
		return $this->roles;
	}

	/**
	 *
	 * @since 4.2.0
	 */
	public function customers() {
		return new \MPHB\UsersAndRoles\Customers();
	}

	/**
	 *
	 * @since 4.2.0
	 */
	public function account() {
		return $this->account;
	}

	public static function setCustomRolesVersion( $version ) {
		update_option( 'mphb_custom_roles_version', (int) $version );
	}

	public static function getCustomRolesVersion() {
		return get_option( 'mphb_custom_roles_version' );
	}

}

register_activation_hook( MPHB_PLUGIN_FILE, array( 'HotelBookingPlugin', 'activate' ) );
register_deactivation_hook( MPHB_PLUGIN_FILE, array( 'HotelBookingPlugin', 'deactivate' ) );
HotelBookingPlugin::getInstance();

/**
 * @return \HotelBookingPlugin
 */
function MPHB() {
	return HotelBookingPlugin::getInstance();
}

function mphb_rooms_facade(): \MPHB\Core\RoomsCoreAPIFacade {
	return HotelBookingPlugin::getInstance()->getRoomsCoreAPIFacade();
}

function mphb_availability_facade(): \MPHB\Core\RoomsAvailabilityCoreAPIFacade {
	return HotelBookingPlugin::getInstance()->getRoomsAvailabilityCoreAPIFacade();
}

function mphb_prices_facade(): \MPHB\Core\PricesCoreAPIFacade {
	return HotelBookingPlugin::getInstance()->getPricesCoreAPIFacade();
}

function mphb_bookings_facade(): \MPHB\Core\BookingsCoreAPIFacade {
	return HotelBookingPlugin::getInstance()->getBookingsCoreAPIFacade();
}
Bethany
Bethany
0%

THE FINEST HOTEL NEAR LAKE KIVU

The Perfect Base For You

Required fields are followed by *





EC1A68011

About Us

Delicious Interior With The Pinch Of Everything

Bethany Investment group is Presbyterian church in Rwanda(EPR) company that manage Hotel and Guest house in Karongi (Bethany Hotel), ISANO branch in GIKONDO(Kigali), Kiyovu branch(Kigali), AMIZERO branch(Nyagatare-East) and Gisenyi Branch(Rubavu).

Accomodation

Get a Comfortable Room
Feel The Comfort

Get a comfortable room and feel our hotel’s comfort. Bethany Hotel features a variety of fully furnished rooms with extra space, Executive rooms, Deluxe rooms with a beautiful lake view and garden space, Deluxe rooms, comfort rooms, family rooms and standard rooms at your service.

Standard Single

Services

We Provide Top Class Facility
Especially For You

Beach BBQ Party

Kick back on the beach& and enjoy our berbecue from our masterchef

Breakfast

Kick back at our hotels& enjoy our breakfast from our masterchef

Conference Hall

Kick back at our hotels& enjoy our conference halls from all bethany branches

Enjoy with your partner

Honeymoon Package

80%

Get In Touch

Don’t Miss Any Update

    +

    Search your Room

    Required fields are followed by *