Knjigovodstvo i fiskalizacija: dashboard upozorenje za praznine, KPO dozvole, pojednostavljen storno, ispravke verifikacije i kasira

- Dashboard kartica prikazuje naloge bez KIR/KPO/fiskalnog upisa i sumnjive duplikate (double-submit), sa zaštitom od automatskog dupliranja prihoda pri bulk dopuni
- Registrovane nedostajuće KPO dozvole (kpo.pregled/dodaj/obrisi) — modul je bio potpuno nedostupan
- Uklonjen suvišan/nefunkcionalan 'Ukloni nalog' (duplirao Storno bez stvarne razlike); Storno u listi prodaje sad vodi direktno na formu
- Kasir na fiskalnom računu koristi ime prijavljenog korisnika umesto fiksnog podešavanja
- Fiskalni računi za nalog uvek prikazuju najnoviji zapis (original vs. refund posle storna)
- Verifikaciona stranica (/v/) jasno označena kao lokalna test simulacija, ne prava provera kod PURS-a; dodat prikaz kusura
- Mock brojač fiskalnih računa (kartica emulator) sad preživljava restart servera
This commit is contained in:
2026-07-01 23:01:26 +02:00
parent fcae2ae441
commit 3a0f98622b
20 changed files with 417 additions and 124 deletions
+7 -2
View File
@@ -26,7 +26,6 @@ var sveAkcije = []string{
"servis.obrisi",
"prodaja.pregled",
"prodaja.dodaj",
"prodaja.obrisi",
"prodaja.storno",
"klijent.pregled",
"klijent.dodaj",
@@ -43,6 +42,9 @@ var sveAkcije = []string{
"pdv.pregled",
"pdv.dodaj",
"pdv.obrisi",
"kpo.pregled",
"kpo.dodaj",
"kpo.obrisi",
}
// SveAkcije vraća listu svih poznatih akcija — koristi se pri inicijalizaciji baze i resetu
@@ -78,7 +80,7 @@ func ImaDozvolu(uloga, akcija string) bool {
"servis.izmeni", "servis.obrisi":
return true
// prodaja
case "prodaja.pregled", "prodaja.dodaj", "prodaja.obrisi", "prodaja.storno":
case "prodaja.pregled", "prodaja.dodaj", "prodaja.storno":
return true
// klijent
case "klijent.pregled", "klijent.dodaj",
@@ -103,6 +105,9 @@ func ImaDozvolu(uloga, akcija string) bool {
// PDV evidencija (KIR/KPR) — administrativno, radnik nema
case "pdv.pregled", "pdv.dodaj", "pdv.obrisi":
return true
// KPO (knjiga o ostvarenom prometu) — administrativno, radnik nema
case "kpo.pregled", "kpo.dodaj", "kpo.obrisi":
return true
}
return false
+1 -1
View File
@@ -32,7 +32,7 @@ func TestImaDozvoluRadnik(t *testing.T) {
}
}
// radnik NE sme: brisanje, storno, izveštaje, podešavanja, backup
neSme := []string{"prodaja.obrisi", "prodaja.storno", "servis.obrisi", "klijent.obrisi",
neSme := []string{"prodaja.storno", "servis.obrisi", "klijent.obrisi",
"dobavljac.obrisi", "izvestaj.pregled", "podesavanja.izmeni", "backup.pokreni", "dashboard.prihod"}
for _, a := range neSme {
if ImaDozvolu("radnik", a) {