Автор скрипта @OlegROA

Дисклеймер публикации

Я не против. Но не обещаю их поддерживать из-за недостатка свободного времени. На правах "as is".OlegROA

Не забывайте читать комментарии внутри скрипта!

Сам скрипт: js-код для выгрузки ГУЧ (2025-26)

 

Выгрузка ГУЧ по всем учебным группам классов на заданную неделю

Формирование 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);
  };
})()

 


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *