attendGet.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * ПОЛУЧЕНИЕ ДАННЫХ ОБ ОТСУТСТВУЮЩИХ ЗА ОДИН ДЕНЬ
  3. * Copyright © 2020, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // В запросе приходят ["d123", "petrov"]
  7. // d123 - это дата
  8. // petrov - это логин автора запроса (подписывается скриптом index.js)
  9. //
  10. // Возвращается объект (ни классы, ни люди не отсортированы) вида
  11. // {"10Б": {"Иванов Василий": ["s430", "s210"], ...}}
  12. // (массив это коды предметов, пропущенных учеником в этот день)
  13. module.exports = async (args) => {
  14. let resp = {}, respItog = {}, attResp = [];
  15. try {
  16. if (args.length != 2) return "none";
  17. let dt = args[0].substr(0, 4),
  18. lg = args[1].substr(0, 20).trim();
  19. if (!dt || !lg || !/^d[0-9]{3}$/.test(dt)) return "none";
  20. // Проверяем полномочия автора запроса
  21. let res = await dbFind("staff", {Ulogin: lg});
  22. if (!res.length) return "none";
  23. // Разрешение логина учащегося в фамилию и имя
  24. const pupGet = async pupLgn => {
  25. let pupRes = await dbFind("pupils", {Ulogin: pupLgn});
  26. return pupRes.length ?
  27. pupRes[0].Ufamil + ' ' + pupRes[0].Uname :
  28. pupLgn;
  29. }
  30. // Фильтрация ответа базы (только отметки с буквами "н")
  31. // и формирование результата
  32. const result = async respArr => {
  33. for (let gr of respArr) {
  34. let grade = gr.g, clss = gr.c.split('-')[0], subj = gr.s;
  35. if (subj == "s000") continue;
  36. if (!grade.includes('н')) continue;
  37. let pupil = await pupGet(gr.p);
  38. if (!resp[clss]) resp[clss] = {};
  39. if (!resp[clss][pupil]) resp[clss][pupil] = [];
  40. resp[clss][pupil].push(subj);
  41. }
  42. }
  43. // Если автор запроса администратор
  44. if (res[0].admin) {
  45. attResp = await dbFind("grades", {d: dt});
  46. await result(attResp);
  47. }
  48. else {
  49. let clArr = [];
  50. // В каких классах он классный руководитель
  51. let clResp = await dbFind("curric", {type: "class", tutor: lg});
  52. for (let currCl of clResp) clArr.push(currCl.className);
  53. // В каких классах у него учебная нагрузка
  54. clResp = await dbFind("distrib", {tLogin: lg});
  55. if (clResp[0]) for (let subj of Object.keys(clResp[0].tLoad))
  56. clArr.push(...(clResp[0].tLoad[subj]));
  57. let classes = new Set(clArr);
  58. for (let cl of classes) {
  59. attResp = await dbFind("grades", {d: dt, c: RegExp('^'+cl)});
  60. await result(attResp);
  61. }
  62. }
  63. return JSON.stringify(resp);
  64. }
  65. catch(e) {console.info(e); return "none";}
  66. };