Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal: Add session replication, reinscription logic, and child session hierarchy for course expiration - refs BT#22057 #5831

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion public/main/inc/ajax/model.ajax.php
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ function getWhereClause($col, $oper, $val)
$count = ExerciseLib::get_count_exam_results(
$exerciseId,
$whereCondition,
'',
$courseId,
false,
true,
$status
Expand Down Expand Up @@ -839,6 +839,7 @@ function getWhereClause($col, $oper, $val)
['where' => $whereCondition, 'extra' => $extra_fields]
);
break;
case 'replication':
case 'custom':
case 'simple':
$count = SessionManager::getSessionsForAdmin(
Expand Down Expand Up @@ -1981,6 +1982,7 @@ function getWhereClause($col, $oper, $val)
break;
case 'custom':
case 'simple':
case 'replication':
$result = SessionManager::getSessionsForAdmin(
api_get_user_id(),
[
Expand Down
173 changes: 132 additions & 41 deletions public/main/inc/lib/sessionmanager.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,11 @@ public static function create_session(
$sendSubscriptionNotification = false,
$accessUrlId = 0,
$status = 0,
$notifyBoss = false
$notifyBoss = false,
$parentId = null,
$daysBeforeFinishingForReinscription = null,
$lastRepetition = false,
$daysBeforeFinishingToCreateNewRepetition = null
) {
global $_configuration;

Expand Down Expand Up @@ -188,42 +192,30 @@ public static function create_session(
$endDate = Database::escape_string($endDate);

if (empty($name)) {
$msg = get_lang('A title is required for the session');

return $msg;
return get_lang('A title is required for the session');
} elseif (!empty($startDate) && !api_is_valid_date($startDate, 'Y-m-d H:i') &&
!api_is_valid_date($startDate, 'Y-m-d H:i:s')
) {
$msg = get_lang('Invalid start date was given.');

return $msg;
return get_lang('Invalid start date was given.');
} elseif (!empty($endDate) && !api_is_valid_date($endDate, 'Y-m-d H:i') &&
!api_is_valid_date($endDate, 'Y-m-d H:i:s')
) {
$msg = get_lang('Invalid end date was given.');

return $msg;
return get_lang('Invalid end date was given.');
} elseif (!empty($startDate) && !empty($endDate) && $startDate >= $endDate) {
$msg = get_lang('The first date should be before the end date');

return $msg;
return get_lang('The first date should be before the end date');
} else {
$ready_to_create = false;
if ($fixSessionNameIfExists) {
$name = self::generateNextSessionName($name);
if ($name) {
$ready_to_create = true;
} else {
$msg = get_lang('Session title already exists');

return $msg;
return get_lang('Session title already exists');
}
} else {
$rs = Database::query("SELECT 1 FROM $tbl_session WHERE title='".$name."'");
if (Database::num_rows($rs)) {
$msg = get_lang('Session title already exists');

return $msg;
return get_lang('Session title already exists');
}
$ready_to_create = true;
}
Expand All @@ -239,7 +231,10 @@ public static function create_session(
->setShowDescription(1 === $showDescription)
->setSendSubscriptionNotification((bool) $sendSubscriptionNotification)
->setNotifyBoss((bool) $notifyBoss)
;
->setParentId($parentId)
->setDaysToReinscription($daysBeforeFinishingForReinscription)
->setLastRepetition($lastRepetition)
->setDaysToNewRepetition($daysBeforeFinishingToCreateNewRepetition);

foreach ($coachesId as $coachId) {
$session->addGeneralCoach(api_get_user_entity($coachId));
Expand Down Expand Up @@ -288,18 +283,6 @@ public static function create_session(
$extraFields['item_id'] = $session_id;
$sessionFieldValue = new ExtraFieldValue('session');
$sessionFieldValue->saveFieldValues($extraFields);
/*
Sends a message to the user_id = 1

$user_info = api_get_user_info(1);
$complete_name = $user_info['firstname'].' '.$user_info['lastname'];
$subject = api_get_setting('siteName').' - '.get_lang('A new session has been created');
$message = get_lang('A new session has been created')." <br /> ".get_lang('Session name').' : '.$name;
api_mail_html($complete_name, $user_info['email'], $subject, $message);
*
*/
// Adding to the correct URL
//UrlManager::add_session_to_url($session_id, $accessUrlId);

// add event to system log
$user_id = api_get_user_id();
Expand Down Expand Up @@ -523,6 +506,10 @@ public static function getSessionsForAdmin(
}
$select .= ', status';

if ('replication' === $listType) {
$select .= ', parent_id';
}

if (isset($options['order'])) {
$isMakingOrder = 0 === strpos($options['order'], 'category_name');
}
Expand Down Expand Up @@ -654,6 +641,11 @@ public static function getSessionsForAdmin(
)
)";
break;
case 'replication':
$formatted = false;
$query .= "AND s.days_to_new_repetition IS NOT NULL
AND (SELECT COUNT(id) FROM session AS child WHERE child.parent_id = s.id) <= 1";
break;
}

$query .= $order;
Expand All @@ -668,6 +660,23 @@ public static function getSessionsForAdmin(
$session['users'] = Database::fetch_assoc($result)['nbr'];
}
}

if ('replication' === $listType) {
$formattedSessions = [];
foreach ($sessions as $session) {
$formattedSessions[] = $session;
if (isset($session['id'])) {
$childSessions = array_filter($sessions, fn($s) => isset($s['parent_id']) && $s['parent_id'] === $session['id']);
foreach ($childSessions as $childSession) {
$childSession['title'] = '-- ' . $childSession['title'];
$formattedSessions[] = $childSession;
}
}
}

return $formattedSessions;
}

if ('all' === $listType) {
if ($getCount) {
return $sessions[0]['total_rows'];
Expand Down Expand Up @@ -1793,7 +1802,11 @@ public static function edit_session(
$sessionAdminId = 0,
$sendSubscriptionNotification = false,
$status = 0,
$notifyBoss = 0
$notifyBoss = 0,
$parentId = 0,
$daysBeforeFinishingForReinscription = null,
$daysBeforeFinishingToCreateNewRepetition = null,
$lastRepetition = false
) {
$id = (int) $id;
$status = (int) $status;
Expand Down Expand Up @@ -1863,6 +1876,10 @@ public static function edit_session(
->setVisibility($visibility)
->setSendSubscriptionNotification((bool) $sendSubscriptionNotification)
->setNotifyBoss((bool) $notifyBoss)
->setParentId($parentId)
->setDaysToReinscription($daysBeforeFinishingForReinscription)
->setLastRepetition($lastRepetition)
->setDaysToNewRepetition($daysBeforeFinishingToCreateNewRepetition)
->setAccessStartDate(null)
->setAccessStartDate(null)
->setDisplayStartDate(null)
Expand All @@ -1871,6 +1888,16 @@ public static function edit_session(
->setCoachAccessEndDate(null)
;

if ($parentId) {
$sessionEntity->setParentId($parentId);
} else {
$sessionEntity->setParentId(null);
}

$sessionEntity->setDaysToReinscription($daysBeforeFinishingForReinscription);
$sessionEntity->setLastRepetition($lastRepetition);
$sessionEntity->setDaysToNewRepetition($daysBeforeFinishingToCreateNewRepetition);

$newGeneralCoaches = array_map(
fn($coachId) => api_get_user_entity($coachId),
$coachesId
Expand Down Expand Up @@ -8271,6 +8298,50 @@ public static function setForm(FormValidator $form, Session $session = null, $fr
$extra_field = new ExtraFieldModel('session');
$extra = $extra_field->addElements($form, $session ? $session->getId() : 0, ['image']);

if ('true' === api_get_setting('session.enable_auto_reinscription')) {
$form->addElement(
'text',
'days_before_finishing_for_reinscription',
get_lang('Days before finishing for reinscription'),
['maxlength' => 5]
);
}

if ('true' === api_get_setting('session.enable_session_replication')) {
$form->addElement(
'text',
'days_before_finishing_to_create_new_repetition',
get_lang('Days before finishing to create new repetition'),
['maxlength' => 5]
);
}

if ('true' === api_get_setting('session.enable_auto_reinscription') || 'true' === api_get_setting('session.enable_session_replication')) {
$form->addElement(
'checkbox',
'last_repetition',
get_lang('Last repetition')
);
}

/** @var HTML_QuickForm_select $element */
$element = $form->createElement(
'select',
'parent_id',
get_lang('Parent session'),
[],
['class' => 'form-control']
);

$element->addOption(get_lang('None'), 0, []);
$sessions = SessionManager::getListOfParentSessions();
foreach ($sessions as $id => $title) {
$attributes = [];
$element->addOption($title, $id, $attributes);
}

$form->addElement($element);

$form->addElement('html', '</div>');

$js = $extra['jquery_ready_content'];
Expand Down Expand Up @@ -8782,7 +8853,7 @@ public static function getGridColumns(
];

break;

case 'replication':
case 'custom':
$columns = [
'#',
Expand All @@ -8801,7 +8872,7 @@ public static function getGridColumns(
[
'name' => 'title',
'index' => 's.title',
'width' => '160',
'width' => '260px',
'align' => 'left',
'search' => 'true',
'searchoptions' => ['sopt' => $operators],
Expand Down Expand Up @@ -9792,9 +9863,9 @@ public static function getDefaultSessionTab()
}

/**
* @return array
* @return string
*/
public static function getSessionListTabs($listType)
public static function getSessionListTabs($listType): string
{
$tabs = [
[
Expand All @@ -9813,10 +9884,10 @@ public static function getSessionListTabs($listType)
'content' => get_lang('Custom list'),
'url' => api_get_path(WEB_CODE_PATH).'session/session_list.php?list_type=custom',
],
/*[
'content' => get_lang('Complete'),
'url' => api_get_path(WEB_CODE_PATH).'session/session_list_simple.php?list_type=complete',
],*/
[
'content' => get_lang('Replication'),
'url' => api_get_path(WEB_CODE_PATH).'session/session_list.php?list_type=replication',
],
];
$default = null;
switch ($listType) {
Expand All @@ -9832,6 +9903,9 @@ public static function getSessionListTabs($listType)
case 'custom':
$default = 4;
break;
case 'replication':
$default = 5;
break;
}

return Display::tabsOnlyLink($tabs, $default);
Expand Down Expand Up @@ -10213,4 +10287,21 @@ public static function getAllUserIdsInSession(int $sessionId): array

return $users;
}

/**
* Retrieves a list of parent sessions.
*/
public static function getListOfParentSessions(): array
{
$sessions = [];
$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
$sql = "SELECT id, title FROM $tbl_session WHERE parent_id IS NULL ORDER BY title";
$result = Database::query($sql);

while ($row = Database::fetch_array($result)) {
$sessions[$row['id']] = $row['title'];
}

return $sessions;
}
}
17 changes: 17 additions & 0 deletions public/main/lp/lp_add.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,21 @@ function activate_end_date() {

SkillModel::addSkillsToForm($form, ITEM_TYPE_LEARNPATH, 0);

$showValidityField = 'true' === api_get_setting('session.enable_auto_reinscription') || 'true' === api_get_setting('session.enable_session_replication');
if ($showValidityField) {
$form->addElement(
'number',
'validity_in_days',
get_lang('Validity in days'),
[
'min' => 0,
'max' => 365,
'step' => 1,
'placeholder' => get_lang('Enter the number of days'),
]
);
}

$form->addElement('html', '</div>');

$defaults['activate_start_date_check'] = 1;
Expand Down Expand Up @@ -208,6 +223,8 @@ function activate_end_date() {

$lp->setSubscribeUsers(isset($_REQUEST['subscribe_users']) ? 1 : 0);
$lp->setAccumulateScormTime(1 === (int) $_REQUEST['accumulate_scorm_time'] ? 1 : 0);
$validityInDays = $_REQUEST['validity_in_days'] ?? null;
$lp->setValidityInDays($validityInDays);
$lpRepo->update($lp);

$url = api_get_self().'?action=add_item&type=step&lp_id='.$lpId.'&'.api_get_cidreq();
Expand Down
Loading
Loading