4 * Class CRM_Event_Cart_BAO_Cart
6 class CRM_Event_Cart_BAO_Cart
extends CRM_Event_Cart_DAO_Cart
{
7 public $associations_loaded = FALSE;
9 * event_in_cart_id => $event_in_cart
12 public $events_in_carts = [];
15 * @param array $params
17 * @return CRM_Event_Cart_BAO_Cart
19 public static function add(&$params) {
20 $cart = new CRM_Event_Cart_BAO_Cart();
21 $cart->copyValues($params);
22 $result = $cart->save();
27 * @param int $event_id
31 public function add_event($event_id) {
32 $this->load_associations();
33 $event_in_cart = $this->get_event_in_cart_by_event_id($event_id);
35 return $event_in_cart;
39 'event_id' => $event_id,
40 'event_cart_id' => $this->id
,
42 $event_in_cart = CRM_Event_Cart_BAO_EventInCart
::create($params);
43 $event_in_cart->load_associations($this);
44 $this->events_in_carts
[$event_in_cart->event_id
] = $event_in_cart;
45 return $this->events_in_carts
[$event_in_cart->event_id
];
51 public function add_participant_to_cart($participant) {
52 $event_in_cart = $this->get_event_in_cart_by_event_id($participant->event_id
);
53 if (!$event_in_cart) {
54 $event_in_cart = $this->add_event($participant->event_id
);
56 $event_in_cart->add_participant($participant);
57 $event_in_cart->save();
61 * @param array $params
63 * @return CRM_Event_Cart_BAO_Cart
66 public static function create($params) {
67 $transaction = new CRM_Core_Transaction();
69 $cart = self
::add($params);
71 if (is_a($cart, 'CRM_Core_Error')) {
72 $transaction->rollback();
73 throw new CRM_Core_Exception(ts('There was an error creating an event cart'));
76 $transaction->commit();
84 * @return bool|CRM_Event_Cart_BAO_Cart
86 public static function find_by_id($id) {
87 return self
::find_by_params(['id' => $id]);
91 * @param array $params
93 * @return bool|CRM_Event_Cart_BAO_Cart
95 public static function find_by_params($params) {
96 $cart = new CRM_Event_Cart_BAO_Cart();
97 $cart->copyValues($params);
98 if ($cart->find(TRUE)) {
107 * @return self|bool|CRM_Event_Cart_BAO_Cart
109 public static function find_or_create_for_current_session() {
110 $session = CRM_Core_Session
::singleton();
111 $event_cart_id = $session->get('event_cart_id');
112 $userID = $session->get('userID');
114 if (!is_null($event_cart_id)) {
115 $cart = self
::find_uncompleted_by_id($event_cart_id);
116 if ($cart && $userID) {
117 if (!$cart->user_id
) {
118 $saved_cart = self
::find_uncompleted_by_user_id($userID);
120 $cart->adopt_participants($saved_cart->id
);
121 $saved_cart->delete();
122 $cart->load_associations();
125 $cart->user_id
= $userID;
131 if ($cart === FALSE) {
132 if (is_null($userID)) {
133 $cart = self
::create([]);
136 $cart = self
::find_uncompleted_by_user_id($userID);
137 if ($cart === FALSE) {
138 $cart = self
::create(['user_id' => $userID]);
141 $session->set('event_cart_id', $cart->id
);
149 * @return bool|CRM_Event_Cart_BAO_Cart
151 public static function find_uncompleted_by_id($id) {
152 return self
::find_by_params(['id' => $id, 'completed' => 0]);
156 * @param int $user_id
158 * @return bool|CRM_Event_Cart_BAO_Cart
160 public static function find_uncompleted_by_user_id($user_id) {
161 return self
::find_by_params(['user_id' => $user_id, 'completed' => 0]);
167 public function get_main_events_in_carts() {
168 //return CRM_Event_Cart_BAO_EventInCart::find_all_by_params( array('main_conference_event_id'
170 foreach ($this->events_in_carts
as $event_in_cart) {
171 if (!$event_in_cart->is_child_event()) {
172 $all[] = $event_in_cart;
179 * @param int $main_conference_event_id
183 public function get_events_in_carts_by_main_event_id($main_conference_event_id) {
185 if (!$main_conference_event_id) {
188 foreach ($this->events_in_carts
as $event_in_cart) {
189 if ($event_in_cart->event
->parent_event_id
== $main_conference_event_id) {
190 $all[] = $event_in_cart;
193 usort($all, "CRM_Event_Cart_BAO_Cart::compare_event_dates");
198 * @param $event_in_cart_1
199 * @param $event_in_cart_2
203 public static function compare_event_dates($event_in_cart_1, $event_in_cart_2) {
204 $date_1 = CRM_Utils_Date
::unixTime($event_in_cart_1->event
->start_date
);
205 $date_2 = CRM_Utils_Date
::unixTime($event_in_cart_2->event
->start_date
);
207 if ($date_1 == $date_2) {
212 return ($date_1 < $date_2) ?
-1 : 1;
216 * @param $main_participant
220 public function get_subparticipants($main_participant) {
221 $subparticipants = [];
222 foreach ($this->events_in_carts
as $event_in_cart) {
223 if ($event_in_cart->is_child_event($main_participant->event_id
)) {
224 foreach ($event_in_cart->participants
as $participant) {
225 if ($participant->contact_id
== $main_participant->contact_id
) {
226 $subparticipants[] = $participant;
232 return $subparticipants;
236 * @param int $event_id
240 public function get_event_in_cart_by_event_id($event_id) {
241 return $this->events_in_carts
[$event_id] ??
NULL;
245 * @param int $event_in_cart_id
249 public function &get_event_in_cart_by_id($event_in_cart_id) {
250 foreach ($this->events_in_carts
as $event_in_cart) {
251 if ($event_in_cart->id
== $event_in_cart_id) {
252 return $event_in_cart;
261 public function get_main_event_participants() {
263 foreach ($this->get_main_events_in_carts() as $event_in_cart) {
264 $participants = array_merge($participants, $event_in_cart->participants
);
266 return $participants;
269 public function load_associations() {
270 if ($this->associations_loaded
) {
273 $this->associations_loaded
= TRUE;
274 $this->events_in_carts
= CRM_Event_Cart_BAO_EventInCart
::find_all_by_event_cart_id($this->id
);
275 foreach ($this->events_in_carts
as $event_in_cart) {
276 $event_in_cart->load_associations($this);
282 * @param int $event_in_cart_id
284 * @return bool|CRM_Event_Cart_BAO_EventInCart
286 public function remove_event_in_cart($event_in_cart_id) {
287 $event_in_cart = CRM_Event_Cart_BAO_EventInCart
::find_by_id($event_in_cart_id);
288 if ($event_in_cart) {
289 $sessions_to_remove = $this->get_events_in_carts_by_main_event_id($event_in_cart->event_id
);
290 foreach ($sessions_to_remove as $session) {
291 $this->remove_event_in_cart($session->id
);
293 unset($this->events_in_carts
[$event_in_cart->event_id
]);
294 $event_in_cart->delete();
296 return $event_in_cart;
300 * @param int $participant_id
304 public function get_participant_index_from_id($participant_id) {
305 foreach ($this->events_in_carts
as $event_in_cart) {
307 foreach ($event_in_cart->participants
as $participant) {
308 if ($participant->id
== $participant_id) {
318 * @param array $params
324 public static function retrieve(&$params, &$values) {
325 $cart = self
::find_by_params($params);
326 if ($cart === FALSE) {
327 throw new CRM_Core_Exception(ts('Could not find cart matching %1', [1 => var_export($params, TRUE)]));
329 CRM_Core_DAO
::storeValues($cart, $values);
334 * @param int $from_cart_id
336 public function adopt_participants($from_cart_id) {
338 1 => [$this->id
, 'Integer'],
339 2 => [$from_cart_id, 'Integer'],
341 $sql = "UPDATE civicrm_participant SET cart_id='%1' WHERE cart_id='%2'";
343 CRM_Core_DAO
::executeQuery($sql, $params);