Completed
Branch FET/editor-dates-tickets-refac... (e24525)
by
unknown
52:15 queued 43:53
created
core/db_classes/EE_Term.class.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
      * Sets name
67 67
      *
68 68
      * @param string $name
69
-     * @return boolean
69
+     * @return boolean|null
70 70
      */
71 71
     public function set_name($name)
72 72
     {
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
      * Sets slug
90 90
      *
91 91
      * @param string $slug
92
-     * @return boolean
92
+     * @return boolean|null
93 93
      */
94 94
     public function set_slug($slug)
95 95
     {
Please login to merge, or discard this patch.
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -12,87 +12,87 @@
 block discarded – undo
12 12
 class EE_Term extends EE_Base_Class
13 13
 {
14 14
 
15
-    public $post_type;
15
+	public $post_type;
16 16
 
17
-    /**
18
-     * Sets some dynamic defaults
19
-     *
20
-     * @param array  $fieldValues
21
-     * @param bool   $bydb
22
-     * @param string $timezone
23
-     */
24
-    protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25
-    {
26
-        if (! isset($fieldValues['slug'])) {
27
-            $fieldValues['slug'] = $fieldValues['name'];
28
-        }
29
-        parent::__construct($fieldValues, $bydb, $timezone);
30
-    }
17
+	/**
18
+	 * Sets some dynamic defaults
19
+	 *
20
+	 * @param array  $fieldValues
21
+	 * @param bool   $bydb
22
+	 * @param string $timezone
23
+	 */
24
+	protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25
+	{
26
+		if (! isset($fieldValues['slug'])) {
27
+			$fieldValues['slug'] = $fieldValues['name'];
28
+		}
29
+		parent::__construct($fieldValues, $bydb, $timezone);
30
+	}
31 31
 
32 32
 
33
-    /**
34
-     * @param array $props_n_values
35
-     * @return EE_Term|mixed
36
-     */
37
-    public static function new_instance($props_n_values = array())
38
-    {
39
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
40
-        return $has_object ? $has_object : new self($props_n_values);
41
-    }
33
+	/**
34
+	 * @param array $props_n_values
35
+	 * @return EE_Term|mixed
36
+	 */
37
+	public static function new_instance($props_n_values = array())
38
+	{
39
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
40
+		return $has_object ? $has_object : new self($props_n_values);
41
+	}
42 42
 
43 43
 
44
-    /**
45
-     * @param array $props_n_values
46
-     * @return EE_Term
47
-     */
48
-    public static function new_instance_from_db($props_n_values = array())
49
-    {
50
-        return new self($props_n_values, true);
51
-    }
44
+	/**
45
+	 * @param array $props_n_values
46
+	 * @return EE_Term
47
+	 */
48
+	public static function new_instance_from_db($props_n_values = array())
49
+	{
50
+		return new self($props_n_values, true);
51
+	}
52 52
 
53 53
 
54
-    /**
55
-     * Gets name
56
-     *
57
-     * @return string
58
-     */
59
-    public function name()
60
-    {
61
-        return $this->get('name');
62
-    }
54
+	/**
55
+	 * Gets name
56
+	 *
57
+	 * @return string
58
+	 */
59
+	public function name()
60
+	{
61
+		return $this->get('name');
62
+	}
63 63
 
64 64
 
65
-    /**
66
-     * Sets name
67
-     *
68
-     * @param string $name
69
-     * @return boolean
70
-     */
71
-    public function set_name($name)
72
-    {
73
-        $this->set('name', $name);
74
-    }
65
+	/**
66
+	 * Sets name
67
+	 *
68
+	 * @param string $name
69
+	 * @return boolean
70
+	 */
71
+	public function set_name($name)
72
+	{
73
+		$this->set('name', $name);
74
+	}
75 75
 
76 76
 
77
-    /**
78
-     * Gets slug
79
-     *
80
-     * @return string
81
-     */
82
-    public function slug()
83
-    {
84
-        return $this->get('slug');
85
-    }
77
+	/**
78
+	 * Gets slug
79
+	 *
80
+	 * @return string
81
+	 */
82
+	public function slug()
83
+	{
84
+		return $this->get('slug');
85
+	}
86 86
 
87 87
 
88
-    /**
89
-     * Sets slug
90
-     *
91
-     * @param string $slug
92
-     * @return boolean
93
-     */
94
-    public function set_slug($slug)
95
-    {
96
-        $this->set('slug', $slug);
97
-    }
88
+	/**
89
+	 * Sets slug
90
+	 *
91
+	 * @param string $slug
92
+	 * @return boolean
93
+	 */
94
+	public function set_slug($slug)
95
+	{
96
+		$this->set('slug', $slug);
97
+	}
98 98
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@
 block discarded – undo
23 23
      */
24 24
     protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25 25
     {
26
-        if (! isset($fieldValues['slug'])) {
26
+        if ( ! isset($fieldValues['slug'])) {
27 27
             $fieldValues['slug'] = $fieldValues['name'];
28 28
         }
29 29
         parent::__construct($fieldValues, $bydb, $timezone);
Please login to merge, or discard this patch.
core/db_classes/EE_Term_Taxonomy.class.php 2 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
      * Sets taxonomy
48 48
      *
49 49
      * @param string $taxonomy
50
-     * @return boolean
50
+     * @return boolean|null
51 51
      */
52 52
     public function set_taxonomy($taxonomy)
53 53
     {
@@ -70,7 +70,7 @@  discard block
 block discarded – undo
70 70
      * Sets term_count
71 71
      *
72 72
      * @param int $term_count
73
-     * @return boolean
73
+     * @return boolean|null
74 74
      */
75 75
     public function set_count($term_count)
76 76
     {
Please login to merge, or discard this patch.
Indentation   +64 added lines, -64 removed lines patch added patch discarded remove patch
@@ -11,80 +11,80 @@
 block discarded – undo
11 11
 class EE_Term_Taxonomy extends EE_Base_Class
12 12
 {
13 13
 
14
-    /**
15
-     * @param array $props_n_values
16
-     * @return EE_Term_Taxonomy
17
-     */
18
-    public static function new_instance($props_n_values = array())
19
-    {
20
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
21
-        return $has_object ? $has_object : new self($props_n_values);
22
-    }
14
+	/**
15
+	 * @param array $props_n_values
16
+	 * @return EE_Term_Taxonomy
17
+	 */
18
+	public static function new_instance($props_n_values = array())
19
+	{
20
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
21
+		return $has_object ? $has_object : new self($props_n_values);
22
+	}
23 23
 
24 24
 
25
-    /**
26
-     * @param array $props_n_values
27
-     * @return EE_Term_Taxonomy
28
-     */
29
-    public static function new_instance_from_db($props_n_values = array())
30
-    {
31
-        return new self($props_n_values, true);
32
-    }
25
+	/**
26
+	 * @param array $props_n_values
27
+	 * @return EE_Term_Taxonomy
28
+	 */
29
+	public static function new_instance_from_db($props_n_values = array())
30
+	{
31
+		return new self($props_n_values, true);
32
+	}
33 33
 
34 34
 
35
-    /**
36
-     * Gets taxonomy
37
-     *
38
-     * @return string
39
-     */
40
-    public function taxonomy()
41
-    {
42
-        return $this->get('taxonomy');
43
-    }
35
+	/**
36
+	 * Gets taxonomy
37
+	 *
38
+	 * @return string
39
+	 */
40
+	public function taxonomy()
41
+	{
42
+		return $this->get('taxonomy');
43
+	}
44 44
 
45 45
 
46
-    /**
47
-     * Sets taxonomy
48
-     *
49
-     * @param string $taxonomy
50
-     * @return boolean
51
-     */
52
-    public function set_taxonomy($taxonomy)
53
-    {
54
-        $this->set('taxonomy', $taxonomy);
55
-    }
46
+	/**
47
+	 * Sets taxonomy
48
+	 *
49
+	 * @param string $taxonomy
50
+	 * @return boolean
51
+	 */
52
+	public function set_taxonomy($taxonomy)
53
+	{
54
+		$this->set('taxonomy', $taxonomy);
55
+	}
56 56
 
57 57
 
58
-    /**
59
-     * Gets term_count
60
-     *
61
-     * @return int
62
-     */
63
-    public function count()
64
-    {
65
-        return $this->get('term_count');
66
-    }
58
+	/**
59
+	 * Gets term_count
60
+	 *
61
+	 * @return int
62
+	 */
63
+	public function count()
64
+	{
65
+		return $this->get('term_count');
66
+	}
67 67
 
68 68
 
69
-    /**
70
-     * Sets term_count
71
-     *
72
-     * @param int $term_count
73
-     * @return boolean
74
-     */
75
-    public function set_count($term_count)
76
-    {
77
-        $this->set('term_count', $term_count);
78
-    }
69
+	/**
70
+	 * Sets term_count
71
+	 *
72
+	 * @param int $term_count
73
+	 * @return boolean
74
+	 */
75
+	public function set_count($term_count)
76
+	{
77
+		$this->set('term_count', $term_count);
78
+	}
79 79
 
80 80
 
81
-    /**
82
-     * Gets the term for this term taxonomy
83
-     *
84
-     * @return EE_Term
85
-     */
86
-    public function term()
87
-    {
88
-        return $this->get_first_related('Term');
89
-    }
81
+	/**
82
+	 * Gets the term for this term taxonomy
83
+	 *
84
+	 * @return EE_Term
85
+	 */
86
+	public function term()
87
+	{
88
+		return $this->get_first_related('Term');
89
+	}
90 90
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Ticket.class.php 3 patches
Doc Comments   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -121,7 +121,8 @@
 block discarded – undo
121 121
      *                               relevant status const
122 122
      * @param bool | null $remaining if it is already known that tickets are available, then simply pass a bool to save
123 123
      *               further processing
124
-     * @return mixed status int if the display string isn't requested
124
+     * @param boolean $remaining
125
+     * @return string status int if the display string isn't requested
125 126
      * @throws \EE_Error
126 127
      */
127 128
     public function ticket_status($display = false, $remaining = null)
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
     public function ticket_status($display = false, $remaining = null)
128 128
     {
129 129
         $remaining = is_bool($remaining) ? $remaining : $this->is_remaining();
130
-        if (! $remaining) {
130
+        if ( ! $remaining) {
131 131
             return $display ? EEH_Template::pretty_status(EE_Ticket::sold_out, false, 'sentence') : EE_Ticket::sold_out;
132 132
         }
133 133
         if ($this->get('TKT_deleted')) {
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
             : '';
246 246
         $last_date = $this->last_datetime() instanceof EE_Datetime ? $this->last_datetime()->end_date($dt_frmt) : '';
247 247
 
248
-        return $first_date && $last_date ? $first_date . $conjunction . $last_date : '';
248
+        return $first_date && $last_date ? $first_date.$conjunction.$last_date : '';
249 249
     }
250 250
 
251 251
 
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
      */
273 273
     public function datetimes($query_params = array())
274 274
     {
275
-        if (! isset($query_params['order_by'])) {
275
+        if ( ! isset($query_params['order_by'])) {
276 276
             $query_params['order_by']['DTT_order'] = 'ASC';
277 277
         }
278 278
         return $this->get_many_related('Datetime', $query_params);
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
                 if (empty($tickets_sold['datetime'])) {
318 318
                     return $total;
319 319
                 }
320
-                if (! empty($dtt_id) && ! isset($tickets_sold['datetime'][ $dtt_id ])) {
320
+                if ( ! empty($dtt_id) && ! isset($tickets_sold['datetime'][$dtt_id])) {
321 321
                     EE_Error::add_error(
322 322
                         __(
323 323
                             'You\'ve requested the amount of tickets sold for a given ticket and datetime, however there are no records for the datetime id you included.  Are you SURE that is a datetime related to this ticket?',
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
                     );
330 330
                     return $total;
331 331
                 }
332
-                return empty($dtt_id) ? $tickets_sold['datetime'] : $tickets_sold['datetime'][ $dtt_id ];
332
+                return empty($dtt_id) ? $tickets_sold['datetime'] : $tickets_sold['datetime'][$dtt_id];
333 333
                 break;
334 334
             default:
335 335
                 return $total;
@@ -347,9 +347,9 @@  discard block
 block discarded – undo
347 347
     {
348 348
         $datetimes = $this->get_many_related('Datetime');
349 349
         $tickets_sold = array();
350
-        if (! empty($datetimes)) {
350
+        if ( ! empty($datetimes)) {
351 351
             foreach ($datetimes as $datetime) {
352
-                $tickets_sold['datetime'][ $datetime->ID() ] = $datetime->get('DTT_sold');
352
+                $tickets_sold['datetime'][$datetime->ID()] = $datetime->get('DTT_sold');
353 353
             }
354 354
         }
355 355
         // Tickets sold
@@ -756,7 +756,7 @@  discard block
 block discarded – undo
756 756
         $sold = $this->sold() + $qty;
757 757
         // remove ticket reservation, but don't adjust datetime reservations,  because that will happen
758 758
         // via \EE_Datetime::increase_sold() when \EE_Ticket::_increase_sold_for_datetimes() is called
759
-        $this->decrease_reserved($qty, false, "TKT: {$this->ID()} (ln:" . __LINE__ . ')');
759
+        $this->decrease_reserved($qty, false, "TKT: {$this->ID()} (ln:".__LINE__.')');
760 760
         $this->_increase_sold_for_datetimes($qty);
761 761
         $this->set_sold($sold);
762 762
         do_action(
@@ -1300,7 +1300,7 @@  discard block
 block discarded – undo
1300 1300
         foreach ($this->datetimes() as $datetime) {
1301 1301
             $times[] = $datetime->start_date_and_time();
1302 1302
         }
1303
-        return $this->name() . ' @ ' . implode(', ', $times) . ' for ' . $this->pretty_price();
1303
+        return $this->name().' @ '.implode(', ', $times).' for '.$this->pretty_price();
1304 1304
     }
1305 1305
 
1306 1306
 
@@ -1406,7 +1406,7 @@  discard block
 block discarded – undo
1406 1406
     {
1407 1407
         // get one datetime to use for getting the event
1408 1408
         $datetime = $this->first_datetime();
1409
-        if (! $datetime instanceof \EE_Datetime) {
1409
+        if ( ! $datetime instanceof \EE_Datetime) {
1410 1410
             throw new UnexpectedEntityException(
1411 1411
                 $datetime,
1412 1412
                 'EE_Datetime',
@@ -1417,7 +1417,7 @@  discard block
 block discarded – undo
1417 1417
             );
1418 1418
         }
1419 1419
         $event = $datetime->event();
1420
-        if (! $event instanceof \EE_Event) {
1420
+        if ( ! $event instanceof \EE_Event) {
1421 1421
             throw new UnexpectedEntityException(
1422 1422
                 $event,
1423 1423
                 'EE_Event',
Please login to merge, or discard this patch.
Indentation   +1470 added lines, -1470 removed lines patch added patch discarded remove patch
@@ -12,1474 +12,1474 @@
 block discarded – undo
12 12
 class EE_Ticket extends EE_Soft_Delete_Base_Class implements EEI_Line_Item_Object, EEI_Event_Relation, EEI_Has_Icon
13 13
 {
14 14
 
15
-    /**
16
-     * TicKet Sold out:
17
-     * constant used by ticket_status() to indicate that a ticket is sold out
18
-     * and no longer available for purchase
19
-     */
20
-    const sold_out = 'TKS';
21
-
22
-    /**
23
-     * TicKet Expired:
24
-     * constant used by ticket_status() to indicate that a ticket is expired
25
-     * and no longer available for purchase
26
-     */
27
-    const expired = 'TKE';
28
-
29
-    /**
30
-     * TicKet Archived:
31
-     * constant used by ticket_status() to indicate that a ticket is archived
32
-     * and no longer available for purchase
33
-     */
34
-    const archived = 'TKA';
35
-
36
-    /**
37
-     * TicKet Pending:
38
-     * constant used by ticket_status() to indicate that a ticket is pending
39
-     * and is NOT YET available for purchase
40
-     */
41
-    const pending = 'TKP';
42
-
43
-    /**
44
-     * TicKet On sale:
45
-     * constant used by ticket_status() to indicate that a ticket is On Sale
46
-     * and IS available for purchase
47
-     */
48
-    const onsale = 'TKO';
49
-
50
-    /**
51
-     * extra meta key for tracking ticket reservations
52
-     *
53
-     * @type string
54
-     */
55
-    const META_KEY_TICKET_RESERVATIONS = 'ticket_reservations';
56
-
57
-    /**
58
-     * cached result from method of the same name
59
-     *
60
-     * @var float $_ticket_total_with_taxes
61
-     */
62
-    private $_ticket_total_with_taxes;
63
-
64
-
65
-    /**
66
-     * @param array  $props_n_values          incoming values
67
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
68
-     *                                        used.)
69
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
70
-     *                                        date_format and the second value is the time format
71
-     * @return EE_Ticket
72
-     * @throws \EE_Error
73
-     */
74
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
75
-    {
76
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
77
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
78
-    }
79
-
80
-
81
-    /**
82
-     * @param array  $props_n_values  incoming values from the database
83
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
84
-     *                                the website will be used.
85
-     * @return EE_Ticket
86
-     * @throws \EE_Error
87
-     */
88
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
89
-    {
90
-        return new self($props_n_values, true, $timezone);
91
-    }
92
-
93
-
94
-    /**
95
-     * @return bool
96
-     * @throws \EE_Error
97
-     */
98
-    public function parent()
99
-    {
100
-        return $this->get('TKT_parent');
101
-    }
102
-
103
-
104
-    /**
105
-     * return if a ticket has quantities available for purchase
106
-     *
107
-     * @param  int $DTT_ID the primary key for a particular datetime
108
-     * @return boolean
109
-     * @throws \EE_Error
110
-     */
111
-    public function available($DTT_ID = 0)
112
-    {
113
-        // are we checking availability for a particular datetime ?
114
-        if ($DTT_ID) {
115
-            // get that datetime object
116
-            $datetime = $this->get_first_related('Datetime', array(array('DTT_ID' => $DTT_ID)));
117
-            // if  ticket sales for this datetime have exceeded the reg limit...
118
-            if ($datetime instanceof EE_Datetime && $datetime->sold_out()) {
119
-                return false;
120
-            }
121
-        }
122
-        // datetime is still open for registration, but is this ticket sold out ?
123
-        return $this->qty() < 1 || $this->qty() > $this->sold() ? true : false;
124
-    }
125
-
126
-
127
-    /**
128
-     * Using the start date and end date this method calculates whether the ticket is On Sale, Pending, or Expired
129
-     *
130
-     * @param bool        $display   true = we'll return a localized string, otherwise we just return the value of the
131
-     *                               relevant status const
132
-     * @param bool | null $remaining if it is already known that tickets are available, then simply pass a bool to save
133
-     *               further processing
134
-     * @return mixed status int if the display string isn't requested
135
-     * @throws \EE_Error
136
-     */
137
-    public function ticket_status($display = false, $remaining = null)
138
-    {
139
-        $remaining = is_bool($remaining) ? $remaining : $this->is_remaining();
140
-        if (! $remaining) {
141
-            return $display ? EEH_Template::pretty_status(EE_Ticket::sold_out, false, 'sentence') : EE_Ticket::sold_out;
142
-        }
143
-        if ($this->get('TKT_deleted')) {
144
-            return $display ? EEH_Template::pretty_status(EE_Ticket::archived, false, 'sentence') : EE_Ticket::archived;
145
-        }
146
-        if ($this->is_expired()) {
147
-            return $display ? EEH_Template::pretty_status(EE_Ticket::expired, false, 'sentence') : EE_Ticket::expired;
148
-        }
149
-        if ($this->is_pending()) {
150
-            return $display ? EEH_Template::pretty_status(EE_Ticket::pending, false, 'sentence') : EE_Ticket::pending;
151
-        }
152
-        if ($this->is_on_sale()) {
153
-            return $display ? EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence') : EE_Ticket::onsale;
154
-        }
155
-        return '';
156
-    }
157
-
158
-
159
-    /**
160
-     * The purpose of this method is to simply return a boolean for whether there are any tickets remaining for sale
161
-     * considering ALL the factors used for figuring that out.
162
-     *
163
-     * @access public
164
-     * @param  int $DTT_ID if an int above 0 is included here then we get a specific dtt.
165
-     * @return boolean         true = tickets remaining, false not.
166
-     * @throws \EE_Error
167
-     */
168
-    public function is_remaining($DTT_ID = 0)
169
-    {
170
-        $num_remaining = $this->remaining($DTT_ID);
171
-        if ($num_remaining === 0) {
172
-            return false;
173
-        }
174
-        if ($num_remaining > 0 && $num_remaining < $this->min()) {
175
-            return false;
176
-        }
177
-        return true;
178
-    }
179
-
180
-
181
-    /**
182
-     * return the total number of tickets available for purchase
183
-     *
184
-     * @param  int $DTT_ID the primary key for a particular datetime.
185
-     *                     set to 0 for all related datetimes
186
-     * @return int
187
-     * @throws \EE_Error
188
-     */
189
-    public function remaining($DTT_ID = 0)
190
-    {
191
-        return $this->real_quantity_on_ticket('saleable', $DTT_ID);
192
-    }
193
-
194
-
195
-    /**
196
-     * Gets min
197
-     *
198
-     * @return int
199
-     * @throws \EE_Error
200
-     */
201
-    public function min()
202
-    {
203
-        return $this->get('TKT_min');
204
-    }
205
-
206
-
207
-    /**
208
-     * return if a ticket is no longer available cause its available dates have expired.
209
-     *
210
-     * @return boolean
211
-     * @throws \EE_Error
212
-     */
213
-    public function is_expired()
214
-    {
215
-        return ($this->get_raw('TKT_end_date') < time());
216
-    }
217
-
218
-
219
-    /**
220
-     * Return if a ticket is yet to go on sale or not
221
-     *
222
-     * @return boolean
223
-     * @throws \EE_Error
224
-     */
225
-    public function is_pending()
226
-    {
227
-        return ($this->get_raw('TKT_start_date') > time());
228
-    }
229
-
230
-
231
-    /**
232
-     * Return if a ticket is on sale or not
233
-     *
234
-     * @return boolean
235
-     * @throws \EE_Error
236
-     */
237
-    public function is_on_sale()
238
-    {
239
-        return ($this->get_raw('TKT_start_date') < time() && $this->get_raw('TKT_end_date') > time());
240
-    }
241
-
242
-
243
-    /**
244
-     * This returns the chronologically last datetime that this ticket is associated with
245
-     *
246
-     * @param string $dt_frmt
247
-     * @param string $conjunction - conjunction junction what's your function ? this string joins the start date with
248
-     *                            the end date ie: Jan 01 "to" Dec 31
249
-     * @return string
250
-     * @throws \EE_Error
251
-     */
252
-    public function date_range($dt_frmt = '', $conjunction = ' - ')
253
-    {
254
-        $first_date = $this->first_datetime() instanceof EE_Datetime ? $this->first_datetime()->start_date($dt_frmt)
255
-            : '';
256
-        $last_date = $this->last_datetime() instanceof EE_Datetime ? $this->last_datetime()->end_date($dt_frmt) : '';
257
-
258
-        return $first_date && $last_date ? $first_date . $conjunction . $last_date : '';
259
-    }
260
-
261
-
262
-    /**
263
-     * This returns the chronologically first datetime that this ticket is associated with
264
-     *
265
-     * @return EE_Datetime
266
-     * @throws \EE_Error
267
-     */
268
-    public function first_datetime()
269
-    {
270
-        $datetimes = $this->datetimes(array('limit' => 1));
271
-        return reset($datetimes);
272
-    }
273
-
274
-
275
-    /**
276
-     * Gets all the datetimes this ticket can be used for attending.
277
-     * Unless otherwise specified, orders datetimes by start date.
278
-     *
279
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
280
-     * @return EE_Datetime[]|EE_Base_Class[]
281
-     * @throws \EE_Error
282
-     */
283
-    public function datetimes($query_params = array())
284
-    {
285
-        if (! isset($query_params['order_by'])) {
286
-            $query_params['order_by']['DTT_order'] = 'ASC';
287
-        }
288
-        return $this->get_many_related('Datetime', $query_params);
289
-    }
290
-
291
-
292
-    /**
293
-     * This returns the chronologically last datetime that this ticket is associated with
294
-     *
295
-     * @return EE_Datetime
296
-     * @throws \EE_Error
297
-     */
298
-    public function last_datetime()
299
-    {
300
-        $datetimes = $this->datetimes(array('limit' => 1, 'order_by' => array('DTT_EVT_start' => 'DESC')));
301
-        return end($datetimes);
302
-    }
303
-
304
-
305
-    /**
306
-     * This returns the total tickets sold depending on the given parameters.
307
-     *
308
-     * @param  string $what   Can be one of two options: 'ticket', 'datetime'.
309
-     *                        'ticket' = total ticket sales for all datetimes this ticket is related to
310
-     *                        'datetime' = total ticket sales for a specified datetime (required $dtt_id)
311
-     *                        'datetime' = total ticket sales in the datetime_ticket table.
312
-     *                        If $dtt_id is not given then we return an array of sales indexed by datetime.
313
-     *                        If $dtt_id IS given then we return the tickets sold for that given datetime.
314
-     * @param  int    $dtt_id [optional] include the dtt_id with $what = 'datetime'.
315
-     * @return mixed (array|int)          how many tickets have sold
316
-     * @throws \EE_Error
317
-     */
318
-    public function tickets_sold($what = 'ticket', $dtt_id = null)
319
-    {
320
-        $total = 0;
321
-        $tickets_sold = $this->_all_tickets_sold();
322
-        switch ($what) {
323
-            case 'ticket':
324
-                return $tickets_sold['ticket'];
325
-                break;
326
-            case 'datetime':
327
-                if (empty($tickets_sold['datetime'])) {
328
-                    return $total;
329
-                }
330
-                if (! empty($dtt_id) && ! isset($tickets_sold['datetime'][ $dtt_id ])) {
331
-                    EE_Error::add_error(
332
-                        __(
333
-                            'You\'ve requested the amount of tickets sold for a given ticket and datetime, however there are no records for the datetime id you included.  Are you SURE that is a datetime related to this ticket?',
334
-                            'event_espresso'
335
-                        ),
336
-                        __FILE__,
337
-                        __FUNCTION__,
338
-                        __LINE__
339
-                    );
340
-                    return $total;
341
-                }
342
-                return empty($dtt_id) ? $tickets_sold['datetime'] : $tickets_sold['datetime'][ $dtt_id ];
343
-                break;
344
-            default:
345
-                return $total;
346
-        }
347
-    }
348
-
349
-
350
-    /**
351
-     * This returns an array indexed by datetime_id for tickets sold with this ticket.
352
-     *
353
-     * @return EE_Ticket[]
354
-     * @throws \EE_Error
355
-     */
356
-    protected function _all_tickets_sold()
357
-    {
358
-        $datetimes = $this->get_many_related('Datetime');
359
-        $tickets_sold = array();
360
-        if (! empty($datetimes)) {
361
-            foreach ($datetimes as $datetime) {
362
-                $tickets_sold['datetime'][ $datetime->ID() ] = $datetime->get('DTT_sold');
363
-            }
364
-        }
365
-        // Tickets sold
366
-        $tickets_sold['ticket'] = $this->sold();
367
-        return $tickets_sold;
368
-    }
369
-
370
-
371
-    /**
372
-     * This returns the base price object for the ticket.
373
-     *
374
-     * @param  bool $return_array whether to return as an array indexed by price id or just the object.
375
-     * @return EE_Price|EE_Base_Class|EE_Price[]|EE_Base_Class[]
376
-     * @throws \EE_Error
377
-     */
378
-    public function base_price($return_array = false)
379
-    {
380
-        $_where = array('Price_Type.PBT_ID' => EEM_Price_Type::base_type_base_price);
381
-        return $return_array
382
-            ? $this->get_many_related('Price', array($_where))
383
-            : $this->get_first_related('Price', array($_where));
384
-    }
385
-
386
-
387
-    /**
388
-     * This returns ONLY the price modifiers for the ticket (i.e. no taxes or base price)
389
-     *
390
-     * @access public
391
-     * @return EE_Price[]
392
-     * @throws \EE_Error
393
-     */
394
-    public function price_modifiers()
395
-    {
396
-        $query_params = array(
397
-            0 => array(
398
-                'Price_Type.PBT_ID' => array(
399
-                    'NOT IN',
400
-                    array(EEM_Price_Type::base_type_base_price, EEM_Price_Type::base_type_tax),
401
-                ),
402
-            ),
403
-        );
404
-        return $this->prices($query_params);
405
-    }
406
-
407
-
408
-    /**
409
-     * Gets all the prices that combine to form the final price of this ticket
410
-     *
411
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
412
-     * @return EE_Price[]|EE_Base_Class[]
413
-     * @throws \EE_Error
414
-     */
415
-    public function prices($query_params = array())
416
-    {
417
-        return $this->get_many_related('Price', $query_params);
418
-    }
419
-
420
-
421
-    /**
422
-     * Gets all the ticket applicabilities (ie, relations between datetimes and tickets)
423
-     *
424
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
425
-     * @return EE_Datetime_Ticket|EE_Base_Class[]
426
-     * @throws \EE_Error
427
-     */
428
-    public function datetime_tickets($query_params = array())
429
-    {
430
-        return $this->get_many_related('Datetime_Ticket', $query_params);
431
-    }
432
-
433
-
434
-    /**
435
-     * Gets all the datetimes from the db ordered by DTT_order
436
-     *
437
-     * @param boolean $show_expired
438
-     * @param boolean $show_deleted
439
-     * @return EE_Datetime[]
440
-     * @throws \EE_Error
441
-     */
442
-    public function datetimes_ordered($show_expired = true, $show_deleted = false)
443
-    {
444
-        return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_ticket_ordered_by_DTT_order(
445
-            $this->ID(),
446
-            $show_expired,
447
-            $show_deleted
448
-        );
449
-    }
450
-
451
-
452
-    /**
453
-     * Gets ID
454
-     *
455
-     * @return string
456
-     * @throws \EE_Error
457
-     */
458
-    public function ID()
459
-    {
460
-        return $this->get('TKT_ID');
461
-    }
462
-
463
-
464
-    /**
465
-     * get the author of the ticket.
466
-     *
467
-     * @since 4.5.0
468
-     * @return int
469
-     * @throws \EE_Error
470
-     */
471
-    public function wp_user()
472
-    {
473
-        return $this->get('TKT_wp_user');
474
-    }
475
-
476
-
477
-    /**
478
-     * Gets the template for the ticket
479
-     *
480
-     * @return EE_Ticket_Template|EE_Base_Class
481
-     * @throws \EE_Error
482
-     */
483
-    public function template()
484
-    {
485
-        return $this->get_first_related('Ticket_Template');
486
-    }
487
-
488
-
489
-    /**
490
-     * Simply returns an array of EE_Price objects that are taxes.
491
-     *
492
-     * @return EE_Price[]
493
-     * @throws \EE_Error
494
-     */
495
-    public function get_ticket_taxes_for_admin()
496
-    {
497
-        return EE_Taxes::get_taxes_for_admin();
498
-    }
499
-
500
-
501
-    /**
502
-     * @return float
503
-     * @throws \EE_Error
504
-     */
505
-    public function ticket_price()
506
-    {
507
-        return $this->get('TKT_price');
508
-    }
509
-
510
-
511
-    /**
512
-     * @return mixed
513
-     * @throws \EE_Error
514
-     */
515
-    public function pretty_price()
516
-    {
517
-        return $this->get_pretty('TKT_price');
518
-    }
519
-
520
-
521
-    /**
522
-     * @return bool
523
-     * @throws \EE_Error
524
-     */
525
-    public function is_free()
526
-    {
527
-        return $this->get_ticket_total_with_taxes() === (float) 0;
528
-    }
529
-
530
-
531
-    /**
532
-     * get_ticket_total_with_taxes
533
-     *
534
-     * @param bool $no_cache
535
-     * @return float
536
-     * @throws \EE_Error
537
-     */
538
-    public function get_ticket_total_with_taxes($no_cache = false)
539
-    {
540
-        if ($this->_ticket_total_with_taxes === null || $no_cache) {
541
-            $this->_ticket_total_with_taxes = $this->get_ticket_subtotal() + $this->get_ticket_taxes_total_for_admin();
542
-        }
543
-        return (float) $this->_ticket_total_with_taxes;
544
-    }
545
-
546
-
547
-    public function ensure_TKT_Price_correct()
548
-    {
549
-        $this->set('TKT_price', EE_Taxes::get_subtotal_for_admin($this));
550
-        $this->save();
551
-    }
552
-
553
-
554
-    /**
555
-     * @return float
556
-     * @throws \EE_Error
557
-     */
558
-    public function get_ticket_subtotal()
559
-    {
560
-        return EE_Taxes::get_subtotal_for_admin($this);
561
-    }
562
-
563
-
564
-    /**
565
-     * Returns the total taxes applied to this ticket
566
-     *
567
-     * @return float
568
-     * @throws \EE_Error
569
-     */
570
-    public function get_ticket_taxes_total_for_admin()
571
-    {
572
-        return EE_Taxes::get_total_taxes_for_admin($this);
573
-    }
574
-
575
-
576
-    /**
577
-     * Sets name
578
-     *
579
-     * @param string $name
580
-     * @throws \EE_Error
581
-     */
582
-    public function set_name($name)
583
-    {
584
-        $this->set('TKT_name', $name);
585
-    }
586
-
587
-
588
-    /**
589
-     * Gets description
590
-     *
591
-     * @return string
592
-     * @throws \EE_Error
593
-     */
594
-    public function description()
595
-    {
596
-        return $this->get('TKT_description');
597
-    }
598
-
599
-
600
-    /**
601
-     * Sets description
602
-     *
603
-     * @param string $description
604
-     * @throws \EE_Error
605
-     */
606
-    public function set_description($description)
607
-    {
608
-        $this->set('TKT_description', $description);
609
-    }
610
-
611
-
612
-    /**
613
-     * Gets start_date
614
-     *
615
-     * @param string $dt_frmt
616
-     * @param string $tm_frmt
617
-     * @return string
618
-     * @throws \EE_Error
619
-     */
620
-    public function start_date($dt_frmt = '', $tm_frmt = '')
621
-    {
622
-        return $this->_get_datetime('TKT_start_date', $dt_frmt, $tm_frmt);
623
-    }
624
-
625
-
626
-    /**
627
-     * Sets start_date
628
-     *
629
-     * @param string $start_date
630
-     * @return void
631
-     * @throws \EE_Error
632
-     */
633
-    public function set_start_date($start_date)
634
-    {
635
-        $this->_set_date_time('B', $start_date, 'TKT_start_date');
636
-    }
637
-
638
-
639
-    /**
640
-     * Gets end_date
641
-     *
642
-     * @param string $dt_frmt
643
-     * @param string $tm_frmt
644
-     * @return string
645
-     * @throws \EE_Error
646
-     */
647
-    public function end_date($dt_frmt = '', $tm_frmt = '')
648
-    {
649
-        return $this->_get_datetime('TKT_end_date', $dt_frmt, $tm_frmt);
650
-    }
651
-
652
-
653
-    /**
654
-     * Sets end_date
655
-     *
656
-     * @param string $end_date
657
-     * @return void
658
-     * @throws \EE_Error
659
-     */
660
-    public function set_end_date($end_date)
661
-    {
662
-        $this->_set_date_time('B', $end_date, 'TKT_end_date');
663
-    }
664
-
665
-
666
-    /**
667
-     * Sets sell until time
668
-     *
669
-     * @since 4.5.0
670
-     * @param string $time a string representation of the sell until time (ex 9am or 7:30pm)
671
-     * @throws \EE_Error
672
-     */
673
-    public function set_end_time($time)
674
-    {
675
-        $this->_set_time_for($time, 'TKT_end_date');
676
-    }
677
-
678
-
679
-    /**
680
-     * Sets min
681
-     *
682
-     * @param int $min
683
-     * @return void
684
-     * @throws \EE_Error
685
-     */
686
-    public function set_min($min)
687
-    {
688
-        $this->set('TKT_min', $min);
689
-    }
690
-
691
-
692
-    /**
693
-     * Gets max
694
-     *
695
-     * @return int
696
-     * @throws \EE_Error
697
-     */
698
-    public function max()
699
-    {
700
-        return $this->get('TKT_max');
701
-    }
702
-
703
-
704
-    /**
705
-     * Sets max
706
-     *
707
-     * @param int $max
708
-     * @return void
709
-     * @throws \EE_Error
710
-     */
711
-    public function set_max($max)
712
-    {
713
-        $this->set('TKT_max', $max);
714
-    }
715
-
716
-
717
-    /**
718
-     * Sets price
719
-     *
720
-     * @param float $price
721
-     * @return void
722
-     * @throws \EE_Error
723
-     */
724
-    public function set_price($price)
725
-    {
726
-        $this->set('TKT_price', $price);
727
-    }
728
-
729
-
730
-    /**
731
-     * Gets sold
732
-     *
733
-     * @return int
734
-     * @throws \EE_Error
735
-     */
736
-    public function sold()
737
-    {
738
-        return $this->get_raw('TKT_sold');
739
-    }
740
-
741
-
742
-    /**
743
-     * Sets sold
744
-     *
745
-     * @param int $sold
746
-     * @return void
747
-     * @throws \EE_Error
748
-     */
749
-    public function set_sold($sold)
750
-    {
751
-        // sold can not go below zero
752
-        $sold = max(0, $sold);
753
-        $this->set('TKT_sold', $sold);
754
-    }
755
-
756
-
757
-    /**
758
-     * increments sold by amount passed by $qty
759
-     *
760
-     * @param int $qty
761
-     * @return void
762
-     * @throws \EE_Error
763
-     */
764
-    public function increase_sold($qty = 1)
765
-    {
766
-        $sold = $this->sold() + $qty;
767
-        // remove ticket reservation, but don't adjust datetime reservations,  because that will happen
768
-        // via \EE_Datetime::increase_sold() when \EE_Ticket::_increase_sold_for_datetimes() is called
769
-        $this->decrease_reserved($qty, false, "TKT: {$this->ID()} (ln:" . __LINE__ . ')');
770
-        $this->_increase_sold_for_datetimes($qty);
771
-        $this->set_sold($sold);
772
-        do_action(
773
-            'AHEE__EE_Ticket__increase_sold',
774
-            $this,
775
-            $qty,
776
-            $sold
777
-        );
778
-    }
779
-
780
-
781
-    /**
782
-     * Increases sold on related datetimes
783
-     *
784
-     * @param int $qty
785
-     * @return void
786
-     * @throws \EE_Error
787
-     */
788
-    protected function _increase_sold_for_datetimes($qty = 1)
789
-    {
790
-        $datetimes = $this->datetimes();
791
-        if (is_array($datetimes)) {
792
-            foreach ($datetimes as $datetime) {
793
-                if ($datetime instanceof EE_Datetime) {
794
-                    $datetime->increase_sold($qty);
795
-                    $datetime->save();
796
-                }
797
-            }
798
-        }
799
-    }
800
-
801
-
802
-    /**
803
-     * decrements (subtracts) sold by amount passed by $qty
804
-     *
805
-     * @param int $qty
806
-     * @return void
807
-     * @throws \EE_Error
808
-     */
809
-    public function decrease_sold($qty = 1)
810
-    {
811
-        $sold = $this->sold() - $qty;
812
-        $this->_decrease_sold_for_datetimes($qty);
813
-        $this->set_sold($sold);
814
-        do_action(
815
-            'AHEE__EE_Ticket__decrease_sold',
816
-            $this,
817
-            $qty,
818
-            $sold
819
-        );
820
-    }
821
-
822
-
823
-    /**
824
-     * Decreases sold on related datetimes
825
-     *
826
-     * @param int $qty
827
-     * @return void
828
-     * @throws \EE_Error
829
-     */
830
-    protected function _decrease_sold_for_datetimes($qty = 1)
831
-    {
832
-        $datetimes = $this->datetimes();
833
-        if (is_array($datetimes)) {
834
-            foreach ($datetimes as $datetime) {
835
-                if ($datetime instanceof EE_Datetime) {
836
-                    $datetime->decrease_sold($qty);
837
-                    $datetime->save();
838
-                }
839
-            }
840
-        }
841
-    }
842
-
843
-
844
-    /**
845
-     * Gets qty of reserved tickets
846
-     *
847
-     * @return int
848
-     * @throws \EE_Error
849
-     */
850
-    public function reserved()
851
-    {
852
-        return $this->get_raw('TKT_reserved');
853
-    }
854
-
855
-
856
-    /**
857
-     * Sets reserved
858
-     *
859
-     * @param int $reserved
860
-     * @return void
861
-     * @throws \EE_Error
862
-     */
863
-    public function set_reserved($reserved)
864
-    {
865
-        // reserved can not go below zero
866
-        $reserved = max(0, (int) $reserved);
867
-        $this->set('TKT_reserved', $reserved);
868
-    }
869
-
870
-
871
-    /**
872
-     * increments reserved by amount passed by $qty
873
-     *
874
-     * @param int    $qty
875
-     * @param string $source
876
-     * @return void
877
-     * @throws EE_Error
878
-     * @throws InvalidArgumentException
879
-     * @throws ReflectionException
880
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
881
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
882
-     */
883
-    public function increase_reserved($qty = 1, $source = 'unknown')
884
-    {
885
-        $qty = absint($qty);
886
-        $reserved = $this->reserved() + $qty;
887
-        if ($reserved
888
-            && $this->add_extra_meta(
889
-                EE_Ticket::META_KEY_TICKET_RESERVATIONS,
890
-                "{$qty} from {$source}"
891
-            )
892
-        ) {
893
-            $this->_increase_reserved_for_datetimes($qty);
894
-            $this->set_reserved($reserved);
895
-            do_action(
896
-                'AHEE__EE_Ticket__increase_reserved',
897
-                $this,
898
-                $qty,
899
-                $reserved
900
-            );
901
-        }
902
-    }
903
-
904
-
905
-    /**
906
-     * Increases sold on related datetimes
907
-     *
908
-     * @param int $qty
909
-     * @return void
910
-     * @throws \EE_Error
911
-     */
912
-    protected function _increase_reserved_for_datetimes($qty = 1)
913
-    {
914
-        $datetimes = $this->datetimes();
915
-        if (is_array($datetimes)) {
916
-            foreach ($datetimes as $datetime) {
917
-                if ($datetime instanceof EE_Datetime) {
918
-                    $datetime->increase_reserved($qty);
919
-                    $datetime->save();
920
-                }
921
-            }
922
-        }
923
-    }
924
-
925
-
926
-    /**
927
-     * decrements (subtracts) reserved by amount passed by $qty
928
-     *
929
-     * @param int    $qty
930
-     * @param bool   $adjust_datetimes
931
-     * @param string $source
932
-     * @return void
933
-     * @throws EE_Error
934
-     * @throws InvalidArgumentException
935
-     * @throws ReflectionException
936
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
937
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
938
-     */
939
-    public function decrease_reserved($qty = 1, $adjust_datetimes = true, $source = 'unknown')
940
-    {
941
-        $reserved = $this->reserved() - absint($qty);
942
-        if ($this->add_extra_meta(
943
-            EE_Ticket::META_KEY_TICKET_RESERVATIONS,
944
-            "-{$qty} from {$source}"
945
-        )) {
946
-            if ($adjust_datetimes) {
947
-                $this->_decrease_reserved_for_datetimes($qty);
948
-            }
949
-            $this->set_reserved($reserved);
950
-            do_action(
951
-                'AHEE__EE_Ticket__decrease_reserved',
952
-                $this,
953
-                $qty,
954
-                $reserved
955
-            );
956
-        }
957
-    }
958
-
959
-
960
-    /**
961
-     * Increases sold on related datetimes
962
-     *
963
-     * @param int $qty
964
-     * @return void
965
-     * @throws \EE_Error
966
-     */
967
-    protected function _decrease_reserved_for_datetimes($qty = 1)
968
-    {
969
-        $datetimes = $this->datetimes();
970
-        if (is_array($datetimes)) {
971
-            foreach ($datetimes as $datetime) {
972
-                if ($datetime instanceof EE_Datetime) {
973
-                    $datetime->decrease_reserved($qty);
974
-                    $datetime->save();
975
-                }
976
-            }
977
-        }
978
-    }
979
-
980
-
981
-    /**
982
-     * Gets ticket quantity
983
-     *
984
-     * @param string $context     ticket quantity is somewhat subjective depending on the exact information sought
985
-     *                            therefore $context can be one of three values: '', 'reg_limit', or 'saleable'
986
-     *                            '' (default) quantity is the actual db value for TKT_qty, unaffected by other objects
987
-     *                            REG LIMIT: caps qty based on DTT_reg_limit for ALL related datetimes
988
-     *                            SALEABLE: also considers datetime sold and returns zero if ANY DTT is sold out, and
989
-     *                            is therefore the truest measure of tickets that can be purchased at the moment
990
-     * @return int
991
-     * @throws \EE_Error
992
-     */
993
-    public function qty($context = '')
994
-    {
995
-        switch ($context) {
996
-            case 'reg_limit':
997
-                return $this->real_quantity_on_ticket();
998
-            case 'saleable':
999
-                return $this->real_quantity_on_ticket('saleable');
1000
-            default:
1001
-                return $this->get_raw('TKT_qty');
1002
-        }
1003
-    }
1004
-
1005
-
1006
-    /**
1007
-     * Gets ticket quantity
1008
-     *
1009
-     * @param string $context     ticket quantity is somewhat subjective depending on the exact information sought
1010
-     *                            therefore $context can be one of two values: 'reg_limit', or 'saleable'
1011
-     *                            REG LIMIT: caps qty based on DTT_reg_limit for ALL related datetimes
1012
-     *                            SALEABLE: also considers datetime sold and returns zero if ANY DTT is sold out, and
1013
-     *                            is therefore the truest measure of tickets that can be purchased at the moment
1014
-     * @param  int   $DTT_ID      the primary key for a particular datetime.
1015
-     *                            set to 0 for all related datetimes
1016
-     * @return int
1017
-     * @throws \EE_Error
1018
-     */
1019
-    public function real_quantity_on_ticket($context = 'reg_limit', $DTT_ID = 0)
1020
-    {
1021
-        $raw = $this->get_raw('TKT_qty');
1022
-        // return immediately if it's zero
1023
-        if ($raw === 0) {
1024
-            return $raw;
1025
-        }
1026
-        // echo "\n\n<br />Ticket: " . $this->name() . '<br />';
1027
-        // ensure qty doesn't exceed raw value for THIS ticket
1028
-        $qty = min(EE_INF, $raw);
1029
-        // echo "\n . qty: " . $qty . '<br />';
1030
-        // calculate this ticket's total sales and reservations
1031
-        $sold_and_reserved_for_this_ticket = $this->sold() + $this->reserved();
1032
-        // echo "\n . sold: " . $this->sold() . '<br />';
1033
-        // echo "\n . reserved: " . $this->reserved() . '<br />';
1034
-        // echo "\n . sold_and_reserved_for_this_ticket: " . $sold_and_reserved_for_this_ticket . '<br />';
1035
-        // first we need to calculate the maximum number of tickets available for the datetime
1036
-        // do we want data for one datetime or all of them ?
1037
-        $query_params = $DTT_ID ? array(array('DTT_ID' => $DTT_ID)) : array();
1038
-        $datetimes = $this->datetimes($query_params);
1039
-        if (is_array($datetimes) && ! empty($datetimes)) {
1040
-            foreach ($datetimes as $datetime) {
1041
-                if ($datetime instanceof EE_Datetime) {
1042
-                    $datetime->refresh_from_db();
1043
-                    // echo "\n . . datetime name: " . $datetime->name() . '<br />';
1044
-                    // echo "\n . . datetime ID: " . $datetime->ID() . '<br />';
1045
-                    // initialize with no restrictions for each datetime
1046
-                    // but adjust datetime qty based on datetime reg limit
1047
-                    $datetime_qty = min(EE_INF, $datetime->reg_limit());
1048
-                    // echo "\n . . . datetime reg_limit: " . $datetime->reg_limit() . '<br />';
1049
-                    // echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1050
-                    // if we want the actual saleable amount, then we need to consider OTHER ticket sales
1051
-                    // and reservations for this datetime, that do NOT include sales and reservations
1052
-                    // for this ticket (so we add $this->sold() and $this->reserved() back in)
1053
-                    if ($context === 'saleable') {
1054
-                        $datetime_qty = max(
1055
-                            $datetime_qty - $datetime->sold_and_reserved() + $sold_and_reserved_for_this_ticket,
1056
-                            0
1057
-                        );
1058
-                        // echo "\n . . . datetime sold: " . $datetime->sold() . '<br />';
1059
-                        // echo "\n . . . datetime reserved: " . $datetime->reserved() . '<br />';
1060
-                        // echo "\n . . . datetime sold_and_reserved: " . $datetime->sold_and_reserved() . '<br />';
1061
-                        // echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1062
-                        $datetime_qty = ! $datetime->sold_out() ? $datetime_qty : 0;
1063
-                        // echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1064
-                    }
1065
-                    $qty = min($datetime_qty, $qty);
1066
-                    // echo "\n . . qty: " . $qty . '<br />';
1067
-                }
1068
-            }
1069
-        }
1070
-        // NOW that we know the  maximum number of tickets available for the datetime
1071
-        // we can finally factor in the details for this specific ticket
1072
-        if ($qty > 0 && $context === 'saleable') {
1073
-            // and subtract the sales for THIS ticket
1074
-            $qty = max($qty - $sold_and_reserved_for_this_ticket, 0);
1075
-            // echo "\n . qty: " . $qty . '<br />';
1076
-        }
1077
-        // echo "\nFINAL QTY: " . $qty . "<br /><br />";
1078
-        return $qty;
1079
-    }
1080
-
1081
-
1082
-    /**
1083
-     * Sets qty - IMPORTANT!!! Does NOT allow QTY to be set higher than the lowest reg limit of any related datetimes
1084
-     *
1085
-     * @param int $qty
1086
-     * @return void
1087
-     * @throws \EE_Error
1088
-     */
1089
-    public function set_qty($qty)
1090
-    {
1091
-        $datetimes = $this->datetimes();
1092
-        foreach ($datetimes as $datetime) {
1093
-            if ($datetime instanceof EE_Datetime) {
1094
-                $qty = min($qty, $datetime->reg_limit());
1095
-            }
1096
-        }
1097
-        $this->set('TKT_qty', $qty);
1098
-    }
1099
-
1100
-
1101
-    /**
1102
-     * Gets uses
1103
-     *
1104
-     * @return int
1105
-     * @throws \EE_Error
1106
-     */
1107
-    public function uses()
1108
-    {
1109
-        return $this->get('TKT_uses');
1110
-    }
1111
-
1112
-
1113
-    /**
1114
-     * Sets uses
1115
-     *
1116
-     * @param int $uses
1117
-     * @return void
1118
-     * @throws \EE_Error
1119
-     */
1120
-    public function set_uses($uses)
1121
-    {
1122
-        $this->set('TKT_uses', $uses);
1123
-    }
1124
-
1125
-
1126
-    /**
1127
-     * returns whether ticket is required or not.
1128
-     *
1129
-     * @return boolean
1130
-     * @throws \EE_Error
1131
-     */
1132
-    public function required()
1133
-    {
1134
-        return $this->get('TKT_required');
1135
-    }
1136
-
1137
-
1138
-    /**
1139
-     * sets the TKT_required property
1140
-     *
1141
-     * @param boolean $required
1142
-     * @return void
1143
-     * @throws \EE_Error
1144
-     */
1145
-    public function set_required($required)
1146
-    {
1147
-        $this->set('TKT_required', $required);
1148
-    }
1149
-
1150
-
1151
-    /**
1152
-     * Gets taxable
1153
-     *
1154
-     * @return boolean
1155
-     * @throws \EE_Error
1156
-     */
1157
-    public function taxable()
1158
-    {
1159
-        return $this->get('TKT_taxable');
1160
-    }
1161
-
1162
-
1163
-    /**
1164
-     * Sets taxable
1165
-     *
1166
-     * @param boolean $taxable
1167
-     * @return void
1168
-     * @throws \EE_Error
1169
-     */
1170
-    public function set_taxable($taxable)
1171
-    {
1172
-        $this->set('TKT_taxable', $taxable);
1173
-    }
1174
-
1175
-
1176
-    /**
1177
-     * Gets is_default
1178
-     *
1179
-     * @return boolean
1180
-     * @throws \EE_Error
1181
-     */
1182
-    public function is_default()
1183
-    {
1184
-        return $this->get('TKT_is_default');
1185
-    }
1186
-
1187
-
1188
-    /**
1189
-     * Sets is_default
1190
-     *
1191
-     * @param boolean $is_default
1192
-     * @return void
1193
-     * @throws \EE_Error
1194
-     */
1195
-    public function set_is_default($is_default)
1196
-    {
1197
-        $this->set('TKT_is_default', $is_default);
1198
-    }
1199
-
1200
-
1201
-    /**
1202
-     * Gets order
1203
-     *
1204
-     * @return int
1205
-     * @throws \EE_Error
1206
-     */
1207
-    public function order()
1208
-    {
1209
-        return $this->get('TKT_order');
1210
-    }
1211
-
1212
-
1213
-    /**
1214
-     * Sets order
1215
-     *
1216
-     * @param int $order
1217
-     * @return void
1218
-     * @throws \EE_Error
1219
-     */
1220
-    public function set_order($order)
1221
-    {
1222
-        $this->set('TKT_order', $order);
1223
-    }
1224
-
1225
-
1226
-    /**
1227
-     * Gets row
1228
-     *
1229
-     * @return int
1230
-     * @throws \EE_Error
1231
-     */
1232
-    public function row()
1233
-    {
1234
-        return $this->get('TKT_row');
1235
-    }
1236
-
1237
-
1238
-    /**
1239
-     * Sets row
1240
-     *
1241
-     * @param int $row
1242
-     * @return void
1243
-     * @throws \EE_Error
1244
-     */
1245
-    public function set_row($row)
1246
-    {
1247
-        $this->set('TKT_row', $row);
1248
-    }
1249
-
1250
-
1251
-    /**
1252
-     * Gets deleted
1253
-     *
1254
-     * @return boolean
1255
-     * @throws \EE_Error
1256
-     */
1257
-    public function deleted()
1258
-    {
1259
-        return $this->get('TKT_deleted');
1260
-    }
1261
-
1262
-
1263
-    /**
1264
-     * Sets deleted
1265
-     *
1266
-     * @param boolean $deleted
1267
-     * @return void
1268
-     * @throws \EE_Error
1269
-     */
1270
-    public function set_deleted($deleted)
1271
-    {
1272
-        $this->set('TKT_deleted', $deleted);
1273
-    }
1274
-
1275
-
1276
-    /**
1277
-     * Gets parent
1278
-     *
1279
-     * @return int
1280
-     * @throws \EE_Error
1281
-     */
1282
-    public function parent_ID()
1283
-    {
1284
-        return $this->get('TKT_parent');
1285
-    }
1286
-
1287
-
1288
-    /**
1289
-     * Sets parent
1290
-     *
1291
-     * @param int $parent
1292
-     * @return void
1293
-     * @throws \EE_Error
1294
-     */
1295
-    public function set_parent_ID($parent)
1296
-    {
1297
-        $this->set('TKT_parent', $parent);
1298
-    }
1299
-
1300
-
1301
-    /**
1302
-     * Gets a string which is handy for showing in gateways etc that describes the ticket.
1303
-     *
1304
-     * @return string
1305
-     * @throws \EE_Error
1306
-     */
1307
-    public function name_and_info()
1308
-    {
1309
-        $times = array();
1310
-        foreach ($this->datetimes() as $datetime) {
1311
-            $times[] = $datetime->start_date_and_time();
1312
-        }
1313
-        return $this->name() . ' @ ' . implode(', ', $times) . ' for ' . $this->pretty_price();
1314
-    }
1315
-
1316
-
1317
-    /**
1318
-     * Gets name
1319
-     *
1320
-     * @return string
1321
-     * @throws \EE_Error
1322
-     */
1323
-    public function name()
1324
-    {
1325
-        return $this->get('TKT_name');
1326
-    }
1327
-
1328
-
1329
-    /**
1330
-     * Gets price
1331
-     *
1332
-     * @return float
1333
-     * @throws \EE_Error
1334
-     */
1335
-    public function price()
1336
-    {
1337
-        return $this->get('TKT_price');
1338
-    }
1339
-
1340
-
1341
-    /**
1342
-     * Gets all the registrations for this ticket
1343
-     *
1344
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1345
-     * @return EE_Registration[]|EE_Base_Class[]
1346
-     * @throws \EE_Error
1347
-     */
1348
-    public function registrations($query_params = array())
1349
-    {
1350
-        return $this->get_many_related('Registration', $query_params);
1351
-    }
1352
-
1353
-
1354
-    /**
1355
-     * Updates the TKT_sold attribute (and saves) based on the number of APPROVED registrations for this ticket.
1356
-     * into account
1357
-     *
1358
-     * @return int
1359
-     * @throws \EE_Error
1360
-     */
1361
-    public function update_tickets_sold()
1362
-    {
1363
-        $count_regs_for_this_ticket = $this->count_registrations(
1364
-            array(
1365
-                array(
1366
-                    'STS_ID'      => EEM_Registration::status_id_approved,
1367
-                    'REG_deleted' => 0,
1368
-                ),
1369
-            )
1370
-        );
1371
-        $sold = $this->sold();
1372
-        if ($count_regs_for_this_ticket > $sold) {
1373
-            $this->increase_sold($count_regs_for_this_ticket - $sold);
1374
-            $this->save();
1375
-        } elseif ($count_regs_for_this_ticket < $sold) {
1376
-            $this->decrease_sold($count_regs_for_this_ticket - $sold);
1377
-            $this->save();
1378
-        }
1379
-        return $count_regs_for_this_ticket;
1380
-    }
1381
-
1382
-
1383
-    /**
1384
-     * Counts the registrations for this ticket
1385
-     *
1386
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1387
-     * @return int
1388
-     */
1389
-    public function count_registrations($query_params = array())
1390
-    {
1391
-        return $this->count_related('Registration', $query_params);
1392
-    }
1393
-
1394
-
1395
-    /**
1396
-     * Implementation for EEI_Has_Icon interface method.
1397
-     *
1398
-     * @see EEI_Visual_Representation for comments
1399
-     * @return string
1400
-     */
1401
-    public function get_icon()
1402
-    {
1403
-        return '<span class="dashicons dashicons-tickets-alt"></span>';
1404
-    }
1405
-
1406
-
1407
-    /**
1408
-     * Implementation of the EEI_Event_Relation interface method
1409
-     *
1410
-     * @see EEI_Event_Relation for comments
1411
-     * @return EE_Event
1412
-     * @throws \EE_Error
1413
-     * @throws UnexpectedEntityException
1414
-     */
1415
-    public function get_related_event()
1416
-    {
1417
-        // get one datetime to use for getting the event
1418
-        $datetime = $this->first_datetime();
1419
-        if (! $datetime instanceof \EE_Datetime) {
1420
-            throw new UnexpectedEntityException(
1421
-                $datetime,
1422
-                'EE_Datetime',
1423
-                sprintf(
1424
-                    __('The ticket (%s) is not associated with any valid datetimes.', 'event_espresso'),
1425
-                    $this->name()
1426
-                )
1427
-            );
1428
-        }
1429
-        $event = $datetime->event();
1430
-        if (! $event instanceof \EE_Event) {
1431
-            throw new UnexpectedEntityException(
1432
-                $event,
1433
-                'EE_Event',
1434
-                sprintf(
1435
-                    __('The ticket (%s) is not associated with a valid event.', 'event_espresso'),
1436
-                    $this->name()
1437
-                )
1438
-            );
1439
-        }
1440
-        return $event;
1441
-    }
1442
-
1443
-
1444
-    /**
1445
-     * Implementation of the EEI_Event_Relation interface method
1446
-     *
1447
-     * @see EEI_Event_Relation for comments
1448
-     * @return string
1449
-     * @throws UnexpectedEntityException
1450
-     * @throws \EE_Error
1451
-     */
1452
-    public function get_event_name()
1453
-    {
1454
-        $event = $this->get_related_event();
1455
-        return $event instanceof EE_Event ? $event->name() : '';
1456
-    }
1457
-
1458
-
1459
-    /**
1460
-     * Implementation of the EEI_Event_Relation interface method
1461
-     *
1462
-     * @see EEI_Event_Relation for comments
1463
-     * @return int
1464
-     * @throws UnexpectedEntityException
1465
-     * @throws \EE_Error
1466
-     */
1467
-    public function get_event_ID()
1468
-    {
1469
-        $event = $this->get_related_event();
1470
-        return $event instanceof EE_Event ? $event->ID() : 0;
1471
-    }
1472
-
1473
-
1474
-    /**
1475
-     * This simply returns whether a ticket can be permanently deleted or not.
1476
-     * The criteria for determining this is whether the ticket has any related registrations.
1477
-     * If there are none then it can be permanently deleted.
1478
-     *
1479
-     * @return bool
1480
-     */
1481
-    public function is_permanently_deleteable()
1482
-    {
1483
-        return $this->count_registrations() === 0;
1484
-    }
15
+	/**
16
+	 * TicKet Sold out:
17
+	 * constant used by ticket_status() to indicate that a ticket is sold out
18
+	 * and no longer available for purchase
19
+	 */
20
+	const sold_out = 'TKS';
21
+
22
+	/**
23
+	 * TicKet Expired:
24
+	 * constant used by ticket_status() to indicate that a ticket is expired
25
+	 * and no longer available for purchase
26
+	 */
27
+	const expired = 'TKE';
28
+
29
+	/**
30
+	 * TicKet Archived:
31
+	 * constant used by ticket_status() to indicate that a ticket is archived
32
+	 * and no longer available for purchase
33
+	 */
34
+	const archived = 'TKA';
35
+
36
+	/**
37
+	 * TicKet Pending:
38
+	 * constant used by ticket_status() to indicate that a ticket is pending
39
+	 * and is NOT YET available for purchase
40
+	 */
41
+	const pending = 'TKP';
42
+
43
+	/**
44
+	 * TicKet On sale:
45
+	 * constant used by ticket_status() to indicate that a ticket is On Sale
46
+	 * and IS available for purchase
47
+	 */
48
+	const onsale = 'TKO';
49
+
50
+	/**
51
+	 * extra meta key for tracking ticket reservations
52
+	 *
53
+	 * @type string
54
+	 */
55
+	const META_KEY_TICKET_RESERVATIONS = 'ticket_reservations';
56
+
57
+	/**
58
+	 * cached result from method of the same name
59
+	 *
60
+	 * @var float $_ticket_total_with_taxes
61
+	 */
62
+	private $_ticket_total_with_taxes;
63
+
64
+
65
+	/**
66
+	 * @param array  $props_n_values          incoming values
67
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
68
+	 *                                        used.)
69
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
70
+	 *                                        date_format and the second value is the time format
71
+	 * @return EE_Ticket
72
+	 * @throws \EE_Error
73
+	 */
74
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
75
+	{
76
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
77
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
78
+	}
79
+
80
+
81
+	/**
82
+	 * @param array  $props_n_values  incoming values from the database
83
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
84
+	 *                                the website will be used.
85
+	 * @return EE_Ticket
86
+	 * @throws \EE_Error
87
+	 */
88
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
89
+	{
90
+		return new self($props_n_values, true, $timezone);
91
+	}
92
+
93
+
94
+	/**
95
+	 * @return bool
96
+	 * @throws \EE_Error
97
+	 */
98
+	public function parent()
99
+	{
100
+		return $this->get('TKT_parent');
101
+	}
102
+
103
+
104
+	/**
105
+	 * return if a ticket has quantities available for purchase
106
+	 *
107
+	 * @param  int $DTT_ID the primary key for a particular datetime
108
+	 * @return boolean
109
+	 * @throws \EE_Error
110
+	 */
111
+	public function available($DTT_ID = 0)
112
+	{
113
+		// are we checking availability for a particular datetime ?
114
+		if ($DTT_ID) {
115
+			// get that datetime object
116
+			$datetime = $this->get_first_related('Datetime', array(array('DTT_ID' => $DTT_ID)));
117
+			// if  ticket sales for this datetime have exceeded the reg limit...
118
+			if ($datetime instanceof EE_Datetime && $datetime->sold_out()) {
119
+				return false;
120
+			}
121
+		}
122
+		// datetime is still open for registration, but is this ticket sold out ?
123
+		return $this->qty() < 1 || $this->qty() > $this->sold() ? true : false;
124
+	}
125
+
126
+
127
+	/**
128
+	 * Using the start date and end date this method calculates whether the ticket is On Sale, Pending, or Expired
129
+	 *
130
+	 * @param bool        $display   true = we'll return a localized string, otherwise we just return the value of the
131
+	 *                               relevant status const
132
+	 * @param bool | null $remaining if it is already known that tickets are available, then simply pass a bool to save
133
+	 *               further processing
134
+	 * @return mixed status int if the display string isn't requested
135
+	 * @throws \EE_Error
136
+	 */
137
+	public function ticket_status($display = false, $remaining = null)
138
+	{
139
+		$remaining = is_bool($remaining) ? $remaining : $this->is_remaining();
140
+		if (! $remaining) {
141
+			return $display ? EEH_Template::pretty_status(EE_Ticket::sold_out, false, 'sentence') : EE_Ticket::sold_out;
142
+		}
143
+		if ($this->get('TKT_deleted')) {
144
+			return $display ? EEH_Template::pretty_status(EE_Ticket::archived, false, 'sentence') : EE_Ticket::archived;
145
+		}
146
+		if ($this->is_expired()) {
147
+			return $display ? EEH_Template::pretty_status(EE_Ticket::expired, false, 'sentence') : EE_Ticket::expired;
148
+		}
149
+		if ($this->is_pending()) {
150
+			return $display ? EEH_Template::pretty_status(EE_Ticket::pending, false, 'sentence') : EE_Ticket::pending;
151
+		}
152
+		if ($this->is_on_sale()) {
153
+			return $display ? EEH_Template::pretty_status(EE_Ticket::onsale, false, 'sentence') : EE_Ticket::onsale;
154
+		}
155
+		return '';
156
+	}
157
+
158
+
159
+	/**
160
+	 * The purpose of this method is to simply return a boolean for whether there are any tickets remaining for sale
161
+	 * considering ALL the factors used for figuring that out.
162
+	 *
163
+	 * @access public
164
+	 * @param  int $DTT_ID if an int above 0 is included here then we get a specific dtt.
165
+	 * @return boolean         true = tickets remaining, false not.
166
+	 * @throws \EE_Error
167
+	 */
168
+	public function is_remaining($DTT_ID = 0)
169
+	{
170
+		$num_remaining = $this->remaining($DTT_ID);
171
+		if ($num_remaining === 0) {
172
+			return false;
173
+		}
174
+		if ($num_remaining > 0 && $num_remaining < $this->min()) {
175
+			return false;
176
+		}
177
+		return true;
178
+	}
179
+
180
+
181
+	/**
182
+	 * return the total number of tickets available for purchase
183
+	 *
184
+	 * @param  int $DTT_ID the primary key for a particular datetime.
185
+	 *                     set to 0 for all related datetimes
186
+	 * @return int
187
+	 * @throws \EE_Error
188
+	 */
189
+	public function remaining($DTT_ID = 0)
190
+	{
191
+		return $this->real_quantity_on_ticket('saleable', $DTT_ID);
192
+	}
193
+
194
+
195
+	/**
196
+	 * Gets min
197
+	 *
198
+	 * @return int
199
+	 * @throws \EE_Error
200
+	 */
201
+	public function min()
202
+	{
203
+		return $this->get('TKT_min');
204
+	}
205
+
206
+
207
+	/**
208
+	 * return if a ticket is no longer available cause its available dates have expired.
209
+	 *
210
+	 * @return boolean
211
+	 * @throws \EE_Error
212
+	 */
213
+	public function is_expired()
214
+	{
215
+		return ($this->get_raw('TKT_end_date') < time());
216
+	}
217
+
218
+
219
+	/**
220
+	 * Return if a ticket is yet to go on sale or not
221
+	 *
222
+	 * @return boolean
223
+	 * @throws \EE_Error
224
+	 */
225
+	public function is_pending()
226
+	{
227
+		return ($this->get_raw('TKT_start_date') > time());
228
+	}
229
+
230
+
231
+	/**
232
+	 * Return if a ticket is on sale or not
233
+	 *
234
+	 * @return boolean
235
+	 * @throws \EE_Error
236
+	 */
237
+	public function is_on_sale()
238
+	{
239
+		return ($this->get_raw('TKT_start_date') < time() && $this->get_raw('TKT_end_date') > time());
240
+	}
241
+
242
+
243
+	/**
244
+	 * This returns the chronologically last datetime that this ticket is associated with
245
+	 *
246
+	 * @param string $dt_frmt
247
+	 * @param string $conjunction - conjunction junction what's your function ? this string joins the start date with
248
+	 *                            the end date ie: Jan 01 "to" Dec 31
249
+	 * @return string
250
+	 * @throws \EE_Error
251
+	 */
252
+	public function date_range($dt_frmt = '', $conjunction = ' - ')
253
+	{
254
+		$first_date = $this->first_datetime() instanceof EE_Datetime ? $this->first_datetime()->start_date($dt_frmt)
255
+			: '';
256
+		$last_date = $this->last_datetime() instanceof EE_Datetime ? $this->last_datetime()->end_date($dt_frmt) : '';
257
+
258
+		return $first_date && $last_date ? $first_date . $conjunction . $last_date : '';
259
+	}
260
+
261
+
262
+	/**
263
+	 * This returns the chronologically first datetime that this ticket is associated with
264
+	 *
265
+	 * @return EE_Datetime
266
+	 * @throws \EE_Error
267
+	 */
268
+	public function first_datetime()
269
+	{
270
+		$datetimes = $this->datetimes(array('limit' => 1));
271
+		return reset($datetimes);
272
+	}
273
+
274
+
275
+	/**
276
+	 * Gets all the datetimes this ticket can be used for attending.
277
+	 * Unless otherwise specified, orders datetimes by start date.
278
+	 *
279
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
280
+	 * @return EE_Datetime[]|EE_Base_Class[]
281
+	 * @throws \EE_Error
282
+	 */
283
+	public function datetimes($query_params = array())
284
+	{
285
+		if (! isset($query_params['order_by'])) {
286
+			$query_params['order_by']['DTT_order'] = 'ASC';
287
+		}
288
+		return $this->get_many_related('Datetime', $query_params);
289
+	}
290
+
291
+
292
+	/**
293
+	 * This returns the chronologically last datetime that this ticket is associated with
294
+	 *
295
+	 * @return EE_Datetime
296
+	 * @throws \EE_Error
297
+	 */
298
+	public function last_datetime()
299
+	{
300
+		$datetimes = $this->datetimes(array('limit' => 1, 'order_by' => array('DTT_EVT_start' => 'DESC')));
301
+		return end($datetimes);
302
+	}
303
+
304
+
305
+	/**
306
+	 * This returns the total tickets sold depending on the given parameters.
307
+	 *
308
+	 * @param  string $what   Can be one of two options: 'ticket', 'datetime'.
309
+	 *                        'ticket' = total ticket sales for all datetimes this ticket is related to
310
+	 *                        'datetime' = total ticket sales for a specified datetime (required $dtt_id)
311
+	 *                        'datetime' = total ticket sales in the datetime_ticket table.
312
+	 *                        If $dtt_id is not given then we return an array of sales indexed by datetime.
313
+	 *                        If $dtt_id IS given then we return the tickets sold for that given datetime.
314
+	 * @param  int    $dtt_id [optional] include the dtt_id with $what = 'datetime'.
315
+	 * @return mixed (array|int)          how many tickets have sold
316
+	 * @throws \EE_Error
317
+	 */
318
+	public function tickets_sold($what = 'ticket', $dtt_id = null)
319
+	{
320
+		$total = 0;
321
+		$tickets_sold = $this->_all_tickets_sold();
322
+		switch ($what) {
323
+			case 'ticket':
324
+				return $tickets_sold['ticket'];
325
+				break;
326
+			case 'datetime':
327
+				if (empty($tickets_sold['datetime'])) {
328
+					return $total;
329
+				}
330
+				if (! empty($dtt_id) && ! isset($tickets_sold['datetime'][ $dtt_id ])) {
331
+					EE_Error::add_error(
332
+						__(
333
+							'You\'ve requested the amount of tickets sold for a given ticket and datetime, however there are no records for the datetime id you included.  Are you SURE that is a datetime related to this ticket?',
334
+							'event_espresso'
335
+						),
336
+						__FILE__,
337
+						__FUNCTION__,
338
+						__LINE__
339
+					);
340
+					return $total;
341
+				}
342
+				return empty($dtt_id) ? $tickets_sold['datetime'] : $tickets_sold['datetime'][ $dtt_id ];
343
+				break;
344
+			default:
345
+				return $total;
346
+		}
347
+	}
348
+
349
+
350
+	/**
351
+	 * This returns an array indexed by datetime_id for tickets sold with this ticket.
352
+	 *
353
+	 * @return EE_Ticket[]
354
+	 * @throws \EE_Error
355
+	 */
356
+	protected function _all_tickets_sold()
357
+	{
358
+		$datetimes = $this->get_many_related('Datetime');
359
+		$tickets_sold = array();
360
+		if (! empty($datetimes)) {
361
+			foreach ($datetimes as $datetime) {
362
+				$tickets_sold['datetime'][ $datetime->ID() ] = $datetime->get('DTT_sold');
363
+			}
364
+		}
365
+		// Tickets sold
366
+		$tickets_sold['ticket'] = $this->sold();
367
+		return $tickets_sold;
368
+	}
369
+
370
+
371
+	/**
372
+	 * This returns the base price object for the ticket.
373
+	 *
374
+	 * @param  bool $return_array whether to return as an array indexed by price id or just the object.
375
+	 * @return EE_Price|EE_Base_Class|EE_Price[]|EE_Base_Class[]
376
+	 * @throws \EE_Error
377
+	 */
378
+	public function base_price($return_array = false)
379
+	{
380
+		$_where = array('Price_Type.PBT_ID' => EEM_Price_Type::base_type_base_price);
381
+		return $return_array
382
+			? $this->get_many_related('Price', array($_where))
383
+			: $this->get_first_related('Price', array($_where));
384
+	}
385
+
386
+
387
+	/**
388
+	 * This returns ONLY the price modifiers for the ticket (i.e. no taxes or base price)
389
+	 *
390
+	 * @access public
391
+	 * @return EE_Price[]
392
+	 * @throws \EE_Error
393
+	 */
394
+	public function price_modifiers()
395
+	{
396
+		$query_params = array(
397
+			0 => array(
398
+				'Price_Type.PBT_ID' => array(
399
+					'NOT IN',
400
+					array(EEM_Price_Type::base_type_base_price, EEM_Price_Type::base_type_tax),
401
+				),
402
+			),
403
+		);
404
+		return $this->prices($query_params);
405
+	}
406
+
407
+
408
+	/**
409
+	 * Gets all the prices that combine to form the final price of this ticket
410
+	 *
411
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
412
+	 * @return EE_Price[]|EE_Base_Class[]
413
+	 * @throws \EE_Error
414
+	 */
415
+	public function prices($query_params = array())
416
+	{
417
+		return $this->get_many_related('Price', $query_params);
418
+	}
419
+
420
+
421
+	/**
422
+	 * Gets all the ticket applicabilities (ie, relations between datetimes and tickets)
423
+	 *
424
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
425
+	 * @return EE_Datetime_Ticket|EE_Base_Class[]
426
+	 * @throws \EE_Error
427
+	 */
428
+	public function datetime_tickets($query_params = array())
429
+	{
430
+		return $this->get_many_related('Datetime_Ticket', $query_params);
431
+	}
432
+
433
+
434
+	/**
435
+	 * Gets all the datetimes from the db ordered by DTT_order
436
+	 *
437
+	 * @param boolean $show_expired
438
+	 * @param boolean $show_deleted
439
+	 * @return EE_Datetime[]
440
+	 * @throws \EE_Error
441
+	 */
442
+	public function datetimes_ordered($show_expired = true, $show_deleted = false)
443
+	{
444
+		return EEM_Datetime::instance($this->_timezone)->get_datetimes_for_ticket_ordered_by_DTT_order(
445
+			$this->ID(),
446
+			$show_expired,
447
+			$show_deleted
448
+		);
449
+	}
450
+
451
+
452
+	/**
453
+	 * Gets ID
454
+	 *
455
+	 * @return string
456
+	 * @throws \EE_Error
457
+	 */
458
+	public function ID()
459
+	{
460
+		return $this->get('TKT_ID');
461
+	}
462
+
463
+
464
+	/**
465
+	 * get the author of the ticket.
466
+	 *
467
+	 * @since 4.5.0
468
+	 * @return int
469
+	 * @throws \EE_Error
470
+	 */
471
+	public function wp_user()
472
+	{
473
+		return $this->get('TKT_wp_user');
474
+	}
475
+
476
+
477
+	/**
478
+	 * Gets the template for the ticket
479
+	 *
480
+	 * @return EE_Ticket_Template|EE_Base_Class
481
+	 * @throws \EE_Error
482
+	 */
483
+	public function template()
484
+	{
485
+		return $this->get_first_related('Ticket_Template');
486
+	}
487
+
488
+
489
+	/**
490
+	 * Simply returns an array of EE_Price objects that are taxes.
491
+	 *
492
+	 * @return EE_Price[]
493
+	 * @throws \EE_Error
494
+	 */
495
+	public function get_ticket_taxes_for_admin()
496
+	{
497
+		return EE_Taxes::get_taxes_for_admin();
498
+	}
499
+
500
+
501
+	/**
502
+	 * @return float
503
+	 * @throws \EE_Error
504
+	 */
505
+	public function ticket_price()
506
+	{
507
+		return $this->get('TKT_price');
508
+	}
509
+
510
+
511
+	/**
512
+	 * @return mixed
513
+	 * @throws \EE_Error
514
+	 */
515
+	public function pretty_price()
516
+	{
517
+		return $this->get_pretty('TKT_price');
518
+	}
519
+
520
+
521
+	/**
522
+	 * @return bool
523
+	 * @throws \EE_Error
524
+	 */
525
+	public function is_free()
526
+	{
527
+		return $this->get_ticket_total_with_taxes() === (float) 0;
528
+	}
529
+
530
+
531
+	/**
532
+	 * get_ticket_total_with_taxes
533
+	 *
534
+	 * @param bool $no_cache
535
+	 * @return float
536
+	 * @throws \EE_Error
537
+	 */
538
+	public function get_ticket_total_with_taxes($no_cache = false)
539
+	{
540
+		if ($this->_ticket_total_with_taxes === null || $no_cache) {
541
+			$this->_ticket_total_with_taxes = $this->get_ticket_subtotal() + $this->get_ticket_taxes_total_for_admin();
542
+		}
543
+		return (float) $this->_ticket_total_with_taxes;
544
+	}
545
+
546
+
547
+	public function ensure_TKT_Price_correct()
548
+	{
549
+		$this->set('TKT_price', EE_Taxes::get_subtotal_for_admin($this));
550
+		$this->save();
551
+	}
552
+
553
+
554
+	/**
555
+	 * @return float
556
+	 * @throws \EE_Error
557
+	 */
558
+	public function get_ticket_subtotal()
559
+	{
560
+		return EE_Taxes::get_subtotal_for_admin($this);
561
+	}
562
+
563
+
564
+	/**
565
+	 * Returns the total taxes applied to this ticket
566
+	 *
567
+	 * @return float
568
+	 * @throws \EE_Error
569
+	 */
570
+	public function get_ticket_taxes_total_for_admin()
571
+	{
572
+		return EE_Taxes::get_total_taxes_for_admin($this);
573
+	}
574
+
575
+
576
+	/**
577
+	 * Sets name
578
+	 *
579
+	 * @param string $name
580
+	 * @throws \EE_Error
581
+	 */
582
+	public function set_name($name)
583
+	{
584
+		$this->set('TKT_name', $name);
585
+	}
586
+
587
+
588
+	/**
589
+	 * Gets description
590
+	 *
591
+	 * @return string
592
+	 * @throws \EE_Error
593
+	 */
594
+	public function description()
595
+	{
596
+		return $this->get('TKT_description');
597
+	}
598
+
599
+
600
+	/**
601
+	 * Sets description
602
+	 *
603
+	 * @param string $description
604
+	 * @throws \EE_Error
605
+	 */
606
+	public function set_description($description)
607
+	{
608
+		$this->set('TKT_description', $description);
609
+	}
610
+
611
+
612
+	/**
613
+	 * Gets start_date
614
+	 *
615
+	 * @param string $dt_frmt
616
+	 * @param string $tm_frmt
617
+	 * @return string
618
+	 * @throws \EE_Error
619
+	 */
620
+	public function start_date($dt_frmt = '', $tm_frmt = '')
621
+	{
622
+		return $this->_get_datetime('TKT_start_date', $dt_frmt, $tm_frmt);
623
+	}
624
+
625
+
626
+	/**
627
+	 * Sets start_date
628
+	 *
629
+	 * @param string $start_date
630
+	 * @return void
631
+	 * @throws \EE_Error
632
+	 */
633
+	public function set_start_date($start_date)
634
+	{
635
+		$this->_set_date_time('B', $start_date, 'TKT_start_date');
636
+	}
637
+
638
+
639
+	/**
640
+	 * Gets end_date
641
+	 *
642
+	 * @param string $dt_frmt
643
+	 * @param string $tm_frmt
644
+	 * @return string
645
+	 * @throws \EE_Error
646
+	 */
647
+	public function end_date($dt_frmt = '', $tm_frmt = '')
648
+	{
649
+		return $this->_get_datetime('TKT_end_date', $dt_frmt, $tm_frmt);
650
+	}
651
+
652
+
653
+	/**
654
+	 * Sets end_date
655
+	 *
656
+	 * @param string $end_date
657
+	 * @return void
658
+	 * @throws \EE_Error
659
+	 */
660
+	public function set_end_date($end_date)
661
+	{
662
+		$this->_set_date_time('B', $end_date, 'TKT_end_date');
663
+	}
664
+
665
+
666
+	/**
667
+	 * Sets sell until time
668
+	 *
669
+	 * @since 4.5.0
670
+	 * @param string $time a string representation of the sell until time (ex 9am or 7:30pm)
671
+	 * @throws \EE_Error
672
+	 */
673
+	public function set_end_time($time)
674
+	{
675
+		$this->_set_time_for($time, 'TKT_end_date');
676
+	}
677
+
678
+
679
+	/**
680
+	 * Sets min
681
+	 *
682
+	 * @param int $min
683
+	 * @return void
684
+	 * @throws \EE_Error
685
+	 */
686
+	public function set_min($min)
687
+	{
688
+		$this->set('TKT_min', $min);
689
+	}
690
+
691
+
692
+	/**
693
+	 * Gets max
694
+	 *
695
+	 * @return int
696
+	 * @throws \EE_Error
697
+	 */
698
+	public function max()
699
+	{
700
+		return $this->get('TKT_max');
701
+	}
702
+
703
+
704
+	/**
705
+	 * Sets max
706
+	 *
707
+	 * @param int $max
708
+	 * @return void
709
+	 * @throws \EE_Error
710
+	 */
711
+	public function set_max($max)
712
+	{
713
+		$this->set('TKT_max', $max);
714
+	}
715
+
716
+
717
+	/**
718
+	 * Sets price
719
+	 *
720
+	 * @param float $price
721
+	 * @return void
722
+	 * @throws \EE_Error
723
+	 */
724
+	public function set_price($price)
725
+	{
726
+		$this->set('TKT_price', $price);
727
+	}
728
+
729
+
730
+	/**
731
+	 * Gets sold
732
+	 *
733
+	 * @return int
734
+	 * @throws \EE_Error
735
+	 */
736
+	public function sold()
737
+	{
738
+		return $this->get_raw('TKT_sold');
739
+	}
740
+
741
+
742
+	/**
743
+	 * Sets sold
744
+	 *
745
+	 * @param int $sold
746
+	 * @return void
747
+	 * @throws \EE_Error
748
+	 */
749
+	public function set_sold($sold)
750
+	{
751
+		// sold can not go below zero
752
+		$sold = max(0, $sold);
753
+		$this->set('TKT_sold', $sold);
754
+	}
755
+
756
+
757
+	/**
758
+	 * increments sold by amount passed by $qty
759
+	 *
760
+	 * @param int $qty
761
+	 * @return void
762
+	 * @throws \EE_Error
763
+	 */
764
+	public function increase_sold($qty = 1)
765
+	{
766
+		$sold = $this->sold() + $qty;
767
+		// remove ticket reservation, but don't adjust datetime reservations,  because that will happen
768
+		// via \EE_Datetime::increase_sold() when \EE_Ticket::_increase_sold_for_datetimes() is called
769
+		$this->decrease_reserved($qty, false, "TKT: {$this->ID()} (ln:" . __LINE__ . ')');
770
+		$this->_increase_sold_for_datetimes($qty);
771
+		$this->set_sold($sold);
772
+		do_action(
773
+			'AHEE__EE_Ticket__increase_sold',
774
+			$this,
775
+			$qty,
776
+			$sold
777
+		);
778
+	}
779
+
780
+
781
+	/**
782
+	 * Increases sold on related datetimes
783
+	 *
784
+	 * @param int $qty
785
+	 * @return void
786
+	 * @throws \EE_Error
787
+	 */
788
+	protected function _increase_sold_for_datetimes($qty = 1)
789
+	{
790
+		$datetimes = $this->datetimes();
791
+		if (is_array($datetimes)) {
792
+			foreach ($datetimes as $datetime) {
793
+				if ($datetime instanceof EE_Datetime) {
794
+					$datetime->increase_sold($qty);
795
+					$datetime->save();
796
+				}
797
+			}
798
+		}
799
+	}
800
+
801
+
802
+	/**
803
+	 * decrements (subtracts) sold by amount passed by $qty
804
+	 *
805
+	 * @param int $qty
806
+	 * @return void
807
+	 * @throws \EE_Error
808
+	 */
809
+	public function decrease_sold($qty = 1)
810
+	{
811
+		$sold = $this->sold() - $qty;
812
+		$this->_decrease_sold_for_datetimes($qty);
813
+		$this->set_sold($sold);
814
+		do_action(
815
+			'AHEE__EE_Ticket__decrease_sold',
816
+			$this,
817
+			$qty,
818
+			$sold
819
+		);
820
+	}
821
+
822
+
823
+	/**
824
+	 * Decreases sold on related datetimes
825
+	 *
826
+	 * @param int $qty
827
+	 * @return void
828
+	 * @throws \EE_Error
829
+	 */
830
+	protected function _decrease_sold_for_datetimes($qty = 1)
831
+	{
832
+		$datetimes = $this->datetimes();
833
+		if (is_array($datetimes)) {
834
+			foreach ($datetimes as $datetime) {
835
+				if ($datetime instanceof EE_Datetime) {
836
+					$datetime->decrease_sold($qty);
837
+					$datetime->save();
838
+				}
839
+			}
840
+		}
841
+	}
842
+
843
+
844
+	/**
845
+	 * Gets qty of reserved tickets
846
+	 *
847
+	 * @return int
848
+	 * @throws \EE_Error
849
+	 */
850
+	public function reserved()
851
+	{
852
+		return $this->get_raw('TKT_reserved');
853
+	}
854
+
855
+
856
+	/**
857
+	 * Sets reserved
858
+	 *
859
+	 * @param int $reserved
860
+	 * @return void
861
+	 * @throws \EE_Error
862
+	 */
863
+	public function set_reserved($reserved)
864
+	{
865
+		// reserved can not go below zero
866
+		$reserved = max(0, (int) $reserved);
867
+		$this->set('TKT_reserved', $reserved);
868
+	}
869
+
870
+
871
+	/**
872
+	 * increments reserved by amount passed by $qty
873
+	 *
874
+	 * @param int    $qty
875
+	 * @param string $source
876
+	 * @return void
877
+	 * @throws EE_Error
878
+	 * @throws InvalidArgumentException
879
+	 * @throws ReflectionException
880
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
881
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
882
+	 */
883
+	public function increase_reserved($qty = 1, $source = 'unknown')
884
+	{
885
+		$qty = absint($qty);
886
+		$reserved = $this->reserved() + $qty;
887
+		if ($reserved
888
+			&& $this->add_extra_meta(
889
+				EE_Ticket::META_KEY_TICKET_RESERVATIONS,
890
+				"{$qty} from {$source}"
891
+			)
892
+		) {
893
+			$this->_increase_reserved_for_datetimes($qty);
894
+			$this->set_reserved($reserved);
895
+			do_action(
896
+				'AHEE__EE_Ticket__increase_reserved',
897
+				$this,
898
+				$qty,
899
+				$reserved
900
+			);
901
+		}
902
+	}
903
+
904
+
905
+	/**
906
+	 * Increases sold on related datetimes
907
+	 *
908
+	 * @param int $qty
909
+	 * @return void
910
+	 * @throws \EE_Error
911
+	 */
912
+	protected function _increase_reserved_for_datetimes($qty = 1)
913
+	{
914
+		$datetimes = $this->datetimes();
915
+		if (is_array($datetimes)) {
916
+			foreach ($datetimes as $datetime) {
917
+				if ($datetime instanceof EE_Datetime) {
918
+					$datetime->increase_reserved($qty);
919
+					$datetime->save();
920
+				}
921
+			}
922
+		}
923
+	}
924
+
925
+
926
+	/**
927
+	 * decrements (subtracts) reserved by amount passed by $qty
928
+	 *
929
+	 * @param int    $qty
930
+	 * @param bool   $adjust_datetimes
931
+	 * @param string $source
932
+	 * @return void
933
+	 * @throws EE_Error
934
+	 * @throws InvalidArgumentException
935
+	 * @throws ReflectionException
936
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
937
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
938
+	 */
939
+	public function decrease_reserved($qty = 1, $adjust_datetimes = true, $source = 'unknown')
940
+	{
941
+		$reserved = $this->reserved() - absint($qty);
942
+		if ($this->add_extra_meta(
943
+			EE_Ticket::META_KEY_TICKET_RESERVATIONS,
944
+			"-{$qty} from {$source}"
945
+		)) {
946
+			if ($adjust_datetimes) {
947
+				$this->_decrease_reserved_for_datetimes($qty);
948
+			}
949
+			$this->set_reserved($reserved);
950
+			do_action(
951
+				'AHEE__EE_Ticket__decrease_reserved',
952
+				$this,
953
+				$qty,
954
+				$reserved
955
+			);
956
+		}
957
+	}
958
+
959
+
960
+	/**
961
+	 * Increases sold on related datetimes
962
+	 *
963
+	 * @param int $qty
964
+	 * @return void
965
+	 * @throws \EE_Error
966
+	 */
967
+	protected function _decrease_reserved_for_datetimes($qty = 1)
968
+	{
969
+		$datetimes = $this->datetimes();
970
+		if (is_array($datetimes)) {
971
+			foreach ($datetimes as $datetime) {
972
+				if ($datetime instanceof EE_Datetime) {
973
+					$datetime->decrease_reserved($qty);
974
+					$datetime->save();
975
+				}
976
+			}
977
+		}
978
+	}
979
+
980
+
981
+	/**
982
+	 * Gets ticket quantity
983
+	 *
984
+	 * @param string $context     ticket quantity is somewhat subjective depending on the exact information sought
985
+	 *                            therefore $context can be one of three values: '', 'reg_limit', or 'saleable'
986
+	 *                            '' (default) quantity is the actual db value for TKT_qty, unaffected by other objects
987
+	 *                            REG LIMIT: caps qty based on DTT_reg_limit for ALL related datetimes
988
+	 *                            SALEABLE: also considers datetime sold and returns zero if ANY DTT is sold out, and
989
+	 *                            is therefore the truest measure of tickets that can be purchased at the moment
990
+	 * @return int
991
+	 * @throws \EE_Error
992
+	 */
993
+	public function qty($context = '')
994
+	{
995
+		switch ($context) {
996
+			case 'reg_limit':
997
+				return $this->real_quantity_on_ticket();
998
+			case 'saleable':
999
+				return $this->real_quantity_on_ticket('saleable');
1000
+			default:
1001
+				return $this->get_raw('TKT_qty');
1002
+		}
1003
+	}
1004
+
1005
+
1006
+	/**
1007
+	 * Gets ticket quantity
1008
+	 *
1009
+	 * @param string $context     ticket quantity is somewhat subjective depending on the exact information sought
1010
+	 *                            therefore $context can be one of two values: 'reg_limit', or 'saleable'
1011
+	 *                            REG LIMIT: caps qty based on DTT_reg_limit for ALL related datetimes
1012
+	 *                            SALEABLE: also considers datetime sold and returns zero if ANY DTT is sold out, and
1013
+	 *                            is therefore the truest measure of tickets that can be purchased at the moment
1014
+	 * @param  int   $DTT_ID      the primary key for a particular datetime.
1015
+	 *                            set to 0 for all related datetimes
1016
+	 * @return int
1017
+	 * @throws \EE_Error
1018
+	 */
1019
+	public function real_quantity_on_ticket($context = 'reg_limit', $DTT_ID = 0)
1020
+	{
1021
+		$raw = $this->get_raw('TKT_qty');
1022
+		// return immediately if it's zero
1023
+		if ($raw === 0) {
1024
+			return $raw;
1025
+		}
1026
+		// echo "\n\n<br />Ticket: " . $this->name() . '<br />';
1027
+		// ensure qty doesn't exceed raw value for THIS ticket
1028
+		$qty = min(EE_INF, $raw);
1029
+		// echo "\n . qty: " . $qty . '<br />';
1030
+		// calculate this ticket's total sales and reservations
1031
+		$sold_and_reserved_for_this_ticket = $this->sold() + $this->reserved();
1032
+		// echo "\n . sold: " . $this->sold() . '<br />';
1033
+		// echo "\n . reserved: " . $this->reserved() . '<br />';
1034
+		// echo "\n . sold_and_reserved_for_this_ticket: " . $sold_and_reserved_for_this_ticket . '<br />';
1035
+		// first we need to calculate the maximum number of tickets available for the datetime
1036
+		// do we want data for one datetime or all of them ?
1037
+		$query_params = $DTT_ID ? array(array('DTT_ID' => $DTT_ID)) : array();
1038
+		$datetimes = $this->datetimes($query_params);
1039
+		if (is_array($datetimes) && ! empty($datetimes)) {
1040
+			foreach ($datetimes as $datetime) {
1041
+				if ($datetime instanceof EE_Datetime) {
1042
+					$datetime->refresh_from_db();
1043
+					// echo "\n . . datetime name: " . $datetime->name() . '<br />';
1044
+					// echo "\n . . datetime ID: " . $datetime->ID() . '<br />';
1045
+					// initialize with no restrictions for each datetime
1046
+					// but adjust datetime qty based on datetime reg limit
1047
+					$datetime_qty = min(EE_INF, $datetime->reg_limit());
1048
+					// echo "\n . . . datetime reg_limit: " . $datetime->reg_limit() . '<br />';
1049
+					// echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1050
+					// if we want the actual saleable amount, then we need to consider OTHER ticket sales
1051
+					// and reservations for this datetime, that do NOT include sales and reservations
1052
+					// for this ticket (so we add $this->sold() and $this->reserved() back in)
1053
+					if ($context === 'saleable') {
1054
+						$datetime_qty = max(
1055
+							$datetime_qty - $datetime->sold_and_reserved() + $sold_and_reserved_for_this_ticket,
1056
+							0
1057
+						);
1058
+						// echo "\n . . . datetime sold: " . $datetime->sold() . '<br />';
1059
+						// echo "\n . . . datetime reserved: " . $datetime->reserved() . '<br />';
1060
+						// echo "\n . . . datetime sold_and_reserved: " . $datetime->sold_and_reserved() . '<br />';
1061
+						// echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1062
+						$datetime_qty = ! $datetime->sold_out() ? $datetime_qty : 0;
1063
+						// echo "\n . . . datetime_qty: " . $datetime_qty . '<br />';
1064
+					}
1065
+					$qty = min($datetime_qty, $qty);
1066
+					// echo "\n . . qty: " . $qty . '<br />';
1067
+				}
1068
+			}
1069
+		}
1070
+		// NOW that we know the  maximum number of tickets available for the datetime
1071
+		// we can finally factor in the details for this specific ticket
1072
+		if ($qty > 0 && $context === 'saleable') {
1073
+			// and subtract the sales for THIS ticket
1074
+			$qty = max($qty - $sold_and_reserved_for_this_ticket, 0);
1075
+			// echo "\n . qty: " . $qty . '<br />';
1076
+		}
1077
+		// echo "\nFINAL QTY: " . $qty . "<br /><br />";
1078
+		return $qty;
1079
+	}
1080
+
1081
+
1082
+	/**
1083
+	 * Sets qty - IMPORTANT!!! Does NOT allow QTY to be set higher than the lowest reg limit of any related datetimes
1084
+	 *
1085
+	 * @param int $qty
1086
+	 * @return void
1087
+	 * @throws \EE_Error
1088
+	 */
1089
+	public function set_qty($qty)
1090
+	{
1091
+		$datetimes = $this->datetimes();
1092
+		foreach ($datetimes as $datetime) {
1093
+			if ($datetime instanceof EE_Datetime) {
1094
+				$qty = min($qty, $datetime->reg_limit());
1095
+			}
1096
+		}
1097
+		$this->set('TKT_qty', $qty);
1098
+	}
1099
+
1100
+
1101
+	/**
1102
+	 * Gets uses
1103
+	 *
1104
+	 * @return int
1105
+	 * @throws \EE_Error
1106
+	 */
1107
+	public function uses()
1108
+	{
1109
+		return $this->get('TKT_uses');
1110
+	}
1111
+
1112
+
1113
+	/**
1114
+	 * Sets uses
1115
+	 *
1116
+	 * @param int $uses
1117
+	 * @return void
1118
+	 * @throws \EE_Error
1119
+	 */
1120
+	public function set_uses($uses)
1121
+	{
1122
+		$this->set('TKT_uses', $uses);
1123
+	}
1124
+
1125
+
1126
+	/**
1127
+	 * returns whether ticket is required or not.
1128
+	 *
1129
+	 * @return boolean
1130
+	 * @throws \EE_Error
1131
+	 */
1132
+	public function required()
1133
+	{
1134
+		return $this->get('TKT_required');
1135
+	}
1136
+
1137
+
1138
+	/**
1139
+	 * sets the TKT_required property
1140
+	 *
1141
+	 * @param boolean $required
1142
+	 * @return void
1143
+	 * @throws \EE_Error
1144
+	 */
1145
+	public function set_required($required)
1146
+	{
1147
+		$this->set('TKT_required', $required);
1148
+	}
1149
+
1150
+
1151
+	/**
1152
+	 * Gets taxable
1153
+	 *
1154
+	 * @return boolean
1155
+	 * @throws \EE_Error
1156
+	 */
1157
+	public function taxable()
1158
+	{
1159
+		return $this->get('TKT_taxable');
1160
+	}
1161
+
1162
+
1163
+	/**
1164
+	 * Sets taxable
1165
+	 *
1166
+	 * @param boolean $taxable
1167
+	 * @return void
1168
+	 * @throws \EE_Error
1169
+	 */
1170
+	public function set_taxable($taxable)
1171
+	{
1172
+		$this->set('TKT_taxable', $taxable);
1173
+	}
1174
+
1175
+
1176
+	/**
1177
+	 * Gets is_default
1178
+	 *
1179
+	 * @return boolean
1180
+	 * @throws \EE_Error
1181
+	 */
1182
+	public function is_default()
1183
+	{
1184
+		return $this->get('TKT_is_default');
1185
+	}
1186
+
1187
+
1188
+	/**
1189
+	 * Sets is_default
1190
+	 *
1191
+	 * @param boolean $is_default
1192
+	 * @return void
1193
+	 * @throws \EE_Error
1194
+	 */
1195
+	public function set_is_default($is_default)
1196
+	{
1197
+		$this->set('TKT_is_default', $is_default);
1198
+	}
1199
+
1200
+
1201
+	/**
1202
+	 * Gets order
1203
+	 *
1204
+	 * @return int
1205
+	 * @throws \EE_Error
1206
+	 */
1207
+	public function order()
1208
+	{
1209
+		return $this->get('TKT_order');
1210
+	}
1211
+
1212
+
1213
+	/**
1214
+	 * Sets order
1215
+	 *
1216
+	 * @param int $order
1217
+	 * @return void
1218
+	 * @throws \EE_Error
1219
+	 */
1220
+	public function set_order($order)
1221
+	{
1222
+		$this->set('TKT_order', $order);
1223
+	}
1224
+
1225
+
1226
+	/**
1227
+	 * Gets row
1228
+	 *
1229
+	 * @return int
1230
+	 * @throws \EE_Error
1231
+	 */
1232
+	public function row()
1233
+	{
1234
+		return $this->get('TKT_row');
1235
+	}
1236
+
1237
+
1238
+	/**
1239
+	 * Sets row
1240
+	 *
1241
+	 * @param int $row
1242
+	 * @return void
1243
+	 * @throws \EE_Error
1244
+	 */
1245
+	public function set_row($row)
1246
+	{
1247
+		$this->set('TKT_row', $row);
1248
+	}
1249
+
1250
+
1251
+	/**
1252
+	 * Gets deleted
1253
+	 *
1254
+	 * @return boolean
1255
+	 * @throws \EE_Error
1256
+	 */
1257
+	public function deleted()
1258
+	{
1259
+		return $this->get('TKT_deleted');
1260
+	}
1261
+
1262
+
1263
+	/**
1264
+	 * Sets deleted
1265
+	 *
1266
+	 * @param boolean $deleted
1267
+	 * @return void
1268
+	 * @throws \EE_Error
1269
+	 */
1270
+	public function set_deleted($deleted)
1271
+	{
1272
+		$this->set('TKT_deleted', $deleted);
1273
+	}
1274
+
1275
+
1276
+	/**
1277
+	 * Gets parent
1278
+	 *
1279
+	 * @return int
1280
+	 * @throws \EE_Error
1281
+	 */
1282
+	public function parent_ID()
1283
+	{
1284
+		return $this->get('TKT_parent');
1285
+	}
1286
+
1287
+
1288
+	/**
1289
+	 * Sets parent
1290
+	 *
1291
+	 * @param int $parent
1292
+	 * @return void
1293
+	 * @throws \EE_Error
1294
+	 */
1295
+	public function set_parent_ID($parent)
1296
+	{
1297
+		$this->set('TKT_parent', $parent);
1298
+	}
1299
+
1300
+
1301
+	/**
1302
+	 * Gets a string which is handy for showing in gateways etc that describes the ticket.
1303
+	 *
1304
+	 * @return string
1305
+	 * @throws \EE_Error
1306
+	 */
1307
+	public function name_and_info()
1308
+	{
1309
+		$times = array();
1310
+		foreach ($this->datetimes() as $datetime) {
1311
+			$times[] = $datetime->start_date_and_time();
1312
+		}
1313
+		return $this->name() . ' @ ' . implode(', ', $times) . ' for ' . $this->pretty_price();
1314
+	}
1315
+
1316
+
1317
+	/**
1318
+	 * Gets name
1319
+	 *
1320
+	 * @return string
1321
+	 * @throws \EE_Error
1322
+	 */
1323
+	public function name()
1324
+	{
1325
+		return $this->get('TKT_name');
1326
+	}
1327
+
1328
+
1329
+	/**
1330
+	 * Gets price
1331
+	 *
1332
+	 * @return float
1333
+	 * @throws \EE_Error
1334
+	 */
1335
+	public function price()
1336
+	{
1337
+		return $this->get('TKT_price');
1338
+	}
1339
+
1340
+
1341
+	/**
1342
+	 * Gets all the registrations for this ticket
1343
+	 *
1344
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1345
+	 * @return EE_Registration[]|EE_Base_Class[]
1346
+	 * @throws \EE_Error
1347
+	 */
1348
+	public function registrations($query_params = array())
1349
+	{
1350
+		return $this->get_many_related('Registration', $query_params);
1351
+	}
1352
+
1353
+
1354
+	/**
1355
+	 * Updates the TKT_sold attribute (and saves) based on the number of APPROVED registrations for this ticket.
1356
+	 * into account
1357
+	 *
1358
+	 * @return int
1359
+	 * @throws \EE_Error
1360
+	 */
1361
+	public function update_tickets_sold()
1362
+	{
1363
+		$count_regs_for_this_ticket = $this->count_registrations(
1364
+			array(
1365
+				array(
1366
+					'STS_ID'      => EEM_Registration::status_id_approved,
1367
+					'REG_deleted' => 0,
1368
+				),
1369
+			)
1370
+		);
1371
+		$sold = $this->sold();
1372
+		if ($count_regs_for_this_ticket > $sold) {
1373
+			$this->increase_sold($count_regs_for_this_ticket - $sold);
1374
+			$this->save();
1375
+		} elseif ($count_regs_for_this_ticket < $sold) {
1376
+			$this->decrease_sold($count_regs_for_this_ticket - $sold);
1377
+			$this->save();
1378
+		}
1379
+		return $count_regs_for_this_ticket;
1380
+	}
1381
+
1382
+
1383
+	/**
1384
+	 * Counts the registrations for this ticket
1385
+	 *
1386
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
1387
+	 * @return int
1388
+	 */
1389
+	public function count_registrations($query_params = array())
1390
+	{
1391
+		return $this->count_related('Registration', $query_params);
1392
+	}
1393
+
1394
+
1395
+	/**
1396
+	 * Implementation for EEI_Has_Icon interface method.
1397
+	 *
1398
+	 * @see EEI_Visual_Representation for comments
1399
+	 * @return string
1400
+	 */
1401
+	public function get_icon()
1402
+	{
1403
+		return '<span class="dashicons dashicons-tickets-alt"></span>';
1404
+	}
1405
+
1406
+
1407
+	/**
1408
+	 * Implementation of the EEI_Event_Relation interface method
1409
+	 *
1410
+	 * @see EEI_Event_Relation for comments
1411
+	 * @return EE_Event
1412
+	 * @throws \EE_Error
1413
+	 * @throws UnexpectedEntityException
1414
+	 */
1415
+	public function get_related_event()
1416
+	{
1417
+		// get one datetime to use for getting the event
1418
+		$datetime = $this->first_datetime();
1419
+		if (! $datetime instanceof \EE_Datetime) {
1420
+			throw new UnexpectedEntityException(
1421
+				$datetime,
1422
+				'EE_Datetime',
1423
+				sprintf(
1424
+					__('The ticket (%s) is not associated with any valid datetimes.', 'event_espresso'),
1425
+					$this->name()
1426
+				)
1427
+			);
1428
+		}
1429
+		$event = $datetime->event();
1430
+		if (! $event instanceof \EE_Event) {
1431
+			throw new UnexpectedEntityException(
1432
+				$event,
1433
+				'EE_Event',
1434
+				sprintf(
1435
+					__('The ticket (%s) is not associated with a valid event.', 'event_espresso'),
1436
+					$this->name()
1437
+				)
1438
+			);
1439
+		}
1440
+		return $event;
1441
+	}
1442
+
1443
+
1444
+	/**
1445
+	 * Implementation of the EEI_Event_Relation interface method
1446
+	 *
1447
+	 * @see EEI_Event_Relation for comments
1448
+	 * @return string
1449
+	 * @throws UnexpectedEntityException
1450
+	 * @throws \EE_Error
1451
+	 */
1452
+	public function get_event_name()
1453
+	{
1454
+		$event = $this->get_related_event();
1455
+		return $event instanceof EE_Event ? $event->name() : '';
1456
+	}
1457
+
1458
+
1459
+	/**
1460
+	 * Implementation of the EEI_Event_Relation interface method
1461
+	 *
1462
+	 * @see EEI_Event_Relation for comments
1463
+	 * @return int
1464
+	 * @throws UnexpectedEntityException
1465
+	 * @throws \EE_Error
1466
+	 */
1467
+	public function get_event_ID()
1468
+	{
1469
+		$event = $this->get_related_event();
1470
+		return $event instanceof EE_Event ? $event->ID() : 0;
1471
+	}
1472
+
1473
+
1474
+	/**
1475
+	 * This simply returns whether a ticket can be permanently deleted or not.
1476
+	 * The criteria for determining this is whether the ticket has any related registrations.
1477
+	 * If there are none then it can be permanently deleted.
1478
+	 *
1479
+	 * @return bool
1480
+	 */
1481
+	public function is_permanently_deleteable()
1482
+	{
1483
+		return $this->count_registrations() === 0;
1484
+	}
1485 1485
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Venue.class.php 2 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -30,7 +30,7 @@
 block discarded – undo
30 30
      * @param array  $props_n_values  incoming values from the database
31 31
      * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
32 32
      *                                the website will be used.
33
-     * @return EE_Attendee
33
+     * @return EE_Venue
34 34
      */
35 35
     public static function new_instance_from_db($props_n_values = array(), $timezone = null)
36 36
     {
Please login to merge, or discard this patch.
Indentation   +560 added lines, -560 removed lines patch added patch discarded remove patch
@@ -10,564 +10,564 @@
 block discarded – undo
10 10
 class EE_Venue extends EE_CPT_Base implements EEI_Address
11 11
 {
12 12
 
13
-    /**
14
-     *
15
-     * @param array  $props_n_values          incoming values
16
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
17
-     *                                        used.)
18
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
19
-     *                                        date_format and the second value is the time format
20
-     * @return EE_Attendee
21
-     */
22
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
23
-    {
24
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
25
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
26
-    }
27
-
28
-
29
-    /**
30
-     * @param array  $props_n_values  incoming values from the database
31
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
32
-     *                                the website will be used.
33
-     * @return EE_Attendee
34
-     */
35
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
36
-    {
37
-        return new self($props_n_values, true, $timezone);
38
-    }
39
-
40
-
41
-    /**
42
-     * Gets name
43
-     *
44
-     * @return string
45
-     */
46
-    public function name()
47
-    {
48
-        return $this->get('VNU_name');
49
-    }
50
-
51
-
52
-    /**
53
-     * Gets phone
54
-     *
55
-     * @return string
56
-     */
57
-    public function phone()
58
-    {
59
-        return $this->get('VNU_phone');
60
-    }
61
-
62
-
63
-    /**
64
-     * venue_url
65
-     *
66
-     * @return string
67
-     */
68
-    public function venue_url()
69
-    {
70
-        return $this->get('VNU_url');
71
-    }
72
-
73
-
74
-    /**
75
-     * Gets desc
76
-     *
77
-     * @return string
78
-     */
79
-    public function description()
80
-    {
81
-        return $this->get('VNU_desc');
82
-    }
83
-
84
-
85
-    /**
86
-     * Gets short description (AKA: the excerpt)
87
-     *
88
-     * @return string
89
-     */
90
-    public function excerpt()
91
-    {
92
-        return $this->get('VNU_short_desc');
93
-    }
94
-
95
-
96
-    /**
97
-     * Gets identifier
98
-     *
99
-     * @return string
100
-     */
101
-    public function identifier()
102
-    {
103
-        return $this->get('VNU_identifier');
104
-    }
105
-
106
-
107
-    /**
108
-     * Gets address
109
-     *
110
-     * @return string
111
-     */
112
-    public function address()
113
-    {
114
-        return $this->get('VNU_address');
115
-    }
116
-
117
-
118
-    /**
119
-     * Gets address2
120
-     *
121
-     * @return string
122
-     */
123
-    public function address2()
124
-    {
125
-        return $this->get('VNU_address2');
126
-    }
127
-
128
-
129
-    /**
130
-     * Gets city
131
-     *
132
-     * @return string
133
-     */
134
-    public function city()
135
-    {
136
-        return $this->get('VNU_city');
137
-    }
138
-
139
-    /**
140
-     * Gets state
141
-     *
142
-     * @return int
143
-     */
144
-    public function state_ID()
145
-    {
146
-        return $this->get('STA_ID');
147
-    }
148
-
149
-
150
-    /**
151
-     * @return string
152
-     */
153
-    public function state_abbrev()
154
-    {
155
-        return $this->state_obj() instanceof EE_State ? $this->state_obj()->abbrev() : '';
156
-    }
157
-
158
-
159
-    /**
160
-     * @return string
161
-     */
162
-    public function state_name()
163
-    {
164
-        return $this->state_obj() instanceof EE_State ? $this->state_obj()->name() : '';
165
-    }
166
-
167
-
168
-    /**
169
-     * Gets the state for this venue
170
-     *
171
-     * @return EE_State
172
-     */
173
-    public function state_obj()
174
-    {
175
-        return $this->get_first_related('State');
176
-    }
177
-
178
-
179
-    /**
180
-     * either displays the state abbreviation or the state name, as determined
181
-     * by the "FHEE__EEI_Address__state__use_abbreviation" filter.
182
-     * defaults to abbreviation
183
-     *
184
-     * @return string
185
-     */
186
-    public function state()
187
-    {
188
-        if (apply_filters('FHEE__EEI_Address__state__use_abbreviation', true, $this->state_obj())) {
189
-            return $this->state_abbrev();
190
-        } else {
191
-            return $this->state_name();
192
-        }
193
-    }
194
-
195
-
196
-    /**
197
-     * country_ID
198
-     *
199
-     * @return string
200
-     */
201
-    public function country_ID()
202
-    {
203
-        return $this->get('CNT_ISO');
204
-    }
205
-
206
-
207
-    /**
208
-     * @return string
209
-     */
210
-    public function country_name()
211
-    {
212
-        return $this->country_obj() instanceof EE_Country ? $this->country_obj()->name() : '';
213
-    }
214
-
215
-
216
-    /**
217
-     * Gets the country of this venue
218
-     *
219
-     * @return EE_Country
220
-     */
221
-    public function country_obj()
222
-    {
223
-        return $this->get_first_related('Country');
224
-    }
225
-
226
-
227
-    /**
228
-     * either displays the country ISO2 code or the country name, as determined
229
-     * by the "FHEE__EEI_Address__country__use_abbreviation" filter.
230
-     * defaults to abbreviation
231
-     *
232
-     * @return string
233
-     */
234
-    public function country()
235
-    {
236
-        if (apply_filters('FHEE__EEI_Address__country__use_abbreviation', true, $this->country_obj())) {
237
-            return $this->country_ID();
238
-        } else {
239
-            return $this->country_name();
240
-        }
241
-    }
242
-
243
-
244
-    /**
245
-     * Gets zip
246
-     *
247
-     * @return string
248
-     */
249
-    public function zip()
250
-    {
251
-        return $this->get('VNU_zip');
252
-    }
253
-
254
-
255
-    /**
256
-     * Gets capacity
257
-     *
258
-     * @return int
259
-     */
260
-    public function capacity()
261
-    {
262
-        return $this->get_pretty('VNU_capacity', 'symbol');
263
-    }
264
-
265
-
266
-    /**
267
-     * Gets created
268
-     *
269
-     * @return string
270
-     */
271
-    public function created()
272
-    {
273
-        return $this->get('VNU_created');
274
-    }
275
-
276
-
277
-    /**
278
-     * Gets modified
279
-     *
280
-     * @return string
281
-     */
282
-    public function modified()
283
-    {
284
-        return $this->get('VNU_modified');
285
-    }
286
-
287
-
288
-    /**
289
-     * Gets order
290
-     *
291
-     * @return int
292
-     */
293
-    public function order()
294
-    {
295
-        return $this->get('VNU_order');
296
-    }
297
-
298
-
299
-    /**
300
-     * Gets wp_user
301
-     *
302
-     * @return int
303
-     */
304
-    public function wp_user()
305
-    {
306
-        return $this->get('VNU_wp_user');
307
-    }
308
-
309
-
310
-    /**
311
-     * @return string
312
-     */
313
-    public function virtual_phone()
314
-    {
315
-        return $this->get('VNU_virtual_phone');
316
-    }
317
-
318
-
319
-    /**
320
-     * @return string
321
-     */
322
-    public function virtual_url()
323
-    {
324
-        return $this->get('VNU_virtual_url');
325
-    }
326
-
327
-
328
-    /**
329
-     * @return bool
330
-     */
331
-    public function enable_for_gmap()
332
-    {
333
-        return $this->get('VNU_enable_for_gmap');
334
-    }
335
-
336
-
337
-    /**
338
-     * @return string
339
-     */
340
-    public function google_map_link()
341
-    {
342
-        return $this->get('VNU_google_map_link');
343
-    }
344
-
345
-
346
-    /**
347
-     * Gets all events happening at this venue. Query parameters can be added to
348
-     * fetch a subset of those events.
349
-     *
350
-     * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
351
-     * @param bool  $upcoming
352
-     * @return EE_Event[]
353
-     */
354
-    public function events($query_params = array(), $upcoming = false)
355
-    {
356
-        if ($upcoming) {
357
-            $query_params = array(
358
-                array(
359
-                    'status'                 => 'publish',
360
-                    'Datetime.DTT_EVT_start' => array(
361
-                        '>',
362
-                        EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
363
-                    ),
364
-                ),
365
-            );
366
-        }
367
-        return $this->get_many_related('Event', $query_params);
368
-    }
369
-
370
-
371
-    /**
372
-     * Sets address
373
-     */
374
-    public function set_address($address = '')
375
-    {
376
-        $this->set('VNU_address', $address);
377
-    }
378
-
379
-
380
-    /**
381
-     * @param string $address2
382
-     */
383
-    public function set_address2($address2 = '')
384
-    {
385
-        $this->set('VNU_address2', $address2);
386
-    }
387
-
388
-
389
-    /**
390
-     * @param string $city
391
-     */
392
-    public function set_city($city = '')
393
-    {
394
-        $this->set('VNU_city', $city);
395
-    }
396
-
397
-
398
-    /**
399
-     * @param int $state
400
-     */
401
-    public function set_state_ID($state = 0)
402
-    {
403
-        $this->set('STA_ID', $state);
404
-    }
405
-
406
-
407
-    /**
408
-     * Sets the state, given either a state id or state object
409
-     *
410
-     * @param EE_State /int $state_id_or_obj
411
-     * @return EE_State
412
-     */
413
-    public function set_state_obj($state_id_or_obj)
414
-    {
415
-        return $this->_add_relation_to($state_id_or_obj, 'State');
416
-    }
417
-
418
-
419
-    /**
420
-     * @param int $country_ID
421
-     */
422
-    public function set_country_ID($country_ID = 0)
423
-    {
424
-        $this->set('CNT_ISO', $country_ID);
425
-    }
426
-
427
-
428
-    /**
429
-     * Sets the country on the venue
430
-     *
431
-     * @param EE_Country /string $country_id_or_obj
432
-     * @return EE_Country
433
-     */
434
-    public function set_country_obj($country_id_or_obj)
435
-    {
436
-        return $this->_add_relation_to($country_id_or_obj, 'Country');
437
-    }
438
-
439
-
440
-    /**
441
-     * @param string $zip
442
-     */
443
-    public function set_zip($zip = '')
444
-    {
445
-        $this->set('VNU_zip', $zip);
446
-    }
447
-
448
-
449
-    /**
450
-     * @param int $capacity
451
-     */
452
-    public function set_capacity($capacity = 0)
453
-    {
454
-        $this->set('VNU_capacity', $capacity);
455
-    }
456
-
457
-
458
-    /**
459
-     * @param string $created
460
-     */
461
-    public function set_created($created = '')
462
-    {
463
-        $this->set('VNU_created', $created);
464
-    }
465
-
466
-
467
-    /**
468
-     * @param string $desc
469
-     */
470
-    public function set_description($desc = '')
471
-    {
472
-        $this->set('VNU_desc', $desc);
473
-    }
474
-
475
-
476
-    /**
477
-     * @param string $identifier
478
-     */
479
-    public function set_identifier($identifier = '')
480
-    {
481
-        $this->set('VNU_identifier', $identifier);
482
-    }
483
-
484
-
485
-    /**
486
-     * @param string $modified
487
-     */
488
-    public function set_modified($modified = '')
489
-    {
490
-        $this->set('VNU_modified', $modified);
491
-    }
492
-
493
-
494
-    /**
495
-     * @param string $name
496
-     */
497
-    public function set_name($name = '')
498
-    {
499
-        $this->set('VNU_name', $name);
500
-    }
501
-
502
-
503
-    /**
504
-     * @param int $order
505
-     */
506
-    public function set_order($order = 0)
507
-    {
508
-        $this->set('VNU_order', $order);
509
-    }
510
-
511
-
512
-    /**
513
-     * @param string $phone
514
-     */
515
-    public function set_phone($phone = '')
516
-    {
517
-        $this->set('VNU_phone', $phone);
518
-    }
519
-
520
-
521
-    /**
522
-     * @param int $wp_user
523
-     */
524
-    public function set_wp_user($wp_user = 1)
525
-    {
526
-        $this->set('VNU_wp_user', $wp_user);
527
-    }
528
-
529
-
530
-    /**
531
-     * @param string $url
532
-     */
533
-    public function set_venue_url($url = '')
534
-    {
535
-        $this->set('VNU_url', $url);
536
-    }
537
-
538
-
539
-    /**
540
-     * @param string $phone
541
-     */
542
-    public function set_virtual_phone($phone = '')
543
-    {
544
-        $this->set('VNU_virtual_phone', $phone);
545
-    }
546
-
547
-
548
-    /**
549
-     * @param string $url
550
-     */
551
-    public function set_virtual_url($url = '')
552
-    {
553
-        $this->set('VNU_virtual_url', $url);
554
-    }
555
-
556
-
557
-    /**
558
-     * @param string $enable
559
-     */
560
-    public function set_enable_for_gmap($enable = '')
561
-    {
562
-        $this->set('VNU_enable_for_gmap', $enable);
563
-    }
564
-
565
-
566
-    /**
567
-     * @param string $google_map_link
568
-     */
569
-    public function set_google_map_link($google_map_link = '')
570
-    {
571
-        $this->set('VNU_google_map_link', $google_map_link);
572
-    }
13
+	/**
14
+	 *
15
+	 * @param array  $props_n_values          incoming values
16
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
17
+	 *                                        used.)
18
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
19
+	 *                                        date_format and the second value is the time format
20
+	 * @return EE_Attendee
21
+	 */
22
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
23
+	{
24
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
25
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
26
+	}
27
+
28
+
29
+	/**
30
+	 * @param array  $props_n_values  incoming values from the database
31
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
32
+	 *                                the website will be used.
33
+	 * @return EE_Attendee
34
+	 */
35
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
36
+	{
37
+		return new self($props_n_values, true, $timezone);
38
+	}
39
+
40
+
41
+	/**
42
+	 * Gets name
43
+	 *
44
+	 * @return string
45
+	 */
46
+	public function name()
47
+	{
48
+		return $this->get('VNU_name');
49
+	}
50
+
51
+
52
+	/**
53
+	 * Gets phone
54
+	 *
55
+	 * @return string
56
+	 */
57
+	public function phone()
58
+	{
59
+		return $this->get('VNU_phone');
60
+	}
61
+
62
+
63
+	/**
64
+	 * venue_url
65
+	 *
66
+	 * @return string
67
+	 */
68
+	public function venue_url()
69
+	{
70
+		return $this->get('VNU_url');
71
+	}
72
+
73
+
74
+	/**
75
+	 * Gets desc
76
+	 *
77
+	 * @return string
78
+	 */
79
+	public function description()
80
+	{
81
+		return $this->get('VNU_desc');
82
+	}
83
+
84
+
85
+	/**
86
+	 * Gets short description (AKA: the excerpt)
87
+	 *
88
+	 * @return string
89
+	 */
90
+	public function excerpt()
91
+	{
92
+		return $this->get('VNU_short_desc');
93
+	}
94
+
95
+
96
+	/**
97
+	 * Gets identifier
98
+	 *
99
+	 * @return string
100
+	 */
101
+	public function identifier()
102
+	{
103
+		return $this->get('VNU_identifier');
104
+	}
105
+
106
+
107
+	/**
108
+	 * Gets address
109
+	 *
110
+	 * @return string
111
+	 */
112
+	public function address()
113
+	{
114
+		return $this->get('VNU_address');
115
+	}
116
+
117
+
118
+	/**
119
+	 * Gets address2
120
+	 *
121
+	 * @return string
122
+	 */
123
+	public function address2()
124
+	{
125
+		return $this->get('VNU_address2');
126
+	}
127
+
128
+
129
+	/**
130
+	 * Gets city
131
+	 *
132
+	 * @return string
133
+	 */
134
+	public function city()
135
+	{
136
+		return $this->get('VNU_city');
137
+	}
138
+
139
+	/**
140
+	 * Gets state
141
+	 *
142
+	 * @return int
143
+	 */
144
+	public function state_ID()
145
+	{
146
+		return $this->get('STA_ID');
147
+	}
148
+
149
+
150
+	/**
151
+	 * @return string
152
+	 */
153
+	public function state_abbrev()
154
+	{
155
+		return $this->state_obj() instanceof EE_State ? $this->state_obj()->abbrev() : '';
156
+	}
157
+
158
+
159
+	/**
160
+	 * @return string
161
+	 */
162
+	public function state_name()
163
+	{
164
+		return $this->state_obj() instanceof EE_State ? $this->state_obj()->name() : '';
165
+	}
166
+
167
+
168
+	/**
169
+	 * Gets the state for this venue
170
+	 *
171
+	 * @return EE_State
172
+	 */
173
+	public function state_obj()
174
+	{
175
+		return $this->get_first_related('State');
176
+	}
177
+
178
+
179
+	/**
180
+	 * either displays the state abbreviation or the state name, as determined
181
+	 * by the "FHEE__EEI_Address__state__use_abbreviation" filter.
182
+	 * defaults to abbreviation
183
+	 *
184
+	 * @return string
185
+	 */
186
+	public function state()
187
+	{
188
+		if (apply_filters('FHEE__EEI_Address__state__use_abbreviation', true, $this->state_obj())) {
189
+			return $this->state_abbrev();
190
+		} else {
191
+			return $this->state_name();
192
+		}
193
+	}
194
+
195
+
196
+	/**
197
+	 * country_ID
198
+	 *
199
+	 * @return string
200
+	 */
201
+	public function country_ID()
202
+	{
203
+		return $this->get('CNT_ISO');
204
+	}
205
+
206
+
207
+	/**
208
+	 * @return string
209
+	 */
210
+	public function country_name()
211
+	{
212
+		return $this->country_obj() instanceof EE_Country ? $this->country_obj()->name() : '';
213
+	}
214
+
215
+
216
+	/**
217
+	 * Gets the country of this venue
218
+	 *
219
+	 * @return EE_Country
220
+	 */
221
+	public function country_obj()
222
+	{
223
+		return $this->get_first_related('Country');
224
+	}
225
+
226
+
227
+	/**
228
+	 * either displays the country ISO2 code or the country name, as determined
229
+	 * by the "FHEE__EEI_Address__country__use_abbreviation" filter.
230
+	 * defaults to abbreviation
231
+	 *
232
+	 * @return string
233
+	 */
234
+	public function country()
235
+	{
236
+		if (apply_filters('FHEE__EEI_Address__country__use_abbreviation', true, $this->country_obj())) {
237
+			return $this->country_ID();
238
+		} else {
239
+			return $this->country_name();
240
+		}
241
+	}
242
+
243
+
244
+	/**
245
+	 * Gets zip
246
+	 *
247
+	 * @return string
248
+	 */
249
+	public function zip()
250
+	{
251
+		return $this->get('VNU_zip');
252
+	}
253
+
254
+
255
+	/**
256
+	 * Gets capacity
257
+	 *
258
+	 * @return int
259
+	 */
260
+	public function capacity()
261
+	{
262
+		return $this->get_pretty('VNU_capacity', 'symbol');
263
+	}
264
+
265
+
266
+	/**
267
+	 * Gets created
268
+	 *
269
+	 * @return string
270
+	 */
271
+	public function created()
272
+	{
273
+		return $this->get('VNU_created');
274
+	}
275
+
276
+
277
+	/**
278
+	 * Gets modified
279
+	 *
280
+	 * @return string
281
+	 */
282
+	public function modified()
283
+	{
284
+		return $this->get('VNU_modified');
285
+	}
286
+
287
+
288
+	/**
289
+	 * Gets order
290
+	 *
291
+	 * @return int
292
+	 */
293
+	public function order()
294
+	{
295
+		return $this->get('VNU_order');
296
+	}
297
+
298
+
299
+	/**
300
+	 * Gets wp_user
301
+	 *
302
+	 * @return int
303
+	 */
304
+	public function wp_user()
305
+	{
306
+		return $this->get('VNU_wp_user');
307
+	}
308
+
309
+
310
+	/**
311
+	 * @return string
312
+	 */
313
+	public function virtual_phone()
314
+	{
315
+		return $this->get('VNU_virtual_phone');
316
+	}
317
+
318
+
319
+	/**
320
+	 * @return string
321
+	 */
322
+	public function virtual_url()
323
+	{
324
+		return $this->get('VNU_virtual_url');
325
+	}
326
+
327
+
328
+	/**
329
+	 * @return bool
330
+	 */
331
+	public function enable_for_gmap()
332
+	{
333
+		return $this->get('VNU_enable_for_gmap');
334
+	}
335
+
336
+
337
+	/**
338
+	 * @return string
339
+	 */
340
+	public function google_map_link()
341
+	{
342
+		return $this->get('VNU_google_map_link');
343
+	}
344
+
345
+
346
+	/**
347
+	 * Gets all events happening at this venue. Query parameters can be added to
348
+	 * fetch a subset of those events.
349
+	 *
350
+	 * @param array $query_params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
351
+	 * @param bool  $upcoming
352
+	 * @return EE_Event[]
353
+	 */
354
+	public function events($query_params = array(), $upcoming = false)
355
+	{
356
+		if ($upcoming) {
357
+			$query_params = array(
358
+				array(
359
+					'status'                 => 'publish',
360
+					'Datetime.DTT_EVT_start' => array(
361
+						'>',
362
+						EEM_Datetime::instance()->current_time_for_query('DTT_EVT_start'),
363
+					),
364
+				),
365
+			);
366
+		}
367
+		return $this->get_many_related('Event', $query_params);
368
+	}
369
+
370
+
371
+	/**
372
+	 * Sets address
373
+	 */
374
+	public function set_address($address = '')
375
+	{
376
+		$this->set('VNU_address', $address);
377
+	}
378
+
379
+
380
+	/**
381
+	 * @param string $address2
382
+	 */
383
+	public function set_address2($address2 = '')
384
+	{
385
+		$this->set('VNU_address2', $address2);
386
+	}
387
+
388
+
389
+	/**
390
+	 * @param string $city
391
+	 */
392
+	public function set_city($city = '')
393
+	{
394
+		$this->set('VNU_city', $city);
395
+	}
396
+
397
+
398
+	/**
399
+	 * @param int $state
400
+	 */
401
+	public function set_state_ID($state = 0)
402
+	{
403
+		$this->set('STA_ID', $state);
404
+	}
405
+
406
+
407
+	/**
408
+	 * Sets the state, given either a state id or state object
409
+	 *
410
+	 * @param EE_State /int $state_id_or_obj
411
+	 * @return EE_State
412
+	 */
413
+	public function set_state_obj($state_id_or_obj)
414
+	{
415
+		return $this->_add_relation_to($state_id_or_obj, 'State');
416
+	}
417
+
418
+
419
+	/**
420
+	 * @param int $country_ID
421
+	 */
422
+	public function set_country_ID($country_ID = 0)
423
+	{
424
+		$this->set('CNT_ISO', $country_ID);
425
+	}
426
+
427
+
428
+	/**
429
+	 * Sets the country on the venue
430
+	 *
431
+	 * @param EE_Country /string $country_id_or_obj
432
+	 * @return EE_Country
433
+	 */
434
+	public function set_country_obj($country_id_or_obj)
435
+	{
436
+		return $this->_add_relation_to($country_id_or_obj, 'Country');
437
+	}
438
+
439
+
440
+	/**
441
+	 * @param string $zip
442
+	 */
443
+	public function set_zip($zip = '')
444
+	{
445
+		$this->set('VNU_zip', $zip);
446
+	}
447
+
448
+
449
+	/**
450
+	 * @param int $capacity
451
+	 */
452
+	public function set_capacity($capacity = 0)
453
+	{
454
+		$this->set('VNU_capacity', $capacity);
455
+	}
456
+
457
+
458
+	/**
459
+	 * @param string $created
460
+	 */
461
+	public function set_created($created = '')
462
+	{
463
+		$this->set('VNU_created', $created);
464
+	}
465
+
466
+
467
+	/**
468
+	 * @param string $desc
469
+	 */
470
+	public function set_description($desc = '')
471
+	{
472
+		$this->set('VNU_desc', $desc);
473
+	}
474
+
475
+
476
+	/**
477
+	 * @param string $identifier
478
+	 */
479
+	public function set_identifier($identifier = '')
480
+	{
481
+		$this->set('VNU_identifier', $identifier);
482
+	}
483
+
484
+
485
+	/**
486
+	 * @param string $modified
487
+	 */
488
+	public function set_modified($modified = '')
489
+	{
490
+		$this->set('VNU_modified', $modified);
491
+	}
492
+
493
+
494
+	/**
495
+	 * @param string $name
496
+	 */
497
+	public function set_name($name = '')
498
+	{
499
+		$this->set('VNU_name', $name);
500
+	}
501
+
502
+
503
+	/**
504
+	 * @param int $order
505
+	 */
506
+	public function set_order($order = 0)
507
+	{
508
+		$this->set('VNU_order', $order);
509
+	}
510
+
511
+
512
+	/**
513
+	 * @param string $phone
514
+	 */
515
+	public function set_phone($phone = '')
516
+	{
517
+		$this->set('VNU_phone', $phone);
518
+	}
519
+
520
+
521
+	/**
522
+	 * @param int $wp_user
523
+	 */
524
+	public function set_wp_user($wp_user = 1)
525
+	{
526
+		$this->set('VNU_wp_user', $wp_user);
527
+	}
528
+
529
+
530
+	/**
531
+	 * @param string $url
532
+	 */
533
+	public function set_venue_url($url = '')
534
+	{
535
+		$this->set('VNU_url', $url);
536
+	}
537
+
538
+
539
+	/**
540
+	 * @param string $phone
541
+	 */
542
+	public function set_virtual_phone($phone = '')
543
+	{
544
+		$this->set('VNU_virtual_phone', $phone);
545
+	}
546
+
547
+
548
+	/**
549
+	 * @param string $url
550
+	 */
551
+	public function set_virtual_url($url = '')
552
+	{
553
+		$this->set('VNU_virtual_url', $url);
554
+	}
555
+
556
+
557
+	/**
558
+	 * @param string $enable
559
+	 */
560
+	public function set_enable_for_gmap($enable = '')
561
+	{
562
+		$this->set('VNU_enable_for_gmap', $enable);
563
+	}
564
+
565
+
566
+	/**
567
+	 * @param string $google_map_link
568
+	 */
569
+	public function set_google_map_link($google_map_link = '')
570
+	{
571
+		$this->set('VNU_google_map_link', $google_map_link);
572
+	}
573 573
 }
Please login to merge, or discard this patch.
modules/single_page_checkout/inc/EE_Checkout.class.php 3 patches
Doc Comments   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -319,7 +319,7 @@  discard block
 block discarded – undo
319 319
 
320 320
     /**
321 321
      * @param $REG_ID
322
-     * @param $reg_status
322
+     * @param boolean $reg_status
323 323
      */
324 324
     public function set_reg_status_updated($REG_ID, $reg_status)
325 325
     {
@@ -1237,6 +1237,7 @@  discard block
 block discarded – undo
1237 1237
      *
1238 1238
      * @param    string | int    $reg_cache_ID
1239 1239
      * @param    EE_Registration $registration
1240
+     * @param integer $reg_cache_ID
1240 1241
      * @return void
1241 1242
      * @throws \EE_Error
1242 1243
      */
Please login to merge, or discard this patch.
Indentation   +1425 added lines, -1425 removed lines patch added patch discarded remove patch
@@ -15,1429 +15,1429 @@
 block discarded – undo
15 15
 class EE_Checkout
16 16
 {
17 17
 
18
-    /**
19
-     *    whether current request originated from the EE admin
20
-     *
21
-     * @type bool
22
-     */
23
-    public $admin_request = false;
24
-
25
-    /**
26
-     * whether returning to edit attendee information or to retry a payment
27
-     *
28
-     * @type bool
29
-     */
30
-    public $revisit = false;
31
-
32
-    /**
33
-     * whether the primary registrant is returning to edit attendee information or to retry a payment
34
-     *
35
-     * @type bool
36
-     */
37
-    public $primary_revisit = false;
38
-
39
-    /**
40
-     * is registration allowed to progress or halted for some reason such as failing to pass recaptcha?
41
-     *
42
-     * @type bool
43
-     */
44
-    public $continue_reg = true;
45
-
46
-    /**
47
-     * redirect to thank you page ?
48
-     *
49
-     * @type bool
50
-     */
51
-    public $redirect = false;
52
-
53
-    /**
54
-     * generate the reg form or not ?
55
-     *
56
-     * @type bool
57
-     */
58
-    public $generate_reg_form = true;
59
-
60
-    /**
61
-     * process a reg form submission or not ?
62
-     *
63
-     * @type bool
64
-     */
65
-    public $process_form_submission = false;
66
-
67
-    /**
68
-     * tracks whether the TXN status modified during this checkout
69
-     *
70
-     * @type bool
71
-     */
72
-    public $txn_status_updated = false;
73
-
74
-    /**
75
-     * only triggered to true after absolutely everything has finished.
76
-     *
77
-     * @type bool
78
-     */
79
-    protected $exit_spco = false;
80
-
81
-    /**
82
-     * tracks whether any of the TXN's Registrations statuses modified during this checkout
83
-     * indexed by registration ID
84
-     *
85
-     * @type array
86
-     */
87
-    protected $reg_status_updated = array();
88
-
89
-    /**
90
-     * timestamp when redirected from Ticket Selector to the checkout
91
-     *
92
-     * @type int
93
-     */
94
-    public $uts = 0;
95
-
96
-    /**
97
-     * total number of tickets that were in the cart
98
-     *
99
-     * @type int
100
-     */
101
-    public $total_ticket_count = 0;
102
-
103
-    /**
104
-     * corresponds loosely to EE_Transaction::remaining()
105
-     * but can be modified by SPCO
106
-     *
107
-     * @type float
108
-     */
109
-    public $amount_owing = 0;
110
-
111
-    /**
112
-     * the reg step slug from the incoming request
113
-     *
114
-     * @type string
115
-     */
116
-    public $step = '';
117
-
118
-    /**
119
-     * the reg step slug for a step being edited
120
-     *
121
-     * @type string
122
-     */
123
-    public $edit_step = '';
124
-
125
-    /**
126
-     * the action being performed on the current step
127
-     *
128
-     * @type string
129
-     */
130
-    public $action = '';
131
-
132
-    /**
133
-     * reg_url_link for a previously saved registration
134
-     *
135
-     * @type string
136
-     */
137
-    public $reg_url_link = '';
138
-
139
-    /**
140
-     * string slug for the payment method that was selected during the payment options step
141
-     *
142
-     * @type string
143
-     */
144
-    public $selected_method_of_payment = '';
145
-
146
-    /**
147
-     * base url for the site's registration checkout page - additional url params will be added to this
148
-     *
149
-     * @type string
150
-     */
151
-    public $reg_page_base_url = '';
152
-
153
-    /**
154
-     * base url for the site's registration cancelled page - additional url params will be added to this
155
-     *
156
-     * @type string
157
-     */
158
-    public $cancel_page_url = '';
159
-
160
-    /**
161
-     * base url for the site's thank you page - additional url params will be added to this
162
-     *
163
-     * @type string
164
-     */
165
-    public $thank_you_page_url = '';
166
-
167
-    /**
168
-     * base url for any redirects - additional url params will be added to this
169
-     *
170
-     * @type string
171
-     */
172
-    public $redirect_url = '';
173
-
174
-    /**
175
-     * form of POST data for use with off-site gateways
176
-     *
177
-     * @type string
178
-     */
179
-    public $redirect_form = '';
180
-
181
-    /**
182
-     * array of query where params to use when retrieving cached registrations from $this->checkout->transaction
183
-     *
184
-     * @type array
185
-     */
186
-    public $reg_cache_where_params = array();
187
-
188
-    /**
189
-     * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX
190
-     * requests
191
-     *
192
-     * @type EE_SPCO_JSON_Response
193
-     */
194
-    public $json_response;
195
-
196
-    /**
197
-     * where we are going next in the reg process
198
-     *
199
-     * @type EE_SPCO_Reg_Step
200
-     */
201
-    public $next_step;
202
-
203
-    /**
204
-     * where we are in the reg process
205
-     *
206
-     * @type EE_SPCO_Reg_Step
207
-     */
208
-    public $current_step;
209
-
210
-    /**
211
-     *    $_cart - the current cart object
212
-     *
213
-     * @var EE_CART
214
-     */
215
-    public $cart;
216
-
217
-    /**
218
-     *    $_transaction - the current transaction object
219
-     *
220
-     * @var EE_Transaction
221
-     */
222
-    public $transaction;
223
-
224
-    /**
225
-     *    the related attendee object for the primary registrant
226
-     *
227
-     * @type EE_Attendee
228
-     */
229
-    public $primary_attendee_obj;
230
-
231
-    /**
232
-     *    $payment_method - the payment method object for the selected method of payment
233
-     *
234
-     * @type EE_Payment_Method
235
-     */
236
-    public $payment_method;
237
-
238
-    /**
239
-     *    $payment - if a payment was successfully made during the reg process,
240
-     *    then here it is !!!
241
-     *
242
-     * @type EE_Payment
243
-     */
244
-    public $payment;
245
-
246
-    /**
247
-     *    if a payment method was selected that uses an on-site gateway, then this is the billing form
248
-     *
249
-     * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form
250
-     */
251
-    public $billing_form;
252
-
253
-    /**
254
-     *    the entire registration form composed of ALL of the subsections generated by the various reg steps
255
-     *
256
-     * @type EE_Form_Section_Proper
257
-     */
258
-    public $registration_form;
259
-
260
-    /**
261
-     * array of EE_SPCO_Reg_Step objects
262
-     *
263
-     * @type EE_SPCO_Reg_Step[]
264
-     */
265
-    public $reg_steps = array();
266
-
267
-    /**
268
-     * array of EE_Payment_Method objects
269
-     *
270
-     * @type EE_Payment_Method[]
271
-     */
272
-    public $available_payment_methods = array();
273
-
274
-
275
-    /**
276
-     *    class constructor
277
-     *
278
-     * @access    public
279
-     */
280
-    public function __construct()
281
-    {
282
-        $this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url();
283
-        $this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url();
284
-        $this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url();
285
-        $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
286
-        $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax;
287
-        $this->reg_cache_where_params = array(
288
-            0          => array('REG_deleted' => false),
289
-            'order_by' => array('REG_count' => 'ASC'),
290
-        );
291
-    }
292
-
293
-
294
-    /**
295
-     * returns true if ANY reg status was updated during checkout
296
-     *
297
-     * @return boolean
298
-     */
299
-    public function any_reg_status_updated()
300
-    {
301
-        foreach ($this->reg_status_updated as $reg_status) {
302
-            if ($reg_status) {
303
-                return true;
304
-            }
305
-        }
306
-        return false;
307
-    }
308
-
309
-
310
-    /**
311
-     * @param $REG_ID
312
-     * @return boolean
313
-     */
314
-    public function reg_status_updated($REG_ID)
315
-    {
316
-        return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
317
-    }
318
-
319
-
320
-    /**
321
-     * @param $REG_ID
322
-     * @param $reg_status
323
-     */
324
-    public function set_reg_status_updated($REG_ID, $reg_status)
325
-    {
326
-        $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327
-    }
328
-
329
-
330
-    /**
331
-     * exit_spco
332
-     *
333
-     * @return bool
334
-     */
335
-    public function exit_spco()
336
-    {
337
-        return $this->exit_spco;
338
-    }
339
-
340
-
341
-    /**
342
-     * set_exit_spco
343
-     * can ONLY be set by the  Finalize_Registration reg step
344
-     */
345
-    public function set_exit_spco()
346
-    {
347
-        if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
348
-            $this->exit_spco = true;
349
-        }
350
-    }
351
-
352
-
353
-    /**
354
-     *    reset_for_current_request
355
-     *
356
-     * @access    public
357
-     * @return    void
358
-     */
359
-    public function reset_for_current_request()
360
-    {
361
-        $this->process_form_submission = false;
362
-        $this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
363
-        $this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax;
364
-        $this->continue_reg = true;
365
-        $this->redirect = false;
366
-        // don't reset the cached redirect form if we're about to be asked to display it !!!
367
-        if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') {
368
-            $this->redirect_form = '';
369
-        }
370
-        $this->redirect_url = '';
371
-        $this->json_response = new EE_SPCO_JSON_Response();
372
-        EE_Form_Section_Proper::reset_js_localization();
373
-    }
374
-
375
-
376
-    /**
377
-     *    add_reg_step
378
-     *
379
-     * @access    public
380
-     * @param EE_SPCO_Reg_Step $reg_step_obj
381
-     * @return    void
382
-     */
383
-    public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384
-    {
385
-        $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
386
-    }
387
-
388
-
389
-    /**
390
-     * skip_reg_step
391
-     * if the current reg step does not need to run for some reason,
392
-     * then this will advance SPCO to the next reg step,
393
-     * and mark the skipped step as completed
394
-     *
395
-     * @access    public
396
-     * @param string $reg_step_slug
397
-     * @return    void
398
-     * @throws \EE_Error
399
-     */
400
-    public function skip_reg_step($reg_step_slug = '')
401
-    {
402
-        $step_to_skip = $this->find_reg_step($reg_step_slug);
403
-        if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) {
404
-            $step_to_skip->set_is_current_step(false);
405
-            $step_to_skip->set_completed();
406
-            // advance to the next step
407
-            $this->set_current_step($this->next_step->slug());
408
-            // also reset the step param in the request in case any other code references that directly
409
-            EE_Registry::instance()->REQ->set('step', $this->current_step->slug());
410
-            // since we are skipping a step and setting the current step to be what was previously the next step,
411
-            // we need to check that the next step is now correct, and not still set to the current step.
412
-            if ($this->current_step->slug() === $this->next_step->slug()) {
413
-                // correctly setup the next step
414
-                $this->set_next_step();
415
-            }
416
-            $this->set_reg_step_initiated($this->current_step);
417
-        }
418
-    }
419
-
420
-
421
-    /**
422
-     *    remove_reg_step
423
-     *
424
-     * @access    public
425
-     * @param string $reg_step_slug
426
-     * @param bool   $reset whether to reset reg steps after removal
427
-     * @throws EE_Error
428
-     */
429
-    public function remove_reg_step($reg_step_slug = '', $reset = true)
430
-    {
431
-        unset($this->reg_steps[ $reg_step_slug ]);
432
-        if ($this->transaction instanceof EE_Transaction) {
433
-            // now remove reg step from TXN and save
434
-            $this->transaction->remove_reg_step($reg_step_slug);
435
-            $this->transaction->save();
436
-        }
437
-        if ($reset) {
438
-            $this->reset_reg_steps();
439
-        }
440
-    }
441
-
442
-
443
-    /**
444
-     *    set_reg_step_order
445
-     *
446
-     * @access    public
447
-     * @param string $reg_step_slug
448
-     * @param int    $order
449
-     * @return    void
450
-     */
451
-    public function set_reg_step_order($reg_step_slug = '', $order = 100)
452
-    {
453
-        if (isset($this->reg_steps[ $reg_step_slug ])) {
454
-            $this->reg_steps[ $reg_step_slug ]->set_order($order);
455
-        }
456
-    }
457
-
458
-
459
-    /**
460
-     *    set_current_step
461
-     *
462
-     * @access    public
463
-     * @param string $current_step
464
-     * @return    void
465
-     */
466
-    public function set_current_step($current_step)
467
-    {
468
-        // grab what step we're on
469
-        $this->current_step = isset($this->reg_steps[ $current_step ])
470
-            ? $this->reg_steps[ $current_step ]
471
-            : reset(
472
-                $this->reg_steps
473
-            );
474
-        // verify instance
475
-        if ($this->current_step instanceof EE_SPCO_Reg_Step) {
476
-            // we don't want to repeat completed steps if this is the first time through SPCO
477
-            if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) {
478
-                // so advance to the next step
479
-                $this->set_next_step();
480
-                if ($this->next_step instanceof EE_SPCO_Reg_Step) {
481
-                    // and attempt to set it as the current step
482
-                    $this->set_current_step($this->next_step->slug());
483
-                }
484
-                return;
485
-            }
486
-            $this->current_step->set_is_current_step(true);
487
-        } else {
488
-            EE_Error::add_error(
489
-                __('The current step could not be set.', 'event_espresso'),
490
-                __FILE__,
491
-                __FUNCTION__,
492
-                __LINE__
493
-            );
494
-        }
495
-    }
496
-
497
-
498
-    /**
499
-     *    set_next_step
500
-     * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
501
-     *
502
-     * @access    public
503
-     * @return    void
504
-     */
505
-    public function set_next_step()
506
-    {
507
-        // set pointer to start of array
508
-        reset($this->reg_steps);
509
-        // if there is more than one step
510
-        if (count($this->reg_steps) > 1) {
511
-            // advance to the current step and set pointer
512
-            while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') {
513
-                next($this->reg_steps);
514
-            }
515
-        }
516
-        // advance one more spot ( if it exists )
517
-        $this->next_step = next($this->reg_steps);
518
-        // verify instance
519
-        $this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null;
520
-        // then back to current step to reset
521
-        prev($this->reg_steps);
522
-    }
523
-
524
-
525
-    /**
526
-     *    get_next_reg_step
527
-     *    this simply returns the next step from reg_steps array
528
-     *
529
-     * @access    public
530
-     * @return    EE_SPCO_Reg_Step | null
531
-     */
532
-    public function get_next_reg_step()
533
-    {
534
-        $next = next($this->reg_steps);
535
-        prev($this->reg_steps);
536
-        return $next instanceof EE_SPCO_Reg_Step ? $next : null;
537
-    }
538
-
539
-
540
-    /**
541
-     * get_prev_reg_step
542
-     *    this simply returns the previous step from reg_steps array
543
-     *
544
-     * @access    public
545
-     * @return    EE_SPCO_Reg_Step | null
546
-     */
547
-    public function get_prev_reg_step()
548
-    {
549
-        $prev = prev($this->reg_steps);
550
-        next($this->reg_steps);
551
-        return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
552
-    }
553
-
554
-
555
-    /**
556
-     * sort_reg_steps
557
-     *
558
-     * @access public
559
-     * @return void
560
-     */
561
-    public function sort_reg_steps()
562
-    {
563
-        $reg_step_sorting_callback = apply_filters(
564
-            'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback',
565
-            'reg_step_sorting_callback'
566
-        );
567
-        uasort($this->reg_steps, array($this, $reg_step_sorting_callback));
568
-    }
569
-
570
-
571
-    /**
572
-     * find_reg_step
573
-     * finds a reg step by the given slug
574
-     *
575
-     * @access    public
576
-     * @param string $reg_step_slug
577
-     * @return EE_SPCO_Reg_Step|null
578
-     */
579
-    public function find_reg_step($reg_step_slug = '')
580
-    {
581
-        if (! empty($reg_step_slug)) {
582
-            // copy reg step array
583
-            $reg_steps = $this->reg_steps;
584
-            // set pointer to start of array
585
-            reset($reg_steps);
586
-            // if there is more than one step
587
-            if (count($reg_steps) > 1) {
588
-                // advance to the current step and set pointer
589
-                while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') {
590
-                    next($reg_steps);
591
-                }
592
-                return current($reg_steps);
593
-            }
594
-        }
595
-        return null;
596
-    }
597
-
598
-
599
-    /**
600
-     * reg_step_sorting_callback
601
-     *
602
-     * @access public
603
-     * @param EE_SPCO_Reg_Step $reg_step_A
604
-     * @param EE_SPCO_Reg_Step $reg_step_B
605
-     * @return int
606
-     */
607
-    public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B)
608
-    {
609
-        // send finalize_registration step to the end of the array
610
-        if ($reg_step_A->slug() === 'finalize_registration') {
611
-            return 1;
612
-        } elseif ($reg_step_B->slug() === 'finalize_registration') {
613
-            return -1;
614
-        }
615
-        if ($reg_step_A->order() === $reg_step_B->order()) {
616
-            return 0;
617
-        }
618
-        return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1;
619
-    }
620
-
621
-
622
-    /**
623
-     * set_reg_step_initiated
624
-     *
625
-     * @access    public
626
-     * @param    EE_SPCO_Reg_Step $reg_step
627
-     * @throws \EE_Error
628
-     */
629
-    public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step)
630
-    {
631
-        // call set_reg_step_initiated ???
632
-        if (// first time visiting SPCO ?
633
-            ! $this->revisit
634
-            && (
635
-                // and displaying the reg step form for the first time ?
636
-                $this->action === 'display_spco_reg_step'
637
-                // or initializing the final step
638
-                || $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration
639
-            )
640
-        ) {
641
-            // set the start time for this reg step
642
-            if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643
-                if (WP_DEBUG) {
644
-                    EE_Error::add_error(
645
-                        sprintf(
646
-                            __('The "%1$s" registration step was not initialized properly.', 'event_espresso'),
647
-                            $reg_step->name()
648
-                        ),
649
-                        __FILE__,
650
-                        __FUNCTION__,
651
-                        __LINE__
652
-                    );
653
-                }
654
-            }
655
-        }
656
-    }
657
-
658
-
659
-    /**
660
-     *    set_reg_step_JSON_info
661
-     *
662
-     * @access public
663
-     * @return    void
664
-     */
665
-    public function set_reg_step_JSON_info()
666
-    {
667
-        EE_Registry::$i18n_js_strings['reg_steps'] = array();
668
-        // pass basic reg step data to JS
669
-        foreach ($this->reg_steps as $reg_step) {
670
-            EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug();
671
-        }
672
-        // reset reg step html
673
-        // $this->json_response->set_reg_step_html('');
674
-    }
675
-
676
-
677
-    /**
678
-     *    reset_reg_steps
679
-     *
680
-     * @access public
681
-     * @return void
682
-     */
683
-    public function reset_reg_steps()
684
-    {
685
-        $this->sort_reg_steps();
686
-        $this->set_current_step(EE_Registry::instance()->REQ->get('step'));
687
-        $this->set_next_step();
688
-        // the text that appears on the reg step form submit button
689
-        $this->current_step->set_submit_button_text();
690
-        $this->set_reg_step_JSON_info();
691
-    }
692
-
693
-
694
-    /**
695
-     *    get_registration_time_limit
696
-     *
697
-     * @access    public
698
-     * @return        string
699
-     */
700
-    public function get_registration_time_limit()
701
-    {
702
-
703
-        $registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time());
704
-        $time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
705
-        $registration_time_limit = date($time_limit_format, $registration_time_limit);
706
-        return apply_filters(
707
-            'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
708
-            $registration_time_limit
709
-        );
710
-    }
711
-
712
-
713
-    /**
714
-     * payment_required
715
-     *
716
-     * @return boolean
717
-     */
718
-    public function payment_required()
719
-    {
720
-        // if NOT:
721
-        //     registration via admin
722
-        //      completed TXN
723
-        //      overpaid TXN
724
-        //      free TXN(total = 0.00)
725
-        //      then payment required is TRUE
726
-        return ! ($this->admin_request
727
-                  || $this->transaction->is_completed()
728
-                  || $this->transaction->is_overpaid()
729
-                  || $this->transaction->is_free()) ? true : false;
730
-    }
731
-
732
-
733
-    /**
734
-     * get_cart_for_transaction
735
-     *
736
-     * @access public
737
-     * @param EE_Transaction $transaction
738
-     * @return EE_Cart
739
-     */
740
-    public function get_cart_for_transaction($transaction)
741
-    {
742
-        $session = EE_Registry::instance()->load_core('Session');
743
-        $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744
-        // verify cart
745
-        if (! $cart instanceof EE_Cart) {
746
-            $cart = EE_Registry::instance()->load_core('Cart');
747
-        }
748
-
749
-        return $cart;
750
-    }
751
-
752
-
753
-    /**
754
-     *    initialize_txn_reg_steps_array
755
-     *
756
-     * @access public
757
-     * @return    array
758
-     */
759
-    public function initialize_txn_reg_steps_array()
760
-    {
761
-        $txn_reg_steps_array = array();
762
-        foreach ($this->reg_steps as $reg_step) {
763
-            $txn_reg_steps_array[ $reg_step->slug() ] = false;
764
-        }
765
-        return $txn_reg_steps_array;
766
-    }
767
-
768
-
769
-    /**
770
-     *    update_txn_reg_steps_array
771
-     *
772
-     * @access public
773
-     * @return    bool
774
-     * @throws \EE_Error
775
-     */
776
-    public function update_txn_reg_steps_array()
777
-    {
778
-        $updated = false;
779
-        foreach ($this->reg_steps as $reg_step) {
780
-            if ($reg_step->completed()) {
781
-                $updated = $this->transaction->set_reg_step_completed($reg_step->slug())
782
-                    ? true
783
-                    : $updated;
784
-            }
785
-        }
786
-        if ($updated) {
787
-            $this->transaction->save();
788
-        }
789
-        return $updated;
790
-    }
791
-
792
-
793
-    /**
794
-     *    stash_transaction_and_checkout
795
-     *
796
-     * @access public
797
-     * @return    void
798
-     * @throws \EE_Error
799
-     */
800
-    public function stash_transaction_and_checkout()
801
-    {
802
-        if (! $this->revisit) {
803
-            $this->update_txn_reg_steps_array();
804
-        }
805
-        $this->track_transaction_and_registration_status_updates();
806
-        // save all data to the db, but suppress errors
807
-        // $this->save_all_data( FALSE );
808
-        // cache the checkout in the session
809
-        EE_Registry::instance()->SSN->set_checkout($this);
810
-    }
811
-
812
-
813
-    /**
814
-     *    track_transaction_and_registration_status_updates
815
-     *    stores whether any updates were made to the TXN or it's related registrations
816
-     *
817
-     * @access public
818
-     * @return void
819
-     * @throws \EE_Error
820
-     */
821
-    public function track_transaction_and_registration_status_updates()
822
-    {
823
-        // verify the transaction
824
-        if ($this->transaction instanceof EE_Transaction) {
825
-            // has there been a TXN status change during this checkout?
826
-            $this->txn_status_updated = $this->transaction->txn_status_updated();
827
-            /** @type EE_Registration_Processor $registration_processor */
828
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
829
-            // grab the saved registrations from the transaction
830
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
831
-                if ($registration_processor->reg_status_updated($registration->ID())) {
832
-                    $this->set_reg_status_updated($registration->ID(), true);
833
-                }
834
-            }
835
-        }
836
-    }
837
-
838
-
839
-    /**
840
-     *    visit_allows_processing_of_this_registration
841
-     *    determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
842
-     *    one of the following conditions must be met:
843
-     *        EITHER:    A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
844
-     *        OR :        B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
845
-     *        OR :        C) another registrant is editing info -> ONLY process their registration ( revisit AND their
846
-     *        reg_url_link matches )
847
-     *
848
-     * @access public
849
-     * @param    EE_Registration $registration
850
-     * @return    bool
851
-     * @throws \EE_Error
852
-     */
853
-    public function visit_allows_processing_of_this_registration(EE_Registration $registration)
854
-    {
855
-        return ! $this->revisit
856
-               || $this->primary_revisit
857
-               || (
858
-                   $this->revisit && $this->reg_url_link === $registration->reg_url_link()
859
-               )
860
-            ? true
861
-            : false;
862
-    }
863
-
864
-
865
-    /**
866
-     *    _transaction_has_primary_registration
867
-     *
868
-     * @access        private
869
-     * @return        bool
870
-     */
871
-    public function transaction_has_primary_registrant()
872
-    {
873
-        return $this->primary_attendee_obj instanceof EE_Attendee ? true : false;
874
-    }
875
-
876
-
877
-    /**
878
-     *    save_all_data
879
-     *    simply loops through the current transaction and saves all data for each registration
880
-     *
881
-     * @access public
882
-     * @param bool $show_errors
883
-     * @return bool
884
-     * @throws \EE_Error
885
-     */
886
-    public function save_all_data($show_errors = true)
887
-    {
888
-        // verify the transaction
889
-        if ($this->transaction instanceof EE_Transaction) {
890
-            // save to ensure that TXN has ID
891
-            $this->transaction->save();
892
-            // grab the saved registrations from the transaction
893
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
894
-                $this->_save_registration($registration, $show_errors);
895
-            }
896
-        } else {
897
-            if ($show_errors) {
898
-                EE_Error::add_error(
899
-                    __(
900
-                        'A valid Transaction was not found when attempting to save your registration information.',
901
-                        'event_espresso'
902
-                    ),
903
-                    __FILE__,
904
-                    __FUNCTION__,
905
-                    __LINE__
906
-                );
907
-            }
908
-            return false;
909
-        }
910
-        return true;
911
-    }
912
-
913
-
914
-    /**
915
-     * _save_registration_attendee
916
-     *
917
-     * @param    EE_Registration $registration
918
-     * @param bool               $show_errors
919
-     * @return void
920
-     * @throws \EE_Error
921
-     */
922
-    private function _save_registration($registration, $show_errors = true)
923
-    {
924
-        // verify object
925
-        if ($registration instanceof EE_Registration) {
926
-            // should this registration be processed during this visit ?
927
-            if ($this->visit_allows_processing_of_this_registration($registration)) {
928
-                // set TXN ID
929
-                if (! $registration->transaction_ID()) {
930
-                    $registration->set_transaction_id($this->transaction->ID());
931
-                }
932
-                // verify and save the attendee
933
-                $this->_save_registration_attendee($registration, $show_errors);
934
-                // save answers to reg form questions
935
-                $this->_save_registration_answers($registration, $show_errors);
936
-                // save changes
937
-                $registration->save();
938
-                // update txn cache
939
-                if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940
-                    if ($show_errors) {
941
-                        EE_Error::add_error(
942
-                            __(
943
-                                'The newly saved Registration object could not be cached on the Transaction.',
944
-                                'event_espresso'
945
-                            ),
946
-                            __FILE__,
947
-                            __FUNCTION__,
948
-                            __LINE__
949
-                        );
950
-                    }
951
-                }
952
-            }
953
-        } else {
954
-            if ($show_errors) {
955
-                EE_Error::add_error(
956
-                    __(
957
-                        'An invalid Registration object was discovered when attempting to save your registration information.',
958
-                        'event_espresso'
959
-                    ),
960
-                    __FILE__,
961
-                    __FUNCTION__,
962
-                    __LINE__
963
-                );
964
-            }
965
-        }
966
-    }
967
-
968
-
969
-    /**
970
-     * _save_registration_attendee
971
-     *
972
-     * @param    EE_Registration $registration
973
-     * @param bool               $show_errors
974
-     * @return void
975
-     * @throws \EE_Error
976
-     */
977
-    private function _save_registration_attendee($registration, $show_errors = true)
978
-    {
979
-        if ($registration->attendee() instanceof EE_Attendee) {
980
-            // save so that ATT has ID
981
-            $registration->attendee()->save();
982
-            if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983
-                if ($show_errors) {
984
-                    EE_Error::add_error(
985
-                        __(
986
-                            'The newly saved Attendee object could not be cached on the registration.',
987
-                            'event_espresso'
988
-                        ),
989
-                        __FILE__,
990
-                        __FUNCTION__,
991
-                        __LINE__
992
-                    );
993
-                }
994
-            }
995
-        } else {
996
-            if ($show_errors) {
997
-                EE_Error::add_error(
998
-                    sprintf(
999
-                        '%1$s||%1$s $attendee = %2$s',
1000
-                        __(
1001
-                            'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.',
1002
-                            'event_espresso'
1003
-                        ),
1004
-                        var_export($registration->attendee(), true)
1005
-                    ),
1006
-                    __FILE__,
1007
-                    __FUNCTION__,
1008
-                    __LINE__
1009
-                );
1010
-            }
1011
-        }
1012
-    }
1013
-
1014
-
1015
-    /**
1016
-     * _save_question_answers
1017
-     *
1018
-     * @param    EE_Registration $registration
1019
-     * @param bool               $show_errors
1020
-     * @return void
1021
-     * @throws \EE_Error
1022
-     */
1023
-    private function _save_registration_answers($registration, $show_errors = true)
1024
-    {
1025
-        // now save the answers
1026
-        foreach ($registration->answers() as $cache_key => $answer) {
1027
-            // verify object
1028
-            if ($answer instanceof EE_Answer) {
1029
-                $answer->set_registration($registration->ID());
1030
-                $answer->save();
1031
-                if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032
-                    if ($show_errors) {
1033
-                        EE_Error::add_error(
1034
-                            __(
1035
-                                'The newly saved Answer object could not be cached on the registration.',
1036
-                                'event_espresso'
1037
-                            ),
1038
-                            __FILE__,
1039
-                            __FUNCTION__,
1040
-                            __LINE__
1041
-                        );
1042
-                    }
1043
-                }
1044
-            } else {
1045
-                if ($show_errors) {
1046
-                    EE_Error::add_error(
1047
-                        __(
1048
-                            'An invalid Answer object was discovered when attempting to save your registration information.',
1049
-                            'event_espresso'
1050
-                        ),
1051
-                        __FILE__,
1052
-                        __FUNCTION__,
1053
-                        __LINE__
1054
-                    );
1055
-                }
1056
-            }
1057
-        }
1058
-    }
1059
-
1060
-
1061
-    /**
1062
-     *    refresh_all_entities
1063
-     *   will either refresh the entity map with objects form the db or from the checkout cache
1064
-     *
1065
-     * @access public
1066
-     * @param bool $from_db
1067
-     * @return bool
1068
-     * @throws \EE_Error
1069
-     */
1070
-    public function refresh_all_entities($from_db = false)
1071
-    {
1072
-        $from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response'
1073
-            ? true
1074
-            : $from_db;
1075
-        // $this->log(
1076
-        //     __CLASS__,
1077
-        //     __FUNCTION__,
1078
-        //     __LINE__,
1079
-        //     array('from_db' => $from_db)
1080
-        // );
1081
-        return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     *  refresh_entity_map
1087
-     *  simply loops through the current transaction and updates each
1088
-     *  model's entity map using EEM_Base::refresh_entity_map_from_db()
1089
-     *
1090
-     * @access public
1091
-     * @return bool
1092
-     * @throws \EE_Error
1093
-     */
1094
-    protected function refresh_from_db()
1095
-    {
1096
-        // verify the transaction
1097
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1098
-            // pull fresh TXN data from the db
1099
-            $this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID());
1100
-            // update EE_Checkout's cached primary_attendee object
1101
-            $this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction);
1102
-            // update EE_Checkout's cached payment object
1103
-            $payment = $this->transaction->last_payment();
1104
-            $this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
1105
-            // update EE_Checkout's cached payment_method object
1106
-            $payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
1107
-            $this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method
1108
-                : $this->payment_method;
1109
-            // now refresh the cart, based on the TXN
1110
-            $this->cart = $this->get_cart_for_transaction($this->transaction);
1111
-        } else {
1112
-            EE_Error::add_error(
1113
-                __(
1114
-                    'A valid Transaction was not found when attempting to update the model entity mapper.',
1115
-                    'event_espresso'
1116
-                ),
1117
-                __FILE__,
1118
-                __FUNCTION__,
1119
-                __LINE__
1120
-            );
1121
-            return false;
1122
-        }
1123
-        return true;
1124
-    }
1125
-
1126
-
1127
-    /**
1128
-     * _refresh_primary_attendee_obj_from_db
1129
-     *
1130
-     * @param   EE_Transaction $transaction
1131
-     * @return  EE_Attendee | null
1132
-     * @throws \EE_Error
1133
-     */
1134
-    protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction)
1135
-    {
1136
-
1137
-        $primary_attendee_obj = null;
1138
-        // grab the saved registrations from the transaction
1139
-        foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) {
1140
-            // verify object
1141
-            if ($registration instanceof EE_Registration) {
1142
-                $attendee = $registration->attendee();
1143
-                // verify object && maybe cache primary_attendee_obj ?
1144
-                if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) {
1145
-                    $primary_attendee_obj = $attendee;
1146
-                }
1147
-            } else {
1148
-                EE_Error::add_error(
1149
-                    __(
1150
-                        'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1151
-                        'event_espresso'
1152
-                    ),
1153
-                    __FILE__,
1154
-                    __FUNCTION__,
1155
-                    __LINE__
1156
-                );
1157
-            }
1158
-        }
1159
-        return $primary_attendee_obj;
1160
-    }
1161
-
1162
-
1163
-    /**
1164
-     *  refresh_entity_map
1165
-     *  simply loops through the current transaction and updates
1166
-     *  each model's entity map using EEM_Base::refresh_entity_map_with()
1167
-     *
1168
-     * @access public
1169
-     * @return bool
1170
-     * @throws \EE_Error
1171
-     */
1172
-    protected function refresh_entity_map()
1173
-    {
1174
-        // verify the transaction
1175
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1176
-            // never cache payment info
1177
-            $this->transaction->clear_cache('Payment');
1178
-            // is the Payment Options Reg Step completed ?
1179
-            if ($this->transaction->reg_step_completed('payment_options')) {
1180
-                // then check for payments and update TXN accordingly
1181
-                /** @type EE_Transaction_Payments $transaction_payments */
1182
-                $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
1183
-                $transaction_payments->calculate_total_payments_and_update_status($this->transaction);
1184
-            }
1185
-            // grab the saved registrations from the transaction
1186
-            foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) {
1187
-                $this->_refresh_registration($reg_cache_ID, $registration);
1188
-            }
1189
-            // make sure our cached TXN is added to the model entity mapper
1190
-            $this->transaction = $this->transaction->get_model()->refresh_entity_map_with(
1191
-                $this->transaction->ID(),
1192
-                $this->transaction
1193
-            );
1194
-        } else {
1195
-            EE_Error::add_error(
1196
-                __(
1197
-                    'A valid Transaction was not found when attempting to update the model entity mapper.',
1198
-                    'event_espresso'
1199
-                ),
1200
-                __FILE__,
1201
-                __FUNCTION__,
1202
-                __LINE__
1203
-            );
1204
-            return false;
1205
-        }
1206
-        // verify and update the cart because inaccurate totals are not so much fun
1207
-        if ($this->cart instanceof EE_Cart) {
1208
-            $grand_total = $this->cart->get_grand_total();
1209
-            if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) {
1210
-                $grand_total->recalculate_total_including_taxes();
1211
-                $grand_total = $grand_total->get_model()->refresh_entity_map_with(
1212
-                    $this->cart->get_grand_total()->ID(),
1213
-                    $this->cart->get_grand_total()
1214
-                );
1215
-            }
1216
-            if ($grand_total instanceof EE_Line_Item) {
1217
-                $this->cart = EE_Cart::instance($grand_total);
1218
-            } else {
1219
-                EE_Error::add_error(
1220
-                    __(
1221
-                        'A valid Cart was not found when attempting to update the model entity mapper.',
1222
-                        'event_espresso'
1223
-                    ),
1224
-                    __FILE__,
1225
-                    __FUNCTION__,
1226
-                    __LINE__
1227
-                );
1228
-                return false;
1229
-            }
1230
-        }
1231
-        return true;
1232
-    }
1233
-
1234
-
1235
-    /**
1236
-     * _refresh_registration
1237
-     *
1238
-     * @param    string | int    $reg_cache_ID
1239
-     * @param    EE_Registration $registration
1240
-     * @return void
1241
-     * @throws \EE_Error
1242
-     */
1243
-    protected function _refresh_registration($reg_cache_ID, $registration)
1244
-    {
1245
-
1246
-        // verify object
1247
-        if ($registration instanceof EE_Registration) {
1248
-            // update the entity mapper attendee
1249
-            $this->_refresh_registration_attendee($registration);
1250
-            // update the entity mapper answers for reg form questions
1251
-            $this->_refresh_registration_answers($registration);
1252
-            // make sure the cached registration is added to the model entity mapper
1253
-            $registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration);
1254
-        } else {
1255
-            EE_Error::add_error(
1256
-                __(
1257
-                    'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1258
-                    'event_espresso'
1259
-                ),
1260
-                __FILE__,
1261
-                __FUNCTION__,
1262
-                __LINE__
1263
-            );
1264
-        }
1265
-    }
1266
-
1267
-
1268
-    /**
1269
-     * _save_registration_attendee
1270
-     *
1271
-     * @param    EE_Registration $registration
1272
-     * @return void
1273
-     * @throws \EE_Error
1274
-     */
1275
-    protected function _refresh_registration_attendee($registration)
1276
-    {
1277
-
1278
-        $attendee = $registration->attendee();
1279
-        // verify object
1280
-        if ($attendee instanceof EE_Attendee && $attendee->ID()) {
1281
-            // make sure the cached attendee is added to the model entity mapper
1282
-            $registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee);
1283
-            // maybe cache primary_attendee_obj ?
1284
-            if ($registration->is_primary_registrant()) {
1285
-                $this->primary_attendee_obj = $attendee;
1286
-            }
1287
-        }
1288
-    }
1289
-
1290
-
1291
-    /**
1292
-     * _refresh_registration_answers
1293
-     *
1294
-     * @param    EE_Registration $registration
1295
-     * @return void
1296
-     * @throws \EE_Error
1297
-     */
1298
-    protected function _refresh_registration_answers($registration)
1299
-    {
1300
-
1301
-        // now update the answers
1302
-        foreach ($registration->answers() as $cache_key => $answer) {
1303
-            // verify object
1304
-            if ($answer instanceof EE_Answer) {
1305
-                if ($answer->ID()) {
1306
-                    // make sure the cached answer is added to the model entity mapper
1307
-                    $answer->get_model()->refresh_entity_map_with($answer->ID(), $answer);
1308
-                }
1309
-            } else {
1310
-                EE_Error::add_error(
1311
-                    __(
1312
-                        'An invalid Answer object was discovered when attempting to update the model entity mapper.',
1313
-                        'event_espresso'
1314
-                    ),
1315
-                    __FILE__,
1316
-                    __FUNCTION__,
1317
-                    __LINE__
1318
-                );
1319
-            }
1320
-        }
1321
-    }
1322
-
1323
-
1324
-    /**
1325
-     *    __sleep
1326
-     * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
1327
-     * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
1328
-     * reg form, because if needed, it will be regenerated anyways
1329
-     *
1330
-     * @return array
1331
-     * @throws \EE_Error
1332
-     */
1333
-    public function __sleep()
1334
-    {
1335
-        if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) {
1336
-            $this->primary_attendee_obj = $this->primary_attendee_obj->ID();
1337
-        }        // remove the reg form and the checkout
1338
-        if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1339
-            $this->transaction = $this->transaction->ID();
1340
-        }        // remove the reg form and the checkout
1341
-        return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form'));
1342
-    }
1343
-
1344
-
1345
-    /**
1346
-     *    __wakeup
1347
-     * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1348
-     * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1349
-     */
1350
-    public function __wakeup()
1351
-    {
1352
-        if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353
-            // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354
-            $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355
-        }
1356
-        if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357
-            // $this->transaction is actually just an ID, so use it to get the object from the db
1358
-            $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359
-        }
1360
-        foreach ($this->reg_steps as $reg_step) {
1361
-            $reg_step->checkout = $this;
1362
-        }
1363
-    }
1364
-
1365
-
1366
-    /**
1367
-     * debug
1368
-     *
1369
-     * @param string $class
1370
-     * @param string $func
1371
-     * @param string $line
1372
-     * @param array  $info
1373
-     * @param bool   $display_request
1374
-     * @throws \EE_Error
1375
-     */
1376
-    public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false)
1377
-    {
1378
-        $disabled = true;
1379
-        if (WP_DEBUG && ! $disabled) {
1380
-            $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1381
-            $default_data = array(
1382
-                $class                    => $func . '() : ' . $line,
1383
-                'request->step'           => $this->step,
1384
-                'request->action'         => $this->action,
1385
-                'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
1386
-                    $this->current_step->slug() : '',
1387
-                'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1388
-                    $this->current_step->completed() : '',
1389
-                'txn_status_updated'      => $this->transaction->txn_status_updated(),
1390
-                'reg_status_updated'      => $this->reg_status_updated,
1391
-                'reg_url_link'            => $this->reg_url_link,
1392
-                'REQ'                     => $display_request ? $_REQUEST : '',
1393
-            );
1394
-            if ($this->transaction instanceof EE_Transaction) {
1395
-                $default_data['TXN_status'] = $this->transaction->status_ID();
1396
-                $default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397
-                foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
-                    $default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1399
-                }
1400
-                if ($this->transaction->ID()) {
1401
-                    $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1402
-                    // don't serialize objects
1403
-                    $info = $this->_strip_objects($info);
1404
-                    if (! isset($debug_data[ $TXN_ID ])) {
1405
-                        $debug_data[ $TXN_ID ] = array();
1406
-                    }
1407
-                    $debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1408
-                        $default_data,
1409
-                        $info
1410
-                    );
1411
-                    update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1412
-                }
1413
-            }
1414
-        }
1415
-    }
1416
-
1417
-
1418
-    /**
1419
-     * _strip_objects
1420
-     *
1421
-     * @param array $info
1422
-     * @return array
1423
-     */
1424
-    public function _strip_objects($info = array())
1425
-    {
1426
-        foreach ((array) $info as $key => $value) {
1427
-            if (is_array($value)) {
1428
-                $info[ $key ] = $this->_strip_objects($value);
1429
-            } elseif (is_object($value)) {
1430
-                $object_class = get_class($value);
1431
-                $info[ $object_class ] = array();
1432
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433
-                if (method_exists($value, 'status')) {
1434
-                    $info[ $object_class ]['status'] = $value->status();
1435
-                } elseif (method_exists($value, 'status_ID')) {
1436
-                    $info[ $object_class ]['status'] = $value->status_ID();
1437
-                }
1438
-                unset($info[ $key ]);
1439
-            }
1440
-        }
1441
-        return (array) $info;
1442
-    }
18
+	/**
19
+	 *    whether current request originated from the EE admin
20
+	 *
21
+	 * @type bool
22
+	 */
23
+	public $admin_request = false;
24
+
25
+	/**
26
+	 * whether returning to edit attendee information or to retry a payment
27
+	 *
28
+	 * @type bool
29
+	 */
30
+	public $revisit = false;
31
+
32
+	/**
33
+	 * whether the primary registrant is returning to edit attendee information or to retry a payment
34
+	 *
35
+	 * @type bool
36
+	 */
37
+	public $primary_revisit = false;
38
+
39
+	/**
40
+	 * is registration allowed to progress or halted for some reason such as failing to pass recaptcha?
41
+	 *
42
+	 * @type bool
43
+	 */
44
+	public $continue_reg = true;
45
+
46
+	/**
47
+	 * redirect to thank you page ?
48
+	 *
49
+	 * @type bool
50
+	 */
51
+	public $redirect = false;
52
+
53
+	/**
54
+	 * generate the reg form or not ?
55
+	 *
56
+	 * @type bool
57
+	 */
58
+	public $generate_reg_form = true;
59
+
60
+	/**
61
+	 * process a reg form submission or not ?
62
+	 *
63
+	 * @type bool
64
+	 */
65
+	public $process_form_submission = false;
66
+
67
+	/**
68
+	 * tracks whether the TXN status modified during this checkout
69
+	 *
70
+	 * @type bool
71
+	 */
72
+	public $txn_status_updated = false;
73
+
74
+	/**
75
+	 * only triggered to true after absolutely everything has finished.
76
+	 *
77
+	 * @type bool
78
+	 */
79
+	protected $exit_spco = false;
80
+
81
+	/**
82
+	 * tracks whether any of the TXN's Registrations statuses modified during this checkout
83
+	 * indexed by registration ID
84
+	 *
85
+	 * @type array
86
+	 */
87
+	protected $reg_status_updated = array();
88
+
89
+	/**
90
+	 * timestamp when redirected from Ticket Selector to the checkout
91
+	 *
92
+	 * @type int
93
+	 */
94
+	public $uts = 0;
95
+
96
+	/**
97
+	 * total number of tickets that were in the cart
98
+	 *
99
+	 * @type int
100
+	 */
101
+	public $total_ticket_count = 0;
102
+
103
+	/**
104
+	 * corresponds loosely to EE_Transaction::remaining()
105
+	 * but can be modified by SPCO
106
+	 *
107
+	 * @type float
108
+	 */
109
+	public $amount_owing = 0;
110
+
111
+	/**
112
+	 * the reg step slug from the incoming request
113
+	 *
114
+	 * @type string
115
+	 */
116
+	public $step = '';
117
+
118
+	/**
119
+	 * the reg step slug for a step being edited
120
+	 *
121
+	 * @type string
122
+	 */
123
+	public $edit_step = '';
124
+
125
+	/**
126
+	 * the action being performed on the current step
127
+	 *
128
+	 * @type string
129
+	 */
130
+	public $action = '';
131
+
132
+	/**
133
+	 * reg_url_link for a previously saved registration
134
+	 *
135
+	 * @type string
136
+	 */
137
+	public $reg_url_link = '';
138
+
139
+	/**
140
+	 * string slug for the payment method that was selected during the payment options step
141
+	 *
142
+	 * @type string
143
+	 */
144
+	public $selected_method_of_payment = '';
145
+
146
+	/**
147
+	 * base url for the site's registration checkout page - additional url params will be added to this
148
+	 *
149
+	 * @type string
150
+	 */
151
+	public $reg_page_base_url = '';
152
+
153
+	/**
154
+	 * base url for the site's registration cancelled page - additional url params will be added to this
155
+	 *
156
+	 * @type string
157
+	 */
158
+	public $cancel_page_url = '';
159
+
160
+	/**
161
+	 * base url for the site's thank you page - additional url params will be added to this
162
+	 *
163
+	 * @type string
164
+	 */
165
+	public $thank_you_page_url = '';
166
+
167
+	/**
168
+	 * base url for any redirects - additional url params will be added to this
169
+	 *
170
+	 * @type string
171
+	 */
172
+	public $redirect_url = '';
173
+
174
+	/**
175
+	 * form of POST data for use with off-site gateways
176
+	 *
177
+	 * @type string
178
+	 */
179
+	public $redirect_form = '';
180
+
181
+	/**
182
+	 * array of query where params to use when retrieving cached registrations from $this->checkout->transaction
183
+	 *
184
+	 * @type array
185
+	 */
186
+	public $reg_cache_where_params = array();
187
+
188
+	/**
189
+	 * a class for managing and creating the JSON encoded array of data that gets passed back to the client during AJAX
190
+	 * requests
191
+	 *
192
+	 * @type EE_SPCO_JSON_Response
193
+	 */
194
+	public $json_response;
195
+
196
+	/**
197
+	 * where we are going next in the reg process
198
+	 *
199
+	 * @type EE_SPCO_Reg_Step
200
+	 */
201
+	public $next_step;
202
+
203
+	/**
204
+	 * where we are in the reg process
205
+	 *
206
+	 * @type EE_SPCO_Reg_Step
207
+	 */
208
+	public $current_step;
209
+
210
+	/**
211
+	 *    $_cart - the current cart object
212
+	 *
213
+	 * @var EE_CART
214
+	 */
215
+	public $cart;
216
+
217
+	/**
218
+	 *    $_transaction - the current transaction object
219
+	 *
220
+	 * @var EE_Transaction
221
+	 */
222
+	public $transaction;
223
+
224
+	/**
225
+	 *    the related attendee object for the primary registrant
226
+	 *
227
+	 * @type EE_Attendee
228
+	 */
229
+	public $primary_attendee_obj;
230
+
231
+	/**
232
+	 *    $payment_method - the payment method object for the selected method of payment
233
+	 *
234
+	 * @type EE_Payment_Method
235
+	 */
236
+	public $payment_method;
237
+
238
+	/**
239
+	 *    $payment - if a payment was successfully made during the reg process,
240
+	 *    then here it is !!!
241
+	 *
242
+	 * @type EE_Payment
243
+	 */
244
+	public $payment;
245
+
246
+	/**
247
+	 *    if a payment method was selected that uses an on-site gateway, then this is the billing form
248
+	 *
249
+	 * @type EE_Billing_Info_Form | EE_Billing_Attendee_Info_Form
250
+	 */
251
+	public $billing_form;
252
+
253
+	/**
254
+	 *    the entire registration form composed of ALL of the subsections generated by the various reg steps
255
+	 *
256
+	 * @type EE_Form_Section_Proper
257
+	 */
258
+	public $registration_form;
259
+
260
+	/**
261
+	 * array of EE_SPCO_Reg_Step objects
262
+	 *
263
+	 * @type EE_SPCO_Reg_Step[]
264
+	 */
265
+	public $reg_steps = array();
266
+
267
+	/**
268
+	 * array of EE_Payment_Method objects
269
+	 *
270
+	 * @type EE_Payment_Method[]
271
+	 */
272
+	public $available_payment_methods = array();
273
+
274
+
275
+	/**
276
+	 *    class constructor
277
+	 *
278
+	 * @access    public
279
+	 */
280
+	public function __construct()
281
+	{
282
+		$this->reg_page_base_url = EE_Registry::instance()->CFG->core->reg_page_url();
283
+		$this->thank_you_page_url = EE_Registry::instance()->CFG->core->thank_you_page_url();
284
+		$this->cancel_page_url = EE_Registry::instance()->CFG->core->cancel_page_url();
285
+		$this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
286
+		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->ajax;
287
+		$this->reg_cache_where_params = array(
288
+			0          => array('REG_deleted' => false),
289
+			'order_by' => array('REG_count' => 'ASC'),
290
+		);
291
+	}
292
+
293
+
294
+	/**
295
+	 * returns true if ANY reg status was updated during checkout
296
+	 *
297
+	 * @return boolean
298
+	 */
299
+	public function any_reg_status_updated()
300
+	{
301
+		foreach ($this->reg_status_updated as $reg_status) {
302
+			if ($reg_status) {
303
+				return true;
304
+			}
305
+		}
306
+		return false;
307
+	}
308
+
309
+
310
+	/**
311
+	 * @param $REG_ID
312
+	 * @return boolean
313
+	 */
314
+	public function reg_status_updated($REG_ID)
315
+	{
316
+		return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
317
+	}
318
+
319
+
320
+	/**
321
+	 * @param $REG_ID
322
+	 * @param $reg_status
323
+	 */
324
+	public function set_reg_status_updated($REG_ID, $reg_status)
325
+	{
326
+		$this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327
+	}
328
+
329
+
330
+	/**
331
+	 * exit_spco
332
+	 *
333
+	 * @return bool
334
+	 */
335
+	public function exit_spco()
336
+	{
337
+		return $this->exit_spco;
338
+	}
339
+
340
+
341
+	/**
342
+	 * set_exit_spco
343
+	 * can ONLY be set by the  Finalize_Registration reg step
344
+	 */
345
+	public function set_exit_spco()
346
+	{
347
+		if ($this->current_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
348
+			$this->exit_spco = true;
349
+		}
350
+	}
351
+
352
+
353
+	/**
354
+	 *    reset_for_current_request
355
+	 *
356
+	 * @access    public
357
+	 * @return    void
358
+	 */
359
+	public function reset_for_current_request()
360
+	{
361
+		$this->process_form_submission = false;
362
+		$this->continue_reg = apply_filters('FHEE__EE_Checkout___construct___continue_reg', true);
363
+		$this->admin_request = is_admin() && ! EE_Registry::instance()->REQ->front_ajax;
364
+		$this->continue_reg = true;
365
+		$this->redirect = false;
366
+		// don't reset the cached redirect form if we're about to be asked to display it !!!
367
+		if (EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step') !== 'redirect_form') {
368
+			$this->redirect_form = '';
369
+		}
370
+		$this->redirect_url = '';
371
+		$this->json_response = new EE_SPCO_JSON_Response();
372
+		EE_Form_Section_Proper::reset_js_localization();
373
+	}
374
+
375
+
376
+	/**
377
+	 *    add_reg_step
378
+	 *
379
+	 * @access    public
380
+	 * @param EE_SPCO_Reg_Step $reg_step_obj
381
+	 * @return    void
382
+	 */
383
+	public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384
+	{
385
+		$this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
386
+	}
387
+
388
+
389
+	/**
390
+	 * skip_reg_step
391
+	 * if the current reg step does not need to run for some reason,
392
+	 * then this will advance SPCO to the next reg step,
393
+	 * and mark the skipped step as completed
394
+	 *
395
+	 * @access    public
396
+	 * @param string $reg_step_slug
397
+	 * @return    void
398
+	 * @throws \EE_Error
399
+	 */
400
+	public function skip_reg_step($reg_step_slug = '')
401
+	{
402
+		$step_to_skip = $this->find_reg_step($reg_step_slug);
403
+		if ($step_to_skip instanceof EE_SPCO_Reg_Step && $step_to_skip->is_current_step()) {
404
+			$step_to_skip->set_is_current_step(false);
405
+			$step_to_skip->set_completed();
406
+			// advance to the next step
407
+			$this->set_current_step($this->next_step->slug());
408
+			// also reset the step param in the request in case any other code references that directly
409
+			EE_Registry::instance()->REQ->set('step', $this->current_step->slug());
410
+			// since we are skipping a step and setting the current step to be what was previously the next step,
411
+			// we need to check that the next step is now correct, and not still set to the current step.
412
+			if ($this->current_step->slug() === $this->next_step->slug()) {
413
+				// correctly setup the next step
414
+				$this->set_next_step();
415
+			}
416
+			$this->set_reg_step_initiated($this->current_step);
417
+		}
418
+	}
419
+
420
+
421
+	/**
422
+	 *    remove_reg_step
423
+	 *
424
+	 * @access    public
425
+	 * @param string $reg_step_slug
426
+	 * @param bool   $reset whether to reset reg steps after removal
427
+	 * @throws EE_Error
428
+	 */
429
+	public function remove_reg_step($reg_step_slug = '', $reset = true)
430
+	{
431
+		unset($this->reg_steps[ $reg_step_slug ]);
432
+		if ($this->transaction instanceof EE_Transaction) {
433
+			// now remove reg step from TXN and save
434
+			$this->transaction->remove_reg_step($reg_step_slug);
435
+			$this->transaction->save();
436
+		}
437
+		if ($reset) {
438
+			$this->reset_reg_steps();
439
+		}
440
+	}
441
+
442
+
443
+	/**
444
+	 *    set_reg_step_order
445
+	 *
446
+	 * @access    public
447
+	 * @param string $reg_step_slug
448
+	 * @param int    $order
449
+	 * @return    void
450
+	 */
451
+	public function set_reg_step_order($reg_step_slug = '', $order = 100)
452
+	{
453
+		if (isset($this->reg_steps[ $reg_step_slug ])) {
454
+			$this->reg_steps[ $reg_step_slug ]->set_order($order);
455
+		}
456
+	}
457
+
458
+
459
+	/**
460
+	 *    set_current_step
461
+	 *
462
+	 * @access    public
463
+	 * @param string $current_step
464
+	 * @return    void
465
+	 */
466
+	public function set_current_step($current_step)
467
+	{
468
+		// grab what step we're on
469
+		$this->current_step = isset($this->reg_steps[ $current_step ])
470
+			? $this->reg_steps[ $current_step ]
471
+			: reset(
472
+				$this->reg_steps
473
+			);
474
+		// verify instance
475
+		if ($this->current_step instanceof EE_SPCO_Reg_Step) {
476
+			// we don't want to repeat completed steps if this is the first time through SPCO
477
+			if ($this->continue_reg && ! $this->revisit && $this->current_step->completed()) {
478
+				// so advance to the next step
479
+				$this->set_next_step();
480
+				if ($this->next_step instanceof EE_SPCO_Reg_Step) {
481
+					// and attempt to set it as the current step
482
+					$this->set_current_step($this->next_step->slug());
483
+				}
484
+				return;
485
+			}
486
+			$this->current_step->set_is_current_step(true);
487
+		} else {
488
+			EE_Error::add_error(
489
+				__('The current step could not be set.', 'event_espresso'),
490
+				__FILE__,
491
+				__FUNCTION__,
492
+				__LINE__
493
+			);
494
+		}
495
+	}
496
+
497
+
498
+	/**
499
+	 *    set_next_step
500
+	 * advances the reg_steps array pointer and sets the next step, then reverses pointer back to the current step
501
+	 *
502
+	 * @access    public
503
+	 * @return    void
504
+	 */
505
+	public function set_next_step()
506
+	{
507
+		// set pointer to start of array
508
+		reset($this->reg_steps);
509
+		// if there is more than one step
510
+		if (count($this->reg_steps) > 1) {
511
+			// advance to the current step and set pointer
512
+			while (key($this->reg_steps) !== $this->current_step->slug() && key($this->reg_steps) !== '') {
513
+				next($this->reg_steps);
514
+			}
515
+		}
516
+		// advance one more spot ( if it exists )
517
+		$this->next_step = next($this->reg_steps);
518
+		// verify instance
519
+		$this->next_step = $this->next_step instanceof EE_SPCO_Reg_Step ? $this->next_step : null;
520
+		// then back to current step to reset
521
+		prev($this->reg_steps);
522
+	}
523
+
524
+
525
+	/**
526
+	 *    get_next_reg_step
527
+	 *    this simply returns the next step from reg_steps array
528
+	 *
529
+	 * @access    public
530
+	 * @return    EE_SPCO_Reg_Step | null
531
+	 */
532
+	public function get_next_reg_step()
533
+	{
534
+		$next = next($this->reg_steps);
535
+		prev($this->reg_steps);
536
+		return $next instanceof EE_SPCO_Reg_Step ? $next : null;
537
+	}
538
+
539
+
540
+	/**
541
+	 * get_prev_reg_step
542
+	 *    this simply returns the previous step from reg_steps array
543
+	 *
544
+	 * @access    public
545
+	 * @return    EE_SPCO_Reg_Step | null
546
+	 */
547
+	public function get_prev_reg_step()
548
+	{
549
+		$prev = prev($this->reg_steps);
550
+		next($this->reg_steps);
551
+		return $prev instanceof EE_SPCO_Reg_Step ? $prev : null;
552
+	}
553
+
554
+
555
+	/**
556
+	 * sort_reg_steps
557
+	 *
558
+	 * @access public
559
+	 * @return void
560
+	 */
561
+	public function sort_reg_steps()
562
+	{
563
+		$reg_step_sorting_callback = apply_filters(
564
+			'FHEE__EE_Checkout__sort_reg_steps__reg_step_sorting_callback',
565
+			'reg_step_sorting_callback'
566
+		);
567
+		uasort($this->reg_steps, array($this, $reg_step_sorting_callback));
568
+	}
569
+
570
+
571
+	/**
572
+	 * find_reg_step
573
+	 * finds a reg step by the given slug
574
+	 *
575
+	 * @access    public
576
+	 * @param string $reg_step_slug
577
+	 * @return EE_SPCO_Reg_Step|null
578
+	 */
579
+	public function find_reg_step($reg_step_slug = '')
580
+	{
581
+		if (! empty($reg_step_slug)) {
582
+			// copy reg step array
583
+			$reg_steps = $this->reg_steps;
584
+			// set pointer to start of array
585
+			reset($reg_steps);
586
+			// if there is more than one step
587
+			if (count($reg_steps) > 1) {
588
+				// advance to the current step and set pointer
589
+				while (key($reg_steps) !== $reg_step_slug && key($reg_steps) !== '') {
590
+					next($reg_steps);
591
+				}
592
+				return current($reg_steps);
593
+			}
594
+		}
595
+		return null;
596
+	}
597
+
598
+
599
+	/**
600
+	 * reg_step_sorting_callback
601
+	 *
602
+	 * @access public
603
+	 * @param EE_SPCO_Reg_Step $reg_step_A
604
+	 * @param EE_SPCO_Reg_Step $reg_step_B
605
+	 * @return int
606
+	 */
607
+	public function reg_step_sorting_callback(EE_SPCO_Reg_Step $reg_step_A, EE_SPCO_Reg_Step $reg_step_B)
608
+	{
609
+		// send finalize_registration step to the end of the array
610
+		if ($reg_step_A->slug() === 'finalize_registration') {
611
+			return 1;
612
+		} elseif ($reg_step_B->slug() === 'finalize_registration') {
613
+			return -1;
614
+		}
615
+		if ($reg_step_A->order() === $reg_step_B->order()) {
616
+			return 0;
617
+		}
618
+		return ($reg_step_A->order() > $reg_step_B->order()) ? 1 : -1;
619
+	}
620
+
621
+
622
+	/**
623
+	 * set_reg_step_initiated
624
+	 *
625
+	 * @access    public
626
+	 * @param    EE_SPCO_Reg_Step $reg_step
627
+	 * @throws \EE_Error
628
+	 */
629
+	public function set_reg_step_initiated(EE_SPCO_Reg_Step $reg_step)
630
+	{
631
+		// call set_reg_step_initiated ???
632
+		if (// first time visiting SPCO ?
633
+			! $this->revisit
634
+			&& (
635
+				// and displaying the reg step form for the first time ?
636
+				$this->action === 'display_spco_reg_step'
637
+				// or initializing the final step
638
+				|| $reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration
639
+			)
640
+		) {
641
+			// set the start time for this reg step
642
+			if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643
+				if (WP_DEBUG) {
644
+					EE_Error::add_error(
645
+						sprintf(
646
+							__('The "%1$s" registration step was not initialized properly.', 'event_espresso'),
647
+							$reg_step->name()
648
+						),
649
+						__FILE__,
650
+						__FUNCTION__,
651
+						__LINE__
652
+					);
653
+				}
654
+			}
655
+		}
656
+	}
657
+
658
+
659
+	/**
660
+	 *    set_reg_step_JSON_info
661
+	 *
662
+	 * @access public
663
+	 * @return    void
664
+	 */
665
+	public function set_reg_step_JSON_info()
666
+	{
667
+		EE_Registry::$i18n_js_strings['reg_steps'] = array();
668
+		// pass basic reg step data to JS
669
+		foreach ($this->reg_steps as $reg_step) {
670
+			EE_Registry::$i18n_js_strings['reg_steps'][] = $reg_step->slug();
671
+		}
672
+		// reset reg step html
673
+		// $this->json_response->set_reg_step_html('');
674
+	}
675
+
676
+
677
+	/**
678
+	 *    reset_reg_steps
679
+	 *
680
+	 * @access public
681
+	 * @return void
682
+	 */
683
+	public function reset_reg_steps()
684
+	{
685
+		$this->sort_reg_steps();
686
+		$this->set_current_step(EE_Registry::instance()->REQ->get('step'));
687
+		$this->set_next_step();
688
+		// the text that appears on the reg step form submit button
689
+		$this->current_step->set_submit_button_text();
690
+		$this->set_reg_step_JSON_info();
691
+	}
692
+
693
+
694
+	/**
695
+	 *    get_registration_time_limit
696
+	 *
697
+	 * @access    public
698
+	 * @return        string
699
+	 */
700
+	public function get_registration_time_limit()
701
+	{
702
+
703
+		$registration_time_limit = (float) (EE_Registry::instance()->SSN->expiration() - time());
704
+		$time_limit_format = $registration_time_limit > 60 * MINUTE_IN_SECONDS ? 'H:i:s' : 'i:s';
705
+		$registration_time_limit = date($time_limit_format, $registration_time_limit);
706
+		return apply_filters(
707
+			'FHEE__EE_Checkout__get_registration_time_limit__registration_time_limit',
708
+			$registration_time_limit
709
+		);
710
+	}
711
+
712
+
713
+	/**
714
+	 * payment_required
715
+	 *
716
+	 * @return boolean
717
+	 */
718
+	public function payment_required()
719
+	{
720
+		// if NOT:
721
+		//     registration via admin
722
+		//      completed TXN
723
+		//      overpaid TXN
724
+		//      free TXN(total = 0.00)
725
+		//      then payment required is TRUE
726
+		return ! ($this->admin_request
727
+				  || $this->transaction->is_completed()
728
+				  || $this->transaction->is_overpaid()
729
+				  || $this->transaction->is_free()) ? true : false;
730
+	}
731
+
732
+
733
+	/**
734
+	 * get_cart_for_transaction
735
+	 *
736
+	 * @access public
737
+	 * @param EE_Transaction $transaction
738
+	 * @return EE_Cart
739
+	 */
740
+	public function get_cart_for_transaction($transaction)
741
+	{
742
+		$session = EE_Registry::instance()->load_core('Session');
743
+		$cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744
+		// verify cart
745
+		if (! $cart instanceof EE_Cart) {
746
+			$cart = EE_Registry::instance()->load_core('Cart');
747
+		}
748
+
749
+		return $cart;
750
+	}
751
+
752
+
753
+	/**
754
+	 *    initialize_txn_reg_steps_array
755
+	 *
756
+	 * @access public
757
+	 * @return    array
758
+	 */
759
+	public function initialize_txn_reg_steps_array()
760
+	{
761
+		$txn_reg_steps_array = array();
762
+		foreach ($this->reg_steps as $reg_step) {
763
+			$txn_reg_steps_array[ $reg_step->slug() ] = false;
764
+		}
765
+		return $txn_reg_steps_array;
766
+	}
767
+
768
+
769
+	/**
770
+	 *    update_txn_reg_steps_array
771
+	 *
772
+	 * @access public
773
+	 * @return    bool
774
+	 * @throws \EE_Error
775
+	 */
776
+	public function update_txn_reg_steps_array()
777
+	{
778
+		$updated = false;
779
+		foreach ($this->reg_steps as $reg_step) {
780
+			if ($reg_step->completed()) {
781
+				$updated = $this->transaction->set_reg_step_completed($reg_step->slug())
782
+					? true
783
+					: $updated;
784
+			}
785
+		}
786
+		if ($updated) {
787
+			$this->transaction->save();
788
+		}
789
+		return $updated;
790
+	}
791
+
792
+
793
+	/**
794
+	 *    stash_transaction_and_checkout
795
+	 *
796
+	 * @access public
797
+	 * @return    void
798
+	 * @throws \EE_Error
799
+	 */
800
+	public function stash_transaction_and_checkout()
801
+	{
802
+		if (! $this->revisit) {
803
+			$this->update_txn_reg_steps_array();
804
+		}
805
+		$this->track_transaction_and_registration_status_updates();
806
+		// save all data to the db, but suppress errors
807
+		// $this->save_all_data( FALSE );
808
+		// cache the checkout in the session
809
+		EE_Registry::instance()->SSN->set_checkout($this);
810
+	}
811
+
812
+
813
+	/**
814
+	 *    track_transaction_and_registration_status_updates
815
+	 *    stores whether any updates were made to the TXN or it's related registrations
816
+	 *
817
+	 * @access public
818
+	 * @return void
819
+	 * @throws \EE_Error
820
+	 */
821
+	public function track_transaction_and_registration_status_updates()
822
+	{
823
+		// verify the transaction
824
+		if ($this->transaction instanceof EE_Transaction) {
825
+			// has there been a TXN status change during this checkout?
826
+			$this->txn_status_updated = $this->transaction->txn_status_updated();
827
+			/** @type EE_Registration_Processor $registration_processor */
828
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
829
+			// grab the saved registrations from the transaction
830
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
831
+				if ($registration_processor->reg_status_updated($registration->ID())) {
832
+					$this->set_reg_status_updated($registration->ID(), true);
833
+				}
834
+			}
835
+		}
836
+	}
837
+
838
+
839
+	/**
840
+	 *    visit_allows_processing_of_this_registration
841
+	 *    determines if the current SPCO visit should allow the passed EE_Registration to be used in processing.
842
+	 *    one of the following conditions must be met:
843
+	 *        EITHER:    A) first time thru SPCO -> process ALL registrations ( NOT a revisit )
844
+	 *        OR :        B) primary registrant is editing info -> process ALL registrations ( primary_revisit )
845
+	 *        OR :        C) another registrant is editing info -> ONLY process their registration ( revisit AND their
846
+	 *        reg_url_link matches )
847
+	 *
848
+	 * @access public
849
+	 * @param    EE_Registration $registration
850
+	 * @return    bool
851
+	 * @throws \EE_Error
852
+	 */
853
+	public function visit_allows_processing_of_this_registration(EE_Registration $registration)
854
+	{
855
+		return ! $this->revisit
856
+			   || $this->primary_revisit
857
+			   || (
858
+				   $this->revisit && $this->reg_url_link === $registration->reg_url_link()
859
+			   )
860
+			? true
861
+			: false;
862
+	}
863
+
864
+
865
+	/**
866
+	 *    _transaction_has_primary_registration
867
+	 *
868
+	 * @access        private
869
+	 * @return        bool
870
+	 */
871
+	public function transaction_has_primary_registrant()
872
+	{
873
+		return $this->primary_attendee_obj instanceof EE_Attendee ? true : false;
874
+	}
875
+
876
+
877
+	/**
878
+	 *    save_all_data
879
+	 *    simply loops through the current transaction and saves all data for each registration
880
+	 *
881
+	 * @access public
882
+	 * @param bool $show_errors
883
+	 * @return bool
884
+	 * @throws \EE_Error
885
+	 */
886
+	public function save_all_data($show_errors = true)
887
+	{
888
+		// verify the transaction
889
+		if ($this->transaction instanceof EE_Transaction) {
890
+			// save to ensure that TXN has ID
891
+			$this->transaction->save();
892
+			// grab the saved registrations from the transaction
893
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $registration) {
894
+				$this->_save_registration($registration, $show_errors);
895
+			}
896
+		} else {
897
+			if ($show_errors) {
898
+				EE_Error::add_error(
899
+					__(
900
+						'A valid Transaction was not found when attempting to save your registration information.',
901
+						'event_espresso'
902
+					),
903
+					__FILE__,
904
+					__FUNCTION__,
905
+					__LINE__
906
+				);
907
+			}
908
+			return false;
909
+		}
910
+		return true;
911
+	}
912
+
913
+
914
+	/**
915
+	 * _save_registration_attendee
916
+	 *
917
+	 * @param    EE_Registration $registration
918
+	 * @param bool               $show_errors
919
+	 * @return void
920
+	 * @throws \EE_Error
921
+	 */
922
+	private function _save_registration($registration, $show_errors = true)
923
+	{
924
+		// verify object
925
+		if ($registration instanceof EE_Registration) {
926
+			// should this registration be processed during this visit ?
927
+			if ($this->visit_allows_processing_of_this_registration($registration)) {
928
+				// set TXN ID
929
+				if (! $registration->transaction_ID()) {
930
+					$registration->set_transaction_id($this->transaction->ID());
931
+				}
932
+				// verify and save the attendee
933
+				$this->_save_registration_attendee($registration, $show_errors);
934
+				// save answers to reg form questions
935
+				$this->_save_registration_answers($registration, $show_errors);
936
+				// save changes
937
+				$registration->save();
938
+				// update txn cache
939
+				if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940
+					if ($show_errors) {
941
+						EE_Error::add_error(
942
+							__(
943
+								'The newly saved Registration object could not be cached on the Transaction.',
944
+								'event_espresso'
945
+							),
946
+							__FILE__,
947
+							__FUNCTION__,
948
+							__LINE__
949
+						);
950
+					}
951
+				}
952
+			}
953
+		} else {
954
+			if ($show_errors) {
955
+				EE_Error::add_error(
956
+					__(
957
+						'An invalid Registration object was discovered when attempting to save your registration information.',
958
+						'event_espresso'
959
+					),
960
+					__FILE__,
961
+					__FUNCTION__,
962
+					__LINE__
963
+				);
964
+			}
965
+		}
966
+	}
967
+
968
+
969
+	/**
970
+	 * _save_registration_attendee
971
+	 *
972
+	 * @param    EE_Registration $registration
973
+	 * @param bool               $show_errors
974
+	 * @return void
975
+	 * @throws \EE_Error
976
+	 */
977
+	private function _save_registration_attendee($registration, $show_errors = true)
978
+	{
979
+		if ($registration->attendee() instanceof EE_Attendee) {
980
+			// save so that ATT has ID
981
+			$registration->attendee()->save();
982
+			if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983
+				if ($show_errors) {
984
+					EE_Error::add_error(
985
+						__(
986
+							'The newly saved Attendee object could not be cached on the registration.',
987
+							'event_espresso'
988
+						),
989
+						__FILE__,
990
+						__FUNCTION__,
991
+						__LINE__
992
+					);
993
+				}
994
+			}
995
+		} else {
996
+			if ($show_errors) {
997
+				EE_Error::add_error(
998
+					sprintf(
999
+						'%1$s||%1$s $attendee = %2$s',
1000
+						__(
1001
+							'Either no Attendee information was found, or an invalid Attendee object was discovered when attempting to save your registration information.',
1002
+							'event_espresso'
1003
+						),
1004
+						var_export($registration->attendee(), true)
1005
+					),
1006
+					__FILE__,
1007
+					__FUNCTION__,
1008
+					__LINE__
1009
+				);
1010
+			}
1011
+		}
1012
+	}
1013
+
1014
+
1015
+	/**
1016
+	 * _save_question_answers
1017
+	 *
1018
+	 * @param    EE_Registration $registration
1019
+	 * @param bool               $show_errors
1020
+	 * @return void
1021
+	 * @throws \EE_Error
1022
+	 */
1023
+	private function _save_registration_answers($registration, $show_errors = true)
1024
+	{
1025
+		// now save the answers
1026
+		foreach ($registration->answers() as $cache_key => $answer) {
1027
+			// verify object
1028
+			if ($answer instanceof EE_Answer) {
1029
+				$answer->set_registration($registration->ID());
1030
+				$answer->save();
1031
+				if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032
+					if ($show_errors) {
1033
+						EE_Error::add_error(
1034
+							__(
1035
+								'The newly saved Answer object could not be cached on the registration.',
1036
+								'event_espresso'
1037
+							),
1038
+							__FILE__,
1039
+							__FUNCTION__,
1040
+							__LINE__
1041
+						);
1042
+					}
1043
+				}
1044
+			} else {
1045
+				if ($show_errors) {
1046
+					EE_Error::add_error(
1047
+						__(
1048
+							'An invalid Answer object was discovered when attempting to save your registration information.',
1049
+							'event_espresso'
1050
+						),
1051
+						__FILE__,
1052
+						__FUNCTION__,
1053
+						__LINE__
1054
+					);
1055
+				}
1056
+			}
1057
+		}
1058
+	}
1059
+
1060
+
1061
+	/**
1062
+	 *    refresh_all_entities
1063
+	 *   will either refresh the entity map with objects form the db or from the checkout cache
1064
+	 *
1065
+	 * @access public
1066
+	 * @param bool $from_db
1067
+	 * @return bool
1068
+	 * @throws \EE_Error
1069
+	 */
1070
+	public function refresh_all_entities($from_db = false)
1071
+	{
1072
+		$from_db = $this->current_step->is_final_step() || $this->action === 'process_gateway_response'
1073
+			? true
1074
+			: $from_db;
1075
+		// $this->log(
1076
+		//     __CLASS__,
1077
+		//     __FUNCTION__,
1078
+		//     __LINE__,
1079
+		//     array('from_db' => $from_db)
1080
+		// );
1081
+		return $from_db ? $this->refresh_from_db() : $this->refresh_entity_map();
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 *  refresh_entity_map
1087
+	 *  simply loops through the current transaction and updates each
1088
+	 *  model's entity map using EEM_Base::refresh_entity_map_from_db()
1089
+	 *
1090
+	 * @access public
1091
+	 * @return bool
1092
+	 * @throws \EE_Error
1093
+	 */
1094
+	protected function refresh_from_db()
1095
+	{
1096
+		// verify the transaction
1097
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1098
+			// pull fresh TXN data from the db
1099
+			$this->transaction = $this->transaction->get_model()->refresh_entity_map_from_db($this->transaction->ID());
1100
+			// update EE_Checkout's cached primary_attendee object
1101
+			$this->primary_attendee_obj = $this->_refresh_primary_attendee_obj_from_db($this->transaction);
1102
+			// update EE_Checkout's cached payment object
1103
+			$payment = $this->transaction->last_payment();
1104
+			$this->payment = $payment instanceof EE_Payment ? $payment : $this->payment;
1105
+			// update EE_Checkout's cached payment_method object
1106
+			$payment_method = $this->payment instanceof EE_Payment ? $this->payment->payment_method() : null;
1107
+			$this->payment_method = $payment_method instanceof EE_Payment_Method ? $payment_method
1108
+				: $this->payment_method;
1109
+			// now refresh the cart, based on the TXN
1110
+			$this->cart = $this->get_cart_for_transaction($this->transaction);
1111
+		} else {
1112
+			EE_Error::add_error(
1113
+				__(
1114
+					'A valid Transaction was not found when attempting to update the model entity mapper.',
1115
+					'event_espresso'
1116
+				),
1117
+				__FILE__,
1118
+				__FUNCTION__,
1119
+				__LINE__
1120
+			);
1121
+			return false;
1122
+		}
1123
+		return true;
1124
+	}
1125
+
1126
+
1127
+	/**
1128
+	 * _refresh_primary_attendee_obj_from_db
1129
+	 *
1130
+	 * @param   EE_Transaction $transaction
1131
+	 * @return  EE_Attendee | null
1132
+	 * @throws \EE_Error
1133
+	 */
1134
+	protected function _refresh_primary_attendee_obj_from_db(EE_Transaction $transaction)
1135
+	{
1136
+
1137
+		$primary_attendee_obj = null;
1138
+		// grab the saved registrations from the transaction
1139
+		foreach ($transaction->registrations($this->reg_cache_where_params, true) as $registration) {
1140
+			// verify object
1141
+			if ($registration instanceof EE_Registration) {
1142
+				$attendee = $registration->attendee();
1143
+				// verify object && maybe cache primary_attendee_obj ?
1144
+				if ($attendee instanceof EE_Attendee && $registration->is_primary_registrant()) {
1145
+					$primary_attendee_obj = $attendee;
1146
+				}
1147
+			} else {
1148
+				EE_Error::add_error(
1149
+					__(
1150
+						'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1151
+						'event_espresso'
1152
+					),
1153
+					__FILE__,
1154
+					__FUNCTION__,
1155
+					__LINE__
1156
+				);
1157
+			}
1158
+		}
1159
+		return $primary_attendee_obj;
1160
+	}
1161
+
1162
+
1163
+	/**
1164
+	 *  refresh_entity_map
1165
+	 *  simply loops through the current transaction and updates
1166
+	 *  each model's entity map using EEM_Base::refresh_entity_map_with()
1167
+	 *
1168
+	 * @access public
1169
+	 * @return bool
1170
+	 * @throws \EE_Error
1171
+	 */
1172
+	protected function refresh_entity_map()
1173
+	{
1174
+		// verify the transaction
1175
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1176
+			// never cache payment info
1177
+			$this->transaction->clear_cache('Payment');
1178
+			// is the Payment Options Reg Step completed ?
1179
+			if ($this->transaction->reg_step_completed('payment_options')) {
1180
+				// then check for payments and update TXN accordingly
1181
+				/** @type EE_Transaction_Payments $transaction_payments */
1182
+				$transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments');
1183
+				$transaction_payments->calculate_total_payments_and_update_status($this->transaction);
1184
+			}
1185
+			// grab the saved registrations from the transaction
1186
+			foreach ($this->transaction->registrations($this->reg_cache_where_params) as $reg_cache_ID => $registration) {
1187
+				$this->_refresh_registration($reg_cache_ID, $registration);
1188
+			}
1189
+			// make sure our cached TXN is added to the model entity mapper
1190
+			$this->transaction = $this->transaction->get_model()->refresh_entity_map_with(
1191
+				$this->transaction->ID(),
1192
+				$this->transaction
1193
+			);
1194
+		} else {
1195
+			EE_Error::add_error(
1196
+				__(
1197
+					'A valid Transaction was not found when attempting to update the model entity mapper.',
1198
+					'event_espresso'
1199
+				),
1200
+				__FILE__,
1201
+				__FUNCTION__,
1202
+				__LINE__
1203
+			);
1204
+			return false;
1205
+		}
1206
+		// verify and update the cart because inaccurate totals are not so much fun
1207
+		if ($this->cart instanceof EE_Cart) {
1208
+			$grand_total = $this->cart->get_grand_total();
1209
+			if ($grand_total instanceof EE_Line_Item && $grand_total->ID()) {
1210
+				$grand_total->recalculate_total_including_taxes();
1211
+				$grand_total = $grand_total->get_model()->refresh_entity_map_with(
1212
+					$this->cart->get_grand_total()->ID(),
1213
+					$this->cart->get_grand_total()
1214
+				);
1215
+			}
1216
+			if ($grand_total instanceof EE_Line_Item) {
1217
+				$this->cart = EE_Cart::instance($grand_total);
1218
+			} else {
1219
+				EE_Error::add_error(
1220
+					__(
1221
+						'A valid Cart was not found when attempting to update the model entity mapper.',
1222
+						'event_espresso'
1223
+					),
1224
+					__FILE__,
1225
+					__FUNCTION__,
1226
+					__LINE__
1227
+				);
1228
+				return false;
1229
+			}
1230
+		}
1231
+		return true;
1232
+	}
1233
+
1234
+
1235
+	/**
1236
+	 * _refresh_registration
1237
+	 *
1238
+	 * @param    string | int    $reg_cache_ID
1239
+	 * @param    EE_Registration $registration
1240
+	 * @return void
1241
+	 * @throws \EE_Error
1242
+	 */
1243
+	protected function _refresh_registration($reg_cache_ID, $registration)
1244
+	{
1245
+
1246
+		// verify object
1247
+		if ($registration instanceof EE_Registration) {
1248
+			// update the entity mapper attendee
1249
+			$this->_refresh_registration_attendee($registration);
1250
+			// update the entity mapper answers for reg form questions
1251
+			$this->_refresh_registration_answers($registration);
1252
+			// make sure the cached registration is added to the model entity mapper
1253
+			$registration->get_model()->refresh_entity_map_with($reg_cache_ID, $registration);
1254
+		} else {
1255
+			EE_Error::add_error(
1256
+				__(
1257
+					'An invalid Registration object was discovered when attempting to update the model entity mapper.',
1258
+					'event_espresso'
1259
+				),
1260
+				__FILE__,
1261
+				__FUNCTION__,
1262
+				__LINE__
1263
+			);
1264
+		}
1265
+	}
1266
+
1267
+
1268
+	/**
1269
+	 * _save_registration_attendee
1270
+	 *
1271
+	 * @param    EE_Registration $registration
1272
+	 * @return void
1273
+	 * @throws \EE_Error
1274
+	 */
1275
+	protected function _refresh_registration_attendee($registration)
1276
+	{
1277
+
1278
+		$attendee = $registration->attendee();
1279
+		// verify object
1280
+		if ($attendee instanceof EE_Attendee && $attendee->ID()) {
1281
+			// make sure the cached attendee is added to the model entity mapper
1282
+			$registration->attendee()->get_model()->refresh_entity_map_with($attendee->ID(), $attendee);
1283
+			// maybe cache primary_attendee_obj ?
1284
+			if ($registration->is_primary_registrant()) {
1285
+				$this->primary_attendee_obj = $attendee;
1286
+			}
1287
+		}
1288
+	}
1289
+
1290
+
1291
+	/**
1292
+	 * _refresh_registration_answers
1293
+	 *
1294
+	 * @param    EE_Registration $registration
1295
+	 * @return void
1296
+	 * @throws \EE_Error
1297
+	 */
1298
+	protected function _refresh_registration_answers($registration)
1299
+	{
1300
+
1301
+		// now update the answers
1302
+		foreach ($registration->answers() as $cache_key => $answer) {
1303
+			// verify object
1304
+			if ($answer instanceof EE_Answer) {
1305
+				if ($answer->ID()) {
1306
+					// make sure the cached answer is added to the model entity mapper
1307
+					$answer->get_model()->refresh_entity_map_with($answer->ID(), $answer);
1308
+				}
1309
+			} else {
1310
+				EE_Error::add_error(
1311
+					__(
1312
+						'An invalid Answer object was discovered when attempting to update the model entity mapper.',
1313
+						'event_espresso'
1314
+					),
1315
+					__FILE__,
1316
+					__FUNCTION__,
1317
+					__LINE__
1318
+				);
1319
+			}
1320
+		}
1321
+	}
1322
+
1323
+
1324
+	/**
1325
+	 *    __sleep
1326
+	 * to conserve db space, let's remove the reg_form and the EE_Checkout object from EE_SPCO_Reg_Step objects upon
1327
+	 * serialization EE_Checkout will handle the reimplementation of itself upon waking, but we won't bother with the
1328
+	 * reg form, because if needed, it will be regenerated anyways
1329
+	 *
1330
+	 * @return array
1331
+	 * @throws \EE_Error
1332
+	 */
1333
+	public function __sleep()
1334
+	{
1335
+		if ($this->primary_attendee_obj instanceof EE_Attendee && $this->primary_attendee_obj->ID()) {
1336
+			$this->primary_attendee_obj = $this->primary_attendee_obj->ID();
1337
+		}        // remove the reg form and the checkout
1338
+		if ($this->transaction instanceof EE_Transaction && $this->transaction->ID()) {
1339
+			$this->transaction = $this->transaction->ID();
1340
+		}        // remove the reg form and the checkout
1341
+		return array_diff(array_keys(get_object_vars($this)), array('billing_form', 'registration_form'));
1342
+	}
1343
+
1344
+
1345
+	/**
1346
+	 *    __wakeup
1347
+	 * to conserve db space, we are removing the EE_Checkout object from EE_SPCO_Reg_Step objects upon serialization
1348
+	 * this will reinstate the EE_Checkout object on each EE_SPCO_Reg_Step object
1349
+	 */
1350
+	public function __wakeup()
1351
+	{
1352
+		if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353
+			// $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354
+			$this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355
+		}
1356
+		if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357
+			// $this->transaction is actually just an ID, so use it to get the object from the db
1358
+			$this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359
+		}
1360
+		foreach ($this->reg_steps as $reg_step) {
1361
+			$reg_step->checkout = $this;
1362
+		}
1363
+	}
1364
+
1365
+
1366
+	/**
1367
+	 * debug
1368
+	 *
1369
+	 * @param string $class
1370
+	 * @param string $func
1371
+	 * @param string $line
1372
+	 * @param array  $info
1373
+	 * @param bool   $display_request
1374
+	 * @throws \EE_Error
1375
+	 */
1376
+	public function log($class = '', $func = '', $line = '', $info = array(), $display_request = false)
1377
+	{
1378
+		$disabled = true;
1379
+		if (WP_DEBUG && ! $disabled) {
1380
+			$debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1381
+			$default_data = array(
1382
+				$class                    => $func . '() : ' . $line,
1383
+				'request->step'           => $this->step,
1384
+				'request->action'         => $this->action,
1385
+				'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
1386
+					$this->current_step->slug() : '',
1387
+				'current_step->completed' => $this->current_step instanceof EE_SPCO_Reg_Step ?
1388
+					$this->current_step->completed() : '',
1389
+				'txn_status_updated'      => $this->transaction->txn_status_updated(),
1390
+				'reg_status_updated'      => $this->reg_status_updated,
1391
+				'reg_url_link'            => $this->reg_url_link,
1392
+				'REQ'                     => $display_request ? $_REQUEST : '',
1393
+			);
1394
+			if ($this->transaction instanceof EE_Transaction) {
1395
+				$default_data['TXN_status'] = $this->transaction->status_ID();
1396
+				$default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397
+				foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
+					$default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1399
+				}
1400
+				if ($this->transaction->ID()) {
1401
+					$TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1402
+					// don't serialize objects
1403
+					$info = $this->_strip_objects($info);
1404
+					if (! isset($debug_data[ $TXN_ID ])) {
1405
+						$debug_data[ $TXN_ID ] = array();
1406
+					}
1407
+					$debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1408
+						$default_data,
1409
+						$info
1410
+					);
1411
+					update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1412
+				}
1413
+			}
1414
+		}
1415
+	}
1416
+
1417
+
1418
+	/**
1419
+	 * _strip_objects
1420
+	 *
1421
+	 * @param array $info
1422
+	 * @return array
1423
+	 */
1424
+	public function _strip_objects($info = array())
1425
+	{
1426
+		foreach ((array) $info as $key => $value) {
1427
+			if (is_array($value)) {
1428
+				$info[ $key ] = $this->_strip_objects($value);
1429
+			} elseif (is_object($value)) {
1430
+				$object_class = get_class($value);
1431
+				$info[ $object_class ] = array();
1432
+				$info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433
+				if (method_exists($value, 'status')) {
1434
+					$info[ $object_class ]['status'] = $value->status();
1435
+				} elseif (method_exists($value, 'status_ID')) {
1436
+					$info[ $object_class ]['status'] = $value->status_ID();
1437
+				}
1438
+				unset($info[ $key ]);
1439
+			}
1440
+		}
1441
+		return (array) $info;
1442
+	}
1443 1443
 }
Please login to merge, or discard this patch.
Spacing   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
      */
314 314
     public function reg_status_updated($REG_ID)
315 315
     {
316
-        return isset($this->reg_status_updated[ $REG_ID ]) ? $this->reg_status_updated[ $REG_ID ] : false;
316
+        return isset($this->reg_status_updated[$REG_ID]) ? $this->reg_status_updated[$REG_ID] : false;
317 317
     }
318 318
 
319 319
 
@@ -323,7 +323,7 @@  discard block
 block discarded – undo
323 323
      */
324 324
     public function set_reg_status_updated($REG_ID, $reg_status)
325 325
     {
326
-        $this->reg_status_updated[ $REG_ID ] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
326
+        $this->reg_status_updated[$REG_ID] = filter_var($reg_status, FILTER_VALIDATE_BOOLEAN);
327 327
     }
328 328
 
329 329
 
@@ -382,7 +382,7 @@  discard block
 block discarded – undo
382 382
      */
383 383
     public function add_reg_step(EE_SPCO_Reg_Step $reg_step_obj)
384 384
     {
385
-        $this->reg_steps[ $reg_step_obj->slug() ] = $reg_step_obj;
385
+        $this->reg_steps[$reg_step_obj->slug()] = $reg_step_obj;
386 386
     }
387 387
 
388 388
 
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
      */
429 429
     public function remove_reg_step($reg_step_slug = '', $reset = true)
430 430
     {
431
-        unset($this->reg_steps[ $reg_step_slug ]);
431
+        unset($this->reg_steps[$reg_step_slug]);
432 432
         if ($this->transaction instanceof EE_Transaction) {
433 433
             // now remove reg step from TXN and save
434 434
             $this->transaction->remove_reg_step($reg_step_slug);
@@ -450,8 +450,8 @@  discard block
 block discarded – undo
450 450
      */
451 451
     public function set_reg_step_order($reg_step_slug = '', $order = 100)
452 452
     {
453
-        if (isset($this->reg_steps[ $reg_step_slug ])) {
454
-            $this->reg_steps[ $reg_step_slug ]->set_order($order);
453
+        if (isset($this->reg_steps[$reg_step_slug])) {
454
+            $this->reg_steps[$reg_step_slug]->set_order($order);
455 455
         }
456 456
     }
457 457
 
@@ -466,8 +466,8 @@  discard block
 block discarded – undo
466 466
     public function set_current_step($current_step)
467 467
     {
468 468
         // grab what step we're on
469
-        $this->current_step = isset($this->reg_steps[ $current_step ])
470
-            ? $this->reg_steps[ $current_step ]
469
+        $this->current_step = isset($this->reg_steps[$current_step])
470
+            ? $this->reg_steps[$current_step]
471 471
             : reset(
472 472
                 $this->reg_steps
473 473
             );
@@ -578,7 +578,7 @@  discard block
 block discarded – undo
578 578
      */
579 579
     public function find_reg_step($reg_step_slug = '')
580 580
     {
581
-        if (! empty($reg_step_slug)) {
581
+        if ( ! empty($reg_step_slug)) {
582 582
             // copy reg step array
583 583
             $reg_steps = $this->reg_steps;
584 584
             // set pointer to start of array
@@ -639,7 +639,7 @@  discard block
 block discarded – undo
639 639
             )
640 640
         ) {
641 641
             // set the start time for this reg step
642
-            if (! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
642
+            if ( ! $this->transaction->set_reg_step_initiated($reg_step->slug())) {
643 643
                 if (WP_DEBUG) {
644 644
                     EE_Error::add_error(
645 645
                         sprintf(
@@ -742,7 +742,7 @@  discard block
 block discarded – undo
742 742
         $session = EE_Registry::instance()->load_core('Session');
743 743
         $cart = $transaction instanceof EE_Transaction ? EE_Cart::get_cart_from_txn($transaction, $session) : null;
744 744
         // verify cart
745
-        if (! $cart instanceof EE_Cart) {
745
+        if ( ! $cart instanceof EE_Cart) {
746 746
             $cart = EE_Registry::instance()->load_core('Cart');
747 747
         }
748 748
 
@@ -760,7 +760,7 @@  discard block
 block discarded – undo
760 760
     {
761 761
         $txn_reg_steps_array = array();
762 762
         foreach ($this->reg_steps as $reg_step) {
763
-            $txn_reg_steps_array[ $reg_step->slug() ] = false;
763
+            $txn_reg_steps_array[$reg_step->slug()] = false;
764 764
         }
765 765
         return $txn_reg_steps_array;
766 766
     }
@@ -799,7 +799,7 @@  discard block
 block discarded – undo
799 799
      */
800 800
     public function stash_transaction_and_checkout()
801 801
     {
802
-        if (! $this->revisit) {
802
+        if ( ! $this->revisit) {
803 803
             $this->update_txn_reg_steps_array();
804 804
         }
805 805
         $this->track_transaction_and_registration_status_updates();
@@ -926,7 +926,7 @@  discard block
 block discarded – undo
926 926
             // should this registration be processed during this visit ?
927 927
             if ($this->visit_allows_processing_of_this_registration($registration)) {
928 928
                 // set TXN ID
929
-                if (! $registration->transaction_ID()) {
929
+                if ( ! $registration->transaction_ID()) {
930 930
                     $registration->set_transaction_id($this->transaction->ID());
931 931
                 }
932 932
                 // verify and save the attendee
@@ -936,7 +936,7 @@  discard block
 block discarded – undo
936 936
                 // save changes
937 937
                 $registration->save();
938 938
                 // update txn cache
939
-                if (! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
939
+                if ( ! $this->transaction->update_cache_after_object_save('Registration', $registration)) {
940 940
                     if ($show_errors) {
941 941
                         EE_Error::add_error(
942 942
                             __(
@@ -979,7 +979,7 @@  discard block
 block discarded – undo
979 979
         if ($registration->attendee() instanceof EE_Attendee) {
980 980
             // save so that ATT has ID
981 981
             $registration->attendee()->save();
982
-            if (! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
982
+            if ( ! $registration->update_cache_after_object_save('Attendee', $registration->attendee())) {
983 983
                 if ($show_errors) {
984 984
                     EE_Error::add_error(
985 985
                         __(
@@ -1028,7 +1028,7 @@  discard block
 block discarded – undo
1028 1028
             if ($answer instanceof EE_Answer) {
1029 1029
                 $answer->set_registration($registration->ID());
1030 1030
                 $answer->save();
1031
-                if (! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1031
+                if ( ! $registration->update_cache_after_object_save('Answer', $answer, $cache_key)) {
1032 1032
                     if ($show_errors) {
1033 1033
                         EE_Error::add_error(
1034 1034
                             __(
@@ -1349,11 +1349,11 @@  discard block
 block discarded – undo
1349 1349
      */
1350 1350
     public function __wakeup()
1351 1351
     {
1352
-        if (! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1352
+        if ( ! $this->primary_attendee_obj instanceof EE_Attendee && absint($this->primary_attendee_obj) !== 0) {
1353 1353
             // $this->primary_attendee_obj is actually just an ID, so use it to get the object from the db
1354 1354
             $this->primary_attendee_obj = EEM_Attendee::instance()->get_one_by_ID($this->primary_attendee_obj);
1355 1355
         }
1356
-        if (! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1356
+        if ( ! $this->transaction instanceof EE_Transaction && absint($this->transaction) !== 0) {
1357 1357
             // $this->transaction is actually just an ID, so use it to get the object from the db
1358 1358
             $this->transaction = EEM_Transaction::instance()->get_one_by_ID($this->transaction);
1359 1359
         }
@@ -1377,9 +1377,9 @@  discard block
 block discarded – undo
1377 1377
     {
1378 1378
         $disabled = true;
1379 1379
         if (WP_DEBUG && ! $disabled) {
1380
-            $debug_data = get_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), array());
1380
+            $debug_data = get_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), array());
1381 1381
             $default_data = array(
1382
-                $class                    => $func . '() : ' . $line,
1382
+                $class                    => $func.'() : '.$line,
1383 1383
                 'request->step'           => $this->step,
1384 1384
                 'request->action'         => $this->action,
1385 1385
                 'current_step->slug'      => $this->current_step instanceof EE_SPCO_Reg_Step ?
@@ -1395,20 +1395,20 @@  discard block
 block discarded – undo
1395 1395
                 $default_data['TXN_status'] = $this->transaction->status_ID();
1396 1396
                 $default_data['TXN_reg_steps'] = $this->transaction->reg_steps();
1397 1397
                 foreach ($this->transaction->registrations($this->reg_cache_where_params) as $REG_ID => $registration) {
1398
-                    $default_data['registrations'][ $REG_ID ] = $registration->status_ID();
1398
+                    $default_data['registrations'][$REG_ID] = $registration->status_ID();
1399 1399
                 }
1400 1400
                 if ($this->transaction->ID()) {
1401
-                    $TXN_ID = 'EE_Transaction: ' . $this->transaction->ID();
1401
+                    $TXN_ID = 'EE_Transaction: '.$this->transaction->ID();
1402 1402
                     // don't serialize objects
1403 1403
                     $info = $this->_strip_objects($info);
1404
-                    if (! isset($debug_data[ $TXN_ID ])) {
1405
-                        $debug_data[ $TXN_ID ] = array();
1404
+                    if ( ! isset($debug_data[$TXN_ID])) {
1405
+                        $debug_data[$TXN_ID] = array();
1406 1406
                     }
1407
-                    $debug_data[ $TXN_ID ][ microtime() ] = array_merge(
1407
+                    $debug_data[$TXN_ID][microtime()] = array_merge(
1408 1408
                         $default_data,
1409 1409
                         $info
1410 1410
                     );
1411
-                    update_option('EE_DEBUG_SPCO_' . EE_Session::instance()->id(), $debug_data);
1411
+                    update_option('EE_DEBUG_SPCO_'.EE_Session::instance()->id(), $debug_data);
1412 1412
                 }
1413 1413
             }
1414 1414
         }
@@ -1425,17 +1425,17 @@  discard block
 block discarded – undo
1425 1425
     {
1426 1426
         foreach ((array) $info as $key => $value) {
1427 1427
             if (is_array($value)) {
1428
-                $info[ $key ] = $this->_strip_objects($value);
1428
+                $info[$key] = $this->_strip_objects($value);
1429 1429
             } elseif (is_object($value)) {
1430 1430
                 $object_class = get_class($value);
1431
-                $info[ $object_class ] = array();
1432
-                $info[ $object_class ]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1431
+                $info[$object_class] = array();
1432
+                $info[$object_class]['ID'] = method_exists($value, 'ID') ? $value->ID() : 0;
1433 1433
                 if (method_exists($value, 'status')) {
1434
-                    $info[ $object_class ]['status'] = $value->status();
1434
+                    $info[$object_class]['status'] = $value->status();
1435 1435
                 } elseif (method_exists($value, 'status_ID')) {
1436
-                    $info[ $object_class ]['status'] = $value->status_ID();
1436
+                    $info[$object_class]['status'] = $value->status_ID();
1437 1437
                 }
1438
-                unset($info[ $key ]);
1438
+                unset($info[$key]);
1439 1439
             }
1440 1440
         }
1441 1441
         return (array) $info;
Please login to merge, or discard this patch.
caffeinated/admin/new/pricing/Prices_List_Table.class.php 2 patches
Indentation   +216 added lines, -216 removed lines patch added patch discarded remove patch
@@ -16,220 +16,220 @@
 block discarded – undo
16 16
 class Prices_List_Table extends EE_Admin_List_Table
17 17
 {
18 18
 
19
-    private $_PRT;
20
-
21
-    /**
22
-     * Array of price types.
23
-     *
24
-     * @var EE_Price_Type[]
25
-     */
26
-    protected $_price_types = array();
27
-
28
-    public function __construct($admin_page)
29
-    {
30
-        parent::__construct($admin_page);
31
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
32
-        $this->_PRT = EEM_Price_Type::instance();
33
-        $this->_price_types = $this->_PRT->get_all_deleted_and_undeleted();
34
-    }
35
-
36
-
37
-    protected function _setup_data()
38
-    {
39
-        $trashed = $this->_admin_page->get_view() == 'trashed' ? true : false;
40
-        $this->_data = $this->_admin_page->get_prices_overview_data($this->_per_page, false, $trashed);
41
-        $this->_all_data_count = $this->_admin_page->get_prices_overview_data($this->_per_page, true, false);
42
-        $this->_trashed_count = $this->_admin_page->get_prices_overview_data($this->_per_page, true, true);
43
-    }
44
-
45
-
46
-    protected function _set_properties()
47
-    {
48
-        $this->_wp_list_args = array(
49
-            'singular' => __('price', 'event_espresso'),
50
-            'plural'   => __('prices', 'event_espresso'),
51
-            'ajax'     => true,
52
-            'screen'   => $this->_admin_page->get_current_screen()->id,
53
-        );
54
-
55
-        $this->_columns = array(
56
-            'cb'          => '<input type="checkbox" />', // Render a checkbox instead of text
57
-            'name'        => __('Name', 'event_espresso'),
58
-            'type'        => __('Price Type', 'event_espresso'),
59
-            'description' => __('Description', 'event_espresso'),
60
-            'amount'      => __('Amount', 'event_espresso'),
61
-        );
62
-
63
-        $this->_sortable_columns = array(
64
-            // true means its already sorted
65
-            'name'   => array('name' => false),
66
-            'type'   => array('type' => false),
67
-            'amount' => array('amount' => false),
68
-        );
69
-
70
-        $this->_hidden_columns = array();
71
-
72
-        $this->_ajax_sorting_callback = 'update_prices_order';
73
-    }
74
-
75
-
76
-    protected function _get_table_filters()
77
-    {
78
-    }
79
-
80
-
81
-    protected function _add_view_counts()
82
-    {
83
-        $this->_views['all']['count'] = $this->_all_data_count;
84
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_default_prices', 'pricing_trash_price')) {
85
-            $this->_views['trashed']['count'] = $this->_trashed_count;
86
-        }
87
-    }
88
-
89
-
90
-    /**
91
-     * overriding parent method so that we can make sure the row isn't sortable for certain items
92
-     *
93
-     * @param  object $item the current item
94
-     * @return string
95
-     */
96
-    protected function _get_row_class($item)
97
-    {
98
-        static $row_class = '';
99
-        $row_class = ($row_class == '' ? 'alternate' : '');
100
-
101
-        $new_row = $row_class;
102
-
103
-        if ($item->type_obj()->base_type() !== 1 && $item->type_obj()->base_type() !== 4) {
104
-            $new_row .= ' rowsortable';
105
-        }
106
-
107
-        return ' class="' . $new_row . '"';
108
-    }
109
-
110
-
111
-    public function column_cb($item)
112
-    {
113
-        if ($item->type_obj()->base_type() !== 1) {
114
-            return sprintf(
115
-                '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />',
116
-                $item->ID()
117
-            );
118
-        }
119
-        return '';
120
-    }
121
-
122
-
123
-    public function column_name($item)
124
-    {
125
-
126
-        // Build row actions
127
-        $actions = array();
128
-        // edit price link
129
-        if (EE_Registry::instance()->CAP->current_user_can(
130
-            'ee_edit_default_price',
131
-            'pricing_edit_price',
132
-            $item->ID()
133
-        )) {
134
-            $edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
135
-                'action' => 'edit_price',
136
-                'id'     => $item->ID(),
137
-            ), PRICING_ADMIN_URL);
138
-            $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
139
-                               . esc_attr__('Edit Price', 'event_espresso') . '">'
140
-                               . __('Edit', 'event_espresso') . '</a>';
141
-        }
142
-
143
-        $name_link = EE_Registry::instance()->CAP->current_user_can(
144
-            'ee_edit_default_price',
145
-            'edit_price',
146
-            $item->ID()
147
-        )
148
-            ? '<a href="' . $edit_lnk_url . '" title="'
149
-              . esc_attr__('Edit Price', 'event_espresso') . '">'
150
-              . stripslashes($item->name()) . '</a>'
151
-            : $item->name();
152
-
153
-        if ($item->type_obj()->base_type() !== 1) {
154
-            if ($this->_view == 'all') {
155
-                // trash price link
156
-                if (EE_Registry::instance()->CAP->current_user_can(
157
-                    'ee_delete_default_price',
158
-                    'pricing_trash_price',
159
-                    $item->ID()
160
-                )) {
161
-                    $trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
162
-                        'action'   => 'trash_price',
163
-                        'id'       => $item->ID(),
164
-                        'noheader' => true,
165
-                    ), PRICING_ADMIN_URL);
166
-                    $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
167
-                                        . esc_attr__('Move Price to Trash', 'event_espresso') . '">'
168
-                                        . __('Move to Trash', 'event_espresso') . '</a>';
169
-                }
170
-            } else {
171
-                if (EE_Registry::instance()->CAP->current_user_can(
172
-                    'ee_delete_default_price',
173
-                    'pricing_restore_price',
174
-                    $item->ID()
175
-                )) {
176
-                    // restore price link
177
-                    $restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
178
-                        'action'   => 'restore_price',
179
-                        'id'       => $item->ID(),
180
-                        'noheader' => true,
181
-                    ), PRICING_ADMIN_URL);
182
-                    $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
183
-                                          . esc_attr__('Restore Price', 'event_espresso') . '">'
184
-                                          . __('Restore', 'event_espresso') . '</a>';
185
-                }
186
-
187
-                // delete price link
188
-                if (EE_Registry::instance()->CAP->current_user_can(
189
-                    'ee_delete_default_price',
190
-                    'pricing_delete_price',
191
-                    $item->ID()
192
-                )) {
193
-                    $delete_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
194
-                        'action'   => 'delete_price',
195
-                        'id'       => $item->ID(),
196
-                        'noheader' => true,
197
-                    ), PRICING_ADMIN_URL);
198
-                    $actions['delete'] = '<a href="' . $delete_lnk_url . '" title="'
199
-                                         . esc_attr__('Delete Price Permanently', 'event_espresso') . '">'
200
-                                         . __('Delete Permanently', 'event_espresso') . '</a>';
201
-                }
202
-            }
203
-        }
204
-
205
-        // Return the name contents
206
-        return sprintf(
207
-            '%1$s <span style="color:silver">(id:%2$s)</span>%3$s',
208
-            $name_link,
209
-            $item->ID(),
210
-            $this->row_actions($actions)
211
-        );
212
-    }
213
-
214
-
215
-    public function column_type($item)
216
-    {
217
-        return $this->_price_types[ $item->type() ]->name();
218
-    }
219
-
220
-
221
-    public function column_description($item)
222
-    {
223
-        return stripslashes($item->desc());
224
-    }
225
-
226
-
227
-    public function column_amount($item)
228
-    {
229
-        if ($this->_price_types[ $item->type() ]->is_percent()) {
230
-            return '<div class="pad-amnt-rght">' . number_format($item->amount(), 1) . '%</div>';
231
-        } else {
232
-            return '<div class="pad-amnt-rght">' . EEH_Template::format_currency($item->amount()) . '</div>';
233
-        }
234
-    }
19
+	private $_PRT;
20
+
21
+	/**
22
+	 * Array of price types.
23
+	 *
24
+	 * @var EE_Price_Type[]
25
+	 */
26
+	protected $_price_types = array();
27
+
28
+	public function __construct($admin_page)
29
+	{
30
+		parent::__construct($admin_page);
31
+		require_once(EE_MODELS . 'EEM_Price_Type.model.php');
32
+		$this->_PRT = EEM_Price_Type::instance();
33
+		$this->_price_types = $this->_PRT->get_all_deleted_and_undeleted();
34
+	}
35
+
36
+
37
+	protected function _setup_data()
38
+	{
39
+		$trashed = $this->_admin_page->get_view() == 'trashed' ? true : false;
40
+		$this->_data = $this->_admin_page->get_prices_overview_data($this->_per_page, false, $trashed);
41
+		$this->_all_data_count = $this->_admin_page->get_prices_overview_data($this->_per_page, true, false);
42
+		$this->_trashed_count = $this->_admin_page->get_prices_overview_data($this->_per_page, true, true);
43
+	}
44
+
45
+
46
+	protected function _set_properties()
47
+	{
48
+		$this->_wp_list_args = array(
49
+			'singular' => __('price', 'event_espresso'),
50
+			'plural'   => __('prices', 'event_espresso'),
51
+			'ajax'     => true,
52
+			'screen'   => $this->_admin_page->get_current_screen()->id,
53
+		);
54
+
55
+		$this->_columns = array(
56
+			'cb'          => '<input type="checkbox" />', // Render a checkbox instead of text
57
+			'name'        => __('Name', 'event_espresso'),
58
+			'type'        => __('Price Type', 'event_espresso'),
59
+			'description' => __('Description', 'event_espresso'),
60
+			'amount'      => __('Amount', 'event_espresso'),
61
+		);
62
+
63
+		$this->_sortable_columns = array(
64
+			// true means its already sorted
65
+			'name'   => array('name' => false),
66
+			'type'   => array('type' => false),
67
+			'amount' => array('amount' => false),
68
+		);
69
+
70
+		$this->_hidden_columns = array();
71
+
72
+		$this->_ajax_sorting_callback = 'update_prices_order';
73
+	}
74
+
75
+
76
+	protected function _get_table_filters()
77
+	{
78
+	}
79
+
80
+
81
+	protected function _add_view_counts()
82
+	{
83
+		$this->_views['all']['count'] = $this->_all_data_count;
84
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_default_prices', 'pricing_trash_price')) {
85
+			$this->_views['trashed']['count'] = $this->_trashed_count;
86
+		}
87
+	}
88
+
89
+
90
+	/**
91
+	 * overriding parent method so that we can make sure the row isn't sortable for certain items
92
+	 *
93
+	 * @param  object $item the current item
94
+	 * @return string
95
+	 */
96
+	protected function _get_row_class($item)
97
+	{
98
+		static $row_class = '';
99
+		$row_class = ($row_class == '' ? 'alternate' : '');
100
+
101
+		$new_row = $row_class;
102
+
103
+		if ($item->type_obj()->base_type() !== 1 && $item->type_obj()->base_type() !== 4) {
104
+			$new_row .= ' rowsortable';
105
+		}
106
+
107
+		return ' class="' . $new_row . '"';
108
+	}
109
+
110
+
111
+	public function column_cb($item)
112
+	{
113
+		if ($item->type_obj()->base_type() !== 1) {
114
+			return sprintf(
115
+				'<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />',
116
+				$item->ID()
117
+			);
118
+		}
119
+		return '';
120
+	}
121
+
122
+
123
+	public function column_name($item)
124
+	{
125
+
126
+		// Build row actions
127
+		$actions = array();
128
+		// edit price link
129
+		if (EE_Registry::instance()->CAP->current_user_can(
130
+			'ee_edit_default_price',
131
+			'pricing_edit_price',
132
+			$item->ID()
133
+		)) {
134
+			$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
135
+				'action' => 'edit_price',
136
+				'id'     => $item->ID(),
137
+			), PRICING_ADMIN_URL);
138
+			$actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
139
+							   . esc_attr__('Edit Price', 'event_espresso') . '">'
140
+							   . __('Edit', 'event_espresso') . '</a>';
141
+		}
142
+
143
+		$name_link = EE_Registry::instance()->CAP->current_user_can(
144
+			'ee_edit_default_price',
145
+			'edit_price',
146
+			$item->ID()
147
+		)
148
+			? '<a href="' . $edit_lnk_url . '" title="'
149
+			  . esc_attr__('Edit Price', 'event_espresso') . '">'
150
+			  . stripslashes($item->name()) . '</a>'
151
+			: $item->name();
152
+
153
+		if ($item->type_obj()->base_type() !== 1) {
154
+			if ($this->_view == 'all') {
155
+				// trash price link
156
+				if (EE_Registry::instance()->CAP->current_user_can(
157
+					'ee_delete_default_price',
158
+					'pricing_trash_price',
159
+					$item->ID()
160
+				)) {
161
+					$trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
162
+						'action'   => 'trash_price',
163
+						'id'       => $item->ID(),
164
+						'noheader' => true,
165
+					), PRICING_ADMIN_URL);
166
+					$actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
167
+										. esc_attr__('Move Price to Trash', 'event_espresso') . '">'
168
+										. __('Move to Trash', 'event_espresso') . '</a>';
169
+				}
170
+			} else {
171
+				if (EE_Registry::instance()->CAP->current_user_can(
172
+					'ee_delete_default_price',
173
+					'pricing_restore_price',
174
+					$item->ID()
175
+				)) {
176
+					// restore price link
177
+					$restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
178
+						'action'   => 'restore_price',
179
+						'id'       => $item->ID(),
180
+						'noheader' => true,
181
+					), PRICING_ADMIN_URL);
182
+					$actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
183
+										  . esc_attr__('Restore Price', 'event_espresso') . '">'
184
+										  . __('Restore', 'event_espresso') . '</a>';
185
+				}
186
+
187
+				// delete price link
188
+				if (EE_Registry::instance()->CAP->current_user_can(
189
+					'ee_delete_default_price',
190
+					'pricing_delete_price',
191
+					$item->ID()
192
+				)) {
193
+					$delete_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array(
194
+						'action'   => 'delete_price',
195
+						'id'       => $item->ID(),
196
+						'noheader' => true,
197
+					), PRICING_ADMIN_URL);
198
+					$actions['delete'] = '<a href="' . $delete_lnk_url . '" title="'
199
+										 . esc_attr__('Delete Price Permanently', 'event_espresso') . '">'
200
+										 . __('Delete Permanently', 'event_espresso') . '</a>';
201
+				}
202
+			}
203
+		}
204
+
205
+		// Return the name contents
206
+		return sprintf(
207
+			'%1$s <span style="color:silver">(id:%2$s)</span>%3$s',
208
+			$name_link,
209
+			$item->ID(),
210
+			$this->row_actions($actions)
211
+		);
212
+	}
213
+
214
+
215
+	public function column_type($item)
216
+	{
217
+		return $this->_price_types[ $item->type() ]->name();
218
+	}
219
+
220
+
221
+	public function column_description($item)
222
+	{
223
+		return stripslashes($item->desc());
224
+	}
225
+
226
+
227
+	public function column_amount($item)
228
+	{
229
+		if ($this->_price_types[ $item->type() ]->is_percent()) {
230
+			return '<div class="pad-amnt-rght">' . number_format($item->amount(), 1) . '%</div>';
231
+		} else {
232
+			return '<div class="pad-amnt-rght">' . EEH_Template::format_currency($item->amount()) . '</div>';
233
+		}
234
+	}
235 235
 }
Please login to merge, or discard this patch.
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@  discard block
 block discarded – undo
28 28
     public function __construct($admin_page)
29 29
     {
30 30
         parent::__construct($admin_page);
31
-        require_once(EE_MODELS . 'EEM_Price_Type.model.php');
31
+        require_once(EE_MODELS.'EEM_Price_Type.model.php');
32 32
         $this->_PRT = EEM_Price_Type::instance();
33 33
         $this->_price_types = $this->_PRT->get_all_deleted_and_undeleted();
34 34
     }
@@ -104,7 +104,7 @@  discard block
 block discarded – undo
104 104
             $new_row .= ' rowsortable';
105 105
         }
106 106
 
107
-        return ' class="' . $new_row . '"';
107
+        return ' class="'.$new_row.'"';
108 108
     }
109 109
 
110 110
 
@@ -135,9 +135,9 @@  discard block
 block discarded – undo
135 135
                 'action' => 'edit_price',
136 136
                 'id'     => $item->ID(),
137 137
             ), PRICING_ADMIN_URL);
138
-            $actions['edit'] = '<a href="' . $edit_lnk_url . '" title="'
139
-                               . esc_attr__('Edit Price', 'event_espresso') . '">'
140
-                               . __('Edit', 'event_espresso') . '</a>';
138
+            $actions['edit'] = '<a href="'.$edit_lnk_url.'" title="'
139
+                               . esc_attr__('Edit Price', 'event_espresso').'">'
140
+                               . __('Edit', 'event_espresso').'</a>';
141 141
         }
142 142
 
143 143
         $name_link = EE_Registry::instance()->CAP->current_user_can(
@@ -145,9 +145,9 @@  discard block
 block discarded – undo
145 145
             'edit_price',
146 146
             $item->ID()
147 147
         )
148
-            ? '<a href="' . $edit_lnk_url . '" title="'
149
-              . esc_attr__('Edit Price', 'event_espresso') . '">'
150
-              . stripslashes($item->name()) . '</a>'
148
+            ? '<a href="'.$edit_lnk_url.'" title="'
149
+              . esc_attr__('Edit Price', 'event_espresso').'">'
150
+              . stripslashes($item->name()).'</a>'
151 151
             : $item->name();
152 152
 
153 153
         if ($item->type_obj()->base_type() !== 1) {
@@ -163,9 +163,9 @@  discard block
 block discarded – undo
163 163
                         'id'       => $item->ID(),
164 164
                         'noheader' => true,
165 165
                     ), PRICING_ADMIN_URL);
166
-                    $actions['trash'] = '<a href="' . $trash_lnk_url . '" title="'
167
-                                        . esc_attr__('Move Price to Trash', 'event_espresso') . '">'
168
-                                        . __('Move to Trash', 'event_espresso') . '</a>';
166
+                    $actions['trash'] = '<a href="'.$trash_lnk_url.'" title="'
167
+                                        . esc_attr__('Move Price to Trash', 'event_espresso').'">'
168
+                                        . __('Move to Trash', 'event_espresso').'</a>';
169 169
                 }
170 170
             } else {
171 171
                 if (EE_Registry::instance()->CAP->current_user_can(
@@ -179,9 +179,9 @@  discard block
 block discarded – undo
179 179
                         'id'       => $item->ID(),
180 180
                         'noheader' => true,
181 181
                     ), PRICING_ADMIN_URL);
182
-                    $actions['restore'] = '<a href="' . $restore_lnk_url . '" title="'
183
-                                          . esc_attr__('Restore Price', 'event_espresso') . '">'
184
-                                          . __('Restore', 'event_espresso') . '</a>';
182
+                    $actions['restore'] = '<a href="'.$restore_lnk_url.'" title="'
183
+                                          . esc_attr__('Restore Price', 'event_espresso').'">'
184
+                                          . __('Restore', 'event_espresso').'</a>';
185 185
                 }
186 186
 
187 187
                 // delete price link
@@ -195,9 +195,9 @@  discard block
 block discarded – undo
195 195
                         'id'       => $item->ID(),
196 196
                         'noheader' => true,
197 197
                     ), PRICING_ADMIN_URL);
198
-                    $actions['delete'] = '<a href="' . $delete_lnk_url . '" title="'
199
-                                         . esc_attr__('Delete Price Permanently', 'event_espresso') . '">'
200
-                                         . __('Delete Permanently', 'event_espresso') . '</a>';
198
+                    $actions['delete'] = '<a href="'.$delete_lnk_url.'" title="'
199
+                                         . esc_attr__('Delete Price Permanently', 'event_espresso').'">'
200
+                                         . __('Delete Permanently', 'event_espresso').'</a>';
201 201
                 }
202 202
             }
203 203
         }
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
 
215 215
     public function column_type($item)
216 216
     {
217
-        return $this->_price_types[ $item->type() ]->name();
217
+        return $this->_price_types[$item->type()]->name();
218 218
     }
219 219
 
220 220
 
@@ -226,10 +226,10 @@  discard block
 block discarded – undo
226 226
 
227 227
     public function column_amount($item)
228 228
     {
229
-        if ($this->_price_types[ $item->type() ]->is_percent()) {
230
-            return '<div class="pad-amnt-rght">' . number_format($item->amount(), 1) . '%</div>';
229
+        if ($this->_price_types[$item->type()]->is_percent()) {
230
+            return '<div class="pad-amnt-rght">'.number_format($item->amount(), 1).'%</div>';
231 231
         } else {
232
-            return '<div class="pad-amnt-rght">' . EEH_Template::format_currency($item->amount()) . '</div>';
232
+            return '<div class="pad-amnt-rght">'.EEH_Template::format_currency($item->amount()).'</div>';
233 233
         }
234 234
     }
235 235
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Taxes.class.php 2 patches
Indentation   +123 added lines, -123 removed lines patch added patch discarded remove patch
@@ -10,138 +10,138 @@
 block discarded – undo
10 10
 class EE_Taxes extends EE_Base
11 11
 {
12 12
 
13
-    /**
14
-     * This is used for when EE_Taxes is used statically by the admin
15
-     *
16
-     * @var array
17
-     */
18
-    private static $_subtotal = array();
13
+	/**
14
+	 * This is used for when EE_Taxes is used statically by the admin
15
+	 *
16
+	 * @var array
17
+	 */
18
+	private static $_subtotal = array();
19 19
 
20
-    /**
21
-     * This holds an array of EE_Price objects that are of PRT_ID == 4 (tax price types)
22
-     *
23
-     * @var EE_Price[]
24
-     */
25
-    private static $_default_taxes = array();
20
+	/**
21
+	 * This holds an array of EE_Price objects that are of PRT_ID == 4 (tax price types)
22
+	 *
23
+	 * @var EE_Price[]
24
+	 */
25
+	private static $_default_taxes = array();
26 26
 
27 27
 
28
-    /**
29
-     * This method simply calculates the total taxes for a given ticket (by pulling the prices attached to the ticket
30
-     * and applying default taxes to it). Note: this is just an intermediary helper method added to facilitate quick
31
-     * calc of taxes for tickets listed in the event editor.
32
-     *
33
-     * @param  EE_Ticket $ticket incoming EE_Ticket
34
-     * @return float             total taxes to apply to ticket.
35
-     * @throws \EE_Error
36
-     */
37
-    public static function get_total_taxes_for_admin(EE_Ticket $ticket)
38
-    {
39
-        $tax = 0;
40
-        $total_tax = 0;
41
-        // This first checks to see if the given ticket is taxable.
42
-        if (! $ticket->get('TKT_taxable')) {
43
-            return $tax;
44
-        }
45
-        // get subtotal (notice we're only retrieving a subtotal if there isn't one given)
46
-        $subtotal = self::get_subtotal_for_admin($ticket);
47
-        // get taxes
48
-        $taxes = self::get_taxes_for_admin();
49
-        // apply taxes to subtotal
50
-        foreach ($taxes as $tax) {
51
-            // assuming taxes are not cumulative
52
-            $total_tax += $subtotal * $tax->get('PRC_amount') / 100;
53
-        }
54
-        return $total_tax;
55
-    }
28
+	/**
29
+	 * This method simply calculates the total taxes for a given ticket (by pulling the prices attached to the ticket
30
+	 * and applying default taxes to it). Note: this is just an intermediary helper method added to facilitate quick
31
+	 * calc of taxes for tickets listed in the event editor.
32
+	 *
33
+	 * @param  EE_Ticket $ticket incoming EE_Ticket
34
+	 * @return float             total taxes to apply to ticket.
35
+	 * @throws \EE_Error
36
+	 */
37
+	public static function get_total_taxes_for_admin(EE_Ticket $ticket)
38
+	{
39
+		$tax = 0;
40
+		$total_tax = 0;
41
+		// This first checks to see if the given ticket is taxable.
42
+		if (! $ticket->get('TKT_taxable')) {
43
+			return $tax;
44
+		}
45
+		// get subtotal (notice we're only retrieving a subtotal if there isn't one given)
46
+		$subtotal = self::get_subtotal_for_admin($ticket);
47
+		// get taxes
48
+		$taxes = self::get_taxes_for_admin();
49
+		// apply taxes to subtotal
50
+		foreach ($taxes as $tax) {
51
+			// assuming taxes are not cumulative
52
+			$total_tax += $subtotal * $tax->get('PRC_amount') / 100;
53
+		}
54
+		return $total_tax;
55
+	}
56 56
 
57 57
 
58
-    /**
59
-     * Gets the total percentage of tax that should be applied to taxable line items
60
-     *
61
-     * @return float the percentage of tax that should be added to taxable items
62
-     * @throws \EE_Error
63
-     * eg 20 for %20 tax (NOT 0.20, which
64
-     */
65
-    public static function get_total_taxes_percentage()
66
-    {
67
-        $total_tax_percent = 0;
68
-        foreach (self::get_taxes_for_admin() as $tax_price) {
69
-            $total_tax_percent += $tax_price->get('PRC_amount');
70
-        }
71
-        return $total_tax_percent;
72
-    }
58
+	/**
59
+	 * Gets the total percentage of tax that should be applied to taxable line items
60
+	 *
61
+	 * @return float the percentage of tax that should be added to taxable items
62
+	 * @throws \EE_Error
63
+	 * eg 20 for %20 tax (NOT 0.20, which
64
+	 */
65
+	public static function get_total_taxes_percentage()
66
+	{
67
+		$total_tax_percent = 0;
68
+		foreach (self::get_taxes_for_admin() as $tax_price) {
69
+			$total_tax_percent += $tax_price->get('PRC_amount');
70
+		}
71
+		return $total_tax_percent;
72
+	}
73 73
 
74 74
 
75
-    /**
76
-     * @param EE_Ticket $ticket
77
-     * @return float
78
-     * @throws \EE_Error
79
-     */
80
-    public static function get_subtotal_for_admin(EE_Ticket $ticket)
81
-    {
82
-        $TKT_ID = $ticket->ID();
83
-        return isset(self::$_subtotal[ $TKT_ID ])
84
-            ? self::$_subtotal[ $TKT_ID ]
85
-            : self::_get_subtotal_for_admin($ticket);
86
-    }
75
+	/**
76
+	 * @param EE_Ticket $ticket
77
+	 * @return float
78
+	 * @throws \EE_Error
79
+	 */
80
+	public static function get_subtotal_for_admin(EE_Ticket $ticket)
81
+	{
82
+		$TKT_ID = $ticket->ID();
83
+		return isset(self::$_subtotal[ $TKT_ID ])
84
+			? self::$_subtotal[ $TKT_ID ]
85
+			: self::_get_subtotal_for_admin($ticket);
86
+	}
87 87
 
88 88
 
89
-    /**
90
-     * simply take an incoming ticket and calculate the subtotal for the ticket
91
-     *
92
-     * @param  EE_Ticket $ticket
93
-     * @return float     subtotal calculated from all EE_Price[] on Ticket.
94
-     * @throws \EE_Error
95
-     */
96
-    private static function _get_subtotal_for_admin(EE_Ticket $ticket)
97
-    {
98
-        $subtotal = 0;
99
-        // get all prices
100
-        $prices = $ticket->get_many_related(
101
-            'Price',
102
-            array(
103
-                'default_where_conditions' => 'none',
104
-                'order_by'                 => array('PRC_order' => 'ASC'),
105
-            )
106
-        );
107
-        // let's loop through them (base price is always the first item)
108
-        foreach ($prices as $price) {
109
-            if ($price instanceof EE_Price) {
110
-                $price_type = $price->type_obj();
111
-                if ($price_type instanceof EE_Price_Type) {
112
-                    switch ($price->type_obj()->base_type()) {
113
-                        case 1: // base price
114
-                        case 3: // surcharges
115
-                            $subtotal += $price->is_percent() ? $subtotal * $price->get('PRC_amount') / 100
116
-                                : $price->get('PRC_amount');
117
-                            break;
118
-                        case 2: // discounts
119
-                            $subtotal -= $price->is_percent() ? $subtotal * $price->get('PRC_amount') / 100
120
-                                : $price->get('PRC_amount');
121
-                            break;
122
-                    }
123
-                }
124
-            }
125
-        }
126
-        $TKT_ID = $ticket->ID();
127
-        self::$_subtotal = array($TKT_ID => $subtotal);
128
-        return $subtotal;
129
-    }
89
+	/**
90
+	 * simply take an incoming ticket and calculate the subtotal for the ticket
91
+	 *
92
+	 * @param  EE_Ticket $ticket
93
+	 * @return float     subtotal calculated from all EE_Price[] on Ticket.
94
+	 * @throws \EE_Error
95
+	 */
96
+	private static function _get_subtotal_for_admin(EE_Ticket $ticket)
97
+	{
98
+		$subtotal = 0;
99
+		// get all prices
100
+		$prices = $ticket->get_many_related(
101
+			'Price',
102
+			array(
103
+				'default_where_conditions' => 'none',
104
+				'order_by'                 => array('PRC_order' => 'ASC'),
105
+			)
106
+		);
107
+		// let's loop through them (base price is always the first item)
108
+		foreach ($prices as $price) {
109
+			if ($price instanceof EE_Price) {
110
+				$price_type = $price->type_obj();
111
+				if ($price_type instanceof EE_Price_Type) {
112
+					switch ($price->type_obj()->base_type()) {
113
+						case 1: // base price
114
+						case 3: // surcharges
115
+							$subtotal += $price->is_percent() ? $subtotal * $price->get('PRC_amount') / 100
116
+								: $price->get('PRC_amount');
117
+							break;
118
+						case 2: // discounts
119
+							$subtotal -= $price->is_percent() ? $subtotal * $price->get('PRC_amount') / 100
120
+								: $price->get('PRC_amount');
121
+							break;
122
+					}
123
+				}
124
+			}
125
+		}
126
+		$TKT_ID = $ticket->ID();
127
+		self::$_subtotal = array($TKT_ID => $subtotal);
128
+		return $subtotal;
129
+	}
130 130
 
131 131
 
132
-    /**
133
-     * get all default prices that are a Tax price type (PRT_ID = 4) and return
134
-     *
135
-     * @return EE_Price[] EE_Price objects that have PRT_ID == 4
136
-     * @throws \EE_Error
137
-     */
138
-    public static function get_taxes_for_admin()
139
-    {
140
-        if (empty(self::$_default_taxes)) {
141
-            self::$_default_taxes = EE_Registry::instance()->load_model('Price')->get_all(
142
-                array(array('Price_Type.PBT_ID' => 4))
143
-            );
144
-        }
145
-        return self::$_default_taxes;
146
-    }
132
+	/**
133
+	 * get all default prices that are a Tax price type (PRT_ID = 4) and return
134
+	 *
135
+	 * @return EE_Price[] EE_Price objects that have PRT_ID == 4
136
+	 * @throws \EE_Error
137
+	 */
138
+	public static function get_taxes_for_admin()
139
+	{
140
+		if (empty(self::$_default_taxes)) {
141
+			self::$_default_taxes = EE_Registry::instance()->load_model('Price')->get_all(
142
+				array(array('Price_Type.PBT_ID' => 4))
143
+			);
144
+		}
145
+		return self::$_default_taxes;
146
+	}
147 147
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
         $tax = 0;
40 40
         $total_tax = 0;
41 41
         // This first checks to see if the given ticket is taxable.
42
-        if (! $ticket->get('TKT_taxable')) {
42
+        if ( ! $ticket->get('TKT_taxable')) {
43 43
             return $tax;
44 44
         }
45 45
         // get subtotal (notice we're only retrieving a subtotal if there isn't one given)
@@ -80,8 +80,8 @@  discard block
 block discarded – undo
80 80
     public static function get_subtotal_for_admin(EE_Ticket $ticket)
81 81
     {
82 82
         $TKT_ID = $ticket->ID();
83
-        return isset(self::$_subtotal[ $TKT_ID ])
84
-            ? self::$_subtotal[ $TKT_ID ]
83
+        return isset(self::$_subtotal[$TKT_ID])
84
+            ? self::$_subtotal[$TKT_ID]
85 85
             : self::_get_subtotal_for_admin($ticket);
86 86
     }
87 87
 
Please login to merge, or discard this patch.
core/db_classes/EE_Message_Template.class.php 2 patches
Indentation   +169 added lines, -169 removed lines patch added patch discarded remove patch
@@ -13,173 +13,173 @@
 block discarded – undo
13 13
 class EE_Message_Template extends EE_Base_Class
14 14
 {
15 15
 
16
-    /**
17
-     * @param array  $props_n_values
18
-     * @param string $timezone
19
-     * @return EE_Message_Template|mixed
20
-     */
21
-    public static function new_instance($props_n_values = array(), $timezone = '')
22
-    {
23
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone);
24
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone);
25
-    }
26
-
27
-
28
-    /**
29
-     * @param array  $props_n_values
30
-     * @param string $timezone
31
-     * @return EE_Message_Template
32
-     */
33
-    public static function new_instance_from_db($props_n_values = array(), $timezone = '')
34
-    {
35
-        return new self($props_n_values, true, $timezone);
36
-    }
37
-
38
-
39
-    /**
40
-     * @param bool $GRP_ID
41
-     * @throws EE_Error
42
-     */
43
-    public function set_group_template_id($GRP_ID = false)
44
-    {
45
-        if (! $GRP_ID) {
46
-            throw new EE_Error(__('Missing required value for the message template group id', 'event_espresso'));
47
-        }
48
-        $this->set('GRP_ID', $GRP_ID);
49
-    }
50
-
51
-
52
-    /**
53
-     * get Group ID
54
-     *
55
-     * @access public
56
-     * @return int
57
-     */
58
-    public function GRP_ID()
59
-    {
60
-        return $this->get('GRP_ID');
61
-    }
62
-
63
-
64
-    /**
65
-     * get User ID
66
-     *
67
-     * @access public
68
-     * @return int
69
-     */
70
-    public function user()
71
-    {
72
-        return $this->get_first_related('Message_Template_Group')->get('MTP_user_id');
73
-    }
74
-
75
-
76
-    /**
77
-     * get Message Messenger
78
-     *
79
-     * @access public
80
-     * @return string
81
-     */
82
-    public function messenger()
83
-    {
84
-        return $this->get_first_related('Message_Template_Group')->messenger();
85
-    }
86
-
87
-
88
-    /**
89
-     * get Message Messenger OBJECT
90
-     *
91
-     * @access public
92
-     * @return object Messenger Object for the given messenger
93
-     */
94
-    public function messenger_obj()
95
-    {
96
-        return $this->get_first_related('Message_Template_Group')->messenger_obj();
97
-    }
98
-
99
-
100
-    /**
101
-     * get Message Type
102
-     *
103
-     * @access public
104
-     * @return string
105
-     */
106
-    public function message_type()
107
-    {
108
-        return $this->get_first_related('Message_Template_Group')->message_type();
109
-    }
110
-
111
-
112
-    /**
113
-     * get Message type OBJECT
114
-     *
115
-     * @access public
116
-     * @return object  Message Type object for the given message type
117
-     */
118
-    public function message_type_obj()
119
-    {
120
-        return $this->get_first_related('Message_Template_Group')->message_type_obj();
121
-    }
122
-
123
-
124
-    /**
125
-     * This returns the set context array configured in the message type object
126
-     *
127
-     * @access public
128
-     * @return array array of contexts and their configuration.
129
-     */
130
-    public function contexts_config()
131
-    {
132
-        return $this->get_first_related('Message_Template_Group')->contexts_config();
133
-    }
134
-
135
-
136
-    /**
137
-     * This returns the context_label for contexts as set in the message type object
138
-     *
139
-     * @access public
140
-     * @return string label for "context"
141
-     */
142
-    public function context_label()
143
-    {
144
-        return $this->get_first_related('Message_Template_Group')->context_label();
145
-    }
146
-
147
-
148
-    /**
149
-     * this returns if the template group this template belongs to is global
150
-     *
151
-     * @return boolean true if it is, false if it isn't
152
-     */
153
-    public function is_global()
154
-    {
155
-        return $this->get_first_related('Message_Template_Group')->is_global();
156
-    }
157
-
158
-
159
-    /**
160
-     * this returns if the template group this template belongs to is active (i.e. turned "on" or not)
161
-     *
162
-     * @return boolean true if it is, false if it isn't
163
-     */
164
-    public function is_active()
165
-    {
166
-        return $this->get_first_related('Message_Template_Group')->is_active();
167
-    }
168
-
169
-
170
-    /**
171
-     * This will return an array of shortcodes => labels from the messenger and message_type objects associated with
172
-     * this template.
173
-     *
174
-     * @access public
175
-     * @param string $context what context we're going to return shortcodes for
176
-     * @param array  $fields  what fields we're returning valid shortcodes for.  If empty then we assume all fields are
177
-     *                        to be merged and returned.
178
-     * @return mixed (array|bool) an array of shortcodes in the format array( '[shortcode] => 'label') OR FALSE if no
179
-     *               shortcodes found.
180
-     */
181
-    public function get_shortcodes($context, $fields = array())
182
-    {
183
-        return $this->get_first_related('Message_Template_Group')->get_shortcodes($context, $fields);
184
-    }
16
+	/**
17
+	 * @param array  $props_n_values
18
+	 * @param string $timezone
19
+	 * @return EE_Message_Template|mixed
20
+	 */
21
+	public static function new_instance($props_n_values = array(), $timezone = '')
22
+	{
23
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone);
24
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone);
25
+	}
26
+
27
+
28
+	/**
29
+	 * @param array  $props_n_values
30
+	 * @param string $timezone
31
+	 * @return EE_Message_Template
32
+	 */
33
+	public static function new_instance_from_db($props_n_values = array(), $timezone = '')
34
+	{
35
+		return new self($props_n_values, true, $timezone);
36
+	}
37
+
38
+
39
+	/**
40
+	 * @param bool $GRP_ID
41
+	 * @throws EE_Error
42
+	 */
43
+	public function set_group_template_id($GRP_ID = false)
44
+	{
45
+		if (! $GRP_ID) {
46
+			throw new EE_Error(__('Missing required value for the message template group id', 'event_espresso'));
47
+		}
48
+		$this->set('GRP_ID', $GRP_ID);
49
+	}
50
+
51
+
52
+	/**
53
+	 * get Group ID
54
+	 *
55
+	 * @access public
56
+	 * @return int
57
+	 */
58
+	public function GRP_ID()
59
+	{
60
+		return $this->get('GRP_ID');
61
+	}
62
+
63
+
64
+	/**
65
+	 * get User ID
66
+	 *
67
+	 * @access public
68
+	 * @return int
69
+	 */
70
+	public function user()
71
+	{
72
+		return $this->get_first_related('Message_Template_Group')->get('MTP_user_id');
73
+	}
74
+
75
+
76
+	/**
77
+	 * get Message Messenger
78
+	 *
79
+	 * @access public
80
+	 * @return string
81
+	 */
82
+	public function messenger()
83
+	{
84
+		return $this->get_first_related('Message_Template_Group')->messenger();
85
+	}
86
+
87
+
88
+	/**
89
+	 * get Message Messenger OBJECT
90
+	 *
91
+	 * @access public
92
+	 * @return object Messenger Object for the given messenger
93
+	 */
94
+	public function messenger_obj()
95
+	{
96
+		return $this->get_first_related('Message_Template_Group')->messenger_obj();
97
+	}
98
+
99
+
100
+	/**
101
+	 * get Message Type
102
+	 *
103
+	 * @access public
104
+	 * @return string
105
+	 */
106
+	public function message_type()
107
+	{
108
+		return $this->get_first_related('Message_Template_Group')->message_type();
109
+	}
110
+
111
+
112
+	/**
113
+	 * get Message type OBJECT
114
+	 *
115
+	 * @access public
116
+	 * @return object  Message Type object for the given message type
117
+	 */
118
+	public function message_type_obj()
119
+	{
120
+		return $this->get_first_related('Message_Template_Group')->message_type_obj();
121
+	}
122
+
123
+
124
+	/**
125
+	 * This returns the set context array configured in the message type object
126
+	 *
127
+	 * @access public
128
+	 * @return array array of contexts and their configuration.
129
+	 */
130
+	public function contexts_config()
131
+	{
132
+		return $this->get_first_related('Message_Template_Group')->contexts_config();
133
+	}
134
+
135
+
136
+	/**
137
+	 * This returns the context_label for contexts as set in the message type object
138
+	 *
139
+	 * @access public
140
+	 * @return string label for "context"
141
+	 */
142
+	public function context_label()
143
+	{
144
+		return $this->get_first_related('Message_Template_Group')->context_label();
145
+	}
146
+
147
+
148
+	/**
149
+	 * this returns if the template group this template belongs to is global
150
+	 *
151
+	 * @return boolean true if it is, false if it isn't
152
+	 */
153
+	public function is_global()
154
+	{
155
+		return $this->get_first_related('Message_Template_Group')->is_global();
156
+	}
157
+
158
+
159
+	/**
160
+	 * this returns if the template group this template belongs to is active (i.e. turned "on" or not)
161
+	 *
162
+	 * @return boolean true if it is, false if it isn't
163
+	 */
164
+	public function is_active()
165
+	{
166
+		return $this->get_first_related('Message_Template_Group')->is_active();
167
+	}
168
+
169
+
170
+	/**
171
+	 * This will return an array of shortcodes => labels from the messenger and message_type objects associated with
172
+	 * this template.
173
+	 *
174
+	 * @access public
175
+	 * @param string $context what context we're going to return shortcodes for
176
+	 * @param array  $fields  what fields we're returning valid shortcodes for.  If empty then we assume all fields are
177
+	 *                        to be merged and returned.
178
+	 * @return mixed (array|bool) an array of shortcodes in the format array( '[shortcode] => 'label') OR FALSE if no
179
+	 *               shortcodes found.
180
+	 */
181
+	public function get_shortcodes($context, $fields = array())
182
+	{
183
+		return $this->get_first_related('Message_Template_Group')->get_shortcodes($context, $fields);
184
+	}
185 185
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -42,7 +42,7 @@
 block discarded – undo
42 42
      */
43 43
     public function set_group_template_id($GRP_ID = false)
44 44
     {
45
-        if (! $GRP_ID) {
45
+        if ( ! $GRP_ID) {
46 46
             throw new EE_Error(__('Missing required value for the message template group id', 'event_espresso'));
47 47
         }
48 48
         $this->set('GRP_ID', $GRP_ID);
Please login to merge, or discard this patch.
core/db_classes/EE_Ticket_Price.class.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -11,25 +11,25 @@
 block discarded – undo
11 11
 class EE_Ticket_Price extends EE_Base_Class
12 12
 {
13 13
 
14
-    /**
15
-     * @param array  $props_n_values
16
-     * @param string $timezone
17
-     * @return EE_Ticket_Price|mixed
18
-     */
19
-    public static function new_instance($props_n_values = array(), $timezone = '', $date_formats = array())
20
-    {
21
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
22
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
23
-    }
14
+	/**
15
+	 * @param array  $props_n_values
16
+	 * @param string $timezone
17
+	 * @return EE_Ticket_Price|mixed
18
+	 */
19
+	public static function new_instance($props_n_values = array(), $timezone = '', $date_formats = array())
20
+	{
21
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
22
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
23
+	}
24 24
 
25 25
 
26
-    /**
27
-     * @param array  $props_n_values
28
-     * @param string $timezone
29
-     * @return EE_Ticket_Price
30
-     */
31
-    public static function new_instance_from_db($props_n_values = array(), $timezone = '')
32
-    {
33
-        return new self($props_n_values, true, $timezone);
34
-    }
26
+	/**
27
+	 * @param array  $props_n_values
28
+	 * @param string $timezone
29
+	 * @return EE_Ticket_Price
30
+	 */
31
+	public static function new_instance_from_db($props_n_values = array(), $timezone = '')
32
+	{
33
+		return new self($props_n_values, true, $timezone);
34
+	}
35 35
 }
Please login to merge, or discard this patch.