| @@ -1,0 +1,294 @@ | ||
| 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 VikBookingViewOrders extends JViewVikBooking | |
| 17 | +{ | |
| 18 | + public function display($tpl = null) | |
| 19 | + { | |
| 20 | + // Set the toolbar | |
| 21 | + $this->addToolBar(); | |
| 22 | + | |
| 23 | + if (!JFactory::getUser()->authorise('core.vbo.bookings', 'com_vikbooking')) { | |
| 24 | + VBOHttpDocument::getInstance()->close(403, JText::translate('JERROR_ALERTNOAUTHOR')); | |
| 25 | + } | |
| 26 | + | |
| 27 | + $rows = ""; | |
| 28 | + $navbut = ""; | |
| 29 | + $app = JFactory::getApplication(); | |
| 30 | + $dbo = JFactory::getDbo(); | |
| 31 | + if (file_exists(VCM_ADMIN_PATH.DIRECTORY_SEPARATOR.'assets'.DIRECTORY_SEPARATOR.'css'.DIRECTORY_SEPARATOR.'vcm-channels.css')) { | |
| 32 | + $document = JFactory::getDocument(); | |
| 33 | + $document->addStyleSheet(VCM_ADMIN_URI.'assets/css/vcm-channels.css'); | |
| 34 | + } | |
| 35 | + $pconfirmnumber = VikRequest::getString('confirmnumber', '', 'request'); | |
| 36 | + $pidroom = $app->getUserStateFromRequest("vbo.orders.idroom", 'idroom', 0, 'int'); | |
| 37 | + $pchannel = $app->getUserStateFromRequest("vbo.orders.channel", 'channel', '', 'string'); | |
| 38 | + $pcust_id = $app->getUserStateFromRequest("vbo.orders.cust_id", 'cust_id', 0, 'int'); | |
| 39 | + $pdatefilt = $app->getUserStateFromRequest("vbo.orders.datefilt", 'datefilt', 0, 'int'); | |
| 40 | + $pdatefiltfrom = $app->getUserStateFromRequest("vbo.orders.datefiltfrom", 'datefiltfrom', '', 'string'); | |
| 41 | + $pdatefiltto = $app->getUserStateFromRequest("vbo.orders.datefiltto", 'datefiltto', '', 'string'); | |
| 42 | + $pcategory_id = $app->getUserStateFromRequest("vbo.orders.category_id", 'category_id', 0, 'int'); | |
| 43 | + $dates_filter = ''; | |
| 44 | + if (!empty($pdatefilt) && (!empty($pdatefiltfrom) || !empty($pdatefiltto))) { | |
| 45 | + $dates_filter_field = '`o`.`ts`'; | |
| 46 | + if ($pdatefilt == 2) { | |
| 47 | + $dates_filter_field = '`o`.`checkin`'; | |
| 48 | + } elseif ($pdatefilt == 3) { | |
| 49 | + $dates_filter_field = '`o`.`checkout`'; | |
| 50 | + } | |
| 51 | + $dates_filter_clauses = array(); | |
| 52 | + if (!empty($pdatefiltfrom)) { | |
| 53 | + $dates_filter_clauses[] = $dates_filter_field.'>='.VikBooking::getDateTimestamp($pdatefiltfrom, '0', '0'); | |
| 54 | + } | |
| 55 | + if (!empty($pdatefiltto)) { | |
| 56 | + $dates_filter_clauses[] = $dates_filter_field.'<='.VikBooking::getDateTimestamp($pdatefiltto, 23, 60); | |
| 57 | + } | |
| 58 | + $dates_filter = implode(' AND ', $dates_filter_clauses); | |
| 59 | + } | |
| 60 | + $pstatus = $app->getUserStateFromRequest("vbo.orders.status", 'status', 0, 'string'); | |
| 61 | + $status_filter = !empty($pstatus) && in_array($pstatus, array('confirmed', 'standby', 'cancelled')) ? "`o`.`status`='".$pstatus."' AND `o`.`closure`=0" : ''; | |
| 62 | + if (empty($status_filter) && !empty($pstatus)) { | |
| 63 | + if ($pstatus == 'closure') { | |
| 64 | + $status_filter = "`o`.`closure`=1"; | |
| 65 | + } elseif (in_array($pstatus, array('checkedin', 'checkedout', 'noshow', 'none'))) { | |
| 66 | + switch ($pstatus) { | |
| 67 | + case 'checkedin': | |
| 68 | + $status_filter = "`o`.`checked`=1"; | |
| 69 | + break; | |
| 70 | + case 'checkedout': | |
| 71 | + $status_filter = "`o`.`checked`=2"; | |
| 72 | + break; | |
| 73 | + case 'noshow': | |
| 74 | + $status_filter = "`o`.`checked` < 0"; | |
| 75 | + break; | |
| 76 | + case 'none': | |
| 77 | + $status_filter = "`o`.`checked`=0 AND `o`.`closure`=0"; | |
| 78 | + break; | |
| 79 | + default: | |
| 80 | + break; | |
| 81 | + } | |
| 82 | + } elseif (in_array($pstatus, ['request', 'inquiry', 'overbooking'])) { | |
| 83 | + $status_filter = "`o`.`type`=" . $dbo->quote($pstatus); | |
| 84 | + } elseif ($pstatus == 'split_stay') { | |
| 85 | + $status_filter = "`o`.`split_stay`=1"; | |
| 86 | + } elseif ($pstatus == 'quote') { | |
| 87 | + $status_filter = "`o`.`idquote` IS NOT NULL"; | |
| 88 | + } | |
| 89 | + } | |
| 90 | + $pidpayment = $app->getUserStateFromRequest("vbo.orders.idpayment", 'idpayment', 0, 'int'); | |
| 91 | + $payment_filter = ''; | |
| 92 | + if (!empty($pidpayment)) { | |
| 93 | + $payment_filter = "`o`.`idpayment` LIKE '".$pidpayment."=%'"; | |
| 94 | + } | |
| 95 | + $ordersfound = false; | |
| 96 | + $lim = $app->getUserStateFromRequest("com_vikbooking.limit", 'limit', $app->get('list_limit'), 'int'); | |
| 97 | + $lim0 = $app->getUserStateFromRequest("vbo.orders.limitstart", 'limitstart', 0, 'int'); | |
| 98 | + $session = JFactory::getSession(); | |
| 99 | + $pvborderby = VikRequest::getString('vborderby', '', 'request'); | |
| 100 | + $pvbordersort = VikRequest::getString('vbordersort', '', 'request'); | |
| 101 | + $validorderby = array('id', 'ts', 'days', 'checkin', 'checkout', 'total'); | |
| 102 | + $orderby = $session->get('vbViewOrdersOrderby', 'ts'); | |
| 103 | + $ordersort = $session->get('vbViewOrdersOrdersort', 'DESC'); | |
| 104 | + if (!empty($pvborderby) && in_array($pvborderby, $validorderby)) { | |
| 105 | + $orderby = $pvborderby; | |
| 106 | + $session->set('vbViewOrdersOrderby', $orderby); | |
| 107 | + if (!empty($pvbordersort) && in_array($pvbordersort, array('ASC', 'DESC'))) { | |
| 108 | + $ordersort = $pvbordersort; | |
| 109 | + $session->set('vbViewOrdersOrdersort', $ordersort); | |
| 110 | + } | |
| 111 | + } | |
| 112 | + | |
| 113 | + $q = "SELECT `id`,`name` FROM `#__vikbooking_rooms` ORDER BY `name` ASC;"; | |
| 114 | + $dbo->setQuery($q); | |
| 115 | + $allrooms = $dbo->loadAssocList(); | |
| 116 | + | |
| 117 | + if (!empty($pconfirmnumber)) { | |
| 118 | + /** | |
| 119 | + * We allow looking for a specific ID, OTAID, Coupon code etc.. by using syntaxes like "id: 500" | |
| 120 | + */ | |
| 121 | + $q = $dbo->getQuery(true)->select('SQL_CALC_FOUND_ROWS `o`.*'); | |
| 122 | + $q->from($dbo->qn('#__vikbooking_orders', 'o')); | |
| 123 | + $q->where(1); | |
| 124 | + | |
| 125 | + if (stripos($pconfirmnumber, 'id:') === 0) { | |
| 126 | + // search by ID or OTA ID | |
| 127 | + $seek_parts = explode('id:', $pconfirmnumber); | |
| 128 | + $seek_value = trim($seek_parts[1]); | |
| 129 | + $q->andWhere([ | |
| 130 | + $dbo->qn('o.id') . ' = ' . $dbo->q($seek_value), | |
| 131 | + $dbo->qn('o.idorderota') . ' = ' . $dbo->q($seek_value), | |
| 132 | + ], $glue = 'OR'); | |
| 133 | + } elseif (stripos($pconfirmnumber, 'otaid:') === 0) { | |
| 134 | + // search by OTA Booking ID | |
| 135 | + $seek_parts = explode('otaid:', $pconfirmnumber); | |
| 136 | + $seek_value = trim($seek_parts[1]); | |
| 137 | + $q->where($dbo->qn('o.idorderota') . ' = ' . $dbo->q($seek_value)); | |
| 138 | + } elseif (stripos($pconfirmnumber, 'coupon:') === 0) { | |
| 139 | + // search by coupon code | |
| 140 | + $seek_parts = explode('coupon:', $pconfirmnumber); | |
| 141 | + $seek_value = trim($seek_parts[1]); | |
| 142 | + $q->where($dbo->qn('o.coupon') . ' LIKE ' . $dbo->q("%{$seek_value}%")); | |
| 143 | + } elseif (stripos($pconfirmnumber, 'name:') === 0) { | |
| 144 | + // search by customer nominative | |
| 145 | + $seek_parts = explode('name:', $pconfirmnumber); | |
| 146 | + $seek_value = trim($seek_parts[1]); | |
| 147 | + $q->leftJoin($dbo->qn('#__vikbooking_customers_orders', 'co') . ' ON ' . $dbo->qn('co.idorder') . ' = ' . $dbo->qn('o.id')); | |
| 148 | + $q->leftJoin($dbo->qn('#__vikbooking_customers', 'c') . ' ON ' . $dbo->qn('c.id') . ' = ' . $dbo->qn('co.idcustomer')); | |
| 149 | + $q->where('CONCAT_WS(\' \', ' . $dbo->qn('c.first_name') . ', ' . $dbo->qn('c.last_name') . ') LIKE ' . $dbo->q("%{$seek_value}%")); | |
| 150 | + } else { | |
| 151 | + // seek for various values | |
| 152 | + $q->andWhere([ | |
| 153 | + $dbo->qn('o.id') . ' = ' . $dbo->q($pconfirmnumber), | |
| 154 | + $dbo->qn('o.confirmnumber') . ' LIKE ' . $dbo->q("%{$pconfirmnumber}%"), | |
| 155 | + $dbo->qn('o.idorderota') . ' = ' . $dbo->q($pconfirmnumber), | |
| 156 | + ], $glue = 'OR'); | |
| 157 | + } | |
| 158 | + | |
| 159 | + $q->order($dbo->qn("o.{$orderby}") . ' ' . $ordersort); | |
| 160 | + | |
| 161 | + $dbo->setQuery($q, $lim0, $lim); | |
| 162 | + $rows = $dbo->loadAssocList(); | |
| 163 | + | |
| 164 | + if ($rows) { | |
| 165 | + $dbo->setQuery('SELECT FOUND_ROWS();'); | |
| 166 | + $totres = $dbo->loadResult(); | |
| 167 | + if ($totres == 1 && count($rows) == 1) { | |
| 168 | + $app->redirect("index.php?option=com_vikbooking&task=editorder&cid[]=".$rows[0]['id']); | |
| 169 | + $app->close(); | |
| 170 | + } | |
| 171 | + | |
| 172 | + $ordersfound = true; | |
| 173 | + jimport('joomla.html.pagination'); | |
| 174 | + $pageNav = new JPagination( $totres, $lim0, $lim ); | |
| 175 | + $navbut = "<table align=\"center\"><tr><td>".$pageNav->getListFooter()."</td></tr></table>"; | |
| 176 | + } | |
| 177 | + } | |
| 178 | + | |
| 179 | + if (!$ordersfound) { | |
| 180 | + if (!empty($pcust_id)) { | |
| 181 | + $q = "SELECT SQL_CALC_FOUND_ROWS `o`.*,`co`.`idcustomer`,CONCAT_WS(' ', `c`.`first_name`, `c`.`last_name`) AS `customer_fullname` FROM `#__vikbooking_orders` AS `o` LEFT JOIN `#__vikbooking_customers_orders` `co` ON `co`.`idorder`=`o`.`id` LEFT JOIN `#__vikbooking_customers` `c` ON `c`.`id`=`co`.`idcustomer` AND `c`.`id`=".$pcust_id." WHERE ".(!empty($dates_filter) ? $dates_filter.' AND ' : '').(!empty($payment_filter) ? $payment_filter.' AND ' : '').(!empty($status_filter) ? $status_filter.' AND ' : '')."`co`.`idcustomer`=".$pcust_id." ORDER BY `o`.`".$orderby."` ".$ordersort; | |
| 182 | + } elseif (!empty($pidroom) || !empty($pcategory_id)) { | |
| 183 | + // ONLY_FULL_GROUP_BY safe | |
| 184 | + $clauses = array(); | |
| 185 | + if (!empty($dates_filter)) { | |
| 186 | + array_push($clauses, $dates_filter); | |
| 187 | + } | |
| 188 | + if (!empty($payment_filter)) { | |
| 189 | + array_push($clauses, $payment_filter); | |
| 190 | + } | |
| 191 | + if (!empty($status_filter)) { | |
| 192 | + array_push($clauses, $status_filter); | |
| 193 | + } | |
| 194 | + if (!empty($pidroom)) { | |
| 195 | + array_push($clauses, '`or`.`idroom`=' . $pidroom); | |
| 196 | + } | |
| 197 | + if (!empty($pcategory_id)) { | |
| 198 | + array_push($clauses, "(`r`.`idcat`='" . $pcategory_id . ";' OR `r`.`idcat` LIKE '" . $pcategory_id . ";%' OR `r`.`idcat` LIKE '%;" . $pcategory_id . ";%' OR `r`.`idcat` LIKE '%;" . $pcategory_id . ";')"); | |
| 199 | + } | |
| 200 | + if (strlen($pchannel)) { | |
| 201 | + array_push($clauses, '`o`.`channel` ' . ($pchannel == '-1' ? 'IS NULL' : "LIKE " . $dbo->quote("%" . $pchannel . "%"))); | |
| 202 | + } | |
| 203 | + $q = "SELECT SQL_CALC_FOUND_ROWS DISTINCT `o`.*,`or`.`idorder`,`r`.`idcat` FROM `#__vikbooking_orders` AS `o` LEFT JOIN `#__vikbooking_ordersrooms` AS `or` ON `o`.`id`=`or`.`idorder` LEFT JOIN `#__vikbooking_rooms` AS `r` ON `or`.`idroom`=`r`.`id` WHERE " . implode(' AND ', $clauses) . " ORDER BY `o`.`".$orderby."` ".$ordersort; | |
| 204 | + } else { | |
| 205 | + $clauses = array(); | |
| 206 | + if (!empty($dates_filter)) { | |
| 207 | + $clauses[] = $dates_filter; | |
| 208 | + } | |
| 209 | + if (!empty($payment_filter)) { | |
| 210 | + $clauses[] = $payment_filter; | |
| 211 | + } | |
| 212 | + if (!empty($status_filter)) { | |
| 213 | + $clauses[] = $status_filter; | |
| 214 | + } | |
| 215 | + if (strlen($pchannel)) { | |
| 216 | + $clauses[] = "`o`.`channel` ".($pchannel == '-1' ? 'IS NULL' : "LIKE ".$dbo->quote("%".$pchannel."%")); | |
| 217 | + } | |
| 218 | + $q = "SELECT SQL_CALC_FOUND_ROWS `o`.* FROM `#__vikbooking_orders` AS `o`".(count($clauses) > 0 ? " WHERE ".implode(' AND ', $clauses) : "")." ORDER BY `o`.`".$orderby."` ".$ordersort.($orderby == 'ts' && $ordersort == 'DESC' ? ', `o`.`id` DESC' : ''); | |
| 219 | + } | |
| 220 | + $dbo->setQuery($q, $lim0, $lim); | |
| 221 | + $dbo->execute(); | |
| 222 | + | |
| 223 | + /** | |
| 224 | + * Call assertListQuery() from the View class to make sure the filters set | |
| 225 | + * do not produce an empty result. This would reset the page in this case. | |
| 226 | + * | |
| 227 | + * @since 1.12.0 (J) - 1.2.0 (WP) | |
| 228 | + */ | |
| 229 | + $this->assertListQuery($lim0, $lim); | |
| 230 | + // | |
| 231 | + | |
| 232 | + if ($dbo->getNumRows()) { | |
| 233 | + $rows = $dbo->loadAssocList(); | |
| 234 | + $dbo->setQuery('SELECT FOUND_ROWS();'); | |
| 235 | + jimport('joomla.html.pagination'); | |
| 236 | + $pageNav = new JPagination( $dbo->loadResult(), $lim0, $lim ); | |
| 237 | + $navbut = "<table align=\"center\"><tr><td>".$pageNav->getListFooter()."</td></tr></table>"; | |
| 238 | + } | |
| 239 | + } | |
| 240 | + | |
| 241 | + /** | |
| 242 | + * Filter by category | |
| 243 | + * | |
| 244 | + * @since 1.13 | |
| 245 | + */ | |
| 246 | + $categories = array(); | |
| 247 | + $q = "SELECT `id`,`name` FROM `#__vikbooking_categories` ORDER BY `name` ASC;"; | |
| 248 | + $dbo->setQuery($q); | |
| 249 | + $dbo->execute(); | |
| 250 | + if ($dbo->getNumRows() > 0) { | |
| 251 | + $allcats = $dbo->loadAssocList(); | |
| 252 | + foreach ($allcats as $cat) { | |
| 253 | + $categories[$cat['id']] = $cat['name']; | |
| 254 | + } | |
| 255 | + } | |
| 256 | + // | |
| 257 | + | |
| 258 | + $this->rows = $rows; | |
| 259 | + $this->allrooms = $allrooms; | |
| 260 | + $this->lim0 = $lim0; | |
| 261 | + $this->navbut = $navbut; | |
| 262 | + $this->orderby = $orderby; | |
| 263 | + $this->ordersort = $ordersort; | |
| 264 | + $this->categories = $categories; | |
| 265 | + | |
| 266 | + // Display the template | |
| 267 | + parent::display($tpl); | |
| 268 | + } | |
| 269 | + | |
| 270 | + /** | |
| 271 | + * Sets the toolbar | |
| 272 | + */ | |
| 273 | + protected function addToolBar() { | |
| 274 | + JToolBarHelper::title(JText::translate('VBMAINORDERTITLE'), 'vikbooking'); | |
| 275 | + if (JFactory::getUser()->authorise('core.create', 'com_vikbooking')) { | |
| 276 | + JToolBarHelper::addNew('calendar', JText::translate('VBO_NEW_BOOKING')); | |
| 277 | + JToolBarHelper::spacer(); | |
| 278 | + } | |
| 279 | + if (JFactory::getUser()->authorise('core.edit', 'com_vikbooking')) { | |
| 280 | + JToolBarHelper::editList('editorder', JText::translate('VBMAINORDEREDIT')); | |
| 281 | + JToolBarHelper::spacer(); | |
| 282 | + } | |
| 283 | + if (JFactory::getUser()->authorise('core.vbo.management', 'com_vikbooking')) { | |
| 284 | + JToolBarHelper::custom( 'orders', 'file-2', 'file-2', JText::translate('VBOGENINVOICES'), true); | |
| 285 | + JToolBarHelper::spacer(); | |
| 286 | + } | |
| 287 | + if (JFactory::getUser()->authorise('core.delete', 'com_vikbooking')) { | |
| 288 | + JToolBarHelper::deleteList(JText::translate('VBDELCONFIRM'), 'removeorders', JText::translate('VBMAINORDERDEL')); | |
| 289 | + JToolBarHelper::spacer(); | |
| 290 | + JToolBarHelper::spacer(); | |
| 291 | + } | |
| 292 | + } | |
| 293 | + | |
| 294 | +} | |