Commit Graph
503 Commits
Author SHA1 Message Date
Dasko e99dd50273 Prava ispravka: usluge/troskovi.datum_unosa promenjen na DATETIME u šemi
Umesto ručnog parsiranja (prethodni commit), migracija 103 rekreira obe
tabele sa DATETIME kolonom (kao svuda drugde u šemi) — SQLite ne podržava
ALTER COLUMN, pa je urađeno kreiraj-novu/prebaci-podatke/obriši-staru/
preimenuj. Fizički format podataka se ne menja (SQLite nema pravi numerički
afinitet za DATETIME nad ovakvim stringom), menja se samo deklarisani tip
kolone koji driver čita da odluči string vs time.Time pri Scan-u.

Uklonjen parseDatumUnosa workaround iz utils.go — skenirajUslugu/skenirajTrosak
sada rade identično kao svi ostali skenirajX helperi (direktan Scan u time.Time).

Potvrđeno: migracija testirana na praznoj i na postojećoj bazi sa podacima
(6 usluga, ID-jevi i datumi netaknuti), /usluge i /troskovi vraćaju 200.
2026-07-04 00:09:32 +02:00
Dasko 295fe0b9ff Ispravka: Usluge/Troškovi se nisu učitavali (regresija iz DatumUnosa time.Time izmene)
usluge.datum_unosa i troskovi.datum_unosa su TEXT kolone (ne DATETIME) —
modernc.org/sqlite driver za njih vraća string, ne time.Time, pa je Scan
direktno u *time.Time pucao sa "unsupported Scan ... string into *time.Time".

Dodat parseDatumUnosa helper (ručni time.Parse), koriste ga
skenirajUslugu/skenirajTrosak umesto oslanjanja na driver auto-konverziju.
2026-07-03 23:42:30 +02:00
Dasko 45ed942c56 Merge grane fix/code-review-nalazi: bezbednosne i integritetne popravke iz pregleda koda 2026-07-03 23:31:48 +02:00
Dasko d9f337617b Nizak prioritet iz pregleda koda: indeksi, greške, sitne popravke
- migracija 102: indeksi na FK kolonama (stavke_prodaje, servisni_delovi,
  servisni_potrazivani_delovi, magacinske_promene, stavke_nabavke, pdv_kir,
  pdv_kpr) — potvrđeno kreiranje i idempotentnost
- BrojKriticnihZaliha/KriticneZalihe filtriraju samo proizvode i aktivne
  artikle, usklađeno sa ArtikalRepo.Lista(SamoKriticni)
- url.QueryEscape na query string u magacin.go/klijent.go (paginacija)
- TestFiskalizacije/BeStatus vraćaju generičku poruku, detalj u slog
- SetFlash loguje grešku umesto tihog ignorisanja
- os.WriteFile/os.MkdirAll u main.go proveravaju grešku
- dummyHash generisanje panikuje na startu ako bcrypt ikad zakaže
  (umesto tihog sloma anti-enumeracije)
- PrihvatiPredlozene proverava redovi.Err()
- /healthz endpoint (DB ping)
- hx-boost na "Osveži" linkovima (blokirane_ip, fiskal_pazar)
- MaxBytesReader (4KB) na javne /status/{token}/* POST rute
- komentar u auth.go zašto postoje dva flash mehanizma (namerno, ne spojeno)

Provereno: jePrivatnaAdresa ne radi DNS lookup (nema net.LookupIP u repou),
pa DNS-rebinding nalaz iz pregleda nije primenljiv na trenutni kod.
2026-07-03 23:31:00 +02:00
Dasko 127cebea3c Srednji prioritet iz pregleda koda: konzistentnost, refaktor, sitne popravke
- konstantno-vremensko poređenje CSRF tokena i kartica-PIN-a
- CSRF grupa proširena na /prijava, /prijava/totp, /setup
- router-level dozvola na svim /admin/podesavanja/* i modul("fiskalizacija")
  na fiskal.pazar rutama
- KlijentRepo.Pronadji razlikuje sql.ErrNoRows od stvarnih DB grešaka
- izdvojen zajednički vratiStavkeNaStanje umesto 4 duplirana bloka
  (ProdajaRepo/ServisRepo Storno/Obrisi)
- datumi u KIR/KPR sada se upisuju/porede kao "2006-01-02", usklađeno sa KPO
- ArtikalRepo.DohvatiVise (batch dohvat) — ukida N+1 upite u SacuvajNabavku
- KategorijaRepo.Obrisi umesto direktnog SQL-a u handleru, sa
  ErrKategorijaUUpotrebi porukom
- KolicinMin -> KolicinaMin (tipfeler), Trosak/Usluga.DatumUnosa string -> time.Time
- dedup OznakaPoreskogBroja (KIR/KPR)
- inicijali() template funkcija (rune, ne bajtovi) za avatar inicijale
2026-07-03 23:21:29 +02:00
Dasko 49296e4315 Bezbednosne i integritetne popravke iz pregleda koda
- foreign_keys pragma po konekciji (DSN _pragma) — ranije aktivna na
  samo delu konekcija iz pula, rizik siročadi u bazi pri brisanju
- busy_timeout + _txlock=immediate za konkurentan pristup SQLite bazi
- ispravljen DnevniPrometMaloprodaje (DATE() -> substr) — dnevni pazar
  za KIR/KPO je bio uvek nula
- rate-limit (isti IP-bruteforce brojač) dodat na TOTP/2FA verifikaciju
- ispravljen nil-pointer u DodajDeloNalogu + uklonjeni debug logovi
- izvuciIP prihvata X-Real-IP/X-Forwarded-For samo sa poverljive
  (loopback/privatne) adrese — sprečava zaobilaženje bruteforce brave
- ispravljen naziv dozvole podesavanja.izmena -> podesavanja.izmeni
- brisanje artikala/kategorija prebačeno sa GET na POST (CSRF zaštita)
2026-07-03 23:00:44 +02:00
Dasko 4a94db7684 Izveštaji: prava zarada (cena - nabavna cena) za prodaju i servis
Nabavna cena se zamrzava na stavci prodaje i ugrađenom servisnom delu
u trenutku unosa (migracija 101), umesto naknadnog join-a na trenutnu
artikli.nabavna_cena. Tabela mesečnog prihoda sad prikazuje zaradu uz
prodaju/servis/ukupno, a grafikon dobija preklopljene tamne barove
(zarada) preko svetlih (ukupan prihod), odvojene za prodaju i servis.
2026-07-03 03:49:18 +02:00
Dasko 54e9439430 Merge grane feature/storno-modal-i-fiskalni-tab: storno modal, about:blank ispravka, dnevni pazar modul, štampaj kopiju u prodaji 2026-07-03 02:25:05 +02:00
Dasko 683764fd8a Detalji prodaje: 'Štampaj kopiju' fiskalnog računa umesto nejasnog 'Štampaj'
Uklonjeno dugme 'Štampaj' na vrhu stranice (vodilo na /prodaja/{id}/stampa,
nejasna svrha). Dodato 'Štampaj kopiju' u sekciju fiskalnog računa, isti
obrazac kao u Servisu — link na /prodaja/{id}/fiskalni-racun.
2026-07-03 02:24:05 +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 c87dc67857 Merge grane feature/greske-pravni-status: PDV profil i šifarnik stopa 2026-07-03 01:51:27 +02:00
Dasko 524c6de6ba PDV: profil firme blokira nemoguće kombinacije, stope iz šifarnika umesto hardkoda
- Podešavanja: nemoguća kombinacija (samo evidencija + PDV/fiskalizacija=da)
  se sad odbija i na serveru, ne samo u brauzeru (validirajProfilFirme).
- Servis: fiskalni račun/refund više ne iskazuje PDV kad firma nije PDV
  obveznik (stavkeFiskalnogServisa nulira stopu, isto kao Prodaja).
- Avans: uklonjena hardkodovana konstanta 20% PDV — stopa se sad uzima iz
  šifarnika (Podešavanja → Kalkulacija i PDV) ili je 0 kad firma nije
  obveznik.
- fiskal.NapraviZahtev: uklonjen fallback koji je prepisivao namerno
  postavljenu 0% stopu nazad na 20% (poništavao je zaštitu Prodaje za
  ne-PDV firme).
- Forme (usluge, artikli) i validacija PDV stope u prodaji sad koriste
  šifarnik umesto literala 20 / 0,10,20.

Detaljna pravna analiza i status svake stavke u docs/Greške.md (van git-a).
2026-07-03 01:50:57 +02:00
Dasko 85a2ee1b64 Bezbednost: superadmin može da odblokira IP adrese zaključane bruteforce zaštitom
Nova stranica /admin/blokirane-ip — lista IP adresa sa previše neuspelih pokušaja
prijave (broj neuspeha, poslednji pokušaj, preostalo vreme zaključavanja) i dugme
za ručno odblokiranje. Nova dozvola 'bezbednost.odblokiraj', namerno rezervisana
isključivo za ulogu superadmin (admin je nema — odblokiranje zaobilazi bruteforce
zaštitu). Repo metode PokusajiPrijaveRepo.ListaBlokiranih/Odblokiraj.
2026-07-02 21:24:25 +02:00
Dasko b35b41b82e Fiskalni pazar: izveštaj po datumskom periodu, zaključenje dana postaje opciono
Novi sistem fiskalizacije izveštava SUF kontinuirano po računu, pa presek stanja
(zaključenje dana) više nije zakonska obaveza — samo opcioni reset brojača na
ekranu. Dodata polja od/do datuma (podrazumevano danas) za preuzimanje izveštaja
nezavisno od toga da li je ikad urađen presek. Dugme 'Zaključi dan' preimenovano
u 'Resetuj brojače (opciono)', manje istaknuto, sa jasnijim opisom u potvrdi.
2026-07-02 21:24:17 +02:00
Dasko 576d963f28 Fiskalni pazar: ispravan Content-Disposition header i data-full-reload na formama 2026-07-02 20:19:20 +02:00
Dasko c82b17f9c1 Mock server: dnevni izveštaj sad generiše pravi PDF (reportlab + DejaVu Sans Mono) 2026-07-02 20:19:17 +02:00
Dasko fb80ee910c Sidebar: 'Dnevni pazar' premešten iz Podešavanja u Knjigovodstvo
Logično pripada uz KIR/KPR/KPO — operativna dnevna radnja, ne konfiguracija.
2026-07-02 19:19:20 +02:00
Dasko 7c215e70e8 Fiskalni pazar: presek stanja, dnevni izveštaj i razdvajanje praznina po prodaji/servisu
- Nova stranica fiskal_pazar: presek prometa od poslednjeg zaključenja, zaključenje dana, generisanje PDF izveštaja
- fiskal.go: dodati pozivi Presek/ZakljuciDan/GenerisiIzvestaj ka /api/financial/summary i /api/financial/report/summary
- PrazninaKnjigovodstva razdvojena na Prodaja/Servis varijante sa ID listama za direktne linkove sa dashboard-a
2026-07-02 19:14:54 +02:00
Dasko 56e52036b6 Servis: razdvojeno prikazivanje avansa/konačnog/refunda na fiskalnim računima
Dashboard: 'bez fiskalnog računa' razdvojeno na prodaju i servis (posebna
dugmad koja vode na tačan spisak, ne uvek na /prodaja).

Servis detalji: kartica 'Fiskalni račun' sad jasno razlikuje avansni od
konačnog računa; dodata posebna kartica za povraćaj viška avansa. Modal
za preuzimanje više se ne zaglavljuje kad avans pokrije ceo iznos (dugme
'Preuzmi' bez obaveznog unosa u polju Primljeno).

Štampa fiskalnog računa (/servis/{id}/fiskalni-racun) sad prioritetno
vraća konačan (Normal/Sale) račun umesto poslednjeg upisanog — ranije je
avansni povraćaj (upisan posle konačnog računa) prekrivao prikaz stvarne
fakture. Kad postoji i povraćaj viška avansa, štampa se u istom prozoru
odmah posle konačnog računa (izbegnut drugi popup koji brauzer blokira).
2026-07-02 13:30:45 +02:00
Dasko fcda706edd Servis: avans se fiskalizuje kao Advance/Sale, konačan račun ga zatvara
Avans se do sada nikad nije fiskalizovao — bio je samo interno polje. Zbog
toga je konačni fiskalni račun (pri preuzimanju) uvek prikazivao povraćaj
protiv PUNOG iznosa stavki, bez znanja da je avans već delimično plaćen.

Sad:
- avans se fiskalizuje kao Advance/Sale pri kreiranju/izmeni naloga
  (fiskalizujAvansServisa — fiskalizuje samo deltu ako se avans dopunjava)
- konačan Normal/Sale račun pri preuzimanju šalje advancePaid/advanceTax/
  advanceLastInvoiceNumber/advanceLastInvoiceDateTime — PFR sad zna za avans
  i tačno računa preostali dug i kusur
- ako avans premaši punu cenu, konačan račun se zatvara do pune cene, a
  razlika se automatski vraća posebnim Advance/Refund zahtevom
- servis_detalji modal prikazuje 'Avans premašuje cenu — vratiti klijentu X'
  umesto tihog svođenja duga na 0

Uzgred ispravljena dva mesta koja su koristila DohvatiPoServisu (samo
najnoviji zapis, bilo kog tipa) umesto DohvatiPoServisuITip(Normal,Sale):
- PromeniStatus je avansni račun pogrešno tretirao kao 'već fiskalizovano'
  i preskakao konačan račun kad god je nalog imao avans
- RetryFiskalizacija i FiskalGreska detekcija na servis_detalji stranici
  su imale isti problem — nalog sa avansom je izgledao fiskalizovan i
  dugme 'Pokušaj ponovo' se nije ni prikazivalo

PorezIzBrutoAvansa pretpostavlja opštu PDV stopu (20%) jer stavke u trenutku
uplate avansa još nisu poznate — nema opšteg rešenja bez pretpostavke.
2026-07-02 12:52:04 +02:00
Dasko ca1c8c8241 Servis: Garancija i Serviser se ne mogu menjati nakon preuzimanja
Dugme 'Promeni' za oba polja se sad krije kad je nalog u statusu Preuzeto —
garantni list je već izdat na osnovu garancije, a nalog je zatvoren pa nema
razloga za promenu servisera. Dodata i server-side provera u
AzurirajGarancijaDana/AzurirajTehnicar (ne samo skrivanje dugmeta u UI).
2026-07-02 12:24:04 +02:00
Dasko 5b39dfd222 Servis: 'Primljeno' iznos se sad stvarno šalje na fiskalni račun
Input 'Primljeno (din)' u modalu za preuzimanje je bio VAN <form> koji se
submituje — koristio se samo za JS prikaz kusura na ekranu, ali server ga
nikad nije primao. Fiskalni račun je uvek prikazivao Gotovina=dug (posle
avansa), Povraćaj=0,00, bez obzira šta je kupac stvarno predao.

Premešten input u POST formu; fiskalizujServis sad prima primljeno i šalje
max(dug, primljeno) kao Payment.Amount — PFR sam računa kusur, isto kao kod
Prodaje (fiskal.NapraviZahtev).

NAPOMENA: kad nalog ima avans, PFR i dalje računa povraćaj protiv PUNOG iznosa
stavki (ne umanjenog za avans), jer se avans nikad ne fiskalizuje kao posebna
transakcija — PFR ga ne 'vidi'. Za tačan kusur i u tom slučaju bi avans morao
biti fiskalizovan kao Advance tip transakcije pri uplati; to je veći, zaseban
zahvat.
2026-07-02 12:21:39 +02:00
Dasko 1027cfa526 Garantni list: uklonjene cene, ostaje samo šta garancija pokriva
Cene rada/delova nisu relevantne za garantni list — dokument treba samo da
pokaže na šta se garancija odnosi (naziv rada/dela, šifra, količina).
2026-07-02 12:08:26 +02:00
Dasko d0b08f7013 Eskalacioni list: predviđen datum i poziv klijenta (dijagnoza) auto-popunjeni
- 'Predviđeni datum završetka' je bio prazan iako servis_detalji stranica prikazuje
  računat default (datum prijema + rok iz podešavanja) — StampaEskalacionogLista
  nije primenjivala isti default, sad je usklađeno.
- 'Poziv klijenta (obaveštenje o dijagnozi)' se sad auto-popunjava datumom odluke
  kad klijent odgovori preko javne stranice (QR kod) — nema potrebe za ručnim
  unosom poziva ako je klijent već digitalno potvrdio da je obavešten.

'Poziv klijenta (obaveštenje o završetku)' ostaje ručno polje — ne postoji
ekvivalentan trag (klijent ne potvrđuje ništa preko javne stranice posle
završetka, samo je vidi).
2026-07-02 12:03:21 +02:00
Dasko 485adffdfb Servis: ispravljen 01.01.0001. na eskalacionom listu za nedogođene korake
LogDogadjaji je bio map[string]time.Time — kad ključ ne postoji (npr. nalog još
nije preuzet), index vraća nultu time.Time, a {{with}} u šablonu tretira struct
kao uvek istinit pa je ispisivao '01.01.0001. auto' umesto praznog polja za
ručni unos. Mapa sad čuva *time.Time — nedostajući ključ daje nil.
2026-07-02 11:58:42 +02:00
Dasko a606348180 Popis: štampa na A4 uspravno umesto vodoravno
@page je bio postavljen na landscape, a fiksni min-width:780px na body je terao
sadržaj šire nego što uspravna A4 stranica ima mesta. Smanjen font/padding u
tabeli da svih 10 kolona stane u uspravan format bez sečenja.
2026-07-02 11:47:23 +02:00
Dasko 9899c280c8 Servis: KIR backfill i detekcija praznina (kao Prodaja)
Servisni KIR upis nije imao nijedan mehanizam oporavka — ako auto-upis pri
preuzimanju padne, B2B servisni promet tiho ispadne iz PDV evidencije bez traga
za korisnika. Dodato po uzoru na Prodaju:
- kirKandidatiServisa (preuzeti nalozi sa identifikovanim kupcem)
- KirBackfillServisa ruta + dugme "Uvezi iz servisa" na KIR stranici
- PraznineKnjigovodstva sad broji i servisne KIR praznine (dashboard upozorenje)
2026-07-02 11:31:30 +02:00
Dasko f74cb04024 Servis: storno naloga (kao Prodaja/Nabavka) — KIR/KPO storno stavke, fiskalni refund
Do sada je jedini način da se poništi naplaćen/preuzet servisni nalog bio
fizičko brisanje (ObrisiNalog), koje ostavlja KIR/KPO/fiskalne zapise sa mrtvim
izvor_id — prihod ostaje prijavljen za nalog koji više ne postoji.

Migracija 100: servisni_nalozi dobija stornirano/razlog_storniranja (kao
prodajni_nalozi/nabavke). ServisRepo.Storno vraća ugrađene delove na stanje
ali NE briše nalog. Novi handler StornoNaloga (dozvola servis.storno):
- KIR/KPO original ostaje, dograđuje se storno stavka (model.KirStorno/KpoStorno)
- fiskalni refund (best-effort) preko refundujServis — Refund zahtev sa
  ReferentDocumentNumber ka originalnom PFR broju, isti obrazac kao stornirajProdaju
- ObrisiNalog sad odbija brisanje ako nalog već ima fiskalni/KIR/KPO zapis i
  upućuje na Storno

stornoBezRefunda (dashboard upozorenje) prošireno da prati i servisne stornose
bez uspešnog fiskalnog refunda, ne samo prodaju.
2026-07-02 11:30:55 +02:00
Dasko 3c61063bbb Servis: sprečeno dupliranje KIR/KPO/fiskalnog pri ponovnom Preuzeto; KPO redni_broj
Ponovni ulazak naloga u status Preuzeto (dupli klik, dupli submit modala naplate,
sekvenca Preuzeto→Završeno→Preuzeto) je ponovo pokretao fiskalizaciju i upis u
KIR/KPO bez provere da li već postoje — svaki ulazak je duplirao prihod i PDV
obavezu, a dashboard/backfill duplikat nikad nije prijavljivao jer je dovoljan
bio bar jedan zapis. Dodate PostojiZaIzvor/DohvatiPoServisu provere pre svakog
upisa (isti obrazac kao RetryFiskalizacija).

KIR upis servisa refaktorisan u model.KirIzServisa (deljeno sa budućim backfill-om).

KpoRepo.Kreiraj sad dodeljuje redni_broj automatski (COALESCE(MAX,0)+1) — kolona
je postojala u šemi ali se nikad nije popunjavala, pa knjiga o ostvarenom prometu
paušalaca nije imala redni broj koji Pravilnik zahteva.
2026-07-02 11:27:19 +02:00
Dasko 2cc9c24aa9 Servis: garancija po trajanju (dana) umesto fiksnog datuma
Garancija se sad čuva kao broj dana (GarancijaDana), a konkretan datum
(GarancijaDo) se računa tek kad nalog pređe u Završeno/Preuzeto — na osnovu
stvarnog datuma završetka, ne datuma prijema. Ranije se datum računao odmah
pri prijemu naloga, pa je garancija krenula da teče pre nego što je popravka
uopšte gotova.
2026-07-02 10:42:01 +02:00
Dasko e26bda5d34 KIR: prikaz sumnjivih duplikata (double-submit) preskočenih pri backfill-u
Na KIR stranici se sad vidi kartica sa B2B prodajama koje je automatski
backfill preskočio jer izgledaju kao dupli submit forme naplate (isti kupac
i iznos u roku od 60s) — sa objašnjenjem i linkom na ručni unos ili storno.
2026-07-02 10:41:53 +02:00
Dasko 45831467e0 Knjigovodstvo: storno prodaje/nabavke više ne briše KIR/KPR/KPO
Storno je fizički brisao vezani KIR/KPR/KPO zapis — zakon o računovodstvu ne
dozvoljava brisanje poslovnih knjiga (KPO dodatno ima redni broj bez prekida).
Sad se original čuva, a storno se dograđuje kao poništavajuća stavka
(negirani iznosi, referenca na original) — model.KirStorno/KprStorno/KpoStorno.

Usput ispravljen i pravi uzrok prijavljenog bug-a: kirKandidatiProdaje je
filtrirala samo internu mapu, ne i listu naloga koju obilazi KirBackfillProdaje
— stornirani nalozi su zbog toga dobijali ponovni (pogrešan) KIR upis.
2026-07-02 10:35:24 +02:00
Dasko 3a0f98622b Knjigovodstvo i fiskalizacija: dashboard upozorenje za praznine, KPO dozvole, pojednostavljen storno, ispravke verifikacije i kasira
- Dashboard kartica prikazuje naloge bez KIR/KPO/fiskalnog upisa i sumnjive duplikate (double-submit), sa zaštitom od automatskog dupliranja prihoda pri bulk dopuni
- Registrovane nedostajuće KPO dozvole (kpo.pregled/dodaj/obrisi) — modul je bio potpuno nedostupan
- Uklonjen suvišan/nefunkcionalan 'Ukloni nalog' (duplirao Storno bez stvarne razlike); Storno u listi prodaje sad vodi direktno na formu
- Kasir na fiskalnom računu koristi ime prijavljenog korisnika umesto fiksnog podešavanja
- Fiskalni računi za nalog uvek prikazuju najnoviji zapis (original vs. refund posle storna)
- Verifikaciona stranica (/v/) jasno označena kao lokalna test simulacija, ne prava provera kod PURS-a; dodat prikaz kusura
- Mock brojač fiskalnih računa (kartica emulator) sad preživljava restart servera
2026-07-01 23:01:26 +02:00
Dasko fcae2ae441 Prodaja/Servis: broj naloga u formatu GGMM (godina-mesec), mesečni brojač 2026-07-01 23:01:10 +02:00
Dasko 74d90cf2f2 Prodaja: sprečen dupli submit forme naplate (double-submit bag) 2026-07-01 23:01:06 +02:00
Dasko 16d84fe27e Servis: KIR upis usklađen sa Prodajom (preskoči bez klijenta, JMBG fallback za fizička lica) 2026-07-01 21:14:14 +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 d344d0b027 Prodaja: vizuelno čišćenje napomena u Stavkama (bez chip pozadine), ispravka preloma 'Na stanju' 2026-07-01 19:26:46 +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 fedd4b5d60 Prodaja: uklopljen mobilni raspored filter trake
Traka za pretragu/filtere na telefonu je bila samo flex-wrap red koji se
zbijao nezgodno. Sada: '+ Nova prodaja' preko cele širine na vrhu, pretraga
preko cele širine u svom redu, Od/Do datum jedan pored drugog, a dugmad
(Stornirano/Prikaži/Resetuj/Ovaj mesec) se sam uklapa po dva u red.
2026-07-01 17:10:30 +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 e7a130bb90 Prilagođena pozadina: čitljivost teksta van kartica preko pozadinske slike
Kad je postavljena pozadinska slika (Podešavanja → Izgled), tekst van .kartica
(filter labele, naslovi sekcija, prazna stanja, paginacija, radio-dugmad bez
klase) ostajao je u tamnoj boji teme i gubio se preko slike. Dodato: pravilo
za .polje-labela/.sekcija-naslov/.prazno-stanje, opšte pravilo za elemente sa
inline bojom teme, i podrazumevana bela boja za ceo glavni sadržaj (.sadrzaj)
koja se nasleđuje na gole elemente bez ijedne klase.
2026-07-01 16:57:03 +02:00
Dasko 4356997f5e Prodaja: podrazumevani filter na današnji dan, dugme 'Samo stornirano', raspored zaglavlja
Lista prodaje po prvom ulasku (bez upit parametara) prikazuje samo današnje
naloge; čim korisnik pošalje formu (i praznu), poštuje se njegov izbor.
Čekboks 'Samo stornirano' sada je stilizovan kao dugme-prekidač. Dugme
'+ Nova prodaja' premešteno ispred trake za pretragu/filtere.
2026-07-01 16:56:55 +02:00
Dasko 7463563c16 Klijenti: automatsko prepoznavanje JMBG/lične karte, ukinuto ručno biranje vrste dokumenta
Vrsta dokumenta se više ne bira ručno u formi — određuje se iz dužine unetog
broja (13 cifara = JMBG, 9 = broj lične karte). Dodata provera JMBG kontrolne
cifre i datuma rođenja po standardnom mod-11 algoritmu.
2026-07-01 16:56:49 +02:00
Dasko 2a4b8713ee Merge feature/klijent-adresa-i-prikaz-prodaja → develop 2026-07-01 16:05:18 +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 a8da9be706 Merge feature/prodaja-refundacija-i-toast → develop 2026-07-01 15:42:04 +02:00
Dasko c5a519a848 Toast obaveštenja: slaganje više toastova, ujednačen mobilni prelom sa flash porukama
window.ntechToast je crtao svaki novi toast na istoj fiksnoj poziciji pa
su se preklapali kad se više njih pojavi zaredom (npr. auto-snimanje
više polja). Sad se dodaju u zajednički kontejner koji ih slaže jedan
iznad drugog preko flex-a.

Flash poruke su menjale raspored na 480px dok ostatak aplikacije koristi
768px kao mobilni prelom — ujednačeno na 768px.
2026-07-01 15:41:59 +02:00
Dasko a923082736 Prodaja: obavezna identifikacija kupca kod refundacije, ispravljeno mapiranje načina plaćanja
Refundacija po propisu zahteva PIB/JMBG kupca — ako nalog nema klijenta
sa upisanim poreskim brojem, storno sad traži ručni unos pre nego što
se pošalje fiskalni refund zahtev.

TipPlacanja je upoređivao velika slova (Gotovina/Kartica/Virman) dok
Prodaja čuva nazive malim slovima (gotovina/kartica/prenos) — svaka
prodaja je zato padala na paymentType "Other" umesto stvarnog načina
plaćanja. Poređenje je sad case-insensitive.
2026-07-01 15:41:51 +02:00