Commit Graph
135 Commits
Author SHA1 Message Date
Dasko 8e06b9cd97 Servis: Code128 barkod na vrhu nalepnice (laserski skener) 2026-06-23 02:54:42 +02:00
Dasko 966e940993 Servis: nalepnica za uređaj (70×40 mm) sa QR kodom 2026-06-23 02:46:36 +02:00
Dasko 7465b7e40f Servis: garancija kao trajanje u danima + Tehničar → Serviser
- 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)
2026-06-23 02:35:49 +02:00
Dasko c3d42ec821 Servis: popup izmena polja u detaljima (predviđen datum, garancija, tehničar)
- 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)
2026-06-23 02:10:43 +02:00
Dasko bdce399592 Servis: auto-snimanje forme izmene + hx-boost navigacija (bez bljeska)
- 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
2026-06-23 01:08:14 +02:00
Dasko 3e5d27f0a2 Servis: predviđen datum popravke (prijem + rok iz podešavanja, readonly) 2026-06-22 23:55:20 +02:00
Dasko 4987f68af1 Servis: polja Tražene nadogradnje i Napomena klijentu (auto-snimanje) 2026-06-22 19:39:49 +02:00
Dasko 818500ed8f 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 65c07172f9 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 cb4e36d1e1 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 9acfb2919c 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 7516f49571 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 b3739e3210 Servis: hook potraživanih delova i pri direktnoj izmeni količine artikla 2026-06-22 15:47:05 +02:00
Dasko 45f5db14d8 Servis: pokrivanje potraživanih delova skida magacin i otključava nalog 2026-06-22 15:42:22 +02:00
Dasko 2388d413f1 Servis: nabavka automatski vraća nalog iz Čeka delove na Primljeno 2026-06-22 15:26:12 +02:00
Dasko d6e45c45da Servis: uklonjen status U dijagnostici 2026-06-22 15:23:22 +02:00
Dasko 2c589eaae0 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 d4dcecb3ea 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 06b016b0d2 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 53793549a2 gofmt -s -w . — formatiranje celog projekta 2026-06-22 02:05:46 +02:00
Dasko 26152c3328 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 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 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 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 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 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 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 02f767b863 Logo: otpremanje i greške vode na /admin/podesavanja/opste umesto stare stranice 2026-06-20 13:52:56 +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 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 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