DigitalLearning

Агент переназначения курса

❤️
За агент спасибо Роману С!
⚠️
Перед применением агента изучите его. Возможно нужна доработка под вашу систему. Текущую версию агента удобно использовать как базу, чтобы оттолкнуться от нее и сделать все под себя.

Про агент

Данный агент потребуется, если обновляем курс в WebTutor / WebSoft HCM, изменяя настройки карточки действующего курса или изменяя содержимое этого курса (не картинку или видео, а изменения, которые касаются кодов элементов курса).
В этом случае обязательно потребуется «сбросить» все курсы в статус «Назначен». Сделать это можно и переназначением курса, но тогда потеряются данные о назначениях данных курсов: сроки назначений, группа, план обучения, мероприятия, признак самоназначения и т.д., а также могут уйти уведомления о назначениях курсов. Чтобы этого избежать - можно использовать данный агент.

Порядок действий:

  1. Вносим изменения в курс
  1. Назначаем курс себе, но не запускаем, чтобы он был именно в статусе «Назначен» (это важно, так как его состояние будет браться за образец). Копируем ID из карточки активного (только что назначенного себе) курса в агент
  1. Запускаем агент на стороне клиента
  1. Всем, у кого курс был активен он переведётся в статус «Назначен» с сохранением всех прочих настроек назначения этого курса и связанных с данным курсом активностей. Уведомления на почту сотрудникам не придут.
  1. После того, как агент отработал - можно удалить у себя данный назначенный курс
⚠️
Хорошим тоном будет направить всем, кто проходил данный курс на почту информацию, что курс был обновлён, поэтому обучение необходимо начать заново. Чтобы сотрудники не засыпали поддержку вопросами, почему статус прохождения сбросился.

Код агента

//// // Задаём переменные KursObrazec (обязательно), остальные - VremyaObnovleniya, ProhodnoyBall, Perenaznacheniye - можно не трогать, но почитайте их описание - может они Вам будут полезны KursObrazec = ***==>>ID Назначенного курса-образца<<==***; VremyaObnovleniya = ''; // здесь указываем "and ($elem/start_learning_date <= date(2022-04-07T10:15:00) or $elem/start_learning_date = '')" , где в скобках - время обновления курса (или чуть позже), если хотим пропустить тех, кто начал курс после его обновления. Или оставляем '', если хотим сбросить статус для всех, независимо от времени начала изучения курса ProhodnoyBall = 'Проверяем'; // или ставим 'Игнорируем', если не нужно учитывать условие проверки Проходного балла Perenaznacheniye = 'Все'; // или ставим 'Только В процессе', если нужны только курсы В процессе //// docObrazec = OpenDoc(UrlFromDocID(OptInt(KursObrazec))); // Открываем документ Образца Назначенного электронного курса // Проверяем, включать ли только незаконченные курсы В процессе или Все (назначенные и В процессе) (параметр) if (StrContains (Perenaznacheniye, 'Только В процессе', true)) _query_stroka_zaprosa = "for $elem in active_learnings where $elem/course_id = " + docObrazec.TopElem.course_id + " and $elem/id != " + OptInt(KursObrazec) + VremyaObnovleniya + " and $elem/state_id=1 return $elem/id,score"; else _query_stroka_zaprosa = "for $elem in active_learnings where $elem/course_id = " + docObrazec.TopElem.course_id + " and $elem/id != " + OptInt(KursObrazec) + VremyaObnovleniya + " and MatchSome($elem/state_id,(0,1)) return $elem/id,score"; VseNezavershenniyeKursy = XQuery(_query_stroka_zaprosa); // Формируем массив из всех Незаконченных электронных курсов с ID как у Образца if (ArrayOptFirstElem(VseNezavershenniyeKursy) != undefined) // Если такие Незаконченные курсы найдены { // проверяем, не пустой ли проходной балл, если пустой, то смысла проверять, набрал ли кто-нибудь проходной балл нет docCourse = OpenDoc(UrlFromDocID(OptInt(docObrazec.TopElem.course_id))); // открываем документ Электронного курса CourseProhodnoyBall = OptInt(docCourse.TopElem.mastery_score); // получаем проходной балл Электронного курса if (CourseProhodnoyBall != undefined) { // нужно ли проверять условие набора проходного балла? (параметр) if (StrContains (ProhodnoyBall, 'Проверяем', true)) { KolichestvoNabravshihProhodnoyBall = 0; // обнуляем переменную с количеством набравших проходной балл for (NezavershenniyKurs in VseNezavershenniyeKursy) // для каждого Незаконченного курса проверяем, не набран ли сотрудником проходной балл, если набран - считаем, сколько таких курсов и сообщаем об этом { if ( NezavershenniyKurs.score >= CourseProhodnoyBall ) // проверяем, не набран ли проходной балл KolichestvoNabravshihProhodnoyBall++; // если набран - увеличиваем переменную } if (KolichestvoNabravshihProhodnoyBall > 0) // проверяем переменную, если она больше 0 - сообщаем, что есть сотрудники, которые набрали проходной балл и нужно просмотреть их перед работой агента { alert("ВНИМАНИЕ: В незавершённых курсах найдено " + KolichestvoNabravshihProhodnoyBall + " набравших проходной балл " + CourseProhodnoyBall + ". Проверьте их и завершите их как успешные. Либо, если требуется переназначение независимо от проходного балла, переключите переменную ProhodnoyBall в Игнорируем.\nВыполнение Агента остановлено."); Cancel(); } } } for (NezavershenniyKurs in VseNezavershenniyeKursy) // для каждого Незаконченного курса выполняем { try { docPerenaznacheniye = OpenDoc(UrlFromDocID(NezavershenniyKurs.id)); // открываем документ Незаконченного электронного курса docPerenaznacheniye.TopElem.parts.Clear(); // очищаем статусы Разделов в карточке Незаконченного электронного курса // перезапишем значения в карточке Незаконченного электронного курса: docPerenaznacheniye.TopElem.start_learning_date = ''; // очистим Дата начала обучения docPerenaznacheniye.TopElem.last_usage_date = ''; // очистим Дата последнего посещ. docPerenaznacheniye.TopElem.doc_info.modification.date = docObrazec.TopElem.doc_info.modification.date; // Дата модификации самой карточки (это для Репликации) tools.assign_elems( docPerenaznacheniye.TopElem, docObrazec.TopElem, [ 'score', 'state_id', 'time', 'parts'] ); // перезапишем Баллы, Состояние, Время модулей, Разделы docPerenaznacheniye.Save(); // сохраняем карточку незавершённого курса - теперь он сброшен в статус Назначен } catch (err) { DeleteDoc(UrlFromDocID(NezavershenniyKurs.id)); // если карточку курса не удаётся открыть - удаляем её } } alert("Найдено и переведено в статус Назначен " + ArrayCount(VseNezavershenniyeKursy) + " незавершённых курсов"); } else alert("Курсов " + docObrazec.TopElem.course_name + " в статусе В процессе не найдено");
ℹ️
Если вы сделаете какую-то доработку или улучшение агента, то поделитесь с нами! Добавим тут как улучшенный вариант агента.
badge