From 3def86ddb9e3f1e27630dfee82b3e8785e9f9e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Sun, 21 Jun 2026 19:07:38 +0200 Subject: [PATCH] =?UTF-8?q?Klijent:=20validacija=20JMBG=20(13=20cifara)=20?= =?UTF-8?q?i=20kontakt=20osoba=20za=20pravno=20lice=20parseFormuKlijenta?= =?UTF-8?q?=20i=20mozdaKreirajKlijenta=20proveravaju=20JMBG=20kad=20je=20i?= =?UTF-8?q?zabran=20taj=20tip=20identifikacije.=20Forma=20pravnog=20lica?= =?UTF-8?q?=20dobija=20sekciju=20Kontakt=20osoba=20(ime/prezime);=20neakti?= =?UTF-8?q?vna=20sekcija=20se=20onemogu=C4=87ava=20da=20server=20ne=20dobi?= =?UTF-8?q?je=20duplu=20vrednost.=20renderujStandalone=20parsira=20=C5=A1a?= =?UTF-8?q?blon=20sa=20root=20imenom=20i=20=C5=A1ablonskim=20funkcijama=20?= =?UTF-8?q?(kao=20kreirajKes).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/kes.go | 3 ++- internal/handler/klijent.go | 27 +++++++++++++++++++++- internal/handler/servis.go | 9 +++++++- web/templates/stranice/klijent_forma.html | 28 +++++++++++++++++------ 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/internal/handler/kes.go b/internal/handler/kes.go index db55756..c69d733 100644 --- a/internal/handler/kes.go +++ b/internal/handler/kes.go @@ -182,7 +182,8 @@ func (h *Handler) renderujStandalone(w http.ResponseWriter, ime string, podaci a tmpl = t } else { var err error - if tmpl, err = template.ParseFS(h.TemplatesFS, "web/templates/stranice/"+ime+".html"); err != nil { + // kao u kreirajKes: root mora biti ime+".html" i moraju biti registrovane šablonske funkcije + if tmpl, err = template.New(ime+".html").Funcs(sablonskeFunkcije).ParseFS(h.TemplatesFS, "web/templates/stranice/"+ime+".html"); err != nil { slog.Error("greška pri parsiranju šablona", "ime", ime, "error", err) http.Error(w, "Greška pri učitavanju stranice", http.StatusInternalServerError) return diff --git a/internal/handler/klijent.go b/internal/handler/klijent.go index 06bfd8b..fbcb1e1 100644 --- a/internal/handler/klijent.go +++ b/internal/handler/klijent.go @@ -278,6 +278,24 @@ func (h *Handler) ObrisiKlijenta(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/klijenti?obrisan=1", http.StatusSeeOther) } +// validirajJMBG proverava da li uneti JMBG ima tačno 13 cifara. Prazan broj je +// dozvoljen (polje nije obavezno). Vraća srpsku poruku o grešci ili prazan string. +// Broj lične karte se ne proverava jer mu se format razlikuje između izdanja. +func validirajJMBG(broj string) string { + if broj == "" { + return "" + } + if len(broj) != 13 { + return "JMBG mora imati tačno 13 cifara." + } + for _, c := range broj { + if c < '0' || c > '9' { + return "JMBG sme sadržati samo cifre." + } + } + return "" +} + // parseFormuKlijenta čita polja iz HTTP forme, validira ih i vraća model i eventualnu grešku func parseFormuKlijenta(r *http.Request) (model.Klijent, string) { tip := r.FormValue("tip") @@ -306,11 +324,18 @@ func parseFormuKlijenta(r *http.Request) (model.Klijent, string) { tipIdent = "jmbg" } + jmbg := strings.TrimSpace(r.FormValue("jmbg")) + if tipIdent == "jmbg" { + if greska := validirajJMBG(jmbg); greska != "" { + return model.Klijent{Tip: tip}, greska + } + } + return model.Klijent{ Tip: tip, Ime: ime, Prezime: strings.TrimSpace(r.FormValue("prezime")), - JMBG: strings.TrimSpace(r.FormValue("jmbg")), + JMBG: jmbg, TipIdentifikacije: tipIdent, NazivFirme: nazivFirme, PIB: strings.TrimSpace(r.FormValue("pib")), diff --git a/internal/handler/servis.go b/internal/handler/servis.go index 3f3900b..5da939f 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -625,11 +625,18 @@ func (h *Handler) mozdaKreirajKlijenta(ctx context.Context, r *http.Request, nal tipIdent = "jmbg" } + jmbg := strings.TrimSpace(r.FormValue("jmbg")) + if tipIdent == "jmbg" { + if greska := validirajJMBG(jmbg); greska != "" { + return greska + } + } + klijent := model.Klijent{ Tip: tip, Ime: ime, Prezime: strings.TrimSpace(r.FormValue("prezime")), - JMBG: strings.TrimSpace(r.FormValue("jmbg")), + JMBG: jmbg, TipIdentifikacije: tipIdent, NazivFirme: nazivFirme, PIB: strings.TrimSpace(r.FormValue("pib")), diff --git a/web/templates/stranice/klijent_forma.html b/web/templates/stranice/klijent_forma.html index 9f60727..915c5ed 100644 --- a/web/templates/stranice/klijent_forma.html +++ b/web/templates/stranice/klijent_forma.html @@ -110,6 +110,20 @@ placeholder="npr. 123456789"> + +
Kontakt osoba
+
+
+ + +
+
+ + +
+
@@ -158,13 +172,13 @@ function promenaTipa(tip) { var secFiz = document.getElementById('sec-fizicko'); var secPrav = document.getElementById('sec-pravno'); - if (tip === 'pravno') { - secFiz.style.display = 'none'; - secPrav.style.display = 'flex'; - } else { - secFiz.style.display = 'flex'; - secPrav.style.display = 'none'; - } + var pravno = tip === 'pravno'; + secFiz.style.display = pravno ? 'none' : 'flex'; + secPrav.style.display = pravno ? 'flex' : 'none'; + // skrivena polja se i dalje šalju; pošto obe sekcije imaju name="ime"/"prezime", + // onemogućavamo polja neaktivne sekcije da server ne dobije pogrešnu vrednost + secFiz.querySelectorAll('input,select').forEach(function (el) { el.disabled = pravno; }); + secPrav.querySelectorAll('input,select').forEach(function (el) { el.disabled = !pravno; }); } // pri učitavanju prikazujemo ispravnu sekciju (function() {