Автор скрипта @OlegROA
Дисклеймер публикации
Не забывайте читать комментарии внутри скрипта!
Сам скрипт: js-код для получения расписания ДО школы
Получение расписания занятий ДО по всей школе на заданную неделю
1. Заходите в старую админку, на любую страницу.
2. Открываете в браузере панель инструментов разработчика.
3. Переходите на закладку Консоль
4. Открываете файл со скриптом и копируете все его содержимое в окно консоли (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом указанной фразы).
5. Проверяете начальные параметры — код учебного года, номер недели.
6. Жмете Enter. В зависимости от браузера или будет предложено сохранить csv-файл или он автоматически будет сохранен в папку «Загрузки».
Наименование файла — «Расписание ДО школы.csv».
Сортировка по ФИО учителя, дню недели и по времени начала занятия.
Кодировка текста в файле «Windows-1251», так что его сразу можно открывать в Excel.
var year_id = 12; // Идентификатор учебного года (2024-2025)
// Основные параметры
var week_num = 12; // Номер недели
// Глобальные переменные
var th_dict = new Map(); // th_id:th_name
var sch_dict = new Map(); // "th_id-day-ftime":[th_name,day,ftime,ltime,prg_name,grp_name,th_id]
(async () => {
// Функция преобразования текста в кодировке UTF-8
// в кодовый массив Windows-1251
async function toWin(s){
let code = [];
for(let i = 0; i < s.length; i++){
let c = s.charCodeAt(i);
if (c == 0x401){
code.push(0xA8);
} else if (c == 0x451){
code.push(0xB8);
} else if (c < 0x410){
code.push(c);
} else {
code.push(c - 848);
};
};
return (new Uint8Array(code));
};
// Функция чтения данных из базы ЭЖД в формате JSON
async function fetchData(url) {
const res = await fetch(url);
const hdr = await res.headers;
const json = await res.json();
return([json, hdr]);
};
// Формируем словарь учителей
let page = 0, pages = 0;
while (true){
page += 1;
// Читаем справочник учителей страницами по 100 записей
let res = await fetchData("core/api/teacher_profiles?page="+ page +"&per_page=100");
let th = res[0];
// Добавляем информацию в словарь
for(let i = 0; i < th.length; i++){
th_dict.set(th[i].id, th[i].name);
};
pages = res[1].get("Pages");
if (!pages || (page >= pages)){break};
};
// Получаем ид недельного расписания ДО на заданную неделю
const wsch = (await fetchData("core/api/ae_schedules?academic_year_id="+ year_id))[0]
.filter(function(sch){return sch.week_number == week_num});
if (!wsch || !wsch.length || !wsch[0].id){
throw new Error("Указан некорректный номер учебной недели!");
};
let sch_id = wsch[0].id;
// Основной цикл - чтение расписания ДО и формирование словара расписания учителей
page = 0; pages = 0;
while (true){
page += 1;
// Читаем расписание страницами по 1000 записей
let res = await fetchData("core/api/ae_schedule_items?ae_schedule_id="+ sch_id +
"&page="+ page +"&per_page=1000");
let sch = res[0];
// Добавляем информацию в словарь
for(let i = 0; i < sch.length; i++){
let ls = sch[i];
let day = (new Date(ls.date)).getDay();
let key = ls.teacher_id +"-"+ day +"-"+ ls.begin_time;
let th_name = ls.teacher_name;
if (!th_name || !th_name.length){
// В записи урока нет информации о ФИО учителя -
// поищем его в справочнике по коду
th_name = th_dict.get(ls.teacher_id);
if (!th_name || !th_name.length){
// Учитель в справочнике не найден
th_name = "Аноним - "+ ls.teacher_id;
};
}
sch_dict.set(key,
[th_name, day, ls.begin_time, ls.end_time,
ls.ae_program_name, ls.ae_group_name]
);
};
pages = res[1].get("Pages");
if (!pages || (page >= pages)){break};
};
if (!sch_dict.size){
throw new Error("Нет расписания ДО на заданную неделю!");
};
let wdays = ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"];
let content = "Учитель;День;Начало;Конец;Программа;Группа\n";
// Преобразование словаря в список и сортировка его
// по ФИО учителя, дню недели, времени начала урока
const th_sch = [...sch_dict.values()].sort();
// Формируем данные для вывода в файл
for(let i = 0; i < th_sch.length; i++){
content += th_sch[i][0] +";"+ wdays[th_sch[i][1]] +";"+
th_sch[i][2] +";"+ th_sch[i][3] +";"+
th_sch[i][4] +";"+ th_sch[i][5] +"\n";
};
// Создание файла формата CSV в кодировке Windows-1251
// и сохранение его браузером
const link = document.createElement("a");
const file = new Blob([await toWin(content)], {type:'text/csv'});
link.href = URL.createObjectURL(file);
link.download = "Расписание ДО школы на "+ week_num +" неделю.csv";
link.click();
URL.revokeObjectURL(link.href);
})()
