| 1 |
<?php |
| 2 |
/** |
| 3 |
* @package VikBooking |
| 4 |
* @subpackage com_vikbooking |
| 5 |
* @author Alessio Gaggii - e4j - Extensionsforjoomla.com |
| 6 |
* @copyright Copyright (C) 2018 e4j - Extensionsforjoomla.com. All rights reserved. |
| 7 |
* @license GNU General Public License version 2 or later; see LICENSE |
| 8 |
* @link https://vikwp.com |
| 9 |
*/ |
| 10 |
|
| 11 |
defined('ABSPATH') or die('No script kiddies please!'); |
| 12 |
|
| 13 |
// import Joomla view library |
| 14 |
jimport('joomla.application.component.view'); |
| 15 |
|
| 16 |
class VikBookingViewTableaux extends JViewVikBooking |
| 17 |
{ |
| 18 |
public function display($tpl = null) |
| 19 |
{ |
| 20 |
// Set the toolbar |
| 21 |
$this->addToolBar(); |
| 22 |
|
| 23 |
$dbo = JFactory::getDbo(); |
| 24 |
$session = JFactory::getSession(); |
| 25 |
$cookie = JFactory::getApplication()->input->cookie; |
| 26 |
$roomids = VikRequest::getVar('roomids', array(), 'request', 'int'); |
| 27 |
$month = VikRequest::getInt('month', 0, 'request'); |
| 28 |
$fromdate = VikRequest::getString('tbxfromdate', '', 'request'); |
| 29 |
$todate = VikRequest::getString('tbxtodate', '', 'request'); |
| 30 |
$sessfromts = $session->get('vbTbxFrom', ''); |
| 31 |
$sesstots = $session->get('vbTbxTo', ''); |
| 32 |
// view mode (classic or tag, taken from overv View) |
| 33 |
$cbmode = $cookie->get('vbTagsMode', $session->get('vbTagsMode', ''), 'string'); |
| 34 |
$pbmode = !empty($cbmode) && ($cbmode == 'classic' || $cbmode == 'tags') ? $cbmode : 'classic'; |
| 35 |
VikRequest::setCookie('vbTagsMode', $pbmode, (time() + (86400 * 365)), '/'); |
| 36 |
$session->set('vbTagsMode', $pbmode); |
| 37 |
// prepare dates |
| 38 |
$now = empty($month) ? time() : $month; |
| 39 |
$tsinfo = getdate($now); |
| 40 |
$fromts = mktime(0, 0, 0, $tsinfo['mon'], 1, $tsinfo['year']); |
| 41 |
$tots = mktime(23, 59, 59, $tsinfo['mon'], date('t', $now), $tsinfo['year']); |
| 42 |
if (!empty($fromdate) && !empty($todate)) { |
| 43 |
$fromts = VikBooking::getDateTimestamp($fromdate, 0, 0); |
| 44 |
$tots = VikBooking::getDateTimestamp($todate, 23, 59, 59); |
| 45 |
} elseif (!empty($sessfromts) && !empty($sesstots)) { |
| 46 |
$fromts = $sessfromts; |
| 47 |
$tots = $sesstots; |
| 48 |
} |
| 49 |
if (empty($fromts) || empty($tots) || $tots <= $fromts) { |
| 50 |
$fromts = mktime(0, 0, 0, $tsinfo['mon'], 1, $tsinfo['year']); |
| 51 |
$tots = mktime(23, 59, 59, $tsinfo['mon'], date('t', $now), $tsinfo['year']); |
| 52 |
} |
| 53 |
$session->set('vbTbxFrom', $fromts); |
| 54 |
$session->set('vbTbxTo', $tots); |
| 55 |
|
| 56 |
// make sure the list of rooms does not contain empty values for "all" |
| 57 |
if (count($roomids) && empty($roomids[0])) { |
| 58 |
$roomids = array(); |
| 59 |
} |
| 60 |
|
| 61 |
// check the category filter by pushing the proper room ids |
| 62 |
$reqcats = array(); |
| 63 |
$cat_ids_filter = array(); |
| 64 |
foreach ($roomids as $k => $rid) { |
| 65 |
if (empty($rid)) { |
| 66 |
continue; |
| 67 |
} |
| 68 |
$rid = (int)$rid; |
| 69 |
if ($rid < 0) { |
| 70 |
// it's a category ID when we get negative values |
| 71 |
array_push($reqcats, ($rid + (abs($rid) * 2))); |
| 72 |
// unset this value as we do not need it there for the query |
| 73 |
unset($roomids[$k]); |
| 74 |
} |
| 75 |
} |
| 76 |
// reset keys in case some were unset |
| 77 |
$roomids = array_values($roomids); |
| 78 |
if (count($reqcats)) { |
| 79 |
// gather all room IDs from the given category IDs |
| 80 |
$clauses = array(); |
| 81 |
foreach ($reqcats as $cat_id) { |
| 82 |
array_push($clauses, "(`idcat`='" . $cat_id . ";' OR `idcat` LIKE '" . $cat_id . ";%' OR `idcat` LIKE '%;" . $cat_id . ";%' OR `idcat` LIKE '%;" . $cat_id . ";')"); |
| 83 |
} |
| 84 |
$q = "SELECT `id`,`name`,`units`,`params` FROM `#__vikbooking_rooms` WHERE " . implode(' OR ', $clauses) . " ORDER BY `name` ASC;"; |
| 85 |
$dbo->setQuery($q); |
| 86 |
$catrooms = $dbo->loadAssocList(); |
| 87 |
if ($catrooms) { |
| 88 |
// push rooms gathered from category ID filter, if not already in filter |
| 89 |
foreach ($catrooms as $catroom) { |
| 90 |
if (in_array((string)$catroom['id'], $roomids) || in_array((int)$catroom['id'], $roomids)) { |
| 91 |
continue; |
| 92 |
} |
| 93 |
array_push($roomids, $catroom['id']); |
| 94 |
} |
| 95 |
} |
| 96 |
} |
| 97 |
// |
| 98 |
|
| 99 |
// get min and max dates |
| 100 |
$mindate = 0; |
| 101 |
$maxdate = 0; |
| 102 |
$q = "SELECT `checkin` FROM `#__vikbooking_orders` WHERE `status`='confirmed' ORDER BY `checkin` ASC LIMIT 1;"; |
| 103 |
$dbo->setQuery($q); |
| 104 |
$mindate = $dbo->loadResult(); |
| 105 |
if (!$mindate) { |
| 106 |
$mindate = 0; |
| 107 |
} |
| 108 |
$q = "SELECT `checkout` FROM `#__vikbooking_orders` WHERE `status`='confirmed' ORDER BY `checkout` DESC LIMIT 1;"; |
| 109 |
$dbo->setQuery($q); |
| 110 |
$maxdate = $dbo->loadResult(); |
| 111 |
if (!$maxdate) { |
| 112 |
$maxdate = 0; |
| 113 |
} |
| 114 |
|
| 115 |
// build months array |
| 116 |
$months = array(); |
| 117 |
$months_labels = array( |
| 118 |
JText::translate('VBMONTHONE'), |
| 119 |
JText::translate('VBMONTHTWO'), |
| 120 |
JText::translate('VBMONTHTHREE'), |
| 121 |
JText::translate('VBMONTHFOUR'), |
| 122 |
JText::translate('VBMONTHFIVE'), |
| 123 |
JText::translate('VBMONTHSIX'), |
| 124 |
JText::translate('VBMONTHSEVEN'), |
| 125 |
JText::translate('VBMONTHEIGHT'), |
| 126 |
JText::translate('VBMONTHNINE'), |
| 127 |
JText::translate('VBMONTHTEN'), |
| 128 |
JText::translate('VBMONTHELEVEN'), |
| 129 |
JText::translate('VBMONTHTWELVE') |
| 130 |
); |
| 131 |
if ($mindate > 0 && $maxdate > 0) { |
| 132 |
// prev months (max 5, if any) |
| 133 |
$minback = mktime(0, 0, 0, date('n', $mindate), 1, date('Y', $mindate)); |
| 134 |
$startinfo = getdate(mktime(23, 59, 59, ($tsinfo['mon'] - 1), $tsinfo['mday'], $tsinfo['year'])); |
| 135 |
$maxmonths = 5; |
| 136 |
$monthscount = 0; |
| 137 |
while ($startinfo[0] >= $minback && $monthscount < 5) { |
| 138 |
// push prev month |
| 139 |
array_push($months, array( |
| 140 |
'name' => $months_labels[($startinfo['mon'] - 1)] . ' ' . $startinfo['year'], |
| 141 |
'from' => mktime(0, 0, 0, $startinfo['mon'], 1, $startinfo['year']), |
| 142 |
'to' => mktime(0, 0, 0, $startinfo['mon'], date('t', $startinfo[0]), $startinfo['year']), |
| 143 |
)); |
| 144 |
|
| 145 |
// next prev month |
| 146 |
$startinfo = getdate(mktime(23, 59, 59, ($startinfo['mon'] - 1), $startinfo['mday'], $startinfo['year'])); |
| 147 |
$monthscount++; |
| 148 |
} |
| 149 |
// revert the array until now for the past months |
| 150 |
$months = array_reverse($months); |
| 151 |
// push current month |
| 152 |
array_push($months, array( |
| 153 |
'name' => $months_labels[($tsinfo['mon'] - 1)] . ' ' . $tsinfo['year'], |
| 154 |
'from' => mktime(0, 0, 0, $tsinfo['mon'], 1, $tsinfo['year']), |
| 155 |
'to' => mktime(0, 0, 0, $tsinfo['mon'], date('t', $tsinfo[0]), $tsinfo['year']), |
| 156 |
)); |
| 157 |
// future months (max 5, if any) |
| 158 |
$maxnext = mktime(23, 59, 59, date('n', $maxdate), date('t', $maxdate), date('Y', $maxdate)); |
| 159 |
$startinfo = getdate(mktime(0, 0, 0, ($tsinfo['mon'] + 1), $tsinfo['mday'], $tsinfo['year'])); |
| 160 |
$maxmonths = 5; |
| 161 |
$monthscount = 0; |
| 162 |
while ($startinfo[0] <= $maxnext && $monthscount < 5) { |
| 163 |
// push next month |
| 164 |
array_push($months, array( |
| 165 |
'name' => $months_labels[($startinfo['mon'] - 1)] . ' ' . $startinfo['year'], |
| 166 |
'from' => mktime(0, 0, 0, $startinfo['mon'], 1, $startinfo['year']), |
| 167 |
'to' => mktime(0, 0, 0, $startinfo['mon'], date('t', $startinfo[0]), $startinfo['year']), |
| 168 |
)); |
| 169 |
|
| 170 |
// next future month |
| 171 |
$startinfo = getdate(mktime(0, 0, 0, ($startinfo['mon'] + 1), $startinfo['mday'], $startinfo['year'])); |
| 172 |
$monthscount++; |
| 173 |
} |
| 174 |
} |
| 175 |
|
| 176 |
// get all rooms from filters |
| 177 |
$rooms = array(); |
| 178 |
$q = "SELECT `id`,`name`,`units`,`params` FROM `#__vikbooking_rooms`".($roomids ? " WHERE `id` IN (".implode(', ', $roomids).")" : "")." ORDER BY `name` ASC;"; |
| 179 |
$dbo->setQuery($q); |
| 180 |
$all = $dbo->loadAssocList(); |
| 181 |
foreach ($all as $r) { |
| 182 |
$rooms[$r['id']] = $r; |
| 183 |
} |
| 184 |
if (!$rooms) { |
| 185 |
JFactory::getApplication()->redirect('index.php?option=com_vikbooking'); |
| 186 |
exit; |
| 187 |
} |
| 188 |
|
| 189 |
// get all occupied dates for these rooms |
| 190 |
$rooms_busy = array(); |
| 191 |
$q = "SELECT `b`.*,`ob`.`idorder`,`o`.`custdata`,`o`.`status`,`o`.`totpaid`,`o`.`roomsnum`,`o`.`total`,`o`.`idorderota`,`o`.`channel`,`o`.`country`,`o`.`colortag`,`oc`.`idcustomer`,`c`.`first_name`,`c`.`last_name`,`c`.`pic`, |
| 192 |
(SELECT GROUP_CONCAT(`or`.`roomindex` SEPARATOR ';') FROM `#__vikbooking_ordersrooms` AS `or` WHERE `or`.`idorder`=`ob`.`idorder`) AS `indexes`, |
| 193 |
(SELECT GROUP_CONCAT(`or`.`idroom` SEPARATOR ';') FROM `#__vikbooking_ordersrooms` AS `or` WHERE `or`.`idorder`=`ob`.`idorder`) AS `roomids` |
| 194 |
FROM `#__vikbooking_busy` AS `b` |
| 195 |
LEFT JOIN `#__vikbooking_ordersbusy` AS `ob` ON `b`.`id`=`ob`.`idbusy` |
| 196 |
LEFT JOIN `#__vikbooking_orders` AS `o` ON `ob`.`idorder`=`o`.`id` |
| 197 |
LEFT JOIN `#__vikbooking_customers_orders` AS `oc` ON `ob`.`idorder`=`oc`.`idorder` |
| 198 |
LEFT JOIN `#__vikbooking_customers` AS `c` ON `oc`.`idcustomer`=`c`.`id` |
| 199 |
WHERE `b`.`idroom` IN (".implode(', ', array_keys($rooms)).") AND (`b`.`checkin`>=".$fromts." OR `b`.`checkout`>=".$fromts.") AND (`b`.`checkin`<=".$tots." OR `b`.`checkout`<=".$fromts.") AND `o`.`status`='confirmed' AND `o`.`closure`=0 |
| 200 |
ORDER BY `b`.`checkin` ASC, `ob`.`idorder` ASC;"; |
| 201 |
$dbo->setQuery($q); |
| 202 |
$busy = $dbo->loadAssocList(); |
| 203 |
if ($busy) { |
| 204 |
foreach ($busy as $b) { |
| 205 |
if (!isset($rooms_busy[$b['idroom']])) { |
| 206 |
$rooms_busy[$b['idroom']] = array(); |
| 207 |
} |
| 208 |
array_push($rooms_busy[$b['idroom']], $b); |
| 209 |
} |
| 210 |
} |
| 211 |
|
| 212 |
/** |
| 213 |
* Check the next festivities periodically |
| 214 |
* |
| 215 |
* @since 1.13.5 |
| 216 |
*/ |
| 217 |
$fests = VikBooking::getFestivitiesInstance(); |
| 218 |
if ($fests->shouldCheckFestivities()) { |
| 219 |
$fests->storeNextFestivities(); |
| 220 |
} |
| 221 |
$festivities = $fests->loadFestDates(date('Y-m-d', $fromts), date('Y-m-d', $tots)); |
| 222 |
|
| 223 |
/** |
| 224 |
* Load room day notes from first month |
| 225 |
* |
| 226 |
* @since 1.13.5 |
| 227 |
*/ |
| 228 |
$rdaynotes = VikBooking::getCriticalDatesInstance()->loadRoomDayNotes(date('Y-m-d', $fromts), date('Y-m-d', $tots)); |
| 229 |
|
| 230 |
$this->roomids = $roomids; |
| 231 |
$this->rooms = $rooms; |
| 232 |
$this->reqcats = $reqcats; |
| 233 |
$this->mindate = $mindate; |
| 234 |
$this->maxdate = $maxdate; |
| 235 |
$this->rooms_busy = $rooms_busy; |
| 236 |
$this->months = $months; |
| 237 |
$this->fromts = $fromts; |
| 238 |
$this->tots = $tots; |
| 239 |
$this->pbmode = $pbmode; |
| 240 |
$this->festivities = $festivities; |
| 241 |
$this->rdaynotes = $rdaynotes; |
| 242 |
|
| 243 |
// Display the template |
| 244 |
parent::display($tpl); |
| 245 |
} |
| 246 |
|
| 247 |
/** |
| 248 |
* Sets the toolbar |
| 249 |
*/ |
| 250 |
protected function addToolBar() |
| 251 |
{ |
| 252 |
JToolBarHelper::title(JText::translate('VBMAINTABLEAUXTITLE'), 'vikbooking'); |
| 253 |
JToolBarHelper::cancel( 'canceldash', JText::translate('VBBACK')); |
| 254 |
JToolBarHelper::spacer(); |
| 255 |
} |
| 256 |
} |
| 257 |
|