diff --git a/internal/db/sqlite/klijent.go b/internal/db/sqlite/klijent.go index 6b776c1..98a29d2 100644 --- a/internal/db/sqlite/klijent.go +++ b/internal/db/sqlite/klijent.go @@ -22,15 +22,15 @@ func NoviKlijentRepo(db *sql.DB) *KlijentRepo { // Lista vraća listu klijenata sa opcionom pretragom po imenu, prezimenu ili nazivu firme func (r *KlijentRepo) Lista(ctx context.Context, pretraga string) ([]model.Klijent, error) { upit := ` - SELECT id, tip, ime, prezime, jmbg, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa + SELECT id, tip, ime, prezime, jmbg, tip_identifikacije, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa FROM klijenti WHERE 1=1` args := []any{} if pretraga != "" { -upit += " AND (ime LIKE ? OR prezime LIKE ? OR (ime || ' ' || prezime) LIKE ? OR naziv_firme LIKE ? OR telefon LIKE ? OR email LIKE ?)" - p := "%" + pretraga + "%" + upit += " AND (ime LIKE ? OR prezime LIKE ? OR (ime || ' ' || prezime) LIKE ? OR naziv_firme LIKE ? OR telefon LIKE ? OR email LIKE ?)" + p := "%" + pretraga + "%" args = append(args, p, p, p, p, p, p) } @@ -45,9 +45,9 @@ upit += " AND (ime LIKE ? OR prezime LIKE ? OR (ime || ' ' || prezime) LIKE ? OR var rezultat []model.Klijent for redovi.Next() { var k model.Klijent - var ime, prezime, jmbg, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString + var ime, prezime, jmbg, tipIdent, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString err := redovi.Scan( - &k.ID, &k.Tip, &ime, &prezime, &jmbg, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, + &k.ID, &k.Tip, &ime, &prezime, &jmbg, &tipIdent, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: KlijentRepo.Lista: scan: %w", err) @@ -55,6 +55,7 @@ upit += " AND (ime LIKE ? OR prezime LIKE ? OR (ime || ' ' || prezime) LIKE ? OR k.Ime = ime.String k.Prezime = prezime.String k.JMBG = jmbg.String + k.TipIdentifikacije = tipIdent.String k.NazivFirme = nazivFirme.String k.PIB = pib.String k.Telefon = telefon.String @@ -70,12 +71,12 @@ upit += " AND (ime LIKE ? OR prezime LIKE ? OR (ime || ' ' || prezime) LIKE ? OR // DohvatiID vraća jednog klijenta po ID-u func (r *KlijentRepo) DohvatiID(ctx context.Context, id int64) (*model.Klijent, error) { var k model.Klijent - var ime, prezime, jmbg, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString + var ime, prezime, jmbg, tipIdent, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString err := r.db.QueryRowContext(ctx, ` - SELECT id, tip, ime, prezime, jmbg, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa + SELECT id, tip, ime, prezime, jmbg, tip_identifikacije, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa FROM klijenti WHERE id = ?`, id).Scan( - &k.ID, &k.Tip, &ime, &prezime, &jmbg, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, + &k.ID, &k.Tip, &ime, &prezime, &jmbg, &tipIdent, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: KlijentRepo.DohvatiID: %w", err) @@ -84,6 +85,7 @@ func (r *KlijentRepo) DohvatiID(ctx context.Context, id int64) (*model.Klijent, k.Ime = ime.String k.Prezime = prezime.String k.JMBG = jmbg.String + k.TipIdentifikacije = tipIdent.String k.NazivFirme = nazivFirme.String k.PIB = pib.String k.Telefon = telefon.String @@ -99,10 +101,13 @@ func (r *KlijentRepo) Kreiraj(ctx context.Context, k *model.Klijent) (int64, err if k.Tip == "" { k.Tip = "fizicko" } + if k.TipIdentifikacije == "" { + k.TipIdentifikacije = "jmbg" + } rezultat, err := r.db.ExecContext(ctx, ` - INSERT INTO klijenti (tip, ime, prezime, jmbg, naziv_firme, pib, telefon, email, mesto, napomena) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - k.Tip, nullString(k.Ime), nullString(k.Prezime), nullString(k.JMBG), + INSERT INTO klijenti (tip, ime, prezime, jmbg, tip_identifikacije, naziv_firme, pib, telefon, email, mesto, napomena) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + k.Tip, nullString(k.Ime), nullString(k.Prezime), nullString(k.JMBG), k.TipIdentifikacije, nullString(k.NazivFirme), nullString(k.PIB), nullString(k.Telefon), nullString(k.Email), nullString(k.Mesto), nullString(k.Napomena), ) @@ -123,12 +128,15 @@ func (r *KlijentRepo) Izmeni(ctx context.Context, k *model.Klijent) error { if k.Tip == "" { k.Tip = "fizicko" } + if k.TipIdentifikacije == "" { + k.TipIdentifikacije = "jmbg" + } _, err := r.db.ExecContext(ctx, ` UPDATE klijenti SET - tip = ?, ime = ?, prezime = ?, jmbg = ?, naziv_firme = ?, + tip = ?, ime = ?, prezime = ?, jmbg = ?, tip_identifikacije = ?, naziv_firme = ?, pib = ?, telefon = ?, email = ?, mesto = ?, napomena = ? WHERE id = ?`, - k.Tip, nullString(k.Ime), nullString(k.Prezime), nullString(k.JMBG), + k.Tip, nullString(k.Ime), nullString(k.Prezime), nullString(k.JMBG), k.TipIdentifikacije, nullString(k.NazivFirme), nullString(k.PIB), nullString(k.Telefon), nullString(k.Email), nullString(k.Mesto), nullString(k.Napomena), k.ID, ) @@ -142,7 +150,7 @@ func (r *KlijentRepo) Izmeni(ctx context.Context, k *model.Klijent) error { // ListaFilter vraća listu klijenata sa limitom i offsetom (paginacija) func (r *KlijentRepo) ListaFilter(ctx context.Context, filter db.KlijentFilter) ([]model.Klijent, error) { upit := ` - SELECT id, tip, ime, prezime, jmbg, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa + SELECT id, tip, ime, prezime, jmbg, tip_identifikacije, naziv_firme, pib, telefon, email, mesto, napomena, datum_unosa FROM klijenti WHERE 1=1` @@ -178,9 +186,9 @@ func (r *KlijentRepo) ListaFilter(ctx context.Context, filter db.KlijentFilter) var rezultat []model.Klijent for redovi.Next() { var k model.Klijent - var ime, prezime, jmbg, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString + var ime, prezime, jmbg, tipIdent, nazivFirme, pib, telefon, email, mesto, napomena sql.NullString err := redovi.Scan( - &k.ID, &k.Tip, &ime, &prezime, &jmbg, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, + &k.ID, &k.Tip, &ime, &prezime, &jmbg, &tipIdent, &nazivFirme, &pib, &telefon, &email, &mesto, &napomena, &k.DatumUnosa, ) if err != nil { return nil, fmt.Errorf("ntech: KlijentRepo.ListaFilter: scan: %w", err) @@ -188,6 +196,7 @@ func (r *KlijentRepo) ListaFilter(ctx context.Context, filter db.KlijentFilter) k.Ime = ime.String k.Prezime = prezime.String k.JMBG = jmbg.String + k.TipIdentifikacije = tipIdent.String k.NazivFirme = nazivFirme.String k.PIB = pib.String k.Telefon = telefon.String diff --git a/internal/handler/klijent.go b/internal/handler/klijent.go index 3a12568..06bfd8b 100644 --- a/internal/handler/klijent.go +++ b/internal/handler/klijent.go @@ -300,17 +300,24 @@ func parseFormuKlijenta(r *http.Request) (model.Klijent, string) { return model.Klijent{Tip: tip}, "Adresa e-pošte nije ispravna." } + // tip identifikacionog broja: 'jmbg' ili 'licna_karta' (podrazumevano jmbg) + tipIdent := r.FormValue("tip_identifikacije") + if tipIdent != "jmbg" && tipIdent != "licna_karta" { + tipIdent = "jmbg" + } + return model.Klijent{ - Tip: tip, - Ime: ime, - Prezime: strings.TrimSpace(r.FormValue("prezime")), - JMBG: strings.TrimSpace(r.FormValue("jmbg")), - NazivFirme: nazivFirme, - PIB: strings.TrimSpace(r.FormValue("pib")), - Telefon: strings.TrimSpace(r.FormValue("telefon")), - Email: email, - Mesto: strings.TrimSpace(r.FormValue("mesto")), - Napomena: strings.TrimSpace(r.FormValue("napomena")), + Tip: tip, + Ime: ime, + Prezime: strings.TrimSpace(r.FormValue("prezime")), + JMBG: strings.TrimSpace(r.FormValue("jmbg")), + TipIdentifikacije: tipIdent, + NazivFirme: nazivFirme, + PIB: strings.TrimSpace(r.FormValue("pib")), + Telefon: strings.TrimSpace(r.FormValue("telefon")), + Email: email, + Mesto: strings.TrimSpace(r.FormValue("mesto")), + Napomena: strings.TrimSpace(r.FormValue("napomena")), }, "" } diff --git a/internal/handler/servis.go b/internal/handler/servis.go index 661761d..3f3900b 100644 --- a/internal/handler/servis.go +++ b/internal/handler/servis.go @@ -619,16 +619,23 @@ func (h *Handler) mozdaKreirajKlijenta(ctx context.Context, r *http.Request, nal return "Adresa e-pošte nije ispravna." } + // tip identifikacionog broja: 'jmbg' ili 'licna_karta' (podrazumevano jmbg) + tipIdent := r.FormValue("tip_identifikacije") + if tipIdent != "jmbg" && tipIdent != "licna_karta" { + tipIdent = "jmbg" + } + klijent := model.Klijent{ - Tip: tip, - Ime: ime, - Prezime: strings.TrimSpace(r.FormValue("prezime")), - JMBG: strings.TrimSpace(r.FormValue("jmbg")), - NazivFirme: nazivFirme, - PIB: strings.TrimSpace(r.FormValue("pib")), - Telefon: strings.TrimSpace(r.FormValue("telefon")), - Email: email, - Mesto: strings.TrimSpace(r.FormValue("mesto")), + Tip: tip, + Ime: ime, + Prezime: strings.TrimSpace(r.FormValue("prezime")), + JMBG: strings.TrimSpace(r.FormValue("jmbg")), + TipIdentifikacije: tipIdent, + NazivFirme: nazivFirme, + PIB: strings.TrimSpace(r.FormValue("pib")), + Telefon: strings.TrimSpace(r.FormValue("telefon")), + Email: email, + Mesto: strings.TrimSpace(r.FormValue("mesto")), } id, err := h.KlijentiRepo.Kreiraj(ctx, &klijent) diff --git a/internal/model/klijent.go b/internal/model/klijent.go index 9b03ec7..8ba824a 100644 --- a/internal/model/klijent.go +++ b/internal/model/klijent.go @@ -7,18 +7,21 @@ import ( // Klijent predstavlja jednog klijenta — fizičko lice ili firmu type Klijent struct { - ID int64 - Tip string - Ime string - Prezime string - JMBG string - NazivFirme string - PIB string - Telefon string - Email string - Mesto string - Napomena string - DatumUnosa time.Time + ID int64 + Tip string + Ime string + Prezime string + JMBG string // vrednost identifikacionog broja (JMBG ili broj lične karte) + // TipIdentifikacije govori šta je u polju JMBG: "jmbg" ili "licna_karta". + // Validnost vrednosti (JMBG = 13 cifara, format broja lične karte) proverava se kasnije. + TipIdentifikacije string + NazivFirme string + PIB string + Telefon string + Email string + Mesto string + Napomena string + DatumUnosa time.Time } // PunoIme vraća ime i prezime za fizičko lice, ili naziv firme za pravno @@ -28,3 +31,11 @@ func (k Klijent) PunoIme() string { } return strings.TrimSpace(k.Ime + " " + k.Prezime) } + +// OznakaIdentifikacije vraća labelu za prikaz: „Br. lične karte" ili „JMBG" (podrazumevano) +func (k Klijent) OznakaIdentifikacije() string { + if k.TipIdentifikacije == "licna_karta" { + return "Br. lične karte" + } + return "JMBG" +} diff --git a/migrations/062_klijent_tip_identifikacije.sql b/migrations/062_klijent_tip_identifikacije.sql new file mode 100644 index 0000000..1c0066e --- /dev/null +++ b/migrations/062_klijent_tip_identifikacije.sql @@ -0,0 +1,4 @@ +-- Dodaje tip identifikacionog broja klijenta (fizičko lice): 'jmbg' ili 'licna_karta'. +-- Vrednost broja se i dalje čuva u koloni jmbg; ova kolona govori šta je uneto. +-- Postojeći klijenti podrazumevano dobijaju 'jmbg' jer je to do sada i bio JMBG. +ALTER TABLE klijenti ADD COLUMN tip_identifikacije TEXT NOT NULL DEFAULT 'jmbg'; diff --git a/web/templates/stranice/klijent_forma.html b/web/templates/stranice/klijent_forma.html index db9eacf..9f60727 100644 --- a/web/templates/stranice/klijent_forma.html +++ b/web/templates/stranice/klijent_forma.html @@ -77,10 +77,19 @@ placeholder="npr. Petrović"> -
- - +
+
+ + +
+
+ + +
diff --git a/web/templates/stranice/servis_forma.html b/web/templates/stranice/servis_forma.html index e1dfdf8..bd65823 100644 --- a/web/templates/stranice/servis_forma.html +++ b/web/templates/stranice/servis_forma.html @@ -161,9 +161,18 @@ -
- - +
+
+ + +
+
+ + +
@@ -171,13 +180,26 @@