Commit Graph

185 Commits

Author SHA1 Message Date
Dasko fc2743e98d docs: README — knjigovodstvene funkcije (kalkulacija, nivelacija, PDV, uvoz) 2026-06-14 17:45:35 +02:00
Dasko e3f42e64a8 Merge feature/kw-podesavanja-kalkulacija: podstavka „Kalkulacija i PDV" + ispravka mobilnih stavki nabavke 2026-06-14 17:41:41 +02:00
Dasko ae7fd7b5e2 fix(nabavka): mobilni prikaz stavki — ukloni inline display:none
Inline display:none na .stavke-kartice nadjačavao je @media iz main.css, pa se na
telefonu nije video nijedan raspored stavki. Prikaz sada vodi samo CSS klasa.
2026-06-14 17:40:54 +02:00
Dasko 4d81c576cd feat(podesavanja): podstavka „Kalkulacija i PDV" — marža + PDV stope na jednom mestu
- PdvStope handler: dodata podrazumevana marža; stranica „podesavanja-kalkulacija-pdv",
  naslov „Kalkulacija i PDV", ruta /admin/podesavanja/kalkulacija-pdv
- pdv_stope.html: sekcija „Kalkulacija" (forma marže preko /podesavanja/sacuvaj) iznad šifarnika
- marža uklonjena iz stranice „Sistem"
- sidebar: podstavka „PDV stope" → „Kalkulacija i PDV"
2026-06-14 17:40:38 +02:00
Dasko 6444e19808 Merge feature/kw-kalkulacija-prodajna: dvosmerna marža↔prodajna + status PDV obveznika 2026-06-14 17:16:58 +02:00
Dasko 6ee9eefdd0 Merge feature/kw-uvoz: uvoz robe — KPR zastavica i PPPDV 006/106 2026-06-14 17:16:58 +02:00
Dasko 100915d453 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 42c74a725a feat(pdv): uvoz robe — KPR zastavica i mapiranje u PPPDV 006/106
- migracija 048: kolona uvoz na pdv_kpr (0=domaća nabavka, 1=uvoz)
- model PdvKpr.Uvoz; MapirajPPPDV(kir, kprDomace, kprUvoz) rutira uvoz u 006/106,
  domaće u 008/108; test ažuriran + uvozni scenario
- repo: KPR Lista/DohvatiID/Kreiraj čitaju i pišu uvoz
- obračun: KPR se razdvaja na domaće/uvozne; obaveza ostaje na ukupnom KPR-u
- KPR forma: kvačica „Uvoz (JCI)"; lista: oznaka UVOZ uz broj dokumenta
2026-06-14 17:16:01 +02:00
Dasko c7470ebbc9 Merge feature/kw-kalkulacija-troskovi: Faza C — marža po kategoriji/artiklu + zavisni troškovi (§5.4) 2026-06-14 16:24:31 +02:00
Dasko 803e1f6341 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 30db396ee6 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 cb1a3b21c3 Merge feature/kw-kalkulacija-nivelacija: kalkulacija i nivelacija (§5.4 — Faza A i B) 2026-06-14 15:33:46 +02:00
Dasko 3f9f282609 style(ui): hover kartice — blagi zoom (scale 1.02) umesto podizanja 2026-06-14 10:14:05 +02:00
Dasko 97683534ac 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 a466f591b6 feat(ui): grupa „Knjigovodstvo" u sidebaru (Nivelacije, KIR, KPR, Obračun)
Kolapsibilni podmeni (isti obrazac kao Podešavanja); samostalni linkovi
Nivelacije i KIR/KPR/Obračun objedinjeni pod jednu grupu. Vidljivost:
KIR/KPR/Obračun po modulu pdv + dozvoli pdv.pregled, Nivelacije po
artikal.izmeni; grupa se prikazuje ako je bar jedno dete vidljivo.
2026-06-14 09:52:09 +02:00
Dasko 0f1f65c7f7 feat(magacin): nivelacija — promena cene uz trag (Faza A)
Tabela nivelacije (migr 045) beleži svaku promenu prodajne cene:
artikal, stara→nova cena, razlog, izvor, korisnik, datum. Dva okidača:
posebna akcija „Promeni cenu" (modal, izvor 'rucno') i auto-trag pri
izmeni artikla (izvor 'izmena'). PromeniCenu je transakciono (update
cene + upis zapisa). Pregled /nivelacije sa filterom perioda i razlikom
(+/− i %). Modal otvara svoj nextElementSibling — radi i na mobilnom
uprkos dupliranim id-jevima iz dva rasporeda.
2026-06-14 09:37:49 +02:00
Dasko c9d4704c3d Merge feature/kw-pdv-evidencija: PDV evidencija (Faza 2 — KIR/KPR, auto-punjenje, obračun, PPPDV) 2026-06-14 09:03:27 +02:00
Dasko a562d4bb6f feat(pdv): PPPDV mapiranje na stranici obračuna
model.MapirajPPPDV preslikava zbirove KIR/KPR na polja zvaničnog
obrasca PPPDV (001-005/103-105, 006-009/106-109, 110, povraćaj) u
celim dinarima; zbirovi se računaju iz zaokruženih polja. Uvoz
(006/106) i nadoknada poljoprivredniku (007/107) se ne prate → 0.
Sekcija PPPDV dodata na /pdv/obracun. Prikaz za popunjavanje, ne
elektronska predaja.
2026-06-14 08:53:18 +02:00
Dasko e1ee5c3765 feat(pdv): obračun PDV za period (KIR − KPR)
Interni obračun: izlazni (dugovani) PDV iz KIR i odbitni (prethodni)
PDV iz KPR po stopama, konačna obaveza za uplatu ili povraćaj/prenos.
PdvBezOdbitka se ne računa u odbitni PDV. Stranica /pdv/obracun
(podrazumevano tekući mesec), link u sidebaru. Brojčana podloga za
budući zvanični PPPDV/POPDV obrazac.
2026-06-14 08:34:33 +02:00
Dasko dfad0ff1f4 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 7fc2e9bcc3 feat(pdv): nabavka → KPR automatski (Faza 2b-2)
PDV se izvodi iz stope artikla po stavci (aproksimacija: nabavna cena
= osnovica bez PDV). Grupisanje po stopi (20→opšta, 10→posebna,
ostalo→oslobođena nabavka), broj dokumenta NAB-<id>, veza izvor/izvor_id.
Auto-zapisi se ne mogu ručno brisati u KPR; brisanje nabavke uklanja
vezani KPR zapis.
2026-06-14 08:16:41 +02:00
Dasko 76b147074d feat(pdv): prodaja → KIR automatski (Faza 2b-1)
Kad se sačuva prodaja na klijenta (PDV obveznik), zapis se sam zavede u
KIR (model.KirIzProdaje grupiše stavke po stopi). Storno/brisanje prodaje
uklanja vezani KIR zapis (ObrisiPoIzvoru). Maloprodaja građanima (bez
klijenta) se preskače — ide preko fiskalizacije (Faza 3). Helper
modulUkljucen; auto-zapisi u UI nemaju ručno brisanje. Test.
2026-06-14 02:45:07 +02:00
Dasko 1539ec799f feat(pdv): izvor veza u KIR/KPR — temelj za auto-punjenje (Faza 2b-0)
Kolone izvor ('rucno'/'prodaja'/'nabavka') + izvor_id na pdv_kir/pdv_kpr
(migracija 044, postojeći zapisi → 'rucno'). Repo Kreiraj upisuje izvor,
nova ObrisiPoIzvoru za čišćenje pri stornu/brisanju izvora. Test.
2026-06-14 02:27:23 +02:00
Dasko 966d1f6c98 feat(pdv): KPR — knjiga primljenih računa + PIB/mesto dobavljača (Faza 2a)
KPR (handler, rute pod RequireModul("pdv"), UI sa sumama po stopama,
izbor dobavljača, datum plaćanja, PDV bez odbitka / oslobođena nabavka)
+ stavka u meniju. Dobavljači dobili PIB i mesto (migracija 043) jer KPR
traži PIB dobavljača za POPDV. Time je Faza 2a kompletna (KIR + KPR).
2026-06-14 02:05:33 +02:00
Dasko e8fdd2dc51 feat(pdv): izbor klijenta u KIR formi + mesto/grad u klijentima
KIR forma nudi padajuću listu postojećih klijenata koja popunjava naziv,
PIB/JMBG i mesto kupca (uz ručni unos za kupce van baze). KIR i dalje
čuva kupca kao tekst, ne kao vezu. Klijenti dobili polje mesto (migracija
042), provučeno kroz model, repo, formu i handler.
2026-06-14 01:39:06 +02:00
Dasko 53cbc789db feat(pdv): KIR — handler, RequireModul, rute i UI (Faza 2a)
Pregled knjige izdatih računa (filter perioda + sume po stopama), forma
unosa (server računa ukupno) i brisanje. Nove dozvole pdv.*; prvi put
montiran RequireModul("pdv") — KIR je vidljiv u meniju (.Moduli) i
dostupan samo PDV obveznicima, uz RBAC. Oznaka PIB/JMBG po broju cifara.
2026-06-13 23:45:24 +02:00
Dasko 26c829fef3 feat(pdv): KIR/KPR evidencija — migracija, model i repozitorijum (Faza 2a)
Tabele pdv_kir i pdv_kpr (iznosi po vrsti stope), modeli PdvKir/PdvKpr,
repozitorijumi sa filterom perioda i integracioni test (datum round-trip,
nullable datum plaćanja).
2026-06-13 21:22:48 +02:00
Dasko d06a353a52 feat(pdv): šifarnik PDV stopa — handler, rute i UI (Faza 1)
Handleri (prikaz, dodaj, izmeni, arhiviraj/vrati) sa validacijom i flash
porukama; rute pod /admin/podesavanja/pdv-stope (dozvole podesavanja.*);
stranica pdv_stope registrovana u kes.go i dodata u meni Podešavanja.
Šifarnik je opšti (bez RequireModul) jer ga koristi i kalkulacija.
2026-06-13 20:45:43 +02:00
Dasko 15995167b7 feat(pdv): šifarnik PDV stopa — migracija, model i repozitorijum (Faza 1)
Tabela pdv_stope (seed 20/10/0%), model PdvStopa, PdvStopaRepository
+ SQLite implementacija (arhiviranje umesto brisanja) i integracioni
test (migracija + CRUD round-trip).
2026-06-13 20:33:48 +02:00
Dasko 6d066f6704 feat(moduli): mehanizam uključenih modula — Moduli mapa i RequireModul (Faza 0)
config.SviModuli + PodaciStranice.Moduli (uslovni meni, analogno Dozvole)
i middleware.RequireModul (zaštita ruta, analogno RequireDozvola). Sloj
iznad RBAC-a: zahtev mora proći i „modul uključen" i „korisnik sme".
Dopunjen test (TestSviModuli). Time je Faza 0 kompletna.
2026-06-13 20:23:24 +02:00
Dasko 3817ba4cbd feat(config): helper ModulUkljucen — uključenost modula po profilu firme (Faza 0)
Čista funkcija izvodi iz profila firme (podesavanja) koji su zakonski
moduli aktivni. Režim „samo evidencija" gasi sve. Pravila: pdv prema
prekidaču obveznika, fiskalizacija zaseban prekidač, kpo za paušalce,
dvojno za doo. Table-driven test sa 18 slučajeva.
2026-06-13 19:38:54 +02:00
Dasko 290e5c085a feat(podesavanja): profil firme — pravni i poreski status (Faza 0)
Dodata kartica „Pravni i poreski status" na Podešavanja → Opšte:
pravni oblik, režim rada, PDV obveznik, fiskalizacija. Čuva se u
postojećoj key-value tabeli podesavanja (bez migracije). Fiskalizacija
se zasivi i forsira na „Ne" u režimu „samo evidencija".
2026-06-13 19:27:26 +02:00
Dasko 1feab0d3dd Merge grane feature/html-no-cache: HTML no-cache za pouzdan deploy 2026-06-13 10:45:23 +02:00
Dasko a4f99cb6e1 fix(cache): HTML stranice no-cache da nova verzija odmah stigne do korisnika
HTML nije imao Cache-Control, pa je browser servirao staru keširanu stranicu
sa starim AssetV tokenom i posle deploya — stari CSS/JS. Dodato no-cache na
renderujTemplate i renderujStandalone: browser revalidira HTML, dobija svež
AssetV token koji povlači svež CSS/JS. Statika ostaje immutable + ?v=verzija.
2026-06-13 10:45:23 +02:00
Dasko 35583405a1 Merge grane feature/dashboard-labele-bela: svetlije labele dashboard kartica 2026-06-13 10:33:20 +02:00
Dasko f5c0873ada style(dashboard): labele kartica svetlije (tekst-glavni) i lakši bold (500) 2026-06-13 10:33:20 +02:00
Dasko a4c8a85d09 Merge grane feature/dashboard-labele-bold: labele dashboard kartica 14px bold 2026-06-13 10:31:38 +02:00
Dasko 1c49a0db07 style(dashboard): labele kartica 14px i bold (font-weight:600) 2026-06-13 10:31:38 +02:00
Dasko 4509f2eb45 Merge grane feature/dashboard-labele-font: uvećane labele dashboard kartica 2026-06-13 10:30:02 +02:00
Dasko 36b1e100b8 style(dashboard): blago uvećane labele statističkih kartica (12px → 13px) 2026-06-13 10:30:02 +02:00
Dasko d3f98b67d0 Merge grane feature/slajderi-init-nula: slajderi teme poštuju vrednost 0 2026-06-13 10:27:44 +02:00
Dasko f9e6a37020 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 9c9588c7ac Merge grane feature/naslovi-kartica-senka: senka naslova kartica i stranice 2026-06-13 10:13:37 +02:00
Dasko e4791de3f8 fix(ui): senka na naslovima kartica, labelama i naslovu stranice preko slike
Naslovi kartica i statističke labele su goli <div> koje glass override nije
dohvatao — blede na svetloj slici. Dodato .kartica div sa senkom (boju NE
diramo, da namerno obojeni div-ovi ostanu) i .topbar-naslov dobija svetli
tekst + senku.
2026-06-13 10:13:37 +02:00
Dasko c5ea36b452 Merge grane feature/info-banner-senka: senka info-bannera preko slike 2026-06-13 10:06:52 +02:00
Dasko bcee85e2db fix(ui): senka na info-banneru u Profil—Tema preko slike
Tekst bannera „Tamna tema je aktivna…" su goli <div> koje glass override
ne dohvata — gubili su se na svetloj slici. Dodata klasa .info-banner sa
ciljanim pravilom (svetli tekst + dvoslojna senka) u glass režimu.
2026-06-13 10:06:52 +02:00
Dasko 50d2d37224 Merge grane feature/senka-teksta-kartice: jača senka teksta u karticama 2026-06-13 10:04:23 +02:00
Dasko 366ca4a7a3 fix(ui): jača dvoslojna senka teksta u karticama preko svetle slike
Tekst u karticama/tabelama/modalu imao slabu jednoslojnu senku (0.7–0.8),
pa se na jako providnoj kartici + svetloj slici jedva video. Prebačeno na
umerenu dvoslojnu (oštar obris 0.9 + lagani halo 0.55) — čitljivije, i dalje
diskretno. Sidebar netaknut (već dovoljno taman).
2026-06-13 10:04:23 +02:00
Dasko e64e83acaf Merge grane feature/naslov-senka-gradijent: gradijentna senka naslova 2026-06-13 09:58:40 +02:00
Dasko d3fd4a2191 fix(ui): gradijentno zatamnjenje senke naslova (skoro crn → upola → bled)
Tri sloja text-shadow podešena u opadajućem zatamnjenju: oštar skoro crn
obris, srednji upola, široki bledi halo.
2026-06-13 09:58:40 +02:00