345 lines
8.6 KiB
PHP
345 lines
8.6 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Class CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
class CRM_Event_Cart_BAO_Cart extends CRM_Event_Cart_DAO_Cart {
|
||
|
public $associations_loaded = FALSE;
|
||
|
/* event_in_cart_id => $event_in_cart */
|
||
|
public $events_in_carts = array();
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function add(&$params) {
|
||
|
$cart = new CRM_Event_Cart_BAO_Cart();
|
||
|
$cart->copyValues($params);
|
||
|
$result = $cart->save();
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_id
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function add_event($event_id) {
|
||
|
$this->load_associations();
|
||
|
$event_in_cart = $this->get_event_in_cart_by_event_id($event_id);
|
||
|
if ($event_in_cart) {
|
||
|
return $event_in_cart;
|
||
|
}
|
||
|
|
||
|
$params = array(
|
||
|
'event_id' => $event_id,
|
||
|
'event_cart_id' => $this->id,
|
||
|
);
|
||
|
$event_in_cart = CRM_Event_Cart_BAO_EventInCart::create($params);
|
||
|
$event_in_cart->load_associations($this);
|
||
|
$this->events_in_carts[$event_in_cart->event_id] = $event_in_cart;
|
||
|
return $this->events_in_carts[$event_in_cart->event_id];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $participant
|
||
|
*/
|
||
|
public function add_participant_to_cart($participant) {
|
||
|
$event_in_cart = $this->get_event_in_cart_by_event_id($participant->event_id);
|
||
|
if (!$event_in_cart) {
|
||
|
$event_in_cart = $this->add_event($participant->event_id);
|
||
|
}
|
||
|
$event_in_cart->add_participant($participant);
|
||
|
$event_in_cart->save();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return CRM_Event_Cart_BAO_Cart
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static function create($params) {
|
||
|
$transaction = new CRM_Core_Transaction();
|
||
|
|
||
|
$cart = self::add($params);
|
||
|
|
||
|
if (is_a($cart, 'CRM_Core_Error')) {
|
||
|
$transaction->rollback();
|
||
|
CRM_Core_Error::fatal(ts('There was an error creating an event cart'));
|
||
|
}
|
||
|
|
||
|
$transaction->commit();
|
||
|
|
||
|
return $cart;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $id
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function find_by_id($id) {
|
||
|
return self::find_by_params(array('id' => $id));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function find_by_params($params) {
|
||
|
$cart = new CRM_Event_Cart_BAO_Cart();
|
||
|
$cart->copyValues($params);
|
||
|
if ($cart->find(TRUE)) {
|
||
|
return $cart;
|
||
|
}
|
||
|
else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return self|bool|CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function find_or_create_for_current_session() {
|
||
|
$session = CRM_Core_Session::singleton();
|
||
|
$event_cart_id = $session->get('event_cart_id');
|
||
|
$userID = $session->get('userID');
|
||
|
$cart = FALSE;
|
||
|
if (!is_null($event_cart_id)) {
|
||
|
$cart = self::find_uncompleted_by_id($event_cart_id);
|
||
|
if ($cart && $userID) {
|
||
|
if (!$cart->user_id) {
|
||
|
$saved_cart = self::find_uncompleted_by_user_id($userID);
|
||
|
if ($saved_cart) {
|
||
|
$cart->adopt_participants($saved_cart->id);
|
||
|
$saved_cart->delete();
|
||
|
$cart->load_associations();
|
||
|
}
|
||
|
else {
|
||
|
$cart->user_id = $userID;
|
||
|
$cart->save();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ($cart === FALSE) {
|
||
|
if (is_null($userID)) {
|
||
|
$cart = self::create(array());
|
||
|
}
|
||
|
else {
|
||
|
$cart = self::find_uncompleted_by_user_id($userID);
|
||
|
if ($cart === FALSE) {
|
||
|
$cart = self::create(array('user_id' => $userID));
|
||
|
}
|
||
|
}
|
||
|
$session->set('event_cart_id', $cart->id);
|
||
|
}
|
||
|
return $cart;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $id
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function find_uncompleted_by_id($id) {
|
||
|
return self::find_by_params(array('id' => $id, 'completed' => 0));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $user_id
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_Cart
|
||
|
*/
|
||
|
public static function find_uncompleted_by_user_id($user_id) {
|
||
|
return self::find_by_params(array('user_id' => $user_id, 'completed' => 0));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_main_events_in_carts() {
|
||
|
//return CRM_Event_Cart_BAO_EventInCart::find_all_by_params( array('main_conference_event_id'
|
||
|
$all = array();
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
if (!$event_in_cart->is_child_event()) {
|
||
|
$all[] = $event_in_cart;
|
||
|
}
|
||
|
}
|
||
|
return $all;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $main_conference_event_id
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_events_in_carts_by_main_event_id($main_conference_event_id) {
|
||
|
$all = array();
|
||
|
if (!$main_conference_event_id) {
|
||
|
return $all;
|
||
|
}
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
if ($event_in_cart->event->parent_event_id == $main_conference_event_id) {
|
||
|
$all[] = $event_in_cart;
|
||
|
}
|
||
|
}
|
||
|
usort($all, "CRM_Event_Cart_BAO_Cart::compare_event_dates");
|
||
|
return $all;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $event_in_cart_1
|
||
|
* @param $event_in_cart_2
|
||
|
*
|
||
|
* @return int
|
||
|
*/
|
||
|
public static function compare_event_dates($event_in_cart_1, $event_in_cart_2) {
|
||
|
$date_1 = CRM_Utils_Date::unixTime($event_in_cart_1->event->start_date);
|
||
|
$date_2 = CRM_Utils_Date::unixTime($event_in_cart_2->event->start_date);
|
||
|
|
||
|
if ($date_1 == $date_2) {
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
return ($date_1 < $date_2) ? -1 : 1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $main_participant
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_subparticipants($main_participant) {
|
||
|
$subparticipants = array();
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
if ($event_in_cart->is_child_event($main_participant->event_id)) {
|
||
|
foreach ($event_in_cart->participants as $participant) {
|
||
|
if ($participant->contact_id == $main_participant->contact_id) {
|
||
|
$subparticipants[] = $participant;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $subparticipants;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_id
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function get_event_in_cart_by_event_id($event_id) {
|
||
|
return CRM_Utils_Array::value($event_id, $this->events_in_carts);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_in_cart_id
|
||
|
*
|
||
|
* @return null
|
||
|
*/
|
||
|
public function &get_event_in_cart_by_id($event_in_cart_id) {
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
if ($event_in_cart->id == $event_in_cart_id) {
|
||
|
return $event_in_cart;
|
||
|
}
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_main_event_participants() {
|
||
|
$participants = array();
|
||
|
foreach ($this->get_main_events_in_carts() as $event_in_cart) {
|
||
|
$participants = array_merge($participants, $event_in_cart->participants);
|
||
|
}
|
||
|
return $participants;
|
||
|
}
|
||
|
|
||
|
public function load_associations() {
|
||
|
if ($this->associations_loaded) {
|
||
|
return;
|
||
|
}
|
||
|
$this->associations_loaded = TRUE;
|
||
|
$this->events_in_carts = CRM_Event_Cart_BAO_EventInCart::find_all_by_event_cart_id($this->id);
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
$event_in_cart->load_associations($this);
|
||
|
}
|
||
|
$this->save();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_in_cart_id
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_EventInCart
|
||
|
*/
|
||
|
public function remove_event_in_cart($event_in_cart_id) {
|
||
|
$event_in_cart = CRM_Event_Cart_BAO_EventInCart::find_by_id($event_in_cart_id);
|
||
|
if ($event_in_cart) {
|
||
|
$sessions_to_remove = $this->get_events_in_carts_by_main_event_id($event_in_cart->event_id);
|
||
|
foreach ($sessions_to_remove as $session) {
|
||
|
$this->remove_event_in_cart($session->id);
|
||
|
}
|
||
|
unset($this->events_in_carts[$event_in_cart->event_id]);
|
||
|
$event_in_cart->delete();
|
||
|
}
|
||
|
return $event_in_cart;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $participant_id
|
||
|
*
|
||
|
* @return int
|
||
|
*/
|
||
|
public function get_participant_index_from_id($participant_id) {
|
||
|
foreach ($this->events_in_carts as $event_in_cart) {
|
||
|
$index = 0;
|
||
|
foreach ($event_in_cart->participants as $participant) {
|
||
|
if ($participant->id == $participant_id) {
|
||
|
return $index;
|
||
|
}
|
||
|
$index++;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
* @param $values
|
||
|
*
|
||
|
* @return mixed
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static function retrieve(&$params, &$values) {
|
||
|
$cart = self::find_by_params($params);
|
||
|
if ($cart === FALSE) {
|
||
|
CRM_Core_Error::fatal(ts('Could not find cart matching %1', array(1 => var_export($params, TRUE))));
|
||
|
}
|
||
|
CRM_Core_DAO::storeValues($cart, $values);
|
||
|
return $values;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param int $from_cart_id
|
||
|
*/
|
||
|
public function adopt_participants($from_cart_id) {
|
||
|
$params = array(
|
||
|
1 => array($this->id, 'Integer'),
|
||
|
2 => array($from_cart_id, 'Integer'),
|
||
|
);
|
||
|
$sql = "UPDATE civicrm_participant SET cart_id='%1' WHERE cart_id='%2'";
|
||
|
|
||
|
CRM_Core_DAO::executeQuery($sql, $params);
|
||
|
}
|
||
|
|
||
|
}
|