From 9cfc1cc4f3a255fb03becb391c969f016c4a412f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Sun, 21 Jun 2026 22:31:19 +0200 Subject: [PATCH] =?UTF-8?q?Magacin:=20razdvojeni=20Magacin/Usluge/Tro?= =?UTF-8?q?=C5=A1kovi=20i=20izba=C4=8Den=20Tip=20iz=20forme=20ArtikalFilte?= =?UTF-8?q?r=20dobija=20polje=20Tip;=20zajedni=C4=8Dki=20magacinPrikaz=20p?= =?UTF-8?q?arametrizovan=20tipom=20servi=20listu=20proizvoda=20(/magacin),?= =?UTF-8?q?=20usluga=20(/usluge)=20i=20tro=C5=A1kova=20(/troskovi)=20preko?= =?UTF-8?q?=20istog=20=C5=A1ablona=20(OsnovniUrl=20za=20HTMX).=20Sidebar?= =?UTF-8?q?=20dobija=20stavke=20Usluge=20i=20Tro=C5=A1kovi.=20Magacin=20fo?= =?UTF-8?q?rma=20vi=C5=A1e=20ne=20nudi=20izbor=20tipa=20=E2=80=94=20artika?= =?UTF-8?q?l=20je=20uvek=20proizvod.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/ntech/main.go | 2 + internal/db/repository.go | 1 + internal/db/sqlite/artikal.go | 10 +++++ internal/handler/magacin.go | 33 ++++++++++++--- internal/handler/magacin_forma.go | 8 +++- web/templates/komponente/sidebar.html | 12 ++++++ web/templates/stranice/magacin.html | 20 ++++----- web/templates/stranice/magacin_forma.html | 51 ++++++++--------------- 8 files changed, 86 insertions(+), 51 deletions(-) diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 7a3e0ae..79341b7 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -301,6 +301,8 @@ func main() { r.With(modul("pdv"), doz("pdv.obrisi")).Post("/pdv/kpr/obrisi/{id}", h.ObrisiPdvKpr) r.With(modul("pdv")).Get("/pdv/obracun", h.PdvObracunStranica) r.Get("/magacin", h.Magacin) + r.Get("/usluge", h.Usluge) + r.Get("/troskovi", h.Troskovi) r.Get("/magacin/kartica/{id}", h.MagacinskaKartica) r.Get("/magacin/novi", h.NoviArtikal) r.With(doz("artikal.dodaj")).Post("/magacin/novi", h.SacuvajArtikal) diff --git a/internal/db/repository.go b/internal/db/repository.go index 9036017..d7abb60 100644 --- a/internal/db/repository.go +++ b/internal/db/repository.go @@ -97,6 +97,7 @@ type NivelacijaRepository interface { type ArtikalFilter struct { Pretraga string KategorijaID *int64 + Tip string // 'proizvod' | 'usluga' | 'trosak'; prazno → svi tipovi SamoKriticni bool Arhivirani bool // true → vrati samo arhivirane; false (podrazumevano) → samo aktivne Limit int diff --git a/internal/db/sqlite/artikal.go b/internal/db/sqlite/artikal.go index fabf743..48b76fd 100644 --- a/internal/db/sqlite/artikal.go +++ b/internal/db/sqlite/artikal.go @@ -49,6 +49,11 @@ func (r *ArtikalRepo) Lista(ctx context.Context, filter db.ArtikalFilter) ([]mod args = append(args, *filter.KategorijaID) } + if filter.Tip != "" { + upit += " AND a.tip = ?" + args = append(args, filter.Tip) + } + if filter.SamoKriticni { upit += " AND (a.tip = 'proizvod' OR a.tip = '') AND a.kolicina <= a.kolicina_min" } @@ -442,6 +447,11 @@ func (r *ArtikalRepo) PrebrojiPoFilteru(ctx context.Context, filter db.ArtikalFi args = append(args, *filter.KategorijaID) } + if filter.Tip != "" { + upit += " AND a.tip = ?" + args = append(args, filter.Tip) + } + if filter.SamoKriticni { upit += " AND (a.tip = 'proizvod' OR a.tip = '') AND a.kolicina <= a.kolicina_min" } diff --git a/internal/handler/magacin.go b/internal/handler/magacin.go index e8a7e52..1eb56e3 100644 --- a/internal/handler/magacin.go +++ b/internal/handler/magacin.go @@ -33,10 +33,28 @@ type PodaciMagacina struct { StranicaPrev int StranicaNext int StranicaQueryUrl string // čuva filtere za linkove paginacije + Tip string // tip prikaza: 'proizvod' | 'usluga' | 'trosak' + OsnovniUrl string // bazna ruta liste ('/magacin' | '/usluge' | '/troskovi') — za HTMX i forme } -// Magacin renderuje listu artikala +// Magacin renderuje listu artikala (proizvoda) func (h *Handler) Magacin(w http.ResponseWriter, r *http.Request) { + h.magacinPrikaz(w, r, model.TipProizvod, "magacin", "Magacin", "/magacin") +} + +// Usluge renderuje listu usluga (tip 'usluga') +func (h *Handler) Usluge(w http.ResponseWriter, r *http.Request) { + h.magacinPrikaz(w, r, model.TipUsluga, "usluge", "Usluge", "/usluge") +} + +// Troskovi renderuje listu troškova (tip 'trosak') +func (h *Handler) Troskovi(w http.ResponseWriter, r *http.Request) { + h.magacinPrikaz(w, r, model.TipTrosak, "troskovi", "Troškovi", "/troskovi") +} + +// magacinPrikaz je zajednička logika liste artikala, parametrizovana tipom; isti +// šablon služi za proizvode, usluge i troškove (razlikuju se samo tip i bazna ruta) +func (h *Handler) magacinPrikaz(w http.ResponseWriter, r *http.Request, tip, stranica, naslov, osnovniUrl string) { podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) if err != nil { http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError) @@ -45,6 +63,7 @@ func (h *Handler) Magacin(w http.ResponseWriter, r *http.Request) { filter := db.ArtikalFilter{ Pretraga: r.URL.Query().Get("pretraga"), + Tip: tip, SamoKriticni: r.URL.Query().Get("kriticni") == "1", Arhivirani: r.URL.Query().Get("arhivirani") == "1", } @@ -89,8 +108,8 @@ func (h *Handler) Magacin(w http.ResponseWriter, r *http.Request) { } ps := h.popuniPodaciStranice(r, podesavanja) - ps.Stranica = "magacin" - ps.NaslovStranice = "Magacin" + ps.Stranica = stranica + ps.NaslovStranice = naslov // izgradi query string za paginaciju (čuva filtere) queryDelići := "" @@ -135,6 +154,8 @@ func (h *Handler) Magacin(w http.ResponseWriter, r *http.Request) { StranicaPrev: stranicaPrev, StranicaNext: stranicaNext, StranicaQueryUrl: queryDelići, + Tip: tip, + OsnovniUrl: osnovniUrl, } h.renderujTemplate(w, "magacin", podaci) @@ -221,9 +242,9 @@ func (h *Handler) VratiArtikal(w http.ResponseWriter, r *http.Request) { // PodaciMagacinskeKartice su podaci za karticu jednog artikla type PodaciMagacinskeKartice struct { model.PodaciStranice - Artikal model.Artikal - Promene []model.MagacinskaPromenaSaDetaljem - Dobavljaci []model.Dobavljac // dobavljači vezani za artikal + Artikal model.Artikal + Promene []model.MagacinskaPromenaSaDetaljem + Dobavljaci []model.Dobavljac // dobavljači vezani za artikal DostupniDobavljaci []model.Dobavljac // dobavljači koji još nisu vezani (za dodavanje) } diff --git a/internal/handler/magacin_forma.go b/internal/handler/magacin_forma.go index 36d60ad..e4cab5b 100644 --- a/internal/handler/magacin_forma.go +++ b/internal/handler/magacin_forma.go @@ -49,6 +49,12 @@ func (h *Handler) NoviArtikal(w http.ResponseWriter, r *http.Request) { dobavljaci, _ := h.DobavljaciRepo.Lista(r.Context(), "") + // tip se može predodabrati iz query-ja (dolazak sa stranice Usluge/Troškovi) + tip := r.URL.Query().Get("tip") + if tip != model.TipUsluga && tip != model.TipTrosak { + tip = model.TipProizvod + } + ps := h.popuniPodaciStranice(r, podesavanja) ps.Stranica = "magacin" ps.NaslovStranice = "Novi artikal" @@ -56,7 +62,7 @@ func (h *Handler) NoviArtikal(w http.ResponseWriter, r *http.Request) { PodaciStranice: ps, Kategorije: kategorije, Dobavljaci: dobavljaci, - Artikal: model.Artikal{Sifra: predlogSifre, Tip: model.TipProizvod, JedinicaMere: "kom"}, + Artikal: model.Artikal{Sifra: predlogSifre, Tip: tip, JedinicaMere: "kom"}, Izmena: false, }) } diff --git a/web/templates/komponente/sidebar.html b/web/templates/komponente/sidebar.html index 19b6daa..a883e1f 100644 --- a/web/templates/komponente/sidebar.html +++ b/web/templates/komponente/sidebar.html @@ -31,6 +31,18 @@ Magacin + + + Usluge + Usluge + + + + + Troškovi + Troškovi + + {{if index .Dozvole "nabavka.pregled"}} diff --git a/web/templates/stranice/magacin.html b/web/templates/stranice/magacin.html index 32f4fda..8312ab0 100644 --- a/web/templates/stranice/magacin.html +++ b/web/templates/stranice/magacin.html @@ -27,25 +27,25 @@
{{if index .Dozvole "artikal.dodaj"}} - + Novi artikal + + {{if eq .Tip "usluga"}}Nova usluga{{else if eq .Tip "trosak"}}Novi trošak{{else}}Novi artikal{{end}} {{end}} - {{if index .Dozvole "kategorija.pregled"}} + {{if and (eq .Tip "proizvod") (index .Dozvole "kategorija.pregled")}} Kategorije {{end}}
-
+ + hx-get="{{.OsnovniUrl}}" hx-include="closest form" hx-target="#magacin-rezultati" hx-select="#magacin-rezultati" hx-swap="innerHTML" hx-push-url="true">
+ hx-get="{{.OsnovniUrl}}" hx-target="#magacin-rezultati" hx-select="#magacin-rezultati" hx-swap="innerHTML" hx-push-url="true"> Samo kritični
@@ -135,7 +135,7 @@ {{else}} - {{if or $.Filter.Pretraga $.KategorijaIDStr $.Filter.SamoKriticni}}Za datu pretragu nema artikala u bazi.{{else}}Nema artikala. Dodaj prvi artikal.{{end}} + {{if or $.Filter.Pretraga $.KategorijaIDStr $.Filter.SamoKriticni}}Za datu pretragu nema stavki u bazi.{{else}}Nema stavki. Dodaj prvu.{{end}} {{end}} @@ -203,7 +203,7 @@ {{else}}
- {{if or $.Filter.Pretraga $.KategorijaIDStr $.Filter.SamoKriticni}}Za datu pretragu nema artikala u bazi.{{else}}Nema artikala. Dodaj prvi artikal.{{end}} + {{if or $.Filter.Pretraga $.KategorijaIDStr $.Filter.SamoKriticni}}Za datu pretragu nema stavki u bazi.{{else}}Nema stavki. Dodaj prvu.{{end}}
{{end}} diff --git a/web/templates/stranice/magacin_forma.html b/web/templates/stranice/magacin_forma.html index b0b8dc4..bea9366 100644 --- a/web/templates/stranice/magacin_forma.html +++ b/web/templates/stranice/magacin_forma.html @@ -53,30 +53,23 @@ style="width:100%;"> - -
-
- - -
-
- - {{$jm := .Artikal.JedinicaMere}} - -
+ + + +
+ + {{$jm := .Artikal.JedinicaMere}} +
@@ -175,16 +168,6 @@