Completed
Branch dependabot/composer/wp-graphql... (64393b)
by
unknown
04:29
created
core/services/dependencies/DependencyHandler.php 1 patch
Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -7,19 +7,19 @@
 block discarded – undo
7 7
 abstract class DependencyHandler implements DependencyHandlerInterface
8 8
 {
9 9
 
10
-    /**
11
-     * @var EE_Dependency_Map $dependency_map
12
-     */
13
-    protected $dependency_map;
10
+	/**
11
+	 * @var EE_Dependency_Map $dependency_map
12
+	 */
13
+	protected $dependency_map;
14 14
 
15 15
 
16
-    /**
17
-     * DependencyHandler constructor.
18
-     *
19
-     * @param EE_Dependency_Map $dependency_map
20
-     */
21
-    public function __construct(EE_Dependency_Map $dependency_map)
22
-    {
23
-        $this->dependency_map = $dependency_map;
24
-    }
16
+	/**
17
+	 * DependencyHandler constructor.
18
+	 *
19
+	 * @param EE_Dependency_Map $dependency_map
20
+	 */
21
+	public function __construct(EE_Dependency_Map $dependency_map)
22
+	{
23
+		$this->dependency_map = $dependency_map;
24
+	}
25 25
 }
Please login to merge, or discard this patch.
core/domain/entities/admin/GraphQLData/GraphQLData.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -44,15 +44,15 @@  discard block
 block discarded – undo
44 44
      */
45 45
     protected function getQueryResponse(string $field_key, array $where_params = [])
46 46
     {
47
-        if (! empty($where_params)) {
48
-            if (! array_key_exists('variables', $this->params)) {
47
+        if ( ! empty($where_params)) {
48
+            if ( ! array_key_exists('variables', $this->params)) {
49 49
                 $this->params['variables'] = [];
50 50
             }
51 51
             $this->params['variables']['where'] = $where_params;
52 52
         }
53 53
 
54 54
         $responseData = $this->makeGraphQLRequest($this->params);
55
-        return ! empty($responseData[ $field_key ]) ? $responseData[ $field_key ] : null;
55
+        return ! empty($responseData[$field_key]) ? $responseData[$field_key] : null;
56 56
     }
57 57
 
58 58
 
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
         $error = '';
67 67
         try {
68 68
             $response = graphql($data);
69
-            if (! empty($response['data'])) {
69
+            if ( ! empty($response['data'])) {
70 70
                 return $response['data'];
71 71
             }
72 72
             $error = ! empty($response['errors'])
Please login to merge, or discard this patch.
Indentation   +59 added lines, -59 removed lines patch added patch discarded remove patch
@@ -14,72 +14,72 @@
 block discarded – undo
14 14
  */
15 15
 abstract class GraphQLData implements GraphQLDataInterface
16 16
 {
17
-    public const QUERY_LIMIT = 250;
17
+	public const QUERY_LIMIT = 250;
18 18
 
19
-    /**
20
-     * @var string $namespace The graphql namespace/prefix.
21
-     */
22
-    protected string $namespace = 'Espresso';
19
+	/**
20
+	 * @var string $namespace The graphql namespace/prefix.
21
+	 */
22
+	protected string $namespace = 'Espresso';
23 23
 
24
-    private array $params = [];
24
+	private array $params = [];
25 25
 
26 26
 
27
-    /**
28
-     * @param array $params
29
-     */
30
-    public function setParams(array $params)
31
-    {
32
-        $this->params = $params;
33
-    }
27
+	/**
28
+	 * @param array $params
29
+	 */
30
+	public function setParams(array $params)
31
+	{
32
+		$this->params = $params;
33
+	}
34 34
 
35 35
 
36
-    /**
37
-     * @param string $field_key
38
-     * @param array  $where_params
39
-     * @return mixed|null
40
-     * @since 5.0.0.p
41
-     */
42
-    protected function getQueryResponse(string $field_key, array $where_params = [])
43
-    {
44
-        if (! empty($where_params)) {
45
-            if (! array_key_exists('variables', $this->params)) {
46
-                $this->params['variables'] = [];
47
-            }
48
-            $this->params['variables']['where'] = $where_params;
49
-        }
36
+	/**
37
+	 * @param string $field_key
38
+	 * @param array  $where_params
39
+	 * @return mixed|null
40
+	 * @since 5.0.0.p
41
+	 */
42
+	protected function getQueryResponse(string $field_key, array $where_params = [])
43
+	{
44
+		if (! empty($where_params)) {
45
+			if (! array_key_exists('variables', $this->params)) {
46
+				$this->params['variables'] = [];
47
+			}
48
+			$this->params['variables']['where'] = $where_params;
49
+		}
50 50
 
51
-        $responseData = $this->makeGraphQLRequest($this->params);
52
-        return ! empty($responseData[ $field_key ]) ? $responseData[ $field_key ] : null;
53
-    }
51
+		$responseData = $this->makeGraphQLRequest($this->params);
52
+		return ! empty($responseData[ $field_key ]) ? $responseData[ $field_key ] : null;
53
+	}
54 54
 
55 55
 
56
-    /**
57
-     * @param array $data
58
-     * @return array|null
59
-     * @since 5.0.0.p
60
-     */
61
-    protected function makeGraphQLRequest(array $data): ?array
62
-    {
63
-        $error = '';
64
-        try {
65
-            $response = graphql($data);
66
-            if (! empty($response['data'])) {
67
-                return $response['data'];
68
-            }
69
-            $error = ! empty($response['errors'])
70
-                ? print_r($response['errors'], true)
71
-                : esc_html__(
72
-                    'An unknown error has occurred during the GraphQL request and no data was found to return.',
73
-                    'event_espresso'
74
-                );
75
-        } catch (Exception $e) {
76
-            if (defined('GRAPHQL_DEBUG') && GRAPHQL_DEBUG) {
77
-                $error = $e->getMessage();
78
-            }
79
-        }
80
-        if ($error !== '') {
81
-            error_log($error);
82
-        }
83
-        return null;
84
-    }
56
+	/**
57
+	 * @param array $data
58
+	 * @return array|null
59
+	 * @since 5.0.0.p
60
+	 */
61
+	protected function makeGraphQLRequest(array $data): ?array
62
+	{
63
+		$error = '';
64
+		try {
65
+			$response = graphql($data);
66
+			if (! empty($response['data'])) {
67
+				return $response['data'];
68
+			}
69
+			$error = ! empty($response['errors'])
70
+				? print_r($response['errors'], true)
71
+				: esc_html__(
72
+					'An unknown error has occurred during the GraphQL request and no data was found to return.',
73
+					'event_espresso'
74
+				);
75
+		} catch (Exception $e) {
76
+			if (defined('GRAPHQL_DEBUG') && GRAPHQL_DEBUG) {
77
+				$error = $e->getMessage();
78
+			}
79
+		}
80
+		if ($error !== '') {
81
+			error_log($error);
82
+		}
83
+		return null;
84
+	}
85 85
 }
Please login to merge, or discard this patch.
core/domain/EnqueueAssetsInterface.php 1 patch
Indentation   +35 added lines, -35 removed lines patch added patch discarded remove patch
@@ -4,45 +4,45 @@
 block discarded – undo
4 4
 interface EnqueueAssetsInterface
5 5
 {
6 6
 
7
-    /**
8
-     * a place to register scripts and stylesheets with WordPress core
9
-     * IMPORTANT !!!
10
-     * ALL JavaScript files need to be registered for loading in the footer
11
-     * by setting the 5th parameter of wp_register_script() to ` true `
12
-     *
13
-     * @return void
14
-     */
15
-    public function registerScriptsAndStylesheets();
7
+	/**
8
+	 * a place to register scripts and stylesheets with WordPress core
9
+	 * IMPORTANT !!!
10
+	 * ALL JavaScript files need to be registered for loading in the footer
11
+	 * by setting the 5th parameter of wp_register_script() to ` true `
12
+	 *
13
+	 * @return void
14
+	 */
15
+	public function registerScriptsAndStylesheets();
16 16
 
17
-    /**
18
-     * a place to enqueue previously registered stylesheets
19
-     * this will be called during the wp_enqueue_scripts hook for frontend requests
20
-     *
21
-     * @return void
22
-     */
23
-    public function enqueueStylesheets();
17
+	/**
18
+	 * a place to enqueue previously registered stylesheets
19
+	 * this will be called during the wp_enqueue_scripts hook for frontend requests
20
+	 *
21
+	 * @return void
22
+	 */
23
+	public function enqueueStylesheets();
24 24
 
25
-    /**
26
-     * a place to enqueue previously registered stylesheets
27
-     * this will be called during the admin_enqueue_scripts hook for admin requests
28
-     *
29
-     * @return void
30
-     */
31
-    public function enqueueAdminStylesheets();
25
+	/**
26
+	 * a place to enqueue previously registered stylesheets
27
+	 * this will be called during the admin_enqueue_scripts hook for admin requests
28
+	 *
29
+	 * @return void
30
+	 */
31
+	public function enqueueAdminStylesheets();
32 32
 
33
-    /**
34
-     * a place to enqueue previously registered scripts for frontend requests
35
-     *
36
-     * @return void
37
-     */
38
-    public function enqueueScripts();
33
+	/**
34
+	 * a place to enqueue previously registered scripts for frontend requests
35
+	 *
36
+	 * @return void
37
+	 */
38
+	public function enqueueScripts();
39 39
 
40
-    /**
41
-     * a place to enqueue previously registered scripts for admin requests
42
-     *
43
-     * @return void
44
-     */
45
-    public function enqueueAdminScripts();
40
+	/**
41
+	 * a place to enqueue previously registered scripts for admin requests
42
+	 *
43
+	 * @return void
44
+	 */
45
+	public function enqueueAdminScripts();
46 46
 }
47 47
 // End of file EnqueueAssetsInterface.php
48 48
 // Location: EventEspresso\core\domain/EnqueueAssetsInterface.php
Please login to merge, or discard this patch.
Paypal_Pro/help_tabs/payment_methods_overview_paypalpro.help_tab.php 1 patch
Indentation   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -2,12 +2,12 @@  discard block
 block discarded – undo
2 2
 <p><?php esc_html_e('Adjust the settings for the PayPal Pro payment gateway.', 'event_espresso'); ?></p>
3 3
 <p>
4 4
     <?php
5
-    printf(
6
-        esc_html__('See %1$shere%2$s for list of currencies supported by Paypal Pro.', 'event_espresso'),
7
-        "<a href='https://www.paypal.com/multicurrency' target='_blank' rel='noopener noreferrer'>",
8
-        "</a>"
9
-    );
10
-    ?>
5
+	printf(
6
+		esc_html__('See %1$shere%2$s for list of currencies supported by Paypal Pro.', 'event_espresso'),
7
+		"<a href='https://www.paypal.com/multicurrency' target='_blank' rel='noopener noreferrer'>",
8
+		"</a>"
9
+	);
10
+	?>
11 11
 </p>
12 12
 <p><strong><?php esc_html_e('PayPal Pro Settings', 'event_espresso'); ?></strong></p>
13 13
 <ul>
@@ -18,48 +18,48 @@  discard block
 block discarded – undo
18 18
     <li>
19 19
         <strong><?php esc_html_e('PayPal API Username', 'event_espresso'); ?></strong><br/>
20 20
         <?php
21
-        printf(
22
-            esc_html__(
23
-                'Enter your API Username for PayPal. Learn how to find your %1$sAPI Username%2$s.',
24
-                'event_espresso'
25
-            ),
26
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
27
-            '</a>'
28
-        );
29
-        ?>
21
+		printf(
22
+			esc_html__(
23
+				'Enter your API Username for PayPal. Learn how to find your %1$sAPI Username%2$s.',
24
+				'event_espresso'
25
+			),
26
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
27
+			'</a>'
28
+		);
29
+		?>
30 30
     </li>
31 31
     <li>
32 32
         <strong><?php esc_html_e('PayPal API Password', 'event_espresso'); ?></strong><br/>
33 33
         <?php
34
-        printf(
35
-            esc_html__(
36
-                'Enter your API Password for PayPal. Learn how to find your %1$sAPI Password%2$s.',
37
-                'event_espresso'
38
-            ),
39
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
40
-            '</a>'
41
-        );
42
-        ?>
34
+		printf(
35
+			esc_html__(
36
+				'Enter your API Password for PayPal. Learn how to find your %1$sAPI Password%2$s.',
37
+				'event_espresso'
38
+			),
39
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
40
+			'</a>'
41
+		);
42
+		?>
43 43
     </li>
44 44
     <li>
45 45
         <strong><?php esc_html_e('PayPal API Signature', 'event_espresso'); ?></strong><br/>
46 46
         <?php
47
-        printf(
48
-            esc_html__(
49
-                'Enter your API Signature for PayPal. Learn how to find your %1$sAPI Signature%2$s.',
50
-                'event_espresso'
51
-            ),
52
-            '<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
53
-            '</a>'
54
-        );
55
-        ?>
47
+		printf(
48
+			esc_html__(
49
+				'Enter your API Signature for PayPal. Learn how to find your %1$sAPI Signature%2$s.',
50
+				'event_espresso'
51
+			),
52
+			'<a href="https://www.paypal.com/us/cgi-bin/webscr?cmd=xpt/cps/merchant/wppro/WPProIntegrationSteps-outside#SectionB" target="_blank" rel="noopener noreferrer">',
53
+			'</a>'
54
+		);
55
+		?>
56 56
     </li>
57 57
     <li>
58 58
         <strong><?php esc_html_e('Country Currency', 'event_espresso'); ?></strong><br/>
59 59
         <?php esc_html_e(
60
-            'Select the currency for your country. Payments will be accepted in this currency.',
61
-            'event_espresso'
62
-        ); ?>
60
+			'Select the currency for your country. Payments will be accepted in this currency.',
61
+			'event_espresso'
62
+		); ?>
63 63
     </li>
64 64
     <li>
65 65
         <strong><?php esc_html_e('Accepted Card Types', 'event_espresso'); ?></strong><br/>
@@ -68,9 +68,9 @@  discard block
 block discarded – undo
68 68
     <li>
69 69
         <strong><?php esc_html_e('Use the Debugging Feature and the PayPal Sandbox', 'event_espresso'); ?></strong><br/>
70 70
         <?php esc_html_e(
71
-            'Specify if you want to test the payment gateway by submitting a test transaction. If this option is enabled, be sure to enter your PayPal sandbox credentials in the fields above. Be sure to turn this setting off when you are done testing.',
72
-            'event_espresso'
73
-        ); ?>
71
+			'Specify if you want to test the payment gateway by submitting a test transaction. If this option is enabled, be sure to enter your PayPal sandbox credentials in the fields above. Be sure to turn this setting off when you are done testing.',
72
+			'event_espresso'
73
+		); ?>
74 74
     </li>
75 75
     <li>
76 76
         <strong><?php esc_html_e('Button Image URL', 'event_espresso'); ?></strong><br/>
Please login to merge, or discard this patch.
admin_pages/messages/help_tabs/messages_overview_types.help_tab.php 1 patch
Indentation   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -1,15 +1,15 @@  discard block
 block discarded – undo
1 1
 <p><strong><?php esc_html_e('Message Types', 'event_espresso'); ?></strong></p>
2 2
 <p>
3 3
     <?php
4
-    printf(
5
-        esc_html__(
6
-            'Messages are email notifications that are sent out by Event Espresso. Message Types are the %1$skinds%2$s of messages that get delivered.  They can be thought of as the "type" of package that is being delivered by the messenger. For example, Event Espresso comes with two Message Types attached to the Email Messenger:',
7
-            'event_espresso'
8
-        ),
9
-        '<em>',
10
-        '</em>'
11
-    );
12
-    ?>
4
+	printf(
5
+		esc_html__(
6
+			'Messages are email notifications that are sent out by Event Espresso. Message Types are the %1$skinds%2$s of messages that get delivered.  They can be thought of as the "type" of package that is being delivered by the messenger. For example, Event Espresso comes with two Message Types attached to the Email Messenger:',
7
+			'event_espresso'
8
+		),
9
+		'<em>',
10
+		'</em>'
11
+	);
12
+	?>
13 13
 </p>
14 14
 <ul>
15 15
     <li>
@@ -24,20 +24,20 @@  discard block
 block discarded – undo
24 24
 <p><strong><?php esc_html_e('Contexts', 'event_espresso'); ?></strong></p>
25 25
 <p>
26 26
     <?php esc_html_e(
27
-        'Each Message Type (kind of message) has different contexts. Contexts are dynamic and typically represent recipients (individuals receiving email notifications). For example, when the Registration Confirmation message type is triggered, it will send out a message to the following recipients: Event Administrator, Primary Registrant, and Additional Registrants. On the other hand, the Payment Message Type has only two recipients: Event Administrator and Primary Registrant.',
28
-        'event_espresso'
29
-    ); ?>
27
+		'Each Message Type (kind of message) has different contexts. Contexts are dynamic and typically represent recipients (individuals receiving email notifications). For example, when the Registration Confirmation message type is triggered, it will send out a message to the following recipients: Event Administrator, Primary Registrant, and Additional Registrants. On the other hand, the Payment Message Type has only two recipients: Event Administrator and Primary Registrant.',
28
+		'event_espresso'
29
+	); ?>
30 30
 </p>
31 31
 <p>
32 32
     <?php esc_html_e(
33
-        'A message context can be deactivated by removing a recipient from the "TO" field. This will set the field to blank and you can save changes. Deactivated message contexts will appear in grey when viewed in the Messages Overview tab. To re-activate a message context, go to that message context and setup a recipient (using one of the available shortcodes) and save changes. This will reactivate the message context and it will appear as blue in the Messages Overview tab.',
34
-        'event_espresso'
35
-    ); ?>
33
+		'A message context can be deactivated by removing a recipient from the "TO" field. This will set the field to blank and you can save changes. Deactivated message contexts will appear in grey when viewed in the Messages Overview tab. To re-activate a message context, go to that message context and setup a recipient (using one of the available shortcodes) and save changes. This will reactivate the message context and it will appear as blue in the Messages Overview tab.',
34
+		'event_espresso'
35
+	); ?>
36 36
 </p>
37 37
 <p><strong><?php esc_html_e('Activation / Deactivation of Message Types', 'event_espresso'); ?></strong></p>
38 38
 <p>
39 39
     <?php esc_html_e(
40
-        'When a new install of Event Espresso is activated, all message types will be activated except for those for Cancelled and Declined registrations. The message types for Cancelled and Declined registrations can be easily activated through the Settings tab for Messages. Deactivating and re-activating Event Espresso will keep the current settings saved.',
41
-        'event_espresso'
42
-    ); ?>
40
+		'When a new install of Event Espresso is activated, all message types will be activated except for those for Cancelled and Declined registrations. The message types for Cancelled and Declined registrations can be easily activated through the Settings tab for Messages. Deactivating and re-activating Event Espresso will keep the current settings saved.',
41
+		'event_espresso'
42
+	); ?>
43 43
 </p>
Please login to merge, or discard this patch.
admin_pages/payments/help_tabs/payment_methods_overview.help_tab.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@
 block discarded – undo
53 53
                 'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
54 54
                 'event_espresso'
55 55
             ),
56
-            '<img src="' . admin_url('images/media-button-image.gif') . '">'
56
+            '<img src="'.admin_url('images/media-button-image.gif').'">'
57 57
         );
58 58
         ?>
59 59
     </li>
Please login to merge, or discard this patch.
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -12,62 +12,62 @@  discard block
 block discarded – undo
12 12
         <strong><?php esc_html_e('Name', 'event_espresso'); ?></strong>
13 13
         <br>
14 14
         <?php esc_html_e(
15
-            'The name of the payment method as customers see it in the registration form, in emails, in receipts, etc.',
16
-            'event_espresso'
17
-        ); ?>
15
+			'The name of the payment method as customers see it in the registration form, in emails, in receipts, etc.',
16
+			'event_espresso'
17
+		); ?>
18 18
     </li>
19 19
     <li>
20 20
         <strong><?php esc_html_e('Description', 'event_espresso'); ?></strong>
21 21
         <br />
22 22
         <?php esc_html_e(
23
-            'The description of how to use the payment method as customers will see it. This is mostly only seen during registration.',
24
-            'event_espresso'
25
-        ); ?>
23
+			'The description of how to use the payment method as customers will see it. This is mostly only seen during registration.',
24
+			'event_espresso'
25
+		); ?>
26 26
     </li>
27 27
     <li>
28 28
         <strong><?php esc_html_e('Admin-Only Name', 'event_espresso'); ?></strong>
29 29
         <br />
30 30
         <?php esc_html_e(
31
-            'The name of the payment method as seen internally by site administrators and staff.',
32
-            'event_espresso'
33
-        ); ?>
31
+			'The name of the payment method as seen internally by site administrators and staff.',
32
+			'event_espresso'
33
+		); ?>
34 34
     </li>
35 35
     <li>
36 36
         <strong><?php esc_html_e('Admin-Only Description', 'event_espresso'); ?></strong>
37 37
         <br />
38 38
         <?php esc_html_e(
39
-            'The description of the payment method as seen internally by site administrators and staff.',
40
-            'event_espresso'
41
-        ); ?>
39
+			'The description of the payment method as seen internally by site administrators and staff.',
40
+			'event_espresso'
41
+		); ?>
42 42
     </li>
43 43
     <li>
44 44
         <strong><?php esc_html_e('Debug (sandbox) Mode', 'event_espresso'); ?></strong>
45 45
         <br />
46 46
         <?php esc_html_e(
47
-            'Many payment methods have a debug/sandbox mode where payments are not processed but are only simulated. This is helpful when setup and debugging.',
48
-            'event_espresso'
49
-        ); ?>
47
+			'Many payment methods have a debug/sandbox mode where payments are not processed but are only simulated. This is helpful when setup and debugging.',
48
+			'event_espresso'
49
+		); ?>
50 50
     </li>
51 51
     <li>
52 52
         <strong><?php esc_html_e('Open by Default', 'event_espresso'); ?></strong>
53 53
         <br />
54 54
         <?php esc_html_e(
55
-            'If checked, this payment method will be selected by default (assuming no other valid payment methods are also marked as open by default.)',
56
-            'event_espresso'
57
-        ); ?>
55
+			'If checked, this payment method will be selected by default (assuming no other valid payment methods are also marked as open by default.)',
56
+			'event_espresso'
57
+		); ?>
58 58
     </li>
59 59
     <li>
60 60
         <strong><?php esc_html_e('Button URL', 'event_espresso'); ?></strong>
61 61
         <br />
62 62
         <?php
63
-        printf(
64
-            esc_html__(
65
-                'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
66
-                'event_espresso'
67
-            ),
68
-            '<img src="' . admin_url('images/media-button-image.gif') . '">'
69
-        );
70
-        ?>
63
+		printf(
64
+			esc_html__(
65
+				'The URL of the button image for this payment method in the registration process. You may use any uploaded image on your website (click %s next to the field to select). If left blank, the default button image will be used.',
66
+				'event_espresso'
67
+			),
68
+			'<img src="' . admin_url('images/media-button-image.gif') . '">'
69
+		);
70
+		?>
71 71
     </li>
72 72
     <li>
73 73
         <strong><?php esc_html_e('Usable From', 'event_espresso'); ?></strong>
@@ -76,15 +76,15 @@  discard block
 block discarded – undo
76 76
         <ul>
77 77
             <li>
78 78
                 <?php esc_html_e(
79
-                    'Front-end Registration Page: the payment method will appear as an option during the normal registration process to customers and they can use it to process payments.',
80
-                    'event_espresso'
81
-                ); ?>
79
+					'Front-end Registration Page: the payment method will appear as an option during the normal registration process to customers and they can use it to process payments.',
80
+					'event_espresso'
81
+				); ?>
82 82
             </li>
83 83
             <li>
84 84
                 <?php esc_html_e(
85
-                    'Admin Registration Page: when recording payments made from the transaction admin page, the payment method will appear as an option. Note: currently payments can only be RECORDED from the admin, they cannot be PROCESSED.',
86
-                    'event_espresso'
87
-                ); ?>
85
+					'Admin Registration Page: when recording payments made from the transaction admin page, the payment method will appear as an option. Note: currently payments can only be RECORDED from the admin, they cannot be PROCESSED.',
86
+					'event_espresso'
87
+				); ?>
88 88
             </li>
89 89
         </ul>
90 90
     </li>
@@ -92,14 +92,14 @@  discard block
 block discarded – undo
92 92
 <strong><?php esc_html_e('Recommendations', 'event_espresso'); ?></strong>
93 93
 <br />
94 94
 <?php esc_html_e(
95
-    'To learn more about the options on this page, take a look at the different tabs that appear on the left side of the page.',
96
-    'event_espresso'
95
+	'To learn more about the options on this page, take a look at the different tabs that appear on the left side of the page.',
96
+	'event_espresso'
97 97
 ); ?>
98 98
 <p>
99 99
     <strong><?php esc_html_e('Screen Options', 'event_espresso'); ?></strong>
100 100
     <br />
101 101
     <?php esc_html_e(
102
-        'You can customize the information that is shown on this page by toggling the Screen Options tab. Then you can add or remove checkmarks to hide or show certain content.',
103
-        'event_espresso'
104
-    ); ?>
102
+		'You can customize the information that is shown on this page by toggling the Screen Options tab. Then you can add or remove checkmarks to hide or show certain content.',
103
+		'event_espresso'
104
+	); ?>
105 105
 </p>
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   +836 added lines, -836 removed lines patch added patch discarded remove patch
@@ -16,840 +16,840 @@
 block discarded – undo
16 16
  */
17 17
 class EEM_Datetime extends EEM_Soft_Delete_Base
18 18
 {
19
-    protected static ?EEM_Datetime $_instance = null;
20
-
21
-
22
-    /**
23
-     * private constructor to prevent direct creation
24
-     *
25
-     * @param string|null $timezone A string representing the timezone we want to set for returned Date Time Strings
26
-     *                              (and any incoming timezone data that gets saved).
27
-     *                              Note this just sends the timezone info to the date time model field objects.
28
-     *                              Default is NULL
29
-     *                              (and will be assumed using the set timezone in the 'timezone_string' wp option)
30
-     * @throws EE_Error
31
-     */
32
-    protected function __construct(?string $timezone = '')
33
-    {
34
-        $this->singular_item           = esc_html__('Datetime', 'event_espresso');
35
-        $this->plural_item             = esc_html__('Datetimes', 'event_espresso');
36
-        $this->_tables                 = [
37
-            'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
38
-        ];
39
-        $this->_fields                 = [
40
-            'Datetime' => [
41
-                'DTT_ID'          => new EE_Primary_Key_Int_Field(
42
-                    'DTT_ID',
43
-                    esc_html__('Datetime ID', 'event_espresso')
44
-                ),
45
-                'EVT_ID'          => new EE_Foreign_Key_Int_Field(
46
-                    'EVT_ID',
47
-                    esc_html__('Event ID', 'event_espresso'),
48
-                    false,
49
-                    0,
50
-                    'Event'
51
-                ),
52
-                'VNU_ID'          => new EE_Foreign_Key_Int_Field(
53
-                    'VNU_ID',
54
-                    __('Venue ID', 'event_espresso'),
55
-                    false,
56
-                    0,
57
-                    'Venue'
58
-                ),
59
-                'DTT_name'        => new EE_Plain_Text_Field(
60
-                    'DTT_name',
61
-                    esc_html__('Datetime Name', 'event_espresso'),
62
-                    false,
63
-                    ''
64
-                ),
65
-                'DTT_description' => new EE_Post_Content_Field(
66
-                    'DTT_description',
67
-                    esc_html__('Description for Datetime', 'event_espresso'),
68
-                    false,
69
-                    ''
70
-                ),
71
-                'DTT_EVT_start'   => new EE_Datetime_Field(
72
-                    'DTT_EVT_start',
73
-                    esc_html__('Start time/date of Event', 'event_espresso'),
74
-                    false,
75
-                    EE_Datetime_Field::now,
76
-                    $timezone
77
-                ),
78
-                'DTT_EVT_end'     => new EE_Datetime_Field(
79
-                    'DTT_EVT_end',
80
-                    esc_html__('End time/date of Event', 'event_espresso'),
81
-                    false,
82
-                    EE_Datetime_Field::now,
83
-                    $timezone
84
-                ),
85
-                'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
86
-                    'DTT_reg_limit',
87
-                    esc_html__('Registration Limit for this time', 'event_espresso'),
88
-                    false,
89
-                    EE_INF
90
-                ),
91
-                'DTT_sold'        => new EE_Integer_Field(
92
-                    'DTT_sold',
93
-                    esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
94
-                    false,
95
-                    0
96
-                ),
97
-                'DTT_reserved'    => new EE_Integer_Field(
98
-                    'DTT_reserved',
99
-                    esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
100
-                    false,
101
-                    0
102
-                ),
103
-                'DTT_is_primary'  => new EE_Boolean_Field(
104
-                    'DTT_is_primary',
105
-                    esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
106
-                    false,
107
-                    false
108
-                ),
109
-                'DTT_order'       => new EE_Integer_Field(
110
-                    'DTT_order',
111
-                    esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
112
-                    false,
113
-                    0
114
-                ),
115
-                'DTT_parent'      => new EE_Integer_Field(
116
-                    'DTT_parent',
117
-                    esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
118
-                    true,
119
-                    0
120
-                ),
121
-                'DTT_deleted'     => new EE_Trashed_Flag_Field(
122
-                    'DTT_deleted',
123
-                    esc_html__('Flag indicating datetime is archived', 'event_espresso'),
124
-                    false,
125
-                    false
126
-                ),
127
-            ],
128
-        ];
129
-        $this->_model_relations        = [
130
-            'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
131
-            'Event'           => new EE_Belongs_To_Relation(),
132
-            'Checkin'         => new EE_Has_Many_Relation(),
133
-            'Datetime_Ticket' => new EE_Has_Many_Relation(),
134
-            'Venue'           => new EE_Belongs_To_Relation(),
135
-        ];
136
-        $path_to_event_model           = 'Event';
137
-        $this->model_chain_to_password = $path_to_event_model;
138
-        $this->_model_chain_to_wp_user = $path_to_event_model;
139
-        // this model is generally available for reading
140
-        $this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
141
-            new EE_Restriction_Generator_Event_Related_Public(
142
-                $path_to_event_model
143
-            );
144
-        $this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
145
-            new EE_Restriction_Generator_Event_Related_Protected(
146
-                $path_to_event_model
147
-            );
148
-        $this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
149
-            new EE_Restriction_Generator_Event_Related_Protected(
150
-                $path_to_event_model
151
-            );
152
-        $this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
153
-            new EE_Restriction_Generator_Event_Related_Protected(
154
-                $path_to_event_model,
155
-                EEM_Base::caps_edit
156
-            );
157
-        parent::__construct($timezone);
158
-    }
159
-
160
-
161
-    /**
162
-     * create new blank datetime
163
-     *
164
-     * @access public
165
-     * @return EE_Datetime[] array on success, FALSE on fail
166
-     * @throws EE_Error
167
-     * @throws InvalidArgumentException
168
-     * @throws InvalidDataTypeException
169
-     * @throws ReflectionException
170
-     * @throws InvalidInterfaceException
171
-     */
172
-    public function create_new_blank_datetime()
173
-    {
174
-        // makes sure timezone is always set.
175
-        $timezone_string = $this->get_timezone();
176
-        /**
177
-         * Filters the initial start date for the new datetime.
178
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
179
-         *
180
-         * @param int $start_date Unix timestamp representing now + 30 days in seconds.
181
-         * @return int Unix timestamp
182
-         */
183
-        $start_date = apply_filters(
184
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
185
-            $this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
186
-        );
187
-        /**
188
-         * Filters the initial end date for the new datetime.
189
-         * Any time included in this value will be overridden later so use additional filters to modify the time.
190
-         *
191
-         * @param int $end_data Unix timestamp representing now + 30 days in seconds.
192
-         * @return int Unix timestamp
193
-         */
194
-        $end_date       = apply_filters(
195
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
196
-            $this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
197
-        );
198
-        $blank_datetime = EE_Datetime::new_instance(
199
-            [
200
-                'DTT_EVT_start' => $start_date,
201
-                'DTT_EVT_end'   => $end_date,
202
-                'DTT_order'     => 1,
203
-                'DTT_reg_limit' => EE_INF_IN_DB,
204
-            ],
205
-            $timezone_string
206
-        );
207
-        /**
208
-         * Filters the initial start time and format for the new EE_Datetime instance.
209
-         *
210
-         * @param array $start_time An array having size 2.  First element is the time, second element is the time
211
-         *                          format.
212
-         * @return array
213
-         */
214
-        $start_time = apply_filters(
215
-            'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
216
-            ['8am', 'ga']
217
-        );
218
-        /**
219
-         * Filters the initial end time and format for the new EE_Datetime instance.
220
-         *
221
-         * @param array $end_time An array having size 2.  First element is the time, second element is the time
222
-         *                        format
223
-         * @return array
224
-         */
225
-        $end_time = apply_filters(
226
-            'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
227
-            ['5pm', 'ga']
228
-        );
229
-        $this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
230
-        $blank_datetime->set_start_time(
231
-            $this->convert_datetime_for_query(
232
-                'DTT_EVT_start',
233
-                $start_time[0],
234
-                $start_time[1],
235
-                $timezone_string
236
-            )
237
-        );
238
-        $blank_datetime->set_end_time(
239
-            $this->convert_datetime_for_query(
240
-                'DTT_EVT_end',
241
-                $end_time[0],
242
-                $end_time[1],
243
-                $timezone_string
244
-            )
245
-        );
246
-        return [$blank_datetime];
247
-    }
248
-
249
-
250
-    /**
251
-     * Validates whether the start_time and end_time are in the expected format.
252
-     *
253
-     * @param array $start_time
254
-     * @param array $end_time
255
-     * @throws InvalidArgumentException
256
-     * @throws InvalidDataTypeException
257
-     */
258
-    private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
259
-    {
260
-        if (! is_array($start_time)) {
261
-            throw new InvalidDataTypeException('start_time', $start_time, 'array');
262
-        }
263
-        if (! is_array($end_time)) {
264
-            throw new InvalidDataTypeException('end_time', $end_time, 'array');
265
-        }
266
-        if (count($start_time) !== 2) {
267
-            throw new InvalidArgumentException(
268
-                sprintf(
269
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
270
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
271
-                    '$start_time'
272
-                )
273
-            );
274
-        }
275
-        if (count($end_time) !== 2) {
276
-            throw new InvalidArgumentException(
277
-                sprintf(
278
-                    'The variable %1$s is expected to be an array with two elements.  The first item in the '
279
-                    . 'array should be a valid time string, the second item in the array should be a valid time format',
280
-                    '$end_time'
281
-                )
282
-            );
283
-        }
284
-    }
285
-
286
-
287
-    /**
288
-     * get event start date from db
289
-     *
290
-     * @access public
291
-     * @param int $EVT_ID
292
-     * @return EE_Datetime[] array on success, FALSE on fail
293
-     * @throws EE_Error
294
-     * @throws ReflectionException
295
-     */
296
-    public function get_all_event_dates($EVT_ID = 0)
297
-    {
298
-        if (! $EVT_ID) { // on add_new_event event_id gets set to 0
299
-            return $this->create_new_blank_datetime();
300
-        }
301
-        $results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
302
-        if (empty($results)) {
303
-            return $this->create_new_blank_datetime();
304
-        }
305
-        return $results;
306
-    }
307
-
308
-
309
-    /**
310
-     * get all datetimes attached to an event ordered by the DTT_order field
311
-     *
312
-     * @public
313
-     * @param int     $EVT_ID     event id
314
-     * @param boolean $include_expired
315
-     * @param boolean $include_deleted
316
-     * @param int     $limit      If included then limit the count of results by
317
-     *                            the given number
318
-     * @return EE_Datetime[]
319
-     * @throws EE_Error
320
-     */
321
-    public function get_datetimes_for_event_ordered_by_DTT_order(
322
-        int $EVT_ID,
323
-        bool $include_expired = true,
324
-        bool $include_deleted = true,
325
-        $limit = 0
326
-    ) {
327
-        $prev_data_prep_value = $this->prepModelForQuery();
328
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
329
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
330
-        $query_params         = $this->addDefaultWhereConditions($query_params);
331
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
332
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
333
-    }
334
-
335
-
336
-    /**
337
-     * Gets the datetimes for the event (with the given limit), and orders them by "importance".
338
-     * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
339
-     * and then the earlier datetimes are the most important.
340
-     * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
341
-     *
342
-     * @param int $EVT_ID
343
-     * @param int $limit
344
-     * @return EE_Datetime[]|EE_Base_Class[]
345
-     * @throws EE_Error
346
-     */
347
-    public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
348
-    {
349
-        $query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
350
-        $query_params    = $this->addDefaultWhereConditions($query_params);
351
-        $query_params    = $this->addDefaultQueryParams($query_params, $limit);
352
-        return $this->get_all($query_params);
353
-    }
354
-
355
-
356
-    /**
357
-     * @param int     $EVT_ID
358
-     * @param boolean $include_expired
359
-     * @param boolean $include_deleted
360
-     * @return EE_Datetime
361
-     * @throws EE_Error
362
-     */
363
-    public function get_oldest_datetime_for_event(
364
-        int $EVT_ID,
365
-        bool $include_expired = false,
366
-        bool $include_deleted = false
367
-    ) {
368
-        $results = $this->get_datetimes_for_event_ordered_by_start_time(
369
-            $EVT_ID,
370
-            $include_expired,
371
-            $include_deleted,
372
-            1
373
-        );
374
-        if ($results) {
375
-            return array_shift($results);
376
-        }
377
-        return null;
378
-    }
379
-
380
-
381
-    /**
382
-     * Gets the 'primary' datetime for an event.
383
-     *
384
-     * @param int  $EVT_ID
385
-     * @param bool $try_to_exclude_expired
386
-     * @param bool $try_to_exclude_deleted
387
-     * @return EE_Datetime
388
-     * @throws EE_Error
389
-     */
390
-    public function get_primary_datetime_for_event(
391
-        int $EVT_ID,
392
-        bool $try_to_exclude_expired = true,
393
-        bool $try_to_exclude_deleted = true
394
-    ) {
395
-        if ($try_to_exclude_expired) {
396
-            $non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
397
-            if ($non_expired) {
398
-                return $non_expired;
399
-            }
400
-        }
401
-        if ($try_to_exclude_deleted) {
402
-            $expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
403
-            if ($expired_even) {
404
-                return $expired_even;
405
-            }
406
-        }
407
-        return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
408
-    }
409
-
410
-
411
-    /**
412
-     * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
413
-     * only by start date
414
-     *
415
-     * @param int     $EVT_ID
416
-     * @param boolean $include_expired
417
-     * @param boolean $include_deleted
418
-     * @param int     $limit
419
-     * @return EE_Datetime[]
420
-     * @throws EE_Error
421
-     */
422
-    public function get_datetimes_for_event_ordered_by_start_time(
423
-        int $EVT_ID,
424
-        bool $include_expired = true,
425
-        bool $include_deleted = true,
426
-        $limit = 0
427
-    ) {
428
-        $prev_data_prep_value = $this->prepModelForQuery();
429
-        $where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
430
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
431
-        $query_params         = $this->addDefaultWhereConditions(
432
-            $query_params,
433
-            EEM_Base::default_where_conditions_this_only
434
-        );
435
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
436
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
437
-    }
438
-
439
-
440
-    /**
441
-     * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
442
-     * only by start date
443
-     *
444
-     * @param int     $TKT_ID
445
-     * @param boolean $include_expired
446
-     * @param boolean $include_deleted
447
-     * @param int     $limit
448
-     * @return EE_Datetime[]
449
-     * @throws EE_Error
450
-     */
451
-    public function get_datetimes_for_ticket_ordered_by_start_time(
452
-        int $TKT_ID,
453
-        bool $include_expired = true,
454
-        bool $include_deleted = true,
455
-        $limit = 0
456
-    ) {
457
-        $prev_data_prep_value = $this->prepModelForQuery();
458
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
459
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
460
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit);
461
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
462
-    }
463
-
464
-
465
-    /**
466
-     * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
467
-     * datetimes.
468
-     *
469
-     * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
470
-     * @param boolean  $include_expired  whether to include expired datetimes or not
471
-     * @param boolean  $include_deleted  whether to include trashed datetimes or not.
472
-     * @param int|null $limit            if null, no limit, if int then limit results by
473
-     *                                   that number
474
-     * @return EE_Datetime[]
475
-     * @throws EE_Error
476
-     */
477
-    public function get_datetimes_for_ticket_ordered_by_DTT_order(
478
-        int $TKT_ID,
479
-        bool $include_expired = true,
480
-        bool $include_deleted = true,
481
-        $limit = 0
482
-    ) {
483
-        $prev_data_prep_value = $this->prepModelForQuery();
484
-        $where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
485
-        $query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
486
-        $query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
487
-        return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
488
-    }
489
-
490
-
491
-    /**
492
-     * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
493
-     * reason it doesn't exist, we consider the earliest event the most important)
494
-     *
495
-     * @param int $EVT_ID
496
-     * @return EE_Datetime
497
-     * @throws EE_Error
498
-     */
499
-    public function get_most_important_datetime_for_event(int $EVT_ID)
500
-    {
501
-        $results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
502
-        if ($results) {
503
-            return array_shift($results);
504
-        }
505
-        return null;
506
-    }
507
-
508
-
509
-    /**
510
-     * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
511
-     * grouped by month and year.
512
-     *
513
-     * @param array  $where_params       @see
514
-     *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
515
-     * @param string $evt_active_status  A string representing the evt active status to filter the months by.
516
-     *                                   Can be:
517
-     *                                   - '' = no filter
518
-     *                                   - upcoming = Published events with at least one upcoming datetime.
519
-     *                                   - expired = Events with all datetimes expired.
520
-     *                                   - active = Events that are published and have at least one datetime that
521
-     *                                   starts before now and ends after now.
522
-     *                                   - inactive = Events that are either not published.
523
-     * @return stdClass[]
524
-     * @throws EE_Error
525
-     * @throws InvalidArgumentException
526
-     * @throws InvalidArgumentException
527
-     */
528
-    public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
529
-    {
530
-        $current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
531
-        $current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
532
-        switch ($evt_active_status) {
533
-            case 'upcoming':
534
-                $where_params['Event.status'] = 'publish';
535
-                // if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
536
-                if (isset($where_params['DTT_EVT_start'])) {
537
-                    $where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
538
-                }
539
-                $where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
540
-                break;
541
-            case 'expired':
542
-                if (isset($where_params['Event.status'])) {
543
-                    unset($where_params['Event.status']);
544
-                }
545
-                // get events to exclude
546
-                $exclude_query[0] = array_merge(
547
-                    $where_params,
548
-                    ['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
549
-                );
550
-                // first get all events that have datetimes where its not expired.
551
-                $event_ids = $this->_get_all_wpdb_results(
552
-                    $exclude_query,
553
-                    OBJECT_K,
554
-                    'Datetime.EVT_ID'
555
-                );
556
-                $event_ids = array_keys($event_ids);
557
-                if (isset($where_params['DTT_EVT_end'])) {
558
-                    $where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
559
-                }
560
-                $where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
561
-                $where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
562
-                break;
563
-            case 'active':
564
-                $where_params['Event.status'] = 'publish';
565
-                if (isset($where_params['DTT_EVT_start'])) {
566
-                    $where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
567
-                }
568
-                if (isset($where_params['Datetime.DTT_EVT_end'])) {
569
-                    $where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
570
-                }
571
-                $where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
572
-                $where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
573
-                break;
574
-            case 'inactive':
575
-                if (isset($where_params['Event.status'])) {
576
-                    unset($where_params['Event.status']);
577
-                }
578
-                if (isset($where_params['OR'])) {
579
-                    $where_params['AND']['OR'] = $where_params['OR'];
580
-                }
581
-                if (isset($where_params['DTT_EVT_end'])) {
582
-                    $where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
583
-                    unset($where_params['DTT_EVT_end']);
584
-                }
585
-                if (isset($where_params['DTT_EVT_start'])) {
586
-                    $where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
587
-                    unset($where_params['DTT_EVT_start']);
588
-                }
589
-                $where_params['AND']['Event.status'] = ['!=', 'publish'];
590
-                break;
591
-        }
592
-        $query_params[0]          = $where_params;
593
-        $query_params['group_by'] = ['dtt_year', 'dtt_month'];
594
-        $query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
595
-
596
-        $query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
597
-            $this->get_timezone(),
598
-            'DTT_EVT_start'
599
-        );
600
-        $columns_to_select = [
601
-            'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
602
-            'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
603
-            'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
604
-        ];
605
-        return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
606
-    }
607
-
608
-
609
-    /**
610
-     * Updates the DTT_sold attribute on each datetime (based on the registrations
611
-     * for the tickets for each datetime)
612
-     *
613
-     * @param EE_Base_Class[]|EE_Datetime[] $datetimes
614
-     * @throws EE_Error
615
-     * @throws ReflectionException
616
-     */
617
-    public function update_sold(array $datetimes)
618
-    {
619
-        EE_Error::doing_it_wrong(
620
-            __FUNCTION__,
621
-            esc_html__(
622
-                'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
623
-                'event_espresso'
624
-            ),
625
-            '4.9.32.rc.005'
626
-        );
627
-        foreach ($datetimes as $datetime) {
628
-            $datetime->update_sold();
629
-        }
630
-    }
631
-
632
-
633
-    /**
634
-     *    Gets the total number of tickets available at a particular datetime
635
-     *    (does NOT take into account the datetime's spaces available)
636
-     *
637
-     * @param int   $DTT_ID
638
-     * @param array $query_params
639
-     * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
640
-     *             tickets attached to datetime then FALSE is returned.
641
-     * @throws EE_Error
642
-     * @throws ReflectionException
643
-     */
644
-    public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
645
-    {
646
-        $datetime = $this->get_one_by_ID($DTT_ID);
647
-        if ($datetime instanceof EE_Datetime) {
648
-            return $datetime->tickets_remaining($query_params);
649
-        }
650
-        return 0;
651
-    }
652
-
653
-
654
-    /**
655
-     * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
656
-     *
657
-     * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
658
-     *                                 stati you want counts for as values in the array.  An empty array returns counts
659
-     *                                 for all valid stati.
660
-     * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
661
-     *                                 only for Datetimes connected to a specific event, or specific ticket.
662
-     * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
663
-     * @throws EE_Error
664
-     *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
665
-     *                                 EE_Datetime::expired
666
-     */
667
-    public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
668
-    {
669
-        // only accept where conditions for this query.
670
-        $_where            = isset($query_params[0]) ? $query_params[0] : [];
671
-        $status_query_args = [
672
-            EE_Datetime::active   => array_merge(
673
-                $_where,
674
-                ['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
675
-            ),
676
-            EE_Datetime::upcoming => array_merge(
677
-                $_where,
678
-                ['DTT_EVT_start' => ['>', time()]]
679
-            ),
680
-            EE_Datetime::expired  => array_merge(
681
-                $_where,
682
-                ['DTT_EVT_end' => ['<', time()]]
683
-            ),
684
-        ];
685
-        if (! empty($stati_to_include)) {
686
-            foreach (array_keys($status_query_args) as $status) {
687
-                if (! in_array($status, $stati_to_include, true)) {
688
-                    unset($status_query_args[ $status ]);
689
-                }
690
-            }
691
-        }
692
-        // loop through and query counts for each stati.
693
-        $status_query_results = [];
694
-        foreach ($status_query_args as $status => $status_where_conditions) {
695
-            $status_query_results[ $status ] = EEM_Datetime::count(
696
-                [$status_where_conditions],
697
-                'DTT_ID',
698
-                true
699
-            );
700
-        }
701
-        return $status_query_results;
702
-    }
703
-
704
-
705
-    /**
706
-     * Returns the specific count for a given Datetime status matching any given query_params.
707
-     *
708
-     * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
709
-     * @param array  $query_params
710
-     * @return int
711
-     * @throws EE_Error
712
-     */
713
-    public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
714
-    {
715
-        $count = $this->get_datetime_counts_by_status([$status], $query_params);
716
-        return ! empty($count[ $status ]) ? $count[ $status ] : 0;
717
-    }
718
-
719
-
720
-    /**
721
-     * @return bool|int
722
-     * @since   5.0.0.p
723
-     */
724
-    private function prepModelForQuery()
725
-    {
726
-        $prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
727
-        $this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
728
-        return $prev_data_prep_value;
729
-    }
730
-
731
-
732
-    /**
733
-     * @param array    $query_params
734
-     * @param bool|int $prev_data_prep_value
735
-     * @return EE_Base_Class[]|EE_Datetime[]
736
-     * @throws EE_Error
737
-     * @since   5.0.0.p
738
-     */
739
-    private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
740
-    {
741
-        $result = $this->get_all($query_params);
742
-        $this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
743
-        return $result;
744
-    }
745
-
746
-
747
-    /**
748
-     * @param array  $query_params
749
-     * @param int    $limit
750
-     * @param string $order_by
751
-     * @param string $order
752
-     * @return array
753
-     * @since   5.0.0.p
754
-     */
755
-    private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
756
-    {
757
-        $query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
758
-        $query_params = $this->addLimitQueryParams($query_params, $limit);
759
-        return $query_params;
760
-    }
761
-
762
-
763
-    /**
764
-     * @param array  $query_params
765
-     * @param string $default_where_conditions
766
-     * @return array
767
-     * @since   5.0.0.p
768
-     */
769
-    private function addDefaultWhereConditions(
770
-        array $query_params,
771
-        $default_where_conditions = EEM_Base::default_where_conditions_none
772
-    ) {
773
-        $query_params['default_where_conditions'] = $default_where_conditions;
774
-        return $query_params;
775
-    }
776
-
777
-
778
-    /**
779
-     * @param array $where_params
780
-     * @param bool  $include_deleted
781
-     * @param bool  $include_expired
782
-     * @return array
783
-     * @since   5.0.0.p
784
-     */
785
-    private function addDefaultWhereParams(
786
-        array $where_params,
787
-        bool $include_deleted = true,
788
-        bool $include_expired = true
789
-    ) {
790
-        $where_params = $this->addExpiredWhereParams($where_params, $include_expired);
791
-        $where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
792
-        return $where_params;
793
-    }
794
-
795
-
796
-    /**
797
-     * @param array $where_params
798
-     * @param bool  $include_deleted
799
-     * @return array
800
-     * @since   5.0.0.p
801
-     */
802
-    private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
803
-    {
804
-        $deleted                     = $include_deleted ? [true, false] : [false];
805
-        $where_params['DTT_deleted'] = ['IN', $deleted];
806
-        return $where_params;
807
-    }
808
-
809
-
810
-    /**
811
-     * @param array $where_params
812
-     * @param bool  $include_expired
813
-     * @return array
814
-     * @since   5.0.0.p
815
-     */
816
-    private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
817
-    {
818
-        if (! $include_expired) {
819
-            $where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
820
-        }
821
-        return $where_params;
822
-    }
823
-
824
-
825
-    /**
826
-     * @param array $query_params
827
-     * @param int   $limit
828
-     * @return array
829
-     * @since   5.0.0.p
830
-     */
831
-    private function addLimitQueryParams(array $query_params, $limit = 0)
832
-    {
833
-        if ($limit) {
834
-            $query_params['limit'] = $limit;
835
-        }
836
-        return $query_params;
837
-    }
838
-
839
-
840
-    /**
841
-     * @param array  $query_params
842
-     * @param string $order_by
843
-     * @param string $order
844
-     * @return array
845
-     * @since   5.0.0.p
846
-     */
847
-    private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
848
-    {
849
-        $order                    = $order === 'ASC' ? 'ASC' : 'DESC';
850
-        $valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
851
-        $order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
852
-        $query_params['order_by'] = [$order_by => $order];
853
-        return $query_params;
854
-    }
19
+	protected static ?EEM_Datetime $_instance = null;
20
+
21
+
22
+	/**
23
+	 * private constructor to prevent direct creation
24
+	 *
25
+	 * @param string|null $timezone A string representing the timezone we want to set for returned Date Time Strings
26
+	 *                              (and any incoming timezone data that gets saved).
27
+	 *                              Note this just sends the timezone info to the date time model field objects.
28
+	 *                              Default is NULL
29
+	 *                              (and will be assumed using the set timezone in the 'timezone_string' wp option)
30
+	 * @throws EE_Error
31
+	 */
32
+	protected function __construct(?string $timezone = '')
33
+	{
34
+		$this->singular_item           = esc_html__('Datetime', 'event_espresso');
35
+		$this->plural_item             = esc_html__('Datetimes', 'event_espresso');
36
+		$this->_tables                 = [
37
+			'Datetime' => new EE_Primary_Table('esp_datetime', 'DTT_ID'),
38
+		];
39
+		$this->_fields                 = [
40
+			'Datetime' => [
41
+				'DTT_ID'          => new EE_Primary_Key_Int_Field(
42
+					'DTT_ID',
43
+					esc_html__('Datetime ID', 'event_espresso')
44
+				),
45
+				'EVT_ID'          => new EE_Foreign_Key_Int_Field(
46
+					'EVT_ID',
47
+					esc_html__('Event ID', 'event_espresso'),
48
+					false,
49
+					0,
50
+					'Event'
51
+				),
52
+				'VNU_ID'          => new EE_Foreign_Key_Int_Field(
53
+					'VNU_ID',
54
+					__('Venue ID', 'event_espresso'),
55
+					false,
56
+					0,
57
+					'Venue'
58
+				),
59
+				'DTT_name'        => new EE_Plain_Text_Field(
60
+					'DTT_name',
61
+					esc_html__('Datetime Name', 'event_espresso'),
62
+					false,
63
+					''
64
+				),
65
+				'DTT_description' => new EE_Post_Content_Field(
66
+					'DTT_description',
67
+					esc_html__('Description for Datetime', 'event_espresso'),
68
+					false,
69
+					''
70
+				),
71
+				'DTT_EVT_start'   => new EE_Datetime_Field(
72
+					'DTT_EVT_start',
73
+					esc_html__('Start time/date of Event', 'event_espresso'),
74
+					false,
75
+					EE_Datetime_Field::now,
76
+					$timezone
77
+				),
78
+				'DTT_EVT_end'     => new EE_Datetime_Field(
79
+					'DTT_EVT_end',
80
+					esc_html__('End time/date of Event', 'event_espresso'),
81
+					false,
82
+					EE_Datetime_Field::now,
83
+					$timezone
84
+				),
85
+				'DTT_reg_limit'   => new EE_Infinite_Integer_Field(
86
+					'DTT_reg_limit',
87
+					esc_html__('Registration Limit for this time', 'event_espresso'),
88
+					false,
89
+					EE_INF
90
+				),
91
+				'DTT_sold'        => new EE_Integer_Field(
92
+					'DTT_sold',
93
+					esc_html__('How many sales for this Datetime that have occurred', 'event_espresso'),
94
+					false,
95
+					0
96
+				),
97
+				'DTT_reserved'    => new EE_Integer_Field(
98
+					'DTT_reserved',
99
+					esc_html__('Quantity of tickets reserved, but not yet fully purchased', 'event_espresso'),
100
+					false,
101
+					0
102
+				),
103
+				'DTT_is_primary'  => new EE_Boolean_Field(
104
+					'DTT_is_primary',
105
+					esc_html__('Flag indicating datetime is primary one for event', 'event_espresso'),
106
+					false,
107
+					false
108
+				),
109
+				'DTT_order'       => new EE_Integer_Field(
110
+					'DTT_order',
111
+					esc_html__('The order in which the Datetime is displayed', 'event_espresso'),
112
+					false,
113
+					0
114
+				),
115
+				'DTT_parent'      => new EE_Integer_Field(
116
+					'DTT_parent',
117
+					esc_html__('Indicates what DTT_ID is the parent of this DTT_ID', 'event_espresso'),
118
+					true,
119
+					0
120
+				),
121
+				'DTT_deleted'     => new EE_Trashed_Flag_Field(
122
+					'DTT_deleted',
123
+					esc_html__('Flag indicating datetime is archived', 'event_espresso'),
124
+					false,
125
+					false
126
+				),
127
+			],
128
+		];
129
+		$this->_model_relations        = [
130
+			'Ticket'          => new EE_HABTM_Relation('Datetime_Ticket'),
131
+			'Event'           => new EE_Belongs_To_Relation(),
132
+			'Checkin'         => new EE_Has_Many_Relation(),
133
+			'Datetime_Ticket' => new EE_Has_Many_Relation(),
134
+			'Venue'           => new EE_Belongs_To_Relation(),
135
+		];
136
+		$path_to_event_model           = 'Event';
137
+		$this->model_chain_to_password = $path_to_event_model;
138
+		$this->_model_chain_to_wp_user = $path_to_event_model;
139
+		// this model is generally available for reading
140
+		$this->_cap_restriction_generators[ EEM_Base::caps_read ]       =
141
+			new EE_Restriction_Generator_Event_Related_Public(
142
+				$path_to_event_model
143
+			);
144
+		$this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] =
145
+			new EE_Restriction_Generator_Event_Related_Protected(
146
+				$path_to_event_model
147
+			);
148
+		$this->_cap_restriction_generators[ EEM_Base::caps_edit ]       =
149
+			new EE_Restriction_Generator_Event_Related_Protected(
150
+				$path_to_event_model
151
+			);
152
+		$this->_cap_restriction_generators[ EEM_Base::caps_delete ]     =
153
+			new EE_Restriction_Generator_Event_Related_Protected(
154
+				$path_to_event_model,
155
+				EEM_Base::caps_edit
156
+			);
157
+		parent::__construct($timezone);
158
+	}
159
+
160
+
161
+	/**
162
+	 * create new blank datetime
163
+	 *
164
+	 * @access public
165
+	 * @return EE_Datetime[] array on success, FALSE on fail
166
+	 * @throws EE_Error
167
+	 * @throws InvalidArgumentException
168
+	 * @throws InvalidDataTypeException
169
+	 * @throws ReflectionException
170
+	 * @throws InvalidInterfaceException
171
+	 */
172
+	public function create_new_blank_datetime()
173
+	{
174
+		// makes sure timezone is always set.
175
+		$timezone_string = $this->get_timezone();
176
+		/**
177
+		 * Filters the initial start date for the new datetime.
178
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
179
+		 *
180
+		 * @param int $start_date Unix timestamp representing now + 30 days in seconds.
181
+		 * @return int Unix timestamp
182
+		 */
183
+		$start_date = apply_filters(
184
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_date',
185
+			$this->current_time_for_query('DTT_EVT_start', true) + MONTH_IN_SECONDS
186
+		);
187
+		/**
188
+		 * Filters the initial end date for the new datetime.
189
+		 * Any time included in this value will be overridden later so use additional filters to modify the time.
190
+		 *
191
+		 * @param int $end_data Unix timestamp representing now + 30 days in seconds.
192
+		 * @return int Unix timestamp
193
+		 */
194
+		$end_date       = apply_filters(
195
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_date',
196
+			$this->current_time_for_query('DTT_EVT_end', true) + MONTH_IN_SECONDS
197
+		);
198
+		$blank_datetime = EE_Datetime::new_instance(
199
+			[
200
+				'DTT_EVT_start' => $start_date,
201
+				'DTT_EVT_end'   => $end_date,
202
+				'DTT_order'     => 1,
203
+				'DTT_reg_limit' => EE_INF_IN_DB,
204
+			],
205
+			$timezone_string
206
+		);
207
+		/**
208
+		 * Filters the initial start time and format for the new EE_Datetime instance.
209
+		 *
210
+		 * @param array $start_time An array having size 2.  First element is the time, second element is the time
211
+		 *                          format.
212
+		 * @return array
213
+		 */
214
+		$start_time = apply_filters(
215
+			'FHEE__EEM_Datetime__create_new_blank_datetime__start_time',
216
+			['8am', 'ga']
217
+		);
218
+		/**
219
+		 * Filters the initial end time and format for the new EE_Datetime instance.
220
+		 *
221
+		 * @param array $end_time An array having size 2.  First element is the time, second element is the time
222
+		 *                        format
223
+		 * @return array
224
+		 */
225
+		$end_time = apply_filters(
226
+			'FHEE__EEM_Datetime__create_new_blank_datetime__end_time',
227
+			['5pm', 'ga']
228
+		);
229
+		$this->validateStartAndEndTimeForBlankDate($start_time, $end_time);
230
+		$blank_datetime->set_start_time(
231
+			$this->convert_datetime_for_query(
232
+				'DTT_EVT_start',
233
+				$start_time[0],
234
+				$start_time[1],
235
+				$timezone_string
236
+			)
237
+		);
238
+		$blank_datetime->set_end_time(
239
+			$this->convert_datetime_for_query(
240
+				'DTT_EVT_end',
241
+				$end_time[0],
242
+				$end_time[1],
243
+				$timezone_string
244
+			)
245
+		);
246
+		return [$blank_datetime];
247
+	}
248
+
249
+
250
+	/**
251
+	 * Validates whether the start_time and end_time are in the expected format.
252
+	 *
253
+	 * @param array $start_time
254
+	 * @param array $end_time
255
+	 * @throws InvalidArgumentException
256
+	 * @throws InvalidDataTypeException
257
+	 */
258
+	private function validateStartAndEndTimeForBlankDate(array $start_time, array $end_time)
259
+	{
260
+		if (! is_array($start_time)) {
261
+			throw new InvalidDataTypeException('start_time', $start_time, 'array');
262
+		}
263
+		if (! is_array($end_time)) {
264
+			throw new InvalidDataTypeException('end_time', $end_time, 'array');
265
+		}
266
+		if (count($start_time) !== 2) {
267
+			throw new InvalidArgumentException(
268
+				sprintf(
269
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
270
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
271
+					'$start_time'
272
+				)
273
+			);
274
+		}
275
+		if (count($end_time) !== 2) {
276
+			throw new InvalidArgumentException(
277
+				sprintf(
278
+					'The variable %1$s is expected to be an array with two elements.  The first item in the '
279
+					. 'array should be a valid time string, the second item in the array should be a valid time format',
280
+					'$end_time'
281
+				)
282
+			);
283
+		}
284
+	}
285
+
286
+
287
+	/**
288
+	 * get event start date from db
289
+	 *
290
+	 * @access public
291
+	 * @param int $EVT_ID
292
+	 * @return EE_Datetime[] array on success, FALSE on fail
293
+	 * @throws EE_Error
294
+	 * @throws ReflectionException
295
+	 */
296
+	public function get_all_event_dates($EVT_ID = 0)
297
+	{
298
+		if (! $EVT_ID) { // on add_new_event event_id gets set to 0
299
+			return $this->create_new_blank_datetime();
300
+		}
301
+		$results = $this->get_datetimes_for_event_ordered_by_DTT_order($EVT_ID);
302
+		if (empty($results)) {
303
+			return $this->create_new_blank_datetime();
304
+		}
305
+		return $results;
306
+	}
307
+
308
+
309
+	/**
310
+	 * get all datetimes attached to an event ordered by the DTT_order field
311
+	 *
312
+	 * @public
313
+	 * @param int     $EVT_ID     event id
314
+	 * @param boolean $include_expired
315
+	 * @param boolean $include_deleted
316
+	 * @param int     $limit      If included then limit the count of results by
317
+	 *                            the given number
318
+	 * @return EE_Datetime[]
319
+	 * @throws EE_Error
320
+	 */
321
+	public function get_datetimes_for_event_ordered_by_DTT_order(
322
+		int $EVT_ID,
323
+		bool $include_expired = true,
324
+		bool $include_deleted = true,
325
+		$limit = 0
326
+	) {
327
+		$prev_data_prep_value = $this->prepModelForQuery();
328
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
329
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
330
+		$query_params         = $this->addDefaultWhereConditions($query_params);
331
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
332
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
333
+	}
334
+
335
+
336
+	/**
337
+	 * Gets the datetimes for the event (with the given limit), and orders them by "importance".
338
+	 * By importance, we mean that the primary datetimes are most important (DEPRECATED FOR NOW),
339
+	 * and then the earlier datetimes are the most important.
340
+	 * Maybe we'll want this to take into account datetimes that haven't already passed, but we don't yet.
341
+	 *
342
+	 * @param int $EVT_ID
343
+	 * @param int $limit
344
+	 * @return EE_Datetime[]|EE_Base_Class[]
345
+	 * @throws EE_Error
346
+	 */
347
+	public function get_datetimes_for_event_ordered_by_importance(int $EVT_ID, $limit = 0)
348
+	{
349
+		$query_params[0] = ['Event.EVT_ID' => absint($EVT_ID)];
350
+		$query_params    = $this->addDefaultWhereConditions($query_params);
351
+		$query_params    = $this->addDefaultQueryParams($query_params, $limit);
352
+		return $this->get_all($query_params);
353
+	}
354
+
355
+
356
+	/**
357
+	 * @param int     $EVT_ID
358
+	 * @param boolean $include_expired
359
+	 * @param boolean $include_deleted
360
+	 * @return EE_Datetime
361
+	 * @throws EE_Error
362
+	 */
363
+	public function get_oldest_datetime_for_event(
364
+		int $EVT_ID,
365
+		bool $include_expired = false,
366
+		bool $include_deleted = false
367
+	) {
368
+		$results = $this->get_datetimes_for_event_ordered_by_start_time(
369
+			$EVT_ID,
370
+			$include_expired,
371
+			$include_deleted,
372
+			1
373
+		);
374
+		if ($results) {
375
+			return array_shift($results);
376
+		}
377
+		return null;
378
+	}
379
+
380
+
381
+	/**
382
+	 * Gets the 'primary' datetime for an event.
383
+	 *
384
+	 * @param int  $EVT_ID
385
+	 * @param bool $try_to_exclude_expired
386
+	 * @param bool $try_to_exclude_deleted
387
+	 * @return EE_Datetime
388
+	 * @throws EE_Error
389
+	 */
390
+	public function get_primary_datetime_for_event(
391
+		int $EVT_ID,
392
+		bool $try_to_exclude_expired = true,
393
+		bool $try_to_exclude_deleted = true
394
+	) {
395
+		if ($try_to_exclude_expired) {
396
+			$non_expired = $this->get_oldest_datetime_for_event($EVT_ID, false, false);
397
+			if ($non_expired) {
398
+				return $non_expired;
399
+			}
400
+		}
401
+		if ($try_to_exclude_deleted) {
402
+			$expired_even = $this->get_oldest_datetime_for_event($EVT_ID, true);
403
+			if ($expired_even) {
404
+				return $expired_even;
405
+			}
406
+		}
407
+		return $this->get_oldest_datetime_for_event($EVT_ID, true, true);
408
+	}
409
+
410
+
411
+	/**
412
+	 * Gets ALL the datetimes for an event (including trashed ones, for now), ordered
413
+	 * only by start date
414
+	 *
415
+	 * @param int     $EVT_ID
416
+	 * @param boolean $include_expired
417
+	 * @param boolean $include_deleted
418
+	 * @param int     $limit
419
+	 * @return EE_Datetime[]
420
+	 * @throws EE_Error
421
+	 */
422
+	public function get_datetimes_for_event_ordered_by_start_time(
423
+		int $EVT_ID,
424
+		bool $include_expired = true,
425
+		bool $include_deleted = true,
426
+		$limit = 0
427
+	) {
428
+		$prev_data_prep_value = $this->prepModelForQuery();
429
+		$where_params         = ['Event.EVT_ID' => absint($EVT_ID)];
430
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
431
+		$query_params         = $this->addDefaultWhereConditions(
432
+			$query_params,
433
+			EEM_Base::default_where_conditions_this_only
434
+		);
435
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
436
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
437
+	}
438
+
439
+
440
+	/**
441
+	 * Gets ALL the datetimes for an ticket (including trashed ones, for now), ordered
442
+	 * only by start date
443
+	 *
444
+	 * @param int     $TKT_ID
445
+	 * @param boolean $include_expired
446
+	 * @param boolean $include_deleted
447
+	 * @param int     $limit
448
+	 * @return EE_Datetime[]
449
+	 * @throws EE_Error
450
+	 */
451
+	public function get_datetimes_for_ticket_ordered_by_start_time(
452
+		int $TKT_ID,
453
+		bool $include_expired = true,
454
+		bool $include_deleted = true,
455
+		$limit = 0
456
+	) {
457
+		$prev_data_prep_value = $this->prepModelForQuery();
458
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
459
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
460
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit);
461
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
462
+	}
463
+
464
+
465
+	/**
466
+	 * Gets all the datetimes for a ticket (including trashed ones, for now), ordered by the DTT_order for the
467
+	 * datetimes.
468
+	 *
469
+	 * @param int      $TKT_ID           ID of ticket to retrieve the datetimes for
470
+	 * @param boolean  $include_expired  whether to include expired datetimes or not
471
+	 * @param boolean  $include_deleted  whether to include trashed datetimes or not.
472
+	 * @param int|null $limit            if null, no limit, if int then limit results by
473
+	 *                                   that number
474
+	 * @return EE_Datetime[]
475
+	 * @throws EE_Error
476
+	 */
477
+	public function get_datetimes_for_ticket_ordered_by_DTT_order(
478
+		int $TKT_ID,
479
+		bool $include_expired = true,
480
+		bool $include_deleted = true,
481
+		$limit = 0
482
+	) {
483
+		$prev_data_prep_value = $this->prepModelForQuery();
484
+		$where_params         = ['Ticket.TKT_ID' => absint($TKT_ID)];
485
+		$query_params[0]      = $this->addDefaultWhereParams($where_params, $include_deleted, $include_expired);
486
+		$query_params         = $this->addDefaultQueryParams($query_params, $limit, 'DTT_order');
487
+		return $this->getDatetimesAndRestoreModel($query_params, $prev_data_prep_value);
488
+	}
489
+
490
+
491
+	/**
492
+	 * Gets the most important datetime for a particular event (ie, the primary event usually. But if for some WACK
493
+	 * reason it doesn't exist, we consider the earliest event the most important)
494
+	 *
495
+	 * @param int $EVT_ID
496
+	 * @return EE_Datetime
497
+	 * @throws EE_Error
498
+	 */
499
+	public function get_most_important_datetime_for_event(int $EVT_ID)
500
+	{
501
+		$results = $this->get_datetimes_for_event_ordered_by_importance($EVT_ID, 1);
502
+		if ($results) {
503
+			return array_shift($results);
504
+		}
505
+		return null;
506
+	}
507
+
508
+
509
+	/**
510
+	 * This returns a wpdb->results        Array of all DTT month and years matching the incoming query params and
511
+	 * grouped by month and year.
512
+	 *
513
+	 * @param array  $where_params       @see
514
+	 *                                   https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions
515
+	 * @param string $evt_active_status  A string representing the evt active status to filter the months by.
516
+	 *                                   Can be:
517
+	 *                                   - '' = no filter
518
+	 *                                   - upcoming = Published events with at least one upcoming datetime.
519
+	 *                                   - expired = Events with all datetimes expired.
520
+	 *                                   - active = Events that are published and have at least one datetime that
521
+	 *                                   starts before now and ends after now.
522
+	 *                                   - inactive = Events that are either not published.
523
+	 * @return stdClass[]
524
+	 * @throws EE_Error
525
+	 * @throws InvalidArgumentException
526
+	 * @throws InvalidArgumentException
527
+	 */
528
+	public function get_dtt_months_and_years(array $where_params, $evt_active_status = '')
529
+	{
530
+		$current_time_for_DTT_EVT_start = $this->current_time_for_query('DTT_EVT_start');
531
+		$current_time_for_DTT_EVT_end   = $this->current_time_for_query('DTT_EVT_end');
532
+		switch ($evt_active_status) {
533
+			case 'upcoming':
534
+				$where_params['Event.status'] = 'publish';
535
+				// if there are already query_params matching DTT_EVT_start then we need to modify that to add them.
536
+				if (isset($where_params['DTT_EVT_start'])) {
537
+					$where_params['DTT_EVT_start*****'] = $where_params['DTT_EVT_start'];
538
+				}
539
+				$where_params['DTT_EVT_start'] = ['>', $current_time_for_DTT_EVT_start];
540
+				break;
541
+			case 'expired':
542
+				if (isset($where_params['Event.status'])) {
543
+					unset($where_params['Event.status']);
544
+				}
545
+				// get events to exclude
546
+				$exclude_query[0] = array_merge(
547
+					$where_params,
548
+					['DTT_EVT_end' => ['>', $current_time_for_DTT_EVT_end]]
549
+				);
550
+				// first get all events that have datetimes where its not expired.
551
+				$event_ids = $this->_get_all_wpdb_results(
552
+					$exclude_query,
553
+					OBJECT_K,
554
+					'Datetime.EVT_ID'
555
+				);
556
+				$event_ids = array_keys($event_ids);
557
+				if (isset($where_params['DTT_EVT_end'])) {
558
+					$where_params['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
559
+				}
560
+				$where_params['DTT_EVT_end']  = ['<', $current_time_for_DTT_EVT_end];
561
+				$where_params['Event.EVT_ID'] = ['NOT IN', $event_ids];
562
+				break;
563
+			case 'active':
564
+				$where_params['Event.status'] = 'publish';
565
+				if (isset($where_params['DTT_EVT_start'])) {
566
+					$where_params['Datetime.DTT_EVT_start******'] = $where_params['DTT_EVT_start'];
567
+				}
568
+				if (isset($where_params['Datetime.DTT_EVT_end'])) {
569
+					$where_params['Datetime.DTT_EVT_end*****'] = $where_params['DTT_EVT_end'];
570
+				}
571
+				$where_params['DTT_EVT_start'] = ['<', $current_time_for_DTT_EVT_start];
572
+				$where_params['DTT_EVT_end']   = ['>', $current_time_for_DTT_EVT_end];
573
+				break;
574
+			case 'inactive':
575
+				if (isset($where_params['Event.status'])) {
576
+					unset($where_params['Event.status']);
577
+				}
578
+				if (isset($where_params['OR'])) {
579
+					$where_params['AND']['OR'] = $where_params['OR'];
580
+				}
581
+				if (isset($where_params['DTT_EVT_end'])) {
582
+					$where_params['AND']['DTT_EVT_end****'] = $where_params['DTT_EVT_end'];
583
+					unset($where_params['DTT_EVT_end']);
584
+				}
585
+				if (isset($where_params['DTT_EVT_start'])) {
586
+					$where_params['AND']['DTT_EVT_start'] = $where_params['DTT_EVT_start'];
587
+					unset($where_params['DTT_EVT_start']);
588
+				}
589
+				$where_params['AND']['Event.status'] = ['!=', 'publish'];
590
+				break;
591
+		}
592
+		$query_params[0]          = $where_params;
593
+		$query_params['group_by'] = ['dtt_year', 'dtt_month'];
594
+		$query_params             = $this->addOrderByQueryParams($query_params, 'DTT_EVT_start', 'DESC');
595
+
596
+		$query_interval    = EEH_DTT_Helper::get_sql_query_interval_for_offset(
597
+			$this->get_timezone(),
598
+			'DTT_EVT_start'
599
+		);
600
+		$columns_to_select = [
601
+			'dtt_year'      => ['YEAR(' . $query_interval . ')', '%s'],
602
+			'dtt_month'     => ['MONTHNAME(' . $query_interval . ')', '%s'],
603
+			'dtt_month_num' => ['MONTH(' . $query_interval . ')', '%s'],
604
+		];
605
+		return $this->_get_all_wpdb_results($query_params, OBJECT, $columns_to_select);
606
+	}
607
+
608
+
609
+	/**
610
+	 * Updates the DTT_sold attribute on each datetime (based on the registrations
611
+	 * for the tickets for each datetime)
612
+	 *
613
+	 * @param EE_Base_Class[]|EE_Datetime[] $datetimes
614
+	 * @throws EE_Error
615
+	 * @throws ReflectionException
616
+	 */
617
+	public function update_sold(array $datetimes)
618
+	{
619
+		EE_Error::doing_it_wrong(
620
+			__FUNCTION__,
621
+			esc_html__(
622
+				'Please use \EEM_Ticket::update_tickets_sold() instead which will in turn correctly update both the Ticket AND Datetime counts.',
623
+				'event_espresso'
624
+			),
625
+			'4.9.32.rc.005'
626
+		);
627
+		foreach ($datetimes as $datetime) {
628
+			$datetime->update_sold();
629
+		}
630
+	}
631
+
632
+
633
+	/**
634
+	 *    Gets the total number of tickets available at a particular datetime
635
+	 *    (does NOT take into account the datetime's spaces available)
636
+	 *
637
+	 * @param int   $DTT_ID
638
+	 * @param array $query_params
639
+	 * @return int of tickets available. If sold out, return less than 1. If infinite, returns EE_INF,  IF there are NO
640
+	 *             tickets attached to datetime then FALSE is returned.
641
+	 * @throws EE_Error
642
+	 * @throws ReflectionException
643
+	 */
644
+	public function sum_tickets_currently_available_at_datetime(int $DTT_ID, array $query_params = [])
645
+	{
646
+		$datetime = $this->get_one_by_ID($DTT_ID);
647
+		if ($datetime instanceof EE_Datetime) {
648
+			return $datetime->tickets_remaining($query_params);
649
+		}
650
+		return 0;
651
+	}
652
+
653
+
654
+	/**
655
+	 * This returns an array of counts of datetimes in the database for each Datetime status that can be queried.
656
+	 *
657
+	 * @param array $stati_to_include  If included you can restrict the statuses we return counts for by including the
658
+	 *                                 stati you want counts for as values in the array.  An empty array returns counts
659
+	 *                                 for all valid stati.
660
+	 * @param array $query_params      If included can be used to refine the conditions for returning the count (i.e.
661
+	 *                                 only for Datetimes connected to a specific event, or specific ticket.
662
+	 * @return array  The value returned is an array indexed by Datetime Status and the values are the counts.  The
663
+	 * @throws EE_Error
664
+	 *                                 stati used as index keys are: EE_Datetime::active EE_Datetime::upcoming
665
+	 *                                 EE_Datetime::expired
666
+	 */
667
+	public function get_datetime_counts_by_status(array $stati_to_include = [], array $query_params = [])
668
+	{
669
+		// only accept where conditions for this query.
670
+		$_where            = isset($query_params[0]) ? $query_params[0] : [];
671
+		$status_query_args = [
672
+			EE_Datetime::active   => array_merge(
673
+				$_where,
674
+				['DTT_EVT_start' => ['<', time()], 'DTT_EVT_end' => ['>', time()]]
675
+			),
676
+			EE_Datetime::upcoming => array_merge(
677
+				$_where,
678
+				['DTT_EVT_start' => ['>', time()]]
679
+			),
680
+			EE_Datetime::expired  => array_merge(
681
+				$_where,
682
+				['DTT_EVT_end' => ['<', time()]]
683
+			),
684
+		];
685
+		if (! empty($stati_to_include)) {
686
+			foreach (array_keys($status_query_args) as $status) {
687
+				if (! in_array($status, $stati_to_include, true)) {
688
+					unset($status_query_args[ $status ]);
689
+				}
690
+			}
691
+		}
692
+		// loop through and query counts for each stati.
693
+		$status_query_results = [];
694
+		foreach ($status_query_args as $status => $status_where_conditions) {
695
+			$status_query_results[ $status ] = EEM_Datetime::count(
696
+				[$status_where_conditions],
697
+				'DTT_ID',
698
+				true
699
+			);
700
+		}
701
+		return $status_query_results;
702
+	}
703
+
704
+
705
+	/**
706
+	 * Returns the specific count for a given Datetime status matching any given query_params.
707
+	 *
708
+	 * @param string $status Valid string representation for Datetime status requested. (Defaults to Active).
709
+	 * @param array  $query_params
710
+	 * @return int
711
+	 * @throws EE_Error
712
+	 */
713
+	public function get_datetime_count_for_status($status = EE_Datetime::active, array $query_params = [])
714
+	{
715
+		$count = $this->get_datetime_counts_by_status([$status], $query_params);
716
+		return ! empty($count[ $status ]) ? $count[ $status ] : 0;
717
+	}
718
+
719
+
720
+	/**
721
+	 * @return bool|int
722
+	 * @since   5.0.0.p
723
+	 */
724
+	private function prepModelForQuery()
725
+	{
726
+		$prev_data_prep_value = $this->get_assumption_concerning_values_already_prepared_by_model_object();
727
+		$this->assume_values_already_prepared_by_model_object(EEM_Base::prepared_for_use_in_db);
728
+		return $prev_data_prep_value;
729
+	}
730
+
731
+
732
+	/**
733
+	 * @param array    $query_params
734
+	 * @param bool|int $prev_data_prep_value
735
+	 * @return EE_Base_Class[]|EE_Datetime[]
736
+	 * @throws EE_Error
737
+	 * @since   5.0.0.p
738
+	 */
739
+	private function getDatetimesAndRestoreModel(array $query_params, $prev_data_prep_value)
740
+	{
741
+		$result = $this->get_all($query_params);
742
+		$this->assume_values_already_prepared_by_model_object($prev_data_prep_value);
743
+		return $result;
744
+	}
745
+
746
+
747
+	/**
748
+	 * @param array  $query_params
749
+	 * @param int    $limit
750
+	 * @param string $order_by
751
+	 * @param string $order
752
+	 * @return array
753
+	 * @since   5.0.0.p
754
+	 */
755
+	private function addDefaultQueryParams(array $query_params, $limit = 0, $order_by = 'DTT_EVT_start', $order = 'ASC')
756
+	{
757
+		$query_params = $this->addOrderByQueryParams($query_params, $order_by, $order);
758
+		$query_params = $this->addLimitQueryParams($query_params, $limit);
759
+		return $query_params;
760
+	}
761
+
762
+
763
+	/**
764
+	 * @param array  $query_params
765
+	 * @param string $default_where_conditions
766
+	 * @return array
767
+	 * @since   5.0.0.p
768
+	 */
769
+	private function addDefaultWhereConditions(
770
+		array $query_params,
771
+		$default_where_conditions = EEM_Base::default_where_conditions_none
772
+	) {
773
+		$query_params['default_where_conditions'] = $default_where_conditions;
774
+		return $query_params;
775
+	}
776
+
777
+
778
+	/**
779
+	 * @param array $where_params
780
+	 * @param bool  $include_deleted
781
+	 * @param bool  $include_expired
782
+	 * @return array
783
+	 * @since   5.0.0.p
784
+	 */
785
+	private function addDefaultWhereParams(
786
+		array $where_params,
787
+		bool $include_deleted = true,
788
+		bool $include_expired = true
789
+	) {
790
+		$where_params = $this->addExpiredWhereParams($where_params, $include_expired);
791
+		$where_params = $this->addDeletedWhereParams($where_params, $include_deleted);
792
+		return $where_params;
793
+	}
794
+
795
+
796
+	/**
797
+	 * @param array $where_params
798
+	 * @param bool  $include_deleted
799
+	 * @return array
800
+	 * @since   5.0.0.p
801
+	 */
802
+	private function addDeletedWhereParams(array $where_params, bool $include_deleted = true)
803
+	{
804
+		$deleted                     = $include_deleted ? [true, false] : [false];
805
+		$where_params['DTT_deleted'] = ['IN', $deleted];
806
+		return $where_params;
807
+	}
808
+
809
+
810
+	/**
811
+	 * @param array $where_params
812
+	 * @param bool  $include_expired
813
+	 * @return array
814
+	 * @since   5.0.0.p
815
+	 */
816
+	private function addExpiredWhereParams(array $where_params, bool $include_expired = true)
817
+	{
818
+		if (! $include_expired) {
819
+			$where_params['DTT_EVT_end'] = ['>=', current_time('mysql', true)];
820
+		}
821
+		return $where_params;
822
+	}
823
+
824
+
825
+	/**
826
+	 * @param array $query_params
827
+	 * @param int   $limit
828
+	 * @return array
829
+	 * @since   5.0.0.p
830
+	 */
831
+	private function addLimitQueryParams(array $query_params, $limit = 0)
832
+	{
833
+		if ($limit) {
834
+			$query_params['limit'] = $limit;
835
+		}
836
+		return $query_params;
837
+	}
838
+
839
+
840
+	/**
841
+	 * @param array  $query_params
842
+	 * @param string $order_by
843
+	 * @param string $order
844
+	 * @return array
845
+	 * @since   5.0.0.p
846
+	 */
847
+	private function addOrderByQueryParams(array $query_params, $order_by = 'DTT_EVT_start', $order = 'ASC')
848
+	{
849
+		$order                    = $order === 'ASC' ? 'ASC' : 'DESC';
850
+		$valid_order_columns      = ['DTT_ID', 'DTT_EVT_start', 'DTT_EVT_end', 'DTT_order'];
851
+		$order_by                 = in_array($order_by, $valid_order_columns, true) ? $order_by : 'DTT_EVT_start';
852
+		$query_params['order_by'] = [$order_by => $order];
853
+		return $query_params;
854
+	}
855 855
 }
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.