Commit Graph

245 Commits

Author SHA1 Message Date
Dasko 4caadd2ef0 Magacin: ukloni bljesak animacije pri sidebar navigaciji (reflow na afterSwap) 2026-06-20 22:37:51 +02:00
Dasko fec84f98d5 Ispravke: QR proxy šema, race šifra, JM validacija, zaštita zaliha, magacin history flash
- servis.go: qrNalogURL helper čita X-Forwarded-Proto za ispravan HTTPS QR kod iza proxy-ja
- magacin_forma.go: šifra se generiše pre INSERT (uklanja race condition); normalizujJM validacija 4 kar.; blokada promene tipa ako postoji stanje na lageru
- prodaja.go + repository.go: Obrisi beleži magacinsku promenu (PromenaPovracaj) uz korisnikID; ispravljeni zamenjeni potpisi interfejsa ServisRepository/ProdajaRepository
- kategorije.html: UI hint kada kategorija nema kôd (prefiks šifre)
- 061_backfill_kategorija_kod.sql: popunjava kod postojećim kategorijama iz naziva
- magacin.html: htmx:beforeHistorySave sklanja bez-anim pre snimanja snapshota (fix flash animacije)
2026-06-20 21:43:34 +02:00
Dasko b0250b2917 Artikli: šifre, tip i jedinica mere; magacin UI; servis predračun
Šifre artikala:
- Kôd kategorije kao prefiks auto-šifre (PREFIKS-NNNN), otporno na brisanje (max+1)
- Tip artikla (proizvod/usluga/trošak) i jedinica mere
- Arhiviranje artikala umesto brisanja kad su već u prometu

Magacin:
- Paginacija 50 po stranici
- Klikabilna šifra (vodi na karticu), opisniji placeholder pretrage
- Ispravka: pretraga više ne okida animaciju redova (globalni htmx listener
  umesto hx-on atributa koji se ne okida u ovoj htmx verziji)
- Dugmad akcija ne prelamaju tekst; uklonjen content-visibility (secanje pri skrolu)

Servis: predračun (nova stranica i ruta)
2026-06-20 18:40:01 +02:00
Dasko a8f368ca06 Paginacija, interaktivna pretraga i optimizacija prikaza
- Dodata server-side paginacija za magacin (127 artikala) i klijente (1040)
  — Limit/Offset u ArtikalFilter i KlijentFilter, 100 po stranici
  — PrebrojiPoFilteru za izračunavanje ukupnog broja stranica
- Interaktivna pretraga (search-as-you-type) sa HTMX:
  — hx-trigger="keyup changed delay:300ms" na polju pretrage
  — HTMX menja samo #magacin-rezultati / #klijenti-rezultati
  — Polje pretrage ostaje u fokusu tokom osvežavanja
- Popravljena pretraga klijenata po imenu i prezimenu:
  — Dodato (ime || ' ' || prezime) LIKE u sva tri upita
  — "Ivana Lazić" sada pronalazi klijenta
- CSS optimizacije za velike liste:
  — content-visibility: auto na redovima tabela i karticama
  — contain-intrinsic-size za stabilan scroll
  — animation-delay produžen do 20. reda / 10. kartice
2026-06-20 16:19:42 +02:00
Dasko 064d6dfa2a Bezbednost: ntechToast koristi textContent za tekst poruke (XSS zaštita)
CodeQL js/xss-through-dom — flash poruku server HTML-escape-uje, ali textContent
je dekodira, pa bi innerHTML ponovo interpretirao sadržaj kao HTML. Sada tekst
ide kroz textContent, a samo statički SVG kroz innerHTML.
2026-06-20 14:12:13 +02:00
Dasko 1068bb12e0 Bezbednost: limit veličine upload tela, anti-enumeracija pri prijavi, strings.Cut
- CSRF middleware postavlja MaxBytesReader (6 MB) za multipart pre parsiranja —
  pojedinačni upload handleri nisu mogli da ograniče veličinu jer čitanje _csrf
  polja već parsira celo telo
- prijava: dummy bcrypt poređenje kada korisnik ne postoji, da vreme odgovora
  bude isto kao kod postojećeg korisnika (sprečava enumeraciju imena)
- podesavanja: strings.Split(...)[0] zamenjen sa strings.Cut
2026-06-20 14:07:38 +02:00
Dasko 8c0e9d50a0 Formatiranje: poravnanje whitelist mape u podesavanja.go 2026-06-20 14:03:07 +02:00
Dasko 6f0ad3f29c Logo u topbaru: svič ga pokazuje/skriva odmah bez reloda cele strane 2026-06-20 13:57:22 +02:00
Dasko 070f9384cf Logo: otpremanje i greške vode na /admin/podesavanja/opste umesto stare stranice 2026-06-20 13:52:56 +02:00
Dasko fa717208c5 Ispravka: data-full-reload koristiti hasAttribute umesto dataset (prazan atribut je falsy) 2026-06-20 13:45:37 +02:00
Dasko 8855b5b84f Podešavanja Opšte: reload stranice posle čuvanja da se odmah vidi logo i naziv u topbaru 2026-06-20 13:42:15 +02:00
Dasko 45e4863ebb Podešavanja: Sistem, Servis i Kalkulacije ostaju na istoj stranici posle čuvanja 2026-06-20 13:36:31 +02:00
Dasko 8e1cf67618 Tema: pozadina se primenjuje na stranicu tek posle čuvanja, preview ostaje izolovan 2026-06-20 13:30:08 +02:00
Dasko fd35408da7 Tema: slajderi za pozadinu primenjuju se odmah bez refresha
CSS custom properties umesto hardkodovanih vrednosti u <style> bloku;
Alpine  ažurira --app-blur, --app-overlay, --app-glass-* direktno na :root
2026-06-20 13:27:20 +02:00
Dasko 755f56f87a Tema: preview animacije se ponavlja odmah pri promeni brzine slajdera 2026-06-20 13:22:19 +02:00
Dasko 4047f035da Admin: ispravke AJAX toast-a za sve akcije korisnika i dozvola
- base.html: toast pri učitavanju stranice ako URL sadrži ?sacuvano=1 (pokriven i cross-page redirect)
- admin.go: svih 9 SetFlash(uspeh) zamenjeno sa redirect ?sacuvano=1 (korisnici, profil, dozvole)
2026-06-20 13:15:54 +02:00
Dasko 2937acfcc1 Servis: javni status nalog + ispravke AJAX čuvanja
- Dodat javni token na servisni nalog (migracija 057), QR kod vodi na /status/{token}
- Nova javna stranica /status/{token} — bez prijave, za klijente
- Sve forme sa "Sačuvaj izmene" koriste ?sacuvano=1 umesto SetFlash za uspeh
- AJAX logika: toast + ostanak samo kad pathname ostaje isti; inače navigacija
- Ispravke: PDV stope, KIR, KPR, podešavanja izgled, storno prodaje, nivelacija, delovi naloga
2026-06-20 13:04:23 +02:00
Dasko f7a5d2673b Tema: slider za brzinu animacije, zamena scaleIn sa blurIn, AJAX čuvanje
- nova animacija blurIn (zamagljivanje) umesto scaleIn koji je izgledao isto kao fadeIn
- slider za brzinu animacije (0.1s–0.8s, korak 0.1) premešten u karticu animacije
- brzina i vrsta animacije čuvaju se jednim klikom, iz istog forma
- nova kolona lokalna_brzina_animacije u bazi (migracija 056)
- AJAX čuvanje profil/tema: nema reload stranice, scroll ostaje, toast notifikacija
- otpremnica vidljiva samo za status Završeno/Preuzeto; radni nalog skriven kada završeno
- toast notifikacije sa punom bojom pozadine (svetla i tamna tema)
2026-06-20 12:42:11 +02:00
Dasko 880456a5ba UI: toast notifikacije umesto zelene kartice na vrhu stranice
Poruke o uspehu (.poruka-uspeh) konvertuju se u toast obaveštenje
u donjem desnom uglu — animacija ulaska, nestaje posle 4 sekunde,
klik za brže zatvaranje; JS sakriva original odmah pri učitavanju
2026-06-20 01:38:42 +02:00
Dasko 32d7813be6 Nabavke/Servis: nabavna cena u modalu, QR kod na otpremnici
- Modal +Novi artikal u nabavkama dobio polje nabavne cene pored prodajne
- QR kod dodat u zaglavlje otpremnice (isti mehanizam kao na radnom nalogu)
2026-06-20 01:37:34 +02:00
Dasko 10f62abf84 Servis: QR kod na štampanom nalogu
QR kod se generiše server-strano (skip2/go-qrcode) i ugrađuje kao
base64 PNG u zaglavlje štampe — skeniranjem se otvara nalog u programu
2026-06-20 01:11:29 +02:00
Dasko 07b851f0cf Magacin: dodato polje nabavne cene u formu za artikal
Polje NabavnaCena postojalo je u modelu i bazi ali nije bilo
prikazano niti čitano iz forme — sad se prikazuje pored prodajne cene
2026-06-20 01:08:26 +02:00
Dasko cb192a15e1 Servis: ispravke labela i CSRF tokena
- „Cena rada" ujednačeno na svim stranicama (detalji i otpremnica koristile „Cena usluge")
- CSRF token u inline status formi ispravljeno na name="_csrf"
2026-06-20 00:50:14 +02:00
Dasko 41e6282404 Servis: inline promena statusa direktno iz detalja naloga
- Novi POST /servis/{id}/status ruta sa dozvolom servis.izmeni
- AzurirajStatus metoda u repou — menja samo status; pri prelasku u
  Završeno/Preuzeto automatski postavlja datum_zavrsetka ako nije već setovan
- Dropdown sa svim statusima i dugme „Promeni" u zaglavlju stranice detalja
2026-06-20 00:45:25 +02:00
Dasko b65fb02146 Izveštaji: servisni prihod broji samo preuzete naloge
SQL upit MesecniPrihodServis filtira po status = 'Preuzeto' — prihod se ne
prikazuje dok klijent nije preuzeo i platio uređaj
2026-06-20 00:42:30 +02:00
Dasko 0f4056bd03 Servis: preimenovanje labela, čuvanje garancije pri toglu, avans na otpremnici
- „Konačna cena" → „Cena rada" u formi i štampanom nalogu
- toggleGarancija čuva prethodnu vrednost datuma pre brisanja i vraća je pri ponovnom uključivanju
- Otpremnica ne prikazuje red avansa kada je avans 0 ili nije unesen
2026-06-20 00:41:54 +02:00
Dasko 5f017fd7ed Servis: pregled troškova, auto-cena delova, modalni prozor za potvrdu
- Detalji naloga prikazuju cenu usluge, ugrađene delove, ukupno i za naplatu kao zasebne stavke
- Otpremnica uključuje stavku ugrađenih delova u obračun
- Biranje artikla u formi za delove automatski popunjava cenu po komadu
- Zamenjen confirm() sa prilagođenim modalnim prozorom za sve potvrde
2026-06-20 00:40:29 +02:00
Dasko 86cbace213 Izveštaji: popis magacina (inventura)
- Nova stranica /izvestaji/popis — forma za unos stvarnog stanja
- Razlika se prikazuje u realnom vremenu (JS) dok se kuca
- Pri snimanju: samo izmenjene količine upisuju se kao korekcija
  u magacinske_promene sa napomenom (podrazumevano "Godišnji popis")
- Nova metoda KorigujKolicinu u ArtikalRepository — transakciona,
  ažurira kolicina i upisuje promenu tipa korekcija
- Link Popis (inventura) dodat na stranicu izveštaja
2026-06-19 19:56:02 +02:00
Dasko a3c68632be Izveštaji: prometni list magacina i stanje zaliha
- Prometni list: sve promene magacina po periodu (filter od/do datuma),
  bojama označeni tipovi promena (ulaz/prodaja/servis/povraćaj/korekcija)
- Stanje zaliha: svi artikli sa stanjem, min. količinom, cenama i
  ukupnom vrednošću zalihe; kritične zalihe istaknute crvenom bojom
- Brzi linkovi na oba izveštaja sa glavne stranice izveštaja
2026-06-19 19:53:06 +02:00
Dasko 4cf061e89a Servis: dodata otpremnica pri preuzimanju uređaja
- Nova stranica /servis/{id}/otpremnica — dokument za klijenta
- Prikazuje: isporučilac/primalac, uređaj, opis radova, delovi,
  obračun sa odobitkom avansa, garancijski rok, prostor za potpise
- Dugme Otpremnica dodata pored Radni nalog u detaljima naloga
2026-06-19 19:48:48 +02:00
Dasko 8048834f87 Servis: dodata štampa servisnog naloga
- Nova stranica /servis/{id}/stampa — print-friendly A4 dokument
- Prikazuje: zaglavlje firme, broj naloga, status, klijent, tehničar,
  uređaj sa opisom kvara i pribором, ugrađene delove sa ukupnim iznosom,
  cene usluge i prostor za potpise
- Dugme Štampaj nalog dodata na stranicu detalja naloga
2026-06-19 19:46:05 +02:00
Dasko 695bb3e617 Magacin: dodata prometna kartica artikla
- Nova stranica /magacin/kartica/{id} — sve promene stanja po artiklu
- Prikazuje tip promene (ulaz/izlaz/servis/povraćaj/korekcija) sa bojama
- Dugme Kartica dodata u listu magacina (desktop i mobilni prikaz)
2026-06-19 19:42:08 +02:00
Dasko bdb0f4b1ae Magacin: dodati šifra i barkod artikla sa auto-generisanjem
- Migracija 055: kolone sifra i barkod u tabeli artikli (UNIQUE indeksi)
- Model, repozitorijum i handleri ažurirani za nova polja
- Pretraga u magacinu pokriva i šifru i barkod
- Forma predlaže sledeću šifru (ART-NNNNN), korisnik može izmeniti
- Ako se ostavi prazno, šifra se auto-dodeljuje po ID-u pri čuvanju
2026-06-19 19:35:24 +02:00
Dasko 9e4d658d05 Ispravka: dodat favicon na samostalne stranice (prijava, setup, 2FA) 2026-06-19 19:10:12 +02:00
Dasko a20d2baae2 Dashboard: inline stilovi → CSS klase, hover zatamnjuje ikone u glass modu 2026-06-19 02:51:55 +02:00
Dasko 057c17dcdd Dokumentacija: vraćen link na demo.vm-net.in.rs 2026-06-19 02:38:49 +02:00
Dasko 4c549934b6 Dokumentacija: uklonjena referenca na Project.md iz README 2026-06-19 02:35:17 +02:00
Dasko fa1d6d4927 Dokumentacija: ažurirani README, dodata start.sh skripta
- Readme.md i Readme_sr.md prošireni: demo mod, Docker uputstvo
  za produkciju i demo, promenljive okruženja (NTECH_SECRET,
  NTECH_TOTP_KEY), start.sh u strukturi projekta
- start.sh dodata u repozitorijum (uklonjena iz .git/info/exclude)
2026-06-19 02:33:00 +02:00
Dasko b1bbe12734 Hover kartica: zatamnjenje na pozadinskoj slici u podrazumevanom efektu
Kada je aktivan efekat "Podrazumevano (senka + ivica)" i postoji pozadinska
slika, hover kartica se zatamnjuje na rgba(0,0,0,0.38) — primetno tamnija
od ostalih. Ostali hover efekti nisu pogođeni.
2026-06-19 02:20:08 +02:00
Dasko b07297f323 Demo mod: Secure kolačići i blokada TOTP aktivacije
- Secure flag na kolačićima se postavlja i u demo modu (HTTPS kroz Caddy)
- Podešavanje 2FA je blokirano u demo modu — handler odbija zahtev,
  a šablon sakriva dugme i prikazuje obaveštenje
2026-06-19 01:54:36 +02:00
Dasko 1303b35387 Demo mod: embed fajlovi, keš šablona i immutable statika kao u produkciji
NTECH_ENV=demo je tretiran isto kao production za sve što se tiče
fajl sistema — embed umesto diska za CSS/JS/šablone, keš šablona pri
pokretanju, immutable Cache-Control za statičke fajlove.
2026-06-19 01:51:29 +02:00
Dasko 9cefd615ce Production/demo mod: auto-kreiranje ntech.env da se preskoči setup wizard
Ako ntech.env ne postoji pri pokretanju u production ili demo modu,
program ga kreira kao prazan fajl — podešavanja dolaze iz env promenljivih.
2026-06-19 01:45:05 +02:00
Dasko 1ab16c9efa Demo mod: ograničenje bekapa i blokada promene lozinke
- Bekap se ograničava na 2 kopije u demo modu (umesto 7)
- Promena lozinke je blokirana u demo modu — handler odbija zahtev,
  a šablon sakriva formu i prikazuje obaveštenje korisniku
2026-06-19 01:16:24 +02:00
Dasko 1cfb44b9a4 Demo mod, favicon ispravka i putanja ntech.env uz bazu
- NTECH_ENV=demo aktivira demo mod: korisnik Demo/Demo1234 (admin)
  se kreira ili resetuje pri svakom pokretanju
- Login ekran u demo modu prikazuje pre-popunjena polja i "DEMO verzija"
- ntech.env se čuva u istom direktorijumu kao SQLite baza (umesto
  uvek u radnom direktorijumu) — rešava Docker volume problem
- favicon.svg: uklonjen width="100%" koji je sprečavao prikaz ikone u brauzeru
2026-06-19 01:11:40 +02:00
Dasko 851edb06a4 Bezbednost: ažuriran golang.org/x/image v0.38.0 (Dependabot CVE — OOM via TIFF) 2026-06-18 02:25:55 +02:00
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 b417ff6d02 Verzija na login ekranu; konsolidacija build skripti
- Prijava: prosleđuje h.Verzija šablonu i prikazuje je ispod forme
- start.sh: objedinjena skripta (verzija, okruženje, platforma, UPX, build, Docker push)
- build.sh: obrisano (zamenjeno sa start.sh)
2026-06-16 22:20:47 +02:00
Dasko be180b3e58 Bezbednost: _next whitelist umesto url.Parse (CodeQL taint analiza) 2026-06-16 03:37:01 +02:00
Dasko 532f95848c Bezbednost: open redirect i kolačići bez Secure atributa
- _next parametar: sanitizacija preko url.Parse (Host+Scheme prazan = relativan URL)
  umesto ručnog string check-a koji CodeQL nije prepoznavao
- Kolačići: dodat Secure atribut (true u produkciji, false u razvoju)
  na 4 mesta: ntech_sesija brisanje (auth.go, prijava.go),
  ntech_flash_greska postavljanje i brisanje (auth.go, dashboard.go)
2026-06-16 03:32:07 +02:00
Dasko f9af825a27 Bezbednost: ispravka otvorene redirekcije (open redirect)
- podesavanja.go: _next parametar sada odbacuje putanje koje počinju sa "//"
  (npr. "//evil.com" prolazilo je staru proveru jer počinje sa "/")
- profil.go: Referer zaglavlje se parsira i koristi samo putanja (RequestURI),
  bez hosta — sprečava preusmeravanje na spoljne domene
2026-06-16 03:22:45 +02:00