# SOS Infrastruktura v3.26.0

Interni ticketing sistem za cPanel hosting, PHP i MySQL/MariaDB okruženje.

Za prelazak postojećeg sistema na produkcijski domen pratiti
[PRODUCTION_MIGRATION.md](PRODUCTION_MIGRATION.md). Taj postupak ne zahteva
SQL migraciju; istorijska uputstva za nadogradnje ispod ne treba ponavljati.

## Status

Production-ready za osnovnu internu upotrebu na shared/cPanel hostingu.

## Pretpostavke

- PHP 8.1+ preporučeno.
- MySQL 5.7+ ili MariaDB 10.3+.
- Bez framework-a i bez eksternih CDN zavisnosti. Composer se koristi samo za izolovani OIDC klijent.
- `config.php` se ne pregažava prilikom nadogradnje.

## Šta je novo u v3.26.0

- Dodat je Microsoft Entra ID / Microsoft 365 login kao paralelna opcija uz postojeći email/password login.
- OIDC Authorization Code Flow koristi PKCE S256, tenant-specific discovery/JWKS i strogu proveru `state`, `nonce`, potpisa, issuer-a, audience-a, tenant-a i isteka.
- Prvi Microsoft login povezuje samo već postojećeg ticketing korisnika; novi korisnici se ne kreiraju automatski.
- `oid` je trajni Microsoft identifikator, dok role, organizacija, aktivnost i permissions ostaju isključivo u ticketing bazi.
- Migracija i deployment/test/rollback uputstva nalaze se u `ENTRA_AUTH_IMPLEMENTATION.md`.

## Šta je novo u v3.24.0

- Ispravljen je OpenXML root cause Excel Repair upozorenja u `Sažetak` worksheet-u: stari generator je emitovao duple `<row r="4">`, `<row r="5">` elemente u `sheet2.xml`. Novi generator svaki broj reda emituje tačno jednom, a pre slanja workbook-a proverava strukturu worksheet XML-a i obavezne OpenXML delove.
- `Sažetak` ostaje server-side izračunat bez Excel formula/cached formula vrednosti; dodaje i dinamički broj stavki u `Magacinu`.
- Evidencija opreme sada podržava `equipment.user_id = NULL` i novu zastavicu `is_in_warehouse`; korisnik više nije obavezan pri unosu opreme.
- Migracija `upgrade_v3_24_0.sql` menja FK opreme na `ON DELETE SET NULL`, dodaje `is_in_warehouse`, indeks za warehouse filter i tabelu `equipment_assignment_events` za istoriju promene dodele/Magacin stanja od v3.24.0 nadalje.
- Server-side pravilo sprečava stanje „dodeljen korisniku + Magacin“: izbor korisnika automatski isključuje Magacin, a uključivanje Magacina razdužuje uređaj i čisti datum dodele.
- Brisanje korisničkog naloga više ne briše njegovu opremu; oprema ostaje u inventaru kao nedodeljena, a promena se evidentira u assignment audit-u.
- Equipment pregled i export koriste `LEFT JOIN users`, pa su nedodeljene stavke vidljive u listi, pretrazi i XLSX-u. Dodat je filter `Magacin: Sve / U magacinu / Van magacina` i postojeći pill/badge prikaz.
- XLSX dobija worksheet `Magacin` samo kada filtrirani export skup sadrži warehouse opremu. Sheet koristi isti 12-column format kao `Pregled opreme`; za nedodeljene uređaje Korisnik, Sektor, Datum dodele i Email ostaju prazni.
- Inventarski/serijski brojevi ostaju tekst, regularni Unicode (`č ć š ž đ`) se čuva, XML-nevalidni kontrolni karakteri se uklanjaju, a user stringovi ostaju `inlineStr` radi zaštite od formula injection-a.

## Šta je novo u v3.23.0

- `Administracija → Korisnici` sada koristi server-side pagination sa 10 korisnika po stranici; SQL više ne učitava/renderuje sve korisnike odjednom.
- Pretraga korisnika je server-side i radi zajedno sa paginacijom nad postojećim poljima (ime, email, radno mesto, telefon, lokacija, nadređeni, sektor, šifra zaposlenog i role).
- Kartica „Novi korisnik“ na desktopu više nema sticky offset i počinje u istoj grid liniji kao glavna kartica „Korisnici“; responsive raspored ostaje isti.
- Evidencija opreme koristi server-side pagination 10/25/50 stavki po stranici, uz postojeći search/status/user filter i operativne grupe tipova `Laptop`, `Telefon`, `Monitor`, `Tablet`, `Ostalo`. `Ostalo` obuhvata postojeće ne-glavne tipove (npr. `Docking station`) bez promene podataka.
- Equipment tabela je proširena postojećim podacima: korisnik/email/sektor/lokacija, tip/model, inventarski i serijski broj, status, datum dodele, napomena i datum ažuriranja.
- `Izvezi trenutno stanje` više ne generiše CSV; `equipment_export.php` generiše pravi `.xlsx` nad kompletnim filtriranim skupom, bez uticaja pagination stranice.
- XLSX prati referentni format: worksheet-i `Pregled opreme` i `Sažetak`, 12 traženih kolona, naslov/podnaslov, filter/freeze header, statusno formatiranje i dinamički sažetak po tipu/statusu/lokaciji.
- Inventarski/serijski brojevi i ostali tekstualni podaci upisuju se kao Excel tekst (`inlineStr`) radi očuvanja vodećih nula i sprečavanja formula injection-a.
- XLSX generator koristi izolovani OpenXML helper i postojeću PHP ZIP podršku (`ZipArchive`, uz `PharData` fallback), bez Composer zahteva i bez SQL migracije.

## Šta je novo u v3.22.3

- Ispravljen desktop bug zbog kog se kartica „Evidencija“ kod zaduženog korisnika mogla skupiti praktično do samog header-a kada „Učesnici“ i „Ažuriranje tiketa“ zauzmu raspoloživu visinu.
- `ticket-evidence-card` više nema shrink obrazac `flex: 1 1 0`/`overflow: hidden`; koristi prirodnu minimalnu visinu i ne skriva „Poslednje događaje“.
- Timeline zadržava postojeći interni scroll i `max-height: 518px`, približno za šest standardnih događaja.
- Dodato je `align-content: start` na audit timeline grid, pa pojedinačne event kartice ostaju content-driven i više se ne razvlače kroz praznu visinu Evidencije.
- USERF, USERDS, zaduženi korisnici, processing role i administratori koriste isti zajednički audit layout; nema role-specifičnog CSS-a niti promene audit podataka.
- Na `<=1160px` ostaje postojeći prirodni vertikalni responsive layout. Nema SQL migracije ni backend izmene.

## Šta je novo u v3.22.2

- Na postojećem phone breakpoint-u do 640 px korigovana je prevelika visina primarnih CTA dugmadi „Sačuvaj fotografiju“ i „Sačuvaj novu lozinku“ u delu „Podaci o nalogu“.
- Root cause je bio nasleđeni `flex: 1 1 180px` nad `.inline-actions .button` nakon što mobile layout promeni flex osu u vertikalnu; lokalni override vraća `flex-basis` na `auto`.
- Dugmad koriste `min-height: 48px` i `padding-block: 12px`, uz nepromenjene širinu, boje, gradient, font, radius, shadow i funkcionalnost.
- Postojeće v3.22.1 korekcije za „Novi zahtev“, „Moji tiketi“, „Pošalji tiket“ i „Odustani“ ostaju nepromenjene.
- Tablet i desktop dimenzije nisu menjane. Nema SQL migracije.

## Šta je novo u v3.22.1

- Prikazni naziv osnovne role `USERF` promenjen je iz „Korisnik — Fondacija“ u „Zaposleni — Fondacija“.
- Prikazni naziv osnovne role `USERDS` promenjen je iz „Korisnik — Dečije selo“ u „Zaposleni — Dečije selo“.
- Interni kodovi `USERF` / `USERDS`, permissions, `user_roles` veze i autorizacija ostaju nepromenjeni.
- Evidencija `responsible_role_changed` / `responsible_role_set` koristi centralni `role_label()` bez prikaza sirovih kodova u zagradama; stari audit zapisi nisu menjani.
- Na postojećem mobilnom breakpoint-u do 640 px korigovan je lokalni `flex-basis` za dugmad „Novi zahtev“, „Moji tiketi“, „Pošalji tiket“ i „Odustani“, uz minimalnu touch visinu 48 px. Desktop i tablet izgled ostaju nepromenjeni.
- Potrebna je idempotentna data migracija `upgrade_v3_22_1.sql` samo za display nazive `USERF` / `USERDS`.

## Šta je novo u v3.22.0

- Uvedene su F/DS varijante postojećih poslovnih uloga: `USERF/USERDS`, `OFCF/OFCDS`, `VHCF/VHCDS`, `ICTF/ICTDS`, `OTHF/OTHDS`.
- Ticket routing koristi tačan `responsible_role_code`, pa Fondacija i Dečije selo ostaju organizaciono izolovani bez dupliranja aplikacije ili baze.
- Kategorije zadržavaju kanonsko funkcionalno mapiranje, dok backend bira F/DS varijantu prema osnovnoj korisničkoj ulozi.
- Desktop kartica „Evidencija“ poravnata je sa `ticket-main` layout-om kroz stretch/flex obrazac; lista događaja koristi interni scroll.
- Migracija `upgrade_v3_22_0.sql` dodaje DS role bez promene postojećih ID-jeva ili korisnika.

## Šta je novo u v3.21.3

- Dashboard ima konzistentan razmak između „Dodeljena oprema“ i „Najnoviji zahtevi“, bez promene strukture stranice.
- „Najnoviji zahtevi“ imaju diskretan hover feedback zasnovan na postojećem card/equipment hover obrascu.
- Tabela „Najnoviji zahtevi“ dobija lokalni horizontalni overflow i na tablet širini, bez menjanja zajedničkog stila ostalih tabela.
- „Poslednji događaji“ na detalju tiketa prikazuju približno šest stavki u lokalnom scroll kontejneru; svi događaji ostaju dostupni, bez ranijeg `LIMIT 20`.
- Običnim `USERF` korisnicima više se ne prikazuje statistika „Aktivni zahtevi“ u profilnom meniju; dodatne role i sistemski administratori zadržavaju postojeći prikaz.
- Nema SQL migracije, promene role modela niti redizajna.

## Šta je novo u v3.21.2

- „Moji tiketi“ sada obuhvataju tikete koje je korisnik otvorio, tikete direktno dodeljene korisniku i tikete na kojima je dodat kao učesnik.
- Participant pristup koristi `EXISTS` nad postojećom `ticket_participants` relacijom, bez JOIN duplikata i bez promene SQL šeme.
- Zaseban prikaz „Tiketi za koje sam zadužen“ i dalje obuhvata timsko/role zaduženje prema postojećem RBAC modelu.
- Razdvojena su dugmad „Sačuvaj izmene“ i „Preuzmi tiket“ korišćenjem postojećeg grid/gap obrasca, bez redizajna.
- Ažurirane su regresione QA provere i asset cache verzija.
- Nema SQL migracije niti promene strukture baze podataka.


## Šta je novo u v3.21.0

- Implementiran automatski istek autentifikovane korisničke sesije posle 10 minuta stvarne neaktivnosti.
- Posle 10 minuta prikazuje se zaključan modal sa odbrojavanjem od 60 sekundi i opcijama „Produži rad“ i „Odjava“.
- Stvarna aktivnost se potvrđuje throttled POST zahtevom; background AJAX, polling, prefetch i asset zahtevi ne produžavaju sesiju.
- Serverski hard timeout od 660 sekundi sprovodi se na svakom zahtevu nezavisno od JavaScript-a.
- Aktivnost, produženje i odjava sinhronizuju se između tabova preko BroadcastChannel/storage mehanizma.
- Postojeća `logout.php` ruta ostaje centralno mesto za invalidaciju sesije.
- Nema SQL migracije niti promene strukture baze podataka.
- Tehnička dokumentacija nalazi se u `SESSION_TIMEOUT_IMPLEMENTATION.md`.

## Šta je novo u v3.19.0

- `serve_avatar.php` servira korisničke avatare isključivo aktivnim prijavljenim korisnicima.
- HTML više ne sadrži direktne `uploads/avatars/...` URL-ove, već samo interni `user_id` endpoint.
- Direktan HTTP pristup `uploads/avatars` blokiran je dvostruko: root Apache rewrite pravilom i lokalnim `.htaccess` pravilom.
- Dodate su provere identifikatora, baze, `realpath()` granice direktorijuma, ekstenzije i stvarnog tipa slike.
- Avatar odgovori koriste privatni `no-store` cache, `nosniff` i same-origin resource politiku.
- Login placeholder je promenjen u `ime.prezime@sos-decijasela.rs` bez izmene autentifikacione logike.
- Nema SQL migracije niti promene strukture baze podataka.
- Tehnička dokumentacija nalazi se u `SEC-AVATAR-ACCESS-CONTROL.md`.

## Šta je novo u v3.18.0

- Ispravljen mobilni korisnički meni: opcija „Odjava“ ostaje vidljiva i dostupna na ekranima od 320 px do 768 px.
- Zadržana je postojeća CSRF-zaštićena logout ruta `logout.php`; nije uveden duplirani mehanizam odjave.
- Dodata je prilagođena responsive stranica `404.php` sa ispravnim HTTP 404 statusom i povratkom na panel ili login, u zavisnosti od sesije.
- Apache `mod_rewrite` pravila prosleđuju nepostojeće fajlove i rute prilagođenoj 404 stranici, bez uticaja na postojeće resurse.
- Polje „Mesto kvara“ je opciono u HTML i PHP validaciji i u bazu se upisuje kao `NULL` kada nije uneto.
- Potvrđeno je da „Inventarski broj uređaja / osnovnog sredstva“ ostaje opciono polje; automatsko popunjavanje iz opcije „Prijavi problem“ nije menjano.
- Polje „Opis problema“ ostaje obavezno i koristi tačnu klijentsku i serversku poruku „Molimo unesite opis problema.“
- Nema SQL migracije jer obe postojeće kolone već prihvataju `NULL`.
- Statičke provere mogu se pokrenuti komandom `node qa_v3_18.js`.

## Šta je novo u v3.17.1

- Originalni SOS logo iz priloga zamenjuje prethodni asset.
- Logo URL dobija dinamičku verziju iz vremena izmene fajla, pa više nije potrebno ručno čistiti browser cache nakon zamene logotipa.
- Uklonjen je dodatni padding oko logotipa radi pravilnog uklapanja u postojeći kontejner.

## Šta je novo u v3.17.0

- Lista tiketa je razdvojena na „Moji tiketi“ i „Tiketi za koje sam zadužen“.
- Od v3.21.2, „Moji tiketi“ obuhvataju vlasništvo, direktnu dodelu i učešće na tiketu; zaseban zaduženi prikaz zadržava timsko/role rutiranje.
- Korisnik sa najmanje jednom aktivnom dodatnom ulogom dobija zaseban prikaz direktno i ulogom dodeljenih tiketa.
- Kontrola prikaza se sprovodi serverski; nedozvoljen direktan URL vraća HTTP 403.
- Logo organizacije je dodat na login stranicu i u postojeći brend element nakon prijave.
- Nema SQL migracije za prelazak sa v3.16.0 na v3.17.0.
- Implementacioni detalji i QA rezultati nalaze se u `IMPLEMENTATION_REPORT_V3_17.md`.

## Šta je novo u v3.16.0

- Poslovne uloge su `USERF`, `OFCF`, `VHCF`, `ICTF` i `OTHF`.
- Jednom korisniku može biti dodeljeno više poslovnih uloga preko relacije `user_roles`.
- Sistemska administracija je odvojena kroz `users.is_system_admin`.
- Kategorije i tiketi imaju `responsible_role_code`; `assigned_to` ostaje konkretno zaduženi korisnik.
- Tiket je automatski vidljiv svim aktivnim korisnicima odgovorne uloge, bez dupliranja u listi.
- Odgovorni korisnik može preuzeti tiket, dodeliti ga članu odgovornog tima ili promeniti kategoriju/tim.
- Promene uloga, kategorije, odgovornog tima i konkretnog zaduženja evidentiraju se.
- Obavezna je migracija `upgrade_v3_16.sql`; rollback je u `rollback_v3_16.sql`.
- Detaljno uputstvo, model prava, testovi i ograničenja nalaze se u `UPGRADE_V3_16.md` i `RBAC_QA_V3_16.md`.

## Šta je novo u v3.15.1

- Tehnički QA, performance i security hardening bez promene dizajna, funkcionalnosti ili strukture baze.
- Dodate CSS zaštite od preklapanja i overflow-a dugačkih naziva, email adresa i tekstova.
- Optimizovan crop preview, filtriranje korisnika i DOM iscrtavanje lista.
- Uklonjeni N+1 upiti iz događaja promene zaduženja i ponovljeni upiti za podešavanja zahteva.
- Grupna obaveštenja sada se upisuju jednim SQL upitom.
- Zatvoreni su open redirect, CSV formula injection, login timing i CSRF rizici za GET akcije.
- Pojačana validacija agenata, opreme i poslednjeg aktivnog administratorskog naloga.
- Nema SQL migracije ni promena `config.php`; detalji su u `UPGRADE_V3_15_1.md` i `QA_SECURITY_AUDIT_V3_15_1.md`.

## Šta je novo u v3.15.0

- Dodata funkcionalnost „Učesnici” kao CC opcija na novom i postojećem tiketu.
- Učesnici se biraju autocomplete pretragom aktivnih korisnika po imenu ili email adresi.
- Dodati učesnik dobija sistemsko obaveštenje i pristup javnoj prepisci tiketa.
- Učesnici mogu da komentarišu, dodaju i preuzimaju javne priloge.
- Učesnici dobijaju obaveštenja o promenama statusa, javnim komentarima i javnim prilozima.
- Tiketi u kojima korisnik učestvuje prikazuju se u njegovoj listi, panelu i brojačima.
- Interne beleške i interni prilozi ostaju vidljivi samo agentima i administratorima.
- Dodata migracija `upgrade_v3_15.sql`; dizajn i postojeća arhitektura nisu menjani.

## Šta je novo u v3.14.0

- Brojač „Rešeni” na panelu sabira rešene i zatvorene tikete.
- Komentar ili prilog krajnjeg korisnika na zatvorenom tiketu automatski vraća tiket u status „Otvoren”.
- Automatsko ponovno otvaranje upisuje se u evidenciju događaja i obaveštenje podršci.
- Komentari administratora i agenata ne menjaju automatski status.
- Dizajn nije menjan i nema nove SQL migracije.

## Šta je novo u v3.13.2

- Popravljen kontrast dugmadi „Kopiraj” za email i telefon u dark modu.
- Popravljen kontrast potvrde „Kopirano” u dark modu.
- Položaj, dimenzije, light mode i postojeći dizajn nisu menjani.

## Šta je novo u v3.13.1

- Popravljen kontrast stranice „Administracija → Korisnici“ u dark modu.
- Popravljen prikaz kartica, statistike, polja, select opcija i formulara „Uredi nalog“.
- Dugme „Odjava“ u dark modu sada koristi bela slova.
- Light mode i postojeći raspored nisu menjani.

## Šta je novo u v3.13.0

- Administrator može da obriše nekorišćenu kategoriju zahteva.
- Administrator može da obriše nekorišćeni prioritet.
- Administrator može da obriše nekorišćeno odeljenje / lokaciju.
- Brisanje zahteva eksplicitnu potvrdu.
- Stavke povezane sa postojećim tiketima zaštićene su od brisanja i mogu se deaktivirati.
- Nema nove SQL migracije; detalji su u `UPGRADE_V3_13.md`.

## Šta je novo u v3.12.0

- Administrator može da postavi ili promeni korisničku lozinku kroz „Uredi nalog”.
- Dodata je opcija obavezne promene lozinke pri sledećoj prijavi.
- Označeni korisnik ne može da pristupi ostatku sistema dok ne potvrdi privremenu i postavi novu lozinku.
- Dugmad „Kopiraj” za email i telefon imaju fiksan položaj i dimenzije.
- Ispravljen prikaz inicijala korisnika bez profilne fotografije u padajućem meniju.
- Dodata migracija `upgrade_v3_12.sql` i uputstvo `UPGRADE_V3_12.md`.

## Šta je novo u v3.11.0

- Dugme „Prijavi problem” uz dodeljenu opremu sada je crveno i vidljivije.
- Podrazumevani prioritet novog zahteva promenjen je na „Nizak”.
- Ispravljen je prikaz editora u celokupnom spisku opreme.
- Promena zaduženja u evidenciji prikazuje imena agenata umesto numeričkih ID vrednosti.
- Događaj otvaranja tiketa prikazuje samo „Otvoren”.
- Nema nove SQL migracije; detalji su u `UPGRADE_V3_11.md`.

## Šta je novo u v3.10.0

- Interne beleške i interni prilozi više se ne prikazuju krajnjem korisniku u evidenciji poslednjih događaja.
- Javni komentar i dodati prilog imaju čist prikaz bez prefiksa „Nije dodeljeno”.
- Ispravljeno prekrivanje dugmeta „Dodeli opremu” sekcijom „Ko je šta zadužio”.
- Ažuriran opis sekcije „Dodeljena oprema”.
- Svaka dodeljena oprema dobija dugme „Prijavi problem”.
- Novi zahtev iz opreme bezbedno proverava vlasništvo i automatski popunjava ICT kategoriju i inventarski broj.
- Nema nove SQL migracije; detalji su u `UPGRADE_V3_10.md`.

## Šta je novo u v3.9.0

- HTML title svake stranice sada sadrži samo naziv aktuelne stranice.
- „Moj panel” više ne koristi dinamički tekst „Dobrodošli nazad”.
- Na login stranici prikazan je puni naziv Fondacije i uklonjene su tri promotivne kartice.
- Administrator dobija stranicu „Podešavanje zahteva” za kategorije, prioritete, lokacije, aktivnost i redosled.
- Kategorije i lokacije mogu da se preimenuju uz ažuriranje postojećih tiketa.
- Novi prioriteti više nisu ograničeni prvobitnim ENUM vrednostima.
- Uz postojeći tiket moguće je naknadno dodati do 10 priloga, sa komentarom ili bez njega.
- Interni prilozi su vidljivi samo agentima i administratorima.
- Dodata migracija `upgrade_v3_9.sql` i uputstvo `UPGRADE_V3_9.md`.

## Šta je novo u v3.8.0

- Redizajnirana forma „Novi zahtev” prema operativnom obrascu za prijavu kvara.
- Dodati: odeljenje/lokacija, mesto kvara i inventarski broj uređaja / osnovnog sredstva.
- Uklonjen ručni unos naslova; naslov se automatski formira iz kategorije i mesta kvara.
- Datum otvaranja i broj tiketa ostaju automatski, ali nisu prikazani u formi.
- Unapređen izbor priloga: drag-and-drop, lista izabranih fajlova i pojedinačno uklanjanje.
- Uklonjen tekst iz podnožja svih stranica.
- Dodata SQL migracija `upgrade_v3_8.sql` i uputstvo `UPGRADE_V3_8.md`.

## Šta je novo u v3.7.0

- Uklonjena instalaciona poruka sa login stranice.
- Novi zahtev podržava do 10 priloga, ukupno najviše 50 MB.
- Dozvoljeni formati: JPG, JPEG, PNG, PDF, XLS, XLSX i TXT.
- Provera ekstenzije i stvarnog MIME sadržaja; XLS/XLSX imaju dodatnu proveru strukture.
- Prilozi se preuzimaju samo kroz autorizovanu PHP rutu i nisu direktno javno dostupni.
- Dodata SQL migracija `upgrade_v3_7.sql` i uputstvo `UPGRADE_V3_7.md`.

## Šta je novo u v3.6.1

- Fluidnije mikro-animacije za kartice, dugmad, dropdown menije, navigaciju i forme.
- Redizajnirana login stranica sa premium vizuelnim stilom, boljim spacing-om i responzivnim prikazom.
- Nema nove SQL migracije.

## Šta je novo u v3.6.0

- Kompletan grafički redizajn za moderniji i pregledniji korisnički doživljaj.
- Ujednačena tipografija, kartice, dugmad, forme, tabele, dropdown meniji i status oznake.
- Fluidnije mikro-animacije i hover stanja bez opterećenja performansi.
- Poboljšan dashboard, Podaci o nalogu, Moja oprema, Administracija korisnika i Oprema zaposlenih.
- Responsive optimizacija za desktop, tablet i mobilne uređaje.
- Nema nove SQL migracije.


## Nadogradnja sa v3.15.1

Ova verzija zahteva SQL migraciju. Pogledajte `UPGRADE_V3_16.md`.

1. Napravite backup foldera i baze.
2. Sačuvajte postojeći `config.php`.
3. Importujte `upgrade_v3_16.sql`.
4. Zamenite aplikativne fajlove novom verzijom, ali zadržite postojeći `config.php` i `uploads` folder.
5. Proverite mapiranje bivših agenata prema kontrolnim upitima iz `UPGRADE_V3_16.md`.
6. Uradite hard refresh u browser-u: `Ctrl + F5`.

Ako prelazite sa verzije starije od v3.15.1, prvo redom primenite ranije migracije.

## Čista instalacija

1. Kreirati MySQL bazu i korisnika u cPanel-u.
2. Importovati `database.sql` kroz phpMyAdmin.
3. Kopirati `config.example.php` u `config.php`.
4. Popuniti DB podatke u `config.php`.
5. Otvoriti `create_admin.php` i kreirati prvog administratora.
6. Odmah obrisati `create_admin.php` sa servera.

## Bitni fajlovi

```text
account.php              # podaci o nalogu, profilna fotografija, promena lozinke
change_password.php      # kompatibilni redirect ka account.php#password
profile_photo.php        # kompatibilni redirect ka account.php#photo
serve_avatar.php          # autentifikovano serviranje korisničkih avatara
dashboard.php            # moj panel i personalizovani pregled
users.php                # administracija korisnika i pregled profila zaposlenog
equipment.php            # administracija opreme, pretraga, pregled po korisniku i izvoz
equipment_export.php     # Excel-kompatibilni izvoz trenutnog stanja opreme
tickets.php              # lista zahteva
ticket_create.php        # novi zahtev
ticket_view.php          # detalji zahteva
participant_search.php   # autocomplete pretraga registrovanih korisnika za učesnike
attachment_download.php  # autorizovano preuzimanje priloga
notifications.php        # obaveštenja
```

## Bezbednosne napomene

- `create_admin.php` obrisati odmah nakon inicijalne instalacije.
- `ALLOW_PUBLIC_REGISTRATION` držati na `false` za interni sistem.
- Folder `uploads/avatars` je potpuno nedostupan direktnim HTTP zahtevima; avatari se učitavaju samo kroz `serve_avatar.php`.
- Upload profilne fotografije je ograničen na JPG/PNG i 2 MB.
- Prilozi uz zahteve su u direktno nedostupnom folderu i preuzimaju se tek nakon provere prava pristupa.
- Lozinke se čuvaju preko `password_hash()`.
- Forme koriste CSRF tokene.
- SQL koristi PDO prepared statements.
