Commit Graph
31 Commits
Author SHA1 Message Date
Dasko 9cf4e66f00 Ograničenje konekcija BE emulatora, sopstveni kontekst fiskalizacije nezavisan od prekida zahteva, validacija porta na setup stranici, serverska optimizacija kratke pretrage bez eval-a, testovi 2026-07-13 15:10:02 +02:00
Dasko bc60288a0d Sprečeno dupliranje prodaje/servisa, alat za usklađivanje šifri artikla, ispravke osvežavanja stranica, zaštita od duplikata kategorije/artikla/usluge/troška
- Prodaja i servis: broj naloga se generiše unutar transakcije upisa umesto unapred u handleru, čime se otklanja duplo kreiranje naloga pri dvostrukom slanju forme
- Servis izmena: uklonjen sudar generičkog i sopstvenog auto-snimanja forme (dva paralelna POST-a)
- Magacin: novi alat 'Uskladi šifre sa kategorijama' za masovnu ispravku šifri artikala posle uvođenja šifarnika po kategoriji
- Ispravljeno da forme na 9 stranica (kategorije, admin korisnici/dozvole, profil, podešavanja) posle akcije osveže prikaz umesto da ostanu zastarele do F5
- Kategorija, artikal, usluga i trošak: sprečeno dupliranje naziva/šifre/koda (UNIQUE indeksi + razumljive poruke grešaka)
2026-07-07 03:50:31 +02:00
Dasko edba23ae50 Storno kroz modal + ispravka about:blank u fiskalnom tabu Prodaje
- Servis i Prodaja: storniranje naloga sad ide kroz modal — dugme
  'Storniraj nalog' prvo traži potvrdu, tek onda otvara modal sa poljem za
  PIB/JMBG (kad je potrebno za refund); dugme 'Potvrdi storno' ostaje
  zaključano dok se polje ne popuni. Posle uspešnog storna modal se gasi i
  sadržaj stranice se osvežava (data-refresh=#sadrzaj).
- Dnevni pazar (Fiskalni presek): link u sidebaru i sve tri rute
  (FiskalniPazar, ZakljuciFiskalniDan, FiskalniIzvestaj) sad proveravaju
  modul fiskalizacije, ne samo RBAC dozvolu i tehničku dostupnost PFR-a.
- Prodaja: čekboks 'Prikaži fiskalni račun' se više ne nudi kad firma ne
  fiskalizuje, a pripremiFiskalniTab() više ne otvara prazan tab u tom
  slučaju — do sad je ostajao trajno na about:blank jer odredišna stranica
  nikad nije imala fiskalni račun da ga popuni. Dodata i odbrana za slučaj
  kad fiskalizacija jeste uključena ali PFR nije dostupan (zatvara osiroteli
  tab umesto about:blank).

Detalji u docs/Greške.md (van git-a).
2026-07-03 02:22:13 +02:00
Dasko 74d90cf2f2 Prodaja: sprečen dupli submit forme naplate (double-submit bag) 2026-07-01 23:01:06 +02:00
Dasko fd762a6527 Prodaja: modal naplate sa fiskalnim računom (kao u Servisu)
- dugme Naplati otvara modal (primljeno/kusur, način plaćanja, prikaz računa)
- primljeni iznos se prosleđuje u fiskalni zahtev radi tačnog Gotovina/Povraćaj
- nova ruta i handler za prikaz/štampu fiskalnog računa prodaje
- fiskalni tab se otvara preko imenovanog prozora (bez blokiranja popup-a)
- Fisk mock: refund se sada računa iz stvarnih plaćanja, ne fiksno 0
2026-07-01 21:03:47 +02:00
Dasko 1df83866df Prodaja: rešen hover na footer-u, auto-dodavanje nove stavke, X dugme za brisanje (CSP fix), naplati dugme 2026-07-01 20:14:21 +02:00
Dasko 8730acc599 Prodaja: skener barkoda, prilagodjeni dropdown artikala, ispravka cena sa/bez PDV-a po rezimu 2026-07-01 19:16:34 +02:00
Dasko 7fe40096cc Servis: dogruzavanje rezultata pri pretrazi postojećeg klijenta
Dropdown za pretragu klijenta u Novom nalogu je imao tvrdi limit od 100
rezultata. Sada radi po istom obrascu kao u Novoj prodaji — učitava po 30,
i dogrejava sledećih 30 kad korisnik skroluje do dna liste.
2026-07-01 16:57:09 +02:00
Dasko 046fcace8e Klijenti: adresa (obavezna za pravna lica) + prikaz svih podataka klijenta u Novoj prodaji
Zakon o PDV (čl. 42, sadržaj računa) zahteva adresu kupca na fakturi za
pravna lica — polje 'Mesto' (grad) samo nije dovoljno. Dodata kolona
adresa u klijenti, novo polje na formi, obavezno kad je tip pravno.

Kartica izabranog klijenta u Novoj prodaji sad prikazuje PIB/JMBG
(zavisno od tipa), adresu, mesto, telefon i email — svako popunjeno
polje u svom redu, samo kad je klijent već izabran.
2026-07-01 16:05:13 +02:00
Dasko 89fa31b392 Prodaja: filteri liste (period, storno) i pretraga klijenta u novoj prodaji
- Lista prodaje: filter po periodu (od/do), prečica 'Ovaj mesec', filter samo stornirano
- Nova prodaja: pretraga klijenta sa filterom tipa (sva/pravna/fizička lica) umesto
  običnog dropdown-a, sa dogruzavanjem rezultata pri skrolu
- Ispravljen nedostajući CSRF token u formi nove prodaje (POST je uvek padao na 403)
- Ispravljeno vizuelno poravnanje polja Način plaćanja
2026-07-01 13:55:00 +02:00
Dasko e9205665b6 Prodaja: cena/PDV po PDV statusu firme — non-PDV firma vidi bruto cenu i nultu stopu 2026-06-30 22:23:03 +02:00
Dasko 82a2484c10 Nabavka: broj računa, datum računa, PDV iznos + KPR backfill za stare nabavke 2026-06-30 20:25:44 +02:00
Dasko ac7c9df2eb prodaja: popust, kategorija, cene po režimu, pretraga, zabrana brisanja
Migracija 092: popust_procenat na stavke_prodaje.
Model: PopustProcenat u StavkaProdaje, KategorijaNaziv u StavkaProdajeSaArtiklom.
Repo: pretraga prodaje proširena na klijenta i napomenu. DohvatiStavke dodaje popust i kategoriju. Kreiraj primenjuje popust na ukupno.
Handler: artikalUJSONSaCenom proširen sa sifra, barkod, cena_sa_pdv, kategorija_naziv. parseFormuProdaje parsira popust. ObrisiProdaju sada koristi storno (zabrana fizičkog brisanja).
JS: prodajaForma ažurirana — pretraga artikala po nazivu/šifri/barkodu, popust polje, kategorija, kalkulacija sa popustom.
Forma: pretraga artikala, popust kolona, kategorija, PDV režim (cena/cena_sa_pdv). Responsive desktop+mobilne kartice.
Detalji: kategorija ispod naziva, popust kolona, 'Ukloni nalog' (storno) umesto 'Obriši'.
2026-06-30 19:14:40 +02:00
Dasko f61b3bd5ca Javno odobravanje predloga: Prihvati/Odbij sa komentarom
- 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
2026-06-24 02:41:06 +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 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 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 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 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 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 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 bf541cda72 feat(nabavka): brzi unos dobavljača i artikla iz forme nabavke
Dugmad otvaraju modale koji preko AJAX-a (X-Requested-With: fetch) čuvaju
novi zapis i vraćaju JSON; novi dobavljač se odmah ubacuje u listu i bira.
Modal artikla proširen na sva polja kao puna stranica. Centriranje modala
prebačeno u .modal-overlay klasu (x-show je brisao inline display:flex).
2026-06-14 08:16:51 +02:00
Dasko 95ac567673 fix(js): slajderi teme poštuju sačuvanu vrednost 0 pri učitavanju
Init je koristio parseInt(x) || podrazumevano, gde je 0 falsy pa je padao
na podrazumevanu vrednost — slajderi (blur, opacity, glassOpacity) su se
pri ulasku na stranicu resetovali ako je sačuvana vrednost bila 0. Dodat
helper broj() koji na podrazumevano pada samo kad vrednost nije broj.
2026-06-13 10:27:44 +02:00
Dasko c99887bb6f Magacin: modal za premeštanje + ujednačen slajder na svim brauzerima
Premeštanje artikla:
- Padajući <details> meni zamenjen nativnim <dialog> modalom (showModal),
koji ide u „top layer" pa je uvek iznad svega bez obzira na z-index/overflow.
- Dodato zatamnjenje pozadine (::backdrop) i fade in/out animacije
(@starting-style + transition-behavior: allow-discrete).
- Klik van modala, × dugme i Escape zatvaraju; klik na kategoriju i dalje
odmah premešta artikal.
Tema i HTMX:
- CSS modala premešten iz magacin.html (dodatni-css u headeru) u main.css,
jer se header ne menja pri HTMX navigaciji (hx-select=#glavni-sadrzaj),
pa je stil sada uvek prisutan.
- Modal prati svetlu/tamnu temu preko CSS promenljivih; kad je aktivna
pozadinska slika, glass-override u base.html ga čini providnim i zamućenim
kao kartice.
- Modal centriran (margin:auto, jer reset gazi UA podrazumevano) i pojačana senka.
Slajder (input[type=range]):
- Dodata zajednička klasa .klizac sa ručnim stilom za oba motora
(::-webkit-slider-* i ::-moz-range-*), da svuda izgleda kao u Firefox-u.
- Plava popunjenost pre glave: Firefox preko ::-moz-range-progress, Chromium
preko gradijenta i CSS promenljive --popunjeno koju postavlja JS.
- Svih 12 slajdera (profil_tema, podesavanja_izgled, podesavanja) prešlo sa
inline accent-color stila na klasu .klizac.
2026-06-10 00:05:40 +02:00
Dasko eb389dedf9 Magacin premeštanje, backup podešavanja, čišćenje RBAC sistema
Magacin:
- Dodato premeštanje artikla u drugu kategoriju (dugme + nativni
<details> meni, bez JS-a; radi na desktopu i mobilnom)
- Endpoint POST /magacin/premesti/{id} uz proveru dozvole artikal.premesti
Backup:
- Nova podešavanja: interval automatskog backupa i broj kopija (rotacija)
- Periodični backup uz onaj pri pokretanju; interval se čita iz baze
- Migracija 037_backup_podesavanja.sql
Dozvole (RBAC):
- Dodate kartice koje su nedostajale (dashboard.prihod, prodaja.storno,
podesavanja.login_pozadina, tema.lokalno) — popravljen i bug gde su se
gasile pri svakom čuvanju matrice
- Aktivirana kontrola pregleda za prodaju, servis, klijente i dobavljače
(provera u handlerima + skrivanje iz sidebara)
- Uklonjene mrtve/obmanjujuće dozvole iz matrice i sveAkcije (korisnici,
podsetnici, artikal.pregled, kategorija.izmeni, tema.globalno,
podesavanja.app_pozadina); sveAkcije 47 -> 34
- Čišćenje zastarelih redova (siročića) u tabeli dozvola pri startu
Ostalo:
- Statički fajlovi: embed celog web/static i ispravan MIME za .js/.css
- Keš šablona: dodat admin_dozvole (stranica Dozvole se nije otvarala)
- Sidebar accordion: radi i skupljen i proširen, međusobno isključiv
2026-06-09 00:55:15 +02:00
Dasko 19ecdf30a3 Popravka sidebara: kolaps, podmeni i HTMX navigacija 2026-06-08 19:29:17 +02:00
Dasko be74b22508 Premešten responsive CSS u main.css zbog HTMX navigacije
- Premešten sav responsive CSS (display: none za kartice, @media pravila)
iz {{define "dodatni-css"}} blokova u globalni main.css
- Pogođene stranice: nabavke, dobavljači, klijenti, magacin, servis,
prodaja, podsetnici, nabavka forma/detalji, servis forma, podešavanja
- Razlog: HTMX pri navigaciji menja samo <main> sadržaj, <head> ostaje —
page-specifičan CSS iz dodatni-css nije bio aktivan nakon navigacije
2026-06-07 22:41:09 +02:00