// ============================================================================= // Формирование csv-файла с информацией по всем учебным группам классов школы // на заданную неделю. // Формат строки: // класс;группа;учитель;предмет;кол-во учеников;нагрузка // Если в группе нагрузку на заданной неделе делят несколько учителей, // то по данной группе будет выгружена информация для каждого учителя. // ============================================================================= // 1. ОБЯЗАТЕЛЬНО заходите в старую админку, на любую страницу. // 2. Открываете в браузере панель инструментов разработчика. // 3. Переходите на закладку Консоль. // 4. Открываете файл со скриптом и копируете все его содержимое в окно консоли // (в ФайрФоксе возможно придется подтвердить вставку кода ручным вводом // указанной фразы). // 5. Жмете Enter. // После успешного завершения работы скрипта, в зависимости от браузера, // будет предложено сохранить csv-файл или он автоматически будет сохранен // в папку "Загрузки". Наименование файла - "ГУЧ (NN неделя).csv". // Сортировка по классу, группе, ФИО учителя. // Кодировка текста в файле "Windows-1251", так что его сразу можно открывать // в Excel и сортировать/фильтровать по нужным критериям. // ============================================================================= // // !!! В СКРИПТЕ НИЧЕГО МЕНЯТЬ НЕ НУЖНО - ВСЕ ПАРАМЕТРЫ СКРИПТ // !!! ЗАПРОСИТ У ПОЛЬЗОВАТЕЛЯ САМ. // !!! Максимум - в следующем учебном году придётся изменить // !!! значение константы year_id на 14. // // ================================================================== const year_id = 13; // Идентификатор учебного года (2025-2026) // Глобальные переменные var week_num = 0; var grps = []; var hours = 0; (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 fetchOne(url) { const res = await fetch(url); const json = await res.json(); return(json); }; // Функция чтения всех страниц данных в формате JSON async function fetchAll(url) { if (url.indexOf("?") == -1){ url += "?per_page=1000"; } else { url += "&per_page=1000"; } let recs = []; let page = 0, pages = 0; while (true){ page += 1; const res = await fetch(url +"&page="+ page); const hdr = await res.headers; recs.push(...(await res.json())); pages = hdr.get("x-pagination-total-pages") || hdr.get("pages"); if (!pages || (page >= pages)){break}; }; return(recs); }; // Запрос номера недели let d = new Date, dt = d.getTime(); d.setMonth(8, 1); if (d.getTime() > dt){d.setFullYear(d.getFullYear() - 1);}; week_num = Math.ceil((dt - d.getTime()) / 8.64e7 / 7); week_num = prompt("Введите номер учебной недели:", week_num); if (!week_num || !week_num.trim()){return;}; // Формируем список всех классов let cls = []; let data = await fetchAll("core/api/class_units?academic_year_id="+ year_id + "&with_home_based=true"); for (let cl of data){ if ((cl.class_level_id >= 1) && (cl.class_level_id <= 12)){ cls.push([cl.name, cl.id]); }; }; cls.sort(); // Основной цикл - обход классов for (let cls_data of cls){ console.log(cls_data[0]); // Читаем список групп класса - только группы с назначенным учителем let grp = await fetchAll("jersey/api/groups?academic_year_id="+ year_id + "&class_unit_id="+ cls_data[1] + "&only_with_teachers=true&with_teacher_loads=true"); if ((!grp) || (!grp.length)){continue}; // Обходим группы и формируем строку вывода for (let g of grp){ for (let th of (g.teachers || [])){ thl = (th.teacher_loads || []).filter(function (ld){ return ld.week_number == week_num }); if ((!thl) || (thl.length != 1) || (thl[0].real_hours <= 0)){continue;}; grps.push(cls_data[0] +";"+ g.name +";"+ (th.full_name || "???") +";"+ g.subject_name +";"+ g.student_count +";"+ thl[0].real_hours); hours += thl[0].real_hours; }; }; }; if (!grps.length){ console.log("Нет учебных групп с назначенными учителями и нагрузкой!"); } else { grps.sort(); let csv = "Класс;Группа;ФИО учителя;Предмет;Учеников;Нагрузка\n"+ grps.join("\n"); // Создание файла формата CSV в кодировке Windows-1251 // и сохранение его браузером const link = document.createElement("a"); const file = new Blob([await toWin(csv)], {type:'text/csv'}); link.href = URL.createObjectURL(file); link.download = "ГУЧ ("+ week_num +" неделя).csv"; link.click(); URL.revokeObjectURL(link.href); console.log("Всего учебных групп: "+ grps.length); console.log("Общая нагрузка, часов: "+ hours); }; })()