Add attendance statistics

This commit is contained in:
Mikołaj Pich 2018-09-29 11:59:49 +02:00
parent 5cb74c1be2
commit 889b765ad3
No known key found for this signature in database
GPG key ID: F62B26E36D4C4BAA
5 changed files with 305 additions and 114 deletions

View file

@ -9,7 +9,7 @@
"PrzedmiotNazwa": "Zajęcia artystyczne"
},
{
"IdKategoria": 1,
"IdKategoria": 2,
"Numer": 2,
"IdPoraLekcji": 77,
"Dzien": 1524434400,
@ -18,30 +18,75 @@
"PrzedmiotNazwa": "Informatyka"
},
{
"IdKategoria": 1,
"Numer": 3,
"IdPoraLekcji": 78,
"IdKategoria": 3,
"Numer": 1,
"IdPoraLekcji": 76,
"Dzien": 1524434400,
"DzienTekst": "2018-04-23",
"IdPrzedmiot": 428,
"PrzedmiotNazwa": "Matematyka"
},
{
"IdKategoria": 1,
"Numer": 4,
"IdPoraLekcji": 79,
"Dzien": 1524434400,
"DzienTekst": "2018-04-23",
"IdPrzedmiot": 428,
"PrzedmiotNazwa": "Matematyka"
},
{
"IdKategoria": 1,
"Numer": 3,
"IdPoraLekcji": 78,
"Dzien": 1524520800,
"DzienTekst": "2018-04-24",
"IdPrzedmiot": 428,
"PrzedmiotNazwa": "Matematyka"
},
{
"IdKategoria": 4,
"Numer": 2,
"IdPoraLekcji": 77,
"Dzien": 1524434400,
"DzienTekst": "2018-04-24",
"IdPrzedmiot": 428,
"PrzedmiotNazwa": "Matematyka"
},
{
"IdKategoria": 5,
"Numer": 1,
"IdPoraLekcji": 76,
"Dzien": 1524520800,
"DzienTekst": "2018-04-25",
"IdPrzedmiot": 480,
"PrzedmiotNazwa": "Historia"
},
{
"IdKategoria": 6,
"Numer": 2,
"IdPoraLekcji": 77,
"Dzien": 1524520800,
"DzienTekst": "2018-04-25",
"IdPrzedmiot": 429,
"PrzedmiotNazwa": "Język angielski"
},
{
"IdKategoria": 7,
"Numer": 1,
"IdPoraLekcji": 76,
"Dzien": 1524520800,
"DzienTekst": "2018-04-26",
"IdPrzedmiot": 495,
"PrzedmiotNazwa": "Informatyka"
},
{
"IdKategoria": 8,
"Numer": 2,
"IdPoraLekcji": 77,
"Dzien": 1524520800,
"DzienTekst": "2018-04-26",
"IdPrzedmiot": 488,
"PrzedmiotNazwa": "Geografia"
},
{
"IdKategoria": 1,
"Numer": 1,
"IdPoraLekcji": 76,
"Dzien": 1524520800,
"DzienTekst": "2018-04-27",
"IdPrzedmiot": 488,
"PrzedmiotNazwa": "Geografia"
},
{
"IdKategoria": 1,
"Numer": 2,
"IdPoraLekcji": 77,
"Dzien": 1524520800,
"DzienTekst": "2018-04-27",
"IdPrzedmiot": 488,
"PrzedmiotNazwa": "Geografia"
}
]

View file

@ -0,0 +1,122 @@
[
{
"name": "IX",
"presence": 32,
"absence": 1,
"absenceExcused": 2,
"absenceForSchoolReasons": 3,
"lateness": 4,
"latenessExcused": 5,
"exemption": 6
},
{
"name": "X",
"presence": 64,
"absence": 2,
"absenceExcused": 55,
"absenceForSchoolReasons": 8,
"lateness": 16,
"latenessExcused": 24,
"exemption": 32
},
{
"name": "XI",
"presence": 99,
"absence": 3,
"absenceExcused": 2,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 6,
"exemption": 0
},
{
"name": "XII",
"presence": 55,
"absence": 0,
"absenceExcused": 33,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 0,
"exemption": 0
},
{
"name": "I",
"presence": 88,
"absence": 0,
"absenceExcused": 2,
"absenceForSchoolReasons": 5,
"lateness": 5,
"latenessExcused": 0,
"exemption": 4
},
{
"name": "II",
"presence": 44,
"absence": 3,
"absenceExcused": 2,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 8,
"exemption": 0
},
{
"name": "III",
"presence": 33,
"absence": 0,
"absenceExcused": 2,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 2,
"exemption": 9
},
{
"name": "IV",
"presence": 88,
"absence": 0,
"absenceExcused": 2,
"absenceForSchoolReasons": 6,
"lateness": 5,
"latenessExcused": 0,
"exemption": 0
},
{
"name": "V",
"presence": 99,
"absence": 0,
"absenceExcused": 2,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 0,
"exemption": 0
},
{
"name": "VI",
"presence": 124,
"absence": 6,
"absenceExcused": 2,
"absenceForSchoolReasons": 0,
"lateness": 5,
"latenessExcused": 0,
"exemption": 0
},
{
"name": "VII",
"presence": 0,
"absence": 0,
"absenceExcused": 0,
"absenceForSchoolReasons": 0,
"lateness": 0,
"latenessExcused": 0,
"exemption": 0
},
{
"name": "VIII",
"presence": 0,
"absence": 0,
"absenceExcused": 0,
"absenceForSchoolReasons": 0,
"lateness": 0,
"latenessExcused": 0,
"exemption": 0
}
]

View file

@ -1,77 +0,0 @@
[
{
"number": "0",
"days": [
{
"name": "Fizyka",
"isPresence": true
},
{
"name": "Metodologia programowania",
"isAbsenceUnexcused": true
},
{
"name": "Religia",
"isAbsenceExcused": true
},
{
"name": "Religia",
"isAbsenceForSchoolReasons": true
},
{
"name": "Uroczyste zakończenie roku szkolnego",
"isUnexcusedLateness": true
}
]
},
{
"number": "1",
"days": [
{
"name": "Metodologia programowania",
"isExcusedLateness": true
},
{
"name": "Język angielski",
"isExemption": true
},
{
"name": "Użytkowanie urządzeń peryferyjnych komputera",
"isPresence": true
},
{
"name": "Wychowanie fizyczne",
"isPresence": true
},
{
"name": "Wychowanie fizyczne",
"isPresence": true
}
]
},
{
"number": "2",
"days": [
{
"name": "Język polski",
"isPresence": true
},
{
"name": "Język polski",
"isPresence": true
},
{
"name": "Język niemiecki",
"isPresence": true
},
{
"name": "Język niemiecki",
"isPresence": true
},
{
"name": "Użytkowanie urządzeń peryferyjnych komputera",
"isPresence": true
}
]
}
]

View file

@ -96,9 +96,46 @@ router.get("/Default/123456/Oceny(\.mvc|)/Wszystkie", (req, res) => {
});
router.get('/Default/123456/Frekwencja.mvc', (req, res) => {
const sumStats = require("../../data/opiekun/frekwencja-statystyki").reduce((prev, current) => {
return {
presence: prev.presence + current.presence,
absence: prev.absence + current.absence,
absenceExcused: prev.absenceExcused + current.absenceExcused,
absenceForSchoolReasons: prev.absenceForSchoolReasons + current.absenceForSchoolReasons,
lateness: prev.lateness + current.lateness,
latenessExcused: prev.latenessExcused + current.latenessExcused,
exemption: prev.exemption + current.exemption
};
});
res.render("opiekun/frekwencja", {
title: "Witryna ucznia i rodzica Frekwencja",
data: require("../../data/opiekun/frekwencja.json"),
subjects: require("../../data/api/dictionaries/Przedmioty"),
data: _.groupBy(require("../../data/api/student/Frekwencje").map(item => {
const category = dictMap.getByValue(require("../../data/api/dictionaries/KategorieFrekwencji"), "Id", item.IdKategoria);
return {
number: item.Numer,
subject: item.PrzedmiotNazwa,
date: converter.formatDate(new Date(item.DzienTekst)),
presence: category.Obecnosc,
absence: category.Nieobecnosc,
exemption: category.Zwolnienie,
lateness: category.Spoznienie,
excused: category.Usprawiedliwione,
deleted: category.Usuniete,
attendanceInfo: category.Nazwa
};
}), "number"),
stats: require("../../data/opiekun/frekwencja-statystyki"),
sumStats: sumStats,
fullPresence: (
(sumStats.presence + sumStats.lateness + sumStats.latenessExcused) /
(sumStats.presence +
sumStats.absence +
sumStats.absenceExcused +
sumStats.absenceForSchoolReasons +
sumStats.lateness +
sumStats.latenessExcused)
) * 100,
weekDays: converter.getWeekDaysFrom(req.query.data),
tics: {
prev: converter.getPrevWeekTick(req.query.data),

View file

@ -8,33 +8,97 @@ mixin nav
append content
main.mainContainer
h1 Frekwencja
fieldset.pseudoForm
label(for="idFrekwencji") Uwzględniane wpisy frekwencyjne:
select#idFrekwencji(name="idFrekwencji")
option(value="-1") Wszystkie wpisy
option(value="2") Nieobecność nieusprawiedliwiona
option(value="3") Nieobecność usprawiedliwiona
option(value="6") Nieobecność z przyczyn szkolnych
option(value="4") Spóźnienie nieusprawiedliwione
option(value="5") Spóźnienie usprawiedliwione
option(value="7") Zwolnienie
+nav
div
.tableForm
table.presentData
thead
tr
th Lekcja
th.lesson Lekcja
each item in weekDays
th
| #{item[0]}
br
| #{item[1]}
tbody
each item in data
each item,key in data
tr
td= item.number
each cell in item.days
td= key
each cell in item
td.padding-zero
div(class={
'x-obecnosc': cell.isPresence,
'x-nieobecnosc-nieuspr': cell.isAbsenceUnexcused,
'x-nieobecnosc-uspr': cell.isAbsenceExcused,
'x-nieobecnosc-przycz-szkol': cell.isAbsenceForSchoolReasons,
'x-sp-nieusprawiedliwione': cell.isUnexcusedLateness,
'x-sp-spr': cell.isExcusedLateness,
'x-sp-zwolnienie': cell.isExemption
'x-obecnosc': cell.presence && !cell.lateness && "nieobecny z przyczyn szkolnych" !== cell.attendanceInfo,
'x-nieobecnosc-nieuspr': cell.absence,
'x-nieobecnosc-uspr': cell.absence && cell.excused,
'x-nieobecnosc-przycz-szkol': "nieobecny z przyczyn szkolnych" === cell.attendanceInfo,
'x-sp-nieusprawiedliwione': cell.lateness,
'x-sp-spr': cell.lateness && cell.excused,
'x-sp-zwolnienie': cell.exemption,
'x-sp-nieobecny-w-oddziale': cell.deleted
})
span= cell.name
span= cell.subject
+nav
h1#statystyki Statystyki
div
label(for="idPrzedmiot") Przedmiot:
select#idPrzedmiot(name="idPrzedmiot")
option(value="-1") Wszystkie
each item in subjects
option(value=item.Id)= item.Nazwa
option(value="0") Brak opisu lekcji
option(value="492") Opieka nad uczniami
h2 Frekwencja od początku roku szkolnego: #{Math.round(fullPresence * 100) / 100}
table
thead
tr
th
each month in stats
th= month.name
th Razem
tbody
tr
td.text-center Obecność
each item in stats
td= item.presence !== 0 ? item.presence : ""
td.text-center= sumStats.presence
tr
td.text-center Nieobecność nieusprawiedliwiona
each item in stats
td= item.absence !== 0 ? item.absence : ""
td.text-center= sumStats.absence
tr
td.text-center Nieobecność usprawiedliwiona
each item in stats
td= item.absenceExcused !== 0 ? item.absenceExcused : ""
td.text-center= sumStats.absenceExcused
tr
td.text-center Nieobecność z przyczyn szkolnych
each item in stats
td= item.absenceForSchoolReasons !== 0 ? item.absenceForSchoolReasons : ""
td.text-center= sumStats.absenceForSchoolReasons
tr
td.text-center Spóźnienie nieusprawiedliwione
each item in stats
td= item.lateness !== 0 ? item.lateness : ""
td.text-center= sumStats.lateness
tr
td.text-center Spóźnienie usprawiedliwione
each item in stats
td= item.latenessExcused !== 0 ? item.latenessExcused : ""
td.text-center= sumStats.latenessExcused
tr
td.text-center Zwolnienie
each item in stats
td= item.exemption !== 0 ? item.exemption : ""
td.text-center= sumStats.exemption