PluginProbe
VikBooking Hotel Booking Engine & PMS / 1.8.15
VikBooking Hotel Booking Engine & PMS v1.8.15
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 1.7.3 All 36 releases
vikbooking / admin / helpers / src / rms / pace / data / metric / roomratevariation.php

roomratevariation.php in VikBooking Hotel Booking Engine & PMS 1.8.15, at admin/helpers/src/rms/pace/data/metric/roomratevariation.php

89 lines 2.8 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 core
5 * @author E4J s.r.l.
6 * @copyright Copyright (C) 2025 E4J s.r.l. All Rights Reserved.
7 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
8 * @link https://vikwp.com
9 */
10
11 // No direct access
12 defined('ABSPATH') or die('No script kiddies please!');
13
14 /**
15 * RMS Pace Data Metric Room Rate Variation implementation.
16 *
17 * @since 1.18.6 (J) - 1.8.6 (WP)
18 */
19 final class VBORmsPaceDataMetricRoomratevariation extends VBORmsPaceDataMetric
20 {
21 /**
22 * @inheritDoc
23 */
24 public function getID()
25 {
26 return 'roomratevr';
27 }
28
29 /**
30 * @inheritDoc
31 */
32 public function extract(VBORmsPaceDataperiod $paceDataPeriod, ?array $periodPaceMetrics = null)
33 {
34 $ratesRegistry = $paceDataPeriod->getRatesRegistry();
35
36 if (!$ratesRegistry) {
37 // registry is not available
38 return null;
39 }
40
41 // associative list of room rate variations
42 $roomRateVariations = [];
43
44 // iterate all listing IDs
45 foreach (array_keys($paceDataPeriod->getListings()) as $listingId) {
46 // get the last rates variation date object for the current listing, period and interval, if any
47 $lastDt = $ratesRegistry->matchPeriodLastFlowDate($paceDataPeriod->getPeriod(), $paceDataPeriod->getIntervalType(), [$listingId]);
48 if (!$lastDt) {
49 // no flow records available
50 continue;
51 }
52
53 // get the last room rate variation timestamp
54 $lastTs = $lastDt->format('U');
55
56 // start counters
57 $plusCount = $minusCount = 0;
58
59 // iterate all confirmed bookings affecting the current period
60 foreach ($paceDataPeriod as $booking) {
61 if (($booking['ts'] ?? 0) >= $lastTs && in_array($listingId, array_column($booking['_rooms'] ?? [], 'idroom'))) {
62 // increase counter
63 $plusCount++;
64 }
65 }
66
67 // iterate all cancelled bookings affecting the current period
68 foreach ($paceDataPeriod->getCancellations() as $booking) {
69 if (($booking['ts'] ?? 0) >= $lastTs && in_array($listingId, array_column($booking['_rooms'] ?? [], 'idroom'))) {
70 // increase counter
71 $minusCount++;
72 }
73 }
74
75 if ($plusCount || $minusCount) {
76 // push listing ID rate variations
77 $roomRateVariations[$listingId] = [
78 'dt' => $lastDt,
79 'plus' => $plusCount,
80 'minus' => $minusCount,
81 ];
82 }
83 }
84
85 // return the associative list of room rate variations, or null
86 return $roomRateVariations ?: null;
87 }
88 }
89