- Prihod meseca: izbačeni stornirani nalozi, servis preko naplaceno+avans
- Servis KIR: neto cena + PDV po stvarnoj stopi (PdvKir.DodajNeto), bez hardkodovanih 20%
- TopKlijenti: samo preuzeti nalozi sa naplatom/avansom
- Izveštaji: mesečni ključevi sidreni na 1. u mesecu (bez preliva dana)
- BUG-04: konačna cena servisa bez dvostrukog računanja delova
- Dashboard: uklonjena kartica „Prihod ovog meseca"
- Default port 3000
- Dodati testovi: prihod/storno/delovi/nivelacija/KIR/mesečni ključevi
- PDV uslovi (Moduli.pdv) na: predračun, otpremnica, garantni list, prodaja_stampa
- Modal za preuzimanje: jedna cena (sa/bez PDV), ne duplo
- Javna status stranica: PDV uslovi za cene, predlog, checkbox-ove
- Svi print templejti: viewport=device-width+min-width, bez responsive
- JavniToken generisan za postojeće naloge bez tokena (QR popravka)
- UkupnoSaPdv() metode na ServisniRad i ServisniDeoSaArtiklom
- UkupnoBezPdv() na StavkaProdaje
Dodat FiskalRepository.DohvatiPoServisu (repo + interfejs)
PodaciDetaljiNaloga.FiskalniRacun — učitava se pri otvaranju detalja
Kartica u servis_detalji.html — PFR broj, vreme, brojač, QR, link ka PURS-u
Migracija 083: rekreira fiskalni_racuni tabelu sa servis_id (nullable) i bez FK constraint-a
Model: dodat ServisID int64 polje
Repo: INSERT/SELECT sada koristi i servis_id
Handler: fiskalizujServis koristi ServisID umesto negativnog ProdajaID
Migracija 082: nacin_placanja i naplaceno na servisni_nalog
Model, repo, handler — pun lanac za čuvanje naplate
fiskalizujServis helper — šalje radove+delove ka PFR serveru
Modal za Preuzeto dobio izbor načina plaćanja (Gotovina/Kartica/Virman)
- Dodati handleri za prihvatanje i odbijanje predloga sa mobilnog
- Prihvatanje: predložene stavke prelaze u ugrađene (predlozeno 1→0)
- Odbijanje: brišu se predložene stavke
- Komentar klijenta uz odluku (textarea na mobilnom, prikaz u detaljima)
- Oznaka na kanbanu za naloge sa predlozima (narandžasta tačka + leva ivica)
- Oznaka na kanbanu za poruku klijenta (💬 dugme, tap za prikaz)
- Spojene kartice Radovi/Predložene usluge i Delovi/Predloženi delovi
- Auto-detekcija predlozeno=1 kad status != Primljeno
- Obrisana Otključaj/Zaključaj dugmad
- Ukupno sa predlogom na javnoj status stranici
- CSRF middleware premešten u zaštićenu grupu
- Migracija 078: komentar_klijenta
- Repo metode: ObrisiPredlozene, AzurirajKomentarKlijenta
- Popravljeno: 405 na odbij, duple rute, razmak između kartica
- Cena dijagnostike u Podešavanja → Servis; na nalogu se predlaže iz podešavanja
- Odbijanje popravke: status Završeno + naplata samo dijagnostike (popravka_odbijena),
sklanjaju se Radovi/Delovi, Ukupno = dijagnostika
- Kartica Nalaz dijagnostike preimenovana u Utvrđeni kvar; editabilna samo u dijagnostici, kasnije readonly
- Nova kartica Urađeno (polje uradjeno) — upis dok je U popravci/Čeka delove, posle readonly
- Dugmad statusa: Završi u U popravci; promena statusa osvežava ceo sadržaj
- Predračun dostupan od Primljeno; radni nalog u U dijagnostici/Čeka delove
- Dropdown radova izostavlja već dodate usluge; kartica radova se osvežava pri izmeni
- Javni status: badge U dijagnostici, prikaz utvrđenog kvara, wordwrap naziva u tabeli
- Štampa: prelom između stavki, ponavljanje zaglavlja, završni blok bez preloma
- Garancija se u detaljima prikazuje kao trajanje na srpskom (npr. „1 mesec i 15 dana",
„2 meseca", „20 dana"); helper garancijaTekst + srpska deklinacija
- Nova kolona garancija_dana (trajanje od završetka); garancija_do ostaje za fazu Završeno
- Modal: textbox „Trajanje garancije (dana)" umesto kalendara; Podrazumevano i Bez garancije
- Nova ruta/handler AzurirajGarancijaDana; forma izmene čuva trajanje (ne briše)
- Podešavanja → Servis: rok garancije prebačen iz meseci u dane (servis_garancija_dana, default 60)
- „Garancija do" uklonjena iz forme Izmeni nalog (kod arhiviran u docs/);
SacuvajIzmenaNaloga čuva garanciju iz baze da je auto-snimanje ne pregazi
- Prikazni tekst „Tehničar" → „Serviser" svuda (identifikatori Tehnicar/tehnicar_id netaknuti)
- Klik na vrednost otvara modal (obrazac kao „Promeni cenu" u Magacinu);
snima se na zatvaranje modala, samo ako je vrednost promenjena (bez dugmeta Sačuvaj)
- Predviđen datum vraćen u bazu kao ručni override (migracija 071); ako nije
postavljen, prikaz računa izvedeni default (prijem + rok iz podešavanja)
- Nove rute/handleri AzurirajPredvidjenDatum i AzurirajTehnicar
- Garancija usklađena između modala i forme „Izmeni nalog" (isti izgled i logika);
dugme „Podrazumevano" (prijem + meseci) na oba mesta
- Checkbox „Bez garancije" čita stanje iz baze; odčekiravanjem se u kalendaru
prikaže datum (garancija iz baze ili podrazumevani)
- Validacija: garancija ne može biti pre datuma prijema (frontend min + backend)
- Forma Izmeni nalog snima se automatski (change na celoj formi, X-Autosave→204), bez dugmeta Sačuvaj
- Ispravka: trazene_nadogradnje je NOT NULL — slati prazan string umesto NULL
- Iz kartice detalja uklonjeni dropdown statusa i datum završetka
- Forma izmene više ne ubacuje težak JSON svih klijenata (nepotreban u izmeni)
- Navigacioni linkovi (Kategorije, Izmeni, Nazad) dobili hx-boost — swap #glavni-sadrzaj bez punog reloda, pozadina ne trepće
- Forma izmene: polje Garancija do sa kvačicom Bez garancije, pored Avansa; veći razmak između kartica
- Detalji: kartica Ukupno (usluge + ugrađeni delovi) pre zone za brisanje
- Brisanje naloga vraća ugrađene delove na stanje u magacin (transakcija), čisti potraživane delove
Pri otvaranju detalja naloga, ako za potraživani artikal ima stanja na
magacinu, automatski se povlači (delimično ili u celosti) i skida sa lagera.
Hvata sve načine na koje stanje poraste (i brisanje dela, povraćaj prodaje),
ne samo nabavku/izmenu/popis. Dodat test za delimično pokrivanje.
- BUG 1: pokriveni deo se sada prebacuje u ugrađene delove (servisni_delovi),
ne samo skida sa magacina — roba više ne nestaje iz evidencije
- BUG 2: DodajDeloNalogu sada atomično (UgradiIliPotrazuj) čita stanje i
ugrađuje u istoj transakciji — nema TOCTOU, lager ne ide u minus
- BUG 4: direktna izmena količine artikla beleži magacinski trag (korekcija)
- BUG 5: greška pri dodavanju dela se propagira korisniku, ne guta se
- uklonjen mrtav kod (Dodaj, DodajIliUvecaj) sa pogrešnim komentarom o minusu
- migracija 068: cena_komada u potraživanim delovima
- test TestPotrazivaniTok pokriva ceo tok
Nakon što nabavka poveća stanje artikla, SacuvajNabavku poziva
ProveriIPocistiZaArtikal koja FIFO briše/smanjuje potraživane redove.
Kada nestanu svi potraživani redovi, nalog izlazi iz Čeka delove.
Nova tabela servisni_potrazivani_delovi — visak preko stanja ide u potrazivane, lager NE ide u minus. Merge istog artikla na nalogu. Vizuelni indikator prekoracenja u tabeli (crveno). Status zakljucan na Ceka delove dok ima potrazivanih. Garancija: kalendar sa default vrednoscu. data-refresh podrzava vise selektora. Brisanje dela brise i potrazivane. Inline animation:none za AJAX refresh.
Dodaj: isti artikal na istom nalogu sabira kolicinu (bez duplikata). CSS: #deo-umagacinu height 38px — poravnat sa inputima. JS: reset event vraca U magacinu na — nakon dodavanja.
Dozvoljen backorder ugradnje delova (lager ide u minus), handler prebacuje nalog u Ceka delove, a JS boji polja crveno kad je kolicina > stanje. CSS klasa .prekoraceno umesto inline stilova.
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.
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.)
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.
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.
- 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
- 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
- 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)
Š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)
- 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
- 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
- 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)
- 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
- 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