Magacin premeštanje, backup podešavanja, čišćenje RBAC sistema
Magacin:
- Dodato premeštanje artikla u drugu kategoriju (dugme + nativni
<details> meni, bez JS-a; radi na desktopu i mobilnom)
- Endpoint POST /magacin/premesti/{id} uz proveru dozvole artikal.premesti
Backup:
- Nova podešavanja: interval automatskog backupa i broj kopija (rotacija)
- Periodični backup uz onaj pri pokretanju; interval se čita iz baze
- Migracija 037_backup_podesavanja.sql
Dozvole (RBAC):
- Dodate kartice koje su nedostajale (dashboard.prihod, prodaja.storno,
podesavanja.login_pozadina, tema.lokalno) — popravljen i bug gde su se
gasile pri svakom čuvanju matrice
- Aktivirana kontrola pregleda za prodaju, servis, klijente i dobavljače
(provera u handlerima + skrivanje iz sidebara)
- Uklonjene mrtve/obmanjujuće dozvole iz matrice i sveAkcije (korisnici,
podsetnici, artikal.pregled, kategorija.izmeni, tema.globalno,
podesavanja.app_pozadina); sveAkcije 47 -> 34
- Čišćenje zastarelih redova (siročića) u tabeli dozvola pri startu
Ostalo:
- Statički fajlovi: embed celog web/static i ispravan MIME za .js/.css
- Keš šablona: dodat admin_dozvole (stranica Dozvole se nije otvarala)
- Sidebar accordion: radi i skupljen i proširen, međusobno isključiv
This commit is contained in:
@@ -21,6 +21,7 @@ type PodaciMagacina struct {
|
||||
KategorijaIDStr string
|
||||
Sacuvano bool
|
||||
Obrisan bool
|
||||
Premesten bool
|
||||
}
|
||||
|
||||
// Magacin renderuje listu artikala
|
||||
@@ -68,11 +69,44 @@ func (h *Handler) Magacin(w http.ResponseWriter, r *http.Request) {
|
||||
KategorijaIDStr: katIDStr,
|
||||
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
|
||||
Obrisan: r.URL.Query().Get("obrisan") == "1",
|
||||
Premesten: r.URL.Query().Get("premesten") == "1",
|
||||
}
|
||||
|
||||
h.renderujTemplate(w, "magacin", podaci)
|
||||
}
|
||||
|
||||
// PremestiArtikal menja kategoriju artikla (premeštanje u drugu kategoriju).
|
||||
// Prazno polje kategorija_id znači premeštanje u "bez kategorije".
|
||||
func (h *Handler) PremestiArtikal(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
if !h.DozvoleRepo.ImaDozvolu(r.Context(), k.Uloga, "artikal.premesti") {
|
||||
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
id, err := strconv.ParseInt(chi.URLParam(r, "id"), 10, 64)
|
||||
if err != nil {
|
||||
http.Error(w, "Neispravan ID artikla", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
var kategorijaID *int64
|
||||
if v := r.FormValue("kategorija_id"); v != "" {
|
||||
kid, err := strconv.ParseInt(v, 10, 64)
|
||||
if err != nil {
|
||||
http.Error(w, "Neispravna kategorija", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
kategorijaID = &kid
|
||||
}
|
||||
|
||||
if err := h.Artikli.PremestiKategoriju(r.Context(), id, kategorijaID); err != nil {
|
||||
http.Error(w, "Greška pri premeštanju artikla", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/magacin?premesten=1", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
// ObrisiArtikal briše artikal po ID-u
|
||||
func (h *Handler) ObrisiArtikal(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
|
||||
Reference in New Issue
Block a user