Magacin: razdvojeni Magacin/Usluge/Troškovi i izbačen Tip iz forme

ArtikalFilter dobija polje Tip; zajednički magacinPrikaz parametrizovan tipom
servi listu proizvoda (/magacin), usluga (/usluge) i troškova (/troskovi) preko
istog šablona (OsnovniUrl za HTMX). Sidebar dobija stavke Usluge i Troškovi.
Magacin forma više ne nudi izbor tipa — artikal je uvek proizvod.
This commit is contained in:
2026-06-21 22:31:19 +02:00
parent 2f4caabcdb
commit 9cfc1cc4f3
8 changed files with 86 additions and 51 deletions
+1
View File
@@ -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
+10
View File
@@ -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"
}
+27 -6
View File
@@ -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)
}
+7 -1
View File
@@ -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,
})
}