Add attendance statistics
This commit is contained in:
parent
5cb74c1be2
commit
889b765ad3
5 changed files with 305 additions and 114 deletions
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
122
data/opiekun/frekwencja-statystyki.json
Normal file
122
data/opiekun/frekwencja-statystyki.json
Normal 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
|
||||
}
|
||||
]
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue