1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* @file |
5
|
|
|
* Class DateConstraint |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
namespace Roomify\Bat\Constraint; |
9
|
|
|
|
10
|
|
|
use Roomify\Bat\Calendar\CalendarResponse; |
11
|
|
|
use Roomify\Bat\Constraint\Constraint; |
12
|
|
|
|
13
|
|
|
/** |
14
|
|
|
* The DateConstraint provides a generalized constraint on the start and end time |
15
|
|
|
* of an event. |
16
|
|
|
* |
17
|
|
|
* An applicable scenario is to allow units to declare (independently of |
18
|
|
|
* their actual event state) whether they should be deemed as matching a search |
19
|
|
|
* based on the dates of the search. For example, a hotel room can declare that it |
20
|
|
|
* should be unavailable if the check-in time is not at least 2 days away from the |
21
|
|
|
* today. |
22
|
|
|
*/ |
23
|
|
|
class DateConstraint extends Constraint { |
24
|
|
|
|
25
|
|
|
// The constraint start date - if on or after requested start date constraint will apply. |
26
|
|
|
public $start_date; |
27
|
|
|
|
28
|
|
|
// The constraint end date - if on or after requested end date constraint will apply. |
29
|
|
|
public $end_date; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* DateConstraint constructor. |
33
|
|
|
* @param array $units |
34
|
|
|
* @param null $start_date |
35
|
|
|
* @param null $end_date |
36
|
|
|
*/ |
37
|
|
|
public function __construct($units, $start_date = NULL, $end_date = NULL) { |
38
|
|
|
parent::__construct($units); |
39
|
|
|
|
40
|
|
|
$this->start_date = $start_date; |
41
|
|
|
$this->end_date = $end_date; |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
/** |
45
|
|
|
* {@inheritdoc} |
46
|
|
|
*/ |
47
|
|
|
public function applyConstraint(CalendarResponse &$calendar_response) { |
48
|
|
|
parent::applyConstraint($calendar_response); |
49
|
|
|
|
50
|
|
|
if ($this->start_date === NULL) { |
51
|
|
|
$this->start_date = new \DateTime('1970-01-01'); |
52
|
|
|
} |
53
|
|
|
if ($this->end_date === NULL) { |
54
|
|
|
$this->end_date = new \DateTime('2999-12-31'); |
55
|
|
|
} |
56
|
|
|
|
57
|
|
|
// If the constraint start date is on or after the requested start date |
58
|
|
|
// or the constraint end date is on or before the requested end date, mark |
59
|
|
|
// the units as invalid. |
60
|
|
|
if ($this->start_date->getTimestamp() >= $calendar_response->getStartDate()->getTimestamp() || |
61
|
|
|
$this->end_date->getTimestamp() <= $calendar_response->getEndDate()->getTimestamp()) { |
62
|
|
|
|
63
|
|
|
$units = $this->getUnits(); |
64
|
|
|
|
65
|
|
|
$included_set = $calendar_response->getIncluded(); |
66
|
|
|
|
67
|
|
View Code Duplication |
foreach ($included_set as $unit_id => $set) { |
|
|
|
|
68
|
|
|
if (isset($units[$unit_id]) || empty($units)) { |
69
|
|
|
$calendar_response->removeFromMatched($included_set[$unit_id]['unit'], CalendarResponse::CONSTRAINT, $this); |
70
|
|
|
|
71
|
|
|
$this->affected_units[$unit_id] = $included_set[$unit_id]['unit']; |
72
|
|
|
} |
73
|
|
|
} |
74
|
|
|
} |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
/** |
78
|
|
|
* Generates a text describing an availability_constraint. |
79
|
|
|
* |
80
|
|
|
* @return string |
81
|
|
|
* The formatted message. |
82
|
|
|
*/ |
83
|
|
|
public function toString() { |
84
|
|
|
$text = ''; |
85
|
|
|
$args = array(); |
86
|
|
|
|
87
|
|
|
$start_date = FALSE; |
88
|
|
|
$end_date = FALSE; |
89
|
|
|
|
90
|
|
|
// Date range constraint variables. |
91
|
|
|
if ($this->start_date !== NULL) { |
92
|
|
|
$start_date = $this->start_date->format('Y-m-d'); |
93
|
|
|
} |
94
|
|
|
if ($this->start_date !== NULL) { |
95
|
|
|
$end_date = $this->end_date->format('Y-m-d'); |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
// Specify a date range constraint. |
99
|
|
View Code Duplication |
if ($start_date && $end_date) { |
|
|
|
|
100
|
|
|
$text = 'From @start_date to @end_date'; |
101
|
|
|
|
102
|
|
|
$args['@start_date'] = $start_date; |
103
|
|
|
$args['@end_date'] = $end_date; |
104
|
|
|
} |
105
|
|
|
|
106
|
|
|
// Specify the start/end constraint. |
107
|
|
|
if ($start_date && $end_date) { |
108
|
|
|
$text = 'From @start_date to @end_date'; |
109
|
|
|
} |
110
|
|
|
|
111
|
|
|
return array('text' => $text, 'args' => $args); |
112
|
|
|
} |
113
|
|
|
|
114
|
|
|
} |
115
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.