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"> Sve kategorije {{range .Kategorije}} {{.Naziv}} @@ -54,13 +54,13 @@ + hx-get="{{.OsnovniUrl}}" hx-target="#magacin-rezultati" hx-select="#magacin-rezultati" hx-swap="innerHTML" hx-push-url="true"> Samo kritični + hx-get="{{.OsnovniUrl}}" hx-target="#magacin-rezultati" hx-select="#magacin-rezultati" hx-swap="innerHTML" hx-push-url="true"> Arhivirani @@ -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%;"> - - - - Tip artikla - - Proizvod (prati lager) - Usluga - Trošak - - - - Jedinica mere - {{$jm := .Artikal.JedinicaMere}} - - kom - sat - set - m - m² - l - kg - pak - - + + + + + Jedinica mere + {{$jm := .Artikal.JedinicaMere}} + + kom + sat + set + m + m² + l + kg + pak + @@ -175,16 +168,6 @@