PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.16
VikBooking Hotel Booking Engine & PMS v1.8.16
1.8.16 1.8.15 1.8.14 1.8.13 1.8.12 1.8.11 1.8.10 1.8.9 1.8.6 1.8.7 1.8.8 trunk 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 All 37 releases
← All changes | admin/helpers/widgets/finance.php +227 -54 1.6.9 → 1.8.16 View file →
@@ -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; ?>');