File "weekly_bookings.php"

Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/helpers/widgets/weekly_bookings.php
File size: 10.86 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * @package     VikBooking
 * @subpackage  com_vikbooking
 * @author      Alessio Gaggii - e4j - Extensionsforjoomla.com
 * @copyright   Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 * @link        https://vikwp.com
 */

defined('ABSPATH') or die('No script kiddies please!');

/**
 * Class handler for admin widget "weekly bookings" (donut charts).
 * 
 * @since 	1.4.0
 */
class VikBookingAdminWidgetWeeklyBookings extends VikBookingAdminWidget
{
	/**
	 * The instance counter of this widget. Since we do not load individual parameters
	 * for each widget's instance, we use a static counter to determine its settings.
	 *
	 * @var 	int
	 */
	protected static $instance_counter = -1;

	/**
	 * Class constructor will define the widget name and identifier.
	 */
	public function __construct()
	{
		// call parent constructor
		parent::__construct();

		$this->widgetName = JText::translate('VBO_W_WEEKLYB_TITLE');
		$this->widgetDescr = JText::translate('VBO_W_WEEKLYB_DESCR');
		$this->widgetId = basename(__FILE__, '.php');

		/**
		 * Define widget and icon and style name.
		 * 
		 * @since 	1.15.0 (J) - 1.5.0 (WP)
		 */
		$this->widgetIcon = '<i class="' . VikBookingIcons::i('calendar-check') . '"></i>';
		$this->widgetStyleName = 'brown';
	}

	public function render(?VBOMultitaskData $data = null)
	{
		// increase widget's instance counter
		static::$instance_counter++;

		// check whether the widget is being rendered via AJAX when adding it through the customizer
		$is_ajax = $this->isAjaxRendering();

		// widget instance identifier
		$widget_instance = $is_ajax ? -1 : static::$instance_counter;

		JFactory::getDocument()->addScript(VBO_ADMIN_URI.'resources/donutChart.js');
		$wdaysmap = array(
			'0' => JText::translate('VBSUNDAY'),
			'1' => JText::translate('VBMONDAY'),
			'2' => JText::translate('VBTUESDAY'),
			'3' => JText::translate('VBWEDNESDAY'),
			'4' => JText::translate('VBTHURSDAY'),
			'5' => JText::translate('VBFRIDAY'),
			'6' => JText::translate('VBSATURDAY')
		);
		$today_end_ts = mktime(23, 59, 59, date("n"), date("j"), date("Y"));
		$busy = VikBooking::getAdminWidgetsInstance()->loadBusyRecordsUnclosed();
		$info_rooms = array(
			'unpublished_rooms' => VikBooking::getAdminWidgetsInstance()->getRoomsData('unpublished_rooms'),
			'tot_rooms_units' => VikBooking::getAdminWidgetsInstance()->getRoomsData('tot_rooms_units'),
		);
		$no_av_rooms = false;
		if (!$info_rooms['tot_rooms_units']) {
			$no_av_rooms = true;
			$info_rooms['tot_rooms_units'] = 1;
		}

		// chart for rooms sold today and all week
		?>
	<script type="text/javascript">
	function renderDonutChart(elemid, params) {
		// default object parameters
		defparams = {
			start: 0,
			tot_booked_today: 0, // should be specified
			tot_rooms_units: 1, // should be specified
			size: 160,
			animationSpeed: 3,
			textColor: "#22485d",
			titlePosition: "outer-top", //outer-bottom, outer-top, inner-bottom, inner-top
			titleText: "",
			titleColor: '#333333',
			outer_color: '#2a762c', // should be specified
			innerCircleColor: '#ffffff',
			innerCircleStroke: '#333333'
		}
		// merge given parameters with the default ones
		Object.assign(defparams, params);
		// adjust prop unitText
		defparams.unitText = " / " + defparams.tot_rooms_units;
		// render donut chart
		var todaychart = new donutChart(elemid);
		todaychart.draw({
			start: defparams.start,
			end: defparams.tot_booked_today,
			maxValue: defparams.tot_rooms_units,
			size: defparams.size,
			unitText: defparams.unitText,
			animationSpeed: defparams.animationSpeed,
			textColor: defparams.textColor,
			titlePosition: defparams.titlePosition,
			titleText: defparams.titleText,
			titleColor: defparams.titleColor,
			outerCircleColor: defparams.outer_color,
			innerCircleColor: defparams.innerCircleColor,
			innerCircleStroke: defparams.innerCircleStroke
		});
	}
	</script>

	<div class="vbo-admin-widget-wrapper">
		<div class="vbo-admin-widget-head">
			<div class="vbo-admin-widget-head-inline">
				<h4><?php echo $this->widgetIcon; ?> <span><?php echo JText::translate('VBDASHWEEKGLOBAVAIL'); ?></span></h4>
				<div class="vbo-admin-widget-head-commands">
					<div class="vbo-reportwidget-commands">
						<div class="vbo-reportwidget-commands-main">
							<div class="vbo-reportwidget-command-chevron vbo-dash-chart-prev" style="display: none;">
								<span class="vbo-dash-chart-nav"><?php VikBookingIcons::e('chevron-left'); ?></span>
							</div>
							<div class="vbo-reportwidget-command-chevron vbo-dash-chart-next">
								<span class="vbo-dash-chart-nav"><?php VikBookingIcons::e('chevron-right'); ?></span>
							</div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<div class="vbo-dashboard-charts-wrapper">
		<?php
		$info_end = getdate($today_end_ts);
		for ($i = 0; $i < 7; $i++) {
			$today_ts = mktime($info_end['hours'], $info_end['minutes'], $info_end['seconds'], $info_end['mon'], ($info_end['mday'] + $i), $info_end['year']);
			$today_info = getdate($today_ts);
			$tot_booked_today = 0;
			if (count($busy) > 0) {
				foreach ($busy as $idroom => $rbusy) {
					if (in_array($idroom, $info_rooms['unpublished_rooms'])) {
						continue;
					}
					foreach ($rbusy as $b) {
						$tmpone = getdate($b['checkin']);
						$ritts = mktime(0, 0, 0, $tmpone['mon'], $tmpone['mday'], $tmpone['year']);
						$tmptwo = getdate($b['checkout']);
						$conts = mktime(0, 0, 0, $tmptwo['mon'], $tmptwo['mday'], $tmptwo['year']);
						if ($today_ts >= $ritts && $today_ts < $conts) {
							$tot_booked_today++;
						}
					}
				}
			}
			$percentage_booked = $no_av_rooms ? 0 : round((100 * $tot_booked_today / $info_rooms['tot_rooms_units']), 2);

			$outer_color = '#ff4d4d'; //red
			if ($percentage_booked > 33 && $percentage_booked <= 66) {
				$outer_color = '#ffa64d'; //orange
			} elseif ($percentage_booked > 66 && $percentage_booked < 100) {
				$outer_color = '#2a762c'; //green
			} elseif ($percentage_booked >= 100) {
				$outer_color = '#2482b4'; //light-blue
			}
			?>
			<div class="vbo-dashboard-chart-container" id="vbo-dashboard-chart-<?php echo $widget_instance; ?>-container-<?php echo ($i + 1); ?>">
				<span class="vbo-dashboard-chart-date"><?php echo $i == 0 ? JText::translate('VBTODAY').', ' : ''; ?><?php echo $wdaysmap[(string)$today_info['wday']]; ?> <?php echo $today_info['mday']; ?></span>
			</div>
			<script type="text/javascript">
			renderDonutChart("vbo-dashboard-chart-<?php echo $widget_instance; ?>-container-<?php echo ($i + 1); ?>", {
				tot_booked_today: <?php echo $tot_booked_today; ?>, 
				tot_rooms_units: <?php echo $info_rooms['tot_rooms_units']; ?>, 
				outer_color: '<?php echo $outer_color; ?>'
			});
			</script>
			<?php
		}
		// next week first day for navigation between donut charts
		$nextwk_ymd = date('Y-m-d', mktime(0, 0, 0, $today_info['mon'], ($today_info['mday'] + 1), $today_info['year']));
		?>
			<script type="text/javascript">
			var nextwk_ymd = '<?php echo $nextwk_ymd; ?>';
			jQuery(function() {
				jQuery('.vbo-dash-chart-nav').click(function() {
					var instance_elem = jQuery(this).closest('.vbo-admin-widget-wrapper');
					var direction = jQuery(this).parent().hasClass('vbo-dash-chart-prev') ? 'prev' : 'next';
					var jqxhr = jQuery.ajax({
						type: "POST",
						url: "<?php echo $this->getExecWidgetAjaxUri('index.php?option=com_vikbooking&task=donut_charts_data'); ?>",
						data: {
							direction: direction,
							fromdt: nextwk_ymd,
							tmpl: "component"
						}
					}).done(function(res) {
						try {
							var obj_res = typeof res === 'string' ? JSON.parse(res) : res;
							// clean up current HTML
							instance_elem.find('.vbo-dashboard-charts-wrapper').html('');
							//
							for (var i = 0; i < obj_res.data.length; i++) {
								var identifier = 'vbo-dashboard-chart-<?php echo $widget_instance; ?>-container-' + obj_res.data[i]['ymd'];
								var container = '<div class="vbo-dashboard-chart-container" id="' + identifier + '">' +
												'	<span class="vbo-dashboard-chart-date">' + obj_res.data[i]['lbl'] + '</span>' +
												'</div>';
								instance_elem.find('.vbo-dashboard-charts-wrapper').append(container);
								var donut_params = {
									tot_booked_today: obj_res.data[i]['tot_booked'], 
									tot_rooms_units: obj_res.tot_units, 
									outer_color: obj_res.data[i]['color']
								}
								renderDonutChart(identifier, donut_params);
							}
							// update date for the next request and navigation data
							nextwk_ymd = obj_res.tod;
							if (obj_res.prevweek === true) {
								instance_elem.find('.vbo-dash-chart-prev').fadeIn();
							} else {
								instance_elem.find('.vbo-dash-chart-prev').hide();
							}
							if (obj_res.nextweek === true) {
								instance_elem.find('.vbo-dash-chart-next').fadeIn();
							} else {
								instance_elem.find('.vbo-dash-chart-next').hide();
							}

						} catch(err) {
							console.error('could not parse JSON response', err, res);
						}
					}).fail(function(err) {
						alert(err);
					});
				});
			});
			</script>
		</div>
		<div class="vbo-dashboard-refresh-container" style="display: none;">
			<div class="vbo-dashboard-refresh-head"><span class="vbo-dashboard-refresh-label"><?php echo JText::translate('VBDASHNEXTREFRESH'); ?></span> <span class="vbo-dashboard-refresh-minutes">05</span>:<span class="vbo-dashboard-refresh-seconds">00</span></div>
			<span class="vbo-dashboard-refresh-stop"> </span>
			<span class="vbo-dashboard-refresh-play" style="display: none;"> </span>
		</div>
	</div>
	<script type="text/javascript">
		var vbo_dash_counter = 300;
		var vbo_t;
		var vbo_m = 5;
		var vbo_s = 0;
		var vbo_t_on = false;
		function vboRefreshTimer() {
			vbo_dash_counter--;
			if (vbo_dash_counter <= 0) {
				vbo_t_on = false;
				clearTimeout(vbo_t);
				location.reload();
				return true;
			}
			vbo_m = Math.floor(vbo_dash_counter / 60);
			vbo_s = Math.floor((vbo_dash_counter - (vbo_m * 60)));
			jQuery(".vbo-dashboard-refresh-minutes").text("0"+vbo_m);
			jQuery(".vbo-dashboard-refresh-seconds").text((parseInt(vbo_s) < 10 ? "0"+vbo_s : vbo_s));
			vbo_t = setTimeout(vboRefreshTimer, 1000);
		}
		function vboStartTimer() {
			vbo_t = setTimeout(vboRefreshTimer, 1000);
			vbo_t_on = true;
		}
		jQuery(function() {
			/**
			 * We disable the automatic reload timer. To restore it, remove the display: none
			 * attribute to the DIV.vbo-dashboard-refresh-container and decomment "vboStartTimer();".
			 * 
			 * @since 	1.14 (J) - 1.4.0 (WP)
			 */
			// vboStartTimer();
			//

			jQuery(".vbo-dashboard-refresh-stop").click(function() {
				if (vbo_t_on) {
					vbo_t_on = false;
					clearTimeout(vbo_t);
					jQuery(".vbo-dashboard-refresh-play").fadeIn();
				} else {
					jQuery(this).parent().fadeOut();
				}
			});
			jQuery(".vbo-dashboard-refresh-play").click(function() {
				if (!vbo_t_on) {
					// vboStartTimer();
					jQuery(this).fadeOut();
				}
			});
		});
	</script>
		<?php
	}
}