// ============================================================================= // Получение расписания занятий ДО по всей школе на заданную неделю // ============================================================================= // 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); })()