Files
booking/booking.studygroup_leaders.inc

343 lines
12 KiB
PHP

<?php
/**
* @file
* Functions for calculating leaders and helpers for discussion groups
*/
/**
* Function for calculating and assigning leaders and helpers to active study group sessions
*/
function booking_studygroups_leaders_calculate() {
global $event;
$calculation_messages = array();
//get a randomly ordered list of people to work with
$people = _booking_shuffle_assoc(_booking_studygroups_retrieve_eligible_people());
//get details of the study groups
$groups = _booking_studygroups_retrieve_groups();
//loop through the list of people
foreach ($people as $person)
{
$age = _booking_get_age_years($person->booking_dob);
$calculation_messages[] = t('Processing eligible Leader/helper with id !id and age !age',
array('!id' => $person->nid, '!age' => $age)
);
foreach ($groups as $studygroup)
{
//watchdog('booking_debug', "<pre>Study Group Element\n@info</pre>", array('@info' => print_r( $studygroup, true)));
if ($age >= 22 && $studygroup->leader_nid == 0)
{
$studygroup->leader_nid = $person->nid;
$calculation_messages[] = t("Study Group Assignment as leader for nid !nid to group !descrip at session id !sid",
array('!nid' => $person->nid, '!descrip' => $studygroup->booking_studygroup_descrip, '!sid' => $studygroup->session_id, '@info' => print_r( $studygroup, true)));
break;
}
elseif ($age < 22 && $studygroup->helper_nid == 0)
{
$studygroup->helper_nid = $person->nid;
$calculation_messages[] = t("Study Group Assignment as helper for nid !nid to group !descrip at session id !sid",
array('!nid' => $person->nid, '!descrip' => $studygroup->booking_studygroup_descrip, '!sid' => $studygroup->session_id, '@info' => print_r( $studygroup, true)));
break;
}
}
//if someone is 22 or over, they're a leader
//$next_group_index = $groups[_booking_get_next_studygroup('leader_nid', $groups)];
//$groups[$next_group_index]->leader_nid = $person->nid;
//if someone is under 22, they're a helper
//left over people become a reserve leader
}
watchdog('booking', "<pre>Study Group Leader/Helper calculation\n" . implode("\n", $calculation_messages) . "</pre>");
//input the data to the database
}
function _booking_get_next_studygroup($type, $studygroups) {
$count = count($studygroups) - 1;
for ($i = 0; $i < $count; $i++)
{
$group = $studygroups[$i];
$leader = $group->leader_nid;
//watchdog('booking_debug', "<pre>Study Group Element at index $i:\n@info</pre>", array('@info' => print_r( $group, true)));
//watchdog('booking_debug', "<pre>Study Group Leader NID at index $i:\n@info</pre>", array('@info' => var_dump($group)));
if ($leader == 0)
{
return $i;
}
}
}
/**
* Function for
*/
function _booking_studygroups_retrieve_eligible_people() {
global $event;
$attendees = array();
//select males that are booked in
$query = db_select('booking_person', 'p');
$db_and = db_and();
$db_and->condition('p.booking_eventid', $event->eid, '=');
$db_and->condition('p.booking_gender', 'M', '=');
$db_and->condition('p.booking_status', 1, '=');
$query->condition($db_and);
$query->fields('p');
$bookedin_result = $query->execute();
//iterate over the attendee associative array and add some fields
foreach ($bookedin_result as $person)
{
$person->processed = 0;
$person->leading = array();
$person->helping = array();
$person->reserve_leading = array();
$attendees[] = $person;
}
//select males that are on the waiting list up to position number 100
$result2 = db_query('SELECT DISTINCT nid, booking_firstname, booking_lastname, booking_state, booking_readinggroup, booking_country, booking_status, booking_dob, booking_gender
FROM (
SELECT p.nid, p.booking_firstname, p.booking_lastname, p.booking_state, p.booking_country, p.booking_readinggroup, pay.booking_payment_date, p.booking_status, p.booking_gender, p.booking_dob
FROM {booking_person} p, {booking_payment} pay
WHERE booking_eventid = :eid and p.nid = pay.booking_person_nid and ( booking_status = 2 or booking_status = 4)
LIMIT 100
) AS booking
WHERE booking_gender = \'M\'
ORDER BY booking_status, booking_payment_date',
array(':eid' => $event->eid));
//iterate over the attendee associative array and add some fields
foreach ($result2 as $person)
{
$person->processed = 0;
$person->leading = array();
$person->helping = array();
$person->reserve_leading = array();
$attendees[] = $person;
}
//watchdog('booking', "<pre>Eligible Leaders/Helpers List:\n@info</pre>", array('@info' => print_r( $attendees, true)));
return $attendees;
}
/**
* Function for
*/
function _booking_studygroups_retrieve_groups() {
global $event;
$groups = array();
//select all the study groups for this event id
$studygroup = db_query("SELECT * FROM {booking_studygroup_list} WHERE booking_eventid = :eid", array(':eid' => $event->eid));
$group_mapping = $studygroup->fetchAllAssoc('sid');
//select the number of study group sessions
//assume they all have the same number of sessions
//$num_sessions = $studygroup->booking_num_group_sessions;
foreach ($group_mapping as $group)
{
//watchdog('booking_debug', "<pre>Study Group Element:\n@info</pre>", array('@info' => print_r( $group, true)));
for ($i = 1; $i <= 16; $i++)
{
$new_group = clone $group;
$new_group->session_id = $i;
$new_group->leader_nid = 0;
$new_group->helper_nid = 0;
$new_group->reserve_nid = 0;
$new_group->processed = 0;
$groups[] = $new_group;
}
}
//watchdog('booking', "<pre>Study Group Sessions:\n@info</pre>", array('@info' => print_r( $groups, true)));
return $groups;
}
/**
* autocomplete helper to look up names for room allocations
* based on https://www.drupal.org/node/854216
* $string = string for search
*/
function _booking_studygroups_name_autocomplete($string) {
global $event;
$matches = array();
$query = db_select('booking_person', 'p')
->fields('p', array('nid', 'booking_firstname', 'booking_lastname'));
$db_or = db_or()->condition('p.booking_lastname', '%' . db_like($string) . '%', 'LIKE')->condition('p.booking_firstname', '%' . db_like($string) . '%', 'LIKE');
$db_and = db_and()->condition($db_or)->condition('p.booking_eventid', $event->eid, '=');
$result = $query->condition($db_and)
->execute();
// save the query to matches
foreach ($result as $row) {
$name = $row->booking_lastname . ', ' . $row->booking_firstname . ' [' . $row->nid . ']';
$matches[$name] = $name;
}
// Return the result to the form in json
drupal_json_output($matches);
}
/**
* Function to allow admin to edit leaders and helpers for a study group
*/
function booking_studygroup_leadhelp_edit_form($node, &$form_state, $group_id) {
global $event;
//verify that $group_id is a number
if (! preg_match('/^[0-9]+$/', $group_id)) {
drupal_set_message("Error: Invalid study group ID '" . $group_id . "' supplied. Unable to edit group leaders and helpers.", 'error', FALSE);
drupal_goto('admin/booking/studygroups');
return "";
}
//try to select the study group for this $group_id
$studygroup = db_query("SELECT * FROM {booking_studygroup_list} WHERE sid = :sid", array(':sid' => $group_id))
->fetchObject();
if (! $studygroup) {
drupal_set_message("Error: Could not find matching study group ID. Unable to edit leaders/helpers.", 'error', FALSE);
drupal_goto('admin/booking/studygroups');
return "";
}
$prefix = t("<h2>Study Group &dash; !descrip</h2><p>Edit leaders and helpers for this group.</p>",
array('!descrip' => $studygroup->booking_studygroup_descrip));
//define the table header
$header = array (
'sid' => array('data' => t('Study Group Session ID'), 'field' => 'sid'),
'booking_assign_leader' => array('data' => t('Leader')),
'booking_assign_helper' => array('data' => t('Helper')),
'booking_assign_reserveleader' => array('data' => t('Reserve Leader')),
);
//attach the custom css
$form['#attached']['css'] = array(
drupal_get_path('module', 'booking') . '/booking.css',
);
//create the container element for the whole table
$form['studygroups'] = array(
'#prefix' => '<div id="studygroups">',
'#suffix' => '</div>',
'#tree' => TRUE,
'#theme' => 'table',
'#header' => $header,
'#rows' => array(),
);
//define the default fields in a table row
$default_row = array();
$default_row['sid'] = "";
$default_row['booking_studygroup_leader'] = "";
$default_row['booking_studygroup_helper'] = "";
$default_row['booking_studygroup_reserveleader'] = "";
//get the list of study group session memberships
$session_members_query = db_query("SELECT m.*, p.* FROM {booking_studygroup_mapping} m
inner join {booking_person} p on p.nid = m.booking_node_id
WHERE m.booking_studygroup_id = :gid AND m.booking_studygroup_role > 0",
array(':gid' => $group_id));
$session_members = $session_members_query->fetchAllAssoc('booking_node_id');
//create an array representing the existing leaders/helpers for this group
$existing_leaders = array();
foreach ($session_members as $person) {
$existing_leaders[$person->booking_session_id][$person->booking_studygroup_role] = $person->booking_lastname
. ', ' . $person->booking_firstname . ' [' . $person->booking_nodeid . ']';
}
//create the rows for the individual sessions (instances really) of this study group
for ($i = 0; $i < $studygroup->booking_num_group_sessions; $i++) {
$leader = array (
'#id' => 'booking-studygroup-leader-' . $i,
'#type' => 'textfield',
'#title' => 'Name',
'#title_display' => 'invisible',
'#name' => 'booking_studygroup_leader[' . $i . ']',
'#size' => 100,
'#autocomplete_path' => 'booking/studygroups/autocomplete',
'#value' => (!empty($existing_leaders[$i][1])) ? $existing_leaders[$i][1] : '',
'#attributes' => array('style' => array('width:200px')),
);
$helper = array (
'#id' => 'booking-studygroup-helper-' . $i,
'#type' => 'textfield',
'#title' => 'Name',
'#title_display' => 'invisible',
'#name' => 'booking_studygroup_helper[' . $i . ']',
'#size' => 100,
'#autocomplete_path' => 'booking/studygroups/autocomplete',
'#value' => (!empty($existing_leaders[$i][2])) ? $existing_leaders[$i][2] : '',
'#attributes' => array('style' => array('width:200px')),
);
$reserveleader = array (
'#id' => 'booking-studygroup-reserveleader-' . $i,
'#type' => 'textfield',
'#title' => 'Name',
'#title_display' => 'invisible',
'#name' => 'booking_studygroup_reserveleader[' . $i . ']',
'#size' => 100,
'#autocomplete_path' => 'booking/studygroups/autocomplete',
'#value' => (!empty($existing_leaders[$i][3])) ? $existing_leaders[$i][3] : '',
'#attributes' => array('style' => array('width:200px')),
);
$form['studygroups'][$i] = array(
'booking-studygroup-leader' => &$leader,
'booking-studygroup-helper' => &$helper,
'booking-studygroup-reserveleader' => &$reserveleader,
);
$new_row = array();
$new_row['sid'] = $i;
$new_row['booking_studygroup_leader'] = array('data' => &$leader);
$new_row['booking_studygroup_helper'] = array('data' => &$helper);
$new_row['booking_studygroup_reserveleader'] = array('data' => &$reserveleader);
$form['studygroups']['#rows'][$i] = $new_row;
unset($leader);
unset($helper);
unset($reserveleader);
}
//close out the form
$form['submit'] = array (
'#type' => 'submit',
'#value' => t('Submit'),
);
return array (
'form' => $form,
);
}