Completed
Branch dependabot/composer/jaybizzle/... (2225bb)
by
unknown
04:46 queued 19s
created
core/domain/entities/admin/GraphQLData/Event.php 2 patches
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -5,13 +5,13 @@  discard block
 block discarded – undo
5 5
 class Event extends GraphQLData
6 6
 {
7 7
 
8
-    /**
9
-     * @inheritDoc
10
-     */
11
-    public function getData(array $params = [])
12
-    {
13
-        $field_key = lcfirst($this->namespace) . 'Event';
14
-        $query     = <<<QUERY
8
+	/**
9
+	 * @inheritDoc
10
+	 */
11
+	public function getData(array $params = [])
12
+	{
13
+		$field_key = lcfirst($this->namespace) . 'Event';
14
+		$query     = <<<QUERY
15 15
         query GET_EVENT(\$id: ID!) {
16 16
             {$field_key}(id: \$id, idType: DATABASE_ID) {
17 17
                 id
@@ -48,14 +48,14 @@  discard block
 block discarded – undo
48 48
             }
49 49
         }
50 50
 QUERY;
51
-        $this->setParams(
52
-            [
53
-                'operation_name' => 'GET_EVENT',
54
-                'variables'      => $params,
55
-                'query'          => $query,
56
-            ]
57
-        );
51
+		$this->setParams(
52
+			[
53
+				'operation_name' => 'GET_EVENT',
54
+				'variables'      => $params,
55
+				'query'          => $query,
56
+			]
57
+		);
58 58
 
59
-        return $this->getQueryResponse($field_key);
60
-    }
59
+		return $this->getQueryResponse($field_key);
60
+	}
61 61
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@
 block discarded – undo
10 10
      */
11 11
     public function getData(array $params = [])
12 12
     {
13
-        $field_key = lcfirst($this->namespace) . 'Event';
13
+        $field_key = lcfirst($this->namespace).'Event';
14 14
         $query     = <<<QUERY
15 15
         query GET_EVENT(\$id: ID!) {
16 16
             {$field_key}(id: \$id, idType: DATABASE_ID) {
Please login to merge, or discard this patch.
core/domain/entities/routing/data_nodes/core/SitePermissions.php 1 patch
Indentation   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -8,31 +8,31 @@
 block discarded – undo
8 8
 
9 9
 class SitePermissions extends JsonDataNode
10 10
 {
11
-    const NODE_NAME = 'sitePermissions';
12
-
13
-    /**
14
-     * @var FeatureFlags
15
-     */
16
-    private $feature_flags;
17
-
18
-
19
-    /**
20
-     * @param FeatureFlags          $feature_flags
21
-     * @param JsonDataNodeValidator $validator
22
-     */
23
-    public function __construct(FeatureFlags $feature_flags, JsonDataNodeValidator $validator)
24
-    {
25
-        $this->feature_flags = $feature_flags;
26
-        parent::__construct($validator);
27
-        $this->setNodeName(SitePermissions::NODE_NAME);
28
-    }
29
-
30
-
31
-    /**
32
-     * @inheritDoc
33
-     */
34
-    public function initialize()
35
-    {
36
-        $this->setDataArray($this->feature_flags->getAllowedFeatures());
37
-    }
11
+	const NODE_NAME = 'sitePermissions';
12
+
13
+	/**
14
+	 * @var FeatureFlags
15
+	 */
16
+	private $feature_flags;
17
+
18
+
19
+	/**
20
+	 * @param FeatureFlags          $feature_flags
21
+	 * @param JsonDataNodeValidator $validator
22
+	 */
23
+	public function __construct(FeatureFlags $feature_flags, JsonDataNodeValidator $validator)
24
+	{
25
+		$this->feature_flags = $feature_flags;
26
+		parent::__construct($validator);
27
+		$this->setNodeName(SitePermissions::NODE_NAME);
28
+	}
29
+
30
+
31
+	/**
32
+	 * @inheritDoc
33
+	 */
34
+	public function initialize()
35
+	{
36
+		$this->setDataArray($this->feature_flags->getAllowedFeatures());
37
+	}
38 38
 }
Please login to merge, or discard this patch.
core/db_models/EEM_Datetime.model.php 2 patches
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
                 ),
122 122
             ],
123 123
         ];
124
-        $this->_model_relations        = [
124
+        $this->_model_relations = [
125 125
             'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
126 126
             'Event'           => new EE_Belongs_To_Relation(),
127 127
             'Checkin'         => new EE_Has_Many_Relation(),
@@ -131,19 +131,19 @@  discard block
 block discarded – undo
131 131
         $this->model_chain_to_password = $path_to_event_model;
132 132
         $this->_model_chain_to_wp_user = $path_to_event_model;
133 133
         // this model is generally available for reading
134
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
134
+        $this->_cap_restriction_generators[EEM_Base::caps_read] =
135 135
             new EE_Restriction_Generator_Event_Related_Public(
136 136
                 $path_to_event_model
137 137
             );
138
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
138
+        $this->_cap_restriction_generators[EEM_Base::caps_read_admin] =
139 139
             new EE_Restriction_Generator_Event_Related_Protected(
140 140
                 $path_to_event_model
141 141
             );
142
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
142
+        $this->_cap_restriction_generators[EEM_Base::caps_edit] =
143 143
             new EE_Restriction_Generator_Event_Related_Protected(
144 144
                 $path_to_event_model
145 145
             );
146
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
146
+        $this->_cap_restriction_generators[EEM_Base::caps_delete] =
147 147
             new EE_Restriction_Generator_Event_Related_Protected(
148 148
                 $path_to_event_model,
149 149
                 EEM_Base::caps_edit
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
          * @param int $end_data Unix timestamp representing now + 30 days in seconds.
186 186
          * @return int Unix timestamp
187 187
          */
188
-        $end_date       = apply_filters(
188
+        $end_date = apply_filters(
189 189
             'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
190 190
             $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
191 191
         );
@@ -251,10 +251,10 @@  discard block
 block discarded – undo
251 251
      */
252 252
     private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
253 253
     {
254
-        if (! is_array($start_time)) {
254
+        if ( ! is_array($start_time)) {
255 255
             throw new InvalidDataTypeException('start_time', $start_time, 'array');
256 256
         }
257
-        if (! is_array($end_time)) {
257
+        if ( ! is_array($end_time)) {
258 258
             throw new InvalidDataTypeException('end_time', $end_time, 'array');
259 259
         }
260 260
         if (count($start_time) !== 2) {
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
      */
290 290
     public function get_all_event_dates($EVT_ID = 0)
291 291
     {
292
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
292
+        if ( ! $EVT_ID) { // on add_new_event event_id gets set to 0
293 293
             return $this->create_new_blank_datetime();
294 294
         }
295 295
         $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
             $query_params,
427 427
             EEM_Base::default_where_conditions_this_only
428 428
         );
429
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
429
+        $query_params = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
430 430
         return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
431 431
     }
432 432
 
@@ -587,14 +587,14 @@  discard block
 block discarded – undo
587 587
         $query_params['group_by'] = ['dtt_year', 'dtt_month'];
588 588
         $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
589 589
 
590
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
590
+        $query_interval = EEH_DTT_Helper::get_sql_query_interval_for_offset(
591 591
             $this->get_timezone(),
592 592
             'DTT_EVT_start'
593 593
         );
594 594
         $columns_to_select = [
595
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
596
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
597
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
595
+            'dtt_year'      => ['YEAR('.$query_interval.')', '%s'],
596
+            'dtt_month'     => ['MONTHNAME('.$query_interval.')', '%s'],
597
+            'dtt_month_num' => ['MONTH('.$query_interval.')', '%s'],
598 598
         ];
599 599
         return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
600 600
     }
@@ -676,17 +676,17 @@  discard block
 block discarded – undo
676 676
                 ['DTT_EVT_end' => ['<', time()]]
677 677
             ),
678 678
         ];
679
-        if (! empty($stati_to_include)) {
679
+        if ( ! empty($stati_to_include)) {
680 680
             foreach (array_keys($status_query_args) as $status) {
681
-                if (! in_array($status, $stati_to_include, true)) {
682
-                    unset($status_query_args[ $status ]);
681
+                if ( ! in_array($status, $stati_to_include, true)) {
682
+                    unset($status_query_args[$status]);
683 683
                 }
684 684
             }
685 685
         }
686 686
         // loop through and query counts for each stati.
687 687
         $status_query_results = [];
688 688
         foreach ($status_query_args as $status => $status_where_conditions) {
689
-            $status_query_results[ $status ] = EEM_Datetime::count(
689
+            $status_query_results[$status] = EEM_Datetime::count(
690 690
                 [$status_where_conditions],
691 691
                 'DTT_ID',
692 692
                 true
@@ -707,7 +707,7 @@  discard block
 block discarded – undo
707 707
     public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
708 708
     {
709 709
         $count = $this->get_datetime_counts_by_status([$status], $query_params);
710
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
710
+        return ! empty($count[$status]) ? $count[$status] : 0;
711 711
     }
712 712
 
713 713
 
@@ -806,7 +806,7 @@  discard block
 block discarded – undo
806 806
      */
807 807
     private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
808 808
     {
809
-        if (! $include_expired) {
809
+        if ( ! $include_expired) {
810 810
             $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
811 811
         }
812 812
         return $where_params;
Please login to merge, or discard this patch.
Indentation   +838 added lines, -838 removed lines patch added patch discarded remove patch
@@ -16,842 +16,842 @@
 block discarded – undo
16 16
  */
17 17
 class EEM_Datetime extends EEM_Soft_Delete_Base
18 18
 {
19
-    /**
20
-     * @var EEM_Datetime $_instance
21
-     */
22
-    protected static $_instance;
23
-
24
-
25
-    /**
26
-     * private constructor to prevent direct creation
27
-     *
28
-     * @param string $timezone A string representing the timezone we want to set for returned Date Time Strings
29
-     *                         (and any incoming timezone data that gets saved).
30
-     *                         Note this just sends the timezone info to the date time model field objects.
31
-     *                         Default is NULL
32
-     *                         (and will be assumed using the set timezone in the 'timezone_string' wp option)
33
-     * @throws EE_Error
34
-     * @throws InvalidArgumentException
35
-     * @throws InvalidArgumentException
36
-     */
37
-    protected function __construct($timezone)
38
-    {
39
-        $this->singular_item           = esc_html__('Datetime', 'event_espresso');
40
-        $this->plural_item             = esc_html__('Datetimes', 'event_espresso');
41
-        $this->_tables                 = [
42
-            'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
43
-        ];
44
-        $this->_fields                 = [
45
-            'Datetime' => [
46
-                'DTT_ID'          => new EE_Primary_Key_Int_Field(
47
-                    'DTT_ID',
48
-                    esc_html__('Datetime ID', 'event_espresso')
49
-                ),
50
-                'EVT_ID'          => new EE_Foreign_Key_Int_Field(
51
-                    'EVT_ID',
52
-                    esc_html__('Event ID', 'event_espresso'),
53
-                    false,
54
-                    0,
55
-                    'Event'
56
-                ),
57
-                'VNU_ID' => new EE_Foreign_Key_Int_Field(
58
-                    'VNU_ID',
59
-                    __('Venue ID', 'event_espresso'),
60
-                    false,
61
-                    0,
62
-                    'Venue'
63
-                ),
64
-                'DTT_name'        => new EE_Plain_Text_Field(
65
-                    'DTT_name',
66
-                    esc_html__('Datetime Name', 'event_espresso'),
67
-                    false,
68
-                    ''
69
-                ),
70
-                'DTT_description' => new EE_Post_Content_Field(
71
-                    'DTT_description',
72
-                    esc_html__('Description for Datetime', 'event_espresso'),
73
-                    false,
74
-                    ''
75
-                ),
76
-                'DTT_EVT_start'   => new EE_Datetime_Field(
77
-                    'DTT_EVT_start',
78
-                    esc_html__('Start time/date of Event', 'event_espresso'),
79
-                    false,
80
-                    EE_Datetime_Field::now,
81
-                    $timezone
82
-                ),
83
-                'DTT_EVT_end'     => new EE_Datetime_Field(
84
-                    'DTT_EVT_end',
85
-                    esc_html__('End time/date of Event', 'event_espresso'),
86
-                    false,
87
-                    EE_Datetime_Field::now,
88
-                    $timezone
89
-                ),
90
-                'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
91
-                    'DTT_reg_limit',
92
-                    esc_html__('Registration Limit for this time', 'event_espresso'),
93
-                    true,
94
-                    EE_INF
95
-                ),
96
-                'DTT_sold'        => new EE_Integer_Field(
97
-                    'DTT_sold',
98
-                    esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
99
-                    true,
100
-                    0
101
-                ),
102
-                'DTT_reserved'    => new EE_Integer_Field(
103
-                    'DTT_reserved',
104
-                    esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
105
-                    false,
106
-                    0
107
-                ),
108
-                'DTT_is_primary'  => new EE_Boolean_Field(
109
-                    'DTT_is_primary',
110
-                    esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
111
-                    false,
112
-                    false
113
-                ),
114
-                'DTT_order'       => new EE_Integer_Field(
115
-                    'DTT_order',
116
-                    esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
117
-                    false,
118
-                    0
119
-                ),
120
-                'DTT_parent'      => new EE_Integer_Field(
121
-                    'DTT_parent',
122
-                    esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
123
-                    true,
124
-                    0
125
-                ),
126
-                'DTT_deleted'     => new EE_Trashed_Flag_Field(
127
-                    'DTT_deleted',
128
-                    esc_html__('Flag indicating datetime is archived', 'event_espresso'),
129
-                    false,
130
-                    false
131
-                ),
132
-            ],
133
-        ];
134
-        $this->_model_relations        = [
135
-            'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
136
-            'Event'           => new EE_Belongs_To_Relation(),
137
-            'Checkin'         => new EE_Has_Many_Relation(),
138
-            'Datetime_Ticket' => new EE_Has_Many_Relation(),
139
-            'Venue'           => new EE_Belongs_To_Relation(),
140
-        ];
141
-        $path_to_event_model           = 'Event';
142
-        $this->model_chain_to_password = $path_to_event_model;
143
-        $this->_model_chain_to_wp_user = $path_to_event_model;
144
-        // this model is generally available for reading
145
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
146
-            new EE_Restriction_Generator_Event_Related_Public(
147
-                $path_to_event_model
148
-            );
149
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
150
-            new EE_Restriction_Generator_Event_Related_Protected(
151
-                $path_to_event_model
152
-            );
153
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
154
-            new EE_Restriction_Generator_Event_Related_Protected(
155
-                $path_to_event_model
156
-            );
157
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
158
-            new EE_Restriction_Generator_Event_Related_Protected(
159
-                $path_to_event_model,
160
-                EEM_Base::caps_edit
161
-            );
162
-        parent::__construct($timezone);
163
-    }
164
-
165
-
166
-    /**
167
-     * create new blank datetime
168
-     *
169
-     * @access public
170
-     * @return EE_Datetime[] array on success, FALSE on fail
171
-     * @throws EE_Error
172
-     * @throws InvalidArgumentException
173
-     * @throws InvalidDataTypeException
174
-     * @throws ReflectionException
175
-     * @throws InvalidInterfaceException
176
-     */
177
-    public function create_new_blank_datetime()
178
-    {
179
-        // makes sure timezone is always set.
180
-        $timezone_string = $this->get_timezone();
181
-        /**
182
-         * Filters the initial start date for the new datetime.
183
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
184
-         *
185
-         * @param int $start_date Unix timestamp representing now + 30 days in seconds.
186
-         * @return int Unix timestamp
187
-         */
188
-        $start_date = apply_filters(
189
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
190
-            $this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
191
-        );
192
-        /**
193
-         * Filters the initial end date for the new datetime.
194
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
195
-         *
196
-         * @param int $end_data Unix timestamp representing now + 30 days in seconds.
197
-         * @return int Unix timestamp
198
-         */
199
-        $end_date       = apply_filters(
200
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
201
-            $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
202
-        );
203
-        $blank_datetime = EE_Datetime::new_instance(
204
-            [
205
-                'DTT_EVT_start' => $start_date,
206
-                'DTT_EVT_end'   => $end_date,
207
-                'DTT_order'     => 1,
208
-                'DTT_reg_limit' => EE_INF,
209
-            ],
210
-            $timezone_string
211
-        );
212
-        /**
213
-         * Filters the initial start time and format for the new EE_Datetime instance.
214
-         *
215
-         * @param array $start_time An array having size 2.  First element is the time, second element is the time
216
-         *                          format.
217
-         * @return array
218
-         */
219
-        $start_time = apply_filters(
220
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
221
-            ['8am', 'ga']
222
-        );
223
-        /**
224
-         * Filters the initial end time and format for the new EE_Datetime instance.
225
-         *
226
-         * @param array $end_time An array having size 2.  First element is the time, second element is the time
227
-         *                        format
228
-         * @return array
229
-         */
230
-        $end_time = apply_filters(
231
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
232
-            ['5pm', 'ga']
233
-        );
234
-        $this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
235
-        $blank_datetime->set_start_time(
236
-            $this->convert_datetime_for_query(
237
-                'DTT_EVT_start',
238
-                $start_time[0],
239
-                $start_time[1],
240
-                $timezone_string
241
-            )
242
-        );
243
-        $blank_datetime->set_end_time(
244
-            $this->convert_datetime_for_query(
245
-                'DTT_EVT_end',
246
-                $end_time[0],
247
-                $end_time[1],
248
-                $timezone_string
249
-            )
250
-        );
251
-        return [$blank_datetime];
252
-    }
253
-
254
-
255
-    /**
256
-     * Validates whether the start_time and end_time are in the expected format.
257
-     *
258
-     * @param array $start_time
259
-     * @param array $end_time
260
-     * @throws InvalidArgumentException
261
-     * @throws InvalidDataTypeException
262
-     */
263
-    private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
264
-    {
265
-        if (! is_array($start_time)) {
266
-            throw new InvalidDataTypeException('start_time', $start_time, 'array');
267
-        }
268
-        if (! is_array($end_time)) {
269
-            throw new InvalidDataTypeException('end_time', $end_time, 'array');
270
-        }
271
-        if (count($start_time) !== 2) {
272
-            throw new InvalidArgumentException(
273
-                sprintf(
274
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
275
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
276
-                    '$start_time'
277
-                )
278
-            );
279
-        }
280
-        if (count($end_time) !== 2) {
281
-            throw new InvalidArgumentException(
282
-                sprintf(
283
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
284
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
285
-                    '$end_time'
286
-                )
287
-            );
288
-        }
289
-    }
290
-
291
-
292
-    /**
293
-     * get event start date from db
294
-     *
295
-     * @access public
296
-     * @param int $EVT_ID
297
-     * @return EE_Datetime[] array on success, FALSE on fail
298
-     * @throws EE_Error
299
-     * @throws ReflectionException
300
-     */
301
-    public function get_all_event_dates($EVT_ID = 0)
302
-    {
303
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
304
-            return $this->create_new_blank_datetime();
305
-        }
306
-        $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
307
-        if (empty($results)) {
308
-            return $this->create_new_blank_datetime();
309
-        }
310
-        return $results;
311
-    }
312
-
313
-
314
-    /**
315
-     * get all datetimes attached to an event ordered by the DTT_order field
316
-     *
317
-     * @public
318
-     * @param int     $EVT_ID     event id
319
-     * @param boolean $include_expired
320
-     * @param boolean $include_deleted
321
-     * @param int     $limit      If included then limit the count of results by
322
-     *                            the given number
323
-     * @return EE_Datetime[]
324
-     * @throws EE_Error
325
-     */
326
-    public function get_datetimes_for_event_ordered_by_DTT_order(
327
-        int $EVT_ID,
328
-        bool $include_expired = true,
329
-        bool $include_deleted = true,
330
-        $limit = 0
331
-    ) {
332
-        $prev_data_prep_value = $this->prepModelForQuery();
333
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
334
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
335
-        $query_params         = $this->addDefaultWhereConditions($query_params);
336
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
337
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
338
-    }
339
-
340
-
341
-    /**
342
-     * Gets the datetimes for the event (with the given limit), and orders them by "importance".
343
-     * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
344
-     * and then the earlier datetimes are the most important.
345
-     * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
346
-     *
347
-     * @param int $EVT_ID
348
-     * @param int $limit
349
-     * @return EE_Datetime[]|EE_Base_Class[]
350
-     * @throws EE_Error
351
-     */
352
-    public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
353
-    {
354
-        $query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
355
-        $query_params    = $this->addDefaultWhereConditions($query_params);
356
-        $query_params    = $this->addDefaultQueryParams($query_params, $limit);
357
-        return $this->get_all($query_params);
358
-    }
359
-
360
-
361
-    /**
362
-     * @param int     $EVT_ID
363
-     * @param boolean $include_expired
364
-     * @param boolean $include_deleted
365
-     * @return EE_Datetime
366
-     * @throws EE_Error
367
-     */
368
-    public function get_oldest_datetime_for_event(
369
-        int $EVT_ID,
370
-        bool $include_expired = false,
371
-        bool $include_deleted = false
372
-    ) {
373
-        $results = $this->get_datetimes_for_event_ordered_by_start_time(
374
-            $EVT_ID,
375
-            $include_expired,
376
-            $include_deleted,
377
-            1
378
-        );
379
-        if ($results) {
380
-            return array_shift($results);
381
-        }
382
-        return null;
383
-    }
384
-
385
-
386
-    /**
387
-     * Gets the 'primary' datetime for an event.
388
-     *
389
-     * @param int  $EVT_ID
390
-     * @param bool $try_to_exclude_expired
391
-     * @param bool $try_to_exclude_deleted
392
-     * @return EE_Datetime
393
-     * @throws EE_Error
394
-     */
395
-    public function get_primary_datetime_for_event(
396
-        int $EVT_ID,
397
-        bool $try_to_exclude_expired = true,
398
-        bool $try_to_exclude_deleted = true
399
-    ) {
400
-        if ($try_to_exclude_expired) {
401
-            $non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
402
-            if ($non_expired) {
403
-                return $non_expired;
404
-            }
405
-        }
406
-        if ($try_to_exclude_deleted) {
407
-            $expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
408
-            if ($expired_even) {
409
-                return $expired_even;
410
-            }
411
-        }
412
-        return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
413
-    }
414
-
415
-
416
-    /**
417
-     * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
418
-     * only by start date
419
-     *
420
-     * @param int     $EVT_ID
421
-     * @param boolean $include_expired
422
-     * @param boolean $include_deleted
423
-     * @param int     $limit
424
-     * @return EE_Datetime[]
425
-     * @throws EE_Error
426
-     */
427
-    public function get_datetimes_for_event_ordered_by_start_time(
428
-        int $EVT_ID,
429
-        bool $include_expired = true,
430
-        bool $include_deleted = true,
431
-        $limit = 0
432
-    ) {
433
-        $prev_data_prep_value = $this->prepModelForQuery();
434
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
435
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
436
-        $query_params         = $this->addDefaultWhereConditions(
437
-            $query_params,
438
-            EEM_Base::default_where_conditions_this_only
439
-        );
440
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
441
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
442
-    }
443
-
444
-
445
-    /**
446
-     * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
447
-     * only by start date
448
-     *
449
-     * @param int     $TKT_ID
450
-     * @param boolean $include_expired
451
-     * @param boolean $include_deleted
452
-     * @param int     $limit
453
-     * @return EE_Datetime[]
454
-     * @throws EE_Error
455
-     */
456
-    public function get_datetimes_for_ticket_ordered_by_start_time(
457
-        int $TKT_ID,
458
-        bool $include_expired = true,
459
-        bool $include_deleted = true,
460
-        $limit = 0
461
-    ) {
462
-        $prev_data_prep_value = $this->prepModelForQuery();
463
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
464
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
465
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit);
466
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
467
-    }
468
-
469
-
470
-    /**
471
-     * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
472
-     * datetimes.
473
-     *
474
-     * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
475
-     * @param boolean  $include_expired  whether to include expired datetimes or not
476
-     * @param boolean  $include_deleted  whether to include trashed datetimes or not.
477
-     * @param int|null $limit            if null, no limit, if int then limit results by
478
-     *                                   that number
479
-     * @return EE_Datetime[]
480
-     * @throws EE_Error
481
-     */
482
-    public function get_datetimes_for_ticket_ordered_by_DTT_order(
483
-        int $TKT_ID,
484
-        bool $include_expired = true,
485
-        bool $include_deleted = true,
486
-        $limit = 0
487
-    ) {
488
-        $prev_data_prep_value = $this->prepModelForQuery();
489
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
490
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
491
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
492
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
493
-    }
494
-
495
-
496
-    /**
497
-     * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
498
-     * reason it doesn't exist, we consider the earliest event the most important)
499
-     *
500
-     * @param int $EVT_ID
501
-     * @return EE_Datetime
502
-     * @throws EE_Error
503
-     */
504
-    public function get_most_important_datetime_for_event(int $EVT_ID)
505
-    {
506
-        $results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
507
-        if ($results) {
508
-            return array_shift($results);
509
-        }
510
-        return null;
511
-    }
512
-
513
-
514
-    /**
515
-     * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
516
-     * grouped by month and year.
517
-     *
518
-     * @param array  $where_params       @see
519
-     *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
520
-     * @param string $evt_active_status  A string representing the evt active status to filter the months by.
521
-     *                                   Can be:
522
-     *                                   - '' = no filter
523
-     *                                   - upcoming = Published events with at least one upcoming datetime.
524
-     *                                   - expired = Events with all datetimes expired.
525
-     *                                   - active = Events that are published and have at least one datetime that
526
-     *                                   starts before now and ends after now.
527
-     *                                   - inactive = Events that are either not published.
528
-     * @return stdClass[]
529
-     * @throws EE_Error
530
-     * @throws InvalidArgumentException
531
-     * @throws InvalidArgumentException
532
-     */
533
-    public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
534
-    {
535
-        $current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
536
-        $current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
537
-        switch ($evt_active_status) {
538
-            case 'upcoming':
539
-                $where_params['Event.status'] = 'publish';
540
-                // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
541
-                if (isset($where_params['DTT_EVT_start'])) {
542
-                    $where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
543
-                }
544
-                $where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
545
-                break;
546
-            case 'expired':
547
-                if (isset($where_params['Event.status'])) {
548
-                    unset($where_params['Event.status']);
549
-                }
550
-                // get events to exclude
551
-                $exclude_query[0] = array_merge(
552
-                    $where_params,
553
-                    ['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
554
-                );
555
-                // first get all events that have datetimes where its not expired.
556
-                $event_ids = $this->_get_all_wpdb_results(
557
-                    $exclude_query,
558
-                    OBJECT_K,
559
-                    'Datetime.EVT_ID'
560
-                );
561
-                $event_ids = array_keys($event_ids);
562
-                if (isset($where_params['DTT_EVT_end'])) {
563
-                    $where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
564
-                }
565
-                $where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
566
-                $where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
567
-                break;
568
-            case 'active':
569
-                $where_params['Event.status'] = 'publish';
570
-                if (isset($where_params['DTT_EVT_start'])) {
571
-                    $where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
572
-                }
573
-                if (isset($where_params['Datetime.DTT_EVT_end'])) {
574
-                    $where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
575
-                }
576
-                $where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
577
-                $where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
578
-                break;
579
-            case 'inactive':
580
-                if (isset($where_params['Event.status'])) {
581
-                    unset($where_params['Event.status']);
582
-                }
583
-                if (isset($where_params['OR'])) {
584
-                    $where_params['AND']['OR'] = $where_params['OR'];
585
-                }
586
-                if (isset($where_params['DTT_EVT_end'])) {
587
-                    $where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
588
-                    unset($where_params['DTT_EVT_end']);
589
-                }
590
-                if (isset($where_params['DTT_EVT_start'])) {
591
-                    $where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
592
-                    unset($where_params['DTT_EVT_start']);
593
-                }
594
-                $where_params['AND']['Event.status'] = ['!=', 'publish'];
595
-                break;
596
-        }
597
-        $query_params[0]          = $where_params;
598
-        $query_params['group_by'] = ['dtt_year', 'dtt_month'];
599
-        $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
600
-
601
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
602
-            $this->get_timezone(),
603
-            'DTT_EVT_start'
604
-        );
605
-        $columns_to_select = [
606
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
607
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
608
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
609
-        ];
610
-        return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
611
-    }
612
-
613
-
614
-    /**
615
-     * Updates the DTT_sold attribute on each datetime (based on the registrations
616
-     * for the tickets for each datetime)
617
-     *
618
-     * @param EE_Base_Class[]|EE_Datetime[] $datetimes
619
-     * @throws EE_Error
620
-     * @throws ReflectionException
621
-     */
622
-    public function update_sold(array $datetimes)
623
-    {
624
-        EE_Error::doing_it_wrong(
625
-            __FUNCTION__,
626
-            esc_html__(
627
-                'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
628
-                'event_espresso'
629
-            ),
630
-            '4.9.32.rc.005'
631
-        );
632
-        foreach ($datetimes as $datetime) {
633
-            $datetime->update_sold();
634
-        }
635
-    }
636
-
637
-
638
-    /**
639
-     *    Gets the total number of tickets available at a particular datetime
640
-     *    (does NOT take into account the datetime's spaces available)
641
-     *
642
-     * @param int   $DTT_ID
643
-     * @param array $query_params
644
-     * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
645
-     *             tickets attached to datetime then FALSE is returned.
646
-     * @throws EE_Error
647
-     * @throws ReflectionException
648
-     */
649
-    public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
650
-    {
651
-        $datetime = $this->get_one_by_ID($DTT_ID);
652
-        if ($datetime instanceof EE_Datetime) {
653
-            return $datetime->tickets_remaining($query_params);
654
-        }
655
-        return 0;
656
-    }
657
-
658
-
659
-    /**
660
-     * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
661
-     *
662
-     * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
663
-     *                                 stati you want counts for as values in the array.  An empty array returns counts
664
-     *                                 for all valid stati.
665
-     * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
666
-     *                                 only for Datetimes connected to a specific event, or specific ticket.
667
-     * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
668
-     * @throws EE_Error
669
-     *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
670
-     *                                 EE_Datetime::expired
671
-     */
672
-    public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
673
-    {
674
-        // only accept where conditions for this query.
675
-        $_where            = isset($query_params[0]) ? $query_params[0] : [];
676
-        $status_query_args = [
677
-            EE_Datetime::active   => array_merge(
678
-                $_where,
679
-                ['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
680
-            ),
681
-            EE_Datetime::upcoming => array_merge(
682
-                $_where,
683
-                ['DTT_EVT_start' => ['>', time()]]
684
-            ),
685
-            EE_Datetime::expired  => array_merge(
686
-                $_where,
687
-                ['DTT_EVT_end' => ['<', time()]]
688
-            ),
689
-        ];
690
-        if (! empty($stati_to_include)) {
691
-            foreach (array_keys($status_query_args) as $status) {
692
-                if (! in_array($status, $stati_to_include, true)) {
693
-                    unset($status_query_args[ $status ]);
694
-                }
695
-            }
696
-        }
697
-        // loop through and query counts for each stati.
698
-        $status_query_results = [];
699
-        foreach ($status_query_args as $status => $status_where_conditions) {
700
-            $status_query_results[ $status ] = EEM_Datetime::count(
701
-                [$status_where_conditions],
702
-                'DTT_ID',
703
-                true
704
-            );
705
-        }
706
-        return $status_query_results;
707
-    }
708
-
709
-
710
-    /**
711
-     * Returns the specific count for a given Datetime status matching any given query_params.
712
-     *
713
-     * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
714
-     * @param array  $query_params
715
-     * @return int
716
-     * @throws EE_Error
717
-     */
718
-    public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
719
-    {
720
-        $count = $this->get_datetime_counts_by_status([$status], $query_params);
721
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
722
-    }
723
-
724
-
725
-    /**
726
-     * @return bool|int
727
-     * @since   5.0.0.p
728
-     */
729
-    private function prepModelForQuery()
730
-    {
731
-        $prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
732
-        $this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
733
-        return $prev_data_prep_value;
734
-    }
735
-
736
-
737
-    /**
738
-     * @param array    $query_params
739
-     * @param bool|int $prev_data_prep_value
740
-     * @return EE_Base_Class[]|EE_Datetime[]
741
-     * @throws EE_Error
742
-     * @since   5.0.0.p
743
-     */
744
-    private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
745
-    {
746
-        $result = $this->get_all($query_params);
747
-        $this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
748
-        return $result;
749
-    }
750
-
751
-
752
-    /**
753
-     * @param array  $query_params
754
-     * @param int    $limit
755
-     * @param string $order_by
756
-     * @param string $order
757
-     * @return array
758
-     * @since   5.0.0.p
759
-     */
760
-    private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
761
-    {
762
-        $query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
763
-        $query_params = $this->addLimitQueryParams($query_params, $limit);
764
-        return $query_params;
765
-    }
766
-
767
-
768
-    /**
769
-     * @param array  $query_params
770
-     * @param string $default_where_conditions
771
-     * @return array
772
-     * @since   5.0.0.p
773
-     */
774
-    private function addDefaultWhereConditions(
775
-        array $query_params,
776
-        $default_where_conditions = EEM_Base::default_where_conditions_none
777
-    ) {
778
-        $query_params['default_where_conditions'] = $default_where_conditions;
779
-        return $query_params;
780
-    }
781
-
782
-
783
-    /**
784
-     * @param array $where_params
785
-     * @param bool  $include_deleted
786
-     * @param bool  $include_expired
787
-     * @return array
788
-     * @since   5.0.0.p
789
-     */
790
-    private function addDefaultWhereParams(array $where_params, bool $include_deleted = true, bool $include_expired = true)
791
-    {
792
-        $where_params = $this->addExpiredWhereParams($where_params, $include_expired);
793
-        $where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
794
-        return $where_params;
795
-    }
796
-
797
-
798
-    /**
799
-     * @param array $where_params
800
-     * @param bool  $include_deleted
801
-     * @return array
802
-     * @since   5.0.0.p
803
-     */
804
-    private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
805
-    {
806
-        $deleted                     = $include_deleted ? [true, false] : [false];
807
-        $where_params['DTT_deleted'] = ['IN', $deleted];
808
-        return $where_params;
809
-    }
810
-
811
-
812
-    /**
813
-     * @param array $where_params
814
-     * @param bool  $include_expired
815
-     * @return array
816
-     * @since   5.0.0.p
817
-     */
818
-    private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
819
-    {
820
-        if (! $include_expired) {
821
-            $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
822
-        }
823
-        return $where_params;
824
-    }
825
-
826
-
827
-    /**
828
-     * @param array $query_params
829
-     * @param int   $limit
830
-     * @return array
831
-     * @since   5.0.0.p
832
-     */
833
-    private function addLimitQueryParams(array $query_params, $limit = 0)
834
-    {
835
-        if ($limit) {
836
-            $query_params['limit'] = $limit;
837
-        }
838
-        return $query_params;
839
-    }
840
-
841
-
842
-    /**
843
-     * @param array  $query_params
844
-     * @param string $order_by
845
-     * @param string $order
846
-     * @return array
847
-     * @since   5.0.0.p
848
-     */
849
-    private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
850
-    {
851
-        $order                    = $order === 'ASC' ? 'ASC' : 'DESC';
852
-        $valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
853
-        $order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
854
-        $query_params['order_by'] = [$order_by => $order];
855
-        return $query_params;
856
-    }
19
+	/**
20
+	 * @var EEM_Datetime $_instance
21
+	 */
22
+	protected static $_instance;
23
+
24
+
25
+	/**
26
+	 * private constructor to prevent direct creation
27
+	 *
28
+	 * @param string $timezone A string representing the timezone we want to set for returned Date Time Strings
29
+	 *                         (and any incoming timezone data that gets saved).
30
+	 *                         Note this just sends the timezone info to the date time model field objects.
31
+	 *                         Default is NULL
32
+	 *                         (and will be assumed using the set timezone in the 'timezone_string' wp option)
33
+	 * @throws EE_Error
34
+	 * @throws InvalidArgumentException
35
+	 * @throws InvalidArgumentException
36
+	 */
37
+	protected function __construct($timezone)
38
+	{
39
+		$this->singular_item           = esc_html__('Datetime', 'event_espresso');
40
+		$this->plural_item             = esc_html__('Datetimes', 'event_espresso');
41
+		$this->_tables                 = [
42
+			'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
43
+		];
44
+		$this->_fields                 = [
45
+			'Datetime' => [
46
+				'DTT_ID'          => new EE_Primary_Key_Int_Field(
47
+					'DTT_ID',
48
+					esc_html__('Datetime ID', 'event_espresso')
49
+				),
50
+				'EVT_ID'          => new EE_Foreign_Key_Int_Field(
51
+					'EVT_ID',
52
+					esc_html__('Event ID', 'event_espresso'),
53
+					false,
54
+					0,
55
+					'Event'
56
+				),
57
+				'VNU_ID' => new EE_Foreign_Key_Int_Field(
58
+					'VNU_ID',
59
+					__('Venue ID', 'event_espresso'),
60
+					false,
61
+					0,
62
+					'Venue'
63
+				),
64
+				'DTT_name'        => new EE_Plain_Text_Field(
65
+					'DTT_name',
66
+					esc_html__('Datetime Name', 'event_espresso'),
67
+					false,
68
+					''
69
+				),
70
+				'DTT_description' => new EE_Post_Content_Field(
71
+					'DTT_description',
72
+					esc_html__('Description for Datetime', 'event_espresso'),
73
+					false,
74
+					''
75
+				),
76
+				'DTT_EVT_start'   => new EE_Datetime_Field(
77
+					'DTT_EVT_start',
78
+					esc_html__('Start time/date of Event', 'event_espresso'),
79
+					false,
80
+					EE_Datetime_Field::now,
81
+					$timezone
82
+				),
83
+				'DTT_EVT_end'     => new EE_Datetime_Field(
84
+					'DTT_EVT_end',
85
+					esc_html__('End time/date of Event', 'event_espresso'),
86
+					false,
87
+					EE_Datetime_Field::now,
88
+					$timezone
89
+				),
90
+				'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
91
+					'DTT_reg_limit',
92
+					esc_html__('Registration Limit for this time', 'event_espresso'),
93
+					true,
94
+					EE_INF
95
+				),
96
+				'DTT_sold'        => new EE_Integer_Field(
97
+					'DTT_sold',
98
+					esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
99
+					true,
100
+					0
101
+				),
102
+				'DTT_reserved'    => new EE_Integer_Field(
103
+					'DTT_reserved',
104
+					esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
105
+					false,
106
+					0
107
+				),
108
+				'DTT_is_primary'  => new EE_Boolean_Field(
109
+					'DTT_is_primary',
110
+					esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
111
+					false,
112
+					false
113
+				),
114
+				'DTT_order'       => new EE_Integer_Field(
115
+					'DTT_order',
116
+					esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
117
+					false,
118
+					0
119
+				),
120
+				'DTT_parent'      => new EE_Integer_Field(
121
+					'DTT_parent',
122
+					esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
123
+					true,
124
+					0
125
+				),
126
+				'DTT_deleted'     => new EE_Trashed_Flag_Field(
127
+					'DTT_deleted',
128
+					esc_html__('Flag indicating datetime is archived', 'event_espresso'),
129
+					false,
130
+					false
131
+				),
132
+			],
133
+		];
134
+		$this->_model_relations        = [
135
+			'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
136
+			'Event'           => new EE_Belongs_To_Relation(),
137
+			'Checkin'         => new EE_Has_Many_Relation(),
138
+			'Datetime_Ticket' => new EE_Has_Many_Relation(),
139
+			'Venue'           => new EE_Belongs_To_Relation(),
140
+		];
141
+		$path_to_event_model           = 'Event';
142
+		$this->model_chain_to_password = $path_to_event_model;
143
+		$this->_model_chain_to_wp_user = $path_to_event_model;
144
+		// this model is generally available for reading
145
+		$this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
146
+			new EE_Restriction_Generator_Event_Related_Public(
147
+				$path_to_event_model
148
+			);
149
+		$this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
150
+			new EE_Restriction_Generator_Event_Related_Protected(
151
+				$path_to_event_model
152
+			);
153
+		$this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
154
+			new EE_Restriction_Generator_Event_Related_Protected(
155
+				$path_to_event_model
156
+			);
157
+		$this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
158
+			new EE_Restriction_Generator_Event_Related_Protected(
159
+				$path_to_event_model,
160
+				EEM_Base::caps_edit
161
+			);
162
+		parent::__construct($timezone);
163
+	}
164
+
165
+
166
+	/**
167
+	 * create new blank datetime
168
+	 *
169
+	 * @access public
170
+	 * @return EE_Datetime[] array on success, FALSE on fail
171
+	 * @throws EE_Error
172
+	 * @throws InvalidArgumentException
173
+	 * @throws InvalidDataTypeException
174
+	 * @throws ReflectionException
175
+	 * @throws InvalidInterfaceException
176
+	 */
177
+	public function create_new_blank_datetime()
178
+	{
179
+		// makes sure timezone is always set.
180
+		$timezone_string = $this->get_timezone();
181
+		/**
182
+		 * Filters the initial start date for the new datetime.
183
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
184
+		 *
185
+		 * @param int $start_date Unix timestamp representing now + 30 days in seconds.
186
+		 * @return int Unix timestamp
187
+		 */
188
+		$start_date = apply_filters(
189
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
190
+			$this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
191
+		);
192
+		/**
193
+		 * Filters the initial end date for the new datetime.
194
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
195
+		 *
196
+		 * @param int $end_data Unix timestamp representing now + 30 days in seconds.
197
+		 * @return int Unix timestamp
198
+		 */
199
+		$end_date       = apply_filters(
200
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
201
+			$this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
202
+		);
203
+		$blank_datetime = EE_Datetime::new_instance(
204
+			[
205
+				'DTT_EVT_start' => $start_date,
206
+				'DTT_EVT_end'   => $end_date,
207
+				'DTT_order'     => 1,
208
+				'DTT_reg_limit' => EE_INF,
209
+			],
210
+			$timezone_string
211
+		);
212
+		/**
213
+		 * Filters the initial start time and format for the new EE_Datetime instance.
214
+		 *
215
+		 * @param array $start_time An array having size 2.  First element is the time, second element is the time
216
+		 *                          format.
217
+		 * @return array
218
+		 */
219
+		$start_time = apply_filters(
220
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
221
+			['8am', 'ga']
222
+		);
223
+		/**
224
+		 * Filters the initial end time and format for the new EE_Datetime instance.
225
+		 *
226
+		 * @param array $end_time An array having size 2.  First element is the time, second element is the time
227
+		 *                        format
228
+		 * @return array
229
+		 */
230
+		$end_time = apply_filters(
231
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
232
+			['5pm', 'ga']
233
+		);
234
+		$this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
235
+		$blank_datetime->set_start_time(
236
+			$this->convert_datetime_for_query(
237
+				'DTT_EVT_start',
238
+				$start_time[0],
239
+				$start_time[1],
240
+				$timezone_string
241
+			)
242
+		);
243
+		$blank_datetime->set_end_time(
244
+			$this->convert_datetime_for_query(
245
+				'DTT_EVT_end',
246
+				$end_time[0],
247
+				$end_time[1],
248
+				$timezone_string
249
+			)
250
+		);
251
+		return [$blank_datetime];
252
+	}
253
+
254
+
255
+	/**
256
+	 * Validates whether the start_time and end_time are in the expected format.
257
+	 *
258
+	 * @param array $start_time
259
+	 * @param array $end_time
260
+	 * @throws InvalidArgumentException
261
+	 * @throws InvalidDataTypeException
262
+	 */
263
+	private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
264
+	{
265
+		if (! is_array($start_time)) {
266
+			throw new InvalidDataTypeException('start_time', $start_time, 'array');
267
+		}
268
+		if (! is_array($end_time)) {
269
+			throw new InvalidDataTypeException('end_time', $end_time, 'array');
270
+		}
271
+		if (count($start_time) !== 2) {
272
+			throw new InvalidArgumentException(
273
+				sprintf(
274
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
275
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
276
+					'$start_time'
277
+				)
278
+			);
279
+		}
280
+		if (count($end_time) !== 2) {
281
+			throw new InvalidArgumentException(
282
+				sprintf(
283
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
284
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
285
+					'$end_time'
286
+				)
287
+			);
288
+		}
289
+	}
290
+
291
+
292
+	/**
293
+	 * get event start date from db
294
+	 *
295
+	 * @access public
296
+	 * @param int $EVT_ID
297
+	 * @return EE_Datetime[] array on success, FALSE on fail
298
+	 * @throws EE_Error
299
+	 * @throws ReflectionException
300
+	 */
301
+	public function get_all_event_dates($EVT_ID = 0)
302
+	{
303
+		if (! $EVT_ID) { // on add_new_event event_id gets set to 0
304
+			return $this->create_new_blank_datetime();
305
+		}
306
+		$results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
307
+		if (empty($results)) {
308
+			return $this->create_new_blank_datetime();
309
+		}
310
+		return $results;
311
+	}
312
+
313
+
314
+	/**
315
+	 * get all datetimes attached to an event ordered by the DTT_order field
316
+	 *
317
+	 * @public
318
+	 * @param int     $EVT_ID     event id
319
+	 * @param boolean $include_expired
320
+	 * @param boolean $include_deleted
321
+	 * @param int     $limit      If included then limit the count of results by
322
+	 *                            the given number
323
+	 * @return EE_Datetime[]
324
+	 * @throws EE_Error
325
+	 */
326
+	public function get_datetimes_for_event_ordered_by_DTT_order(
327
+		int $EVT_ID,
328
+		bool $include_expired = true,
329
+		bool $include_deleted = true,
330
+		$limit = 0
331
+	) {
332
+		$prev_data_prep_value = $this->prepModelForQuery();
333
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
334
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
335
+		$query_params         = $this->addDefaultWhereConditions($query_params);
336
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
337
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
338
+	}
339
+
340
+
341
+	/**
342
+	 * Gets the datetimes for the event (with the given limit), and orders them by "importance".
343
+	 * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
344
+	 * and then the earlier datetimes are the most important.
345
+	 * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
346
+	 *
347
+	 * @param int $EVT_ID
348
+	 * @param int $limit
349
+	 * @return EE_Datetime[]|EE_Base_Class[]
350
+	 * @throws EE_Error
351
+	 */
352
+	public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
353
+	{
354
+		$query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
355
+		$query_params    = $this->addDefaultWhereConditions($query_params);
356
+		$query_params    = $this->addDefaultQueryParams($query_params, $limit);
357
+		return $this->get_all($query_params);
358
+	}
359
+
360
+
361
+	/**
362
+	 * @param int     $EVT_ID
363
+	 * @param boolean $include_expired
364
+	 * @param boolean $include_deleted
365
+	 * @return EE_Datetime
366
+	 * @throws EE_Error
367
+	 */
368
+	public function get_oldest_datetime_for_event(
369
+		int $EVT_ID,
370
+		bool $include_expired = false,
371
+		bool $include_deleted = false
372
+	) {
373
+		$results = $this->get_datetimes_for_event_ordered_by_start_time(
374
+			$EVT_ID,
375
+			$include_expired,
376
+			$include_deleted,
377
+			1
378
+		);
379
+		if ($results) {
380
+			return array_shift($results);
381
+		}
382
+		return null;
383
+	}
384
+
385
+
386
+	/**
387
+	 * Gets the 'primary' datetime for an event.
388
+	 *
389
+	 * @param int  $EVT_ID
390
+	 * @param bool $try_to_exclude_expired
391
+	 * @param bool $try_to_exclude_deleted
392
+	 * @return EE_Datetime
393
+	 * @throws EE_Error
394
+	 */
395
+	public function get_primary_datetime_for_event(
396
+		int $EVT_ID,
397
+		bool $try_to_exclude_expired = true,
398
+		bool $try_to_exclude_deleted = true
399
+	) {
400
+		if ($try_to_exclude_expired) {
401
+			$non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
402
+			if ($non_expired) {
403
+				return $non_expired;
404
+			}
405
+		}
406
+		if ($try_to_exclude_deleted) {
407
+			$expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
408
+			if ($expired_even) {
409
+				return $expired_even;
410
+			}
411
+		}
412
+		return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
413
+	}
414
+
415
+
416
+	/**
417
+	 * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
418
+	 * only by start date
419
+	 *
420
+	 * @param int     $EVT_ID
421
+	 * @param boolean $include_expired
422
+	 * @param boolean $include_deleted
423
+	 * @param int     $limit
424
+	 * @return EE_Datetime[]
425
+	 * @throws EE_Error
426
+	 */
427
+	public function get_datetimes_for_event_ordered_by_start_time(
428
+		int $EVT_ID,
429
+		bool $include_expired = true,
430
+		bool $include_deleted = true,
431
+		$limit = 0
432
+	) {
433
+		$prev_data_prep_value = $this->prepModelForQuery();
434
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
435
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
436
+		$query_params         = $this->addDefaultWhereConditions(
437
+			$query_params,
438
+			EEM_Base::default_where_conditions_this_only
439
+		);
440
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
441
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
442
+	}
443
+
444
+
445
+	/**
446
+	 * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
447
+	 * only by start date
448
+	 *
449
+	 * @param int     $TKT_ID
450
+	 * @param boolean $include_expired
451
+	 * @param boolean $include_deleted
452
+	 * @param int     $limit
453
+	 * @return EE_Datetime[]
454
+	 * @throws EE_Error
455
+	 */
456
+	public function get_datetimes_for_ticket_ordered_by_start_time(
457
+		int $TKT_ID,
458
+		bool $include_expired = true,
459
+		bool $include_deleted = true,
460
+		$limit = 0
461
+	) {
462
+		$prev_data_prep_value = $this->prepModelForQuery();
463
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
464
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
465
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit);
466
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
467
+	}
468
+
469
+
470
+	/**
471
+	 * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
472
+	 * datetimes.
473
+	 *
474
+	 * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
475
+	 * @param boolean  $include_expired  whether to include expired datetimes or not
476
+	 * @param boolean  $include_deleted  whether to include trashed datetimes or not.
477
+	 * @param int|null $limit            if null, no limit, if int then limit results by
478
+	 *                                   that number
479
+	 * @return EE_Datetime[]
480
+	 * @throws EE_Error
481
+	 */
482
+	public function get_datetimes_for_ticket_ordered_by_DTT_order(
483
+		int $TKT_ID,
484
+		bool $include_expired = true,
485
+		bool $include_deleted = true,
486
+		$limit = 0
487
+	) {
488
+		$prev_data_prep_value = $this->prepModelForQuery();
489
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
490
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
491
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
492
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
493
+	}
494
+
495
+
496
+	/**
497
+	 * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
498
+	 * reason it doesn't exist, we consider the earliest event the most important)
499
+	 *
500
+	 * @param int $EVT_ID
501
+	 * @return EE_Datetime
502
+	 * @throws EE_Error
503
+	 */
504
+	public function get_most_important_datetime_for_event(int $EVT_ID)
505
+	{
506
+		$results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
507
+		if ($results) {
508
+			return array_shift($results);
509
+		}
510
+		return null;
511
+	}
512
+
513
+
514
+	/**
515
+	 * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
516
+	 * grouped by month and year.
517
+	 *
518
+	 * @param array  $where_params       @see
519
+	 *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
520
+	 * @param string $evt_active_status  A string representing the evt active status to filter the months by.
521
+	 *                                   Can be:
522
+	 *                                   - '' = no filter
523
+	 *                                   - upcoming = Published events with at least one upcoming datetime.
524
+	 *                                   - expired = Events with all datetimes expired.
525
+	 *                                   - active = Events that are published and have at least one datetime that
526
+	 *                                   starts before now and ends after now.
527
+	 *                                   - inactive = Events that are either not published.
528
+	 * @return stdClass[]
529
+	 * @throws EE_Error
530
+	 * @throws InvalidArgumentException
531
+	 * @throws InvalidArgumentException
532
+	 */
533
+	public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
534
+	{
535
+		$current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
536
+		$current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
537
+		switch ($evt_active_status) {
538
+			case 'upcoming':
539
+				$where_params['Event.status'] = 'publish';
540
+				// if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
541
+				if (isset($where_params['DTT_EVT_start'])) {
542
+					$where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
543
+				}
544
+				$where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
545
+				break;
546
+			case 'expired':
547
+				if (isset($where_params['Event.status'])) {
548
+					unset($where_params['Event.status']);
549
+				}
550
+				// get events to exclude
551
+				$exclude_query[0] = array_merge(
552
+					$where_params,
553
+					['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
554
+				);
555
+				// first get all events that have datetimes where its not expired.
556
+				$event_ids = $this->_get_all_wpdb_results(
557
+					$exclude_query,
558
+					OBJECT_K,
559
+					'Datetime.EVT_ID'
560
+				);
561
+				$event_ids = array_keys($event_ids);
562
+				if (isset($where_params['DTT_EVT_end'])) {
563
+					$where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
564
+				}
565
+				$where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
566
+				$where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
567
+				break;
568
+			case 'active':
569
+				$where_params['Event.status'] = 'publish';
570
+				if (isset($where_params['DTT_EVT_start'])) {
571
+					$where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
572
+				}
573
+				if (isset($where_params['Datetime.DTT_EVT_end'])) {
574
+					$where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
575
+				}
576
+				$where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
577
+				$where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
578
+				break;
579
+			case 'inactive':
580
+				if (isset($where_params['Event.status'])) {
581
+					unset($where_params['Event.status']);
582
+				}
583
+				if (isset($where_params['OR'])) {
584
+					$where_params['AND']['OR'] = $where_params['OR'];
585
+				}
586
+				if (isset($where_params['DTT_EVT_end'])) {
587
+					$where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
588
+					unset($where_params['DTT_EVT_end']);
589
+				}
590
+				if (isset($where_params['DTT_EVT_start'])) {
591
+					$where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
592
+					unset($where_params['DTT_EVT_start']);
593
+				}
594
+				$where_params['AND']['Event.status'] = ['!=', 'publish'];
595
+				break;
596
+		}
597
+		$query_params[0]          = $where_params;
598
+		$query_params['group_by'] = ['dtt_year', 'dtt_month'];
599
+		$query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
600
+
601
+		$query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
602
+			$this->get_timezone(),
603
+			'DTT_EVT_start'
604
+		);
605
+		$columns_to_select = [
606
+			'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
607
+			'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
608
+			'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
609
+		];
610
+		return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
611
+	}
612
+
613
+
614
+	/**
615
+	 * Updates the DTT_sold attribute on each datetime (based on the registrations
616
+	 * for the tickets for each datetime)
617
+	 *
618
+	 * @param EE_Base_Class[]|EE_Datetime[] $datetimes
619
+	 * @throws EE_Error
620
+	 * @throws ReflectionException
621
+	 */
622
+	public function update_sold(array $datetimes)
623
+	{
624
+		EE_Error::doing_it_wrong(
625
+			__FUNCTION__,
626
+			esc_html__(
627
+				'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
628
+				'event_espresso'
629
+			),
630
+			'4.9.32.rc.005'
631
+		);
632
+		foreach ($datetimes as $datetime) {
633
+			$datetime->update_sold();
634
+		}
635
+	}
636
+
637
+
638
+	/**
639
+	 *    Gets the total number of tickets available at a particular datetime
640
+	 *    (does NOT take into account the datetime's spaces available)
641
+	 *
642
+	 * @param int   $DTT_ID
643
+	 * @param array $query_params
644
+	 * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
645
+	 *             tickets attached to datetime then FALSE is returned.
646
+	 * @throws EE_Error
647
+	 * @throws ReflectionException
648
+	 */
649
+	public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
650
+	{
651
+		$datetime = $this->get_one_by_ID($DTT_ID);
652
+		if ($datetime instanceof EE_Datetime) {
653
+			return $datetime->tickets_remaining($query_params);
654
+		}
655
+		return 0;
656
+	}
657
+
658
+
659
+	/**
660
+	 * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
661
+	 *
662
+	 * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
663
+	 *                                 stati you want counts for as values in the array.  An empty array returns counts
664
+	 *                                 for all valid stati.
665
+	 * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
666
+	 *                                 only for Datetimes connected to a specific event, or specific ticket.
667
+	 * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
668
+	 * @throws EE_Error
669
+	 *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
670
+	 *                                 EE_Datetime::expired
671
+	 */
672
+	public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
673
+	{
674
+		// only accept where conditions for this query.
675
+		$_where            = isset($query_params[0]) ? $query_params[0] : [];
676
+		$status_query_args = [
677
+			EE_Datetime::active   => array_merge(
678
+				$_where,
679
+				['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
680
+			),
681
+			EE_Datetime::upcoming => array_merge(
682
+				$_where,
683
+				['DTT_EVT_start' => ['>', time()]]
684
+			),
685
+			EE_Datetime::expired  => array_merge(
686
+				$_where,
687
+				['DTT_EVT_end' => ['<', time()]]
688
+			),
689
+		];
690
+		if (! empty($stati_to_include)) {
691
+			foreach (array_keys($status_query_args) as $status) {
692
+				if (! in_array($status, $stati_to_include, true)) {
693
+					unset($status_query_args[ $status ]);
694
+				}
695
+			}
696
+		}
697
+		// loop through and query counts for each stati.
698
+		$status_query_results = [];
699
+		foreach ($status_query_args as $status => $status_where_conditions) {
700
+			$status_query_results[ $status ] = EEM_Datetime::count(
701
+				[$status_where_conditions],
702
+				'DTT_ID',
703
+				true
704
+			);
705
+		}
706
+		return $status_query_results;
707
+	}
708
+
709
+
710
+	/**
711
+	 * Returns the specific count for a given Datetime status matching any given query_params.
712
+	 *
713
+	 * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
714
+	 * @param array  $query_params
715
+	 * @return int
716
+	 * @throws EE_Error
717
+	 */
718
+	public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
719
+	{
720
+		$count = $this->get_datetime_counts_by_status([$status], $query_params);
721
+		return ! empty($count[ $status ]) ? $count[ $status ] : 0;
722
+	}
723
+
724
+
725
+	/**
726
+	 * @return bool|int
727
+	 * @since   5.0.0.p
728
+	 */
729
+	private function prepModelForQuery()
730
+	{
731
+		$prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
732
+		$this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
733
+		return $prev_data_prep_value;
734
+	}
735
+
736
+
737
+	/**
738
+	 * @param array    $query_params
739
+	 * @param bool|int $prev_data_prep_value
740
+	 * @return EE_Base_Class[]|EE_Datetime[]
741
+	 * @throws EE_Error
742
+	 * @since   5.0.0.p
743
+	 */
744
+	private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
745
+	{
746
+		$result = $this->get_all($query_params);
747
+		$this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
748
+		return $result;
749
+	}
750
+
751
+
752
+	/**
753
+	 * @param array  $query_params
754
+	 * @param int    $limit
755
+	 * @param string $order_by
756
+	 * @param string $order
757
+	 * @return array
758
+	 * @since   5.0.0.p
759
+	 */
760
+	private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
761
+	{
762
+		$query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
763
+		$query_params = $this->addLimitQueryParams($query_params, $limit);
764
+		return $query_params;
765
+	}
766
+
767
+
768
+	/**
769
+	 * @param array  $query_params
770
+	 * @param string $default_where_conditions
771
+	 * @return array
772
+	 * @since   5.0.0.p
773
+	 */
774
+	private function addDefaultWhereConditions(
775
+		array $query_params,
776
+		$default_where_conditions = EEM_Base::default_where_conditions_none
777
+	) {
778
+		$query_params['default_where_conditions'] = $default_where_conditions;
779
+		return $query_params;
780
+	}
781
+
782
+
783
+	/**
784
+	 * @param array $where_params
785
+	 * @param bool  $include_deleted
786
+	 * @param bool  $include_expired
787
+	 * @return array
788
+	 * @since   5.0.0.p
789
+	 */
790
+	private function addDefaultWhereParams(array $where_params, bool $include_deleted = true, bool $include_expired = true)
791
+	{
792
+		$where_params = $this->addExpiredWhereParams($where_params, $include_expired);
793
+		$where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
794
+		return $where_params;
795
+	}
796
+
797
+
798
+	/**
799
+	 * @param array $where_params
800
+	 * @param bool  $include_deleted
801
+	 * @return array
802
+	 * @since   5.0.0.p
803
+	 */
804
+	private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
805
+	{
806
+		$deleted                     = $include_deleted ? [true, false] : [false];
807
+		$where_params['DTT_deleted'] = ['IN', $deleted];
808
+		return $where_params;
809
+	}
810
+
811
+
812
+	/**
813
+	 * @param array $where_params
814
+	 * @param bool  $include_expired
815
+	 * @return array
816
+	 * @since   5.0.0.p
817
+	 */
818
+	private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
819
+	{
820
+		if (! $include_expired) {
821
+			$where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
822
+		}
823
+		return $where_params;
824
+	}
825
+
826
+
827
+	/**
828
+	 * @param array $query_params
829
+	 * @param int   $limit
830
+	 * @return array
831
+	 * @since   5.0.0.p
832
+	 */
833
+	private function addLimitQueryParams(array $query_params, $limit = 0)
834
+	{
835
+		if ($limit) {
836
+			$query_params['limit'] = $limit;
837
+		}
838
+		return $query_params;
839
+	}
840
+
841
+
842
+	/**
843
+	 * @param array  $query_params
844
+	 * @param string $order_by
845
+	 * @param string $order
846
+	 * @return array
847
+	 * @since   5.0.0.p
848
+	 */
849
+	private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
850
+	{
851
+		$order                    = $order === 'ASC' ? 'ASC' : 'DESC';
852
+		$valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
853
+		$order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
854
+		$query_params['order_by'] = [$order_by => $order];
855
+		return $query_params;
856
+	}
857 857
 }
Please login to merge, or discard this patch.
core/services/routing/Route.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
     private function loadDataNode()
252 252
     {
253 253
         $data_node_fqcn = $this->dataNodeClass();
254
-        if (! empty($data_node_fqcn)) {
254
+        if ( ! empty($data_node_fqcn)) {
255 255
             $data_node = $this->loader->getShared($data_node_fqcn);
256 256
             $this->setDataNode($data_node);
257 257
         }
@@ -279,7 +279,7 @@  discard block
 block discarded – undo
279 279
      */
280 280
     private function verifyIsHandled($handled)
281 281
     {
282
-        if (! is_bool($handled)) {
282
+        if ( ! is_bool($handled)) {
283 283
             throw new DomainException(
284 284
                 esc_html__(
285 285
                     'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
Please login to merge, or discard this patch.
Indentation   +267 added lines, -267 removed lines patch added patch discarded remove patch
@@ -28,271 +28,271 @@
 block discarded – undo
28 28
  */
29 29
 abstract class Route implements RouteInterface, RequiresCapCheckInterface
30 30
 {
31
-    /**
32
-     * @var AssetManagerInterface $asset_manager
33
-     */
34
-    protected $asset_manager;
35
-
36
-    /**
37
-     * @var EE_Dependency_Map $dependency_map
38
-     */
39
-    protected $dependency_map;
40
-
41
-    /**
42
-     * @var JsonDataNode $data_node
43
-     */
44
-    protected $data_node;
45
-
46
-    /**
47
-     * @var LoaderInterface $loader
48
-     */
49
-    protected $loader;
50
-
51
-    /**
52
-     * @var RequestInterface $request
53
-     */
54
-    protected $request;
55
-
56
-    /**
57
-     * @var RouteMatchSpecificationInterface $specification
58
-     */
59
-    protected $specification;
60
-
61
-    /**
62
-     * @var boolean $handled
63
-     */
64
-    private $handled = false;
65
-
66
-    /**
67
-     * @var array $default_dependencies
68
-     */
69
-    protected static $default_dependencies = [
70
-        'EE_Dependency_Map'                           => EE_Dependency_Map::load_from_cache,
71
-        'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
72
-        'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
73
-    ];
74
-
75
-    /**
76
-     * @var array $full_dependencies
77
-     */
78
-    protected static $full_dependencies = [
79
-        'EE_Dependency_Map'                             => EE_Dependency_Map::load_from_cache,
80
-        'EventEspresso\core\services\loaders\Loader'    => EE_Dependency_Map::load_from_cache,
81
-        'EventEspresso\core\services\request\Request'   => EE_Dependency_Map::load_from_cache,
82
-        'EventEspresso\core\services\json\JsonDataNode' => EE_Dependency_Map::load_from_cache,
83
-        RouteMatchSpecificationInterface::class         => EE_Dependency_Map::load_from_cache,
84
-    ];
85
-
86
-
87
-    /**
88
-     * Route constructor.
89
-     *
90
-     * @param EE_Dependency_Map                     $dependency_map
91
-     * @param LoaderInterface                       $loader
92
-     * @param RequestInterface                      $request
93
-     * @param JsonDataNode|null                     $data_node
94
-     * @param RouteMatchSpecificationInterface|null $specification
95
-     */
96
-    public function __construct(
97
-        EE_Dependency_Map $dependency_map,
98
-        LoaderInterface $loader,
99
-        RequestInterface $request,
100
-        JsonDataNode $data_node = null,
101
-        RouteMatchSpecificationInterface $specification = null
102
-    ) {
103
-        $this->dependency_map = $dependency_map;
104
-        $this->data_node      = $data_node;
105
-        $this->loader         = $loader;
106
-        $this->request        = $request;
107
-        $this->setSpecification($specification);
108
-    }
109
-
110
-
111
-    /**
112
-     * @return void
113
-     */
114
-    abstract protected function registerDependencies();
115
-
116
-
117
-    /**
118
-     * implements logic required to run during request
119
-     *
120
-     * @return bool
121
-     */
122
-    abstract protected function requestHandler(): bool;
123
-
124
-
125
-    /**
126
-     * called just before matchesCurrentRequest()
127
-     * and allows Route to perform any setup required such as calling setSpecification()
128
-     *
129
-     * @return void
130
-     */
131
-    public function initialize()
132
-    {
133
-        // do nothing by default
134
-    }
135
-
136
-
137
-    /**
138
-     * returns true if the current request matches this route
139
-     * child classes can override and use Request directly to match route with request
140
-     * or supply a RouteMatchSpecification class and just use the below
141
-     *
142
-     * @return bool
143
-     */
144
-    public function matchesCurrentRequest(): bool
145
-    {
146
-        return $this->specification instanceof RouteMatchSpecificationInterface
147
-               && $this->specification->isMatchingRoute();
148
-    }
149
-
150
-
151
-    /**
152
-     * returns the FQCN for this route's JsonDataNode
153
-     *
154
-     * @return string
155
-     */
156
-    protected function dataNodeClass(): string
157
-    {
158
-        return '';
159
-    }
160
-
161
-
162
-    public function getCapCheck()
163
-    {
164
-        return new PublicCapabilities('', 'access Event Espresso route');
165
-    }
166
-
167
-
168
-    /**
169
-     * @return array
170
-     */
171
-    public static function getDefaultDependencies(): array
172
-    {
173
-        return self::$default_dependencies;
174
-    }
175
-
176
-
177
-    /**
178
-     * @return array
179
-     */
180
-    public static function getFullDependencies(): array
181
-    {
182
-        return self::$full_dependencies;
183
-    }
184
-
185
-
186
-    /**
187
-     * @param JsonDataNode|null $data_node
188
-     */
189
-    protected function setDataNode(JsonDataNode $data_node = null)
190
-    {
191
-        $this->data_node = $data_node;
192
-    }
193
-
194
-
195
-    /**
196
-     * @param RouteMatchSpecificationInterface|null $specification
197
-     */
198
-    protected function setSpecification(RouteMatchSpecificationInterface $specification = null)
199
-    {
200
-        $this->specification = $specification;
201
-    }
202
-
203
-
204
-    /**
205
-     * @return JsonDataNode
206
-     */
207
-    public function dataNode(): ?JsonDataNode
208
-    {
209
-        return $this->data_node;
210
-    }
211
-
212
-
213
-    /**
214
-     * runs route requestHandler() if
215
-     *      - route has not previously been handled
216
-     *      - route specification matches for current request
217
-     * sets route handled property based on results returned by requestHandler()
218
-     *
219
-     * @return bool
220
-     */
221
-    public function handleRequest(): bool
222
-    {
223
-        if ($this->isNotHandled()) {
224
-            $this->initialize();
225
-            if ($this->matchesCurrentRequest()) {
226
-                do_action('AHEE__EventEspresso_core_domain_entities_routes_handlers_Route__handleRequest', $this);
227
-                $this->registerDependencies();
228
-                $this->loadDataNode();
229
-                $this->verifyIsHandled($this->requestHandler());
230
-            }
231
-        }
232
-        return $this->handled;
233
-    }
234
-
235
-
236
-    /**
237
-     * @return bool
238
-     */
239
-    final public function isHandled(): bool
240
-    {
241
-        return $this->handled;
242
-    }
243
-
244
-
245
-    /**
246
-     * @return bool
247
-     */
248
-    final public function isNotHandled(): bool
249
-    {
250
-        return ! $this->handled;
251
-    }
252
-
253
-
254
-    /**
255
-     * @return void
256
-     */
257
-    private function loadDataNode()
258
-    {
259
-        $data_node_fqcn = $this->dataNodeClass();
260
-        if (! empty($data_node_fqcn)) {
261
-            $data_node = $this->loader->getShared($data_node_fqcn);
262
-            $this->setDataNode($data_node);
263
-        }
264
-    }
265
-
266
-
267
-    /**
268
-     * @param string $domain_fqcn
269
-     */
270
-    public function initializeBaristaForDomain(string $domain_fqcn)
271
-    {
272
-        if (apply_filters('FHEE__load_Barista', true)) {
273
-            /** @var BaristaFactory $factory */
274
-            $factory = $this->loader->getShared(BaristaFactory::class);
275
-            $barista = $factory->createFromDomainClass($domain_fqcn);
276
-            if ($barista instanceof BaristaInterface) {
277
-                $barista->initialize();
278
-            }
279
-        }
280
-    }
281
-
282
-
283
-    /**
284
-     * @var bool
285
-     */
286
-    private function verifyIsHandled($handled)
287
-    {
288
-        if (! is_bool($handled)) {
289
-            throw new DomainException(
290
-                esc_html__(
291
-                    'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
292
-                    'event_espresso'
293
-                )
294
-            );
295
-        }
296
-        $this->handled = filter_var($handled, FILTER_VALIDATE_BOOLEAN);
297
-    }
31
+	/**
32
+	 * @var AssetManagerInterface $asset_manager
33
+	 */
34
+	protected $asset_manager;
35
+
36
+	/**
37
+	 * @var EE_Dependency_Map $dependency_map
38
+	 */
39
+	protected $dependency_map;
40
+
41
+	/**
42
+	 * @var JsonDataNode $data_node
43
+	 */
44
+	protected $data_node;
45
+
46
+	/**
47
+	 * @var LoaderInterface $loader
48
+	 */
49
+	protected $loader;
50
+
51
+	/**
52
+	 * @var RequestInterface $request
53
+	 */
54
+	protected $request;
55
+
56
+	/**
57
+	 * @var RouteMatchSpecificationInterface $specification
58
+	 */
59
+	protected $specification;
60
+
61
+	/**
62
+	 * @var boolean $handled
63
+	 */
64
+	private $handled = false;
65
+
66
+	/**
67
+	 * @var array $default_dependencies
68
+	 */
69
+	protected static $default_dependencies = [
70
+		'EE_Dependency_Map'                           => EE_Dependency_Map::load_from_cache,
71
+		'EventEspresso\core\services\loaders\Loader'  => EE_Dependency_Map::load_from_cache,
72
+		'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache,
73
+	];
74
+
75
+	/**
76
+	 * @var array $full_dependencies
77
+	 */
78
+	protected static $full_dependencies = [
79
+		'EE_Dependency_Map'                             => EE_Dependency_Map::load_from_cache,
80
+		'EventEspresso\core\services\loaders\Loader'    => EE_Dependency_Map::load_from_cache,
81
+		'EventEspresso\core\services\request\Request'   => EE_Dependency_Map::load_from_cache,
82
+		'EventEspresso\core\services\json\JsonDataNode' => EE_Dependency_Map::load_from_cache,
83
+		RouteMatchSpecificationInterface::class         => EE_Dependency_Map::load_from_cache,
84
+	];
85
+
86
+
87
+	/**
88
+	 * Route constructor.
89
+	 *
90
+	 * @param EE_Dependency_Map                     $dependency_map
91
+	 * @param LoaderInterface                       $loader
92
+	 * @param RequestInterface                      $request
93
+	 * @param JsonDataNode|null                     $data_node
94
+	 * @param RouteMatchSpecificationInterface|null $specification
95
+	 */
96
+	public function __construct(
97
+		EE_Dependency_Map $dependency_map,
98
+		LoaderInterface $loader,
99
+		RequestInterface $request,
100
+		JsonDataNode $data_node = null,
101
+		RouteMatchSpecificationInterface $specification = null
102
+	) {
103
+		$this->dependency_map = $dependency_map;
104
+		$this->data_node      = $data_node;
105
+		$this->loader         = $loader;
106
+		$this->request        = $request;
107
+		$this->setSpecification($specification);
108
+	}
109
+
110
+
111
+	/**
112
+	 * @return void
113
+	 */
114
+	abstract protected function registerDependencies();
115
+
116
+
117
+	/**
118
+	 * implements logic required to run during request
119
+	 *
120
+	 * @return bool
121
+	 */
122
+	abstract protected function requestHandler(): bool;
123
+
124
+
125
+	/**
126
+	 * called just before matchesCurrentRequest()
127
+	 * and allows Route to perform any setup required such as calling setSpecification()
128
+	 *
129
+	 * @return void
130
+	 */
131
+	public function initialize()
132
+	{
133
+		// do nothing by default
134
+	}
135
+
136
+
137
+	/**
138
+	 * returns true if the current request matches this route
139
+	 * child classes can override and use Request directly to match route with request
140
+	 * or supply a RouteMatchSpecification class and just use the below
141
+	 *
142
+	 * @return bool
143
+	 */
144
+	public function matchesCurrentRequest(): bool
145
+	{
146
+		return $this->specification instanceof RouteMatchSpecificationInterface
147
+			   && $this->specification->isMatchingRoute();
148
+	}
149
+
150
+
151
+	/**
152
+	 * returns the FQCN for this route's JsonDataNode
153
+	 *
154
+	 * @return string
155
+	 */
156
+	protected function dataNodeClass(): string
157
+	{
158
+		return '';
159
+	}
160
+
161
+
162
+	public function getCapCheck()
163
+	{
164
+		return new PublicCapabilities('', 'access Event Espresso route');
165
+	}
166
+
167
+
168
+	/**
169
+	 * @return array
170
+	 */
171
+	public static function getDefaultDependencies(): array
172
+	{
173
+		return self::$default_dependencies;
174
+	}
175
+
176
+
177
+	/**
178
+	 * @return array
179
+	 */
180
+	public static function getFullDependencies(): array
181
+	{
182
+		return self::$full_dependencies;
183
+	}
184
+
185
+
186
+	/**
187
+	 * @param JsonDataNode|null $data_node
188
+	 */
189
+	protected function setDataNode(JsonDataNode $data_node = null)
190
+	{
191
+		$this->data_node = $data_node;
192
+	}
193
+
194
+
195
+	/**
196
+	 * @param RouteMatchSpecificationInterface|null $specification
197
+	 */
198
+	protected function setSpecification(RouteMatchSpecificationInterface $specification = null)
199
+	{
200
+		$this->specification = $specification;
201
+	}
202
+
203
+
204
+	/**
205
+	 * @return JsonDataNode
206
+	 */
207
+	public function dataNode(): ?JsonDataNode
208
+	{
209
+		return $this->data_node;
210
+	}
211
+
212
+
213
+	/**
214
+	 * runs route requestHandler() if
215
+	 *      - route has not previously been handled
216
+	 *      - route specification matches for current request
217
+	 * sets route handled property based on results returned by requestHandler()
218
+	 *
219
+	 * @return bool
220
+	 */
221
+	public function handleRequest(): bool
222
+	{
223
+		if ($this->isNotHandled()) {
224
+			$this->initialize();
225
+			if ($this->matchesCurrentRequest()) {
226
+				do_action('AHEE__EventEspresso_core_domain_entities_routes_handlers_Route__handleRequest', $this);
227
+				$this->registerDependencies();
228
+				$this->loadDataNode();
229
+				$this->verifyIsHandled($this->requestHandler());
230
+			}
231
+		}
232
+		return $this->handled;
233
+	}
234
+
235
+
236
+	/**
237
+	 * @return bool
238
+	 */
239
+	final public function isHandled(): bool
240
+	{
241
+		return $this->handled;
242
+	}
243
+
244
+
245
+	/**
246
+	 * @return bool
247
+	 */
248
+	final public function isNotHandled(): bool
249
+	{
250
+		return ! $this->handled;
251
+	}
252
+
253
+
254
+	/**
255
+	 * @return void
256
+	 */
257
+	private function loadDataNode()
258
+	{
259
+		$data_node_fqcn = $this->dataNodeClass();
260
+		if (! empty($data_node_fqcn)) {
261
+			$data_node = $this->loader->getShared($data_node_fqcn);
262
+			$this->setDataNode($data_node);
263
+		}
264
+	}
265
+
266
+
267
+	/**
268
+	 * @param string $domain_fqcn
269
+	 */
270
+	public function initializeBaristaForDomain(string $domain_fqcn)
271
+	{
272
+		if (apply_filters('FHEE__load_Barista', true)) {
273
+			/** @var BaristaFactory $factory */
274
+			$factory = $this->loader->getShared(BaristaFactory::class);
275
+			$barista = $factory->createFromDomainClass($domain_fqcn);
276
+			if ($barista instanceof BaristaInterface) {
277
+				$barista->initialize();
278
+			}
279
+		}
280
+	}
281
+
282
+
283
+	/**
284
+	 * @var bool
285
+	 */
286
+	private function verifyIsHandled($handled)
287
+	{
288
+		if (! is_bool($handled)) {
289
+			throw new DomainException(
290
+				esc_html__(
291
+					'Route::requestHandler() must return a boolean to indicate whether the request has been handled or not.',
292
+					'event_espresso'
293
+				)
294
+			);
295
+		}
296
+		$this->handled = filter_var($handled, FILTER_VALIDATE_BOOLEAN);
297
+	}
298 298
 }
Please login to merge, or discard this patch.
core/services/addon/AddonManager.php 2 patches
Indentation   +93 added lines, -93 removed lines patch added patch discarded remove patch
@@ -23,109 +23,109 @@
 block discarded – undo
23 23
  */
24 24
 class AddonManager
25 25
 {
26
-    /**
27
-     * @var AddonCollection
28
-     */
29
-    private $addons;
26
+	/**
27
+	 * @var AddonCollection
28
+	 */
29
+	private $addons;
30 30
 
31
-    /**
32
-     * @var IncompatibleAddonHandler
33
-     */
34
-    private $incompatible_addon_handler;
31
+	/**
32
+	 * @var IncompatibleAddonHandler
33
+	 */
34
+	private $incompatible_addon_handler;
35 35
 
36
-    /**
37
-     * @var Psr4Autoloader
38
-     */
39
-    private $psr4_loader;
36
+	/**
37
+	 * @var Psr4Autoloader
38
+	 */
39
+	private $psr4_loader;
40 40
 
41
-    /**
42
-     * @var RegisterV1Addon
43
-     */
44
-    private $register_v1_addon;
41
+	/**
42
+	 * @var RegisterV1Addon
43
+	 */
44
+	private $register_v1_addon;
45 45
 
46
-    /**
47
-     * @var ThirdPartyPluginHandler
48
-     */
49
-    private $third_party_plugin_handler;
46
+	/**
47
+	 * @var ThirdPartyPluginHandler
48
+	 */
49
+	private $third_party_plugin_handler;
50 50
 
51 51
 
52
-    /**
53
-     * AddonManager constructor.
54
-     *
55
-     * @param AddonCollection          $addons
56
-     * @param Psr4Autoloader           $psr4_loader
57
-     * @param RegisterV1Addon          $register_v1_addon
58
-     * @param IncompatibleAddonHandler $incompatible_addon_handler
59
-     * @param ThirdPartyPluginHandler  $third_party_plugin_handler
60
-     */
61
-    public function __construct(
62
-        AddonCollection $addons,
63
-        Psr4Autoloader $psr4_loader,
64
-        RegisterV1Addon $register_v1_addon,
65
-        IncompatibleAddonHandler $incompatible_addon_handler,
66
-        ThirdPartyPluginHandler $third_party_plugin_handler
67
-    ) {
68
-        $this->addons                     = $addons;
69
-        $this->psr4_loader                = $psr4_loader;
70
-        $this->register_v1_addon          = $register_v1_addon;
71
-        $this->incompatible_addon_handler = $incompatible_addon_handler;
72
-        $this->third_party_plugin_handler = $third_party_plugin_handler;
73
-    }
52
+	/**
53
+	 * AddonManager constructor.
54
+	 *
55
+	 * @param AddonCollection          $addons
56
+	 * @param Psr4Autoloader           $psr4_loader
57
+	 * @param RegisterV1Addon          $register_v1_addon
58
+	 * @param IncompatibleAddonHandler $incompatible_addon_handler
59
+	 * @param ThirdPartyPluginHandler  $third_party_plugin_handler
60
+	 */
61
+	public function __construct(
62
+		AddonCollection $addons,
63
+		Psr4Autoloader $psr4_loader,
64
+		RegisterV1Addon $register_v1_addon,
65
+		IncompatibleAddonHandler $incompatible_addon_handler,
66
+		ThirdPartyPluginHandler $third_party_plugin_handler
67
+	) {
68
+		$this->addons                     = $addons;
69
+		$this->psr4_loader                = $psr4_loader;
70
+		$this->register_v1_addon          = $register_v1_addon;
71
+		$this->incompatible_addon_handler = $incompatible_addon_handler;
72
+		$this->third_party_plugin_handler = $third_party_plugin_handler;
73
+	}
74 74
 
75 75
 
76
-    /**
77
-     * @throws Exception
78
-     */
79
-    public function initialize()
80
-    {
81
-        // set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
82
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
83
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
84
-    }
76
+	/**
77
+	 * @throws Exception
78
+	 */
79
+	public function initialize()
80
+	{
81
+		// set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
82
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
83
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
84
+	}
85 85
 
86 86
 
87
-    /**
88
-     * @throws Exception
89
-     */
90
-    public function loadAddons()
91
-    {
92
-        try {
93
-            $this->incompatible_addon_handler->deactivateIncompatibleAddons();
94
-            // legacy add-on API
95
-            do_action('AHEE__EE_System__load_espresso_addons');
96
-            // new add-on API that uses versioning
97
-            do_action(
98
-                'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
99
-                $this->addons,
100
-                espresso_version()
101
-            );
102
-            // addons are responsible for loading their AddonApiVersion into the AddonCollection
103
-            foreach ($this->addons as $addon) {
104
-                if ($addon instanceof AddonApiVersion) {
105
-                    $this->registerAddon($addon);
106
-                }
107
-            }
108
-            $this->third_party_plugin_handler->loadPlugins();
109
-            do_action('AHEE__EE_System__load_espresso_addons__complete');
110
-        } catch (Exception $exception) {
111
-            new ExceptionStackTraceDisplay($exception);
112
-        }
113
-    }
87
+	/**
88
+	 * @throws Exception
89
+	 */
90
+	public function loadAddons()
91
+	{
92
+		try {
93
+			$this->incompatible_addon_handler->deactivateIncompatibleAddons();
94
+			// legacy add-on API
95
+			do_action('AHEE__EE_System__load_espresso_addons');
96
+			// new add-on API that uses versioning
97
+			do_action(
98
+				'AHEE__EventEspresso_core_services_addon_AddonManager__initialize__addons',
99
+				$this->addons,
100
+				espresso_version()
101
+			);
102
+			// addons are responsible for loading their AddonApiVersion into the AddonCollection
103
+			foreach ($this->addons as $addon) {
104
+				if ($addon instanceof AddonApiVersion) {
105
+					$this->registerAddon($addon);
106
+				}
107
+			}
108
+			$this->third_party_plugin_handler->loadPlugins();
109
+			do_action('AHEE__EE_System__load_espresso_addons__complete');
110
+		} catch (Exception $exception) {
111
+			new ExceptionStackTraceDisplay($exception);
112
+		}
113
+	}
114 114
 
115 115
 
116
-    /**
117
-     * @param AddonApiVersion $addon
118
-     * @throws EE_Error
119
-     */
120
-    private function registerAddon(AddonApiVersion $addon)
121
-    {
122
-        // first register addon namespace so that FQCNs resolve correctly
123
-        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
124
-        // then allow add-on to perform any other setup that relied on PSR4 autoloading
125
-        $addon->initialize();
126
-        // now register each addon based on it's API version
127
-        if ($addon instanceof AddonApiV1) {
128
-            $this->register_v1_addon->register($addon);
129
-        }
130
-    }
116
+	/**
117
+	 * @param AddonApiVersion $addon
118
+	 * @throws EE_Error
119
+	 */
120
+	private function registerAddon(AddonApiVersion $addon)
121
+	{
122
+		// first register addon namespace so that FQCNs resolve correctly
123
+		$this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
124
+		// then allow add-on to perform any other setup that relied on PSR4 autoloading
125
+		$addon->initialize();
126
+		// now register each addon based on it's API version
127
+		if ($addon instanceof AddonApiV1) {
128
+			$this->register_v1_addon->register($addon);
129
+		}
130
+	}
131 131
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
     {
81 81
         // set autoloaders for all of the classes implementing the legacy EEI_Plugin_API
82 82
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
83
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
83
+        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
84 84
     }
85 85
 
86 86
 
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
     private function registerAddon(AddonApiVersion $addon)
121 121
     {
122 122
         // first register addon namespace so that FQCNs resolve correctly
123
-        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()) . '/src/');
123
+        $this->psr4_loader->addNamespace($addon->getNamespace(), dirname($addon->mainFile()).'/src/');
124 124
         // then allow add-on to perform any other setup that relied on PSR4 autoloading
125 125
         $addon->initialize();
126 126
         // now register each addon based on it's API version
Please login to merge, or discard this patch.
core/services/addon/api/IncompatibleAddonHandler.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
         string $load_callback,
44 44
         string $plugin_file_constant
45 45
     ) {
46
-        if (! defined($version_constant)) {
46
+        if ( ! defined($version_constant)) {
47 47
             return;
48 48
         }
49 49
         $addon_version = constant($version_constant);
50 50
         if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
51 51
             remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
52
-            if (! function_exists('deactivate_plugins')) {
53
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
52
+            if ( ! function_exists('deactivate_plugins')) {
53
+                require_once ABSPATH.'wp-admin/includes/plugin.php';
54 54
             }
55 55
             deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
56 56
             unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
@@ -64,7 +64,7 @@  discard block
 block discarded – undo
64 64
                     $min_version_required
65 65
                 ),
66 66
                 __FILE__,
67
-                __FUNCTION__ . "({$addon_name})",
67
+                __FUNCTION__."({$addon_name})",
68 68
                 __LINE__
69 69
             );
70 70
             EE_Error::get_notices(false, true);
Please login to merge, or discard this patch.
Indentation   +69 added lines, -69 removed lines patch added patch discarded remove patch
@@ -6,75 +6,75 @@
 block discarded – undo
6 6
 
7 7
 class IncompatibleAddonHandler
8 8
 {
9
-    /**
10
-     * @return void
11
-     */
12
-    public function deactivateIncompatibleAddons()
13
-    {
14
-        $this->deactivateIncompatibleAddon(
15
-            'Wait Lists',
16
-            'EE_WAIT_LISTS_VERSION',
17
-            '1.0.0.beta.074',
18
-            'load_espresso_wait_lists',
19
-            'EE_WAIT_LISTS_PLUGIN_FILE'
20
-        );
21
-        $this->deactivateIncompatibleAddon(
22
-            'Automated Upcoming Event Notifications',
23
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
24
-            '1.0.0.beta.091',
25
-            'load_espresso_automated_upcoming_event_notification',
26
-            'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
27
-        );
28
-        // $this->deactivateIncompatibleAddon(
29
-        //     'WP Users Integration',
30
-        //     'EE_WPUSERS_VERSION',
31
-        //     '2.1.0.rc.003',
32
-        //     'load_ee_core_wpusers',
33
-        //     'EE_WPUSERS_PLUGIN_FILE'
34
-        // );
35
-    }
9
+	/**
10
+	 * @return void
11
+	 */
12
+	public function deactivateIncompatibleAddons()
13
+	{
14
+		$this->deactivateIncompatibleAddon(
15
+			'Wait Lists',
16
+			'EE_WAIT_LISTS_VERSION',
17
+			'1.0.0.beta.074',
18
+			'load_espresso_wait_lists',
19
+			'EE_WAIT_LISTS_PLUGIN_FILE'
20
+		);
21
+		$this->deactivateIncompatibleAddon(
22
+			'Automated Upcoming Event Notifications',
23
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_VERSION',
24
+			'1.0.0.beta.091',
25
+			'load_espresso_automated_upcoming_event_notification',
26
+			'EE_AUTOMATED_UPCOMING_EVENT_NOTIFICATION_PLUGIN_FILE'
27
+		);
28
+		// $this->deactivateIncompatibleAddon(
29
+		//     'WP Users Integration',
30
+		//     'EE_WPUSERS_VERSION',
31
+		//     '2.1.0.rc.003',
32
+		//     'load_ee_core_wpusers',
33
+		//     'EE_WPUSERS_PLUGIN_FILE'
34
+		// );
35
+	}
36 36
 
37 37
 
38
-    /**
39
-     * @param string $addon_name
40
-     * @param string $version_constant
41
-     * @param string $min_version_required
42
-     * @param string $load_callback
43
-     * @param string $plugin_file_constant
44
-     * @return void
45
-     */
46
-    private function deactivateIncompatibleAddon(
47
-        string $addon_name,
48
-        string $version_constant,
49
-        string $min_version_required,
50
-        string $load_callback,
51
-        string $plugin_file_constant
52
-    ) {
53
-        if (! defined($version_constant)) {
54
-            return;
55
-        }
56
-        $addon_version = constant($version_constant);
57
-        if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
58
-            remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
59
-            if (! function_exists('deactivate_plugins')) {
60
-                require_once ABSPATH . 'wp-admin/includes/plugin.php';
61
-            }
62
-            deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
63
-            unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
64
-            EE_Error::add_error(
65
-                sprintf(
66
-                    esc_html__(
67
-                        'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
68
-                        'event_espresso'
69
-                    ),
70
-                    $addon_name,
71
-                    $min_version_required
72
-                ),
73
-                __FILE__,
74
-                __FUNCTION__ . "({$addon_name})",
75
-                __LINE__
76
-            );
77
-            EE_Error::get_notices(false, true);
78
-        }
79
-    }
38
+	/**
39
+	 * @param string $addon_name
40
+	 * @param string $version_constant
41
+	 * @param string $min_version_required
42
+	 * @param string $load_callback
43
+	 * @param string $plugin_file_constant
44
+	 * @return void
45
+	 */
46
+	private function deactivateIncompatibleAddon(
47
+		string $addon_name,
48
+		string $version_constant,
49
+		string $min_version_required,
50
+		string $load_callback,
51
+		string $plugin_file_constant
52
+	) {
53
+		if (! defined($version_constant)) {
54
+			return;
55
+		}
56
+		$addon_version = constant($version_constant);
57
+		if ($addon_version && version_compare($addon_version, $min_version_required, '<')) {
58
+			remove_action('AHEE__EE_System__load_espresso_addons', $load_callback);
59
+			if (! function_exists('deactivate_plugins')) {
60
+				require_once ABSPATH . 'wp-admin/includes/plugin.php';
61
+			}
62
+			deactivate_plugins(plugin_basename(constant($plugin_file_constant)));
63
+			unset($_GET['activate'], $_REQUEST['activate'], $_GET['activate-multi'], $_REQUEST['activate-multi']);
64
+			EE_Error::add_error(
65
+				sprintf(
66
+					esc_html__(
67
+						'We\'re sorry, but the Event Espresso %1$s addon was deactivated because version %2$s or higher is required with this version of Event Espresso core.',
68
+						'event_espresso'
69
+					),
70
+					$addon_name,
71
+					$min_version_required
72
+				),
73
+				__FILE__,
74
+				__FUNCTION__ . "({$addon_name})",
75
+				__LINE__
76
+			);
77
+			EE_Error::get_notices(false, true);
78
+		}
79
+	}
80 80
 }
Please login to merge, or discard this patch.
core/services/addon/api/AddonApiVersion.php 2 patches
Indentation   +282 added lines, -282 removed lines patch added patch discarded remove patch
@@ -19,286 +19,286 @@
 block discarded – undo
19 19
  */
20 20
 abstract class AddonApiVersion
21 21
 {
22
-    const V1 = 1;
23
-
24
-    /**
25
-     * @var int one of the API_VERSION_* constants from above
26
-     */
27
-    private $api_version;
28
-
29
-    /**
30
-     * @var DomainInterface
31
-     */
32
-    private $domain;
33
-
34
-    /**
35
-     * @var Version minimum version of EE core that the add-on will work with
36
-     */
37
-    private $min_core_version;
38
-
39
-    /**
40
-     * @var Version minimum version of WP core that the add-on will work with
41
-     */
42
-    private $min_wp_version;
43
-
44
-    /**
45
-     * @var string  PascalCase identifier for the add-on.
46
-     *              IMPORTANT! there must be a class of the same name in the root of the add-ons /src/domain/ folder
47
-     */
48
-    private $name;
49
-
50
-    /**
51
-     * @var string
52
-     */
53
-    private $addon_namespace;
54
-
55
-    /**
56
-     * @var FilePath
57
-     */
58
-    private $main_file;
59
-
60
-    /**
61
-     * @var string
62
-     */
63
-    private $slug;
64
-
65
-    /**
66
-     * @var Version the current add-on version
67
-     */
68
-    private $version;
69
-
70
-
71
-    /**
72
-     * Bootstrap constructor.
73
-     *
74
-     * @param string $slug
75
-     * @param string $name
76
-     * @param string $namespace
77
-     * @param string $version
78
-     * @param string $min_core_version
79
-     * @param string $main_file
80
-     * @param int    $api_version
81
-     */
82
-    protected function __construct(
83
-        string $slug,
84
-        string $name,
85
-        string $namespace,
86
-        string $version,
87
-        string $min_core_version,
88
-        string $main_file,
89
-        int $api_version
90
-    ) {
91
-        $this->setSlug($slug);
92
-        $this->setName($name);
93
-        $this->setNamespace($namespace);
94
-        $this->setMinCoreVersion($min_core_version);
95
-        $this->setMainFile($main_file);
96
-        $this->setVersion($version);
97
-        $this->setApiVersion($api_version);
98
-    }
99
-
100
-
101
-    /**
102
-     * @return void
103
-     */
104
-    public function initialize(): void
105
-    {
106
-        $this->domain = DomainFactory::create(
107
-            "{$this->addon_namespace}\\domain\\Domain",
108
-            $this->main_file,
109
-            $this->version
110
-        );
111
-    }
112
-
113
-
114
-    /**
115
-     * @return int[]
116
-     */
117
-    private function validApiVersions(): array
118
-    {
119
-        return [
120
-            AddonApiVersion::V1,
121
-        ];
122
-    }
123
-
124
-
125
-    /**
126
-     * @param int $api_version
127
-     */
128
-    private function setApiVersion(int $api_version): void
129
-    {
130
-        if (! in_array($api_version, $this->validApiVersions())) {
131
-            throw new DomainException(
132
-                esc_html__(
133
-                    'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
134
-                    'event_espresso'
135
-                )
136
-            );
137
-        }
138
-        $this->api_version = $api_version;
139
-    }
140
-
141
-
142
-    /**
143
-     * @param string $main_file
144
-     */
145
-    public function setMainFile(string $main_file): void
146
-    {
147
-        $this->main_file = new FilePath($main_file);
148
-    }
149
-
150
-
151
-    /**
152
-     * @param string $min_core_version
153
-     */
154
-    private function setMinCoreVersion(string $min_core_version): void
155
-    {
156
-        $this->min_core_version = Version::fromString($min_core_version);
157
-    }
158
-
159
-
160
-    /**
161
-     * @param string $name
162
-     */
163
-    public function setName(string $name): void
164
-    {
165
-        $this->name = $name;
166
-    }
167
-
168
-
169
-    /**
170
-     * @param string $namespace
171
-     */
172
-    private function setNamespace(string $namespace): void
173
-    {
174
-        $this->addon_namespace = $namespace;
175
-    }
176
-
177
-
178
-    /**
179
-     * @param string $slug
180
-     */
181
-    private function setSlug(string $slug): void
182
-    {
183
-        $valid_slug = sanitize_key($slug);
184
-        if ($slug !== $valid_slug) {
185
-            throw new DomainException(
186
-                esc_html__(
187
-                    'Invalid Add-on "slug"! Please ensure that slug only uses lowercase characters and dashes.',
188
-                    'event_espresso'
189
-                )
190
-            );
191
-        }
192
-        $this->slug = $valid_slug;
193
-    }
194
-
195
-
196
-    /**
197
-     * @param string $version
198
-     */
199
-    public function setVersion(string $version): void
200
-    {
201
-        $this->version = Version::fromString($version);
202
-    }
203
-
204
-
205
-    /**
206
-     * @return int
207
-     */
208
-    public function apiVersion(): int
209
-    {
210
-        return $this->api_version;
211
-    }
212
-
213
-
214
-    /**
215
-     * @return DomainInterface
216
-     */
217
-    public function domain(): DomainInterface
218
-    {
219
-        return $this->domain;
220
-    }
221
-
222
-
223
-    /**
224
-     * @return Version|null
225
-     */
226
-    public function minCoreVersion(): ?Version
227
-    {
228
-        return $this->min_core_version;
229
-    }
230
-
231
-
232
-    /**
233
-     * @return Version|null
234
-     */
235
-    public function minWpVersion(): ?Version
236
-    {
237
-        return $this->min_wp_version;
238
-    }
239
-
240
-
241
-    /**
242
-     * @param string $min_wp_version
243
-     */
244
-    public function setMinWpVersion(string $min_wp_version = EE_MIN_WP_VER_REQUIRED): void
245
-    {
246
-        $this->min_wp_version = Version::fromString($min_wp_version);
247
-    }
248
-
249
-
250
-    /**
251
-     * @return string
252
-     */
253
-    public function name(): string
254
-    {
255
-        return $this->name;
256
-    }
257
-
258
-
259
-    /**
260
-     * FQCN for the domain's EE_Addon class
261
-     *
262
-     * @return string
263
-     */
264
-    public function fqcn(): string
265
-    {
266
-        return "{$this->addon_namespace}\\domain\\{$this->name}";
267
-    }
268
-
269
-
270
-    /**
271
-     * @return string
272
-     */
273
-    public function getNamespace(): string
274
-    {
275
-        return $this->addon_namespace;
276
-    }
277
-
278
-
279
-    /**
280
-     * @return FilePath
281
-     */
282
-    public function mainFile(): FilePath
283
-    {
284
-        return $this->main_file;
285
-    }
286
-
287
-
288
-    /**
289
-     * @return string
290
-     */
291
-    public function slug(): string
292
-    {
293
-        return $this->slug;
294
-    }
295
-
296
-
297
-    /**
298
-     * @return Version
299
-     */
300
-    public function version(): Version
301
-    {
302
-        return $this->version;
303
-    }
22
+	const V1 = 1;
23
+
24
+	/**
25
+	 * @var int one of the API_VERSION_* constants from above
26
+	 */
27
+	private $api_version;
28
+
29
+	/**
30
+	 * @var DomainInterface
31
+	 */
32
+	private $domain;
33
+
34
+	/**
35
+	 * @var Version minimum version of EE core that the add-on will work with
36
+	 */
37
+	private $min_core_version;
38
+
39
+	/**
40
+	 * @var Version minimum version of WP core that the add-on will work with
41
+	 */
42
+	private $min_wp_version;
43
+
44
+	/**
45
+	 * @var string  PascalCase identifier for the add-on.
46
+	 *              IMPORTANT! there must be a class of the same name in the root of the add-ons /src/domain/ folder
47
+	 */
48
+	private $name;
49
+
50
+	/**
51
+	 * @var string
52
+	 */
53
+	private $addon_namespace;
54
+
55
+	/**
56
+	 * @var FilePath
57
+	 */
58
+	private $main_file;
59
+
60
+	/**
61
+	 * @var string
62
+	 */
63
+	private $slug;
64
+
65
+	/**
66
+	 * @var Version the current add-on version
67
+	 */
68
+	private $version;
69
+
70
+
71
+	/**
72
+	 * Bootstrap constructor.
73
+	 *
74
+	 * @param string $slug
75
+	 * @param string $name
76
+	 * @param string $namespace
77
+	 * @param string $version
78
+	 * @param string $min_core_version
79
+	 * @param string $main_file
80
+	 * @param int    $api_version
81
+	 */
82
+	protected function __construct(
83
+		string $slug,
84
+		string $name,
85
+		string $namespace,
86
+		string $version,
87
+		string $min_core_version,
88
+		string $main_file,
89
+		int $api_version
90
+	) {
91
+		$this->setSlug($slug);
92
+		$this->setName($name);
93
+		$this->setNamespace($namespace);
94
+		$this->setMinCoreVersion($min_core_version);
95
+		$this->setMainFile($main_file);
96
+		$this->setVersion($version);
97
+		$this->setApiVersion($api_version);
98
+	}
99
+
100
+
101
+	/**
102
+	 * @return void
103
+	 */
104
+	public function initialize(): void
105
+	{
106
+		$this->domain = DomainFactory::create(
107
+			"{$this->addon_namespace}\\domain\\Domain",
108
+			$this->main_file,
109
+			$this->version
110
+		);
111
+	}
112
+
113
+
114
+	/**
115
+	 * @return int[]
116
+	 */
117
+	private function validApiVersions(): array
118
+	{
119
+		return [
120
+			AddonApiVersion::V1,
121
+		];
122
+	}
123
+
124
+
125
+	/**
126
+	 * @param int $api_version
127
+	 */
128
+	private function setApiVersion(int $api_version): void
129
+	{
130
+		if (! in_array($api_version, $this->validApiVersions())) {
131
+			throw new DomainException(
132
+				esc_html__(
133
+					'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
134
+					'event_espresso'
135
+				)
136
+			);
137
+		}
138
+		$this->api_version = $api_version;
139
+	}
140
+
141
+
142
+	/**
143
+	 * @param string $main_file
144
+	 */
145
+	public function setMainFile(string $main_file): void
146
+	{
147
+		$this->main_file = new FilePath($main_file);
148
+	}
149
+
150
+
151
+	/**
152
+	 * @param string $min_core_version
153
+	 */
154
+	private function setMinCoreVersion(string $min_core_version): void
155
+	{
156
+		$this->min_core_version = Version::fromString($min_core_version);
157
+	}
158
+
159
+
160
+	/**
161
+	 * @param string $name
162
+	 */
163
+	public function setName(string $name): void
164
+	{
165
+		$this->name = $name;
166
+	}
167
+
168
+
169
+	/**
170
+	 * @param string $namespace
171
+	 */
172
+	private function setNamespace(string $namespace): void
173
+	{
174
+		$this->addon_namespace = $namespace;
175
+	}
176
+
177
+
178
+	/**
179
+	 * @param string $slug
180
+	 */
181
+	private function setSlug(string $slug): void
182
+	{
183
+		$valid_slug = sanitize_key($slug);
184
+		if ($slug !== $valid_slug) {
185
+			throw new DomainException(
186
+				esc_html__(
187
+					'Invalid Add-on "slug"! Please ensure that slug only uses lowercase characters and dashes.',
188
+					'event_espresso'
189
+				)
190
+			);
191
+		}
192
+		$this->slug = $valid_slug;
193
+	}
194
+
195
+
196
+	/**
197
+	 * @param string $version
198
+	 */
199
+	public function setVersion(string $version): void
200
+	{
201
+		$this->version = Version::fromString($version);
202
+	}
203
+
204
+
205
+	/**
206
+	 * @return int
207
+	 */
208
+	public function apiVersion(): int
209
+	{
210
+		return $this->api_version;
211
+	}
212
+
213
+
214
+	/**
215
+	 * @return DomainInterface
216
+	 */
217
+	public function domain(): DomainInterface
218
+	{
219
+		return $this->domain;
220
+	}
221
+
222
+
223
+	/**
224
+	 * @return Version|null
225
+	 */
226
+	public function minCoreVersion(): ?Version
227
+	{
228
+		return $this->min_core_version;
229
+	}
230
+
231
+
232
+	/**
233
+	 * @return Version|null
234
+	 */
235
+	public function minWpVersion(): ?Version
236
+	{
237
+		return $this->min_wp_version;
238
+	}
239
+
240
+
241
+	/**
242
+	 * @param string $min_wp_version
243
+	 */
244
+	public function setMinWpVersion(string $min_wp_version = EE_MIN_WP_VER_REQUIRED): void
245
+	{
246
+		$this->min_wp_version = Version::fromString($min_wp_version);
247
+	}
248
+
249
+
250
+	/**
251
+	 * @return string
252
+	 */
253
+	public function name(): string
254
+	{
255
+		return $this->name;
256
+	}
257
+
258
+
259
+	/**
260
+	 * FQCN for the domain's EE_Addon class
261
+	 *
262
+	 * @return string
263
+	 */
264
+	public function fqcn(): string
265
+	{
266
+		return "{$this->addon_namespace}\\domain\\{$this->name}";
267
+	}
268
+
269
+
270
+	/**
271
+	 * @return string
272
+	 */
273
+	public function getNamespace(): string
274
+	{
275
+		return $this->addon_namespace;
276
+	}
277
+
278
+
279
+	/**
280
+	 * @return FilePath
281
+	 */
282
+	public function mainFile(): FilePath
283
+	{
284
+		return $this->main_file;
285
+	}
286
+
287
+
288
+	/**
289
+	 * @return string
290
+	 */
291
+	public function slug(): string
292
+	{
293
+		return $this->slug;
294
+	}
295
+
296
+
297
+	/**
298
+	 * @return Version
299
+	 */
300
+	public function version(): Version
301
+	{
302
+		return $this->version;
303
+	}
304 304
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -127,7 +127,7 @@
 block discarded – undo
127 127
      */
128 128
     private function setApiVersion(int $api_version): void
129 129
     {
130
-        if (! in_array($api_version, $this->validApiVersions())) {
130
+        if ( ! in_array($api_version, $this->validApiVersions())) {
131 131
             throw new DomainException(
132 132
                 esc_html__(
133 133
                     'Invalid Add-on API Version! Please use one of the EventEspresso\core\domain\entities\addon\Bootstrap class constants',
Please login to merge, or discard this patch.
core/services/addon/api/ThirdPartyPluginHandler.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -42,7 +42,7 @@
 block discarded – undo
42 42
             && ! function_exists('json_basic_auth_handler')
43 43
             && ! function_exists('json_basic_auth_error')
44 44
         ) {
45
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
45
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth/basic-auth.php';
46 46
         }
47 47
     }
48 48
 }
Please login to merge, or discard this patch.
Indentation   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -7,43 +7,43 @@
 block discarded – undo
7 7
 class ThirdPartyPluginHandler
8 8
 {
9 9
 
10
-    /**
11
-     * @var RequestInterface $request
12
-     */
13
-    private $request;
14
-
15
-
16
-    /**
17
-     * ThirdPartyPluginHandler constructor.
18
-     *
19
-     * @param RequestInterface $request
20
-     */
21
-    public function __construct(RequestInterface $request)
22
-    {
23
-        $this->request = $request;
24
-    }
25
-
26
-
27
-    public function loadPlugins()
28
-    {
29
-        $this->wpApiBasicAuth();
30
-    }
31
-
32
-
33
-    private function wpApiBasicAuth()
34
-    {
35
-        // if the WP API basic auth plugin isn't already loaded, load it now.
36
-        // We want it for mobile apps. Just include the entire plugin
37
-        // also, don't load the basic auth when a plugin is getting activated, because
38
-        // it could be the basic auth plugin, and it doesn't check if its methods are already defined
39
-        // and causes a fatal error
40
-        if (
41
-            ($this->request->isWordPressApi() || $this->request->isApi())
42
-            && ! $this->request->isActivation()
43
-            && ! function_exists('json_basic_auth_handler')
44
-            && ! function_exists('json_basic_auth_error')
45
-        ) {
46
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
47
-        }
48
-    }
10
+	/**
11
+	 * @var RequestInterface $request
12
+	 */
13
+	private $request;
14
+
15
+
16
+	/**
17
+	 * ThirdPartyPluginHandler constructor.
18
+	 *
19
+	 * @param RequestInterface $request
20
+	 */
21
+	public function __construct(RequestInterface $request)
22
+	{
23
+		$this->request = $request;
24
+	}
25
+
26
+
27
+	public function loadPlugins()
28
+	{
29
+		$this->wpApiBasicAuth();
30
+	}
31
+
32
+
33
+	private function wpApiBasicAuth()
34
+	{
35
+		// if the WP API basic auth plugin isn't already loaded, load it now.
36
+		// We want it for mobile apps. Just include the entire plugin
37
+		// also, don't load the basic auth when a plugin is getting activated, because
38
+		// it could be the basic auth plugin, and it doesn't check if its methods are already defined
39
+		// and causes a fatal error
40
+		if (
41
+			($this->request->isWordPressApi() || $this->request->isApi())
42
+			&& ! $this->request->isActivation()
43
+			&& ! function_exists('json_basic_auth_handler')
44
+			&& ! function_exists('json_basic_auth_error')
45
+		) {
46
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth/basic-auth.php';
47
+		}
48
+	}
49 49
 }
Please login to merge, or discard this patch.
core/services/addon/api/v1/LegacyModelApi.php 1 patch
Indentation   +91 added lines, -91 removed lines patch added patch discarded remove patch
@@ -5,95 +5,95 @@
 block discarded – undo
5 5
 class LegacyModelApi
6 6
 {
7 7
 
8
-    /**
9
-     * @var string path to EE_* entity classes
10
-     */
11
-    private $entity_classes;
12
-
13
-    /**
14
-     * @var string path to EEM_* entity model classes
15
-     */
16
-    private $entity_models;
17
-
18
-    /**
19
-     * @var string path to EEE_* entity class extensions
20
-     */
21
-    private $entity_class_extensions;
22
-
23
-    /**
24
-     * @var string path to EEME_* entity model class extensions
25
-     */
26
-    private $entity_model_extensions;
27
-
28
-
29
-    /**
30
-     * @return string
31
-     */
32
-    public function entityClasses(): string
33
-    {
34
-        return $this->entity_classes;
35
-    }
36
-
37
-
38
-    /**
39
-     * @param string $entity_classes
40
-     */
41
-    public function addEntityClasses(string $entity_classes): void
42
-    {
43
-        $this->entity_classes = $entity_classes;
44
-    }
45
-
46
-
47
-    /**
48
-     * @return string
49
-     */
50
-    public function entityModels(): string
51
-    {
52
-        return $this->entity_models;
53
-    }
54
-
55
-
56
-    /**
57
-     * @param string $entity_models
58
-     */
59
-    public function addEntityModels(string $entity_models): void
60
-    {
61
-        $this->entity_models = $entity_models;
62
-    }
63
-
64
-
65
-    /**
66
-     * @return string
67
-     */
68
-    public function entityClassExtensions(): string
69
-    {
70
-        return $this->entity_class_extensions;
71
-    }
72
-
73
-
74
-    /**
75
-     * @param string $entity_class_extensions
76
-     */
77
-    public function addEntityClassExtensions(string $entity_class_extensions): void
78
-    {
79
-        $this->entity_class_extensions = $entity_class_extensions;
80
-    }
81
-
82
-
83
-    /**
84
-     * @return string
85
-     */
86
-    public function entityModelExtensions(): string
87
-    {
88
-        return $this->entity_model_extensions;
89
-    }
90
-
91
-
92
-    /**
93
-     * @param string $entity_model_extensions
94
-     */
95
-    public function addEntityModelExtensions(string $entity_model_extensions): void
96
-    {
97
-        $this->entity_model_extensions = $entity_model_extensions;
98
-    }
8
+	/**
9
+	 * @var string path to EE_* entity classes
10
+	 */
11
+	private $entity_classes;
12
+
13
+	/**
14
+	 * @var string path to EEM_* entity model classes
15
+	 */
16
+	private $entity_models;
17
+
18
+	/**
19
+	 * @var string path to EEE_* entity class extensions
20
+	 */
21
+	private $entity_class_extensions;
22
+
23
+	/**
24
+	 * @var string path to EEME_* entity model class extensions
25
+	 */
26
+	private $entity_model_extensions;
27
+
28
+
29
+	/**
30
+	 * @return string
31
+	 */
32
+	public function entityClasses(): string
33
+	{
34
+		return $this->entity_classes;
35
+	}
36
+
37
+
38
+	/**
39
+	 * @param string $entity_classes
40
+	 */
41
+	public function addEntityClasses(string $entity_classes): void
42
+	{
43
+		$this->entity_classes = $entity_classes;
44
+	}
45
+
46
+
47
+	/**
48
+	 * @return string
49
+	 */
50
+	public function entityModels(): string
51
+	{
52
+		return $this->entity_models;
53
+	}
54
+
55
+
56
+	/**
57
+	 * @param string $entity_models
58
+	 */
59
+	public function addEntityModels(string $entity_models): void
60
+	{
61
+		$this->entity_models = $entity_models;
62
+	}
63
+
64
+
65
+	/**
66
+	 * @return string
67
+	 */
68
+	public function entityClassExtensions(): string
69
+	{
70
+		return $this->entity_class_extensions;
71
+	}
72
+
73
+
74
+	/**
75
+	 * @param string $entity_class_extensions
76
+	 */
77
+	public function addEntityClassExtensions(string $entity_class_extensions): void
78
+	{
79
+		$this->entity_class_extensions = $entity_class_extensions;
80
+	}
81
+
82
+
83
+	/**
84
+	 * @return string
85
+	 */
86
+	public function entityModelExtensions(): string
87
+	{
88
+		return $this->entity_model_extensions;
89
+	}
90
+
91
+
92
+	/**
93
+	 * @param string $entity_model_extensions
94
+	 */
95
+	public function addEntityModelExtensions(string $entity_model_extensions): void
96
+	{
97
+		$this->entity_model_extensions = $entity_model_extensions;
98
+	}
99 99
 }
Please login to merge, or discard this patch.