Files
TimeLog/docs/specification.txt

416 lines
12 KiB
Plaintext

Specifikacia aplikacie TimeLog
==============================
Stav dokumentu
--------------
- Pracovna specifikacia.
- Aplikacia bude najprv sluzit na mapovanie realneho vyuzitia casu pocas dna a tyzdna.
- Cielom prvej fazy je rychle a jednoduche znacenie zaciatkov cinnosti a nasledne zobrazenie dna so sumarom.
Technologicke rozhodnutia
-------------------------
- Typ aplikacie: PWA.
- Backend: PHP.
- Frontend: HTML, CSS, JavaScript.
- Externe kniznice: nepouzivat.
- Ukladanie dat: JSON subory.
- Primarne pouzitie: mobil, ale aplikacia musi byt pouzitelna aj na desktope.
- Aplikacia bude nasadena na vlastnom serveri na subdomene s HTTPS certifikatom.
Adresarova struktura projektu
-----------------------------
Projekt bude mat oddelenu dokumentaciu, verejny webroot, PHP aplikacny kod a neverejne datove subory.
Navrhovana struktura:
docs/
specification.txt
notes.txt
public/
index.php
manifest.json
service-worker.js
assets/
css/
app.css
js/
app.js
icons/
icon-192.png
icon-512.png
src/
bootstrap.php
config.php
Auth.php
JsonStore.php
ActivityRepository.php
EventRepository.php
UserRepository.php
TimeCalculator.php
controllers/
AuthController.php
ActivityController.php
EventController.php
ReportController.php
UserController.php
views/
layout.php
login.php
dashboard.php
day.php
week.php
activities.php
users.php
data/
activities.json
users.json
days/
2026-04-27.json
2026-04-28.json
var/
logs/
sessions/
tests/
Vyklad adresarov:
- docs/ obsahuje specifikaciu, poznamky a dalsie projektove dokumenty.
- public/ je jediny adresar, ktory ma byt nastaveny ako webroot v konfiguracii servera.
- public/assets/ obsahuje staticke CSS, JavaScript a ikony pre PWA.
- src/ obsahuje PHP kod aplikacie, controllery, vypocty, pracu s JSON subormi a sablony.
- data/ obsahuje aplikacne JSON data a nesmie byt priamo dostupny cez URL.
- var/ obsahuje runtime subory, napriklad logy alebo session subory, ak sa budu ukladat v projekte.
- tests/ je priprava na jednoduche testy vypoctov a prace s datami.
Nasadenie:
- Server ma smerovat webroot na public/.
- Adresare data/, src/, docs/ a var/ nemaju byt verejne dostupne cez web.
- Ak hosting neumozni nastavit webroot priamo na public/, bude potrebne doplnit serverove pravidla, ktore zablokuju priamy pristup k neverejnym adresarom.
Pouzivatelia a prihlasovanie
----------------------------
Aplikacia bude urcena pre jedneho vlastnika a osobne pouzitie, ale moze mat viac prihlasovacich loginov.
Data nebudu oddelene podla loginu:
- Kazdy prihlaseny pouzivatel vidi vsetky cinnosti, udalosti, denne prehlady aj tyzdenne prehlady.
- Login sluzi na autorizaciu pristupu do aplikacie.
- Pri udalostiach sa moze zapisovat, ktory login udalost vytvoril alebo naposledy zmenil.
Prihlasenie bude jednoduche:
- Pouzivatelske ucty budu ulozene v subore data/users.json.
- Subor bude obsahovat login a hash hesla.
- Heslo sa nesmie ukladat v citatelnej podobe.
- Pre hash hesla sa pouzije standardna PHP funkcia password_hash().
- Overenie hesla sa bude robit cez password_verify().
- Po prihlaseni bude aplikacia pouzivat serverovu PHP session.
Navrhovana struktura users.json:
[
{
"login": "igor",
"passwordHash": "$2y$...",
"active": true,
"createdAt": "2026-04-27T18:00:00+02:00"
},
{
"login": "backup",
"passwordHash": "$2y$...",
"active": true,
"createdAt": "2026-04-27T18:05:00+02:00"
}
]
Poznamky:
- Sprava loginov a hesiel bude dostupna v aplikacii.
- V aplikacii bude mozne pridat dalsi login.
- V aplikacii bude mozne zmenit heslo existujuceho loginu.
- V aplikacii bude mozne deaktivovat login.
- Verejna registracia nebude existovat.
- Pri sprave loginov treba zabranit stavu, v ktorom by neostal aktivny ziadny login.
Ciel aplikacie
--------------
Pouzivatel potrebuje lepsie manazovat cas pocas dna a tyzdna. Na zaciatku si chce zmapovat, kolko casu venuje jednotlivym cinnostiam. Prvy tyzden bude hlavne zaznamenavat, co kedy robi.
Zakladny princip je, ze pouzivatel nezadava trvanie cinnosti, ale iba okamih, kedy zacal robit novu cinnost. Trvanie sa dopocita z rozdielu medzi dvomi po sebe nasledujucimi udalostami.
Cinnosti
--------
Aplikacia bude mat zoznam cinnosti. Tento zoznam bude mozne neskor rozsirovat.
Kazda cinnost bude mat:
- ID.
- Nazov.
- Farbu.
Predpokladane zakladne cinnosti:
- Spanok.
- Praca.
- Jedlo.
- Oddych.
- Domacnost.
- Presun.
- Nakupovanie.
- Posta.
- Hygiena.
- Ine.
Tento zoznam je zakladny zoznam pre prvu verziu. Cinnosti bude mozne neskor upravovat a rozsirovat.
Spanok je bezna cinnost rovnako ako ostatne cinnosti. Aplikacia nebude mat specialne pravidla naviazane priamo na cinnost "Spanok". Ak bude neskor potrebne odlisovat typy cinnosti, zavedu sa skupiny alebo typy cinnosti.
Zaznamenavanie udalosti
-----------------------
Na hlavnej obrazovke aplikacia zobrazi tlacitka jednotlivych cinnosti.
Po kliknuti na tlacitko cinnosti sa zobrazi jednoduchy formular:
- Vybrana cinnost.
- Predvyplneny aktualny cas.
- Moznost upravit cas.
- Tlacitko OK.
- Tlacitko ZRUSIT.
Po potvrdeni sa ulozi udalost do JSON suboru prislusneho dna.
Udalost znamena: "od tohto casu zacala tato cinnost".
Ukladanie dat
-------------
Data budu ulozene v suboroch JSON.
Pre kazdy den bude samostatny subor s udalostami. Subor bude obsahovat jednotlive kliknutia, teda casy zaciatkov cinnosti.
Navrhovana datova struktura:
data/
activities.json
users.json
days/
2026-04-27.json
2026-04-28.json
activities.json:
[
{
"id": "sleep",
"name": "Spanok",
"color": "#4A5568"
},
{
"id": "work",
"name": "Praca",
"color": "#2B6CB0"
}
]
Subor dna:
{
"date": "2026-04-27",
"events": [
{
"time": "07:03",
"activityId": "work",
"createdAt": "2026-04-27T07:03:00+02:00",
"createdBy": "igor",
"updatedAt": null,
"updatedBy": null
},
{
"time": "22:43",
"activityId": "sleep",
"createdAt": "2026-04-27T22:43:00+02:00",
"createdBy": "igor",
"updatedAt": null,
"updatedBy": null
}
]
}
Poznamky k ukladaniu:
- Udalosti v subore dna budu zoradene podla casu.
- Ak pouzivatel zada udalost s rovnakym casom ako existujuca udalost, aplikacia duplicitny cas nepovoli a vypise varovanie.
- Udalosti bude mozne spatne pridavat aj do predoslych dni.
- Udalosti bude mozne upravovat.
- Udalosti bude mozne vymazat.
- Pri uprave bude mozne zmenit cas aj cinnost, napriklad ked sa pouzivatel pomylil.
- Pri vytvoreni udalosti sa ulozi createdBy podla aktualne prihlaseneho loginu.
- Pri zmene udalosti sa ulozi updatedBy a updatedAt podla aktualne prihlaseneho loginu a casu zmeny.
- Pri vymazani udalosti sa udalost moze fyzicky odstranit zo suboru. Audit mazania nie je poziadavka prvej verzie.
Zobrazenie dna
--------------
Aplikacia musi umoznit prepnut sa na zobrazenie aktualneho dna aj historickeho dna.
Zobrazenie dna bude obsahovat:
- Casovu os dna.
- Obdlzniky reprezentujuce useky cinnosti.
- Sumar jednotlivych cinnosti v hodinach a minutach.
Mobilne rozlisenie:
- Casova os bude vertikalna.
- Useky cinnosti budu zobrazene ako farebne obdlzniky pod sebou.
Desktop rozlisenie:
- Casova os bude horizontalna.
- Useky cinnosti budu zobrazene ako farebne obdlzniky zlava doprava.
Vypocet trvania cinnosti
------------------------
Kazda udalost urcuje zaciatok cinnosti. Koniec cinnosti je cas nasledujucej udalosti.
Priklad:
- 07:03 Praca
- 12:00 Jedlo
Vysledok:
- Praca trvala od 07:03 do 12:00.
Zaciatok dna
------------
Ak je prva udalost dna napriklad o 07:03, cas od 00:00 do 07:03 sa musi dopocitat z kontextu.
Pravidlo:
- Ak pre dany den existuje predchadzajuci den, aplikacia pozrie poslednu udalost predchadzajuceho dna.
- Aktivita z poslednej udalosti predchadzajuceho dna sa pouzije od 00:00 do prvej udalosti aktualneho dna.
- Ak predchadzajuci den neexistuje alebo nema udalosti, pouzije sa vychodzia cinnost "Spanok".
Priklad:
- 2026-04-26 posledna udalost: 22:43 Spanok
- 2026-04-27 prva udalost: 07:03 Praca
Vysledok pre 2026-04-27:
- 00:00 - 07:03 Spanok
- 07:03 - dalsia udalost Praca
Praca cez polnoc
----------------
Pouzivatel moze pracovat aj cez polnoc.
Priklad:
- 2026-04-26 posledna udalost: 23:30 Praca
- 2026-04-27 prva udalost: 02:15 Spanok
Vysledok pre 2026-04-27:
- 00:00 - 02:15 Praca
- 02:15 - dalsia udalost Spanok
Toto pravidlo je dolezite hlavne v pripade, ked pouzivatel klikne na "Spanok" az po polnoci. Vtedy zaciatok noveho dna nema automaticky znamenat spanok, ale musi nadviazat na poslednu cinnost z predchadzajuceho dna.
Koniec dna
----------
Pre zobrazenie aktualneho dna treba dopocitat aj posledny usek.
Navrh pravidiel:
- Pri aktualnom dni posledna cinnost trva od poslednej udalosti po aktualny cas.
- Pri historickom dni posledna cinnost trva od poslednej udalosti do 24:00.
Sumar dna
---------
Sumar zobrazi celkovy cas pre kazdu cinnost v danom dni.
Format zobrazenia:
- Hodiny a minuty.
- Napriklad: Praca 7 h 35 min, Spanok 8 h 12 min.
Do sumaru sa zapocitaju aj dopocitane useky:
- Od 00:00 po prvu udalost.
- Od poslednej udalosti po aktualny cas alebo 24:00 podla typu dna.
Tyzdenny prehlad
----------------
Aplikacia bude uz v prvej verzii obsahovat tyzdenny prehlad a tyzdenny sumar.
Tyzden zacina v pondelok.
Tyzdenny prehlad bude obsahovat:
- Vyber alebo zobrazenie aktualneho tyzdna.
- Prehlad jednotlivych dni v tyzdni.
- Sumar casu podla cinnosti za cely tyzden.
- Moznost prejst z tyzdenneho prehladu na detail konkretneho dna.
Tyzdenny sumar bude pocitat trvania rovnakym sposobom ako denny sumar:
- Kazdy den sa najprv prepocita na useky cinnosti.
- Useky sa zoskupia podla activityId.
- Vysledok sa zobrazi v hodinach a minutach.
Pri tyzdennom prehlade treba pocitat s tym, ze prvy den tyzdna moze nadvazovat na poslednu udalost z predchadzajuceho dna mimo zobrazeneho tyzdna.
Export dat
----------
Export dat nie je poziadavka prvej verzie.
PWA poziadavky
--------------
Aplikacia bude PWA, aby bola jednoducho pouzitelna a nasaditelna.
Zakladne PWA casti:
- manifest.json.
- service worker.
- Ikony aplikacie.
- Moznost pridat aplikaciu na plochu.
Poznamky:
- Aplikacia bude fungovat ako instalovatelna PWA s online pouzitim na jednom serveri.
- Offline rezim nie je poziadavka prvej verzie.
Predbezne obrazovky
-------------------
1. Hlavna obrazovka - rychle znacenie cinnosti
- Zoznam tlacidiel cinnosti.
- Kliknutie otvori formular s casom.
- Potvrdenie ulozi udalost.
2. Zobrazenie dna
- Casova os dna.
- Farebne useky cinnosti.
- Sumar hodin a minut podla cinnosti.
- Moznost upravit existujucu udalost.
- Moznost vymazat existujucu udalost.
- Moznost spatne pridat udalost do zvoleneho dna.
3. Tyzdenny prehlad
- Prehlad dni v aktualnom alebo zvolenom tyzdni.
- Tyzdenny sumar hodin a minut podla cinnosti.
- Preklik na detail dna.
4. Sprava cinnosti
- Zoznam cinnosti.
- Pridanie novej cinnosti.
- Uprava nazvu a farby.
- Pripadne vypnutie alebo skrytie cinnosti.
5. Sprava loginov a hesiel
- Zoznam loginov.
- Pridanie noveho loginu.
- Zmena hesla existujuceho loginu.
- Deaktivovanie loginu.
Vyriesene rozhodnutia
---------------------
- Aplikacia bude pre jedneho vlastnika, ale moze mat viac prihlasovacich loginov.
- Prihlasovanie bude cez login a hash hesla ulozeny v data/users.json.
- Vsetky login-y vidia vsetky data. Data sa nefiltruju podla loginu.
- Pri udalosti sa moze evidovat, kto ju vytvoril a kto ju naposledy zmenil.
- Aplikacia bude nasadena na vlastnom serveri na subdomene s HTTPS certifikatom.
- Udalosti bude mozne spatne pridavat aj do predoslych dni.
- Udalosti bude mozne upravovat, vymazat a zmenit na inu cinnost.
- Zakladny zoznam cinnosti je uvedeny v casti Cinnosti.
- Spanok je bezna cinnost bez specialnych pravidiel.
- Vychodzia cinnost pre zaciatok evidencie je "Spanok".
- Duplicitny cas udalosti v jednom dni nebude povoleny a aplikacia zobrazi varovanie.
- Tyzdenny prehlad a tyzdenny sumar patria do prvej verzie.
- Tyzden zacina v pondelok.
- Export dat nie je poziadavka prvej verzie.
- Sprava loginov a hesiel bude v aplikacii.
Otazky na doplnenie
-------------------
- Zatial ziadne.