| @@ -64,8 +64,12 @@ | ||
| 64 | 64 | JText::script('VBO_COMPARE_WITH_PREV_M'); |
| 65 | 65 | JText::script('VBO_COMPARE_WITH_PREV_W'); |
| 66 | 66 | JText::script('VBO_COMPARE_WITH_PREV_D'); |
| 67 | 67 | JText::script('VBNOTRACKINGS'); |
| 68 | + JText::script('VBO_ERR_LOAD_RESULTS'); | |
| 69 | + JText::script('VBNOROOMSFOUND'); | |
| 70 | + JText::script('VBO_SEARCHING'); | |
| 71 | + JText::script('VBROOMFILTER'); | |
| 68 | 72 | } |
| 69 | 73 | |
| 70 | 74 | /** |
| 71 | 75 | * Custom method for this widget only to load the financial statistics. |
| @@ -77,14 +81,18 @@ | ||
| 77 | 81 | * It's the actual rendering of the widget which also allows navigation. |
| 78 | 82 | */ |
| 79 | 83 | public function loadFinancialStats() |
| 80 | 84 | { |
| 81 | - $wrapper = VikRequest::getString('wrapper', '', 'request'); | |
| 85 | + $app = JFactory::getApplication(); | |
| 82 | 86 | |
| 83 | - $fromdate = VikRequest::getString('fromdate', '', 'request'); | |
| 84 | - $todate = VikRequest::getString('todate', '', 'request'); | |
| 85 | - $step = VikRequest::getString('step', 'quarter', 'request'); | |
| 86 | - $date_dir = VikRequest::getInt('date_dir', 0, 'request'); | |
| 87 | + $wrapper = $app->input->getString('wrapper', ''); | |
| 88 | + | |
| 89 | + $fromdate = $app->input->getString('fromdate', ''); | |
| 90 | + $todate = $app->input->getString('todate', ''); | |
| 91 | + $step = $app->input->getString('step', 'quarter'); | |
| 92 | + $date_dir = $app->input->getInt('date_dir', 0); | |
| 93 | + $room_ids = array_filter((array) $app->input->getInt('room_ids', [])); | |
| 94 | + | |
| 87 | 95 | if (empty($fromdate)) { |
| 88 | 96 | // default to current quarter (3 full months) |
| 89 | 97 | $now_info = getdate(); |
| 90 | 98 | $end_info = getdate(mktime(0, 0, 0, ($now_info['mon'] + 2), 1, $now_info['year'])); |
| @@ -118,9 +126,9 @@ | ||
| 118 | 126 | $currencysymb = VikBooking::getCurrencySymb(); |
| 119 | 127 | |
| 120 | 128 | // get the financial stats for the requested dates |
| 121 | 129 | try { |
| 122 | - $stats = $finance->getStats($fromdate, $todate, [], $calc_type); | |
| 130 | + $stats = $finance->getStats($fromdate, $todate, $room_ids, $calc_type); | |
| 123 | 131 | } catch (Exception $e) { |
| 124 | 132 | // make the AJAX request fail nicely |
| 125 | 133 | VBOHttpDocument::getInstance()->close($e->getCode(), $e->getMessage()); |
| 126 | 134 | } |
| @@ -137,8 +145,21 @@ | ||
| 137 | 145 | |
| 138 | 146 | // start output buffering |
| 139 | 147 | ob_start(); |
| 140 | 148 | |
| 149 | + if ($room_ids) { | |
| 150 | + // get the details of the rooms filtered | |
| 151 | + $rooms_filtered = VikBooking::getAvailabilityInstance()->loadRooms($room_ids); | |
| 152 | + | |
| 153 | + if ($rooms_filtered) { | |
| 154 | + ?> | |
| 155 | + <div class="vbo-widget-finance-rooms-filtered-cont"> | |
| 156 | + <?php echo implode(', ', array_column($rooms_filtered, 'name')); ?> | |
| 157 | + </div> | |
| 158 | + <?php | |
| 159 | + } | |
| 160 | + } | |
| 161 | + | |
| 141 | 162 | ?> |
| 142 | 163 | <div class="vbo-widget-finance-data-blocks"> |
| 143 | 164 | |
| 144 | 165 | <div class="vbo-widget-finance-data-block" data-typestat="gross_revenue"> |
| @@ -147,11 +168,10 @@ | ||
| 147 | 168 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_GROSS_BOOKING_VALUE'); ?></span> |
| 148 | 169 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 149 | 170 | </div> |
| 150 | 171 | <div class="vbo-widget-finance-stat-amount"> |
| 151 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['gross_revenue']); ?>"> | |
| 152 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 153 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['gross_revenue']); ?></span> | |
| 172 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['gross_revenue']), $currencysymb); ?>"> | |
| 173 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['gross_revenue']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 154 | 174 | </span> |
| 155 | 175 | </div> |
| 156 | 176 | </div> |
| 157 | 177 | </div> |
| @@ -162,11 +182,10 @@ | ||
| 162 | 182 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBOINVCOLTAX'); ?></span> |
| 163 | 183 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 164 | 184 | </div> |
| 165 | 185 | <div class="vbo-widget-finance-stat-amount"> |
| 166 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['taxes']); ?>"> | |
| 167 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 168 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['taxes']); ?></span> | |
| 186 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['taxes']), $currencysymb); ?>"> | |
| 187 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['taxes']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 169 | 188 | </span> |
| 170 | 189 | </div> |
| 171 | 190 | </div> |
| 172 | 191 | </div> |
| @@ -177,11 +196,10 @@ | ||
| 177 | 196 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBTOTALCOMMISSIONS'); ?></span> |
| 178 | 197 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 179 | 198 | </div> |
| 180 | 199 | <div class="vbo-widget-finance-stat-amount"> |
| 181 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['cmms']); ?>"> | |
| 182 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 183 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['cmms']); ?></span> | |
| 200 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['cmms']), $currencysymb); ?>"> | |
| 201 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['cmms']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 184 | 202 | </span> |
| 185 | 203 | </div> |
| 186 | 204 | </div> |
| 187 | 205 | </div> |
| @@ -192,11 +210,10 @@ | ||
| 192 | 210 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUE'); ?></span> |
| 193 | 211 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 194 | 212 | </div> |
| 195 | 213 | <div class="vbo-widget-finance-stat-amount"> |
| 196 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['revenue']); ?>"> | |
| 197 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 198 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['revenue']); ?></span> | |
| 214 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['revenue']), $currencysymb); ?>"> | |
| 215 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['revenue']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 199 | 216 | </span> |
| 200 | 217 | </div> |
| 201 | 218 | </div> |
| 202 | 219 | </div> |
| @@ -207,11 +224,10 @@ | ||
| 207 | 224 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUEREVWEB'); ?></span> |
| 208 | 225 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 209 | 226 | </div> |
| 210 | 227 | <div class="vbo-widget-finance-stat-amount"> |
| 211 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['ibe_revenue']); ?>"> | |
| 212 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 213 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['ibe_revenue']); ?></span> | |
| 228 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['ibe_revenue']), $currencysymb); ?>"> | |
| 229 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['ibe_revenue']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 214 | 230 | </span> |
| 215 | 231 | </div> |
| 216 | 232 | </div> |
| 217 | 233 | </div> |
| @@ -222,11 +238,10 @@ | ||
| 222 | 238 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUEREVOTA'); ?></span> |
| 223 | 239 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 224 | 240 | </div> |
| 225 | 241 | <div class="vbo-widget-finance-stat-amount"> |
| 226 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['ota_revenue']); ?>"> | |
| 227 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 228 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['ota_revenue']); ?></span> | |
| 242 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['ota_revenue']), $currencysymb); ?>"> | |
| 243 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['ota_revenue']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 229 | 244 | </span> |
| 230 | 245 | </div> |
| 231 | 246 | </div> |
| 232 | 247 | </div> |
| @@ -231,8 +246,42 @@ | ||
| 231 | 246 | </div> |
| 232 | 247 | </div> |
| 233 | 248 | |
| 234 | 249 | <?php |
| 250 | + if ($stats['tot_vat'] > 0) { | |
| 251 | + ?> | |
| 252 | + <div class="vbo-widget-finance-data-block" data-typestat="tot_vat"> | |
| 253 | + <div class="vbo-widget-finance-stat"> | |
| 254 | + <div class="vbo-widget-finance-stat-info"> | |
| 255 | + <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_INV_VATGST'); ?></span> | |
| 256 | + <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> | |
| 257 | + </div> | |
| 258 | + <div class="vbo-widget-finance-stat-amount"> | |
| 259 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['tot_vat']), $currencysymb); ?>"> | |
| 260 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['tot_vat']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 261 | + </span> | |
| 262 | + </div> | |
| 263 | + </div> | |
| 264 | + </div> | |
| 265 | + <?php | |
| 266 | + } | |
| 267 | + if ($stats['city_taxes'] > 0) { | |
| 268 | + ?> | |
| 269 | + <div class="vbo-widget-finance-data-block" data-typestat="city_taxes"> | |
| 270 | + <div class="vbo-widget-finance-stat"> | |
| 271 | + <div class="vbo-widget-finance-stat-info"> | |
| 272 | + <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBTOTALCITYTAX'); ?></span> | |
| 273 | + <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> | |
| 274 | + </div> | |
| 275 | + <div class="vbo-widget-finance-stat-amount"> | |
| 276 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['city_taxes']), $currencysymb); ?>"> | |
| 277 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['city_taxes']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 278 | + </span> | |
| 279 | + </div> | |
| 280 | + </div> | |
| 281 | + </div> | |
| 282 | + <?php | |
| 283 | + } | |
| 235 | 284 | if ($stats['cmm_savings'] > 0) { |
| 236 | 285 | ?> |
| 237 | 286 | <div class="vbo-widget-finance-data-block" data-typestat="ota_avg_cmms"> |
| 238 | 287 | <div class="vbo-widget-finance-stat"> |
| @@ -254,11 +303,10 @@ | ||
| 254 | 303 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_COMMISSION_SAVINGS'); ?></span> |
| 255 | 304 | <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> |
| 256 | 305 | </div> |
| 257 | 306 | <div class="vbo-widget-finance-stat-amount"> |
| 258 | - <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['cmm_savings']); ?>"> | |
| 259 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 260 | - <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['cmm_savings']); ?></span> | |
| 307 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['cmm_savings']), $currencysymb); ?>"> | |
| 308 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['cmm_savings']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 261 | 309 | </span> |
| 262 | 310 | </div> |
| 263 | 311 | </div> |
| 264 | 312 | </div> |
| @@ -263,8 +311,31 @@ | ||
| 263 | 311 | </div> |
| 264 | 312 | </div> |
| 265 | 313 | <?php |
| 266 | 314 | } |
| 315 | + | |
| 316 | + /** | |
| 317 | + * Return the information about the damage deposits collected/held. | |
| 318 | + * | |
| 319 | + * @since 1.18.0 (J) - 1.8.0 (WP) | |
| 320 | + */ | |
| 321 | + if ($stats['damage_deposits'] > 0) { | |
| 322 | + ?> | |
| 323 | + <div class="vbo-widget-finance-data-block" data-typestat="damage_deposits"> | |
| 324 | + <div class="vbo-widget-finance-stat"> | |
| 325 | + <div class="vbo-widget-finance-stat-info"> | |
| 326 | + <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_TOT_DAMAGE_DEPOSITS'); ?></span> | |
| 327 | + <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> | |
| 328 | + </div> | |
| 329 | + <div class="vbo-widget-finance-stat-amount"> | |
| 330 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['damage_deposits']), $currencysymb); ?>"> | |
| 331 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['damage_deposits']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 332 | + </span> | |
| 333 | + </div> | |
| 334 | + </div> | |
| 335 | + </div> | |
| 336 | + <?php | |
| 337 | + } | |
| 267 | 338 | ?> |
| 268 | 339 | |
| 269 | 340 | <div class="vbo-widget-finance-data-block" data-typestat="tot_bookings"> |
| 270 | 341 | <div class="vbo-widget-finance-stat"> |
| @@ -307,8 +378,22 @@ | ||
| 307 | 378 | </div> |
| 308 | 379 | </div> |
| 309 | 380 | </div> |
| 310 | 381 | |
| 382 | + <div class="vbo-widget-finance-data-block" data-typestat="abw"> | |
| 383 | + <div class="vbo-widget-finance-stat"> | |
| 384 | + <div class="vbo-widget-finance-stat-info"> | |
| 385 | + <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_AVG_BOOK_WINDOW'); ?></span> | |
| 386 | + <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> | |
| 387 | + </div> | |
| 388 | + <div class="vbo-widget-finance-stat-amount"> | |
| 389 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo htmlspecialchars(JText::translate('VBOCRONSMSREMPARAMBEFD')); ?>"> | |
| 390 | + <span><?php echo round($stats['abw'], 1); ?></span> | |
| 391 | + </span> | |
| 392 | + </div> | |
| 393 | + </div> | |
| 394 | + </div> | |
| 395 | + | |
| 311 | 396 | <div class="vbo-widget-finance-data-block" data-typestat="rooms_booked"> |
| 312 | 397 | <div class="vbo-widget-finance-stat"> |
| 313 | 398 | <div class="vbo-widget-finance-stat-info"> |
| 314 | 399 | <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBLIBTEN'); ?></span> |
| @@ -321,8 +406,22 @@ | ||
| 321 | 406 | </div> |
| 322 | 407 | </div> |
| 323 | 408 | </div> |
| 324 | 409 | |
| 410 | + <div class="vbo-widget-finance-data-block" data-typestat="cancellations_amt"> | |
| 411 | + <div class="vbo-widget-finance-stat"> | |
| 412 | + <div class="vbo-widget-finance-stat-info"> | |
| 413 | + <span class="vbo-widget-finance-stat-name"><?php echo JText::translate('VBO_CANCELLATIONS'); ?></span> | |
| 414 | + <span class="vbo-widget-finance-stat-cmd"><?php VikBookingIcons::e('ellipsis-v'); ?></span> | |
| 415 | + </div> | |
| 416 | + <div class="vbo-widget-finance-stat-amount"> | |
| 417 | + <span class="vbo-widget-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo VikBooking::formatCurrencyNumber(VikBooking::numberFormat($stats['cancellations_amt']), $currencysymb) . ($stats['tot_cancellations'] ? ' (' . $stats['tot_cancellations'] . ')' : ''); ?>"> | |
| 418 | + <?php echo VikBooking::formatCurrencyNumber($finance->numberFormatShort($stats['cancellations_amt']), $currencysymb, ['<span class="vbo-currency">%s</span>', '<span class="vbo-price">%s</span>']); ?> | |
| 419 | + </span> | |
| 420 | + </div> | |
| 421 | + </div> | |
| 422 | + </div> | |
| 423 | + | |
| 325 | 424 | </div> |
| 326 | 425 | |
| 327 | 426 | <div class="vbo-widget-finance-data-block-rankings"> |
| 328 | 427 | |
| @@ -351,10 +450,18 @@ | ||
| 351 | 450 | <div class="vbo-widget-finance-stat-rank-name"> |
| 352 | 451 | <span><?php echo $country_rank['name']; ?></span> |
| 353 | 452 | </div> |
| 354 | 453 | <div class="vbo-widget-finance-stat-rank-amount"> |
| 355 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 356 | - <span class="vbo-price vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($country_rank['revenue']); ?>"><?php echo $finance->numberFormatShort($country_rank['revenue']); ?></span> | |
| 454 | + <?php | |
| 455 | + echo VikBooking::formatCurrencyNumber( | |
| 456 | + $finance->numberFormatShort($country_rank['revenue']), | |
| 457 | + $currencysymb, | |
| 458 | + [ | |
| 459 | + '<span class="vbo-currency">%s</span>', | |
| 460 | + '<span class="vbo-price vbo-tooltip vbo-tooltip-top" data-tooltiptext="' . VikBooking::formatCurrencyNumber(VikBooking::numberFormat($country_rank['revenue']), $currencysymb) . '">%s</span>', | |
| 461 | + ] | |
| 462 | + ); | |
| 463 | + ?> | |
| 357 | 464 | </div> |
| 358 | 465 | <div class="vbo-widget-finance-stat-rank-pcent"> |
| 359 | 466 | <progress class="vbo-widget-finance-progress" value="<?php echo $country_rank['pcent']; ?>" max="100"><?php echo $country_rank['pcent']; ?>%</progress> |
| 360 | 467 | </div> |
| @@ -400,10 +507,18 @@ | ||
| 400 | 507 | <div class="vbo-widget-finance-stat-rank-name"> |
| 401 | 508 | <span><?php echo $say_pos_name; ?></span> |
| 402 | 509 | </div> |
| 403 | 510 | <div class="vbo-widget-finance-stat-rank-amount"> |
| 404 | - <span class="vbo-currency"><?php echo $currencysymb; ?></span> | |
| 405 | - <span class="vbo-price vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($pos_revenue['revenue']); ?>"><?php echo $finance->numberFormatShort($pos_revenue['revenue']); ?></span> | |
| 511 | + <?php | |
| 512 | + echo VikBooking::formatCurrencyNumber( | |
| 513 | + $finance->numberFormatShort($pos_revenue['revenue']), | |
| 514 | + $currencysymb, | |
| 515 | + [ | |
| 516 | + '<span class="vbo-currency">%s</span>', | |
| 517 | + '<span class="vbo-price vbo-tooltip vbo-tooltip-top" data-tooltiptext="' . VikBooking::formatCurrencyNumber(VikBooking::numberFormat($pos_revenue['revenue']), $currencysymb) . '">%s</span>', | |
| 518 | + ] | |
| 519 | + ); | |
| 520 | + ?> | |
| 406 | 521 | </div> |
| 407 | 522 | <div class="vbo-widget-finance-stat-rank-pcent"> |
| 408 | 523 | <progress class="vbo-widget-finance-progress" value="<?php echo $pos_revenue['pcent']; ?>" max="100"><?php echo $pos_revenue['pcent']; ?>%</progress> |
| 409 | 524 | </div> |
| @@ -501,14 +616,16 @@ | ||
| 501 | 616 | * Returns the necessary HTML to display comparison values with past dates. |
| 502 | 617 | */ |
| 503 | 618 | public function loadComparisonStats() |
| 504 | 619 | { |
| 505 | - $wrapper = VikRequest::getString('wrapper', '', 'request'); | |
| 620 | + $app = JFactory::getApplication(); | |
| 506 | 621 | |
| 507 | - $fromdate = VikRequest::getString('fromdate', '', 'request'); | |
| 508 | - $todate = VikRequest::getString('todate', '', 'request'); | |
| 509 | - $step = VikRequest::getString('step', 'quarter', 'request'); | |
| 510 | - $prev_stats = VikRequest::getVar('stats', array()); | |
| 622 | + $wrapper = $app->input->getString('wrapper', ''); | |
| 623 | + | |
| 624 | + $fromdate = $app->input->getString('fromdate', ''); | |
| 625 | + $todate = $app->input->getString('todate', ''); | |
| 626 | + $step = $app->input->getString('step', 'quarter'); | |
| 627 | + $prev_stats = $app->input->get('stats', [], 'array'); | |
| 511 | 628 | $date_dir = -1; |
| 512 | 629 | |
| 513 | 630 | if (empty($fromdate) || empty($todate) || empty($prev_stats)) { |
| 514 | 631 | // make the AJAX request fail nicely |
| @@ -572,34 +689,43 @@ | ||
| 572 | 689 | $comparison = []; |
| 573 | 690 | |
| 574 | 691 | // stats that require percent values for comparison |
| 575 | 692 | $pcent_stats = [ |
| 576 | - 'gross_revenue' => [], | |
| 577 | - 'taxes' => [], | |
| 578 | - 'cmms' => [ | |
| 579 | - 'reverse' => 1, | |
| 693 | + 'gross_revenue' => [], | |
| 694 | + 'taxes' => [], | |
| 695 | + 'tot_vat' => [], | |
| 696 | + 'city_taxes' => [], | |
| 697 | + 'cmms' => [ | |
| 698 | + 'reverse' => 1, | |
| 580 | 699 | ], |
| 581 | - 'revenue' => [], | |
| 582 | - 'ibe_revenue' => [], | |
| 583 | - 'ota_revenue' => [], | |
| 584 | - 'ota_avg_cmms' => [ | |
| 700 | + 'revenue' => [], | |
| 701 | + 'ibe_revenue' => [], | |
| 702 | + 'ota_revenue' => [], | |
| 703 | + 'ota_avg_cmms' => [ | |
| 585 | 704 | 'reverse' => 1, |
| 586 | 705 | 'no_pcent' => 1, |
| 587 | 706 | 'fixednum' => 1, |
| 588 | 707 | ], |
| 589 | - 'cmm_savings' => [], | |
| 590 | - 'tot_bookings' => [ | |
| 708 | + 'cmm_savings' => [], | |
| 709 | + 'damage_deposits' => [], | |
| 710 | + 'tot_bookings' => [ | |
| 591 | 711 | 'fixednum' => 1, |
| 592 | 712 | ], |
| 593 | - 'nights_booked' => [ | |
| 713 | + 'nights_booked' => [ | |
| 594 | 714 | 'fixednum' => 1, |
| 595 | 715 | ], |
| 596 | - 'avg_los' => [ | |
| 716 | + 'avg_los' => [ | |
| 597 | 717 | 'fixednum' => 1, |
| 598 | 718 | ], |
| 599 | - 'rooms_booked' => [ | |
| 719 | + 'abw' => [ | |
| 600 | 720 | 'fixednum' => 1, |
| 601 | 721 | ], |
| 722 | + 'rooms_booked' => [ | |
| 723 | + 'fixednum' => 1, | |
| 724 | + ], | |
| 725 | + 'cancellations_amt' => [ | |
| 726 | + 'reverse' => 1, | |
| 727 | + ], | |
| 602 | 728 | ]; |
| 603 | 729 | |
| 604 | 730 | foreach ($pcent_stats as $stat_name => $stat_opt) { |
| 605 | 731 | if (!isset($compare_stats[$stat_name])) { |
| @@ -620,8 +746,9 @@ | ||
| 620 | 746 | 'diff' => $diff, |
| 621 | 747 | 'diff_f' => VikBooking::numberFormat($diff), |
| 622 | 748 | 'diff_s' => $finance->numberFormatShort($diff), |
| 623 | 749 | 'pcent' => isset($stat_opt['no_pcent']) ? null : $finance->calcAbsPercent($prev_stats[$stat_name], $compare_stats[$stat_name]), |
| 750 | + 'reverse' => $stat_opt['reverse'] ?? false, | |
| 624 | 751 | ]; |
| 625 | 752 | |
| 626 | 753 | // inject property for fixed number with no currency |
| 627 | 754 | if (isset($stat_opt['fixednum']) && $stat_opt['fixednum']) { |
| @@ -668,13 +795,13 @@ | ||
| 668 | 795 | /** |
| 669 | 796 | * Main method to invoke the widget. Contents will be loaded |
| 670 | 797 | * through AJAX requests, not via PHP when the page loads. |
| 671 | 798 | * |
| 672 | - * @param VBOMultitaskData $data | |
| 799 | + * @param ?VBOMultitaskData $data | |
| 673 | 800 | * |
| 674 | 801 | * @return void |
| 675 | 802 | */ |
| 676 | - public function render(VBOMultitaskData $data = null) | |
| 803 | + public function render(?VBOMultitaskData $data = null) | |
| 677 | 804 | { |
| 678 | 805 | // increase widget's instance counter |
| 679 | 806 | static::$instance_counter++; |
| 680 | 807 | |
| @@ -737,13 +864,17 @@ | ||
| 737 | 864 | $period_name = JText::translate('VBO_QUARTER'); |
| 738 | 865 | } |
| 739 | 866 | |
| 740 | 867 | // check multitask data |
| 868 | + $rooms_filtered = []; | |
| 741 | 869 | if ($data) { |
| 742 | 870 | $inj_fromdate = $data->get('fromdate', $this->options()->get('fromdate', '')); |
| 743 | 871 | $inj_todate = $data->get('todate', $this->options()->get('todate', '')); |
| 744 | 872 | $inj_type = $data->get('type', $this->options()->get('type', '')); |
| 745 | 873 | |
| 874 | + // check if some room IDs were filtered | |
| 875 | + $rooms_filtered = (array) $data->get('room_ids', $this->options()->get('room_ids', [])); | |
| 876 | + | |
| 746 | 877 | if (preg_match("/^\d{4}-\d{2}-\d{2}$/", $inj_fromdate) && preg_match("/^\d{4}-\d{2}-\d{2}$/", $inj_todate)) { |
| 747 | 878 | // valid dates injected in Y-m-d format |
| 748 | 879 | $fromdate = $inj_fromdate; |
| 749 | 880 | $todate = $inj_todate; |
| @@ -810,8 +941,21 @@ | ||
| 810 | 941 | <option value="quarter"<?php echo $cookie_step == 'quarter' ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBO_QUARTER'); ?></option> |
| 811 | 942 | <option value="booking_dates"<?php echo !strcasecmp($cookie_step, 'booking_dates') ? ' selected="selected"' : ''; ?>><?php echo JText::translate('VBPCHOOSEBUSYORDATE'); ?></option> |
| 812 | 943 | </select> |
| 813 | 944 | </div> |
| 945 | + <div class="vbo-reportwidget-filter vbo-widget-finance-rooms-filter-wrap"> | |
| 946 | + <select class="vbo-widget-finance-rooms-filter" multiple="multiple"> | |
| 947 | + <?php | |
| 948 | + foreach ($rooms_filtered as $room_filtered) { | |
| 949 | + if ($room_info = VikBooking::getRoomInfo($room_filtered, ['id', 'name'], true)) { | |
| 950 | + ?> | |
| 951 | + <option value="<?php echo $room_info['id']; ?>" selected="selected"><?php echo $room_info['name']; ?></option> | |
| 952 | + <?php | |
| 953 | + } | |
| 954 | + } | |
| 955 | + ?> | |
| 956 | + </select> | |
| 957 | + </div> | |
| 814 | 958 | <div class="vbo-reportwidget-filter vbo-reportwidget-filter-confirm"> |
| 815 | 959 | <input type="hidden" class="vbo-finance-compare-auto" value="" /> |
| 816 | 960 | <button type="button" class="btn vbo-config-btn" onclick="vboWidgetFinanceChangeDates('<?php echo $wrapper_id; ?>');"><?php echo JText::translate('VBADMINNOTESUPD'); ?></button> |
| 817 | 961 | </div> |
| @@ -897,8 +1041,9 @@ | ||
| 897 | 1041 | // get vars for making the request |
| 898 | 1042 | var from_date = widget_instance.find('.vbo-finance-dtpicker-from').val(); |
| 899 | 1043 | var to_date = widget_instance.find('.vbo-finance-dtpicker-to').val(); |
| 900 | 1044 | var dates_step = widget_instance.find('.vbo-finance-period-nav').val(); |
| 1045 | + var room_ids = widget_instance.find('select.vbo-widget-finance-rooms-filter').val(); | |
| 901 | 1046 | var auto_compare = widget_instance.find('.vbo-finance-compare-auto').val(); |
| 902 | 1047 | |
| 903 | 1048 | // the widget method to call |
| 904 | 1049 | var call_method = 'loadFinancialStats'; |
| @@ -912,8 +1057,9 @@ | ||
| 912 | 1057 | return: 1, |
| 913 | 1058 | fromdate: from_date, |
| 914 | 1059 | todate: to_date, |
| 915 | 1060 | step: dates_step, |
| 1061 | + room_ids: room_ids, | |
| 916 | 1062 | date_dir: dates_direction, |
| 917 | 1063 | wrapper: wrapper, |
| 918 | 1064 | tmpl: "component" |
| 919 | 1065 | }, |
| @@ -1102,15 +1248,15 @@ | ||
| 1102 | 1248 | let pcent_block = jQuery('<div></div>').addClass('vbo-widget-finance-compare-pcent'); |
| 1103 | 1249 | let pcent_icon = ''; |
| 1104 | 1250 | if (obj_res[call_method]['compare'][stat_name]['diff'] == 0) { |
| 1105 | 1251 | pcent_block.addClass('vbo-widget-finance-compare-pcent-equal'); |
| 1106 | - pcent_icon = '<?php VikBookingIcons::e('equals') ?>'; | |
| 1252 | + pcent_icon = '<?php VikBookingIcons::e('equals') ?>'; | |
| 1107 | 1253 | } else if (obj_res[call_method]['compare'][stat_name]['diff'] > 0) { |
| 1108 | 1254 | pcent_block.addClass('vbo-widget-finance-compare-pcent-up'); |
| 1109 | - pcent_icon = '<?php VikBookingIcons::e('arrow-up') ?>'; | |
| 1255 | + pcent_icon = obj_res[call_method]['compare'][stat_name]['reverse'] ? '<?php VikBookingIcons::e('arrow-down') ?>' : '<?php VikBookingIcons::e('arrow-up') ?>'; | |
| 1110 | 1256 | } else if (obj_res[call_method]['compare'][stat_name]['diff'] < 0) { |
| 1111 | 1257 | pcent_block.addClass('vbo-widget-finance-compare-pcent-down'); |
| 1112 | - pcent_icon = '<?php VikBookingIcons::e('arrow-down') ?>'; | |
| 1258 | + pcent_icon = obj_res[call_method]['compare'][stat_name]['reverse'] ? '<?php VikBookingIcons::e('arrow-up') ?>' : '<?php VikBookingIcons::e('arrow-down') ?>'; | |
| 1113 | 1259 | } |
| 1114 | 1260 | if (obj_res[call_method]['compare'][stat_name]['pcent'] != null) { |
| 1115 | 1261 | pcent_block.append('<span class="vbo-widget-finance-compare-val">' + pcent_icon + ' ' + obj_res[call_method]['compare'][stat_name]['pcent'] + '%</span>'); |
| 1116 | 1262 | } |
| @@ -1239,8 +1385,35 @@ | ||
| 1239 | 1385 | var jdp = jQuery(this).parent().find('input.hasDatepicker'); |
| 1240 | 1386 | if (jdp.length) { |
| 1241 | 1387 | jdp.focus(); |
| 1242 | 1388 | } |
| 1389 | + }); | |
| 1390 | + | |
| 1391 | + // register room filters search via AJAX | |
| 1392 | + jQuery('#<?php echo $wrapper_id; ?>').find('select.vbo-widget-finance-rooms-filter').select2({ | |
| 1393 | + placeholder: Joomla.JText._('VBROOMFILTER'), | |
| 1394 | + language: { | |
| 1395 | + errorLoading: () => { | |
| 1396 | + return Joomla.JText._('VBO_ERR_LOAD_RESULTS'); | |
| 1397 | + }, | |
| 1398 | + noResults: () => { | |
| 1399 | + return Joomla.JText._('VBNOROOMSFOUND'); | |
| 1400 | + }, | |
| 1401 | + searching: () => { | |
| 1402 | + return Joomla.JText._('VBO_SEARCHING'); | |
| 1403 | + }, | |
| 1404 | + }, | |
| 1405 | + ajax: { | |
| 1406 | + delay: 350, | |
| 1407 | + url: "<?php echo VikBooking::ajaxUrl('index.php?option=com_vikbooking&task=bookings.rooms_search'); ?>", | |
| 1408 | + dataType: 'json', | |
| 1409 | + }, | |
| 1410 | + templateResult: (element) => { | |
| 1411 | + if (!element.img) { | |
| 1412 | + return element.text; | |
| 1413 | + } | |
| 1414 | + return jQuery('<span class="vbo-sel2-element-img"><img src="' + element.img + '" /> <span>' + element.text + '</span></span>'); | |
| 1415 | + }, | |
| 1243 | 1416 | }); |
| 1244 | 1417 | |
| 1245 | 1418 | // when document is ready, load stats for this widget's instance |
| 1246 | 1419 | vboWidgetFinanceLoad('<?php echo $wrapper_id; ?>'); |