Commit Graph
142 Commits
Author SHA1 Message Date
Dasko f68d415f5b Servis: garancija u formi izmene, kartica Ukupno, povraćaj delova pri brisanju
- 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
2026-06-22 17:20:45 +02:00
Dasko 5c8517d439 Servis: pojednostavljena forma Izmeni nalog
Izmeni nalog sada ima samo: Uređaj, Tehničar, Avans, Napomena. Uklonjene
kartice Klijent i Status i datumi (status se menja u detaljima, klijent je
vezan pri prijemu), procena od/do, cena rada (računa se iz radova) i
garancija. Nazad/Odustani vode na detalje naloga. Handler čuva postojeće
vrednosti (status, cene, klijent, garancija, datum završetka) da ih prazna
forma ne pregazi.
2026-06-22 16:47:08 +02:00
Dasko ec1ea3511d Servis: zabrana ručnog postavljanja statusa Čeka delove
Čeka delove je automatski status (kad nedostaje deo). Server odbija ručni
ulazak iz bilo kog drugog statusa, a dropdown više ne nudi tu opciju
osim ako je nalog već u njoj.
2026-06-22 16:25:15 +02:00
Dasko 413a808075 Servis: self-heal pri otvaranju detalja — povuci dostupno stanje u potraživane
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.
2026-06-22 16:19:19 +02:00
Dasko e1b1205c4a Servis: ispravka logike potraživanih delova (5 bugova)
- 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
2026-06-22 16:13:16 +02:00
Dasko de8ed588e4 Servis: hook potraživanih delova i pri direktnoj izmeni količine artikla 2026-06-22 15:47:05 +02:00
Dasko 1f007b80b8 Servis: pokrivanje potraživanih delova skida magacin i otključava nalog 2026-06-22 15:42:22 +02:00
Dasko 4123e1c08e Servis: nabavka automatski vraća nalog iz Čeka delove na Primljeno 2026-06-22 15:26:12 +02:00
Dasko 427af5d5a9 Servis: uklonjen status U dijagnostici 2026-06-22 15:23:22 +02:00
Dasko 2f7e99bfd0 Servis: otključavanje naloga pri nabavci potraživanih delova
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.
2026-06-22 15:19:50 +02:00
Dasko 1a56f6966e Servis: potrazivani delovi, garancija, zakljucavanje statusa
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.
2026-06-22 03:17:29 +02:00
Dasko a66b49958c Servis delovi: merge istog artikla, poravnanje, reset magacina
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.
2026-06-22 02:29:07 +02:00
Dasko 110b3e87eb Servis: vizuelni indikator prekoracenja — backorder i crvena boja
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.
2026-06-22 02:05:53 +02:00
Dasko 63a5c72ca9 gofmt -s -w . — formatiranje celog projekta 2026-06-22 02:05:46 +02:00
Dasko afbc0b6083 Servis: prekoračenje dela prebacuje nalog u Čeka delove
Kad tražena količina dela prelazi magacinsko stanje, deo se ne ugrađuje (lager ne
ide u minus), a nalog se automatski prebacuje u status Čeka delove uz poruku da se
naruči deo.
2026-06-22 01:20:16 +02:00
Dasko f46094b5d6 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 0bb3dc76de 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 1b508f816b 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 8ac46c3ffd 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 9e73c4fb38 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 e28bd84fa5 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 04471c8df5 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 cf26c23088 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 1d2df826bf 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 7f0abc5ed1 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 43fabfe474 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 84c21beab4 Kartica artikla: prikaz vezanih dobavljača sa dodavanjem/uklanjanjem; helper telefon (064/123-4567); CLAUDE.md frontend i formatiranje sekcije 2026-06-21 01:34:15 +02:00
Dasko 0bc794c1d7 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 a8aaa33781 Nabavka: predlog cene pri izboru artikla; forma artikla: dvosmerno marža↔prodajna cena 2026-06-21 00:01:09 +02:00
Dasko 3ed86309ca Klijenti: smanji prikaz na 50 po stranici 2026-06-20 22:52:43 +02:00
Dasko e3444a9b4b Klijenti: filter po tipu (Svi/Firme/Fizička lica) preko radio dugmadi 2026-06-20 22:49:56 +02:00
Dasko 12668aa95f 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 6e4a042ed6 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 8341e5632f 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 817fbf0ee2 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 1a995d2f48 Formatiranje: poravnanje whitelist mape u podesavanja.go 2026-06-20 14:03:07 +02:00
Dasko 450326465d Logo: otpremanje i greške vode na /admin/podesavanja/opste umesto stare stranice 2026-06-20 13:52:56 +02:00
Dasko 288b4cdc7c Podešavanja: Sistem, Servis i Kalkulacije ostaju na istoj stranici posle čuvanja 2026-06-20 13:36:31 +02:00
Dasko abf9f6ce16 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 6899d7087b 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 7abaaccf33 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 8c43bc3c21 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 d02cd7b232 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 f9c7b3701e 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 9e3ad8238b 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 c5d463450c 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 1c9247e239 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 5d49317b3c 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 5f796f6ecf 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 fbbc15c721 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