work on tidying up study group calculation functions

This commit is contained in:
Nathan Coad
2016-06-24 12:07:37 +10:00
parent a38efd654c
commit 1322956634

View File

@@ -576,7 +576,7 @@ function booking_studygroups_edit_form_submit($form, &$form_state) {
db_insert('booking_studygroup_mapping') db_insert('booking_studygroup_mapping')
->fields(array( ->fields(array(
'booking_eventid' => $event->eid, 'booking_eventid' => $event->eid,
'booking_node_id' => $nid, 'booking_node_id' => $nid,
'booking_studygroup_id' => $key, 'booking_studygroup_id' => $key,
'booking_session_id' => $value, 'booking_session_id' => $value,
@@ -726,6 +726,8 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
); );
} }
_booking_studygroups_update_preallocate($group, $group_mapping, $working_list, $session_count, $calculation_messages);
/*
//@todo move this foreach loop into a separate function //@todo move this foreach loop into a separate function
//search for the leaders helpers, spouses and boyfriend/girlfriend for this study group to pre-allocate //search for the leaders helpers, spouses and boyfriend/girlfriend for this study group to pre-allocate
foreach ($group_mapping as $person) { foreach ($group_mapping as $person) {
@@ -834,6 +836,8 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
} //end looking at people with spouse or bf/gf } //end looking at people with spouse or bf/gf
} //end checking for matching study group id } //end checking for matching study group id
} //end searching for people to pre-allocate } //end searching for people to pre-allocate
*/
//watchdog('booking', "<pre>Attendee list working copy after pre-processing:\n@info</pre>", array('@info' => print_r( $working_list, true))); //watchdog('booking', "<pre>Attendee list working copy after pre-processing:\n@info</pre>", array('@info' => print_r( $working_list, true)));
//watchdog('booking', "Attendee list working copy after leader/helper spouse processing: @info", array('@info' => var_export($working_list, TRUE))); //watchdog('booking', "Attendee list working copy after leader/helper spouse processing: @info", array('@info' => var_export($working_list, TRUE)));
@@ -852,23 +856,24 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
$i = 1; $i = 1;
//iterate over the attendee list //iterate over the attendee list
while ( $it->valid() ) while ( $it->valid() ) {
{
//cycle the session counter if we already reached the end //cycle the session counter if we already reached the end
if ($i > $group->booking_num_group_sessions) if ($i > $group->booking_num_group_sessions) {
$i = 1; $i = 1;
}
//get the current attendee element //get the current attendee element
$current = $it->current(); $current = $it->current();
//assign this attendee to this session if unprocessed so far //assign this attendee to this session if unprocessed so far
if ($current->processed == 0) if ($current->processed == 0) {
{
//use their existing study group as a starting point, if already defined //use their existing study group as a starting point, if already defined
if ($current->session > 0) if ($current->session > 0) {
$start = $current->session; $start = $current->session;
else }
else {
$start = $i; $start = $i;
}
//generate stats about this attendee //generate stats about this attendee
$gender = $current->booking_gender == 'M' ? 'male' : 'female'; $gender = $current->booking_gender == 'M' ? 'male' : 'female';
@@ -897,8 +902,7 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
} //end processed check } //end processed check
//move to the next unprocessed attendee in the list //move to the next unprocessed attendee in the list
while ($it->valid() && $it->current()->processed == 1) while ($it->valid() && $it->current()->processed == 1) {
{
//drupal_set_message(t("Skipping attendee ID !id, already processed.", array('!id' => $it->key()))); //drupal_set_message(t("Skipping attendee ID !id, already processed.", array('!id' => $it->key())));
$it->next(); $it->next();
} }
@@ -909,24 +913,20 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
//now calculate the updates for the database //now calculate the updates for the database
foreach($working_list as $person) foreach($working_list as $person) {
{
$found = FALSE; $found = FALSE;
$message = ""; $message = "";
//iterate all the groups for each person //iterate all the groups for each person
foreach ($group_mapping as $mapping) foreach ($group_mapping as $mapping) {
{
//check if we can find a study group session already for this user and this study group (eg Monday Tuesday or Wednesday) //check if we can find a study group session already for this user and this study group (eg Monday Tuesday or Wednesday)
if ($person->nid == $mapping->booking_node_id && $group->sid == $mapping->booking_studygroup_id) if ($person->nid == $mapping->booking_node_id && $group->sid == $mapping->booking_studygroup_id) {
{
//keep track of our success to avoid doing an insert //keep track of our success to avoid doing an insert
$found = TRUE; $found = TRUE;
//if the existing session is not the same as our newly calculated session, run an update query //if the existing session is not the same as our newly calculated session, run an update query
//if ($mapping->booking_session_id !== $person->session && $group->sid != $reading_group_id) //if ($mapping->booking_session_id !== $person->session && $group->sid != $reading_group_id)
if ($mapping->booking_session_id !== $person->session && $group->booking_is_readinggroup == 'N') if ($mapping->booking_session_id !== $person->session && $group->booking_is_readinggroup == 'N') {
{
$message = t('Suggest changing user !id (!name) from session !old to !session. Role id is !role', $message = t('Suggest changing user !id (!name) from session !old to !session. Role id is !role',
array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session, array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session,
'!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname)); '!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname));
@@ -940,8 +940,7 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
} }
//elseif ($mapping->booking_session_id !== $person->session && $group->sid == $reading_group_id) //elseif ($mapping->booking_session_id !== $person->session && $group->sid == $reading_group_id)
elseif ($mapping->booking_session_id !== $person->session && $group->booking_is_readinggroup == 'Y') elseif ($mapping->booking_session_id !== $person->session && $group->booking_is_readinggroup == 'Y') {
{
$message = t('Suggest changing user !id (!name) from reading group session !old to !session. Role id is !role', $message = t('Suggest changing user !id (!name) from reading group session !old to !session. Role id is !role',
array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session, array('!id' => $person->nid, '!old' => $mapping->booking_session_id, '!session' => $person->session,
'!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname)); '!role' => $person->booking_studygroup_role, '!name' => $person->booking_firstname . " " . $person->booking_lastname));
@@ -961,8 +960,7 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
} //end looping through study group mappings } //end looping through study group mappings
//if we didn't find an existing record, add it to the list to insert //if we didn't find an existing record, add it to the list to insert
if (! $found && $person->session <> 0) if (! $found && $person->session <> 0) {
{
$message = t('Found no existing study group session for user id !id (!name). Adding to list of inserts for session !session.', $message = t('Found no existing study group session for user id !id (!name). Adding to list of inserts for session !session.',
array('!id' => $person->nid, '!sid' => $mapping->sid, '!session' => $person->session, array('!id' => $person->nid, '!sid' => $mapping->sid, '!session' => $person->session,
'!name' => $person->booking_firstname . " " . $person->booking_lastname '!name' => $person->booking_firstname . " " . $person->booking_lastname
@@ -979,8 +977,7 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
} }
//log any update we made //log any update we made
if ($message !== "") if ($message !== "") {
{
$update_messages[] = $message; $update_messages[] = $message;
//watchdog('booking', $message); //watchdog('booking', $message);
} }
@@ -998,21 +995,11 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
watchdog('booking', "<pre>" . $final_message . "\n" . implode("\n", $update_messages) . "</pre>"); watchdog('booking', "<pre>" . $final_message . "\n" . implode("\n", $update_messages) . "</pre>");
//make sure to update team colours if necessary //make sure to update team colours if necessary
if ($group->booking_is_readinggroup == 'Y') if ($group->booking_is_readinggroup == 'Y') {
{
booking_studygroups_process_colours(); booking_studygroups_process_colours();
} }
} //finished processing study groups } //finished processing study groups
/*
//make sure to update team colours if necessary
if ($sid == $reading_group_id)
{
booking_studygroups_process_colours();
}
*/
//watchdog('booking', "Attendee list final version: @info", array('@info' => var_export($attendees, TRUE))); //watchdog('booking', "Attendee list final version: @info", array('@info' => var_export($attendees, TRUE)));
$form['log'] = array( $form['log'] = array(
@@ -1056,7 +1043,122 @@ function booking_studygroups_update_form($node, &$form_state, $sid) {
), ),
'form' => $form, 'form' => $form,
); );
}
/**
* Process attendee list to mark attendees that should be placed based on certain criteria rather than assigned based on age/gender
* Criteria include leader/helper role, spouse, relationship, committee member
* @see booking_studygroups_update_form()
*/
function _booking_studygroups_update_preallocate($group, $group_mapping, &$session_count, &$working_list, &$calculation_messages) {
//search for the leaders helpers, spouses and boyfriend/girlfriend for this study group to pre-allocate
foreach ($group_mapping as $person) {
//dereference a bunch of fields we'll be using
$committee_flag = $working_list[$person->booking_node_id]->booking_committee_member;
$manually_allocated_flag = $person->booking_session_manually_allocated;
$spouse_id = $working_list[$person->booking_node_id]->booking_partner_id;
$bf_gf_id = $working_list[$person->booking_node_id]->booking_bf_gf_nid;
$gender = $working_list[$person->booking_node_id]->booking_gender == 'M' ? 'male' : 'female';
$session_id = $person->booking_session_id;
//if the study group id matches the group we're currently looking at
if ($person->booking_studygroup_id == $group->sid) {
//if they have a role defined
//or if they are a committee member
//or if the manually allocated flag is set
//then make sure they stay where they are
if (($person->booking_studygroup_role > 0) ||
($committee_flag == 'Y') ||
($manually_allocated_flag == 'Y')) {
$calculation_messages[] = t('Leader/helper/committee/manual allocation with id !id assigned to session !session (currently with !num people).',
array('!id' => $person->booking_node_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
//mark this position as being used
$working_list[$person->booking_node_id]->booking_studygroup_role = $person->booking_studygroup_role;
$age = _booking_get_age_years($working_list[$person->booking_node_id]->booking_dob);
_booking_assign_attendee_group($person->booking_node_id, $session_id, $gender, $age, $working_list, $session_count, $calculation_messages);
//make sure the leader/helper's partner gets updated now, otherwise they could still end up in different groups
if ($spouse_id > 0) {
//also mark their spouse as allocated to this group
$calculation_messages[] = t('Spouse with id !id assigned to session !session (currently with !num people).',
array('!id' => $spouse_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$spouse_id]->booking_dob);
$spouse_gender = $working_list[$spouse_id]->booking_gender == 'M' ? 'male' : 'female';
_booking_assign_attendee_group($spouse_id, $session_id, $spouse_gender, $age, $working_list, $session_count, $calculation_messages);
}
elseif ($bf_gf_id > 0) {
//also mark their boyfriend/girlfriend as allocated to this group
$calculation_messages[] = t('BF/GF with id !id assigned to session !session (currently with !num people).',
array('!id' => $bf_gf_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$bf_gf_id]->booking_dob);
$bfgf_gender = $working_list[$bf_gf_id]->booking_gender == 'M' ? 'male' : 'female';
_booking_assign_attendee_group($bf_gf_id, $session_id, $bfgf_gender, $age, $working_list, $session_count, $calculation_messages);
}
}
//anyone else already assigned to this group previously
elseif ($working_list[$person->booking_node_id]->processed == 0) {
if ($spouse_id > 0) {
//if the spouse has already been processed due to being a leader or helper, use that session
if ($working_list[$spouse_id]->processed == 1) {
$session_id = $working_list[$spouse_id]->session;
}
//mark this person as allocated to this group
$calculation_messages[] = t('Married person with id !id assigned to session !session (currently with !num people).',
array('!id' => $person->booking_node_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$person->booking_node_id]->booking_dob);
_booking_assign_attendee_group($person->booking_node_id, $session_id, $gender, $age, $working_list, $session_count, $calculation_messages);
//also mark their spouse as allocated to this group
$calculation_messages[] = t('Spouse with id !id assigned to session !session (currently with !num people).',
array('!id' => $spouse_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$spouse_id]->booking_dob);
$spouse_gender = $working_list[$spouse_id]->booking_gender == 'M' ? 'male' : 'female';
_booking_assign_attendee_group($spouse_id, $session_id, $spouse_gender, $age, $working_list, $session_count, $calculation_messages);
}
elseif ($bf_gf_id > 0) {
//if the bf/gf has already been processed due to being a leader or helper, use that session
if ($working_list[$bf_gf_id]->processed == 1) {
$session_id = $working_list[$bf_gf_id]->session;
}
//mark this person as allocated to this group
$calculation_messages[] = t('Person with id !id in relationship assigned to session !session (currently with !num people).',
array('!id' => $person->booking_node_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$person->booking_node_id]->booking_dob);
_booking_assign_attendee_group($person->booking_node_id, $session_id, $gender, $age, $working_list, $session_count, $calculation_messages);
//also mark their boyfriend/girlfriend as allocated to this group
$calculation_messages[] = t('BF/GF with id !id assigned to session !session (currently with !num people).',
array('!id' => $bf_gf_id, '!session' => $person->booking_session_id,
'!num' => $session_count[$person->booking_session_id]['total'])
);
$age = _booking_get_age_years($working_list[$bf_gf_id]->booking_dob);
$bfgf_gender = $working_list[$bf_gf_id]->booking_gender == 'M' ? 'male' : 'female';
_booking_assign_attendee_group($bf_gf_id, $session_id, $bfgf_gender, $age, $working_list, $session_count, $calculation_messages);
}
//for anyone else, just record what session they're currently in
else {
$working_list[$person->booking_node_id]->session = $session_id;
}
} //end looking at people with spouse or bf/gf
} //end checking for matching study group id
} //end searching for people to pre-allocate
} }
/** /**