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;
8 /* event_in_cart_id => $event_in_cart */
9 public $events_in_carts = array(
17 public static function add(&$params) {
18 $cart = new CRM_Event_Cart_BAO_Cart();
19 $cart->copyValues($params);
20 $result = $cart->save();
29 public function add_event($event_id) {
30 $this->load_associations();
31 $event_in_cart = $this->get_event_in_cart_by_event_id($event_id);
33 return $event_in_cart;
37 'event_id' => $event_id,
38 'event_cart_id' => $this->id
,
40 $event_in_cart = CRM_Event_Cart_BAO_EventInCart
::create($params);
41 $event_in_cart->load_associations($this);
42 $this->events_in_carts
[$event_in_cart->event_id
] = $event_in_cart;
43 return $this->events_in_carts
[$event_in_cart->event_id
];
49 function add_participant_to_cart($participant) {
50 $event_in_cart = $this->get_event_in_cart_by_event_id($participant->event_id
);
51 if (!$event_in_cart) {
52 $event_in_cart = $this->add_event($participant->event_id
);
54 $event_in_cart->add_participant($participant);
55 $event_in_cart->save();
64 public static function create($params) {
65 $transaction = new CRM_Core_Transaction();
67 $cart = self
::add($params);
69 if (is_a($cart, 'CRM_Core_Error')) {
70 $transaction->rollback();
71 CRM_Core_Error
::fatal(ts('There was an error creating an event cart'));
74 $transaction->commit();
82 * @return bool|CRM_Event_Cart_BAO_Cart
84 public static function find_by_id($id) {
85 return self
::find_by_params(array('id' => $id));
91 * @return bool|CRM_Event_Cart_BAO_Cart
93 public static function find_by_params($params) {
94 $cart = new CRM_Event_Cart_BAO_Cart();
95 $cart->copyValues($params);
96 if ($cart->find(TRUE)) {
105 * @return $this|bool|CRM_Event_Cart_BAO_Cart
107 public static function find_or_create_for_current_session() {
108 $session = CRM_Core_Session
::singleton();
109 $event_cart_id = $session->get('event_cart_id');
110 $userID = $session->get('userID');
112 if (!is_null($event_cart_id)) {
113 $cart = self
::find_uncompleted_by_id($event_cart_id);
114 if ($cart && $userID) {
115 if (!$cart->user_id
) {
116 $saved_cart = self
::find_uncompleted_by_user_id($userID);
118 $cart->adopt_participants($saved_cart->id
);
119 $saved_cart->delete();
120 $cart->load_associations();
123 $cart->user_id
= $userID;
129 if ($cart === FALSE) {
130 if (is_null($userID)) {
131 $cart = self
::create(array());
134 $cart = self
::find_uncompleted_by_user_id($userID);
135 if ($cart === FALSE) {
136 $cart = self
::create(array('user_id' => $userID));
139 $session->set('event_cart_id', $cart->id
);
147 * @return bool|CRM_Event_Cart_BAO_Cart
149 public static function find_uncompleted_by_id($id) {
150 return self
::find_by_params(array('id' => $id, 'completed' => 0));
156 * @return bool|CRM_Event_Cart_BAO_Cart
158 public static function find_uncompleted_by_user_id($user_id) {
159 return self
::find_by_params(array('user_id' => $user_id, 'completed' => 0));
165 public function get_main_events_in_carts() {
166 //return CRM_Event_Cart_BAO_EventInCart::find_all_by_params( array('main_conference_event_id'
168 foreach ($this->events_in_carts
as $event_in_cart) {
169 if (!$event_in_cart->is_child_event()) {
170 $all[] = $event_in_cart;
177 * @param $main_conference_event_id
181 public function get_events_in_carts_by_main_event_id($main_conference_event_id) {
183 if (!$main_conference_event_id) {
186 foreach ($this->events_in_carts
as $event_in_cart) {
187 if ($event_in_cart->event
->parent_event_id
== $main_conference_event_id) {
188 $all[] = $event_in_cart;
191 usort($all, "CRM_Event_Cart_BAO_Cart::compare_event_dates");
196 * @param $event_in_cart_1
197 * @param $event_in_cart_2
201 static function compare_event_dates($event_in_cart_1, $event_in_cart_2) {
202 $date_1 = CRM_Utils_Date
::unixTime($event_in_cart_1->event
->start_date
);
203 $date_2 = CRM_Utils_Date
::unixTime($event_in_cart_2->event
->start_date
);
205 if ($date_1 == $date_2) {
210 return ($date_1 < $date_2) ?
-1 : 1;
214 * @param $main_participant
218 public function get_subparticipants($main_participant) {
219 $subparticipants = array();
220 foreach ($this->events_in_carts
as $event_in_cart) {
221 if ($event_in_cart->is_child_event($main_participant->event_id
)) {
222 foreach ($event_in_cart->participants
as $participant) {
223 if ($participant->contact_id
== $main_participant->contact_id
) {
224 $subparticipants[] = $participant;
230 return $subparticipants;
238 public function get_event_in_cart_by_event_id($event_id) {
239 return CRM_Utils_Array
::value($event_id, $this->events_in_carts
);
243 * @param $event_in_cart_id
247 public function &get_event_in_cart_by_id($event_in_cart_id) {
248 foreach ($this->events_in_carts
as $event_in_cart) {
249 if ($event_in_cart->id
== $event_in_cart_id) {
250 return $event_in_cart;
259 public function get_main_event_participants() {
260 $participants = array();
261 foreach ($this->get_main_events_in_carts() as $event_in_cart) {
262 $participants = array_merge($participants, $event_in_cart->participants
);
264 return $participants;
267 public function load_associations() {
268 if ($this->associations_loaded
) {
271 $this->associations_loaded
= TRUE;
272 $this->events_in_carts
= CRM_Event_Cart_BAO_EventInCart
::find_all_by_event_cart_id($this->id
);
273 foreach ($this->events_in_carts
as $event_in_cart) {
274 $event_in_cart->load_associations($this);
280 * @param $event_in_cart_id
282 * @return bool|CRM_Event_Cart_BAO_EventInCart
284 public function remove_event_in_cart($event_in_cart_id) {
285 $event_in_cart = CRM_Event_Cart_BAO_EventInCart
::find_by_id($event_in_cart_id);
286 if ($event_in_cart) {
287 $sessions_to_remove = $this->get_events_in_carts_by_main_event_id($event_in_cart->event_id
);
288 foreach ($sessions_to_remove as $session) {
289 $this->remove_event_in_cart($session->id
);
291 unset($this->events_in_carts
[$event_in_cart->event_id
]);
292 $event_in_cart->delete();
294 return $event_in_cart;
298 * @param $participant_id
302 function get_participant_index_from_id($participant_id) {
303 foreach ($this->events_in_carts
as $event_in_cart) {
305 foreach ($event_in_cart->participants
as $participant) {
306 if ($participant->id
== $participant_id) {
322 public static function retrieve(&$params, &$values) {
323 $cart = self
::find_by_params($params);
324 if ($cart === FALSE) {
325 CRM_Core_Error
::fatal(ts('Could not find cart matching %1', array(1 => var_export($params, TRUE))));
327 CRM_Core_DAO
::storeValues($cart, $values);
333 * @param $from_cart_id
335 public function adopt_participants($from_cart_id) {
337 1 => array($this->id
, 'Integer'),
338 2 => array($from_cart_id, 'Integer'),
340 $sql = "UPDATE civicrm_participant SET cart_id='%1' WHERE cart_id='%2'";
342 CRM_Core_DAO
::executeQuery($sql, $params);