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() {