tabelGenAll.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * ГЕНЕРИРОВАНИЕ ВЕДОМОСТИ ИТОГОВЫХ ОТМЕТОК ОДНОГО КЛАССА
  3. * Copyright © 2022, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // В аргументах приходит массив типа ["8Б", "petrov"],
  7. // где petrov - логин юзера, который запрашивает табель
  8. // (логин юзера с фронтенда не передается, подписывается скриптом index.js).
  9. // Возвращает none или csv-файл с ведомостью итоговых отметок данного класса
  10. // Импортируем из ini.js сортировку списка
  11. // предметов sbSort(), объект учебных периодов dtsIt и список предметов по
  12. // умолчанию sbDef, список дополнительных предметов SB(),
  13. // функцию для получения списка класса PL()
  14. const INI = require("../www/js/ini"),
  15. SB = require("./subjList"),
  16. PL = require("./pupilsList");
  17. module.exports = async (argArr) => {
  18. let resp = ";;", otmetki = {};
  19. try {
  20. // Запрашиваемый класс и логин запрашивающего юзера
  21. if (argArr.length != 2) return "none";
  22. let clas = argArr[0].substr(0, 5).trim(),
  23. user = argArr[1].substr(0, 20).trim();
  24. if (!/^\d{1,2}[А-Я]{1}$/.test(clas) || !/^[a-z0-9]+$/.test(user))
  25. return "none";
  26. // Администратор ли он?
  27. let admRes = await dbFind("staff", {Ulogin: user});
  28. if (!admRes.length) admRes = [{}];
  29. // Проверяем полномочия юзера на запрос отметок этого класса
  30. if (!admRes[0].admin) {
  31. // Проверяем полномочия кл. руководителя на запрашиваемый класс
  32. let clRes = await dbFind("curric", {type: "class", className: clas});
  33. if (!clRes.length) return "none";
  34. if (clRes[0].tutor != user) return "none";
  35. }
  36. // Получаем объект со списком класса {kozlov: "Козлов Вася", ...}
  37. let PUPS = {};
  38. const pupList = JSON.parse(await PL([clas]));
  39. for (let p of pupList) PUPS[p[1]] = p[0];
  40. // Получаем итоговые отметки и подписываем их в объект otmetki
  41. // (внеурочная деятельность не учитывается)
  42. let res = await dbFind(
  43. "grades", {c: RegExp('^' + clas + ".*"), d: RegExp("\\w{5}")}
  44. );
  45. for (let otm of res) if (otm.g) {
  46. let subj = otm.s, pupil, period = otm.d;
  47. if (!PUPS[otm.p]) continue;
  48. pupil = PUPS[otm.p];
  49. if (!otmetki[pupil]) otmetki[pupil] = {};
  50. if (!otmetki[pupil][period]) otmetki[pupil][period] = {};
  51. otmetki[pupil][period][subj] =
  52. otm.g.replace(/^999$/g, "зач").replace(/^0$/g, "н/а");
  53. }
  54. // Упорядоченный список учебных периодов с их краткими наименованиями
  55. // [["d205a", "1ч" ], ["d331b", "2ч"], ...]
  56. let PERS = Object.keys(INI.dtsIt).sort().map(x => [x, INI.dtsIt[x][0]]);
  57. // Объект с кодами (ключи) и краткими названиями учебных предметов
  58. let SBFULL = {};
  59. for (let x of [
  60. ...Object.entries(INI.sbDef),
  61. ...Object.entries(JSON.parse(await SB()))
  62. ]) SBFULL[x[0]] = x[1];
  63. for (let [k, sb] of Object.entries(SBFULL))
  64. SBFULL[k] = sb.replace(/[().\-]/g, '').split(' ')
  65. . map(x => x.substr(0,4)).join('_')
  66. . replace(/(А||а)нал/g, "$1на");
  67. // Список кодов учебных предметов, встречающихся в этом классе
  68. let sbjSet = new Set();
  69. for (let pupil in otmetki)
  70. for (let period in otmetki[pupil])
  71. for (let subj in otmetki[pupil][period]) {
  72. sbjSet = sbjSet.add(subj);
  73. }
  74. let SBJS = [...sbjSet].sort();
  75. // Формируем csv-файл
  76. for (let k of SBJS) resp += `${SBFULL[k]};`;
  77. resp += '\n';
  78. let spisok = Object.entries(PUPS).map(x => x[1])
  79. . sort((a, b) => a.localeCompare(b, "ru"));
  80. for (let pupil of spisok) {
  81. let needFIO = true;
  82. if (!otmetki[pupil]) otmetki[pupil] = {};
  83. for (let period of PERS) {
  84. resp += `${needFIO ? pupil : ''};${period[1]};`;
  85. for (let subj of SBJS) {
  86. if (!otmetki[pupil][period[0]])
  87. otmetki[pupil][period[0]] = {};
  88. let otm = otmetki[pupil][period[0]][subj] ?
  89. otmetki[pupil][period[0]][subj] : '';
  90. resp += otm + ';';
  91. }
  92. resp += "\n";
  93. needFIO = false;
  94. }
  95. }
  96. return resp;
  97. }
  98. catch(e) {return "none";}
  99. };