Commit Graph
100 Commits
Author SHA1 Message Date
Dasko 9927484da3 Servis detalji: select umesto datalist, bez skoka i treperenja
Izbor usluge/artikla je sada običan <select> (otvara se jednim klikom, ima
native pretragu kucanjem, prikazuje samo naziv bez '(N kom)') umesto datalist
combobox-a koji je tražio dvostruki klik. Kategorija filtrira artikle, 'U magacinu'
i kontrole su poravnate u istom redu. Skok na vrh rešen čuvanjem/vraćanjem
scrollTop pravog scroll kontejnera (#sadrzaj), uz bez-anim protiv treptaja.
2026-06-22 01:07:28 +02:00
Dasko 4a9cdb3631 Servis detalji: glatko osvežavanje bez treperenja i skoka
Sve forme na detaljima (dodavanje/brisanje rada i dela, promena statusa) sada
osvežavaju ceo #glavni-sadrzaj preko data-refresh umesto punog reloda: status
badge se ažurira odmah, nema skoka na vrh ni treptaja pozadine. AJAX grana dodaje
bez-anim reflow (CSS #glavni-sadrzaj.bez-anim) i re-izvršava inline skripte da se
combobox pretrage ponovo povežu nakon zamene.
2026-06-22 00:42:59 +02:00
Dasko 1637f65f95 Servis detalji: radovi (usluge) na nalogu + UX popravke
Nova sekcija Radovi: biraš uslugu iz cenovnika (pretraživ datalist combobox),
cena se predloži ali je možeš izmeniti, količina; zbir radova = cena rada,
ukupno = radovi + delovi. Tabela servis_radovi + repo + handleri.
Combobox pretraga i za artikle (delovi). Skinuta kartica Cene sa detalja.
Dodavanje/brisanje rada i dela osvežava samo svoju tabelu (data-refresh) bez
skoka na vrh i treptaja; data-potvrda sada koristi requestSubmit da prolazi kroz
AJAX logiku. Popravljen CSRF (_csrf) i tip kolone datum kod radova.
2026-06-22 00:17:12 +02:00
Dasko 9a8e9a00cf Magacin: rezervisani prefiksi USL- i TRO- za šifre
Artikal ne sme imati šifru sa prefiksom USL-/TRO- (provera u parseFormuArtikla,
važi za nov i izmenu); kôd kategorije ne sme biti USL/TRO da auto-šifra ne padne
u rezervisani prostor usluga i troškova.
2026-06-21 23:35:14 +02:00
Dasko 53de1f3211 Troškovi: zaseban modul (šifrarnik vrsta troškova)
Opcija 1 — katalog dodatnih troškova (Prevoz, Carina, Ambalaža) koji se vezuju
za radni nalog i ulaze u cenu koštanja. Zaseban entitet: tabela troskovi (šifra
TRO-001…999, naziv, podrazumevana cena, opis), repo, handleri, forma i lista.
Stari tip-filter handler uklonjen iz magacina. (Knjiga rashoda firme je zaseban
budući modul — Opcija 2.)
2026-06-21 23:18:44 +02:00
Dasko 7c365272f4 Usluge: zaseban modul (cenovnik usluga)
Usluga je zaseban entitet, ne artikal: svoja tabela usluge (naziv, šifra,
jedinica mere, cena, PDV, opis), repo, handleri i forma. Auto-šifra USL-001…999,
jedinica mere (usluga/sat/kom). Bez nabavne/prodajne cene, dobavljača, lagera i
marže. /usluge lista + CRUD; stari tip-filter handler uklonjen iz magacina.
2026-06-21 23:04:56 +02:00
Dasko 9cfc1cc4f3 Magacin: razdvojeni Magacin/Usluge/Troškovi i izbačen Tip iz forme
ArtikalFilter dobija polje Tip; zajednički magacinPrikaz parametrizovan tipom
servi listu proizvoda (/magacin), usluga (/usluge) i troškova (/troskovi) preko
istog šablona (OsnovniUrl za HTMX). Sidebar dobija stavke Usluge i Troškovi.
Magacin forma više ne nudi izbor tipa — artikal je uvek proizvod.
2026-06-21 22:31:19 +02:00
Dasko 2f4caabcdb Servis: prijem-fokusirana forma, kanban tabla i arhiva
Novi nalog svodi se na prijem (Avans/kapara + Napomena); status/datumi/garancija
i procene/cena rada vidljivi samo u izmeni. Stranica Servis postaje kanban tabla
sa 5 aktivnih kolona (Primljeno → ... → Završeno), mobilni vertikalno. Preuzeti
nalozi izdvojeni u arhivu (GET /servis/arhiva, servis_arhiva.html).
2026-06-21 21:20:17 +02:00
Dasko 9a1fe7b956 Servis novi nalog: auto-detekcija JMBG/lične karte i kompaktnija forma
Uklonjen izbor 'Vrsta dokumenta' — tip identifikacije se prepoznaje iz dužine
unosa (13 cifara JMBG, 9 broj lične karte) preko odrediTipIdentifikacije i tako
upisuje u bazu. Polja klijenta složena u parove po redu za oba tipa lica.
2026-06-21 19:17:27 +02:00
Dasko 3def86ddb9 Klijent: validacija JMBG (13 cifara) i kontakt osoba za pravno lice
parseFormuKlijenta i mozdaKreirajKlijenta proveravaju JMBG kad je izabran taj
tip identifikacije. Forma pravnog lica dobija sekciju Kontakt osoba (ime/prezime);
neaktivna sekcija se onemogućava da server ne dobije duplu vrednost. renderujStandalone
parsira šablon sa root imenom i šablonskim funkcijama (kao kreirajKes).
2026-06-21 19:07:38 +02:00
Dasko a744317316 Podešavanja: matični broj, poslovna jedinica i kompaktniji raspored
Opšte → Firma: dodato polje Matični broj (validacija 8 cifara) i nova grupa
Poslovna jedinica (naziv, oznaka, opština, grad) za fiskalizaciju. Polja firme
upakovana u parove (forma-grid-3 klasa, responsive).
2026-06-21 19:07:07 +02:00
Dasko 6f5b799404 Fisk: fiskalni mock server (myLPFR) sa pokretačem fisk-test.sh
Kartica (bezbednosni element) čita profil firme iz NTech baze (read-only):
PIB, MB, naziv, adresa, poslovna jedinica. Fiksni test PIN. U git ide kod i
locale; generisani računi, QR, logovi i pycache su ignorisani.
2026-06-21 19:06:35 +02:00
Dasko 8bdefd0561 Klijent: izbor JMBG/Br. lične karte i kontakt osoba za pravno lice
- Nova kolona tip_identifikacije ('jmbg'/'licna_karta'), migracija 062; postojeći klijenti podrazumevano 'jmbg'
- model.Klijent: polje TipIdentifikacije + helper OznakaIdentifikacije za prikaz
- sqlite/klijent.go: kolona u svim upitima (Lista, DohvatiID, ListaFilter, Kreiraj, Izmeni)
- parseFormuKlijenta i mozdaKreirajKlijenta čitaju tip_identifikacije (fallback 'jmbg')
- Forme klijenta i servisnog naloga: selektor vrste dokumenta + polje vrednosti
- Servisni nalog: kontakt osoba (ime/prezime) za pravno lice
- Validnost broja (JMBG 13 cifara, broj lične karte) ostavljena za kasnije
2026-06-21 12:28:39 +02:00
Dasko 045ea766f1 Servis novi nalog: kartice, izbor/kreiranje klijenta, novi broj naloga
- Forma naloga razdvojena u zasebne kartice (Uređaj, Klijent, Status i datumi, Cene/Napomena)
- Nova kartica Klijent: radio fizičko/pravno, živa pretraga postojećih (Alpine, CSP-safe) po punom imenu/imenu/prezimenu odnosno nazivu firme; izbor postojećeg ili unos novog
- Enter u pretrazi bez izbora popunjava polja novog klijenta (ime/prezime ili naziv firme)
- SacuvajNalog/SacuvajIzmenaNaloga: helper mozdaKreirajKlijenta kreira novog klijenta iz forme kada nije izabran postojeći
- Broj naloga: format SN-MMGG-NNN sa mesečnim resetom brojača (001-999)
- Dodat CSRF token u formu naloga (POST je ranije vraćao 403)
- Šablonski helper json za ugradnju liste klijenata u Alpine
2026-06-21 12:15:59 +02:00
Dasko 337267acd4 Kartica artikla: prikaz vezanih dobavljača sa dodavanjem/uklanjanjem; helper telefon (064/123-4567); frontend i formatiranje sekcije 2026-06-21 01:34:15 +02:00
Dasko 54825a9e27 Dinari: formatiranje preostalih iznosa (PDV KIR/KPR/obračun, nivelacije, stanje zaliha) 2026-06-21 01:08:58 +02:00
Dasko cf8a616bb1 Dinari: formatiranje iznosa u Alpine tabelama stavki (nova nabavka i prodaja) preko fmtDin 2026-06-21 01:05:45 +02:00
Dasko 313c918e1a Dinari: formatiranje iznosa sa separatorom hiljada (helper dinari/dinariCeli); nabavka po dobavljaču (auto-veza, filter artikala, izbor dobavljača u formi artikla); UI doterivanja stavki nabavke 2026-06-21 01:00:56 +02:00
Dasko aefc21916e Nabavka: predlog cene pri izboru artikla; forma artikla: dvosmerno marža↔prodajna cena 2026-06-21 00:01:09 +02:00
Dasko 15782c6b92 Liste: interaktivna pretraga za dobavljače; poruka 'za datu pretragu nema rezultata' kad pretraga ne vraća ništa 2026-06-20 23:49:42 +02:00
Dasko 7808db63b5 Klijenti i Magacin: ukloni dugme Traži; pretraga poštuje filtere (tip/kategorija); gašenje animacije pri pretrazi u klijentima 2026-06-20 23:00:27 +02:00
Dasko 98972b2772 Klijenti: smanji prikaz na 50 po stranici 2026-06-20 22:52:43 +02:00
Dasko c8d2131487 Klijenti: filter po tipu (Svi/Firme/Fizička lica) preko radio dugmadi 2026-06-20 22:49:56 +02:00
Dasko f57d71783b Magacin: ukloni bljesak animacije pri sidebar navigaciji (reflow na afterSwap) 2026-06-20 22:37:51 +02:00
Dasko dce8446322 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 37fe129de7 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 d59ec02f3a 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 88c34e2b7e 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 d6fa9a74a0 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 e4c0bc8799 Formatiranje: poravnanje whitelist mape u podesavanja.go 2026-06-20 14:03:07 +02:00
Dasko 57592928b1 Logo u topbaru: svič ga pokazuje/skriva odmah bez reloda cele strane 2026-06-20 13:57:22 +02:00
Dasko 02f767b863 Logo: otpremanje i greške vode na /admin/podesavanja/opste umesto stare stranice 2026-06-20 13:52:56 +02:00
Dasko 4b5f269f62 Ispravka: data-full-reload koristiti hasAttribute umesto dataset (prazan atribut je falsy) 2026-06-20 13:45:37 +02:00
Dasko 6348604fc3 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 f97f48ccf5 Podešavanja: Sistem, Servis i Kalkulacije ostaju na istoj stranici posle čuvanja 2026-06-20 13:36:31 +02:00
Dasko 57826ff41b Tema: pozadina se primenjuje na stranicu tek posle čuvanja, preview ostaje izolovan 2026-06-20 13:30:08 +02:00
Dasko c59bdb2997 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 6249a0a526 Tema: preview animacije se ponavlja odmah pri promeni brzine slajdera 2026-06-20 13:22:19 +02:00
Dasko 4f5f41a183 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 3d1a1cc752 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 7778e6ebdb 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 a8fbe9af81 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 88889e9599 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 b21ac02e94 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 dc12f323b0 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 73b717dc36 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 761d1bd947 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 6305160cff 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 bd2e781139 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 a2353d642e 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 d9b6387a93 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 a5dc104e29 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 c730705051 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 b8c918e427 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 74b7c88d99 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 c6aa28a760 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 a0af51ab82 Ispravka: dodat favicon na samostalne stranice (prijava, setup, 2FA) 2026-06-19 19:10:12 +02:00
Dasko 8298bffb5f Dashboard: inline stilovi → CSS klase, hover zatamnjuje ikone u glass modu 2026-06-19 02:51:55 +02:00
Dasko be5ab92be2 Dokumentacija: vraćen link na demo.vm-net.in.rs 2026-06-19 02:38:49 +02:00
Dasko fb530cb161 Dokumentacija: uklonjena referenca na iz README 2026-06-19 02:35:17 +02:00
Dasko de17974d50 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 be3c3452a6 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 809d29ea49 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 0facee00d1 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 1929803528 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 4467211ddd 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 3e79d94558 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 ad04dfcd17 Bezbednost: ažuriran golang.org/x/image v0.38.0 (Dependabot CVE — OOM via TIFF) 2026-06-18 02:25:55 +02:00
Dasko 9e76e10307 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 5518d2071c 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 3048b1e808 Bezbednost: _next whitelist umesto url.Parse (CodeQL taint analiza) 2026-06-16 03:37:01 +02:00
Dasko 18dd2fc460 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 3054041257 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
DaskoandGitHub f4670b7716 Merge pull request #6 from dalibor31/alert-autofix-9
Potential fix for code scanning alert no. 9: Bad redirect check
2026-06-16 03:16:59 +02:00
DaskoandGitHub f036fe4010 Potential fix for code scanning alert no. 9: Bad redirect check
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-06-16 03:13:43 +02:00
DaskoandGitHub 7b55e55c26 Merge pull request #5 from dalibor31/feature/topbar-logo-avatar
Feature/topbar logo avatar
2026-06-16 03:04:25 +02:00
Dasko 5f8c72c2e9 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 684fc67ba4 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 289b004424 Magacin: pretraga po nazivu, lokaciji i kategoriji; ispravka skakanja dashboard kartica
- artikal.go: pretraga obuhvata naziv, lokaciju i naziv kategorije (OR LIKE)
- main.css: dashboard stat kartice dobijaju stagger delay da ne krenemo pre view-transition
- base.html: vraćen <link rel="preload"> za sliku pozadine (uklonjen greškom)
2026-06-16 02:04:32 +02:00
Dasko 677b94be98 Ispravka boje tačke na kritičnim zalihama i uklanjanje CSS warning-a
- Boja tačke na kritičnim zalihama: crvena kad je količina upola manja od minimalne
- Uklonjen preload pozadinske slike (nepotreban, izazivao warning u konzoli)
- @view-transition umotan u @supports da ne izaziva warning u browserima koji ne podržavaju
2026-06-16 01:40:43 +02:00
Dasko 9dcacba872 Dashboard: linkovi sa stat kartica na odgovarajuće stranice
Artikala na stanju -> /magacin
Aktivnih servisa -> /servis
Prihod ovog meseca -> /izvestaji
Kritično niska zaliha -> /magacin?kriticni=1
2026-06-15 23:55:10 +02:00
Dasko 09666f98a4 Merge feature/knjigovodstvo: knjigovodstveni modul
Profil firme i moduli, PDV evidencija (KIR/KPR) sa auto-punjenjem, PDV obračun + PP-PDV,
uvoz robe (006/106), šifarnik PDV stopa, kalkulacija prodajne cene (marža po
kategoriji/artiklu, zavisni troškovi, dvosmerni izračun) i nivelacija uz trag.
# Conflicts:
#	web/templates/stranice/magacin.html
#	web/templates/stranice/nabavka_forma.html
2026-06-14 17:49:33 +02:00
Dasko b3d5c8d041 docs: README — knjigovodstvene funkcije (kalkulacija, nivelacija, PDV, uvoz) 2026-06-14 17:45:35 +02:00
Dasko fa037df836 Merge feature/kw-podesavanja-kalkulacija: podstavka „Kalkulacija i PDV" + ispravka mobilnih stavki nabavke 2026-06-14 17:41:41 +02:00
Dasko 20e091e262 fix(nabavka): mobilni prikaz stavki — ukloni inline display:none
Inline display:none na .stavke-kartice nadjačavao je @media iz main.css, pa se na
telefonu nije video nijedan raspored stavki. Prikaz sada vodi samo CSS klasa.
2026-06-14 17:40:54 +02:00
Dasko e41a491d17 feat(podesavanja): podstavka „Kalkulacija i PDV" — marža + PDV stope na jednom mestu
- PdvStope handler: dodata podrazumevana marža; stranica „podesavanja-kalkulacija-pdv",
naslov „Kalkulacija i PDV", ruta /admin/podesavanja/kalkulacija-pdv
- pdv_stope.html: sekcija „Kalkulacija" (forma marže preko /podesavanja/sacuvaj) iznad šifarnika
- marža uklonjena iz stranice „Sistem"
- sidebar: podstavka „PDV stope" → „Kalkulacija i PDV"
2026-06-14 17:40:38 +02:00
Dasko 13b9386d85 Merge feature/kw-kalkulacija-prodajna: dvosmerna marža↔prodajna + status PDV obveznika 2026-06-14 17:16:58 +02:00
Dasko 0fcf6719e3 Merge feature/kw-uvoz: uvoz robe — KPR zastavica i PPPDV 006/106 2026-06-14 17:16:58 +02:00
Dasko 0e7247c9c1 feat(nabavka): dvosmerna marža↔prodajna + poštovanje statusa PDV obveznika
- ručni unos prodajne cene preračunava maržu (izracunajMarzu): obrnuta formula
marža = (prodajna / (nabavna × (1+pdv/100)) − 1) × 100
- kalkulacija poštuje da li je firma PDV obveznik: ako nije, prodajna se ne
uvećava za PDV (pdvStopa = 0); PodaciFormeNabavke.PdvObveznik → JS _ntechPdvObveznik
- proširena kolona „Marža %" da se vidi cela vrednost
2026-06-14 17:16:24 +02:00
Dasko 73d893a4d6 feat(pdv): uvoz robe — KPR zastavica i mapiranje u PPPDV 006/106
- migracija 048: kolona uvoz na pdv_kpr (0=domaća nabavka, 1=uvoz)
- model PdvKpr.Uvoz; MapirajPPPDV(kir, kprDomace, kprUvoz) rutira uvoz u 006/106,
domaće u 008/108; test ažuriran + uvozni scenario
- repo: KPR Lista/DohvatiID/Kreiraj čitaju i pišu uvoz
- obračun: KPR se razdvaja na domaće/uvozne; obaveza ostaje na ukupnom KPR-u
- KPR forma: kvačica „Uvoz (JCI)"; lista: oznaka UVOZ uz broj dokumenta
2026-06-14 17:16:01 +02:00
Dasko 2f719de9ea Merge feature/kw-kalkulacija-troskovi: Faza C — marža po kategoriji/artiklu + zavisni troškovi (§5.4) 2026-06-14 16:24:31 +02:00
Dasko 6b5db5186d feat(nabavka): UI zavisnih troškova — forma i prikaz u detaljima (Faza C, celina 2)
- forma nabavke: sekcija „Zavisni troškovi" (slobodne stavke naziv+iznos,
dodavanje/uklanjanje) + izbor metoda raspodele (po vrednosti / po količini)
- JS: kalkNabavna (kalkulativna nabavna po stavci, prati server) i preracunajSve —
promena troška/metoda/količine/cene preračunava prodajne svih stavki
- detalji nabavke: prikaz zavisnih troškova, metoda raspodele i ukupnog iznosa
- handler DetaljiNabavke dohvata troškove (DohvatiTroskove)
2026-06-14 16:23:11 +02:00
Dasko a66d966d45 feat(kalkulacija): Faza C — marža po kategoriji/artiklu + zavisni troškovi (backend)
Celina 1 (kompletna) — marža po kategoriji/artiklu:
- migracija 046: nullable marza na artikli i kategorije
- model Marza *float64 (Artikal, Kategorija) + KategorijaMarza u ArtikalSaKategorijom
- repo: čitanje/pisanje marže; nove DohvatiID/Izmeni za kategoriju
- dozvola kategorija.izmeni; handler IzmeniKategoriju + ruta
- UI: polje marže u formi artikla i kategorije; modal izmene kategorije
- nabavka: fallback predlog marže artikal → kategorija → globalna (izaberiArtikal)
Celina 2 (backend) — zavisni troškovi nabavke:
- migracija 047: tabela nabavka_troskovi + kolona metod_raspodele na nabavke
- model NabavkaTrosak, MetodRaspodele; čista funkcija RasporediTroskove + test
- repo: Kreiraj upisuje troškove i metod; DohvatiTroskove
- handler: parsiranje troškova/metoda; kalkulativna nabavna cena na serveru
UI forme troškova i prikaz u detaljima nabavke slede.
2026-06-14 16:12:03 +02:00
Dasko f7ff8f98cc Merge feature/kw-kalkulacija-nivelacija: kalkulacija i nivelacija (§5.4 — Faza A i B) 2026-06-14 15:33:46 +02:00
Dasko 878b93726d style(ui): hover kartice — blagi zoom (scale 1.02) umesto podizanja 2026-06-14 10:14:05 +02:00
Dasko 443df348d5 feat(nabavka): kalkulacija — formiranje prodajne cene pri nabavci (Faza B)
Po stavci nabavke: marža% (predpopunjena globalnom iz podešavanja,
kalkulacija_marza) i prodajna cena = nabavna × (1+marža/100) × (1+PDV/100),
živo računato u Alpine, izmenjivo. Na čuvanje se ažurira nabavna+prodajna
cena artikla (ArtikalRepo.AzurirajCene) i upiše nivelacija 'kalkulacija';
prazna/nulta prodajna se preskače. ArtikliJSON nosi pdv_stopa. Postavka
podrazumevane marže u Podešavanja → Sistem.
2026-06-14 10:13:56 +02:00
Dasko 61900ad022 feat(ui): grupa „Knjigovodstvo" u sidebaru (Nivelacije, KIR, KPR, Obračun)
Kolapsibilni podmeni (isti obrazac kao Podešavanja); samostalni linkovi
Nivelacije i KIR/KPR/Obračun objedinjeni pod jednu grupu. Vidljivost:
KIR/KPR/Obračun po modulu pdv + dozvoli pdv.pregled, Nivelacije po
artikal.izmeni; grupa se prikazuje ako je bar jedno dete vidljivo.
2026-06-14 09:52:09 +02:00
Dasko 6ce3d39679 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 4baab33f5d Merge feature/kw-pdv-evidencija: PDV evidencija (Faza 2 — KIR/KPR, auto-punjenje, obračun, PPPDV) 2026-06-14 09:03:27 +02:00
Dasko e35bc5d2e5 feat(pdv): PPPDV mapiranje na stranici obračuna
model.MapirajPPPDV preslikava zbirove KIR/KPR na polja zvaničnog
obrasca PPPDV (001-005/103-105, 006-009/106-109, 110, povraćaj) u
celim dinarima; zbirovi se računaju iz zaokruženih polja. Uvoz
(006/106) i nadoknada poljoprivredniku (007/107) se ne prate → 0.
Sekcija PPPDV dodata na /pdv/obracun. Prikaz za popunjavanje, ne
elektronska predaja.
2026-06-14 08:53:18 +02:00