Commit Graph

34 Commits

Author SHA1 Message Date
Dasko f29e76612e Servis forma, animacije, hover efekti i pojačane senke
Servis:
- Nova polja: ostecenja, pin_uredjaja, pribor (migracija 051)
- Default garancija iz podešavanja, svič "Bez garancije" u formi
- Podešavanja → Servis: konfigurabilan rok garancije (migracija 052)
- Default datum prijema = danas; datum_prijema se eksplicitno upisuje
- Sidebar link za Servis podešavanja

PDV/Nivelacije:
- Default raspon datuma = početak/kraj tekućeg meseca (KIR, KPR, Nivelacije)
- Dodata class="tabela" na tabele bez klase (KIR, KPR, Obračun, Nivelacije)

Animacije (Moj profil → Tema):
- Korisnik bira vrstu animacije: bez, fadeInUp, fadeIn, scaleIn, slideLeft
- Čuva se po korisniku u korisnici.lokalna_animacija (migracija 053)
- CSS [data-animacija] radi na body (globalno) i na preview wrapperima (izolovano)
- Preview animacije izolovan: data-animacija na #anim-preview-wrap, ne na body
- Mobilne kartice se animiraju kad korisnik odabere stil (podrazumevano ne)
- Animacija primenjena direktno na .tabela tbody tr (bez potrebe za .animiraj)

Hover efekti (Moj profil → Tema):
- Opcije: podrazumevano, bez, podizanje, svetlost, zoom, boja
- Čuva se po korisniku u korisnici.lokalni_hover (migracija 054)
- CSS [data-hover] radi izolovano; preview menja samo #hover-preview-wrap
- Pojačane senke u oba teme (--senka i nova --senka-hover promenljiva)
- Transition dodat za transform i background na karticama

Grafikon (Izveštaji): toggle zamenjen globalnim .toggl/.toggl-klizac svičom
2026-06-18 02:21:06 +02:00
Dasko 4fe6d53bf9 Ispravke: ugnježdena forma, greška čitanja fajla, mrtvi flag, refaktor struct
- podesavanja_opste.html: forma za uklanjanje loga premešena van forme za
  otpremanje — ugnježdene forme su nevažeći HTML
- ProfilOtpremiAvatar: greška iz fajl.Read(buf) se sada proverava (dozvoljava
  io.EOF, odbacuje pravi problem čitanja)
- TopbarLogoTekst uklonjen: iz modela, oba handlera i struct-a u podesavanja.go
  (podešavanje nije korišćeno ni u jednom šablonu)
- korisnici.go: dodeliOpcijeKorisnika prima korisnikOpcije struct umesto dugačke
  liste parametara; skeniraiKorisnika i Lista ažurirani
2026-06-16 03:00:38 +02:00
Dasko 85cb1e25c7 Topbar: logo firme + naslov; avatar upload; uklanjanje logo zone
- Topbar: logo slika firme (toggle on/off) pa naslov stranice; bez teksta firme
- Sidebar: samo naziv firme i podnaslov (tekst), bez slike loga
- Avatar: korisnik uploaduje ličnu sliku u Profil > Tema > Avatar;
  prikazuje se kao dugme za meni (desno u topbaru); fallback inicijali
- Logo firme kartica: dugme "Ukloni sliku" + ruta /podesavanja/logo/ukloni
- Logo zona iz podešavanja uklonjena; jedan iOS toggle za prikaz loga u topbaru
- Migracije 049 (topbar_logo_slika/tekst) i 050 (avatar_putanja na korisnicima)
- iOS-style .toggl switch u main.css
2026-06-16 02:46:48 +02:00
Dasko 0f1f65c7f7 feat(magacin): nivelacija — promena cene uz trag (Faza A)
Tabela nivelacije (migr 045) beleži svaku promenu prodajne cene:
artikal, stara→nova cena, razlog, izvor, korisnik, datum. Dva okidača:
posebna akcija „Promeni cenu" (modal, izvor 'rucno') i auto-trag pri
izmeni artikla (izvor 'izmena'). PromeniCenu je transakciono (update
cene + upis zapisa). Pregled /nivelacije sa filterom perioda i razlikom
(+/− i %). Modal otvara svoj nextElementSibling — radi i na mobilnom
uprkos dupliranim id-jevima iz dva rasporeda.
2026-06-14 09:37:49 +02:00
Dasko 76b147074d feat(pdv): prodaja → KIR automatski (Faza 2b-1)
Kad se sačuva prodaja na klijenta (PDV obveznik), zapis se sam zavede u
KIR (model.KirIzProdaje grupiše stavke po stopi). Storno/brisanje prodaje
uklanja vezani KIR zapis (ObrisiPoIzvoru). Maloprodaja građanima (bez
klijenta) se preskače — ide preko fiskalizacije (Faza 3). Helper
modulUkljucen; auto-zapisi u UI nemaju ručno brisanje. Test.
2026-06-14 02:45:07 +02:00
Dasko 26c829fef3 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 15995167b7 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 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
Dasko b112d46e4e feat(2fa): rezervni (jednokratni) kodovi za 2FA
Alternativa TOTP-u kada uređaj nije dostupan. Po CLAUDE.md 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 9aaafa2358 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 125fc4772a 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 2dc2cf5245 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 ffb77ed122 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 726a1dbbf7 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
Dasko a99920d102 Popravka sidebara: kolaps, podmeni i HTMX navigacija 2026-06-08 19:29:17 +02:00
Dasko 16b993933c Bezbednosni audit i refaktoring: HP popravke, RBAC, flash poruke, go:embed, CSP 2026-06-07 22:41:09 +02:00
Dasko 8cec26a03f Refaktoring: uklanjanje globalne teme i app pozadine, dozvole u podešavanja, UI ispravke
- Uklonjena globalna tema i pozadinska slika aplikacije (ostala samo lična pozadina po korisniku)
- Uklonjena animacija treperenja pozadine pri navigaciji; dodat sessionStorage za instant prikaz
- Dozvole premeštene iz sidebar-a u Podešavanja → Sistem; vidljive i adminu (samo Radnik kolona)
- Admin može menjati samo dozvole uloge Radnik, superadmin menja i Radnik i Admin
- Zatamnjivanje kartice NTech na stranici prijave — novi slider u Podešavanja → Izgled
- Upozorenje na dashboard-u (kritične zalihe) — popravljen kontrast boje
2026-06-06 21:07:01 +02:00
Dasko 5d94ea34cf Izmena u radu tema 2026-06-06 17:47:52 +02:00
Dasko 6a3500c25a Podešavanja: accordion podmeni, podsekcije Opšte/Izgled/Sistem, glassmorphism prijava, kontrast teksta 2026-06-06 02:58:12 +02:00
Dasko 8def13e855 Podešavanja: pozadinska slika i glass efekt za aplikaciju sa live preview sliderom 2026-06-05 23:49:05 +02:00
Dasko 9af712edd3 Flash poruke: toast notifikacije umesto ?greska= i ?sacuvano= u URL-u 2026-06-05 23:15:49 +02:00
Dasko 2b3636528f Bezbednost: ispravke kontrole pristupa u admin i handler sloju 2026-06-05 22:41:20 +02:00
Dasko ccc08aee08 Dodato go:embed - disk-first logika za statičke fajlove i šablone 2026-06-04 20:14:03 +02:00
Dasko 08b9359a76 Embed implementacija, animacije, sidebar hover 2026-06-04 02:50:48 +02:00
Dasko d68aaba787 Evidencija prijava — login_istorija tabela, logovanje svih pokušaja, stranica istorije po korisniku, WebAuthn shema 2026-06-03 22:05:00 +02:00
Dasko ed7ae605b2 Bezbednost — security headers, fail2ban logovanje, bruteforce zaštita, CSRF zaštita 2026-06-03 21:38:16 +02:00
Dasko 974d76360a Optimizacije — SQLite WAL, template keš, gzip kompresija, build skript 2026-06-03 21:18:12 +02:00
Dasko 2401f6d5ec Ispravka QR koda za 2FA — generisanje na serveru kao base64 PNG 2026-06-02 22:29:53 +02:00
Dasko def84e1a69 Dodavanje modula prodaje — lista, forma, detalji, provera stanja, vraćanje pri brisanju 2026-06-02 17:53:50 +02:00
Dasko 7800c3842d feat: dodata podrška za servise
Dodana osnovna funkcionalnost za upravljanje servisima:

- Novi model (`internal/model/service.go`)
- SQLite repository (`internal/db/sqlite/service.go`)
- Handler (`internal/handler/service.go`)
- Tri nove stranice (lista, detalji, forma)

Izmenjeni:
- main.go
- repository.go
- utils.go
- handler.go
2026-06-02 00:15:30 +02:00
Dasko f05c93edd2 Dodavanje modula klijenata — lista, forma, izmena, brisanje, ispravka migracije 2026-06-01 23:40:52 +02:00
Dasko bdf1069fbd Dodavanje modula dobavljača i nabavki 2026-06-01 23:21:14 +02:00
Dasko b0ea50578f Magacin — forma puna širina, responsive popravke 2026-06-01 02:49:46 +02:00
Dasko acf8cada0e Dodavanje podešavanja u bazu, logo zona sa tri opcije 2026-06-01 01:16:37 +02:00