Commit Graph
100 Commits
Author SHA1 Message Date
Dasko ca10fa541b feat(pdv): KIR — handler, RequireModul, rute i UI (Faza 2a)
Pregled knjige izdatih računa (filter perioda + sume po stopama), forma
unosa (server računa ukupno) i brisanje. Nove dozvole pdv.*; prvi put
montiran RequireModul("pdv") — KIR je vidljiv u meniju (.Moduli) i
dostupan samo PDV obveznicima, uz RBAC. Oznaka PIB/JMBG po broju cifara.
2026-06-13 23:45:24 +02:00
Dasko eae47f9dfb feat(pdv): KIR/KPR evidencija — migracija, model i repozitorijum (Faza 2a)
Tabele pdv_kir i pdv_kpr (iznosi po vrsti stope), modeli PdvKir/PdvKpr,
repozitorijumi sa filterom perioda i integracioni test (datum round-trip,
nullable datum plaćanja).
2026-06-13 21:22:48 +02:00
Dasko df79aec9ef feat(pdv): šifarnik PDV stopa — handler, rute i UI (Faza 1)
Handleri (prikaz, dodaj, izmeni, arhiviraj/vrati) sa validacijom i flash
porukama; rute pod /admin/podesavanja/pdv-stope (dozvole podesavanja.*);
stranica pdv_stope registrovana u kes.go i dodata u meni Podešavanja.
Šifarnik je opšti (bez RequireModul) jer ga koristi i kalkulacija.
2026-06-13 20:45:43 +02:00
Dasko 26ff6c80e9 feat(pdv): šifarnik PDV stopa — migracija, model i repozitorijum (Faza 1)
Tabela pdv_stope (seed 20/10/0%), model PdvStopa, PdvStopaRepository
+ SQLite implementacija (arhiviranje umesto brisanja) i integracioni
test (migracija + CRUD round-trip).
2026-06-13 20:33:48 +02:00
Dasko 64657d5fee 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
Dasko 98d6755f73 feat(config): helper ModulUkljucen — uključenost modula po profilu firme (Faza 0)
Čista funkcija izvodi iz profila firme (podesavanja) koji su zakonski
moduli aktivni. Režim „samo evidencija" gasi sve. Pravila: pdv prema
prekidaču obveznika, fiskalizacija zaseban prekidač, kpo za paušalce,
dvojno za doo. Table-driven test sa 18 slučajeva.
2026-06-13 19:38:54 +02:00
Dasko 3701152e30 feat(podesavanja): profil firme — pravni i poreski status (Faza 0)
Dodata kartica „Pravni i poreski status" na Podešavanja → Opšte:
pravni oblik, režim rada, PDV obveznik, fiskalizacija. Čuva se u
postojećoj key-value tabeli podesavanja (bez migracije). Fiskalizacija
se zasivi i forsira na „Ne" u režimu „samo evidencija".
2026-06-13 19:27:26 +02:00
Dasko d71299d022 Merge grane feature/html-no-cache: HTML no-cache za pouzdan deploy 2026-06-13 10:45:23 +02:00
Dasko 8371c50c6c fix(cache): HTML stranice no-cache da nova verzija odmah stigne do korisnika
HTML nije imao Cache-Control, pa je browser servirao staru keširanu stranicu
sa starim AssetV tokenom i posle deploya — stari CSS/JS. Dodato no-cache na
renderujTemplate i renderujStandalone: browser revalidira HTML, dobija svež
AssetV token koji povlači svež CSS/JS. Statika ostaje immutable + ?v=verzija.
2026-06-13 10:45:23 +02:00
Dasko 68c0761eb7 Merge grane feature/dashboard-labele-bela: svetlije labele dashboard kartica 2026-06-13 10:33:20 +02:00
Dasko 21aff4453a style(dashboard): labele kartica svetlije (tekst-glavni) i lakši bold (500) 2026-06-13 10:33:20 +02:00
Dasko 0330622e91 Merge grane feature/dashboard-labele-bold: labele dashboard kartica 14px bold 2026-06-13 10:31:38 +02:00
Dasko 38352f2f56 style(dashboard): labele kartica 14px i bold (font-weight:600) 2026-06-13 10:31:38 +02:00
Dasko 7d91156585 Merge grane feature/dashboard-labele-font: uvećane labele dashboard kartica 2026-06-13 10:30:02 +02:00
Dasko 3cf5078661 style(dashboard): blago uvećane labele statističkih kartica (12px → 13px) 2026-06-13 10:30:02 +02:00
Dasko b5bd54c23b Merge grane feature/slajderi-init-nula: slajderi teme poštuju vrednost 0 2026-06-13 10:27:44 +02:00
Dasko 95ac567673 fix(js): slajderi teme poštuju sačuvanu vrednost 0 pri učitavanju
Init je koristio parseInt(x) || podrazumevano, gde je 0 falsy pa je padao
na podrazumevanu vrednost — slajderi (blur, opacity, glassOpacity) su se
pri ulasku na stranicu resetovali ako je sačuvana vrednost bila 0. Dodat
helper broj() koji na podrazumevano pada samo kad vrednost nije broj.
2026-06-13 10:27:44 +02:00
Dasko a21b201a29 Merge grane feature/naslovi-kartica-senka: senka naslova kartica i stranice 2026-06-13 10:13:37 +02:00
Dasko bca2d47c78 fix(ui): senka na naslovima kartica, labelama i naslovu stranice preko slike
Naslovi kartica i statističke labele su goli <div> koje glass override nije
dohvatao — blede na svetloj slici. Dodato .kartica div sa senkom (boju NE
diramo, da namerno obojeni div-ovi ostanu) i .topbar-naslov dobija svetli
tekst + senku.
2026-06-13 10:13:37 +02:00
Dasko 1240a1a894 Merge grane feature/info-banner-senka: senka info-bannera preko slike 2026-06-13 10:06:52 +02:00
Dasko 7411219d65 fix(ui): senka na info-banneru u Profil—Tema preko slike
Tekst bannera „Tamna tema je aktivna…" su goli <div> koje glass override
ne dohvata — gubili su se na svetloj slici. Dodata klasa .info-banner sa
ciljanim pravilom (svetli tekst + dvoslojna senka) u glass režimu.
2026-06-13 10:06:52 +02:00
Dasko a989818c7c Merge grane feature/senka-teksta-kartice: jača senka teksta u karticama 2026-06-13 10:04:23 +02:00
Dasko fc3e58b3e8 fix(ui): jača dvoslojna senka teksta u karticama preko svetle slike
Tekst u karticama/tabelama/modalu imao slabu jednoslojnu senku (0.7–0.8),
pa se na jako providnoj kartici + svetloj slici jedva video. Prebačeno na
umerenu dvoslojnu (oštar obris 0.9 + lagani halo 0.55) — čitljivije, i dalje
diskretno. Sidebar netaknut (već dovoljno taman).
2026-06-13 10:04:23 +02:00
Dasko deb4719f60 Merge grane feature/naslov-senka-gradijent: gradijentna senka naslova 2026-06-13 09:58:40 +02:00
Dasko fcccc30b63 fix(ui): gradijentno zatamnjenje senke naslova (skoro crn → upola → bled)
Tri sloja text-shadow podešena u opadajućem zatamnjenju: oštar skoro crn
obris, srednji upola, široki bledi halo.
2026-06-13 09:58:40 +02:00
Dasko 1fb71143fb Merge grane feature/naslov-tamnija-senka: dublje zatamnjenje senke naslova 2026-06-13 09:56:11 +02:00
Dasko 06c53c2644 fix(ui): dublje zatamnjenje senke naslova van kartice
Dodat treći sloj (0 0 8px rgba(0,0,0,1)) — gust crni halo oko slova za
jači kontrast naslova na svetloj pozadinskoj slici.
2026-06-13 09:56:11 +02:00
Dasko ee8e974ab7 Merge grane feature/naslov-jaca-senka: jača senka naslova 2026-06-13 09:54:35 +02:00
Dasko a669607bea fix(ui): jača dvoslojna senka na naslovu van kartice
Naslov .naslov-traka dobio jaču dvoslojnu senku (oštar obris + širi halo)
umesto jednoslojne, da bolje „iskoči" na svetloj pozadinskoj slici.
2026-06-13 09:54:35 +02:00
Dasko 1446003554 Merge grane feature/naslov-senka: halo na naslovu van kartice 2026-06-13 09:51:41 +02:00
Dasko 70cccf1413 fix(ui): senka na naslovu van kartice (istorija prijava) preko slike
Naslov „Istorija prijava — <korisnik>" je <span> van kartice, pa ga glass
override nije dohvatao — svetli tekst bez senke se gubio na svetloj slici.
Dodata klasa .naslov-traka koja u glass režimu dobija halo (text-shadow);
ista klasa se može dati i drugim naslovima van kartica.
2026-06-13 09:51:41 +02:00
Dasko 26b1f5f01d Merge grane feature/nazad-link-poravnanje: ujednačen kompaktan .nazad-link 2026-06-13 09:45:32 +02:00
Dasko 173293cdbb fix(css): .nazad-link kompaktan u flex-column kontejnerima
U .kolona (flex-column) se .nazad-link zbog default align-items:stretch
rastezao na punu širinu, što je sa novom staklenom pill-podlogom odudaralo
od kompaktnog izgleda na formama. Dodato align-self:flex-start — kompaktan
svuda, no-op u ne-flex roditeljima.
2026-06-13 09:45:32 +02:00
Dasko 8c14381b7e Merge grane feature/vidljivost-pozadina: vidljivost elemenata preko pozadinske slike 2026-06-13 09:39:53 +02:00
Dasko 27295a3bcd fix(ui): vidljivost elemenata van kartica preko pozadinske slike
Glass override je davao svetli tekst i staklenu podlogu samo karticama,
tabelama i sidebaru — elementi van kartica (.nazad-link, .btn-sekundarno,
.btn-obrisi-ghost, checkbox-traka „Samo aktivni") i goli <div> napomene
(„maksimum N MB") ostajali su u prigušenoj boji i jedva se videli.
Dodata pravila u glass blok: pomenuti elementi dobijaju sopstvenu staklenu
pill-podlogu (poluprovidna + blur + svetli border + svetli tekst), pa se
vide bez obzira da li je slika tamna ili svetla. Napomene dobile klasu
.pomocni-tekst da ih override dohvati; checkbox-traka klasu .cek-filter.
2026-06-13 09:39:53 +02:00
Dasko 52d7988612 Merge grane feature/kartica-hover-i-animiraj: hover na svim karticama + animiraj na nabavka-detalji 2026-06-13 09:21:34 +02:00
Dasko a25dbe86c9 fix(css): hover lift na svim karticama + animiraj na nabavka-detalji karticama
Hover lift (.kartica:hover translateY) nije radio na karticama sa .animiraj
jer je fadeInUp imao fill-mode both, koji forwards zaključa transform i
nadjača hover. Prebačeno na backwards: i dalje nema treperenja na ulazu, a
hover sad radi na svim karticama u programu.
Kartice „Stavke nabavke" i „Brisanje nabavke" u nabavka_detalji nisu imale
.animiraj (previd — stagger u <style> je predviđao tri kartice). Dodato, i
stagger pomeren na nth-child(2-4) jer je prvi child .kolone „Nazad" link.
2026-06-13 09:21:28 +02:00
Dasko 7397581cb7 Merge grane feature/stagger-stranica: stagger kartica profila/podešavanja u main.css 2026-06-13 08:33:13 +02:00
Dasko af455e351e refactor(css): stagger kartica na stranicama profila/podešavanja na jedno mesto
Isti .animiraj:nth-child stagger (korak 0.06s) bio je dupliran u 7
template <style> blokova (admin_profil, admin_login_istorija, profil_tema,
podesavanja i 3 podstranice). Prebačen u main.css kao
.stranica-stack .animiraj:nth-child(N); descendant selektor čuva isto
ponašanje po neposrednom roditelju, a klasa .stranica-stack sprečava
curenje na ostatak programa. Sad radi i pod HTMX navigacijom, menja se
na jednom mestu.
2026-06-13 08:33:13 +02:00
Dasko 7b324824db Merge grane feature/status-badge-konsolidacija: bedž statusa u main.css 2026-06-13 08:22:52 +02:00
Dasko 5c17e70f6f refactor(css): bedž statusa servisa na jedno mesto u main.css
Status bedž (.status-badge i .status-* boje) je bio dupliran u
servis.html i servis_detalji.html sa sitnom razlikom u veličini.
Ujednačena veličina i prebačeno u main.css — sad se menja na jednom
mestu i radi pod HTMX navigacijom. Uklonjen i prazan <style> blok
iz magacin.html.
2026-06-13 08:22:47 +02:00
Dasko b9f2cf8361 Merge grane feature/stagger-kartice: stagger lista-kartica u main.css 2026-06-13 01:32:44 +02:00
Dasko 662964f3c8 refactor(css): stagger mobilnih lista-kartica na jedno mesto u main.css
Mobilni parnjak prethodnog (tabele): 7 lista-kartica klasa (prodaja/servis/magacin/
pod/klijent/dobavljac/nabavka-kartica) imale su identičan :nth-child stagger
(0.06s korak do 5). Uvedeno jedno pravilo [class*="-kartice"] > .animiraj:nth-child
u main.css; uklonjeni per-page blokovi. Drugi tipovi kartica (detalji/forma/
dashboard/izvestaji) imaju svoj stagger i ostaju po strani.
4 strane (nabavke/klijenti/prodaja/dobavljaci) ostale prazan dodatni-css blok →
uklonjen. Bez HTML izmena u sadržaju; radi i pod HTMX-om. Animacija lista-kartica
se sada menja na JEDNOM mestu.
2026-06-13 01:32:44 +02:00
Dasko 8906b2477f Merge grane feature/stagger-tabele: stagger redova tabela u main.css 2026-06-13 01:26:09 +02:00
Dasko edffeeecaf refactor(css): stagger animacija redova tabela na jedno mesto u main.css
Svaka lista-strana je imala identičan tbody tr:nth-child stagger (0.04s korak do
10), samo sa drugim prefiksom klase (.prodaja-tabela, .servis-tabela...). Uvedeno
JEDNO univerzalno pravilo .tabela tbody tr:nth-child(1..10) u main.css (sve tabele
već imaju .tabela, redovi .animiraj). Uklonjeni per-page blokovi iz 10 strana
(uklj. duplikat .dozvole-tabela iz admin_dozvole — kopija ostaje u main.css).
Pogađa samo redove koji se animiraju; nije bilo HTML izmena. Bonus: sada radi i
pod HTMX navigacijom (page <style> blokovi se odbacuju sa <head>, main.css ostaje).
Animacija redova se sada menja na JEDNOM mestu.
Mobilni card stagger (.X-kartica:nth-child) je zaseban — ostaje za sledeći korak.
2026-06-13 01:26:09 +02:00
Dasko ae478af67e Merge grane feature/animacije-konsolidacija: animacije poruka u main.css 2026-06-13 01:13:17 +02:00
Dasko aebcfa11e6 refactor(css): animacije poruka iz dupliranih <style> u main.css
.poruka-animacija (10 fajlova) i .greska-animacija (7 fajlova) bile su identično
duplirane po stranicama; keyframes (slideDown/shake) su već bili u main.css.
Izdvojene klase u main.css uz keyframes, uklonjeni duplikati. Forma-strane
(dobavljac/podsetnik/magacin/servis_forma) ostale prazan dodatni-css blok →
uklonjen (base.html koristi {{block}} sa difoltom, pa je bezbedno izostaviti).
HTML class= upotrebe netaknute; build, handler testovi i parsiranje prolaze.
2026-06-13 01:11:50 +02:00
Dasko 9a3aa42e19 Merge grane feature/toast-konsolidacija: toast sistem u main.css 2026-06-13 01:07:03 +02:00
Dasko f4efd60ca0 refactor(css): toast sistem iz dupliranih <style> blokova u main.css
Toast obaveštenja (.toast, .toast-greska, .toast-uspeh, .toast.nestaje,
@keyframes toastIn/Out) bila su identično duplirana u podesavanja.html i
podesavanja_opste.html. Izdvojeno jednom u main.css; uklonjeno iz oba <style>
bloka. Obe strane idu kroz base.html (učitavaju main.css), pa rade nepromenjeno.
Standalone .greska (prijava/totp_provera/setup) NAMERNO ostavljene — te strane
ne učitavaju main.css (samostalne, minimalne).
2026-06-13 01:07:03 +02:00
Dasko c07750191d Merge grane feature/btn-obrisi-ghost: ghost-obriši dugme na klasu 2026-06-13 01:02:37 +02:00
Dasko d99db72665 refactor(css): ghost-obriši dugme na .btn-obrisi-ghost klasu
Nova klasa .btn-obrisi-ghost (providna pozadina, #fca5a5 ivica, #dc2626 tekst) —
ghost varijanta brisanja, drugačija od pune .btn-obrisi-malo. Zamenjeno 6 inline
pojava u: admin_korisnici, podesavanja (2x), podesavanja_sistem, podesavanja_izgled,
profil_tema. Mala veličina je default klase; srednje (7px 14px / radius 8px /
font 13px) dobile kontekstualni override. Dodat suptilan hover (ranije ga nije bilo).
Preostali #fca5a5 su error/toast poruke (.greska/.toast-greska) — nisu dugmad.
2026-06-13 01:02:37 +02:00
Dasko c88926014b Merge grane feature/refaktor-layout: layout utili .kolona/.red-izmedju 2026-06-13 00:57:07 +02:00
Dasko e922d76331 refactor(css): layout utili .kolona i .red-izmedju
Nove utility klase: .kolona (display:flex;flex-direction:column) i .red-izmedju
(display:flex;justify-content:space-between) — struktura bez razmaka. Izdvojena
strukturna flex deklaracija iz 50 elemenata (32 kolona + 18 red-izmedju); gap/
margin ostaju kao kontekstualni override po instanci.
Visoko varirani page-header redovi (sa border-bottom/flex-wrap) ostavljeni —
jednokratni. Bez promene izgleda; šabloni parsiraju.
2026-06-13 00:57:07 +02:00
Dasko 767cad181c Merge grane feature/refaktor-tekst: sporedni tekst na .pomocni-tekst 2026-06-13 00:50:10 +02:00
Dasko 25aed85ee6 refactor(css): sporedni tekst na .pomocni-tekst klasu
39 inline elemenata (span/div) sa font-size:13px;color:var(--tekst-sporedni)
(identično postojećoj .pomocni-tekst) zamenjeno klasom; ukupno 40.
Razdelnici (border-bottom:0.5px na <tr>) NISU dirani: mešavina su thead redova
(redundantni — .tabela ih daje) i tbody data redova (gde je ivica separator i
POTREBNA), pa blanket-promena nije bezbedna. Naglašeni naslovi (font-weight:500;
color:glavni) imaju raznolik font-size (14/15/16/22px) — ne mapiraju se na jednu
klasu, ostavljeni.
2026-06-13 00:50:10 +02:00
Dasko 21dd91ac11 Merge grane feature/refaktor-tabele: inline <table> na .tabela 2026-06-13 00:45:41 +02:00
Dasko e2aaab32a7 refactor(css): inline <table> na .tabela klasu
Tabele su koristile inline width:100%;border-collapse:collapse (identično .tabela).
21 tabela sada koristi .tabela (named tabele dobile ' tabela' uz postojeću klasu).
Preostale 2 imaju samo kontekstualni font-size:13px override.
th/td/thead-tr ostavljeni inline: th/td su kontekstualni (poravnanje/širina/boja
po koloni, raznoliki), a thead tr border je redundantan-ali-bezopasan (klasa daje
isti border:0.5px var(--ivica), inline ga samo nadjačava istom vrednošću).
Bez promene izgleda; šabloni parsiraju.
2026-06-13 00:45:41 +02:00
Dasko 931466c5e5 Merge grane feature/refaktor-forme: inline labele na .polje-labela 2026-06-13 00:07:19 +02:00
Dasko 655e15b521 refactor(css): inline labele forme na .polje-labela klasu
59 inline labela (font-size:13px; color:--tekst-sporedni; display:block;
margin-bottom:6px — identično .polje-labela) zamenjeno klasom; ukupno 67 labela
sada koristi .polje-labela. Inputi se već globalno stilizuju (main.css 635-679),
pa nije bilo punih inline input-stilova. Preostale labele (12px/4px, 8px, flex
checkbox/radio) su namerne varijante — ostavljene.
Bez promene izgleda. Napomena: redundantni inline width:100% na inputima (globalni
stil ga već postavlja) ostavljen za kasnije (bezbedno uklanjanje traži ciljanje
po elementu jer je width:100% legitiman na tabelama).
2026-06-13 00:07:13 +02:00
Dasko 75ee3442ce Merge grane feature/refaktor-dugmad: inline dugmad na .btn-* klase 2026-06-12 23:58:06 +02:00
Dasko 5bcf0bc89a refactor(css): inline dugmad na semantičke .btn-* klase
Dodate klase .btn-opasno (puno crveno) i .btn-upozorenje (narandžasto/storno);
.btn-primarno-malo dobio cursor:pointer (nedostajao). Inline dugmad zamenjena
klasama u: admin_profil (lozinka/2FA/regeneriši/podesi/deaktiviraj), prodaja/
servis/nabavka_detalji (obriši/storno), servis (traži), magacin (premesti),
admin_login_istorija (nazad). Override-i tipa class=btn-primarno style=background
uklonjeni u korist .btn-opasno/.btn-upozorenje.
Ostala samo kontekstualna inline svojstva (width/align-self/veličina po instanci).
Bez promene izgleda — samo izdvajanje ponovljenog stila. Šabloni parsiraju.
2026-06-12 23:58:00 +02:00
Dasko e7d0e0f5e6 Merge grane feature/rezervni-kodovi: rezervni (jednokratni) kodovi za 2FA 2026-06-12 23:44:22 +02:00
Dasko ce624fdc87 feat(2fa): rezervni (jednokratni) kodovi za 2FA
Alternativa TOTP-u kada uređaj nije dostupan. Po specifikaciji:
10 kodova pri aktivaciji, čuvani kao bcrypt heš.
Backend:
- migracija 039 (tabela rezervni_kodovi, FK CASCADE)
- auth.GenerisiRezervneKodove (Crockford base32, XXXX-XXXX) + NormalizujRezervniKod
- RezervniKodoviRepository (Zameni/Iskoristi/BrojPreostalih/Obrisi) + SQLite impl
- žičenje u Handler (+ reinicijalizuj)
Prijava:
- VerifikujTotp prvo proba TOTP, pa rezervni kod (isto polje); kod je jednokratni
- totp_provera.html: input opušten (slova/crtica), napomena o rezervnom kodu
Profil:
- aktivacija generiše i prikazuje kodove JEDNOM; dugme Regeneriši; brojač preostalo X/10
- deaktivacija briše kodove
Testovi: auth (generisanje/format/normalizacija), repo (jednokratnost/regeneracija),
prijava rezervnim kodom end-to-end. Ukupno 36 test funkcija.
2026-06-12 23:44:09 +02:00
Dasko 7c42a080b7 Merge grane feature/readme-azuriranje: ažuriran README 2026-06-12 23:19:13 +02:00
Dasko 18c1ce48e5 docs(readme): ažuriran spisak funkcija (srpski i engleski)
Dodato/ispravljeno u oba README-a:
- TOTP: tajna šifrovana u bazi (AES-256-GCM) umesto netačne tvrdnje o rezervnim
kodovima (nisu implementirani — premešteni u Planirano)
- RBAC: naglašeno sprovođenje provere na nivou ruta i u handlerima
- Backup: dodato vraćanje baze iz kopije (bezbedno, bez prekida rada)
- Dodato: strukturisano logovanje (slog) i automatski testovi
2026-06-12 23:19:07 +02:00
Dasko 05332b0951 Merge grane feature/testovi-parseformu: testovi validatora forme 2026-06-12 23:12:56 +02:00
Dasko dd7aaa05be test: validatori forme (parseFormu*)
internal/handler/parseformu_test.go — tabelarni testovi za:
- parseFormuArtikla (naziv obavezan, negativna količina, neispravna cena)
- parseFormuKlijenta (fizičko/pravno obavezna polja, email, podrazumevani tip)
- parseFormuProdaje (bez stavki, količina 0, neispravan artikal, nesklad, validno)
- parseFormuNaloga (uređaj/opis obavezni, podrazumevani status)
Ukupno 32 test funkcije u repozitorijumu.
2026-06-12 23:12:56 +02:00
Dasko bf6d45e529 Merge grane feature/testovi-prijava: integracioni testovi tokova prijave 2026-06-12 23:10:00 +02:00
Dasko c8ca09b4f9 test: integracioni testovi tokova prijave
internal/handler/prijava_test.go — Handler nad privremenom SQLite bazom (prave
migracije), TemplatesFS na korenu repo-a za standalone render. Pokrivено:
- uspešna prijava (303 -> /dashboard + sesijski kolačić)
- pogrešna lozinka (greska=1, bez kolačića, zabeležen neuspeh)
- nepostojeći korisnik i neaktivan nalog (bez sesije)
- zaključavanje IP-a posle 5 neuspeha (ni ispravna lozinka ne daje sesiju)
- TOTP tok: prijava -> /prijava/totp -> validan kod -> /dashboard (potvrđeno)
- pogrešan TOTP kod (greska=1, sesija ostaje nepotvrđena)
Ukupno 28 test funkcija u repozitorijumu.
2026-06-12 23:09:55 +02:00
Dasko 8fe7679415 Merge grane feature/izvestaj-repo: IzvestajRepository (dashboard/izveštaji) 2026-06-12 22:53:21 +02:00
Dasko 98faf0a9de refactor(izvestaji): direktan SQL dashboard/izveštaja u IzvestajRepository
dashboard.go i izvestaji.go više ne sadrže direktan SQL — svih 12 upita
prebačeno u novi IzvestajRepository (internal/db/sqlite/izvestaj.go). Repo vraća
sirove redove (model.*Red tipovi), a handleri zadržavaju prezentaciju
(formatiranje datuma, boje tačaka, rang, sklapanje niza 12 meseci). Žičenje kroz
Handler.IzvestajRepo (+ reinicijalizuj).
Dobici: testabilnost (dodati integracioni testovi izvestaj_test.go) i put ka
Postgres-u bez prepravke handlera. dashboard.prihod provera ostaje u handleru.
Van obima: middleware/flash.go i backup VACUUM INTO (ne pripadaju repo sloju).
2026-06-12 22:53:15 +02:00
Dasko 17991c39cd Merge grane feature/slog-logovanje: strukturisano logovanje (log/slog) 2026-06-12 22:34:02 +02:00
Dasko 4c1794ffc6 refactor(log): prelazak sa log na log/slog (strukturisano logovanje)
Uveden podrazumevani slog logger u main.go (podesiLog): JSON u produkciji,
tekst u razvoju, nivo Info. Svih ~70 poziva log.Printf/Println/Fatalf zamenjeno
slog.Error/Warn/Info: greška se prosleđuje kao atribut "error", informativne
vrednosti kao imenovani atributi (port, broj, putanja...), Fatalf -> Error +
os.Exit(1). Upozorenja (inicijalizacija/čišćenje dozvola, migracija kolone) idu
kao slog.Warn.
Auth log (internal/auth/log.go) namerno NIJE diran — ostaje zaseban *log.Logger
u fail2ban formatu. (slog.SetDefault usput preusmerava i standardni log paket.)
2026-06-12 22:33:42 +02:00
Dasko b961005e38 Merge grane feature/testovi: prva grupa testova 2026-06-12 22:07:38 +02:00
Dasko 88fbea94b2 test: prva grupa testova (kripto, model, RBAC, helperi, TOTP repo)
Dodati testovi pored koda:
- internal/model: CenaBezPdv/PdvIznos, Klijent.PunoIme, PreostaloZaNaplatu
- internal/middleware: ImaDozvolu matrica po ulogama + SveDozvole
- internal/handler: izvuciIP, parseOpcionuCenu, validnoImeBackupa (anti path-traversal)
- internal/db/sqlite: integracioni nad privremenom SQLite bazom + prave migracije
(TOTP šifrovan u mirovanju, brisanje, ZasifrujPostojeceTotp + idempotentnost)
19 test funkcija, prolaze i sa -race. Dopunjava kripto_test.go iz ranije.
2026-06-12 22:07:32 +02:00
Dasko 45c28d7919 Merge grane feature/backup-gorutine-svez-db: pozadinske gorutine koriste svežu konekciju 2026-06-12 21:56:28 +02:00
Dasko c8eb8de651 fix(backup): pozadinske gorutine koriste svežu konekciju posle obnove
Auto-backup i čišćenje sesija/pokušaja su koristili originalni db handle iz
main.go, koji posle obnove backupa (VratiBackup) ostaje zatvoren — gorutine bi
prestale da rade do restarta. Sada rade preko novog helpera h.SaBazom, koji pod
deljenim zaključavanjem prosleđuje trenutnu h.DB, pa vide zamenjenu konekciju.
Gorutine su premeštene da startuju posle kreiranja h. time.Sleep je van
zaključavanja da ne odlaže obnovu.
2026-06-12 21:56:17 +02:00
Dasko c23b8e9a0e Merge grane feature/backup-swap-lock: bezbedna zamena baze pri obnovi 2026-06-12 19:43:48 +02:00
Dasko daf62f7de7 fix(backup): bezbedna zamena baze pri obnovi (sync.RWMutex + drain)
Obnova backupa (VratiBackup) je menjala Handler.DB i repozitorijume bez
zaključavanja dok drugi zahtevi rade — data race i moguć upit nad zatvorenom
konekcijom. Uveden Handler.mu (sync.RWMutex): zahtevi drže deljeno zaključavanje
preko middleware-a ZakljucajCitanje, a sama zamena (close+copy+reopen+reinit)
uzima ekskluzivno zaključavanje u zasebnoj gorutini, pa sačeka da svi tekući
zahtevi završe (drain) pre zamene. Zasebna gorutina je nužna jer zahtev još
drži deljeno zaključavanje (inače deadlock).
Poznato ograničenje: pozadinske gorutine i dalje koriste stari db handle iz
main.go — zaseban slučaj za kasnije.
2026-06-12 19:43:40 +02:00
Dasko 866bea2e03 Merge grane feature/rbac-ruter: RBAC zaštita mutacija na ruteru 2026-06-12 19:34:23 +02:00
Dasko ab75a60857 feat(rbac): zaštita mutirajućih ruta na ruteru (RequireDozvolaMut)
Mutirajuće rute (POST + brisanja preko GET-a) više se ne oslanjaju samo na
ručnu proveru u handleru. Uvedena middleware RequireDozvolaMut koja na odbijanje
vraća 403 (za razliku od RequireDozvola koja redirektuje, a ostaje za GET
preglede). U main.go svaka mutacija je obmotana helperom doz("modul.akcija"),
pa je ruter sada garantovani sloj zaštite — zaboravljena provera u handleru ne
ostavlja endpoint nezaštićenim.
Mapiranje rute->dozvola izvučeno iz postojećih provera u handlerima. Ručne
provere (zahtevajDozvolu) zadržane kao odbrana u dubinu. Namerni izuzeci:
javne rute, /podsetnici/* (bez dozvole po dizajnu), /admin/* (RequireAdmin po
ulozi) i lične profil-akcije.
2026-06-12 19:34:16 +02:00
Dasko 96f2c098d5 Merge grane feature/totp-enkripcija: šifrovanje TOTP tajni 2026-06-12 19:27:00 +02:00
Dasko 3f431e51c9 feat(auth): šifrovanje TOTP tajni u mirovanju (AES-256-GCM)
TOTP tajne se više ne čuvaju kao čist tekst u koloni korisnici.totp_tajna.
Uvedene auth.Sifruj/auth.Desifruj (AES-256-GCM) u internal/auth/kripto.go.
sqliteKorisniciRepo šifruje pri SacuvajTotpTajnu i dešifruje pri čitanju
(DohvatiPoImenu/PoID/Lista), pa ostatak programa i dalje vidi čistu tajnu.
Ključ je 32-bajtni NTECH_TOTP_KEY (base64), učitava se ili generiše pri
pokretanju (ucitajTotpKljuc) i upisuje u ntech.env van baze. Stare nešifrovane
tajne se tolerišu pri čitanju (fallback) i jednokratno šifruju pri startu
(ZasifrujPostojeceTotp). RequireAuth i Handler provode ključ do repo-a.
Dodati prvi testovi u repozitorijumu (internal/auth/kripto_test.go).
2026-06-12 19:26:46 +02:00
Dasko a7a3f0c9e3 refactor(css): premešteni stilovi za dozvole u main.css
Stilovi za tabelu dozvola i zaglavlja modula premešteni iz inline bloka (dodatni-css) u globalni main.css, jer HTMX navigacija odbacuje pa oni nisu bili primenjeni nakon prelaska na stranicu. Istovremeno su unapređeni: animacija redova, staklena providna traka sa akcentnom levom ivicom i prilagođeni checkbox-ovi.
2026-06-12 01:06:05 +02:00
Dasko 1cdc0bda12 Dodata zahtevajDozvolu metoda koja zamenjuje dupliranu proveru dozvola u handlerima.
Uvedena AssetV promenljiva za cache-busting statičkih fajlova, koja se postavlja pri svakom pokretanju.
Kreiran pogled klijent_prikaz (migracija 038) za jedinstveno prikazivanje imena klijenta, čime se eliminiše ponavljanje COALESCE logike u upitima.
Izvučena dodeliOpcijeKorisnika funkcija u korisnici.go radi DRY.
Zamenjeni inline stilovi u HTML šablonima CSS klasama (.polje-labela, .obavezno, .pomocni-tekst, .tabela, .kartica-tabela, .prazno-stanje).
Dodat width: 100% na inpute i resize: vertical na textarea u main.css.
2026-06-12 00:43:58 +02:00
DaskoandGitHub 551c1175f6 Merge pull request #3 from dalibor31/feature/fiskalizacija-i-pdv
Implementacija fiskalizacije i PDV-a
2026-06-10 01:38:57 +02:00
Dasko 26ee62b259 Merge branch 'main' of github.com:dalibor31/GoNTech into feature/fiskalizacija-i-pdv 2026-06-10 01:27:14 +02:00
Dasko da22837ef2 Izmene u Readmne fajlovima 2026-06-10 00:21:32 +02:00
DaskoandGitHub 9ac4656b91 Merge pull request #2 from dalibor31/feature/fiskalizacija-i-pdv
Feature/fiskalizacija i pdv
2026-06-10 00:11:21 +02:00
Dasko c99887bb6f Magacin: modal za premeštanje + ujednačen slajder na svim brauzerima
Premeštanje artikla:
- Padajući <details> meni zamenjen nativnim <dialog> modalom (showModal),
koji ide u „top layer" pa je uvek iznad svega bez obzira na z-index/overflow.
- Dodato zatamnjenje pozadine (::backdrop) i fade in/out animacije
(@starting-style + transition-behavior: allow-discrete).
- Klik van modala, × dugme i Escape zatvaraju; klik na kategoriju i dalje
odmah premešta artikal.
Tema i HTMX:
- CSS modala premešten iz magacin.html (dodatni-css u headeru) u main.css,
jer se header ne menja pri HTMX navigaciji (hx-select=#glavni-sadrzaj),
pa je stil sada uvek prisutan.
- Modal prati svetlu/tamnu temu preko CSS promenljivih; kad je aktivna
pozadinska slika, glass-override u base.html ga čini providnim i zamućenim
kao kartice.
- Modal centriran (margin:auto, jer reset gazi UA podrazumevano) i pojačana senka.
Slajder (input[type=range]):
- Dodata zajednička klasa .klizac sa ručnim stilom za oba motora
(::-webkit-slider-* i ::-moz-range-*), da svuda izgleda kao u Firefox-u.
- Plava popunjenost pre glave: Firefox preko ::-moz-range-progress, Chromium
preko gradijenta i CSS promenljive --popunjeno koju postavlja JS.
- Svih 12 slajdera (profil_tema, podesavanja_izgled, podesavanja) prešlo sa
inline accent-color stila na klasu .klizac.
2026-06-10 00:05:40 +02:00
Dasko 53d9ada97b Ispravljen prikaz fontova na Chart.js grafikonu u Chromium browserima (Opera, Chrome, Edge)
Problem: u Operi i Chrome-u na Chart.js grafikonu (Izveštaji) stubići
se vide, ali slova i brojevi ne. U Firefoxu sve radi ispravno.
Uzrok 1 — CSP font-src 'self' (internal/middleware/bezbednost.go):
Chromium primenjuje CSP font-src direktivu i na canvas.fillText(),
blokirajući sistemske fontove jer nisu sa 'self' origina.
Firefox ovu proveru ne radi.
Uzrok 2 — nedostaje font family u Chart.js konfiguraciji:
Canvas na Linuxu ne ume sam da pronađe font sa ćiriličnim slovima
(Helvetica/Arial ih često nemaju za canvas iako ih imaju u DOM-u).
Rešenje:
- Uklonjena font-src direktiva iz CSP-a
- Dodat family: 'DejaVu Sans, Ubuntu, system-ui, sans-serif' na
legendu, x-osu i y-osu Chart.js grafikona
2026-06-09 22:15:44 +02:00
Dasko eb506ce519 Lokalizovane frontend biblioteke i popravljen prikaz u Opera/Chromium
Uklonjena zavisnost od spoljnih CDN-ova koja je u Operi prouzrokovala
nestanak stilova i elemenata kada blocker/ekstenzija blokira CDN:
- Tailwind (cdn.tailwindcss.com) potpuno izbačen; 9 korišćenih klasa
(grid, grid-cols-*, md:grid-cols-*, gap-*, mb-6) prebačeno u main.css
- HTMX i Chart.js skinuti lokalno u web/static/js/ i serviraju se
preko go:embed umesto sa jsdelivr CDN-a
- CSP očišćen u bezbednost.go — uklonjeni svi spoljni izvori, ostaje 'self'
Popravljen grafikon na stranici Izveštaji: dodato color-scheme:only light
na canvas i wrapper, jer Operin "tamni režim za web" (force-dark) zatamni
canvas i učini tekst na osama nevidljivim.
2026-06-09 02:32:24 +02:00
Dasko 9466c7133b Code-review popravke: RequireDozvola middleware, validacija backupa, dedup partiala
Bezbednost / dozvole:
- Nov RequireDozvola(proveri, akcija) middleware (po uzoru na RequireAdmin):
na odbijanje redirekt na /dashboard sa flash porukom umesto golog 403
- 10 "pregled" ruta (prodaja, servis, klijenti, dobavljači, nabavke) prešlo
na deklarativnu proveru na nivou rute
- Uklonjene inline pregled-provere iz handlera — provera je sad na jednom
mestu po ruti, vidljiva u ruteru
Backup podešavanja:
- Neispravan unos (van opsega ili ne-broj) više se ne preskače tiho;
prikazuje se jasna greška i ne prikazuje se lažno "sačuvano"
- Hvata se greška pri čuvanju u bazu (uklonjen progutani _ =)
Šabloni:
- "Premesti" dropdown izvučen u jedan {{define "premestiMeni"}} partial
(više nije dupliran u tabeli i mobilnoj kartici)
- Dodat dict helper u FuncMap saSidebar šablona radi prosleđivanja više
vrednosti partialu; standalone šabloni namerno ostaju bez izmene
2026-06-09 01:26:10 +02:00
Dasko eb389dedf9 Magacin premeštanje, backup podešavanja, čišćenje RBAC sistema
Magacin:
- Dodato premeštanje artikla u drugu kategoriju (dugme + nativni
<details> meni, bez JS-a; radi na desktopu i mobilnom)
- Endpoint POST /magacin/premesti/{id} uz proveru dozvole artikal.premesti
Backup:
- Nova podešavanja: interval automatskog backupa i broj kopija (rotacija)
- Periodični backup uz onaj pri pokretanju; interval se čita iz baze
- Migracija 037_backup_podesavanja.sql
Dozvole (RBAC):
- Dodate kartice koje su nedostajale (dashboard.prihod, prodaja.storno,
podesavanja.login_pozadina, tema.lokalno) — popravljen i bug gde su se
gasile pri svakom čuvanju matrice
- Aktivirana kontrola pregleda za prodaju, servis, klijente i dobavljače
(provera u handlerima + skrivanje iz sidebara)
- Uklonjene mrtve/obmanjujuće dozvole iz matrice i sveAkcije (korisnici,
podsetnici, artikal.pregled, kategorija.izmeni, tema.globalno,
podesavanja.app_pozadina); sveAkcije 47 -> 34
- Čišćenje zastarelih redova (siročića) u tabeli dozvola pri startu
Ostalo:
- Statički fajlovi: embed celog web/static i ispravan MIME za .js/.css
- Keš šablona: dodat admin_dozvole (stranica Dozvole se nije otvarala)
- Sidebar accordion: radi i skupljen i proširen, međusobno isključiv
2026-06-09 00:55:15 +02:00
Dasko 19ecdf30a3 Popravka sidebara: kolaps, podmeni i HTMX navigacija 2026-06-08 19:29:17 +02:00
Dasko be74b22508 Premešten responsive CSS u main.css zbog HTMX navigacije
- Premešten sav responsive CSS (display: none za kartice, @media pravila)
iz {{define "dodatni-css"}} blokova u globalni main.css
- Pogođene stranice: nabavke, dobavljači, klijenti, magacin, servis,
prodaja, podsetnici, nabavka forma/detalji, servis forma, podešavanja
- Razlog: HTMX pri navigaciji menja samo <main> sadržaj, <head> ostaje —
page-specifičan CSS iz dodatni-css nije bio aktivan nakon navigacije
2026-06-07 22:41:09 +02:00
Dasko ef3a323203 Bezbednosni audit i refaktoring: HP popravke, RBAC, flash poruke, go:embed, CSP 2026-06-07 22:41:09 +02:00
Dasko 52a6e1df1b Bezbednost: rešeno 7 kritičnih nalaza (HP-01 do HP-07) 2026-06-07 22:41:09 +02:00
DaskoandGitHub 44e3a14823 Update Serbian README with project details and badges 2026-06-07 02:23:08 +02:00
DaskoandGitHub 1e61bb1ed9 Enhance README with image and project details
Added an image to the README and updated project description.
2026-06-07 02:22:46 +02:00