// ================================================================== // 1. ОБЯЗАТЕЛЬНО заходите в старую админку, на любую страницу. // 2. Открываете в браузере панель инструментов разработчика. // 3. Переходите на закладку Консоль. // 4. Открываете файл со скриптом и копируете блок "Подключение jQuery" // в окно консоли (в ФайрФоксе возможно придется подтвердить вставку // кода ручным вводом указанной фразы). // 5. Жмете Enter. // ================================================================== // Подключение jQuery - НАЧАЛО. // Выполняется ОДИН РАЗ после каждого обновления страницы. // // !!! // Не запускайте этот скрипт подключения jQuery вместе с запуском // основного скрипта - для выполнения подключения нужно некоторое // время (порядка одной секунды), но движек JavaScript не ждет // завершения операции и продолжает выполнение скрипта - на первом же // вызове jQuery будет выдана ошибка, потому что jQuery еще не успел // подключиться. // !!! // ================================================================== var jq = document.createElement('script'); jq.src = "https://code.jquery.com/jquery-3.7.1.min.js"; document.head.appendChild(jq); // Подключение jQuery - КОНЕЦ. // ================================================================== // Копирование кабинетов из уроков эталонной недели на заданные недели. // 6. Копируете основной код скрипта (можно прямо с этой строки!) // в окно консоли (в ФайрФоксе возможно придется подтвердить вставку // кода ручным вводом указанной фразы). // 7. Проверяете начальные параметры - код учебного года, номер эталонной // недели, список номеров целевых недель. // 8. Жмете Enter. // // !!! Данный скрипт НЕ ИЗМЕНЯЕТ уроки, в которых кабинет совпадает // с кабинетом этого же урока на эталонной неделе. // !!! Данный скрипт меняет в уроках ТОЛЬКО кабинет и, если необходимо, // здание, в котором находится этот кабинет. // !!! Так как скрипт не изменяет ид/дату урока, то все связи урока // с другими объектами ЭЖД (КТП, журнал, оценки, дз и пр.) // НЕ НАРУШАЮТСЯ. // ================================================================== var year_id = 13; // Идентификатор учебного года (2024-2025) // Основные параметры var tpl_week = 8; // Номер эталонной недели. var chk_week = [9,10,11,12,13,14,15,16,17,18]; // Список (через запятую) целевых недель. // Наименование класса (как в ЭЖД), например "9-А". // Обратите внимание на язык букв в наименовании класса! // Вместо наименования класса можно указать номер параллели - // будут обработаны только классы указанной параллели. // Если задать пустое наименование класса или "0", то будут // обработаны все классы школы с 1 по 12 параллель. var cls_name = "0"; // Ключи проверки var chk_days = [1,2,3,4,5]; // Номера обрабатываемых дней недели var chk_type = ["NORMAL","REMOTE","ELECTRONIC"]; // Типы обрабатываемых уроков var chk_replaced = false; // Обрабатывать замененные уроки? // !!! Ключ ТЕСТОВОГО РЕЖИМА !!! // Если он равен "true", то НИКАКИХ ИЗМЕНЕНИЙ в расписание не будет внесено, // но будет выведена информация о возможных изменениях. // Для внесения реальных изменений в расписание следует присвоить // данному параметру значение "false" (без кавычек). var chk_only = false; // Глобальные переменные var cls_level = parseInt(cls_name || 0); // Общее кол-во ошибок. // После завершения проверки просто впишите в консоль имя этой переменной. var err_count = 0; chk_week = chk_week.filter(function(w){return (w > 0) && (w < 41)}); if ((tpl_week < 1) || (tpl_week > 40) || (!chk_week.length)){ throw new Error("Некорректные номера недель!"); }; if (!chk_days.length){ throw new Error("Не заданы обрабатываемые дни недели!"); }; if (!chk_type.length){ throw new Error("Не заданы обрабатываемые типы уроков!"); }; cls_name = cls_name.trim().toUpperCase(); if ((cls_level < 0) || (cls_level > 12)){ throw new Error("Некорректный номер параллели!"); } else if (!cls_level){ if (!confirm("Обработка всего расписания школы может быть достаточно длительной!\n"+ "Вы действительно хотите выполнить такую обработку?")){ throw new Error("Отказ от выполнения!"); }; }; if (!cls_level){cls_level = "1,2,3,4,5,6,7,8,9,10,11,12"}; jQuery.getJSON("core/api/class_units?academic_year_id="+ year_id + "&with_home_based=true&class_level_ids="+ cls_level) .done(function(data){ let cls_data = data; if (isNaN(cls_name)){ cls_data = cls_data.filter(function(cls){ return cls.name.trim().toUpperCase() == cls_name; }); if (!cls_data || !cls_data.length){ throw new Error("Заданный класс \""+ cls_name +"\" не найден!"); }; }; // Обходим обрабатываемые классы cls_data.forEach(function(cls){ // Запрос расписания класса на эталонную неделю jQuery.getJSON("jersey/api/schedules/items?academic_year_id="+ year_id + "&week_number="+ tpl_week +"&class_unit_id="+ cls.id) .done(function(data){ // Формируем словарь уроков let orig_tpl_sch = new Map; data.forEach(function(ls){ let ls_key = ls.day_number +"-"+ ls.study_ordinal +"-"+ ls.group_id; orig_tpl_sch.set(ls_key, {"class_unit_id":(ls.class_unit_id || 0), "group_name" :(ls.group_name || ""), "building_id" :(ls.building_id || 0), "building_name":(ls.building_name || "???"), "room_id" :(ls.room_id || 0), "room_name" :(ls.room_name || "???"), "subject_id" :(ls.subject_id || 0), "teacher_id" :(ls.teacher_id || 0), "replaced" :(ls.replaced || false), "lesson_type" :(ls.lesson_type || "NORMAL"), "cancelled" :(ls.cancelled || false) } ); }); if (!orig_tpl_sch.size){ console.log("У класса \""+ cls.name +"\" нет эталонного расписания!"); err_count += 1; return false; }; // Обходим расписания на целевых неделях текущего класса chk_week.forEach(function(week_num){ // Запрос расписания класса на целевую неделю jQuery.getJSON("jersey/api/schedules/items?academic_year_id="+ year_id + "&week_number="+ week_num +"&class_unit_id="+ cls.id) .done(function(data){ let tpl_sch = new Map(orig_tpl_sch); if (tpl_sch.size != data.length){ console.log("Класс \""+ cls.name +"\", неделя "+ week_num +" - разное количество уроков!"); err_count += 1; return false; }; // Обходим уроки целевой недели let ls_err = 0; data.forEach(function(ls){ if (!chk_days.includes(ls.day_number)){return true}; if (!chk_type.includes(ls.lesson_type)){return true}; if ((ls.replaced || false) && !chk_replaced){return true}; if (ls.cancelled || false){return true}; let ls_msg = cls.name +";Неделя-"+ week_num +";День-"+ ls.day_number + ";Урок-"+ ls.study_ordinal +";"+ ls.group_name; let ls_key = ls.day_number +"-"+ ls.study_ordinal +"-"+ ls.group_id; if (!tpl_sch.has(ls_key)){ console.log(ls_msg + ";Урок целевого расписания не найден в эталонном расписании!\n"); ls_err += 1; return true; }; ls_tpl = tpl_sch.get(ls_key); tpl_sch.delete(ls_key); if ((ls_tpl.building_id != (ls.building_id || 0)) || (ls_tpl.room_id != (ls.room_id || 0))){ if (chk_only){ console.log(ls_msg +";"+ ls_tpl.building_name +";"+ ls_tpl.room_name); } else { let url = 'jersey/api/schedules/'+ ls.schedule_id +'/items/'+ ls.id; let data = {"bell_id":ls.bell_id, "date":ls.date, "teacher_id":ls.teacher_id, "city_building_id":ls_tpl.city_building_id, "group_id":ls.group_id, "lesson_type":ls.lesson_type, "room_id":ls_tpl.room_id }; jQuery.ajax(url, {method: "PUT", contentType: "application/json;charset=UTF-8", data: JSON.stringify(data) }) .done(function(data){ console.log(ls_msg +";"+ data.building_name +";"+ data.room_name); }) .fail(function(){ console.log(ls_msg +";Ошибка"); ls_err += 1; }); }; }; }); if (ls_err){ err_count += ls_err; }; }); }); }); }); })