Files
GoNtech/internal/config/moduli.go
T
Dasko 6d066f6704 feat(moduli): mehanizam uključenih modula — Moduli mapa i RequireModul (Faza 0)
config.SviModuli + PodaciStranice.Moduli (uslovni meni, analogno Dozvole)
i middleware.RequireModul (zaštita ruta, analogno RequireDozvola). Sloj
iznad RBAC-a: zahtev mora proći i „modul uključen" i „korisnik sme".
Dopunjen test (TestSviModuli). Time je Faza 0 kompletna.
2026-06-13 20:23:24 +02:00

68 lines
2.4 KiB
Go

package config
// Ovaj fajl izvodi iz profila firme (vidi Project.md §2, §4) koji su zakonski
// moduli uključeni za datu firmu. Profil se čuva kao key-value u tabeli
// `podesavanja`, pa helper prima već učitanu mapu (čista funkcija — lako se
// testira bez baze). Ovo je sloj IZNAD RBAC-a: „da li firma uopšte koristi
// modul", nezavisno od „da li korisnik sme".
// Ključevi profila firme u tabeli `podesavanja`.
const (
KljucPravniOblik = "firma_pravni_oblik"
KljucPdvObveznik = "firma_pdv_obveznik"
KljucFiskalizacija = "firma_fiskalizacija"
KljucRezim = "firma_rezim"
)
// Nazivi modula koje program pali/gasi prema profilu firme.
const (
ModulPdv = "pdv"
ModulFiskalizacija = "fiskalizacija"
ModulKpo = "kpo"
ModulDvojno = "dvojno"
)
// ModulUkljucen vraća da li je dati zakonski modul aktivan za firmu, na osnovu
// profila firme. Režim „samo evidencija" gasi ceo zakonski sloj — tada nijedan
// modul nije uključen, bez obzira na ostale prekidače.
func ModulUkljucen(podesavanja map[string]string, modul string) bool {
// podrazumevano (ključ još ne postoji) je „samo evidencija" — najbezbednije
// stanje: stara instalacija ne počinje da se ponaša kao poreski obveznik.
rezim := podesavanja[KljucRezim]
if rezim == "" {
rezim = "samo_evidencija"
}
if rezim != "pun" {
return false
}
switch modul {
case ModulFiskalizacija:
// fiskalizacija je nezavisna od pravnog oblika — zaseban prekidač
// „izdaje li račune građanima" (Project.md §3, napomena *).
return podesavanja[KljucFiskalizacija] == "da"
case ModulPdv:
// PDV evidencija se vodi kad je firma u sistemu PDV-a.
return podesavanja[KljucPdvObveznik] == "da"
case ModulKpo:
// KPO (knjiga o ostvarenom prometu) je samo za paušalce.
return podesavanja[KljucPravniOblik] == "pausalac"
case ModulDvojno:
// dvojno knjigovodstvo je za DOO (za preduzetnike je buduća podela, Project.md §8).
return podesavanja[KljucPravniOblik] == "doo"
default:
return false
}
}
// SviModuli vraća mapu svih poznatih modula → da li su uključeni za dati profil firme.
// Koristi se da šabloni uslovno prikazuju stavke menija (analogno mapi Dozvole).
func SviModuli(podesavanja map[string]string) map[string]bool {
moduli := []string{ModulPdv, ModulFiskalizacija, ModulKpo, ModulDvojno}
m := make(map[string]bool, len(moduli))
for _, modul := range moduli {
m[modul] = ModulUkljucen(podesavanja, modul)
}
return m
}