Funkcionalni zahtev - Balans5 CBA sistem: Difference between revisions

19.11.2025 Prusac | 05.12.2025

No edit summary
No edit summary
 
(39 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{abstract|txt=Ovaj dokument definiše funkcionalne zahteve za Balans 5 CBA ({{#tip-text: Cluster|Kolekcija baza podataka kojom upravlja jedna instanca pokrenutog PostgreSQL servera.}} Based Authentication) sistem - centralizovani sistem za autentifikaciju i autorizaciju za {{#tip-text: multi-tenant sistem|Multi-tenant sistem je softverska arhitektura gde jedna instanca aplikacije služi višestrukim korisnicima. Podaci svakog korisnika se čuvaju odvojeno i bezbedno, što im omogućava da dele resurse uz očuvanje privatnosti i opcija prilagođavanja.}}.|min=10}}
{{abstract|txt=Ovaj dokument definiše funkcionalne zahteve za Balans 5 CBA ({{#tip-text: Cluster|Kolekcija baza podataka kojom upravlja jedna instanca pokrenutog PostgreSQL servera.}} Based Authentication) sistem - centralizovani sistem za autentifikaciju i autorizaciju za {{#tip-text: multi-tenant sistem|Multi-tenant sistem je softverska arhitektura gde jedna instanca aplikacije služi višestrukim korisnicima. Podaci svakog korisnika se čuvaju izolovano, što im omogućava da dele resurse uz očuvanje sopstvenih podataka i preferenci.}}.|min=10}}


<!--
__NOTOC__ PRIVREMENO UKUNUT SADRŽAJ. Smeta prilikom editovanja.
__NOTOC__ PRIVREMENO UKUNUT SADRŽAJ. Smeta prilikom editovanja.
 
-->
= 1. Uvod =
= 1. Uvod =


Line 17: Line 19:
<ul>
<ul>
<li>
<li>
<span class="zamena">'''Cluster''' - Jedna aktivna instanca PostgreSQL servera koja može sadržati više raznih baza podataka i obavezno sadrži bazu <code>blfpub</code>. U širem smislu u Cluster spadaju i servisi za autentifikaciju i autorizaciju.</span>
<span class="zamena">'''Cluster''' - Ovde se podrazumeva jedna aktivna instanca PostgreSQL servera koja može sadržati više raznih Balans baza podataka i obavezno sadrži bazu <code>blfpub</code>. U širem smislu u Cluster spadaju i servisi za autentifikaciju i autorizaciju.</span>
</li>
</li>
<li>'''CSA''' - Cluster Super Admin (Super Administrator Cluster-a)</li>
<li>'''CSA''' - Cluster Super Admin (Super Administrator Cluster-a)</li>
<li>'''CGA''' - Cluster Group Admin (Administrator Grupe) </li>
<li>'''CGA''' - Cluster Group Admin (Administrator Grupe) </li>
<li><span class="zameniti>USER - Redovan korisnik sistema</span></li>
<li>'''USER''' - Redovan korisnik sistema</li>
<li><span class="zamena">'''Korisnik''' - Redovan korisnik sistema</span></li>
<li><span class="zameniti">Firma - Pojedinačna kompanija/tenant u sistemu</span></li>
<li><span class="zameniti">Firma - Pojedinačna kompanija/tenant u sistemu</span></li>
<li><span class="zamena">'''Firma''' - Pojedinačna kompanija (baza podataka) u sistemu</span></li>
<li><span class="zamena">'''Firma''' - Pojedinačna kompanija (baza podataka) u sistemu</span></li>
Line 30: Line 31:
<li><span class="zameniti">Prefix - Prefiks za korisničko ime koji se automatski dodaje na osnovu grupe (npr. bjn.petar_petrovic)</span></li>
<li><span class="zameniti">Prefix - Prefiks za korisničko ime koji se automatski dodaje na osnovu grupe (npr. bjn.petar_petrovic)</span></li>
<li><span class="zamena">'''Prefiks''' - Prefiks za korisničko ime koji se automatski dodaje na osnovu Grupe (npr. bjn.petar_petrovic)</span></li>
<li><span class="zamena">'''Prefiks''' - Prefiks za korisničko ime koji se automatski dodaje na osnovu Grupe (npr. bjn.petar_petrovic)</span></li>
<li>'''Cluster Token''' - {{#tip-text: JWT token|JSON web token (JWT) je bezbedan način slanja informacija između klijenta i servera. Uglavnom se koristi u web aplikacijama i API-jima za verifikaciju korisnika i sprečavanje neovlašćenog pristupa. JWT su JSON podaci zaštićeni kriptografskim potpisom.}} [https://datatracker.ietf.org/doc/html/rfc7519 RFC 7519] koji se generiše nakon login-a (24h važnosti)</li>
<li>'''Cluster Token''' - <span class="zamena">access</span> {{#tip-text: JWT token|JSON web token (JWT) omogućava bezbedan (kontrolisan) način slanja informacija između klijenta i servera. Uglavnom se koristi u web aplikacijama i API-jima za verifikaciju korisnika i sprečavanje neovlašćenog pristupa. JWT su JSON podaci zaštićeni kriptografskim potpisom.}} [https://datatracker.ietf.org/doc/html/rfc7519 RFC 7519] koji se generiše nakon login-a (24h važnosti)<span class="zamena">; služi za izbor Firme sa kojom će Korisnik raditi</span></li>
<li>'''Firm Token''' - JWT token koji se generiše nakon izbora Firme (8h važnosti)</li>
<li>'''Firm Token''' - <span class="zamena">access</span> JWT token koji se generiše nakon izbora Firme (8h važnosti)<span class="zamena">; služi za rad sa izabranom Firmom</span></li>
<li>'''Refresh Token''' - Token za obnavljanje access tokena (7 dana važnosti)</li>
<li>'''Refresh Token''' - Token za obnavljanje oba access tokena (7 dana važnosti)</li>
</ul>
</ul>
{{koment|txt=Ako smo na početku definisali USER, Firma, Grupa itd, u daljem tekstu se treba držati definisanih termina. <s>Korisnik</s> USER, <s>kompanija</s> Firma, <s>grupa</s> Grupa, <s>Refresh token</s> Refresh Token...<br>
Možda definisane termine prikazati u dokumentu plavom bojom?}}<br>


== 1.4 Glavne karakteristike ==
== 1.4 Glavne karakteristike ==


* Jedinstveni nalog za više firmi {{koment|txt=Koristio bih uvek 'jedinstveni' umesto 'jedan'. Jedan = one, jedinstveni = single.}}
* Jedinstveni nalog za više <span class="fw5">Firmi</span>
* Grupa-baziran pristup {{koment|txt=Pristup baziran na grupama}} (korisnici grupe firme) {{koment|txt=Šta sa firmama koje nisu ni u jednog grupi? Jesu li i one 'grupa-bazirane'?}}
* <span class="zameniti>Grupa-baziran pristup</span> <span class="zamena>Pristup baziran na <span class="fw5">Grupama</span></span> (<span class="fw5">Korisnici Grupe Firme</span>)
* Centralizovano upravljanje korisnicima
* Centralizovano upravljanje <span class="fw5">Korisnicima</span>
* JWT token-based autentifikacija {{koment|txt=Autentifikacija bazirana na JWT tokenima}}
* <span class="zameniti>JWT token-based autentifikacija </span><span class="zamena>Autentifikacija bazirana na JWT tokenima</span>
* Multi-tenant izolacija podataka {{koment|txt=Zar 'multi-tenant' ne podrazumeva izolaciju podataka. Meni se čini da se izolacija podataka podrazumeva kada napišemo 'multi-tenant'.}}
* <span class="zameniti>Multi-tenant izolacija podataka</span><span class="zamena>Izolacija podataka na nivou <span class="fw5">Tenanta</span></span>




Line 53: Line 49:
== 2.1 Arhitektura sistema ==
== 2.1 Arhitektura sistema ==


Sistem se sastoji od tri glavna sloja:
Sistem se sastoji od tri glavna sloja:<ul class="zameniti">
* Autentifikacioni sloj - JWT token-based autentifikacija sa refresh token mehanizmom.
<li>Autentifikacioni sloj - JWT token-based autentifikacija sa refresh token mehanizmom.</li>
* Autorizacioni sloj - Role-based access control (RBAC) sa grupama.
<li>Autorizacioni sloj - Role-based access control (RBAC) sa grupama.</li>
* Tenant sloj - Izolacija podataka po firmama.
<li>Tenant sloj - Izolacija podataka po firmama.</li>
</ul>


<ul>
<ul class="zamena">
<li>{{koment|txt=Autentifikacioni sloj - Ovde se vrši autentifikacija, bazirana na JWT tokenima  sa refresh token mehanizmom.}}</li>
<li>Autentifikacioni sloj - Autentifikacija, bazirana na JWT tokenima  sa refresh token mehanizmom.</li>
<li>{{koment|txt=Autorizacioni sloj - Vršimo autorizaciju autentifikovanih korisnika u skladu sa ulogama ({{#tip-text: RBAC|Kontrola pristupa zasnovana na ulogama (Role-based access control, RBAC) je model za ovlašćivanje krajnjih korisnika za pristup sistemima, aplikacijama i podacima na osnovu unapred definisane uloge korisnika.}}) koje su im dodeljene unutar njihove grupe.}}</li>
<li>Autorizacioni sloj - Autorizacija autentifikovanih <span class="fw5">Korisnika</span> u skladu sa ulogama koje su im dodeljene unutar njihove <span class="fw5">Grupe</span> ({{#tip-text: RBAC|Kontrola pristupa zasnovana na ulogama (Role-based access control, RBAC) je model za ovlašćivanje krajnjih korisnika za pristup sistemima, aplikacijama i podacima na osnovu unapred definisane uloge korisnika.}}).</li>
<li>{{koment|txt=Tenant sloj - Pristup podacima, izolovanim po firmama.}}</li>
<li><span class="fw5">Tenant</span> sloj - Pristup podacima, izolovanim po <span class="fw5">Firmama</span>.</li>
</ul>
</ul>


Line 67: Line 64:




{| class="mst mst-siva mst-100"
{| class="mst mst-100 zameniti"
|-
|-
! Akter
! Akter
Line 75: Line 72:
|| Super Admin
|| Super Admin
|| CSA
|| CSA
|| Kreiranje grupa, dodela firmi {{koment|txt=grupama}}, upravljanje svim korisnicima.
|| Kreiranje grupa, dodela firmi, upravljanje svim korisnicima.
|-
|-
|| Group Admin
|| Group Admin
Line 84: Line 81:
|| USER
|| USER
|| Pristup dodeljenim firmama, izvršavanje poslovnih operacija.
|| Pristup dodeljenim firmama, izvršavanje poslovnih operacija.
|-
|}
{| class="mst mst-100 zamena"
|-
! Akter
! Uloga
! Odgovornosti
|-
|| Super Admin
|| CSA
|| Kreiranje <span class="fw5">Grupa</span>, dodela <span class="fw5">Firmi Grupama</span>, upravljanje svim <span class="fw5">Korisnicima</span>.
|-
|| Group Admin
|| CGA
|| Upravljanje <span class="fw5">Korisnicima</span> unutar dodeljenih <span class="fw5">Grupa</span>.
|-
|| End User
|| Korisnik
|| Pristup dodeljenim <span class="fw5">Firmama</span>, izvršavanje poslovnih operacija.
|-
|-
|}
|}
Line 91: Line 109:


Sistem koristi tri tipa tokena:
Sistem koristi tri tipa tokena:
* Cluster Token (24 sata) - generiše se nakon uspešnog login-a i sadrži listu dostupnih firmi.
* <span class="fw5">Cluster Token</span> (24 sata) - generiše se nakon uspešnog login-a i sadrži listu dostupnih <span class="fw5">Firmi</span>.
* Firm Token (8 sati) - generiše se nakon izbora firme i sadrži informacije o firmi i profilu.
* <span class="fw5">Firm Token</span> (8 sati) - generiše se nakon izbora <span class="fw5">Firme</span> i sadrži informacije o <span class="fw5">Firmi</span> i profilu <span class="fw5 zamena">Korisnika</span>.
* Refresh Token (7 dana) - koristi se za obnavljanje access tokena bez ponovnog login-a.
* <span class="fw5">Refresh Token</span> (7 dana) - koristi se za obnavljanje oba access tokena bez ponovnog login-a.




Line 100: Line 118:
== 3.1 Matrica dozvola ==
== 3.1 Matrica dozvola ==


{{koment|txt= U '1.3 Definicije' smo naveli USER, Firma, Grupa... te bi trebali toga da se držimo u daljem tekstu.}}
 


{| class="mst mst-siva mst-100"
{| class="mst mst-siva mst-100"
Line 109: Line 127:
! USER
! USER
|-
|-
|| Kreiranje grupe {{koment|txt=Kreiranje Grupa}}
|| Kreiranje <span class="fw5">Grupa</span>
|| ✓
|| ✓
|| -
|| -
|| -
|| -
|-
|-
|| Dodela firme grupi {{koment|txt=Firme Grupi}}
|| Dodela <span class="fw5">Firme Grupi</span>
|| ✓
|| ✓
|| -
|| -
|| -
|| -
|-
|-
|| Kreiranje korisnika {{koment|txt=USER-a}}
|| Kreiranje <span class="fw5">Korisnika</span>
|| ✓
|| ✓
|| ✓*
|| ✓*
|| -
|| -
|-
|-
|| Pristup firmi {{koment|txt=podacima Firme}}
|| Pristup podacima <span class="fw5">Firme</span>
|| ✓
|| ✓
|| ✓
|| ✓
|| ✓
|| ✓
|-
|-
|| Upravljanje grupama {{koment|txt=Grupama}}
|| Upravljanje <span class="fw5">Grupama</span>
|| ✓
|| ✓
|| -
|| -
|| -
|| -
|-
|-
|| Masovno kreiranje korisnika {{koment|txt=USER-a}}
|| Masovno kreiranje <span class="fw5">Korisnika</span>
|| ✓
|| ✓
|| ✓
|| ✓
|| -
|| -
|-
|-
|| CSV import korisnika {{koment|txt=User-a}}
|| CSV import <span class="fw5">Korisnika</span>
|| ✓
|| ✓
|| ✓
|| ✓
|| -
|| -
|-
|-
|| Mapiranje korisnika {{koment|txt=USER-a}} na tenant {{koment|txt=svoju Firmu?}}
|| Mapiranje <span class="fw5">Korisnika</span> na <span class="fw5">Tenant</span>
|| ✓
|| ✓
|| ✓
|| ✓
|| -
|| -
|-
|-
|| Pristup arhivi {{koment|txt=kojoj arhivi?}}
|| Pristup arhivi {{koment|txt=arhiviranim podacima Firme?}}
|| -
|| -
|| -
|| -
Line 155: Line 173:
|-
|-
|}
|}
<nowiki>* CGA može kreirati samo USER naloge unutar svojih Grupa.</nowiki>


<nowiki>** USER može pristupiti arhivi samo svojih Firmi.</nowiki>
<nowiki>*</nowiki> <span class="fw5">CGA</span> može kreirati <span class="fw5">Korisničke</span> naloge samo unutar svojih <span class="fw5">Grupa</span>.<br>
<nowiki>**</nowiki> <span class="fw5">Korisnik</span> može pristupiti arhivi samo svojih <span class="fw5">Firmi</span>.


== 3.2 Ograničenja po ulogama ==
== 3.2 Ograničenja po ulogama ==


* CSA: Ima pristup svim grupama, firmama i korisnicima. {{koment|txt=Grupama, Firmama i USER-ima.}}
* <span class="fw5">CSA</span>: Ima pristup svim <span class="fw5">Grupama, Firmama i Korisnicima</span>.
* CGA: Može upravljati samo korisnicima {{koment|txt=USER-ima}} u svojim dodeljenim grupama {{koment|txt=Grupama}}.
* <span class="fw5">CGA</span>: Može upravljati samo <span class="fw5">Korisnicima</span> u svojim dodeljenim <span class="fw5">Grupama</span>.
* USER: Može pristupiti samo firmama {{koment|txt=Firmama}} koje su dodeljene njegovim grupama {{koment|txt=Grupama}}.
* <span class="fw5">Korisnik</span>: Može pristupiti samo <span class="fw5">Firmama</span> koje su dodeljene njegovim <span class="fw5">Grupama</span>.




Line 170: Line 188:
== 4.1 Modul autentifikacije ==
== 4.1 Modul autentifikacije ==


=== 4.1.1 Login korisnika ===
{{wPoruka|txt=Imamo 4.1.1 Login Korisnika, imamo 4.1.2 Izbor Firme. Nedostaje scenario za Korisnika koji radi samo sa jednom Firmom (nema šta da bira). On ne vidi stranu /api/auth/select-firm ali dobija Firm Token.<br>
Ko mu vraća Firm Token - /api/auth/login ili /api/auth/select-firm?|naslov=Nedostaje treći slučaj}}
 
=== 4.1.1 Login Korisnika ===


* REQ-1: Sistem MORA obezbediti login ekran sa poljima za korisničko ime i lozinku.
* REQ-1: Sistem MORA obezbediti login ekran sa poljima za korisničko ime i lozinku.
* REQ-2: Sistem MORA validirati kredencijale koristeći centralnu CBA {{koment|txt=šta je CBA?}} bazu podataka.
* REQ-2: Sistem MORA validirati kredencijale koristeći centralnu CBA bazu podataka.{{koment|txt=centralna CBA baza podataka = <code>blfpub</code>?}}
* REQ-3: Sistem MORA zaključati nalog nakon 5 neuspešnih pokušaja login-a {{koment|txt=u kom vremenskom periodu su tih 5 neuspešnih? Ili nema vremenske odrednice već pratimo 5 uzastopnih? Meni nejasno}}.
* REQ-3: Sistem MORA zaključati nalog nakon 5 neuspešnih pokušaja login-a {{koment|txt=u kom vremenskom periodu su tih 5 neuspešnih? Ili nema vremenske odrednice već pratimo 5 uzastopnih?}}.
* REQ-4: Sistem MORA generisati cluster_token (24h) ili firm_token (8h) nakon uspešnog login-a. {{koment|txt=meni za sada nejasno 'ili'}}
* REQ-4: Sistem MORA generisati <span class="zameniti">cluster_token</span> <span class="zamena fw5">Cluster Token</span> (24h) ili <span class="zameniti">firm_token</span> <span class="zamena fw5">Firm Token</span> (8h) nakon uspešnog login-a.
* REQ-5: Sistem MORA logovati sve uspešne pokušaje login-a (vreme, IP, rezultat). {{koment|txt=a neuspešne? Šta je 'rezultat' ako loguje samo uspešne?}}
* REQ-5: Sistem MORA logovati sve uspešne pokušaje login-a (vreme, IP, rezultat).
* REQ-6: Sistem MORA automatski selektovati firmu ako korisnik ima pristup samo jednoj firmi. {{koment|txt=A ako ima pristup raznim firmama da li postoji mogućnost da izabere jednu za default login, ili da mu se daje poslednja u kojoj je bio? Razmišljam naglas.}}
* REQ-6: Sistem MORA automatski selektovati <span class="fw5">Firmu</span> ako <span class="fw5">Korisnik</span> ima pristup samo jednoj <span class="fw5">Firmi</span>.
 
<!--
<ul>
<li><span class="zamena">'''REQ-?''' Sistem MORA obezbediti ekran sa interfejsom za izbor <span class="fw5">Firme Korisniku</span> koji ima uloge u raznim <span class="fw5">Firmama</span>.</span></li>
<li><span class="zamena">'''REQ-?''' Sistem MORA generisati <span class="fw5">Firm Token</span> (8h) nakon izbora <span class="fw5">Firme</span> od strane <span class="fw5">Korisnika</span> koji ima uloge u više <span class="fw5">Firmi</span></span></li></ul>
-->


Ulaz:
Ulaz:
* Korisničko ime (string, obavezno, min 3 karaktera).
* <span class="fw5">Korisničko</span> ime (string, obavezno, min 3 karaktera).
* Lozinka (string, obavezno, min 8 karaktera).
* Lozinka (string, obavezno, min 8 karaktera).


Izlaz:
Izlaz:
* Uspeh: JWT token + korisnički profil {{koment|txt=šta je u profilu? dark tema? izabrani jezik? vidim da su dostupne firme van profila.}} + dostupne firme (ili automatski izabrana firma).
* Uspeh: JWT token + <span class="fw5">Korisnički</span> profil + dostupne <span class="fw5">Firme</span> (ili automatski izabrana <span class="fw5">Firma</span>).
* Neuspeh: Error kod + poruka.
* Neuspeh: Error kod + poruka.


Line 193: Line 220:
* BR-003: Zaključani nalozi ne mogu da se uloguju dok se ne otključaju.
* BR-003: Zaključani nalozi ne mogu da se uloguju dok se ne otključaju.


{{koment|txt=Neko pojašnjenje za aktivne/neaktivne, otključane/zaključane naloge?}}
{{koment|txt=Neko pojašnjenje za aktivne/neaktivne, otključane/zaključane naloge... ili nema potrebe?}}


=== 4.1.2 Izbor firme ===
=== 4.1.2 Izbor firme ===


* REQ-7: Sistem MORA prikazati listu dostupnih firmi {{koment|txt=Firmi}} nakon login-a (ako korisnik {{koment|txt=USER}} ima pristup u više firmi {{koment|txt=Firmi}}).
* REQ-7: Sistem MORA prikazati listu dostupnih <span class="fw5">Firmi</span> nakon login-a (ako <span class="fw5">Korisnik</span> ima pristup u više <span class="fw5">Firmi</span>).
* REQ-8: Sistem MORA automatski selektovati firmu {{koment|txt=Firmu}} ako korisnik {{koment|txt=User}} ima pristup samo jednoj.
* REQ-8: Sistem MORA automatski selektovati <span class="fw5">Firmu</span> ako <span class="fw5">Korisnik</span> ima pristup samo jednoj.
* REQ-9: Sistem MORA generisati firm_token (8h) nakon izbora firme {{koment|txt=Firme}}.
* REQ-9: Sistem MORA generisati <span class="zameniti>firm_token</span> <span class="zamena fw5>Firm Token</span> (8h validan) nakon izbora <span class="fw5">Firme</span>.
* REQ-10: Sistem MORA učitati firm-specifični profil i dozvole {{koment|txt=USER profil i dozvole za izabranu Firmu}} nakon izbora firme {{koment|txt=Firme}}.
* REQ-10: Sistem MORA <span class="zameniti>učitati firm-specifični profil i dozvole nakon izbora firme</span> <span class="zamena>nakon izbora <span class="fw5">Firme</span> učitati <span class="fw5">Korisnički</span> profil i prava za izabranu <span class="fw5">Firmu</span></span>.
 
{{koment|txt=prava ili dozvole za permissions?}}


=== 4.1.3 Obnavljanje tokena (Refresh Token) ===
=== 4.1.3 Obnavljanje tokena (Refresh Token) ===


* REQ-11: Sistem MORA obezbediti endpoint za obnavljanje access tokena.
* REQ-11: Sistem MORA obezbediti endpoint za obnavljanje access tokena.
* REQ-12: Sistem MORA rotirati refresh token pri svakom refresh-u. {{koment|txt=Rotirati? }}
* REQ-12: Sistem MORA <span class="zameniti>rotirati</span> <span class="zamena>generisati novi</span> <span class="fw5">Refresh Token</span> pri svakom <span class="zameniti>refresh-u</span> <span class="zamena>obnavljanju access tokena</span>.
* REQ-13: Refresh token MORA biti važeći 7 dana.
* REQ-13: <span class="fw5">Refresh Token</span> MORA biti važeći 7 dana.
* REQ-14: Sistem MORA validirati refresh token pre obnavljanja access tokena.
* REQ-14: Sistem MORA validirati <span class="fw5">Refresh Token</span> pre obnavljanja access tokena.


=== 4.1.4 Logout ===
=== 4.1.4 Logout ===


* REQ-15: Sistem MORA obezbediti logout funkcionalnost koja revokuje sesiju. {{koment|txt=opoziva sesiju? anulira sesiju?}}
* REQ-15: Sistem MORA obezbediti logout funkcionalnost koja revokuje sesiju. {{koment|txt=opoziva sesiju? anulira sesiju?}}
* REQ-16: Sistem MORA invalidirati {{koment|txt=da poništi}} refresh token nakon logout-a.
* REQ-16: Sistem MORA <span class="zameniti>invalidirati</span> <span class="zamena>da poništi</span> <span class="fw5">Refresh Token</span> nakon logout-a.




== 4.2 Modul upravljanja korisnicima ==
== 4.2 Modul upravljanja Korisnicima ==


{{koment|txt=U 1.3 nemamo 'korisnik' već 'USER'}}


=== 4.2.1 Kreiranje korisnika ===
=== 4.2.1 Kreiranje Korisnika ===


* REQ-17: Sistem MORA obezbediti formu sa obaveznim poljima: korisničko ime, email, lozinka, uloga. {{koment|txt=da li jedan USER može da ima više uloga?}}
* REQ-17: Sistem MORA obezbediti formu sa obaveznim poljima: korisničko ime, email, lozinka, uloga<span class="zamena"> (CSA, CGA, Korisnik)</span>.
* REQ-18: Sistem MORA validirati format email-a i jedinstvenost. {{koment|txt=sumnja}}
* REQ-18: Sistem MORA validirati format email-a i jedinstvenost.
* REQ-19: Sistem MORA automatski dodati prefix korisničkom imenu na osnovu grupe.
* REQ-19: Sistem MORA automatski dodati <span class="fw5">Prefiks</span> Korisničkom imenu na osnovu <span class="fw5">Grupe</span>.{{koment|txt=šta ako nije u grupi, ako radi samo sa jednom firmom? A inače u 8.2 piše da <code>username_prefix</code> nije obavezno polje}}
* REQ-20: Sistem MORA omogućiti CGA-u eksplicitni izbor grupe za prefix ako korisnik pripada više grupa. {{koment|txt=Grupe za Prefix ako USER učestvuje u više Grupa. Potpuno nejasno. Ako je USER u više Grupa, onda ga administriraju razni CGA?}}
* REQ-20: Sistem MORA omogućiti <span class="fw5">CGA</span>-u eksplicitni izbor <span class="fw5">Grupe</span> za <span class="fw5">Prefiks</span> ako se <span class="fw5">Korisnik</span> nalazi u više <span class="fw5">Grupa</span>.
* REQ-21: Sistem MORA automatski koristiti prefix iz prve grupe ako nije eksplicitno izabran.
* REQ-21: Sistem MORA automatski koristiti <span class="fw5">Prefiks</span> iz prve <span class="fw5">Grupe</span> ako nije eksplicitno izabran.


Ulaz:
Ulaz:
Line 231: Line 259:
* Email.
* Email.
* Lozinka (ili generisana privremena).
* Lozinka (ili generisana privremena).
* Uloga (CSA, CGA, USER).
* Uloga (<span class="fw5">CSA, CGA, Korisnik</span>).
* Lista grupa (groupIds).
* Lista <span class="fw5">Grupa</span> (groupIds).
* Grupa za prefix (prefixGroupId) - opciono.
* <span class="fw5">Grupa</span> za <span class="fw5">Prefiks</span> (prefixGroupId) - opciono.
 
{{koment|txt=groupIds i prefixGroupId su neke kolone iz neke tabele iz neke baze ili promenljive iz neke forme? }}


Izlaz:
Izlaz:
* Kreiran korisnik sa prefiksom u korisničkom imenu.
* Kreiran <span class="fw5">Korisnik</span> sa <span class="fw5">Prefiksom</span> u korisničkom imenu.
* Dodeljene Grupe.
* Dodeljene <span class="fw5">Grupe</span>. {{koment|txt=kome, kuda?}}
* Status kreiranja. {{koment|txt=a statusi su?}}
* Status kreiranja. {{koment|txt=a statusi su?}}


=== 4.2.2 Masovno kreiranje korisnika ===
=== 4.2.2 Masovno kreiranje Korisnika ===


* REQ-24: Sistem MORA prihvatiti CSV fajl sa podacima korisnika. {{koment|txt=Pitanje: da li se kao separator prihvata samo zarez? Ako USER ima pravo pristupa raznim Firmama kako se razdvajaju Firme u njihovom polju u formi?}}
* REQ-24: Sistem MORA prihvatiti CSV fajl sa podacima <span class="fw5">Korisnika</span>.
* REQ-25: Sistem MORA validirati sve zapise pre obrade. {{koment|txt=Šta konkretno podleže validaciji? Prezimena?}}
* REQ-25: Sistem MORA validirati sve zapise pre obrade.  
* REQ-26: Sistem MORA kreirati maksimalno 100 korisnika po batch-u. (transakcija application.properties cba.bulk.timeout-seconds=300 / cba.bulk.batch-size=100 )
* REQ-26: Sistem MORA kreirati maksimalno 100 <span class="fw5">Korisnika</span> po batch-u. (transakcija application.properties cba.bulk.timeout-seconds=300 / cba.bulk.batch-size=100 ) {{koment|txt=šta je ovo u zagradi i čemu služi?}}
* REQ-27: Sistem MORA generisati izveštaj sa uspehom/neuspehom za svaki zapis.
* REQ-27: Sistem MORA generisati izveštaj sa uspehom/neuspehom <span class="zameniti>za svaki zapis</span> <span class="zamena>za svakog <span class="fw5">Korisnika</span> iz CSV fajla</span>.
* REQ-28: Sistem MORA rollback-ovati ceo batch u slučaju kritične greške (all-or-nothing) {{koment|txt=sve ili ništa}}.
* REQ-28: Sistem MORA rollback-ovati ceo batch u slučaju kritične greške (<span class="zameniti>all-or-nothing</span> <span class="zamena>sve ili ništa</span>).
** Ako bilo koji korisnik ne prođe validaciju ili procesiranje, cela transakcija se rollback-uje
** Ako bilo koji korisnik ne prođe validaciju ili procesiranje, cela transakcija se rollback-uje
** Sve greške se prikazuju sa pozicijama korisnika
** Sve greške se prikazuju sa pozicijama <span class="fw5">Korisnika</span>
** Format greške: "Greška na poziciji #X (korisnik 'username'): detaljna poruka"
** Format greške: "Greška na poziciji <span class="zameniti>#X</span> <span class="zamena>br. x</span> (<span class="fw5">Korisnik</span> 'username'): detaljna poruka"
* REQ-29: Sistem MORA omogućiti eksplicitni izbor grupe za prefix u bulk operacijama. {{koment|txt=Šta ovo znači? Da u CSV imamo kolonu default Grupa. Zbunjuje me, treba razgovarati.}}
* REQ-29: Sistem MORA omogućiti eksplicitni izbor <span class="fw5">Grupe</span> za <span class="fw5">Prefiks</span> u <span class="zameniti>bulk</span> <span class="zamena>masovnim</span> operacijama.  
* REQ-30: Sistem MORA podržati različite profile po firmama za istog korisnika (profilePerFirm).
* REQ-30: Sistem MORA podržati različite profile po <span class="fw5">Firmama</span> za istog <span class="fw5">Korisnika</span> (profilePerFirm <span class="zamena">- kolona u CSV-u</span>).
 
{{koment|txt=srpska reč za rollback?}}


CSV Format:
CSV Format:
Line 258: Line 290:
* GroupId (obavezno).
* GroupId (obavezno).
* ProfilePerFirm (JSON mapa: {"firmId": profileId}).
* ProfilePerFirm (JSON mapa: {"firmId": profileId}).
{{koment|txt=Nejasno.}}


=== 4.2.3 Upravljanje korisnicima ===


* REQ-31: Sistem MORA omogućiti pregled svih korisnika (CSA vidi sve, CGA vidi samo svoje grupe). {{koment|txt=Grupe ili Grupu? Zar CGA nije nadležan samo za jednu Grupu?}}
=== 4.2.3 Upravljanje Korisnicima ===
 
* REQ-31: Sistem MORA omogućiti pregled svih <span class="fw5">Korisnika</span> (<span class="fw5">CSA</span> vidi sve, <span class="fw5">CGA</span> vidi samo svoje <span class="fw5">Grupe</span>).
* REQ-32: Sistem MORA omogućiti ažuriranje korisničkih podataka.
* REQ-32: Sistem MORA omogućiti ažuriranje korisničkih podataka.
* REQ-33: Sistem MORA omogućiti otključavanje zaključanih naloga.
* REQ-33: Sistem MORA omogućiti otključavanje zaključanih naloga.
* REQ-34: Sistem MORA omogućiti reset lozinke.
* REQ-34: Sistem MORA omogućiti reset lozinke.
* REQ-35: Sistem MORA omogućiti deaktivaciju korisnika.
* REQ-35: Sistem MORA omogućiti deaktivaciju <span class="fw5">Korisnika</span>.


== 4.3 Modul upravljanja grupama ==
== 4.3 Modul upravljanja Grupama ==


=== 4.3.1 Kreiranje grupe ===
=== 4.3.1 Kreiranje Grupe ===


<ul>
<ul>
<li>REQ-36: Sistem MORA omogućiti kreiranje grupe sa nazivom i prefixom za korisničko ime.{{koment|txt=Valjda je normalno da Grupa ima ime? I USER ima username.}}</li>
<li>REQ-36: Sistem MORA omogućiti kreiranje <span class="fw5">Grupe</span> sa nazivom i <span class="fw5">Prefiksom</span> za korisničko ime.</li>
<li>REQ-37: Sistem proverava jedinstvenost prefiksa. Ako prefix već postoji, sistem vraća grešku i sprečava kreiranje grupe. Na nivou clustera postoji {{#tip-text: UNIQUE constraint|PostgreSQL UNIQUE constraint osigurava da su sve vrednosti u određenoj koloni različite u svim redovima tabele, sprečavajući dupliranje unosa. Ovo je korisno za održavanje integriteta podataka, kao što je osiguravanje da su email adrese ili korisnička imena jedinstveni.}} koji garantuje jedinstvenost.</li>
<li>REQ-37: Sistem proverava jedinstvenost <span class="fw5">Prefiksa</span>. Ako <span class="fw5">Prefiks</span> već postoji, sistem vraća grešku i sprečava kreiranje <span class="fw5">Grupe</span>. Na nivou <span class="fw5">Cluster-a</span> postoji {{#tip-text: UNIQUE constraint|PostgreSQL UNIQUE constraint osigurava da su sve vrednosti u određenoj koloni različite u svim redovima tabele, sprečavajući dupliranje unosa. Ovo je korisno za održavanje integriteta podataka, kao što je osiguravanje da su email adrese ili korisnička imena jedinstveni.}} koji garantuje jedinstvenost.</li>
<li>REQ-38: Sistem automatski kreira posebnu grupu sa nazivom "ALL" koja sadrži sve korisnike iz firmi koje su joj dodeljene. Ova grupa se kreira pri inicijalizaciji sistema ili kada se prva firma dodeli ovoj grupi. "ALL" grupa nema prefix jer se koristi samo za organizaciju korisnika. {{koment|txt=Ovo je jedinstvena tabela        u kojoj su svi korisnici sistema, i u  njoj je UNIQUE constraint? Nemamo tabele sa korisnicima po Grupama, Firmama?}}</li>
<li>REQ-38: Sistem automatski kreira posebnu <span class="fw5">Grupu</span> sa nazivom "ALL" koja sadrži sve <span class="fw5">Korisnike</span> iz <span class="fw5">Firmi</span> koje su joj dodeljene. Ova <span class="fw5">Grupa</span> se kreira pri inicijalizaciji sistema ili kada se prva <span class="fw5">Firma</span> dodeli ovoj <span class="fw5">Grupi</span>. "ALL" grupa nema <span class="fw5">Prefiks</span> jer se koristi samo za organizaciju <span class="fw5">Korisnika</span>.</li>
<li>REQ-39: Sistem sinhronizuje "ALL" grupu hibridnim pristupom:
<li>REQ-39: Sistem sinhronizuje "ALL" <span class="fw5">Grupu</span> hibridnim pristupom:
<ul>
<ul>
<li>'''Instant Sync''': Automatski se pokreće kada se firma dodeli "ALL" grupi ili kada se korisnici kreiraju/ažuriraju
<li>'''Instant Sync''': Automatski se pokreće kada se <span class="fw5">Firma</span> dodeli "ALL" <span class="fw5">Grupi</span> ili kada se <span class="fw5">Korisnici</span> kreiraju/ažuriraju
<li>'''Scheduled Job''': Izvršava se automatski svakih 6 sati kao backup/cleanup mehanizam {{koment|txt=Šta se izvršava? Update?}}
<li>'''Scheduled Job''': Izvršava se automatski svakih 6 sati kao backup/cleanup mehanizam  
</ul>
</ul>
</li>
</li>
</ul>
</ul>
{{koment|txt=Šta se sa čim sinhronizuje? Korisnici iz Firmine baze/Tenanta sa blfpub tabelom ALL kada se ta firma doda nekoj Grupi?}}<br>


Ulaz:
Ulaz:
* Naziv grupe.
* Naziv <span class="fw5">Grupe</span>.
* Prefix za korisničko ime (2-20 karaktera, lowercase alphanumeric).
* <span class="fw5">Prefiks</span> za korisničko ime (2-20 karaktera, <span class="zameniti>lowercase alphanumeric</span> <span class="zamena>alfnumerički sa malim slovima</span>).
* Opis (opciono).
* Opis (opciono).


Izlaz:
Izlaz:
* Kreirana grupa sa ID-jem.
* Kreirana <span class="fw5">Grupa</span> sa ID-jem.


=== 4.3.2 Dodela firmi grupi ===
=== 4.3.2 Dodela firmi Grupi ===


* REQ-40: Sistem MORA omogućiti dodelu firme grupi.
* REQ-40: Sistem MORA omogućiti dodelu <span class="fw5">Firme Grupi</span>.
* REQ-41: Sistem MORA omogućiti uklanjanje firme iz grupe.
* REQ-41: Sistem MORA omogućiti uklanjanje <span class="fw5">Firme</span> iz <span class="fw5">Grupe</span>.
* REQ-42: Sistem MORA omogućiti bulk dodelu firmi grupi.
* REQ-42: Sistem MORA omogućiti <span class="zameniti>bulk</span> <span class="zamena>masovnu</span> dodelu <span class="fw5">Firmi Grupi</span>.
* REQ-43: Sistem MORA logovati ko je dodelio firmu grupi i kada.
* REQ-43: Sistem MORA logovati ko je dodelio <span class="fw5">Firmu Grupi</span> i kada.


=== 4.3.3 Dodela korisnika grupi ===
{{koment|txt=bulk dodela - masovna dodela ili grupna dodela?}}
 
=== 4.3.3 Dodela Korisnika Grupi ===


<ul>
<ul>
<li>REQ-44: Sistem MORA omogućiti dodelu USER-a Grupi ({{#tip-text: M:N veza|Relacija mnogo-prema-mnogo (M:N) u SQL-u nastaje kada se više zapisa u jednoj tabeli može odnositi na više zapisa u drugoj tabeli, i obratno.}}).</li>
<li>REQ-44: Sistem MORA omogućiti dodelu <span class="fw5">Korisnika Grupi</span> ({{#tip-text: M:N veza|Relacija mnogo-prema-mnogo (M:N) u SQL-u nastaje kada se više zapisa u jednoj tabeli može odnositi na više zapisa u drugoj tabeli, i obratno.}}).</li>
<li>REQ-45: Sistem MORA omogućiti uklanjanje USER-a iz Grupe.</li>
<li>REQ-45: Sistem MORA omogućiti uklanjanje <span class="fw5">Korisnika</span> iz <span class="fw5">Grupe</span>.</li>
<li>REQ-46: Sistem MORA omogućiti bulk dodelu USER-a Grupama.</li>
<li>REQ-46: Sistem MORA omogućiti <span class="zameniti>bulk</span> <span class="zamena>masovnu</span> dodelu <span class="fw5">Korisnika Grupama</span>.</li>
<li>REQ-47: Sistem MORA logovati ko je dodelio USER-a Grupi i kada.</li>
<li>REQ-47: Sistem MORA logovati ko je dodelio <span class="fw5">Korisnika Grupi</span> i kada.</li>
</ul>
</ul>


== 4.4 Modul mapiranja korisnika ==
== 4.4 Modul mapiranja Korisnika ==


=== 4.4.1 Mapiranje na tenant {{koment|txt=na Firmu?}}===
=== 4.4.1 Mapiranje na Tenant ===


{{koment|txt=Povezujemo kreirane USER-e sa postojećim u bazi Firmama? U uslovnoj tabeli 'users' pišemo kojim firmama može da pristupa i sa kojim pravima, ili u nekoj tabeli Firme pišemo ko sme da pristupi Firmi i sa kojim pravima?}}
* REQ-48: Sistem MORA omogućiti mapiranje <span class="fw5">CBA Korisnika</span> na <span class="fw5">Tenant korisnika</span> (korid, profile_id {{koment|txt=- kolone iz koje tabele / kojih tabela?}}).
 
* REQ-49: Sistem MORA omogućiti <span class="zameniti>bulk</span> <span class="zamena>masovno</span> mapiranje <span class="fw5">Korisnika</span>.
* REQ-48: Sistem MORA omogućiti mapiranje CBA korisnika na tenant korisnika (korid, profile_id). {{koment|txt=Šta je CBA? Šta je tenant USER-a? Što navodimo nazive kolona bez naziva tabele?}}
* REQ-49: Sistem MORA omogućiti bulk mapiranje korisnika.
* REQ-50: Sistem MORA omogućiti automatsko mapiranje na osnovu email-a ili korisničkog imena.
* REQ-50: Sistem MORA omogućiti automatsko mapiranje na osnovu email-a ili korisničkog imena.
* REQ-51: Sistem MORA prikazati nemapirane korisnike.
* REQ-51: Sistem MORA prikazati nemapirane <span class="fw5">Korisnike</span>.
* REQ-52: Sistem MORA omogućiti različite profile po firmama za istog korisnika.
* REQ-52: Sistem MORA omogućiti različite profile po <span class="fw5">Firmama</span> za istog <span class="fw5">Korisnika</span>.




Line 327: Line 360:
=== US-001: Osnovni Login ===
=== US-001: Osnovni Login ===


Kao USER, želim da se ulogujem sa jednim setom kredencijala, tako da mogu pristupiti svim dodeljenim firmama bez više lozinki.
Kao <span class="fw5">Korisnik</span>, želim da se ulogujem sa jednim <span class="zameniti">setom kredencijala</span><span class="zamena"> nalogom</span>, tako da mogu pristupiti svim dodeljenim <span class="fw5">Firmama</span> bez više lozinki.


<div style="color:#4f81bd;margin-left:1.651cm;margin-right:1.651cm;">'''''Kriterijumi prihvatanja:'''''</div>
<div style="color:#4f81bd;margin-left:1.651cm;margin-right:1.651cm;">'''''Kriterijumi prihvatanja:'''''</div>
* Login stranica prikazuje polja za korisničko ime i lozinku.
* Login stranica prikazuje polja za korisničko ime i lozinku.
* Uspešan login preusmerava na izbor firme (više firmi) ili direktno u firmu (jedna firma).
* Uspešan login preusmerava na izbor <span class="fw5">Firme</span> (više <span class="fw5">Firmi</span>) ili direktno u <span class="fw5">Firmu</span> (jedna <span class="fw5">Firma</span>).
* Neuspešan login prikazuje specifičnu poruku o grešci.
* Neuspešan login prikazuje specifičnu poruku o grešci.
* Nalog se zaključava nakon 5 neuspešnih pokušaja.{{koment|txt=Uzastopnih ili tokom dana?}}
* Nalog se zaključava nakon 5 neuspešnih pokušaja.{{koment|txt=Uzastopnih ili tokom nekog vremenskog perioda?}}


=== US-002: Automatski izbor firme ===
=== US-002: Automatski izbor Firme ===


Kao USER sa pristupom samo jednoj Firmi, želim da budem automatski ulogovan u tu Firmu, tako da ne moram da prolazim kroz dodatni korak izbora.
Kao <span class="fw5">Korisnik</span> sa pristupom samo jednoj <span class="fw5">Firmi</span>, želim da budem automatski ulogovan u tu <span class="fw5">Firmu</span>, tako da ne moram da prolazim kroz dodatni korak izbora.


=== US-003: Obnavljanje sesije ===
=== US-003: Obnavljanje sesije ===


Kao USER, želim da moja sesija bude automatski obnovljena bez ponovnog login-a {{koment|txt=logovanja}}, tako da ne gubim radni tok.
<span class="zameniti">Kao <span class="fw5">Korisnik</span>, želim da moja sesija bude automatski obnovljena bez ponovnog login-a, tako da ne gubim radni tok.</span><br>
 
{{koment|txt=Kao Korisnik, ja nemam pojma ni šta je sesija ni šta su kredencijali.}}
 
<span class="zamena">Kao <span class="fw5">Korisnik</span>, želim da tokom rada menjam <span class="fw5">Firme</span> sa kojima radim bez unošenja korisničkog imena i lozinke prilikom svake promene.</span>


== 5.2 Admin priče ==
== 5.2 Admin priče ==


=== US-004: Masovno kreiranje korisnika ===
=== US-004: Masovno kreiranje Korisnika ===


Kao CGA, želim da kreiram više korisnika odjednom, tako da mogu efikasno da onboardujem {{koment|txt=dodajem}} nove timove.
Kao <span class="fw5">CGA</span>, želim da kreiram više <span class="fw5">Korisnika</span> odjednom, tako da mogu <span class="zameniti>efikasno da onboardujem</span> <span class="zamena>brzo da dodajem</span> nove timove.


=== US-005: Izbor prefiksa za korisničko ime ===
=== US-005: Izbor Prefiksa za korisničko ime ===


Kao CGA sa više grupa, želim da eksplicitno izaberem iz koje grupe želim prefix za korisničko ime, da imam kontrolu nad generisanim korisničkim imenima {{koment|txt=u svim Grupama koje su mi dodeljene?}}.
Kao <span class="fw5">CGA</span> sa više <span class="fw5">Grupa</span>, želim da eksplicitno izaberem iz koje <span class="fw5">Grupe</span> želim <span class="fw5">Prefiks</span> za korisničko ime, da imam kontrolu nad generisanim korisničkim imenima.
{{koment|txt=Koja je razlika između "eksplicitno izaberem" i samo "izaberem"?}}


=== US-006: Različiti profili po firmama ===
=== US-006: Različiti profili po Firmama ===


Kao CGA, želim da dodelim različite profile korisniku u različitim firmama, tako da korisnik ima različite dozvole u različitim firmama.
Kao <span class="fw5">CGA</span>, želim da dodelim različite profile <span class="fw5">Korisniku</span> u različitim <span class="fw5">Firmama</span>, tako da <span class="fw5">Korisnik</span> ima različite dozvole u različitim <span class="fw5">Firmama</span>.




= 6. Scenariji korišćenja =
= 6. Scenariji korišćenja =


== UC-001: Tok login-a {{koment|txt=prijavljivanja? logovanja?}}==
== UC-001: Tok login-a {{koment|txt=prijavljivanja?}}==


Primarni akter: End User.
Primarni akter: <span class="zameniti>End User</span> <span class="zamena>krajnji <span class="fw5">Korisnik</span></span>.


Preduslovi: Korisnik ima aktivan nalog.
Preduslovi: <span class="fw5">Korisnik</span> ima aktivan nalog.


Postuslovi: Korisnik je autentifikovan i ima važeći access token.
Postuslovi: <span class="fw5">Korisnik</span> je autentifikovan i ima važeći access token.


Glavni tok:
Glavni tok:
# Korisnik otvara login stranicu i unosi korisničko ime i lozinku.
# <span class="fw5">Korisnik</span> otvara login stranicu i unosi korisničko ime i lozinku.
# Sistem validira kredencijale i status naloga.
# Sistem validira kredencijale i status naloga.
# Sistem generiše odgovarajući token (cluster_token ili firm_token).
# Sistem generiše odgovarajući token (<span class="zameniti>cluster_token ili firm_token</span> <span class="zamena fw5>Cluster Token</span> ili <span class="zamena fw5>Firm Token</span>).
# Sistem vraća token i listu firmi (ili automatski izabranu firmu).
# Sistem vraća token i listu <span class="fw5">Firmi</span> (ili automatski izabranu <span class="fw5">Firmu</span>).


== UC-002: Kreiranje korisnika sa prefix grupom ==
== UC-002: Kreiranje Korisnika sa Prefiks Grupom ==


Primarni akter: CGA.
Primarni akter: <span class="fw5">CGA</span>.


CGA unosi podatke, bira jednu ili više grupa i opciono bira grupu za prefix; sistem dodaje prefix, kreira korisnika i dodeljuje ga grupama.
<span class="fw5">CGA</span> unosi podatke, bira jednu ili više <span class="fw5">Grupa</span> i opciono bira <span class="fw5">Grupu</span> za <span class="fw5">Prefiks</span>; sistem dodaje <span class="fw5">Prefiks</span>, kreira <span class="fw5">Korisnika</span> i dodeljuje ga <span class="fw5">Grupama</span>.


== UC-003: CSV import korisnika ==
== UC-003: CSV import Korisnika ==


CGA upload-uje CSV fajl, sistem validira zapise, kreira korisnike u transakciji i generiše izveštaj. U slučaju greške radi se rollback {{koment|txt=povratak u početno stanje}}.
<span class="fw5">CGA</span> upload-uje CSV fajl, sistem validira zapise, kreira <span class="fw5">Korisnike</span> u transakciji i generiše izveštaj. U slučaju greške radi se rollback {{koment|txt=povratak u početno stanje?}}




Line 406: Line 444:
|| BR-003
|| BR-003
|| Važnost tokena
|| Važnost tokena
|| Cluster token 24h, Firm token 8h, Refresh token 7 dana.
|| <span class="fw5">Cluster Token</span> 24h, <span class="fw5">Firm Token</span> 8h, <span class="fw5">Refresh Token</span> 7 dana.
|-
|-
|| BR-004
|| BR-004
Line 414: Line 452:
|| BR-005
|| BR-005
|| Prefix logika
|| Prefix logika
|| Ako je prosleđen prefixGroupId koristi se taj prefix, inače prefix prve grupe u listi. {{koment|txt=Da li je moguć update liste? Šta ako se obriše prva grupa u listi? Ako se obriše Grupa da li ostaju živi prefiksi?}}
|| Ako je prosleđen prefixGroupId koristi se taj <span class="fw5">Prefiks</span>, inače <span class="fw5">Prefiks</span> prve <span class="fw5">Grupe</span> u listi.
|-
|-
|}
|}




== 7.2 Pravila za grupe ==
== 7.2 Pravila za Grupe ==




Line 429: Line 467:
|-
|-
|| BR-006
|| BR-006
|| Jedinstvenost prefiksa
|| Jedinstvenost <span class="fw5">Prefiksa</span>
|| Svaka grupa mora imati jedinstven prefix.
|| Svaka <span class="fw5">Grupa</span> mora imati jedinstveni <span class="fw5">Prefiks</span>.
|-
|-
|| BR-007
|| BR-007
|| ALL grupa
|| ALL <span class="fw5">Grupa</span>
|| Sistem automatski kreira ALL grupu koja sadrži sve korisnike.
|| Sistem automatski kreira ALL <span class="fw5">Grupu</span> koja sadrži sve <span class="fw5">Korisnike</span>.
|-
|-
|| BR-008
|| BR-008
|| Sinhronizacija ALL grupe
|| Sinhronizacija ALL <span class="fw5">Grupe</span>
|| ALL grupa se automatski sinhronizuje hibridnim pristupom: instant sync pri dodeli firme/kreiranju korisnika + scheduled job svakih 6 sati.
|| ALL <span class="fw5">Grupa</span> se automatski sinhronizuje hibridnim pristupom: instant sync pri dodeli <span class="fw5">Firme</span>/kreiranju <span class="fw5">Korisnika</span> + scheduled job svakih 6 sati.
|-
|-
|}
|}
{{koment|txt=Da li ovo znači da će USER nakon što mu se naknadno promene prava morati da čeka max 6 sati da nova prava 'prorade'? Mislim na update korisnika.}}
 




Line 454: Line 492:
|-
|-
|| BR-009
|| BR-009
|| Ograničenje CGA
|| Ograničenje <span class="fw5">CGA</span>
|| CGA može kreirati samo USER naloge unutar svojih grupa.
|| <span class="fw5">CGA</span> može kreirati samo <span class="fw5">Korisničke</span> naloge unutar svojih <span class="fw5">Grupa</span>.
|-
|-
|| BR-010
|| BR-010
|| Bulk operacije
|| Bulk operacije
|| Maksimalno 100 korisnika po batch-u.
|| Maksimalno 100 <span class="fw5">Korisnika</span> po batch-u.
|-
|-
|| BR-011
|| BR-011
Line 467: Line 505:
|| BR-012
|| BR-012
|| Različiti profili
|| Različiti profili
|| Korisnik može imati različite profile u različitim firmama.
|| <span class="fw5">Korisnik</span> može imati različite profile u različitim <span class="fw5">Firmama</span>.
|-
|-
|}
|}
Line 474: Line 512:
= 8. Zahtevi za podatke =
= 8. Zahtevi za podatke =


== 8.1 Podaci o korisniku ==
== 8.1 Podaci o Korisniku ==




Line 531: Line 569:
|}
|}


{{koment|txt=Ima li smisla (potrebe) dodati TIMESTAMP status_from  -  informacija od kada je Korisnik u sadašnjem statusu?}}<br>
{{koment|txt=Da li se failed_attempts resetuje prilikom uspešnog prijavljivanja/logovanja?}}


== 8.2 Podaci o grupi ==
== 8.2 Podaci o grupi ==
Line 568: Line 608:
|-
|-
|}
|}
{{koment|txt=username_prefix nije obavezno polje, ali ranije je pomenuto da se u nekim slučajevima Korisniku automatski dodaje Prefiks Grupe. Kako ako nije obavezno polje?}}




Line 573: Line 615:
<code>
<code>
cba_user_groups</code> (Korisnik ↔ Grupa):
cba_user_groups</code> (Korisnik ↔ Grupa):
* <code>acc_id</code> (UUID) - Referenca na korisnika.
* <code>acc_id</code> (UUID) - Referenca na Korisnika.
* <code>group_id</code> (BIGINT) - Referenca na grupu.
* <code>group_id</code> (BIGINT) - Referenca na Grupu.
* <code>assigned_at</code> (TIMESTAMP) - Vreme dodele.
* <code>assigned_at</code> (TIMESTAMP) - Vreme dodele.
* <code>assigned_by</code> (UUID) - Ko je dodelio.
* <code>assigned_by</code> (UUID) - Ko je dodelio.


<code>cba_group_firms</code> (Grupa ↔ Firma):
<code>cba_group_firms</code> (Grupa ↔ Firma):
* <code>group_id</code> (BIGINT) - Referenca na grupu.
* <code>group_id</code> (BIGINT) - Referenca na Grupu.
* <code>firid</code> (BIGINT) - Referenca na firmu.
* <code>firid</code> (BIGINT) - Referenca na Firmu.
* <code>assigned_at</code> (TIMESTAMP) - Vreme dodele.
* <code>assigned_at</code> (TIMESTAMP) - Vreme dodele.
* <code>assigned_by</code> (UUID) - Ko je dodelio.
* <code>assigned_by</code> (UUID) - Ko je dodelio.
{{koment|txt=Bode oči. acc_id, group_id... ALI firid. Ne može firm_id?}}

Latest revision as of 10:57, 5 December 2025


10 min
Ovaj dokument definiše funkcionalne zahteve za Balans 5 CBA (Cluster Based Authentication) sistem - centralizovani sistem za autentifikaciju i autorizaciju za multi-tenant sistem.


1. Uvod

1.1 Svrha dokumenta

Ovaj dokument definiše funkcionalne zahteve za Balans 5 CBA (Cluster Based Authentication) sistem - centralizovani sistem za autentifikaciju i autorizaciju za multi-tenant sistem.

1.2 Opseg

CBA (Cluster Based Authentication) je centralizovani sistem za autentifikaciju i autorizaciju za multi-tenant ERP sistem Balans5. Sistem omogućava korisnicima da pristupe više firmi sa jednim setom kredencijala, umesto da imaju odvojen nalog u svakoj firmi.Sistem omogućava korisnicima sa više firmi da im pristupaju sa jedinstvenim nalogom, umesto da imaju odvojene naloge za svaku zasebnu firmu

1.3 Definicije

  • Cluster - Ovde se podrazumeva jedna aktivna instanca PostgreSQL servera koja može sadržati više raznih Balans baza podataka i obavezno sadrži bazu blfpub. U širem smislu u Cluster spadaju i servisi za autentifikaciju i autorizaciju.
  • CSA - Cluster Super Admin (Super Administrator Cluster-a)
  • CGA - Cluster Group Admin (Administrator Grupe)
  • USER - Redovan korisnik sistema
  • Firma - Pojedinačna kompanija/tenant u sistemu
  • Firma - Pojedinačna kompanija (baza podataka) u sistemu
  • Grupa - Kolekcija firmi koje pripadaju istom klasteru
  • Grupa - Grupa Firmi koje pripadaju istom Cluster-u
  • Tenant - Baza podataka unutar Cluster-a sa podacima jedne Firme. Izolovana od baza drugih Firmi.
  • Prefix - Prefiks za korisničko ime koji se automatski dodaje na osnovu grupe (npr. bjn.petar_petrovic)
  • Prefiks - Prefiks za korisničko ime koji se automatski dodaje na osnovu Grupe (npr. bjn.petar_petrovic)
  • Cluster Token - access JWT token RFC 7519 koji se generiše nakon login-a (24h važnosti); služi za izbor Firme sa kojom će Korisnik raditi
  • Firm Token - access JWT token koji se generiše nakon izbora Firme (8h važnosti); služi za rad sa izabranom Firmom
  • Refresh Token - Token za obnavljanje oba access tokena (7 dana važnosti)

1.4 Glavne karakteristike

  • Jedinstveni nalog za više Firmi
  • Grupa-baziran pristup Pristup baziran na Grupama (Korisnici → Grupe → Firme)
  • Centralizovano upravljanje Korisnicima
  • JWT token-based autentifikacija Autentifikacija bazirana na JWT tokenima
  • Multi-tenant izolacija podatakaIzolacija podataka na nivou Tenanta


2. Pregled sistema

2.1 Arhitektura sistema

Sistem se sastoji od tri glavna sloja:

  • Autentifikacioni sloj - JWT token-based autentifikacija sa refresh token mehanizmom.
  • Autorizacioni sloj - Role-based access control (RBAC) sa grupama.
  • Tenant sloj - Izolacija podataka po firmama.
  • Autentifikacioni sloj - Autentifikacija, bazirana na JWT tokenima sa refresh token mehanizmom.
  • Autorizacioni sloj - Autorizacija autentifikovanih Korisnika u skladu sa ulogama koje su im dodeljene unutar njihove Grupe (RBAC).
  • Tenant sloj - Pristup podacima, izolovanim po Firmama.

2.2 Akteri sistema

Akter Uloga Odgovornosti
Super Admin CSA Kreiranje grupa, dodela firmi, upravljanje svim korisnicima.
Group Admin CGA Upravljanje korisnicima unutar dodeljenih grupa.
End User USER Pristup dodeljenim firmama, izvršavanje poslovnih operacija.


Akter Uloga Odgovornosti
Super Admin CSA Kreiranje Grupa, dodela Firmi Grupama, upravljanje svim Korisnicima.
Group Admin CGA Upravljanje Korisnicima unutar dodeljenih Grupa.
End User Korisnik Pristup dodeljenim Firmama, izvršavanje poslovnih operacija.


2.3 Token sistem

Sistem koristi tri tipa tokena:

  • Cluster Token (24 sata) - generiše se nakon uspešnog login-a i sadrži listu dostupnih Firmi.
  • Firm Token (8 sati) - generiše se nakon izbora Firme i sadrži informacije o Firmi i profilu Korisnika.
  • Refresh Token (7 dana) - koristi se za obnavljanje oba access tokena bez ponovnog login-a.


3. Uloge korisnika i dozvole

3.1 Matrica dozvola

Funkcija CSA CGA USER
Kreiranje Grupa - -
Dodela Firme Grupi - -
Kreiranje Korisnika ✓* -
Pristup podacima Firme
Upravljanje Grupama - -
Masovno kreiranje Korisnika -
CSV import Korisnika -
Mapiranje Korisnika na Tenant -
Pristup arhivi arhiviranim podacima Firme? - - ✓**

* CGA može kreirati Korisničke naloge samo unutar svojih Grupa.
** Korisnik može pristupiti arhivi samo svojih Firmi.

3.2 Ograničenja po ulogama

  • CSA: Ima pristup svim Grupama, Firmama i Korisnicima.
  • CGA: Može upravljati samo Korisnicima u svojim dodeljenim Grupama.
  • Korisnik: Može pristupiti samo Firmama koje su dodeljene njegovim Grupama.


4. Funkcionalni zahtevi

4.1 Modul autentifikacije

Nedostaje treći slučaj
Imamo 4.1.1 Login Korisnika, imamo 4.1.2 Izbor Firme. Nedostaje scenario za Korisnika koji radi samo sa jednom Firmom (nema šta da bira). On ne vidi stranu /api/auth/select-firm ali dobija Firm Token.
Ko mu vraća Firm Token - /api/auth/login ili /api/auth/select-firm?

4.1.1 Login Korisnika

  • REQ-1: Sistem MORA obezbediti login ekran sa poljima za korisničko ime i lozinku.
  • REQ-2: Sistem MORA validirati kredencijale koristeći centralnu CBA bazu podataka.centralna CBA baza podataka = blfpub?
  • REQ-3: Sistem MORA zaključati nalog nakon 5 neuspešnih pokušaja login-a u kom vremenskom periodu su tih 5 neuspešnih? Ili nema vremenske odrednice već pratimo 5 uzastopnih?.
  • REQ-4: Sistem MORA generisati cluster_token Cluster Token (24h) ili firm_token Firm Token (8h) nakon uspešnog login-a.
  • REQ-5: Sistem MORA logovati sve uspešne pokušaje login-a (vreme, IP, rezultat).
  • REQ-6: Sistem MORA automatski selektovati Firmu ako Korisnik ima pristup samo jednoj Firmi.


Ulaz:

  • Korisničko ime (string, obavezno, min 3 karaktera).
  • Lozinka (string, obavezno, min 8 karaktera).

Izlaz:

  • Uspeh: JWT token + Korisnički profil + dostupne Firme (ili automatski izabrana Firma).
  • Neuspeh: Error kod + poruka.


Poslovna pravila:

  • BR-001: Lozinka mora sadržati velika slova, mala slova, broj (specijalni karakteri opciono) Šta znači opciono? Ako klijent traži ili nešto drugo?.
  • BR-002: Neaktivni nalozi ne mogu da se uloguju.
  • BR-003: Zaključani nalozi ne mogu da se uloguju dok se ne otključaju.

Neko pojašnjenje za aktivne/neaktivne, otključane/zaključane naloge... ili nema potrebe?

4.1.2 Izbor firme

  • REQ-7: Sistem MORA prikazati listu dostupnih Firmi nakon login-a (ako Korisnik ima pristup u više Firmi).
  • REQ-8: Sistem MORA automatski selektovati Firmu ako Korisnik ima pristup samo jednoj.
  • REQ-9: Sistem MORA generisati firm_token Firm Token (8h validan) nakon izbora Firme.
  • REQ-10: Sistem MORA učitati firm-specifični profil i dozvole nakon izbora firme nakon izbora Firme učitati Korisnički profil i prava za izabranu Firmu.

prava ili dozvole za permissions?

4.1.3 Obnavljanje tokena (Refresh Token)

  • REQ-11: Sistem MORA obezbediti endpoint za obnavljanje access tokena.
  • REQ-12: Sistem MORA rotirati generisati novi Refresh Token pri svakom refresh-u obnavljanju access tokena.
  • REQ-13: Refresh Token MORA biti važeći 7 dana.
  • REQ-14: Sistem MORA validirati Refresh Token pre obnavljanja access tokena.

4.1.4 Logout

  • REQ-15: Sistem MORA obezbediti logout funkcionalnost koja revokuje sesiju. opoziva sesiju? anulira sesiju?
  • REQ-16: Sistem MORA invalidirati da poništi Refresh Token nakon logout-a.


4.2 Modul upravljanja Korisnicima

4.2.1 Kreiranje Korisnika

  • REQ-17: Sistem MORA obezbediti formu sa obaveznim poljima: korisničko ime, email, lozinka, uloga (CSA, CGA, Korisnik).
  • REQ-18: Sistem MORA validirati format email-a i jedinstvenost.
  • REQ-19: Sistem MORA automatski dodati Prefiks Korisničkom imenu na osnovu Grupe.šta ako nije u grupi, ako radi samo sa jednom firmom? A inače u 8.2 piše da username_prefix nije obavezno polje
  • REQ-20: Sistem MORA omogućiti CGA-u eksplicitni izbor Grupe za Prefiks ako se Korisnik nalazi u više Grupa.
  • REQ-21: Sistem MORA automatski koristiti Prefiks iz prve Grupe ako nije eksplicitno izabran.

Ulaz:

  • Korisničko ime (bez prefiksa).
  • Email.
  • Lozinka (ili generisana privremena).
  • Uloga (CSA, CGA, Korisnik).
  • Lista Grupa (groupIds).
  • Grupa za Prefiks (prefixGroupId) - opciono.

groupIds i prefixGroupId su neke kolone iz neke tabele iz neke baze ili promenljive iz neke forme?

Izlaz:

  • Kreiran Korisnik sa Prefiksom u korisničkom imenu.
  • Dodeljene Grupe. kome, kuda?
  • Status kreiranja. a statusi su?

4.2.2 Masovno kreiranje Korisnika

  • REQ-24: Sistem MORA prihvatiti CSV fajl sa podacima Korisnika.
  • REQ-25: Sistem MORA validirati sve zapise pre obrade.
  • REQ-26: Sistem MORA kreirati maksimalno 100 Korisnika po batch-u. (transakcija application.properties cba.bulk.timeout-seconds=300 / cba.bulk.batch-size=100 ) šta je ovo u zagradi i čemu služi?
  • REQ-27: Sistem MORA generisati izveštaj sa uspehom/neuspehom za svaki zapis za svakog Korisnika iz CSV fajla.
  • REQ-28: Sistem MORA rollback-ovati ceo batch u slučaju kritične greške (all-or-nothing sve ili ništa).
    • Ako bilo koji korisnik ne prođe validaciju ili procesiranje, cela transakcija se rollback-uje
    • Sve greške se prikazuju sa pozicijama Korisnika
    • Format greške: "Greška na poziciji #X br. x (Korisnik 'username'): detaljna poruka"
  • REQ-29: Sistem MORA omogućiti eksplicitni izbor Grupe za Prefiks u bulk masovnim operacijama.
  • REQ-30: Sistem MORA podržati različite profile po Firmama za istog Korisnika (profilePerFirm - kolona u CSV-u).

srpska reč za rollback?

CSV Format:

  • Email (obavezno).
  • Username (obavezno, bez prefiksa).
  • GroupId (obavezno).
  • ProfilePerFirm (JSON mapa: {"firmId": profileId}).


4.2.3 Upravljanje Korisnicima

  • REQ-31: Sistem MORA omogućiti pregled svih Korisnika (CSA vidi sve, CGA vidi samo svoje Grupe).
  • REQ-32: Sistem MORA omogućiti ažuriranje korisničkih podataka.
  • REQ-33: Sistem MORA omogućiti otključavanje zaključanih naloga.
  • REQ-34: Sistem MORA omogućiti reset lozinke.
  • REQ-35: Sistem MORA omogućiti deaktivaciju Korisnika.

4.3 Modul upravljanja Grupama

4.3.1 Kreiranje Grupe

  • REQ-36: Sistem MORA omogućiti kreiranje Grupe sa nazivom i Prefiksom za korisničko ime.
  • REQ-37: Sistem proverava jedinstvenost Prefiksa. Ako Prefiks već postoji, sistem vraća grešku i sprečava kreiranje Grupe. Na nivou Cluster-a postoji UNIQUE constraint koji garantuje jedinstvenost.
  • REQ-38: Sistem automatski kreira posebnu Grupu sa nazivom "ALL" koja sadrži sve Korisnike iz Firmi koje su joj dodeljene. Ova Grupa se kreira pri inicijalizaciji sistema ili kada se prva Firma dodeli ovoj Grupi. "ALL" grupa nema Prefiks jer se koristi samo za organizaciju Korisnika.
  • REQ-39: Sistem sinhronizuje "ALL" Grupu hibridnim pristupom:
    • Instant Sync: Automatski se pokreće kada se Firma dodeli "ALL" Grupi ili kada se Korisnici kreiraju/ažuriraju
    • Scheduled Job: Izvršava se automatski svakih 6 sati kao backup/cleanup mehanizam

Šta se sa čim sinhronizuje? Korisnici iz Firmine baze/Tenanta sa blfpub tabelom ALL kada se ta firma doda nekoj Grupi?

Ulaz:

  • Naziv Grupe.
  • Prefiks za korisničko ime (2-20 karaktera, lowercase alphanumeric alfnumerički sa malim slovima).
  • Opis (opciono).

Izlaz:

  • Kreirana Grupa sa ID-jem.

4.3.2 Dodela firmi Grupi

  • REQ-40: Sistem MORA omogućiti dodelu Firme Grupi.
  • REQ-41: Sistem MORA omogućiti uklanjanje Firme iz Grupe.
  • REQ-42: Sistem MORA omogućiti bulk masovnu dodelu Firmi Grupi.
  • REQ-43: Sistem MORA logovati ko je dodelio Firmu Grupi i kada.

bulk dodela - masovna dodela ili grupna dodela?

4.3.3 Dodela Korisnika Grupi

  • REQ-44: Sistem MORA omogućiti dodelu Korisnika Grupi (M:N veza).
  • REQ-45: Sistem MORA omogućiti uklanjanje Korisnika iz Grupe.
  • REQ-46: Sistem MORA omogućiti bulk masovnu dodelu Korisnika Grupama.
  • REQ-47: Sistem MORA logovati ko je dodelio Korisnika Grupi i kada.

4.4 Modul mapiranja Korisnika

4.4.1 Mapiranje na Tenant

  • REQ-48: Sistem MORA omogućiti mapiranje CBA Korisnika na Tenant korisnika (korid, profile_id - kolone iz koje tabele / kojih tabela?).
  • REQ-49: Sistem MORA omogućiti bulk masovno mapiranje Korisnika.
  • REQ-50: Sistem MORA omogućiti automatsko mapiranje na osnovu email-a ili korisničkog imena.
  • REQ-51: Sistem MORA prikazati nemapirane Korisnike.
  • REQ-52: Sistem MORA omogućiti različite profile po Firmama za istog Korisnika.


5. Korisničke priče

5.1 Autentifikacione priče

US-001: Osnovni Login

Kao Korisnik, želim da se ulogujem sa jednim setom kredencijala nalogom, tako da mogu pristupiti svim dodeljenim Firmama bez više lozinki.

Kriterijumi prihvatanja:
  • Login stranica prikazuje polja za korisničko ime i lozinku.
  • Uspešan login preusmerava na izbor Firme (više Firmi) ili direktno u Firmu (jedna Firma).
  • Neuspešan login prikazuje specifičnu poruku o grešci.
  • Nalog se zaključava nakon 5 neuspešnih pokušaja.Uzastopnih ili tokom nekog vremenskog perioda?

US-002: Automatski izbor Firme

Kao Korisnik sa pristupom samo jednoj Firmi, želim da budem automatski ulogovan u tu Firmu, tako da ne moram da prolazim kroz dodatni korak izbora.

US-003: Obnavljanje sesije

Kao Korisnik, želim da moja sesija bude automatski obnovljena bez ponovnog login-a, tako da ne gubim radni tok.

Kao Korisnik, ja nemam pojma ni šta je sesija ni šta su kredencijali.

Kao Korisnik, želim da tokom rada menjam Firme sa kojima radim bez unošenja korisničkog imena i lozinke prilikom svake promene.

5.2 Admin priče

US-004: Masovno kreiranje Korisnika

Kao CGA, želim da kreiram više Korisnika odjednom, tako da mogu efikasno da onboardujem brzo da dodajem nove timove.

US-005: Izbor Prefiksa za korisničko ime

Kao CGA sa više Grupa, želim da eksplicitno izaberem iz koje Grupe želim Prefiks za korisničko ime, da imam kontrolu nad generisanim korisničkim imenima. Koja je razlika između "eksplicitno izaberem" i samo "izaberem"?

US-006: Različiti profili po Firmama

Kao CGA, želim da dodelim različite profile Korisniku u različitim Firmama, tako da Korisnik ima različite dozvole u različitim Firmama.


6. Scenariji korišćenja

UC-001: Tok login-a prijavljivanja?

Primarni akter: End User krajnji Korisnik.

Preduslovi: Korisnik ima aktivan nalog.

Postuslovi: Korisnik je autentifikovan i ima važeći access token.

Glavni tok:

  1. Korisnik otvara login stranicu i unosi korisničko ime i lozinku.
  2. Sistem validira kredencijale i status naloga.
  3. Sistem generiše odgovarajući token (cluster_token ili firm_token Cluster Token ili Firm Token).
  4. Sistem vraća token i listu Firmi (ili automatski izabranu Firmu).

UC-002: Kreiranje Korisnika sa Prefiks Grupom

Primarni akter: CGA.

CGA unosi podatke, bira jednu ili više Grupa i opciono bira Grupu za Prefiks; sistem dodaje Prefiks, kreira Korisnika i dodeljuje ga Grupama.

UC-003: CSV import Korisnika

CGA upload-uje CSV fajl, sistem validira zapise, kreira Korisnike u transakciji i generiše izveštaj. U slučaju greške radi se rollback povratak u početno stanje?


7. Poslovna pravila

7.1 Autentifikaciona pravila

ID Naziv Opis
BR-001 Kompleksnost lozinke Min 8 karaktera, 1 veliko slovo, 1 malo slovo, 1 broj (specijalni karakteri opciono).
BR-002 Zaključavanje naloga Zaključavanje nakon 5 neuspešnih pokušaja.
BR-003 Važnost tokena Cluster Token 24h, Firm Token 8h, Refresh Token 7 dana.
BR-004 Format korisničkog imena {prefix}.{username} (npr. bjn.petar_petrovic).
BR-005 Prefix logika Ako je prosleđen prefixGroupId koristi se taj Prefiks, inače Prefiks prve Grupe u listi.


7.2 Pravila za Grupe

ID Naziv Opis
BR-006 Jedinstvenost Prefiksa Svaka Grupa mora imati jedinstveni Prefiks.
BR-007 ALL Grupa Sistem automatski kreira ALL Grupu koja sadrži sve Korisnike.
BR-008 Sinhronizacija ALL Grupe ALL Grupa se automatski sinhronizuje hibridnim pristupom: instant sync pri dodeli Firme/kreiranju Korisnika + scheduled job svakih 6 sati.


7.3 Pravila za korisnike

ID Naziv Opis
BR-009 Ograničenje CGA CGA može kreirati samo Korisničke naloge unutar svojih Grupa.
BR-010 Bulk operacije Maksimalno 100 Korisnika po batch-u.
BR-011 Transakcijski pristup CSV import je all-or-nothing (sve ili ništa).
BR-012 Različiti profili Korisnik može imati različite profile u različitim Firmama.


8. Zahtevi za podatke

8.1 Podaci o Korisniku

Polje Tip Obavezno Validacija
acc_id UUID Da Auto-generisan, jedinstven.
username VARCHAR(50) Da Jedinstven, format: prefix.name.
email VARCHAR(100) Da Validan email format.
password_hash VARCHAR(255) Da Bcrypt hash.
role_type ENUM Da CSA (2), CGA (1), USER (0).
status INTEGER Da 0=active, 1=inactive, 2=locked, 3=suspended.
failed_attempts SMALLINT Ne Brojač neuspešnih pokušaja.
created_at TIMESTAMP Da Vremenska oznaka kreiranja.
created_by UUID Ne ID korisnika koji je kreirao.

Ima li smisla (potrebe) dodati TIMESTAMP status_from - informacija od kada je Korisnik u sadašnjem statusu?
Da li se failed_attempts resetuje prilikom uspešnog prijavljivanja/logovanja?

8.2 Podaci o grupi

Polje Tip Obavezno Validacija
group_id BIGINT Da Auto-generisan, jedinstven.
name VARCHAR(100) Da Jedinstven naziv.
username_prefix VARCHAR(20) Ne 2-20 lowercase alphanumeric.
active BOOLEAN Da Status aktivnosti.
description TEXT Ne Opis grupe.

username_prefix nije obavezno polje, ali ranije je pomenuto da se u nekim slučajevima Korisniku automatski dodaje Prefiks Grupe. Kako ako nije obavezno polje?


8.3 Junction tabele

cba_user_groups (Korisnik ↔ Grupa):

  • acc_id (UUID) - Referenca na Korisnika.
  • group_id (BIGINT) - Referenca na Grupu.
  • assigned_at (TIMESTAMP) - Vreme dodele.
  • assigned_by (UUID) - Ko je dodelio.

cba_group_firms (Grupa ↔ Firma):

  • group_id (BIGINT) - Referenca na Grupu.
  • firid (BIGINT) - Referenca na Firmu.
  • assigned_at (TIMESTAMP) - Vreme dodele.
  • assigned_by (UUID) - Ko je dodelio.