From a744317316ecaf68b75fb79ef2371fecffc221cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Sun, 21 Jun 2026 19:07:07 +0200 Subject: [PATCH] =?UTF-8?q?Pode=C5=A1avanja:=20mati=C4=8Dni=20broj,=20posl?= =?UTF-8?q?ovna=20jedinica=20i=20kompaktniji=20raspored=20Op=C5=A1te=20?= =?UTF-8?q?=E2=86=92=20Firma:=20dodato=20polje=20Mati=C4=8Dni=20broj=20(va?= =?UTF-8?q?lidacija=208=20cifara)=20i=20nova=20grupa=20Poslovna=20jedinica?= =?UTF-8?q?=20(naziv,=20oznaka,=20op=C5=A1tina,=20grad)=20za=20fiskalizaci?= =?UTF-8?q?ju.=20Polja=20firme=20upakovana=20u=20parove=20(forma-grid-3=20?= =?UTF-8?q?klasa,=20responsive).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/podesavanja.go | 73 +++++++++++-- web/static/css/main.css | 6 ++ web/templates/stranice/podesavanja_opste.html | 101 ++++++++++++++---- 3 files changed, 149 insertions(+), 31 deletions(-) diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go index 26dc87c..d978020 100644 --- a/internal/handler/podesavanja.go +++ b/internal/handler/podesavanja.go @@ -23,11 +23,17 @@ import ( // PodaciPodesavanja su podaci za stranicu podešavanja type PodaciPodesavanja struct { model.PodaciStranice - NazivFirme string - Podnazlov string - Adresa string - Telefon string - PIB string + NazivFirme string + Podnazlov string + Adresa string + Telefon string + PIB string + MaticniBroj string + // poslovna jedinica — za fiskalizaciju (oznaka PJ se šalje uz svaki račun) + NazivPJ string + OznakaPJ string + Opstina string + Grad string LogoPutanja string TopbarLogoSlika bool // profil firme — pravni/poreski status (Faza 0); određuje koji se zakonski moduli pale @@ -83,6 +89,11 @@ func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) { Adresa: podesavanja["adresa"], Telefon: podesavanja["telefon"], PIB: podesavanja["pib"], + MaticniBroj: podesavanja["maticni_broj"], + NazivPJ: podesavanja["poslovna_jedinica_naziv"], + OznakaPJ: podesavanja["poslovna_jedinica_oznaka"], + Opstina: podesavanja["opstina"], + Grad: podesavanja["grad"], LogoPutanja: podesavanja["logo_putanja"], TopbarLogoSlika: podesavanja["topbar_logo_slika"] == "1", Sacuvano: r.URL.Query().Get("sacuvano") == "1", @@ -225,6 +236,24 @@ func kopiraFajl(izvor, odrediste string) error { return err } +// validirajMaticniBroj proverava da li uneti matični broj ima tačno 8 cifara. +// Prazan broj je dozvoljen (polje nije obavezno). Vraća srpsku poruku o grešci +// ili prazan string ako je broj ispravan. +func validirajMaticniBroj(broj string) string { + if broj == "" { + return "" + } + if len(broj) != 8 { + return "Matični broj mora imati tačno 8 cifara." + } + for _, c := range broj { + if c < '0' || c > '9' { + return "Matični broj sme sadržati samo cifre." + } + } + return "" +} + // SacuvajPodesavanja prima POST i čuva podešavanja u bazu func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { if _, ok := h.zahtevajDozvolu(w, r, "podesavanja.izmeni"); !ok { @@ -241,13 +270,30 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { topbarLogoSlika = "1" } + // matični broj — 8 cifara; prazno je dozvoljeno (polje nije obavezno) + maticniBroj := strings.TrimSpace(r.FormValue("maticni_broj")) + if greska := validirajMaticniBroj(maticniBroj); greska != "" { + middleware.SetFlash(w, r, h.DB, "greska", greska) + sledeci := "/podesavanja" + if r.FormValue("_next") == "/admin/podesavanja/opste" { + sledeci = "/admin/podesavanja/opste" + } + http.Redirect(w, r, sledeci, http.StatusSeeOther) + return + } + polja := map[string]string{ - "naziv_firme": r.FormValue("naziv_firme"), - "podnazlov": r.FormValue("podnazlov"), - "adresa": r.FormValue("adresa"), - "telefon": r.FormValue("telefon"), - "pib": r.FormValue("pib"), - "topbar_logo_slika": topbarLogoSlika, + "naziv_firme": r.FormValue("naziv_firme"), + "podnazlov": r.FormValue("podnazlov"), + "adresa": r.FormValue("adresa"), + "telefon": r.FormValue("telefon"), + "pib": r.FormValue("pib"), + "maticni_broj": maticniBroj, + "poslovna_jedinica_naziv": r.FormValue("poslovna_jedinica_naziv"), + "poslovna_jedinica_oznaka": r.FormValue("poslovna_jedinica_oznaka"), + "opstina": r.FormValue("opstina"), + "grad": r.FormValue("grad"), + "topbar_logo_slika": topbarLogoSlika, // profil firme (Faza 0) — radio dugmad uvek šalju vrednost, pa se uredno čuvaju "firma_pravni_oblik": r.FormValue("firma_pravni_oblik"), "firma_pdv_obveznik": r.FormValue("firma_pdv_obveznik"), @@ -695,6 +741,11 @@ func (h *Handler) napuniPodaciPodesavanja(r *http.Request, naslov string) (Podac Adresa: podesavanja["adresa"], Telefon: podesavanja["telefon"], PIB: podesavanja["pib"], + MaticniBroj: podesavanja["maticni_broj"], + NazivPJ: podesavanja["poslovna_jedinica_naziv"], + OznakaPJ: podesavanja["poslovna_jedinica_oznaka"], + Opstina: podesavanja["opstina"], + Grad: podesavanja["grad"], LogoPutanja: podesavanja["logo_putanja"], TopbarLogoSlika: podesavanja["topbar_logo_slika"] == "1", FirmaPravniOblik: vrednostIliDefault(podesavanja, "firma_pravni_oblik", "pausalac"), diff --git a/web/static/css/main.css b/web/static/css/main.css index c697b6c..52fe18e 100644 --- a/web/static/css/main.css +++ b/web/static/css/main.css @@ -873,6 +873,11 @@ select { grid-template-columns: 1fr 1fr; gap: 12px; } +.forma-grid-3 { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 12px; +} .forma-grid-4 { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; @@ -1000,6 +1005,7 @@ select { /* forme */ .forma-grid-2 { grid-template-columns: 1fr !important; } + .forma-grid-3 { grid-template-columns: 1fr !important; } /* magacin traka */ .magacin-traka { flex-direction: column; align-items: stretch; } diff --git a/web/templates/stranice/podesavanja_opste.html b/web/templates/stranice/podesavanja_opste.html index cc84e99..f9de6fe 100644 --- a/web/templates/stranice/podesavanja_opste.html +++ b/web/templates/stranice/podesavanja_opste.html @@ -60,40 +60,49 @@
-
- - +
+
+ + +
+
+ + +
-
- - -
- -
- - -
- -
+
+
+ + +
+
+ +
+
+ + +
@@ -119,6 +128,58 @@
+ +
+ + +
+
+ + Poslovna jedinica +
+ +
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+ +
+ +
+
+
+