From 7c8150521b5ff63816ee0f493f63ab2b9d2eb75e Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Tue, 3 Oct 2017 16:51:56 -0400 Subject: [PATCH] Updated database to version 0.0.13 to get rid of some old fields. Removed those fields from the related data classes. Added information on available dates and times to the registration page on the front-end. Now need to put in pop-up calendar for date selection for time_specific registrations. Added functions to purge expired reg_time_pending entries and to update the quantities in the reg_time table. Improved display of reg times in the event dashboard in admin. --- classes/data/dataRegEvent.php | 117 ++++++----- classes/data/dataRegRequestClass.php | 8 - classes/data/dataRegRequestEvent.php | 8 - classes/data/dataRegRequestRate.php | 8 - classes/regCartSupport.php | 124 +++++++++++ index.php | 4 +- js/frontRegApp.js | 1 + models/admin/ajax/regFront/registrant.php | 38 +++- models/admin/registrations/events.php | 193 ++++++++++++++---- models/front/registrations/registration.php | 6 +- ...0.0.12.sql => create_database_V0.0.13.sql} | 11 +- setup/databaseScripts/dbVersions.php | 3 +- ..._V0.0.12.sql => drop_database_V0.0.13.sql} | 0 .../update_database_V0.0.13.sql | 57 ++++++ views/admin/registrations/eventDashboard.html | 104 ++++++---- views/front/registrations/registration.html | 16 +- 16 files changed, 522 insertions(+), 176 deletions(-) rename setup/databaseScripts/{create_database_V0.0.12.sql => create_database_V0.0.13.sql} (98%) rename setup/databaseScripts/{drop_database_V0.0.12.sql => drop_database_V0.0.13.sql} (100%) create mode 100644 setup/databaseScripts/update_database_V0.0.13.sql diff --git a/classes/data/dataRegEvent.php b/classes/data/dataRegEvent.php index 77cf050..3c86c00 100644 --- a/classes/data/dataRegEvent.php +++ b/classes/data/dataRegEvent.php @@ -74,12 +74,12 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract public $fields = false; /** * Flag to post process results and add current Event data to each result - * + * * @var $postProcAddedEventData * @access public */ public $postProcAddedEventData = false; - + /** * Constructor @@ -179,7 +179,7 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract 'use' => 'a', 'default' => 1 ), - + // Registration requires attendees - Otherwise the person submitting the registration is the registrant 'attendees' => array ( 'field' => 'attendees', @@ -264,7 +264,7 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract 'required' => false, 'use' => 'a' ), - + // Name of a downloadable file 'reg_file' => array ( 'field' => 'reg_file', @@ -298,7 +298,7 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract ), ); - + } /** @@ -314,13 +314,13 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract */ public function entryPostProcessing( $result_data, $action ) { - + // If $postProcAddedEventData option set if ($this->postProcAddedEventData) { - - // If doing the following actions + + // If doing the following actions if (in_array($action, array('l','g'))) { - + // Use hook to Events to get current data for this event $eventData = apply_filters('glm-member-db-events-get-event', $result_data['event']); @@ -332,14 +332,14 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract $result_data['contact_email'] = $eventData['contact_email']; $result_data['contact_phone'] = $eventData['contact_phone']; $result_data['url'] = $eventData['url']; - + } - + } - + return $result_data; } - + /* * Get Alpha list of first characters in event name * @@ -351,7 +351,7 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract */ public function getAlphaList($where = '', $selected = '') { - + $sql = " SELECT DISTINCT LEFT(T.event_name, 1) AS alpha FROM ".GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX. "reg_event T @@ -360,16 +360,16 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract ORDER BY alpha ;"; $alphaData = $this->wpdb->get_results($sql, ARRAY_A); - + // Set selected foreach ($alphaData as $k=>$v) { $alphaData[$k]['default'] = ($v['alpha'] == $selected); } - + return $alphaData; - + } - + /* * Get a simple reg event list - Event Name and ID only * @@ -379,8 +379,8 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract * @param string $idField ID field to use * @param integer $start Starting at result # * @param integer $limit Limit results to this number - * @param boolean $extended Add current base data for returned events - * + * @param boolean $extended Add current base data for returned events + * * @return array Array of Name and ID for all reg events * @access public */ @@ -389,34 +389,34 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract // Save status of extended data flag $saveExtended = $this->postProcAddedEventData; - + // If extended data is requested, then set flag for post processing if ($extended) { $this->postProcAddedEventData = true; } - + // Save the current fields array and make a copy $fSave = $this->fields; - + // Remove what we don't want from the copy and get the list $this->fields = array( 'id' => $fSave['id'], 'event' => $fSave['event'], 'event_name' => $fSave['event_name'] ); - + $regEventsList = $this->getList($where, $order, $fieldVals, $idField, $start, $limit); - + // Restore the fields list $this->fields = $fSave; - + // Restore status of extended data flag $this->postProcAddedEventData = $saveExtended; - - + + return $regEventsList; } - + /** * Get ID/Event Name list * @@ -427,22 +427,22 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract public function getIdRegEvent($where = 'true') { $savedFields = $this->fields; - + $this->fields = array( 'id' => $savedFields['id'], 'event_name' => $savedFields['event_name'] ); - + $r = $this->getList($where); - + $this->fields = $savedFields; - + return $r; - + } - + /** - * Get all event configuration data for a specific event + * Get all event configuration data for a specific event * Used to get data for managing a registration event * * @param integer $id ID of reg_event record @@ -454,10 +454,10 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract */ public function getEventConfig($id = false, $extended = false, $forEdit = false, $withRecurData = false) { - + // Save status of extended data flag $saveExtended = $this->postProcAddedEventData; - + // If extended data is requested, then set flag for post processing if ($extended) { $this->postProcAddedEventData = true; @@ -465,7 +465,7 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract // Try to get the base information - and extended data from the Event add-on if requested if ($id > 0) { - $eventData = $this->getEntry($id, 'id', ' TRUE ', $forEdit); + $eventData = $this->getEntry($id, 'id', ' TRUE ', $forEdit); if (!$eventData) { return false; } @@ -474,16 +474,22 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract // Get all reg_time records for this event require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataRegTime.php'; $RegTime = new GlmDataRegistrationsRegTime($this->wpdb, $this->config); - $eventData['reg_time'] = $RegTime->getList('T.reg_event = '.$eventData['id'], 'start_datetime', true); - + // If this is a time specific event, then get all times except any default entry that might be there from the event having been a non-time_specific event + if ($eventData['time_specific']['value']) { + $eventData['reg_time'] = $RegTime->getList('T.reg_event = '.$eventData['id'].' AND T.event_time > 0', 'start_datetime', true); + // Otherwise if this is a non-time_specific event, we only want the default entry + } else { + $eventData['reg_time'] = $RegTime->getList('T.reg_event = '.$eventData['id'].' AND T.event_time = 0', 'start_datetime', true); + } + // Get all reg_class records for this event require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataRegClass.php'; - $RegTime = new GlmDataRegistrationsRegClass($this->wpdb, $this->config); - $eventData['reg_class'] = $RegTime->getList("T.reg_event = ".$eventData['id'], 'name', true); - + $RegClass = new GlmDataRegistrationsRegClass($this->wpdb, $this->config); + $eventData['reg_class'] = $RegClass->getList("T.reg_event = ".$eventData['id'], 'name', true); + // If we have any reg_class results if ($eventData['reg_class']) { - + // Get all reg_rate records for this reg_class require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataRegRate.php'; $RegRate = new GlmDataRegistrationsRegRate($this->wpdb, $this->config); @@ -492,22 +498,21 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract } } - - // If recurrence data is requested and regsitration for this event is date/time specific - Get recurrence and times data - if ($eventData['time_specific']['value'] & $withRecurData) { - $eventData['recurrences'] = apply_filters('glm-member-db-events-get-event-times', $eventData['event']); - } - + + // If recurrence data is requested and registration for this event is date/time specific - Get recurrence and times data + $eventData['recurrences'] = array(); + $eventData['recurrences'] = apply_filters('glm-member-db-events-get-event-times', $eventData['event']); + // Restore status of extended data flag $this->postProcAddedEventData = $saveExtended; return $eventData; - + } - - - - + + + + } ?> \ No newline at end of file diff --git a/classes/data/dataRegRequestClass.php b/classes/data/dataRegRequestClass.php index cd12676..148a33c 100644 --- a/classes/data/dataRegRequestClass.php +++ b/classes/data/dataRegRequestClass.php @@ -132,14 +132,6 @@ class GlmDataRegistrationsRequestClass extends GlmDataAbstract 'use' => 'lgneud' ), - // Pointer reg_time entry - 'reg_time' => array ( - 'field' => 'reg_time', - 'type' => 'integer', - 'required' => true, - 'use' => 'lgneud' - ), - // Selected Start Time 'event_datetime' => array ( 'field' => 'event_datetime', diff --git a/classes/data/dataRegRequestEvent.php b/classes/data/dataRegRequestEvent.php index 4b41b1b..ffcaa06 100644 --- a/classes/data/dataRegRequestEvent.php +++ b/classes/data/dataRegRequestEvent.php @@ -140,14 +140,6 @@ class GlmDataRegistrationsRequestEvent extends GlmDataAbstract 'use' => 'lgneud' ), - // Pointer reg_time entry - 'reg_time' => array ( - 'field' => 'reg_time', - 'type' => 'integer', - 'required' => true, - 'use' => 'lgneud' - ), - // Selected Start Time 'event_datetime' => array ( 'field' => 'event_datetime', diff --git a/classes/data/dataRegRequestRate.php b/classes/data/dataRegRequestRate.php index 12b2c7b..372080c 100644 --- a/classes/data/dataRegRequestRate.php +++ b/classes/data/dataRegRequestRate.php @@ -133,14 +133,6 @@ class GlmDataRegistrationsRegRequestRate extends GlmDataAbstract 'use' => 'lgneud' ), - // Pointer reg_time entry - 'reg_time' => array ( - 'field' => 'reg_time', - 'type' => 'integer', - 'required' => true, - 'use' => 'lgneud' - ), - // Selected Start Time 'event_datetime' => array ( 'field' => 'event_datetime', diff --git a/classes/regCartSupport.php b/classes/regCartSupport.php index 4f0fc21..3ec5a59 100644 --- a/classes/regCartSupport.php +++ b/classes/regCartSupport.php @@ -284,6 +284,10 @@ class GlmRegCartSupport return false; } + // First purge any expired pending registration holds + $this->purgeOldRegTimePending(); + + // Instantiate the classes we'll need $RegEvent = new GlmDataRegistrationsRegEvent($this->wpdb, $this->config); $RegTime = new GlmDataRegistrationsRegTime($this->wpdb, $this->config); $RegRequest = new GlmDataRegistrationsRegRequest($this->wpdb, $this->config); @@ -376,6 +380,7 @@ class GlmRegCartSupport // Do rate Checks + // Update reg_time entries for current availability // Check if listed rate is currently available - If not, add as a problem /* @@ -579,4 +584,123 @@ class GlmRegCartSupport } + /* + * Purge old reg_time_pending entries + * + * This function removes any expired reg_time_pending records and removes the counts from the attendees_pending field for + * the referenced reg_time table entry. + * + * This should be run before doing cart validation and in the back-end before displaying any availability numbers. + * + * @access public + */ + public function purgeOldRegTimePending() + { + + $purged = 0; + + // Get all expired + $exp = $this->wpdb->get_results(" + SELECT * + FROM ".GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX."reg_time_pending + WHERE expire_time < NOW() + ;", ARRAY_A); + + foreach ($exp as $e) { + $res = $this->updateTimeEntryCounts($e['reg_time'], -1); + if ($res['success']) { + $this->wpdb->delete( + GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX."reg_time_pending", + array('id', $e['id']) + ); + $purged++; + } else { + trigger_error('purgeOldRegTimePending() errors: '.$res['error'], E_USER_WARNING); + } + } + + trigger_error('purgeOldRegTimePending() pending entries purged: '.$purged, E_USER_NOTICE); + + return; + + } + + /* + * Update inventory for a reg_time entry + * + * This function can adjust the total confirmed attendee and pending attendee counts. + * It will then adjust the attendees available value accordingly and check for invalid values (such as + * availability that exceeds the max value or that is less than 0. + * + * To return counts (reduce) use a negative number. To consume counts use positive. + * + * @param integer $pending Number used to decrement the pending value + * @param integer $count Number used to decrement the attendee_count value (for removing a confirmed registrant) + * + * @return array('success' boolean, 'error' string) + * @access public + */ + public function updateTimeEntryCounts($timeId = false, $pending = 0, $counts = 0) + { + + $res = array( + 'success' => true, + 'error' => '' + ); + + // Get current time data + $time = $this->wpdb->get_results(" + SELECT attendee_max, attendee_count, attendee_pending, attendee_available + FROM ".GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX."reg_time + WHERE id = $timeId + ;", ARRAY_A); + if (!$time) { + $res['success'] = false; + $res['error'] .= 'Invalid time entry ID or unable to retrieve. '; + } + + // Adjust balances + $time['attendee_count'] += $counts; + $time['attendees_pending'] += $pending; + $time['attendess_available'] = $time['attendee_max'] - ($time['attendee_count']+$time['attendees_pending']); + + // Do sanity check on results + if ($time['attendees_pending'] < 0 || $time['attendees_pending'] > ($time['attendee_max']-$time['attendee_count'])) { + $res['success'] = false; + $res['error'] .= 'Result has invalid pending attendees count.'; + } + if ($time['attendee_count'] < 0 || $time['attendee_count'] > ($time['attendee_max'])) { + $res['success'] = false; + $res['error'] .= 'Result has invalid confirmed attendee count.'; + } + + // If all is well, update time entry + if ($res['success']) { + + $updated = $this->wpdb->update( + GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX.'reg_time', + array( + 'attendee_count' => $time['attendee_count'], + 'attendees_pending' => $time['attendees_pending'], + 'attendess_available' => $time['attendess_available'] + ), + array( 'ID' => $timeId ), + array( + '%d', + '%d', + '%d' + ) + ); + + if (!$updated) { + $res['success'] = false; + $res['error'] .= 'Unable to store update.'; + } + } + + return $res; + + } + + } diff --git a/index.php b/index.php index d086fe0..43df332 100644 --- a/index.php +++ b/index.php @@ -44,10 +44,10 @@ if (!defined('ABSPATH')) { * version from this plugin. */ define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_VERSION', '0.0.1'); -define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_VERSION', '0.0.12'); +define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_VERSION', '0.0.13'); // This is the minimum version of the GLM Members DB plugin require for this plugin. -define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.8.0'); +define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.10.10'); // Check if plugin version is not current in WordPress option and if needed updated it if (GLM_MEMBERS_REGISTRATIONS_PLUGIN_VERSION != get_option('glmMembersRegistrationsPluginVersion')) { diff --git a/js/frontRegApp.js b/js/frontRegApp.js index ed6d4f2..caa7152 100644 --- a/js/frontRegApp.js +++ b/js/frontRegApp.js @@ -688,6 +688,7 @@ app.Views.Front.NewRegistrant = Backbone.View.extend({ }, initialize: function(){ +console.log(this); return this; }, diff --git a/models/admin/ajax/regFront/registrant.php b/models/admin/ajax/regFront/registrant.php index dfd6dcd..5a58b3c 100644 --- a/models/admin/ajax/regFront/registrant.php +++ b/models/admin/ajax/regFront/registrant.php @@ -98,6 +98,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations switch ( $option ) { case 'add': + // Check for or create reg_request_event if ( $modelData['reg_event'] ) { //return false; @@ -116,14 +117,12 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations 'reg_request' => $modelData['reg_request'], 'reg_event' => $modelData['reg_event'], 'event_name' => $modelData['event_name'], - 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], ); $dataFormat = array( '%d', // reg_request '%d', // reg_event '%s', // event_name - '%d', // reg_time '%s', // event_datetime ); if ( !$regRequestEventId ) { @@ -142,6 +141,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations array( '%d' ) ); } + // Check for or create reg_request_class $regRequestClassId = $this->wpdb->get_var( $this->wpdb->prepare( @@ -158,7 +158,6 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations $data = array( 'reg_event' => $modelData['reg_event'], 'event_name' => $modelData['event_name'], - 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], 'reg_request' => $modelData['reg_request'], 'reg_request_event' => $regRequestEventId, @@ -167,7 +166,6 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations $dataFormat = array( '%d', // reg_event '%s', // event_name - '%d', // reg_time '%s', // event_datetime '%d', // reg_request '%d', // reg_request_event @@ -189,6 +187,7 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations array( '%d' ) ); } + // Check for or create reg_request_rate $regRequestRate = $this->wpdb->get_var( $this->wpdb->prepare( @@ -215,7 +214,6 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations $data = array( 'reg_event' => $modelData['reg_event'], 'event_name' => $modelData['event_name'], - 'reg_time' => $modelData['reg_time'], 'event_datetime' => $modelData['event_datetime'], 'reg_request' => $modelData['reg_request'], 'reg_request_event' => $regRequestEventId, @@ -229,7 +227,6 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations $dataFormat = array( '%d', // reg_event '%s', // event_name - '%s', // reg_time '%s', // event_datetime '%d', // reg_request '%d', // reg_request_event @@ -301,6 +298,35 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations ) ); + /* + * Check for availability - If available then place a hold by creating a reg_time_pending entry + */ + // + + // Get availability from reg_time entry +/* + * *** NEED TO REVISIT THIS *** + * The reg_time table entry data should be passed to the front-end attendee selection and the ID of the + * selected reg_time entry is what should be used to get the current availability. + * The availability is sent to the registration page now so we can check against that before sending. + * This will also be cheked again in the cart anyway. + * + $regRequestRegistrantAvailble = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT attendees_available + FROM " . GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX . "reg_time + WHERE reg_event = %d + AND account = %d + AND reg_request_event = %d + AND reg_request_class = %d", + $modelData['reg_request'], + $accountId, + $regRequestEventId, + $regRequestClassId + ) + ); +*/ + $data = array( 'account' => $accountId, 'reg_event' => $modelData['reg_event'], diff --git a/models/admin/registrations/events.php b/models/admin/registrations/events.php index 67b1e56..eff017f 100644 --- a/models/admin/registrations/events.php +++ b/models/admin/registrations/events.php @@ -274,7 +274,7 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent } } -// echo "
".print_r($regEvent,1)."
"; + //echo "
".print_r($regEvent,1)."
"; $view = 'eventEdit'; @@ -299,58 +299,70 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent case 'eventDashboard': + $needTimesReloaded = false; + // If we have an event ID if ($regEventID) { - $regEvent = $this->getEntry($regEventID); + // Try to get the event configuration including recurrences and times + $this->postProcAddedEventData = true; + $regEvent = $this->getEventConfig($regEventID, true, false, true); + + // If we have the event data if ($regEvent) { $haveRegEvent = true; + $recurrenceSummary = array(); - // Try to get the event configuration including recurrences and times - $this->postProcAddedEventData = true; - $regEvent = $this->getEventConfig($regEventID, true, false, true); + // If we have recurrences for the event + if (is_array($regEvent['recurrences']) && count($regEvent['recurrences']) > 0) { - // If we have the event data - if ($regEvent) { + $haveRegEventRecurrences = true; - $haveRegEvent = true; + // For each recurrence + foreach ($regEvent['recurrences'] as $k=>$v) { - // If event is time_specific and we have recurrences for the event - if ($regEvent['time_specific']['value'] && is_array($regEvent['recurrences']) && count($regEvent['recurrences']) > 0) { + $regEvent['recurrences'][$k]['haveTimes'] = false; - $haveRegEventRecurrences = true; - - // For each recurrence - foreach ($regEvent['recurrences'] as $k=>$v) { + // If we have times for this recurrence + if ($v['times'] && count($v['times']) > 0) { $regEvent['recurrences'][$k]['haveTimes'] = false; + $haveRegEventTimes = true; - // If we have times for this recurrence - if ($v['times'] && count($v['times']) > 0) { + // Get the first event date/time + $first = current($v['times']); + $last = end($v['times']); + $regEvent['recurrences'][$k]['first_time'] = $first; + $regEvent['recurrences'][$k]['lastTime'] = $last; - $regEvent['recurrences'][$k]['haveTimes'] = false; - $haveRegEventTimes = true; + // Set event first and last times + if (!$regEventFirstTime || $regEventFirstTime['timestamp'] < $first ) { + $regEventFirstTime = $first; + } + if (!$regEventLastTime || $regEventLastTime['timestamp'] > $last ) { + $regEventLastTime = $last; + } - // Get the first event date/time - $first = current($v['times']); - $last = end($v['times']); - $regEvent['recurrences'][$k]['first_time'] = $first; - $regEvent['recurrences'][$k]['lastTime'] = $last; - - // Set event first and last times - if (!$regEventFirstTime || $regEventFirstTime['timestamp'] < $first ) { - $regEventFirstTime = $first; - } - if (!$regEventLastTime || $regEventLastTime['timestamp'] > $last ) { - $regEventLastTime = $last; - } + // If this is a time specific event + if ($regEvent['time_specific']['value']) { // Check all event times for matching reg event times foreach ($v['times'] as $tk=>$tv) { - // If time doesn't exist in reg_times - if (!isset($regEvent['reg_times'][$tk])) { + // Check if time already exists in reg_times array + reset($regEvent['reg_time']); + foreach($regEvent['reg_time'] as $rk=>$rv) { + if ($rv['event_time'] == $tk) { + $id = $rk; + break; + } + } + + // If it doesn't now, then add it + if (!$id) { + + $needTimesReloaded = true; $sTime = date('Y-m-d H:i:s',strtotime($tv['start_time']['datetime'])); $eTime = date('Y-m-d H:i:s',strtotime($tv['end_time']['datetime'])); @@ -359,7 +371,7 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent $this->wpdb->insert( GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX."reg_time", array( - 'reg_event' => $regEvent['event'], + 'reg_event' => $regEvent['id'], 'event_time' => $tk, 'start_datetime' => $sTime, 'end_datetime' => $eTime, @@ -400,16 +412,117 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent } // If time isn't in reg_times } // each recurrence times - } // have times for recurrence - } // each recurrence - } // Time specific and have times - } // have event data - } // have reg event ID + } // time specific + } // have times for recurrence + + $recurrenceSummary[] = array( + 'firstTime' => $regEventFirstTime, + 'lastTime' => $regEventLastTime + ); + + } // each recurrence + + // Get rid of all of the recurrence data - No longer needed + unset($regEvent['recurrences']); + + // Add Recurrence summary to event data + $regEvent['recurrenceSummary'] = $recurrenceSummary; + + // If not time specific + if (!$regEvent['time_specific']['value']) { + + // Do we have default reg_time entry? (event_time is 0) + $defTime = false; + if (is_array($regEvent['reg_time'])) { + + // Is there's a default entry for not time specific event? (might be others if time_specific had been selected before - they might switch back) + $defTime = false; + foreach($regEvent['reg_time'] as $r) { + + if ($r['event_time'] == 0) { + $defTime = $r; + break; + } + } + + // Get rid of other time entries and just use this one + if ($defTime !== false) { + $regEvent['reg_time'] = array(); + $regEvent['reg_time'][0] = $defTime; + } + + } + + // If no default time, create one now. + if (!$defTime) { + + $this->wpdb->insert( + GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX."reg_time", + array( + 'reg_event' => $regEvent['id'], + 'event_time' => 0, + 'start_datetime' => NULL, + 'end_datetime' => NULL, + 'all_day' => false, + 'attendees' => $regEvent['attendees']['value'], + 'attendee_max' => $regEvent['attendee_max'], + 'attendee_count' => 0, + 'attendees_pending' => 0, + 'attendees_available' => $regEvent['attendee_max'], + 'total_base_charge' => 0, + 'total_per_attendee' => 0, + 'total_other' => 0, + 'total_taxes' => 0, + 'total_charges' => 0, + 'total_discounts' => 0, + 'total_payments' => 0 + ), + array( + '%d', // reg_event + '%d', // event_time record ID + '%s', // start_datetime + '%s', // end_datetime + '%d', // all_day flag + '%d', // attendees flag + '%d', // attendee_max + '%d', // attendee_count + '%d', // attendees_pending + '%d', // attendees_available + '%f', // total_base__charge + '%f', // total_per_attendee + '%f', // total_other + '%f', // total_taxes + '%f', // total_charges + '%f', // total_discounts + '%f' // total_payments + ) + ); + + + } + + } // not time specific + + } else { // no recurrences + $reaon[] = 'Event has no recurrence data!'; + } + + } // have event data } else { $reason = 'Unable to load registration event data or registration event not selected.'; } + // Check if we need the times entries reloaded + if ($needTimesReloaded) { + + // Get all reg_time records for this event + require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataRegTime.php'; + $RegTime = new GlmDataRegistrationsRegTime($this->wpdb, $this->config); + $regEvent['reg_time'] = $RegTime->getList('T.reg_event = '.$regEventID, 'start_datetime', true); + + } + $view = 'eventDashboard'; break; @@ -496,6 +609,8 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent update_option('glmMembersDatabaseRegistrationsRegEventID', $regEventID); } + //echo "
".print_r($regEvent,1)."
"; + // Compile template data $templateData = array( 'option' => $option, diff --git a/models/front/registrations/registration.php b/models/front/registrations/registration.php index ef5e848..a4b5aa1 100644 --- a/models/front/registrations/registration.php +++ b/models/front/registrations/registration.php @@ -108,18 +108,19 @@ $regRequestJSON = json_encode( $cart['request'], JSON_NUMERIC_CHECK ); } - switch ( $option ) { default: // Get the RegEvent entry $regEvent = $this->getEventConfig( $eventRegID ); - // echo '
$regEvent: ' . print_r( $regEvent, true ) . '
'; + echo '
$regEvent: ' . print_r( $regEvent, true ) . '
'; $event = array( 'id' => $regEvent['id'], 'event' => $regEvent['event'], 'event_name' => $regEvent['event_name'], 'event_code' => $regEvent['event_code'], 'descr' => $regEvent['descr'], + 'time_specific' => $regEvent['time_specific']['value'], + 'reg_time' => $regEvent['reg_time'], 'attendee_max' => $regEvent['attendee_max'], 'attendee_max_per_reg' => $regEvent['attendee_max_per_reg'], 'reg_hold_minutes' => $regEvent['reg_hold_minutes'], @@ -214,7 +215,6 @@ 'regClassesJSON' => $regClassJSON, 'regCartJSON' => $regCartJSON, 'regRequestJSON' => $regRequestJSON, - 'eventData' => $eventData, 'loginAccount' => $loginAccount, 'termsJSON' => $termsJSON, 'regJSON' => json_encode( $registrants, JSON_NUMERIC_CHECK ), diff --git a/setup/databaseScripts/create_database_V0.0.12.sql b/setup/databaseScripts/create_database_V0.0.13.sql similarity index 98% rename from setup/databaseScripts/create_database_V0.0.12.sql rename to setup/databaseScripts/create_database_V0.0.13.sql index 651040d..667db41 100644 --- a/setup/databaseScripts/create_database_V0.0.12.sql +++ b/setup/databaseScripts/create_database_V0.0.13.sql @@ -526,13 +526,12 @@ CREATE TABLE {prefix}reg_request ( ---- -- Registration for a specific event --- Has one or more reg_selected_rate records associated with it - *** Need to remove from this table: account, total_charge **** +-- Has one or more reg_selected_rate records associated with it CREATE TABLE {prefix}reg_request_event ( id INT NOT NULL AUTO_INCREMENT, reg_request INT NULL, -- Pointer to reg_request table reg_event INT NULL, -- Pointer to reg_event event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data - reg_time INT NULL, -- Pointer to times table entry in Events add-on event_datetime DATETIME NULL, -- Date and time of event time selected so it will always be in the cart mf_data TEXT NULL, -- Any MagicForm data associated with requested event notes TEXT NULL, -- System operator's notes for this registration request @@ -545,12 +544,11 @@ CREATE TABLE {prefix}reg_request_event ( ---- -- A particular reg_class selected --- Has one or more reg_request_rate records associated with it - *** Need to remove from this table: account, total_class_charge **** +-- Has one or more reg_request_rate records associated with it CREATE TABLE {prefix}reg_request_class ( id INT NOT NULL AUTO_INCREMENT, reg_event INT NULL, -- Pointer to reg_event entry event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data - reg_time INT NULL, -- Pointer to times table entry in Events add-on event_datetime DATETIME NULL, -- Date and time of event time selected so it will always be in the cart reg_request INT NULL, -- Pointer to the registration request record reg_request_event INT NULL, -- Pointer to reg_request_event table entry @@ -567,12 +565,11 @@ CREATE TABLE {prefix}reg_request_class ( ---- -- A particular reg_rate selected --- Has one or more reg_request_registrant records associated with it - *** Need to remove from this table: account, numb_registrants, total_registrant_charges **** +-- Has one or more reg_request_registrant records associated with it CREATE TABLE {prefix}reg_request_rate ( id INT NOT NULL AUTO_INCREMENT, reg_event INT NULL, -- Pointer to reg_event entry event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data - reg_time INT NULL, -- Pointer to times table entry in Events add-on event_datetime DATETIME NULL, -- Date and time of event time selected so it will always be in the cart reg_request INT NULL, -- Pointer to the registration request record reg_request_event INT NULL, -- Pointer to reg_request_event table entry @@ -593,7 +590,7 @@ CREATE TABLE {prefix}reg_request_rate ( ---- --- A specific registrant for a selected registration rate - *** Need to remove from this table: reg_request_registrant, reg_request_hold, reg_request_hold_not_available **** +-- A specific registrant for a selected registration rate CREATE TABLE {prefix}reg_request_registrant ( id INT NOT NULL AUTO_INCREMENT, account INT NULL, -- Pointer to the account entry for the person being registered - False (0) if account no longer exists or registrant account not needed diff --git a/setup/databaseScripts/dbVersions.php b/setup/databaseScripts/dbVersions.php index d71e653..84e91bb 100644 --- a/setup/databaseScripts/dbVersions.php +++ b/setup/databaseScripts/dbVersions.php @@ -25,7 +25,8 @@ $glmMembersRegistrationsDbVersions = array( '0.0.9' => array('version' => '0.0.9', 'tables' => 19, 'date' => '04/24/2017'), '0.0.10' => array('version' => '0.0.10', 'tables' => 20, 'date' => '04/25/2017'), '0.0.11' => array('version' => '0.0.11', 'tables' => 20, 'date' => '04/29/2017'), - '0.0.12' => array('version' => '0.0.12', 'tables' => 20, 'date' => '09/11/2017') + '0.0.12' => array('version' => '0.0.12', 'tables' => 20, 'date' => '09/11/2017'), + '0.0.13' => array('version' => '0.0.13', 'tables' => 20, 'date' => '10/03/2017') ); diff --git a/setup/databaseScripts/drop_database_V0.0.12.sql b/setup/databaseScripts/drop_database_V0.0.13.sql similarity index 100% rename from setup/databaseScripts/drop_database_V0.0.12.sql rename to setup/databaseScripts/drop_database_V0.0.13.sql diff --git a/setup/databaseScripts/update_database_V0.0.13.sql b/setup/databaseScripts/update_database_V0.0.13.sql new file mode 100644 index 0000000..193a284 --- /dev/null +++ b/setup/databaseScripts/update_database_V0.0.13.sql @@ -0,0 +1,57 @@ +-- Gaslight Media Members Database - Registratiuons Add-On +-- File Created: 10/03/17 11:00:00 +-- Database Version: 0.0.13 +-- Database Update From Previous Version Script +-- +-- To permit each query below to be executed separately, +-- all queries must be separated by a line with four dashes + +ALTER TABLE {prefix}reg_request_event DROP COLUMN account; + +---- + +ALTER TABLE {prefix}reg_request_event DROP COLUMN total_charge; + +---- + +ALTER TABLE {prefix}reg_request_event DROP COLUMN reg_time; + +---- + +ALTER TABLE {prefix}reg_request_class DROP COLUMN account; + +---- + +ALTER TABLE {prefix}reg_request_class DROP COLUMN total_class_charge; + +---- + +ALTER TABLE {prefix}reg_request_class DROP COLUMN reg_time; + +---- + +ALTER TABLE {prefix}reg_request_rate DROP COLUMN account; + +---- + +ALTER TABLE {prefix}reg_request_rate DROP COLUMN numb_registrants; + +---- + +ALTER TABLE {prefix}reg_request_rate DROP COLUMN total_registrant_charges; + +---- + +ALTER TABLE {prefix}reg_request_rate DROP COLUMN reg_time; + +---- + +ALTER TABLE {prefix}reg_request_registrant DROP COLUMN reg_request_registrant; + +---- + +ALTER TABLE {prefix}reg_request_registrant DROP COLUMN reg_request_hold; + +---- + +ALTER TABLE {prefix}reg_request_registrant DROP COLUMN reg_request_hold_not_available; diff --git a/views/admin/registrations/eventDashboard.html b/views/admin/registrations/eventDashboard.html index 20f7fc2..adeeb90 100644 --- a/views/admin/registrations/eventDashboard.html +++ b/views/admin/registrations/eventDashboard.html @@ -67,19 +67,46 @@
- {if $haveRegEvent} + {if $haveRegEvent}

Dates and Availability

+ + {if $regEvent.time_specific.value} +

*** NEED TO ADD POP-UP FOR EDITING OF MAX ATTENDEES AND ATTENDEE LIST FOR EACH DATE ***

+ +

Availability guide: (limit)-(registered)-(pending)-(available)

-
+
{else} -

Did not find selected event.

+

Event occurs every day from first day to last day at the times shown.

+ + {foreach $regEvent.recurrenceSummary as $rs} + + + {/foreach} + {foreach $regEvent.reg_time as $rt} + {if $rt.attendee_max == 0} + + {else} + + + + + + + {/if} + {/foreach} +
First Day of Event: {$rs.firstTime.start_time.datetime} - {$rs.firstTime.end_time.datetime}
Last Day of Event: {$rs.lastTime.start_time.datetime} - {$rs.lastTime.end_time.datetime}
Unlimited registration - Not maintaining available inventory.
 
Limited availability for this event - the below numbers are for all days. +
*** NEED TO ADD EDITING OF MAX ATTENDEES *** +
Maximum attendees: {$rt.attendee_max}
Registered: {$rt.attendee_count}
Attendees pending in carts: {$rt.attendees_pending}
Currently available: {$rt.attendees_available}
{/if} - + {else} +

Did not find selected event.

+ {/if}
@@ -88,38 +115,45 @@ var fullCalendarLoaded = false; - /* - * Initialize the Full Calendar - */ - function initFullCalendar(){ - $('#eventCalendar').fullCalendar({ - {if $haveRegEventTimes} - events: [ - {$sep = ''} - {foreach $regEvent.recurrences as $r} - {foreach $r['times'] as $t} - {$sep}{ - title : 'Event Calendar', - start : '{$t.start_time.datetime}', - end : '{$t.end_time.datetime}', - allday : {$t.all_day.value} - } - {$sep = ','} - {/foreach} - {/foreach} - ], - defaultDate : '{$regEventFirstTime.start_time.datetime}', - timeFormat : 'h:mma', - fixedWeekCount : false, - eventClick: function(calEvent, jsEvent, view) { - $("#occurrences").dialog(); - $(this).css('border-color', 'red'); - } - {/if} - }); - } + // If this is a time specific event, then display the calendar + if ({$regEvent.time_specific.value}) { + + /* + * Initialize the Full Calendar + */ + function initFullCalendar(){ + $('#eventCalendar').fullCalendar({ + {if $regEvent} + events: [ + {$sep = ''} + {foreach $regEvent.reg_time as $t} + {$sep}{ + {if $t.attendee_max == 0} + title : 'unlimited', + {else} + title : '{$t.attendee_max}-{$t.attendee_count}-{$t.attendees_pending}-{$t.attendees_available}', + {/if} + start : '{$t.start_datetime.datetime}', + end : '{$t.end_datetime.datetime}', + allday : {$t.all_day.value} + } + {$sep = ','} + {/foreach} + ], + defaultDate : '{$regEventFirstTime.start_time.datetime}', + timeFormat : 'h:mma', + fixedWeekCount : false, + eventClick: function(calEvent, jsEvent, view) { + $("#occurrences").dialog(); + $(this).css('border-color', 'red'); + } + {/if} + }); + } + + initFullCalendar(); - initFullCalendar(); + } // Flash certain elements for a short time after display $(".glm-flash-updated").fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500).fadeIn(500).fadeOut(500); diff --git a/views/front/registrations/registration.html b/views/front/registrations/registration.html index 3de4609..72c9cdd 100644 --- a/views/front/registrations/registration.html +++ b/views/front/registrations/registration.html @@ -1,4 +1,4 @@ -{* Event Registration App - Backbone.js *} +{* Even Registration App - Backbone.js *} {* Underscore Templates for the Event Registration App *} {* Template for Account Login *}{literal}