From c9fcc056f6005d1c4ddc798467e6efea25f204d9 Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Thu, 12 Oct 2017 17:31:56 -0400 Subject: [PATCH] Fixed problem with registration level output showing up when there are no levels set in admin registrations edit. Now have cart validation basically working. Still need to remove invalid items from database. Cart Totals now being calculated. Fixed problem with rate values being passed around as strings instead of float values. Removed event_name field from reg_request_class, reg_request_rate and reg_request_registrant. --- classes/data/dataRegEvent.php | 2 + classes/data/dataRegRate.php | 22 ++- classes/data/dataRegRequestClass.php | 8 - classes/data/dataRegRequestRate.php | 18 ++ classes/data/dataRegRequestRegistrant.php | 8 - classes/regCartSupport.php | 169 +++++++++++------- js/adminRegApp.js | 2 +- js/views/admin/regClass.js | 2 +- models/admin/ajax/regFront/registrant.php | 4 +- models/admin/registrations/events.php | 6 +- models/front/registrations/cart.php | 6 +- .../create_database_V0.0.13.sql | 6 +- .../admin/registrations/eventEditLevels.html | 2 +- views/front/registrations/cart.html | 2 +- views/front/registrations/cartLinkWidget.html | 6 +- views/front/registrations/header.html | 3 + 16 files changed, 165 insertions(+), 101 deletions(-) create mode 100644 views/front/registrations/header.html diff --git a/classes/data/dataRegEvent.php b/classes/data/dataRegEvent.php index 9c9c871..c7f2619 100644 --- a/classes/data/dataRegEvent.php +++ b/classes/data/dataRegEvent.php @@ -512,6 +512,8 @@ class GlmDataRegistrationsRegEvent extends GlmDataAbstract // Restore status of extended data flag $this->postProcAddedEventData = $saveExtended; +// echo "
".print_r($this->regEventData,1)."
"; + return $this->regEventData; } diff --git a/classes/data/dataRegRate.php b/classes/data/dataRegRate.php index 1a8c44c..3d78e95 100644 --- a/classes/data/dataRegRate.php +++ b/classes/data/dataRegRate.php @@ -159,17 +159,35 @@ class GlmDataRegistrationsRegRate extends GlmDataAbstract // Base rate to register 'base_rate' => array ( 'field' => 'base_rate', + 'type' => 'float', + 'required' => true, + 'use' => 'a' + ), + + // Base rate to register + 'base_rate_money' => array ( + 'field' => 'base_rate', + 'as' => 'base_rate_money', 'type' => 'money', 'required' => false, - 'use' => 'a' + 'use' => 'gl' ), // Rate per registrant 'per_registrant' => array ( 'field' => 'per_registrant', + 'type' => 'float', + 'required' => true, + 'use' => 'a' + ), + + // Rate per registrant + 'per_registrant_money' => array ( + 'field' => 'per_registrant', + 'as' => 'per_registrant_money', 'type' => 'money', 'required' => false, - 'use' => 'a' + 'use' => 'gl' ), // Number of registrants included in base rate diff --git a/classes/data/dataRegRequestClass.php b/classes/data/dataRegRequestClass.php index 148a33c..c715d5c 100644 --- a/classes/data/dataRegRequestClass.php +++ b/classes/data/dataRegRequestClass.php @@ -124,14 +124,6 @@ class GlmDataRegistrationsRequestClass extends GlmDataAbstract 'use' => 'lgneud' ), - // Event Name - 'event_name' => array ( - 'field' => 'event_name', - 'type' => 'text', - '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 372080c..5e1d140 100644 --- a/classes/data/dataRegRequestRate.php +++ b/classes/data/dataRegRequestRate.php @@ -176,6 +176,15 @@ class GlmDataRegistrationsRegRequestRate extends GlmDataAbstract // Base rate at time of registration 'base_rate' => array ( 'field' => 'base_rate', + 'type' => 'float', + 'required' => true, + 'use' => 'a' + ), + + // Base rate at time of registration + 'base_rate_money' => array ( + 'field' => 'base_rate', + 'as' => 'base_rate_money', 'type' => 'money', 'required' => false, 'use' => 'a' @@ -184,6 +193,15 @@ class GlmDataRegistrationsRegRequestRate extends GlmDataAbstract // Per Registrant Rate at time of registration 'per_registrant' => array ( 'field' => 'per_registrant', + 'type' => 'float', + 'required' => false, + 'use' => 'a' + ), + + // Per Registrant Rate at time of registration + 'per_registrant_money' => array ( + 'field' => 'per_registrant', + 'as' => 'per_registrant_money', 'type' => 'money', 'required' => false, 'use' => 'a' diff --git a/classes/data/dataRegRequestRegistrant.php b/classes/data/dataRegRequestRegistrant.php index c9a9e00..5b6a151 100644 --- a/classes/data/dataRegRequestRegistrant.php +++ b/classes/data/dataRegRequestRegistrant.php @@ -132,14 +132,6 @@ class GlmDataRegistrationsRequestRegistrant extends GlmDataAbstract 'use' => 'lgneud' ), - // Event Name - 'event_name' => array ( - 'field' => 'event_name', - 'type' => 'text', - 'required' => true, - 'use' => 'lgneud' - ), - // Pointer reg_time entry 'reg_time' => array ( 'field' => 'reg_time', diff --git a/classes/regCartSupport.php b/classes/regCartSupport.php index 1714ad0..1eb5795 100644 --- a/classes/regCartSupport.php +++ b/classes/regCartSupport.php @@ -216,7 +216,7 @@ class GlmRegCartSupport $this->addAccountToCart($registrant['account']); // Add time data to reg_times table - $this->addTimeToCart($registrant['reg_time']); +// **** $this->addTimeToCart($registrant['reg_time']); } // Each Registrant } @@ -302,8 +302,10 @@ class GlmRegCartSupport $totalDiscounts = 0; $grandTotal = 0; - // If we have a cart (request) - if ($this->cart) { + $this->cart['blockCheckout'] = false; + + // If we have a cart and a good request array + if ($this->cart && is_array($this->cart['request'])) { // If a submission account is specified (otherwise it should be a guest user prior to checkout) if ($this->cart['request']['account'] && !isset($this->cart['accounts'][$this->cart['request']['account']])) { @@ -317,6 +319,7 @@ class GlmRegCartSupport // If we don't have events for this cart if (!is_array($this->cart['events']) || count($this->cart['events']) == 0) { $this->cart['messages'][] = 'Cart is empty.'; + $this->cart['blockCheckout'] = true; } else { // Loop through all events in the cart @@ -325,20 +328,21 @@ class GlmRegCartSupport $eventRegistrants = 0; $eventCharges = 0; $eventDiscounts = 0; - $eventTotal = 0; - // Do event Checks + // Assume this event is OK + $this->cart['events'][$eventKey]['removed'] = false; + + // Update reg_time entries for current availability and get the event data; + $regEvent = $RegEvent->checkEventTimes($event['id']); // Check if Event exists in Events add-on and is active in registrations or if doing admin (admin_active) $regEvent = $RegEvent->getEntry($event['reg_event']); if (!$regEvent) { $this->cart['messages'][] = 'Event in cart is not currently available for registration.'; + $this->cart['events'][$eventKey]['removed'] = true; + $this->cart['blockCheckout'] = true; } - // Check if the event is time-specific and if there's a list of times for this event - If not, should be a default - - - /* * Classes (levels) Processing */ @@ -346,6 +350,8 @@ class GlmRegCartSupport // If we don't have classes for this event if (!is_array($event['classes']) || count($event['classes']) == 0 ) { $this->cart['messages'][] = 'Event '.$event['event_name'].' has no levels.'; + $this->cart['events'][$eventKey]['removed'] = true; + $this->cart['blockCheckout'] = true; } else { // Loop through all classes (levels) for this event @@ -354,10 +360,8 @@ class GlmRegCartSupport $classRegistrants = 0; $classCharges = 0; $classDiscounts = 0; - $classTotal = 0; - - // Do class (level) checks + $this->cart['events'][$eventKey]['classes'][$classKey]['removed'] = false; /* * Rates Processing @@ -366,107 +370,144 @@ class GlmRegCartSupport // If we don't have rates for this class if (!is_array($class['rates']) || count($class['rates']) == 0 ) { $this->cart['messages'][] = 'Class '.$class['class_name'].' has no rates.'; + $this->cart['events'][$eventKey]['classes'][$classKey]['removed'] = true; + $this->cart['blockCheckout'] = true; } else { // loop through all rates foreach ($class['rates'] as $rateKey => $rate) { - $rateRegistrants = 0; - $rateCharges = 0; - $rateDiscounts = 0; - $rateTotal = 0; + $rateRegistrants = 0; + $rateBaseCharge = 0; + $rateRegistrantCharges = 0; + $rateDiscounts = 0; + + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['removed'] = false; - // Do rate Checks + // Get rate data + $eventRate = $RequestRate->getEntry($rate['id']); + if (!$eventRate) { + $this->cart['message'][] = 'Event rate '.$rate['rage_name'].' is no longer listed - Removed registrants for this rate.'; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['removed'] = true; + } else { + /* + * Registrants Processing + */ - // Update reg_time entries for current availability - // Check if listed rate is currently available - If not, add as a problem + // If we don't have registrants for this class + if (!is_array($rate['registrants']) || count($rate['registrants']) == 0 ) { + $this->cart['messages'][] = 'Rate '.$rate['rate_name'].' has no registrants.'; + $this->cart['blockCheckout'] = true; + } else { - /* - * Registrants Processing - */ + // loop through all Registrants + foreach ($rate['registrants'] as $registrantKey => $registrant) { - // If we don't have registrants for this class - if (!is_array($rate['registrants']) || count($rate['registrants']) == 0 ) { - $this->cart['messages'][] = 'Rate '.$rate['rate_name'].' has no registrants.'; - } else { + $registrantCharges = 0; + $registrantDiscounts = 0; - // loop through all Registrants - foreach ($rate['registrants'] as $registrantKey => $registrant) { + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['removed'] = false; - $registrantCharges = 0; - $registrantDiscounts = 0; - $registrantTotal = 0; + // Check the if registrant still has a time slot hold - // Do registrant checks + // If this registrant is flagged for removal from cart + if ($this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['removed']) { +// *** remove registrant from cart in Database + // Otherwise add registrant to totals + } else { + // Add registrant to totals + if ($rateRegistrants == 0) { + $rateBaseCharge = $rate['base_rate']; + } + $rateRegistrants++; + if ($rateRegistrants > $rate['registrant_credits']) { + $registrantCharges = $rate['per_registrant']; + } - // Save totals for this registrant - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['totalCharges'] = $registrantCharges; - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['totalDiscounts'] = $registrantDiscounts; - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['rateTotal'] = $registrantTotal; + $rateRegistrantCharges += $registrantCharges; + $rateDiscounts += $registrantDiscounts; + } - // Add totals to rate - $rateRegistrants++; - $rateCharges += $registrantCharges; - $rateDiscounts += $registrantDiscounts; - $rateTotal += $registrantTotal; + // Save totals for this registrant + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['registrantRate'] = $registrantCharges; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['registrants'][$registrantKey]['registrantDiscounts'] = $registrantDiscounts; - } // Each registrant + } // Each registrant - } // Have registrants + } // Have registrants - // Save totals for this rate - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['totalRegistrants'] = $rateRegistrants; - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['totalCharges'] = $rateCharges; - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['totalDiscounts'] = $rateDiscounts; - $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['rateTotal'] = $rateTotal; + // Save totals for this rate + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['rateRegistrants'] = $rateRegistrants; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['rateBaseCharge'] = $rateBaseCharge; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['rateRegistrantCharges'] = $rateRegistrantCharges; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['totalDiscounts'] = $rateDiscounts; + $this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['rateTotal'] = ( $rateBaseCharge + $rateRegistrantCarges ); - // Add totals to class - $classRegistrants += $rateRegistrants; - $classCharges += $rateCharges; - $classDiscounts += $rateDiscounts; - $classTotal += $rateTotal; + // Add totals to class + $classRegistrants += $rateRegistrants; + $classCharges += ( $rateBaseCharge + $rateRegistrantCharges); + $classDiscounts += $rateDiscounts; + + // If rate has been flagged for removal from cart, delete it in the database + if ($this->cart['events'][$eventKey]['classes'][$classKey]['rates'][$rateKey]['removed']) { +// *** remove rate from cart in Database + } + + + } // Have rate } // Each Rate } // Have rates // Save totals for this class (level) - $this->cart['events'][$eventKey]['classes'][$classKey]['totalRegistrants'] = $classRegistrants; - $this->cart['events'][$eventKey]['classes'][$classKey]['totalCharges'] = $classCharges; - $this->cart['events'][$eventKey]['classes'][$classKey]['totalDiscounts'] = $classDiscounts; - $this->cart['events'][$eventKey]['classes'][$classKey]['classTotal'] = $classTotal; + $this->cart['events'][$eventKey]['classes'][$classKey]['classRegistrants'] = $classRegistrants; + $this->cart['events'][$eventKey]['classes'][$classKey]['classCharges'] = $classCharges; + $this->cart['events'][$eventKey]['classes'][$classKey]['classDiscounts'] = $classDiscounts; // Add totals to event $eventRegistrants += $classRegistrants; $eventCharges += $classCharges; $eventDiscounts += $classDiscounts; - $eventTotal += $classTotal; + // If class has been flagged for removal from cart, delete it from cart in database + if ($this->cart['events'][$eventKey]['classes'][$classKey]['removed']) { +// *** remove class from cart in Database + } } // Each class } // Have Classes // Save totals for this event - $this->cart['events'][$eventKey]['totalRegistrants'] = $eventRegistrants; - $this->cart['events'][$eventKey]['totalCharges'] = $eventCharges; - $this->cart['events'][$eventKey]['totalDiscounts'] = $eventDiscounts; - $this->cart['events'][$eventKey]['eventTotal'] = $eventTotal; + $this->cart['events'][$eventKey]['eventRegistrants'] = $eventRegistrants; + $this->cart['events'][$eventKey]['eventCharges'] = $eventCharges; + $this->cart['events'][$eventKey]['eventDiscounts'] = $eventDiscounts; // Add totals to request - $totalCharges += $eventCharges; $totalRegistrants += $eventRegistrants; + $totalCharges += $eventCharges; $totalDiscounts += $eventDiscounts; - $grandTotal += $eventTotal; + + // If event has been flagged for removal from cart, delete it from cart in database + if ($this->cart['events'][$eventKey]['removed']) { +//*** remove event from cart in Database + } } // Each event } // Have events + // Save totals for this request + $this->cart['totalRegistrants'] = $totalRegistrants; + $this->cart['totalCharges'] = $totalCharges; + $this->cart['totalDiscounts'] = $totalDiscounts; + // Update request last_update timestamp +// *** update cart last_update time } // have request diff --git a/js/adminRegApp.js b/js/adminRegApp.js index 08a8191..c11370b 100644 --- a/js/adminRegApp.js +++ b/js/adminRegApp.js @@ -304,7 +304,7 @@ app.Views.Admin.RegClass = Backbone.View.extend({ * be an object, which is why the explicit === below. */ if (addFlag === true) { - + console.log('New level created'); this.$('.class-display-template').hide(); this.$('.class-edit-template').show(); diff --git a/js/views/admin/regClass.js b/js/views/admin/regClass.js index 13f3deb..f1ca5f3 100644 --- a/js/views/admin/regClass.js +++ b/js/views/admin/regClass.js @@ -185,7 +185,7 @@ app.Views.Admin.RegClass = Backbone.View.extend({ * be an object, which is why the explicit === below. */ if (addFlag === true) { - + console.log('New level created'); this.$('.class-display-template').hide(); this.$('.class-edit-template').show(); diff --git a/models/admin/ajax/regFront/registrant.php b/models/admin/ajax/regFront/registrant.php index 300bff1..92b3d6e 100644 --- a/models/admin/ajax/regFront/registrant.php +++ b/models/admin/ajax/regFront/registrant.php @@ -234,8 +234,8 @@ class GlmMembersAdmin_registrations_ajax_registrant extends GlmDataRegistrations '%d', // reg_request_class '%d', // rate '%d', // rate_name - '%s', // base_rate - '%s', // per_registrant + '%f', // base_rate + '%f', // per_registrant '%d', // registrant_credits ); if ( !$regRequestRate ) { diff --git a/models/admin/registrations/events.php b/models/admin/registrations/events.php index 49a36ae..a5fa9c7 100644 --- a/models/admin/registrations/events.php +++ b/models/admin/registrations/events.php @@ -171,15 +171,13 @@ class GlmMembersAdmin_registrations_events extends GlmDataRegistrationsRegEvent } if (is_array($regEvent['reg_class'])) { $regEvent['reg_class'] = array_values($regEvent['reg_class']); + $regClassesJSON = json_encode($regEvent['reg_class']); } if (is_array($regEvent['reg_time'])) { $regEvent['reg_time'] = array_values($regEvent['reg_time']); + $regTimesJSON = json_encode($regEvent['reg_time']); } - // Separate Event, Classes, and Times and send those as separate JSONs - $regClassesJSON = json_encode($regEvent['reg_class']); - $regTimesJSON = json_encode($regEvent['reg_time']); - // Get rid of class and time arrays so we just have the event data unset($regEvent['reg_class']); unset($regEvent['reg_time']); diff --git a/models/front/registrations/cart.php b/models/front/registrations/cart.php index 6c061a6..0fb52ea 100644 --- a/models/front/registrations/cart.php +++ b/models/front/registrations/cart.php @@ -145,13 +145,13 @@ class GlmMembersFront_registrations_cart extends GlmRegCartSupport break; } - +//echo "
".print_r($this->config,1)."
"; // Compile template data $templateData = array( 'cartId' => $cartId, 'haveCart' => $haveCart, - 'cart' => $this->cart - + 'cart' => $this->cart, + 'regUrl' => GLM_MEMBERS_REGISTRATIONS_SITE_BASE_URL.$this->config['settings']['canonical_reg_page'].'/' ); //echo "
".print_r($templateData,1)."
"; diff --git a/setup/databaseScripts/create_database_V0.0.13.sql b/setup/databaseScripts/create_database_V0.0.13.sql index 667db41..dd6a5b5 100644 --- a/setup/databaseScripts/create_database_V0.0.13.sql +++ b/setup/databaseScripts/create_database_V0.0.13.sql @@ -548,7 +548,7 @@ CREATE TABLE {prefix}reg_request_event ( 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 +-- **** event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data 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 @@ -569,7 +569,7 @@ CREATE TABLE {prefix}reg_request_class ( 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 +-- **** event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data 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 @@ -595,7 +595,7 @@ 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 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 +-- **** event_name TINYTEXT NULL, -- Name of Event so it will always be in the cart data reg_time INT NULL, -- Pointer reg_time entry 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 diff --git a/views/admin/registrations/eventEditLevels.html b/views/admin/registrations/eventEditLevels.html index 0dd78ef..cdfc20f 100644 --- a/views/admin/registrations/eventEditLevels.html +++ b/views/admin/registrations/eventEditLevels.html @@ -36,7 +36,7 @@