PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.8
VikBooking Hotel Booking Engine & PMS v1.8.8
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
vikbooking / site / layouts / tools / finance.php

finance.php in VikBooking Hotel Booking Engine & PMS 1.8.8, at site/layouts/tools/finance.php

374 lines 15.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package VikBooking
4 * @subpackage com_vikbooking
5 * @author Alessio Gaggii - E4J srl
6 * @copyright Copyright (C) 2024 E4J srl. 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 /**
14 * Obtain vars from arguments received in the layout file.
15 * This is the layout file for the "finance" operator tool.
16 *
17 * @var string $tool The tool identifier.
18 * @var array $operator The operator record accessing the tool.
19 * @var object $permissions The operator-tool permissions registry.
20 * @var string $tool_uri The base URI for rendering this tool.
21 */
22 extract($displayData);
23
24 // access environment objects
25 $app = JFactory::getApplication();
26 $vbo_app = VikBooking::getVboApplication();
27
28 // load datepicker calendar assets
29 $vbo_app->loadDatePicker();
30
31 // get listings assigned to the current operator (no listings equals to all listings)
32 $listings = array_filter(
33 array_map('intval', (array) $permissions->get('rooms', []))
34 );
35
36 // get the name of all listings, if not all
37 $listing_names = [];
38 if ($listings) {
39 foreach (VikBooking::getAvailabilityInstance()->loadRooms() as $room_id => $room_data) {
40 if (in_array($room_id, $listings)) {
41 // push listing name
42 $listing_names[] = $room_data['name'];
43 }
44 }
45 }
46
47 // access one report object
48 $report = VikBooking::getReportInstance('rates_flow');
49
50 // access the finance helper object
51 $finance = VBOTaxonomyFinance::getInstance();
52
53 // currency symbol
54 $currencysymb = VikBooking::getCurrencySymb();
55
56 // get date format
57 $df = $report->getDateFormat();
58
59 // get dates from filters
60 $from_date = $app->getUserStateFromRequest('vbo.operators.tools.finance.fromdt', 'from_date', date($df, mktime(0, 0, 0, date('n'), 1, date('Y'))), 'string');
61 $to_date = $app->getUserStateFromRequest('vbo.operators.tools.finance.todt', 'to_date', date($df), 'string');
62
63 // get calculation type from filters ("stay_dates" or "booking_dates")
64 $calc_type = $app->getUserStateFromRequest('vbo.operators.tools.finance.type', 'calc_type', 'stay_dates', 'string');
65
66 // get the financial stats for the requested dates
67 try {
68 $stats = $finance->getStats($from_date, $to_date, $listings, $calc_type);
69 } catch (Exception $e) {
70 // propagate the error
71 VBOHttpDocument::getInstance()->close($e->getCode(), $e->getMessage());
72 }
73
74 ?>
75
76 <div class="vbo-operator-tool-finance-wrap">
77 <div class="vbo-operator-tool-top-filters vbo-operator-tool-finance-filters">
78 <div class="vbo-operator-tool-top-filters-inner">
79 <form action="<?php echo $tool_uri; ?>" method="post">
80 <div class="vbo-operator-tool-top-filter vbo-operator-tool-dt-filter">
81 <label for="vbo-tool-finance-from-dt"><?php echo JText::translate('VBOPROMORENTFROM'); ?></label>
82 <?php echo $vbo_app->getCalendar($from_date, 'from_date', 'vbo-tool-finance-from-dt'); ?>
83 </div>
84 <div class="vbo-operator-tool-top-filter vbo-operator-tool-dt-filter">
85 <label for="vbo-tool-finance-to-dt"><?php echo JText::translate('VBOPROMORENTTO'); ?></label>
86 <?php echo $vbo_app->getCalendar($to_date, 'to_date', 'vbo-tool-finance-to-dt'); ?>
87 </div>
88 <div class="vbo-operator-tool-top-filter vbo-operator-tool-submit-filter">
89 <button type="submit" class="btn btn-primary vbo-pref-color-btn"><?php echo JText::translate('VBSEARCHBUTTON'); ?></button>
90 </div>
91 </form>
92 <div class="vbo-operator-tool-listings">
93 <span><?php echo $listing_names ? JText::sprintf('VBO_LISTING_NAMES', implode(', ', $listing_names)) : JText::translate('VBO_ALL_LISTINGS'); ?></span>
94 </div>
95 </div>
96 </div>
97 <div class="vbo-operator-tool-finance-stats">
98
99 <div class="vbo-tool-finance-data-blocks">
100
101 <div class="vbo-tool-finance-data-block" data-typestat="gross_revenue">
102 <div class="vbo-tool-finance-stat">
103 <div class="vbo-tool-finance-stat-info">
104 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBO_GROSS_BOOKING_VALUE'); ?></span>
105 </div>
106 <div class="vbo-tool-finance-stat-amount">
107 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['gross_revenue']); ?>">
108 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
109 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['gross_revenue']); ?></span>
110 </span>
111 </div>
112 </div>
113 </div>
114
115 <div class="vbo-tool-finance-data-block" data-typestat="taxes">
116 <div class="vbo-tool-finance-stat">
117 <div class="vbo-tool-finance-stat-info">
118 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOINVCOLTAX'); ?></span>
119 </div>
120 <div class="vbo-tool-finance-stat-amount">
121 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['taxes']); ?>">
122 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
123 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['taxes']); ?></span>
124 </span>
125 </div>
126 </div>
127 </div>
128
129 <div class="vbo-tool-finance-data-block" data-typestat="cmms">
130 <div class="vbo-tool-finance-stat">
131 <div class="vbo-tool-finance-stat-info">
132 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBTOTALCOMMISSIONS'); ?></span>
133 </div>
134 <div class="vbo-tool-finance-stat-amount">
135 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['cmms']); ?>">
136 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
137 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['cmms']); ?></span>
138 </span>
139 </div>
140 </div>
141 </div>
142
143 <div class="vbo-tool-finance-data-block" data-typestat="revenue">
144 <div class="vbo-tool-finance-stat">
145 <div class="vbo-tool-finance-stat-info">
146 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUE'); ?></span>
147 </div>
148 <div class="vbo-tool-finance-stat-amount">
149 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['revenue']); ?>">
150 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
151 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['revenue']); ?></span>
152 </span>
153 </div>
154 </div>
155 </div>
156
157 <div class="vbo-tool-finance-data-block" data-typestat="ibe_revenue">
158 <div class="vbo-tool-finance-stat">
159 <div class="vbo-tool-finance-stat-info">
160 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUEREVWEB'); ?></span>
161 </div>
162 <div class="vbo-tool-finance-stat-amount">
163 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['ibe_revenue']); ?>">
164 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
165 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['ibe_revenue']); ?></span>
166 </span>
167 </div>
168 </div>
169 </div>
170
171 <div class="vbo-tool-finance-data-block" data-typestat="ota_revenue">
172 <div class="vbo-tool-finance-stat">
173 <div class="vbo-tool-finance-stat-info">
174 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOREPORTREVENUEREVOTA'); ?></span>
175 </div>
176 <div class="vbo-tool-finance-stat-amount">
177 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['ota_revenue']); ?>">
178 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
179 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['ota_revenue']); ?></span>
180 </span>
181 </div>
182 </div>
183 </div>
184
185 <?php
186 if ($stats['cmm_savings'] > 0) {
187 ?>
188 <div class="vbo-tool-finance-data-block" data-typestat="ota_avg_cmms">
189 <div class="vbo-tool-finance-stat">
190 <div class="vbo-tool-finance-stat-info">
191 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBO_AVG_COMMISSIONS'); ?></span>
192 </div>
193 <div class="vbo-tool-finance-stat-amount">
194 <span class="vbo-tool-finance-stat-amount-value">
195 <span><?php echo $stats['ota_avg_cmms']; ?>%</span>
196 </span>
197 </div>
198 </div>
199 </div>
200
201 <div class="vbo-tool-finance-data-block" data-typestat="cmm_savings">
202 <div class="vbo-tool-finance-stat">
203 <div class="vbo-tool-finance-stat-info">
204 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBO_COMMISSION_SAVINGS'); ?></span>
205 </div>
206 <div class="vbo-tool-finance-stat-amount">
207 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo $currencysymb . ' ' . VikBooking::numberFormat($stats['cmm_savings']); ?>">
208 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
209 <span class="vbo-price"><?php echo $finance->numberFormatShort($stats['cmm_savings']); ?></span>
210 </span>
211 </div>
212 </div>
213 </div>
214 <?php
215 }
216 ?>
217
218 <div class="vbo-tool-finance-data-block" data-typestat="tot_bookings">
219 <div class="vbo-tool-finance-stat">
220 <div class="vbo-tool-finance-stat-info">
221 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBCUSTOMERTOTBOOKINGS'); ?></span>
222 </div>
223 <div class="vbo-tool-finance-stat-amount">
224 <span class="vbo-tool-finance-stat-amount-value">
225 <span><?php echo $stats['tot_bookings']; ?></span>
226 </span>
227 </div>
228 </div>
229 </div>
230
231 <div class="vbo-tool-finance-data-block" data-typestat="nights_booked">
232 <div class="vbo-tool-finance-stat">
233 <div class="vbo-tool-finance-stat-info">
234 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOGRAPHTOTNIGHTSLBL'); ?></span>
235 </div>
236 <div class="vbo-tool-finance-stat-amount">
237 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo htmlspecialchars(trim(str_replace('%', '', JText::translate('VBOREPORTREVENUEPOCC'))) . ' ' . $stats['occupancy'] . '%'); ?>">
238 <span><?php echo $stats['nights_booked'] . '/' . $stats['tot_inventory']; ?></span>
239 </span>
240 </div>
241 </div>
242 </div>
243
244 <div class="vbo-tool-finance-data-block" data-typestat="avg_los">
245 <div class="vbo-tool-finance-stat">
246 <div class="vbo-tool-finance-stat-info">
247 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBTRKAVGLOS'); ?></span>
248 </div>
249 <div class="vbo-tool-finance-stat-amount">
250 <span class="vbo-tool-finance-stat-amount-value">
251 <span><?php echo $stats['avg_los']; ?></span>
252 </span>
253 </div>
254 </div>
255 </div>
256
257 <div class="vbo-tool-finance-data-block" data-typestat="rooms_booked">
258 <div class="vbo-tool-finance-stat">
259 <div class="vbo-tool-finance-stat-info">
260 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBLIBTEN'); ?></span>
261 </div>
262 <div class="vbo-tool-finance-stat-amount">
263 <span class="vbo-tool-finance-stat-amount-value vbo-tooltip vbo-tooltip-top" data-tooltiptext="<?php echo htmlspecialchars(JText::translate('VBOGRAPHTOTUNITSLBL') . ' ' . $stats['room_units']); ?>">
264 <span><?php echo $stats['rooms_booked']; ?></span>
265 </span>
266 </div>
267 </div>
268 </div>
269
270 </div>
271
272 <?php
273 if (($stats['country_ranks'] ?? []) || ($stats['pos_revenue'] ?? [])) {
274 ?>
275 <div class="vbo-tool-finance-data-block-rankings">
276
277 <div class="vbo-tool-finance-data-block-rank" data-typestat="country_ranks">
278 <div class="vbo-tool-finance-stat">
279 <div class="vbo-tool-finance-stat-info">
280 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOSTATSTOPCOUNTRIES'); ?></span>
281 </div>
282 <div class="vbo-tool-finance-stat-ranks">
283 <?php
284 foreach ($stats['country_ranks'] as $country_rank) {
285 ?>
286 <div class="vbo-tool-finance-stat-rank">
287 <div class="vbo-tool-finance-stat-rank-logo">
288 <?php
289 if (is_file(VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'resources' . DIRECTORY_SEPARATOR . 'countries' . DIRECTORY_SEPARATOR . $country_rank['code'] . '.png')) {
290 ?>
291 <img src="<?php echo VBO_ADMIN_URI . 'resources/countries/' . $country_rank['code'] . '.png'; ?>" />
292 <?php
293 } else {
294 VikBookingIcons::e('globe');
295 }
296 ?>
297 </div>
298 <div class="vbo-tool-finance-stat-rank-score">
299 <div class="vbo-tool-finance-stat-rank-name">
300 <span><?php echo $country_rank['name']; ?></span>
301 </div>
302 <div class="vbo-tool-finance-stat-rank-amount">
303 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
304 <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>
305 </div>
306 <div class="vbo-tool-finance-stat-rank-pcent">
307 <progress class="vbo-tool-finance-progress" value="<?php echo $country_rank['pcent']; ?>" max="100"><?php echo $country_rank['pcent']; ?>%</progress>
308 </div>
309 </div>
310 </div>
311 <?php
312 }
313 ?>
314 </div>
315 </div>
316 </div>
317
318 <div class="vbo-tool-finance-data-block-rank" data-typestat="pos_revenue">
319 <div class="vbo-tool-finance-stat">
320 <div class="vbo-tool-finance-stat-info">
321 <span class="vbo-tool-finance-stat-name"><?php echo JText::translate('VBOCHANNELS'); ?></span>
322 </div>
323 <div class="vbo-tool-finance-stat-ranks">
324 <?php
325 foreach ($stats['pos_revenue'] as $pos_revenue) {
326 $say_pos_name = ucfirst($pos_revenue['name']);
327 ?>
328 <div class="vbo-tool-finance-stat-rank">
329 <div class="vbo-tool-finance-stat-rank-logo">
330 <?php
331 if (!empty($pos_revenue['logo'])) {
332 ?>
333 <img src="<?php echo $pos_revenue['logo']; ?>" />
334 <?php
335 // adjust channel name
336 $say_pos_name = strtolower($pos_revenue['name']) == 'airbnbapi' ? 'Airbnb' : $say_pos_name;
337 $say_pos_name = strtolower($pos_revenue['name']) == 'googlehotel' ? 'Google Hotel' : $say_pos_name;
338 } elseif (!strcasecmp($pos_revenue['name'], 'website')) {
339 VikBookingIcons::e('hotel');
340 // adjust channel name
341 $say_pos_name = JText::translate('VBORDFROMSITE');
342 } else {
343 VikBookingIcons::e('globe');
344 }
345 ?>
346 </div>
347 <div class="vbo-tool-finance-stat-rank-score">
348 <div class="vbo-tool-finance-stat-rank-name">
349 <span><?php echo $say_pos_name; ?></span>
350 </div>
351 <div class="vbo-tool-finance-stat-rank-amount">
352 <span class="vbo-currency"><?php echo $currencysymb; ?></span>
353 <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>
354 </div>
355 <div class="vbo-tool-finance-stat-rank-pcent">
356 <progress class="vbo-tool-finance-progress" value="<?php echo $pos_revenue['pcent']; ?>" max="100"><?php echo $pos_revenue['pcent']; ?>%</progress>
357 </div>
358 </div>
359 </div>
360 <?php
361 }
362 ?>
363 </div>
364 </div>
365 </div>
366
367 </div>
368 <?php
369 }
370 ?>
371
372 </div>
373 </div>
374