285 lines
10 KiB
PHP
285 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* Deals with the each ticket booked in a single booking
|
|
* @author marcus
|
|
*
|
|
*/
|
|
class EM_Tickets_Bookings extends EM_Object implements Iterator{
|
|
|
|
/**
|
|
* Array of EM_Ticket_Booking objects for a specific event
|
|
* @var array
|
|
*/
|
|
var $tickets_bookings = array();
|
|
/**
|
|
* This object belongs to this booking object
|
|
* @var EM_Booking
|
|
*/
|
|
var $booking;
|
|
var $booking_id;
|
|
/**
|
|
* This object belongs to this booking object
|
|
* @var EM_Ticket
|
|
*/
|
|
var $ticket;
|
|
var $spaces;
|
|
var $price;
|
|
|
|
/**
|
|
* Creates an EM_Tickets instance,
|
|
* @param EM_Event $event
|
|
* @return null
|
|
*/
|
|
function EM_Tickets_Bookings( $object = false ){
|
|
global $wpdb;
|
|
if($object){
|
|
if( is_object($object) && get_class($object) == "EM_Booking"){
|
|
$this->booking = $object;
|
|
$sql = "SELECT * FROM ". EM_TICKETS_BOOKINGS_TABLE ." WHERE booking_id ='{$this->booking->booking_id}'";
|
|
}elseif( is_object($object) && get_class($object) == "EM_Ticket"){
|
|
$this->ticket = $object;
|
|
$sql = "SELECT * FROM ". EM_TICKETS_BOOKINGS_TABLE ." WHERE ticket_id ='{$this->ticket->ticket_id}'";
|
|
}elseif( is_numeric($object) ){
|
|
$sql = "SELECT * FROM ". EM_TICKETS_BOOKINGS_TABLE ." WHERE booking_id ='{$object}'";
|
|
}
|
|
$tickets_bookings = $wpdb->get_results($sql, ARRAY_A);
|
|
//Get tickets belonging to this tickets booking.
|
|
foreach ($tickets_bookings as $ticket_booking){
|
|
$EM_Ticket_Booking = new EM_Ticket_Booking($ticket_booking);
|
|
$EM_Ticket_Booking->booking = $this->booking; //save some calls
|
|
$this->tickets_bookings[] = $EM_Ticket_Booking;
|
|
}
|
|
}
|
|
do_action('em_tickets_bookings',$this, $object);
|
|
}
|
|
|
|
/**
|
|
* Saves the ticket bookings for this booking into the database, whether a new or existing booking
|
|
* @return boolean
|
|
*/
|
|
function save(){
|
|
global $wpdb;
|
|
do_action('em_tickets_bookings_save_pre',$this);
|
|
foreach( $this->tickets_bookings as $EM_Ticket_Booking ){
|
|
$result = $EM_Ticket_Booking->save();
|
|
if(!$result){
|
|
$this->errors = array_merge($this->errors, $EM_Ticket_Booking->get_errors());
|
|
}
|
|
}
|
|
if( count($this->errors) > 0 ){
|
|
$this->feedback_message = __('There was a problem saving the booking.', 'dbem');
|
|
$this->errors[] = __('There was a problem saving the booking.', 'dbem');
|
|
return apply_filters('em_tickets_bookings_save', false, $this);
|
|
}
|
|
return apply_filters('em_tickets_bookings_save', true, $this);
|
|
}
|
|
|
|
/**
|
|
* Add a booking into this event object, checking that there's enough space for the event
|
|
* @param EM_Ticket_Booking $EM_Ticket_Booking
|
|
* @return boolean
|
|
*/
|
|
function add( $EM_Ticket_Booking, $override = false ){ //note, $override was a quick fix, not necessarily permanent, so don't depend on it just yet
|
|
global $wpdb,$EM_Mailer;
|
|
//Does the ticket we want to book have enough spaeces?
|
|
if ( $override || $EM_Ticket_Booking->get_ticket()->get_available_spaces() >= $EM_Ticket_Booking->get_spaces() ) {
|
|
$ticket_booking_key = $this->has_ticket($EM_Ticket_Booking->ticket_id);
|
|
if( $ticket_booking_key !== false && is_object($this->tickets_bookings[$ticket_booking_key]) ){
|
|
//previously booked ticket, so let's just replace it
|
|
$this->tickets_bookings[$ticket_booking_key]->ticket_booking_spaces = $EM_Ticket_Booking->get_spaces();
|
|
$this->tickets_bookings[$ticket_booking_key]->get_price(true);
|
|
return apply_filters('em_tickets_bookings_add',true,$this);
|
|
}elseif( $EM_Ticket_Booking->get_spaces() > 0 ){
|
|
//new ticket in booking
|
|
$this->tickets_bookings[] = $EM_Ticket_Booking;
|
|
$this->get_spaces(true);
|
|
$this->get_price(true);
|
|
return apply_filters('em_tickets_bookings_add',true,$this);
|
|
}
|
|
} else {
|
|
$this->errors[] = __('Booking cannot be made, not enough spaces available!', 'dbem');
|
|
return apply_filters('em_tickets_bookings_add',false,$this);
|
|
}
|
|
return apply_filters('em_tickets_bookings_add',false,$this);
|
|
}
|
|
|
|
/**
|
|
* Checks if this set has a specific ticket booked, returning the key of the ticket in the EM_Tickets_Bookings->ticket_bookings array
|
|
* @param int $ticket_id
|
|
* @return mixed
|
|
*/
|
|
function has_ticket( $ticket_id ){
|
|
foreach ($this->tickets_bookings as $key => $EM_Ticket_Booking){
|
|
if( $EM_Ticket_Booking->ticket_id == $ticket_id ){
|
|
return apply_filters('em_tickets_has_ticket',$key,$this);
|
|
}
|
|
}
|
|
return apply_filters('em_tickets_has_ticket',false,$this);
|
|
}
|
|
|
|
/**
|
|
* Smart event locator, saves a database read if possible.
|
|
*/
|
|
function get_booking(){
|
|
global $EM_Booking;
|
|
$booking_id = $this->get_booking_id();
|
|
if( is_object($this->booking) && get_class($this->booking)=='EM_Booking' && $this->booking->booking_id == $booking_id ){
|
|
return $this->booking;
|
|
}elseif( is_object($EM_Booking) && $EM_Booking->booking_id == $booking_id ){
|
|
$this->booking = $EM_Booking;
|
|
}else{
|
|
if(is_numeric($booking_id)){
|
|
$this->booking = new EM_Booking($booking_id);
|
|
}else{
|
|
$this->booking = new EM_Booking();
|
|
}
|
|
}
|
|
return apply_filters('em_tickets_bookings_get_booking', $this->booking, $this);;
|
|
}
|
|
|
|
function get_booking_id(){
|
|
if( empty($this->booking_id) && count($this->tickets_bookings) > 0 ){
|
|
foreach($this->tickets_bookings as $EM_Ticket_Booking){ break; } //get first array item
|
|
$this->booking_id = $EM_Ticket_Booking->get_booking()->booking_id;
|
|
return apply_filters('em_tickets_bookings_get_booking_id', $this->booking_id, $this);
|
|
}
|
|
return apply_filters('em_tickets_bookings_get_booking_id', $this->booking_id, $this);
|
|
}
|
|
|
|
/**
|
|
* Delete all ticket bookings
|
|
* @return boolean
|
|
*/
|
|
function delete(){
|
|
global $wpdb;
|
|
if( $this->get_booking()->can_manage() ){
|
|
$result = $wpdb->query("DELETE FROM ".EM_TICKETS_BOOKINGS_TABLE." WHERE booking_id='{$this->get_booking_id()}'");
|
|
//echo "<pre>";print_r($this->get_booking());echo "</pre>";
|
|
}else{
|
|
//FIXME ticket bookings
|
|
$ticket_ids = array();
|
|
foreach( $this->tickets_bookings as $EM_Ticket_Booking ){
|
|
if( $EM_Ticket_Booking->can_manage() ){
|
|
$tickets_bookings_ids[] = $EM_Ticket_Booking->booking_id;
|
|
}else{
|
|
$this->errors[] = sprintf(__('You do not have the rights to manage this %s.','dbem'),__('Booking','dbem'));
|
|
}
|
|
}
|
|
if(count($ticket_ids) > 0){
|
|
$result = $wpdb->query("DELETE FROM ".EM_TICKETS_BOOKINGS_TABLE." WHERE ticket_booking_id IN (".implode(',',$ticket_ids).")");
|
|
}
|
|
}
|
|
return apply_filters('em_tickets_bookings_get_booking_id', ($result == true), $this);
|
|
}
|
|
|
|
/**
|
|
* Go through the tickets in this object and validate them
|
|
*/
|
|
function validate(){
|
|
$errors = array();
|
|
foreach($this->tickets_bookings as $EM_Ticket_Booking){
|
|
$errors[] = $EM_Ticket_Booking->validate();
|
|
}
|
|
return apply_filters('em_tickets_bookings_validate', !in_array(false, $errors), $this);
|
|
}
|
|
|
|
/**
|
|
* Get the total number of spaces booked in this booking. Seting $force_reset to true will recheck spaces, even if previously done so.
|
|
* @param unknown_type $force_refresh
|
|
* @return mixed
|
|
*/
|
|
function get_spaces( $force_refresh=false ){
|
|
if($force_refresh || $this->spaces == 0){
|
|
$spaces = 0;
|
|
foreach($this->tickets_bookings as $EM_Ticket_Booking){
|
|
$spaces += $EM_Ticket_Booking->get_spaces();
|
|
}
|
|
$this->spaces = $spaces;
|
|
}
|
|
return apply_filters('em_booking_get_spaces',$this->spaces,$this);
|
|
}
|
|
|
|
/**
|
|
* Gets the total price for this whole booking by adding up subtotals of booked tickets. Seting $force_reset to true will recheck spaces, even if previously done so.
|
|
* @param boolean $force_refresh
|
|
* @return float
|
|
*/
|
|
function get_price( $force_refresh=false, $format = false, $add_tax = 'x' ){
|
|
if( $force_refresh || $this->price == 0 || $add_tax !== 'x' || get_option('dbem_bookings_tax_auto_add') ){
|
|
$price = 0;
|
|
foreach($this->tickets_bookings as $EM_Ticket_Booking){
|
|
$price += $EM_Ticket_Booking->get_price($force_refresh, false, $add_tax);
|
|
}
|
|
$this->price = apply_filters('em_tickets_bookings_get_price', $price, $this, $add_tax);
|
|
}
|
|
if($format){
|
|
return em_get_currency_formatted($this->price);
|
|
}
|
|
return $this->price;
|
|
}
|
|
|
|
/**
|
|
* Goes through each ticket and populates it with the bookings made
|
|
*/
|
|
function get_ticket_bookings(){
|
|
foreach( $this->tickets as $EM_Ticket ){
|
|
$EM_Ticket->get_bookings();
|
|
}
|
|
}
|
|
|
|
/* Overrides EM_Object method to apply a filter to result
|
|
* @see wp-content/plugins/events-manager/classes/EM_Object#build_sql_conditions()
|
|
*/
|
|
function build_sql_conditions( $args = array() ){
|
|
$conditions = apply_filters( 'em_tickets_build_sql_conditions', parent::build_sql_conditions($args), $args );
|
|
if( is_numeric($args['status']) ){
|
|
$conditions['status'] = 'ticket_status='.$args['status'];
|
|
}
|
|
return apply_filters('em_tickets_bookings_build_sql_conditions', $conditions, $args);
|
|
}
|
|
|
|
/* Overrides EM_Object method to apply a filter to result
|
|
* @see wp-content/plugins/events-manager/classes/EM_Object#build_sql_orderby()
|
|
*/
|
|
function build_sql_orderby( $args, $accepted_fields, $default_order = 'ASC' ){
|
|
return apply_filters( 'em_tickets_bookings_build_sql_orderby', parent::build_sql_orderby($args, $accepted_fields, get_option('dbem_events_default_order')), $args, $accepted_fields, $default_order );
|
|
}
|
|
|
|
/*
|
|
* Adds custom Events search defaults
|
|
* @param array $array
|
|
* @return array
|
|
* @uses EM_Object#get_default_search()
|
|
*/
|
|
function get_default_search( $array = array() ){
|
|
$defaults = array(
|
|
'status' => false,
|
|
'person' => true //to add later, search by person's tickets...
|
|
);
|
|
$defaults['owner'] = !current_user_can('manage_others_bookings') ? get_current_user_id():false;
|
|
return apply_filters('em_tickets_bookings_get_default_search', parent::get_default_search($defaults,$array), $array, $defaults);
|
|
}
|
|
|
|
//Iterator Implementation
|
|
public function rewind(){
|
|
reset($this->tickets_bookings);
|
|
}
|
|
public function current(){
|
|
$var = current($this->tickets_bookings);
|
|
return $var;
|
|
}
|
|
public function key(){
|
|
$var = key($this->tickets_bookings);
|
|
return $var;
|
|
}
|
|
public function next(){
|
|
$var = next($this->tickets_bookings);
|
|
return $var;
|
|
}
|
|
public function valid(){
|
|
$key = key($this->tickets_bookings);
|
|
$var = ($key !== NULL && $key !== FALSE);
|
|
return $var;
|
|
}
|
|
}
|
|
?>
|