Files
GoNtech/internal/handler/dashboard.go
T

149 lines
4.1 KiB
Go

package handler
import (
"html/template"
"log"
"net/http"
"ntech/internal/db/sqlite"
"ntech/internal/model"
)
// Dashboard renderuje početnu stranicu sa pravim podacima iz baze
func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
podesavanja, err := sqlite.DohvatiSvaPodesavanja(ctx, h.DB)
if err != nil {
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
return
}
var brojArtikala, aktivniServisi, prodajaOvogMeseca, kriticnaZaliha int
if err := h.DB.QueryRowContext(ctx,
"SELECT COUNT(*) FROM artikli",
).Scan(&brojArtikala); err != nil {
log.Printf("dashboard: broj artikala: %v", err)
}
if err := h.DB.QueryRowContext(ctx, `
SELECT COUNT(*) FROM servisni_nalozi
WHERE status NOT IN ('Završeno', 'Preuzeto')`,
).Scan(&aktivniServisi); err != nil {
log.Printf("dashboard: aktivni servisi: %v", err)
}
if err := h.DB.QueryRowContext(ctx, `
SELECT COUNT(*) FROM prodajni_nalozi
WHERE strftime('%Y-%m', datum) = strftime('%Y-%m', 'now', 'localtime')`,
).Scan(&prodajaOvogMeseca); err != nil {
log.Printf("dashboard: prodaja ovog meseca: %v", err)
}
if err := h.DB.QueryRowContext(ctx,
"SELECT COUNT(*) FROM artikli WHERE kolicina <= kolicina_min",
).Scan(&kriticnaZaliha); err != nil {
log.Printf("dashboard: kriticna zaliha: %v", err)
}
// poslednjih 5 servisnih naloga
servisRedovi, err := h.DB.QueryContext(ctx, `
SELECT uredjaj, status FROM servisni_nalozi
ORDER BY datum_prijema DESC LIMIT 5`)
if err != nil {
log.Printf("dashboard: poslednji servisi: %v", err)
}
var poslednjiServisi []model.StavkaServisa
if servisRedovi != nil {
defer servisRedovi.Close()
for servisRedovi.Next() {
var s model.StavkaServisa
if err := servisRedovi.Scan(&s.Uredjaj, &s.Status); err == nil {
s.BojaTacke = bojaTackeServisa(s.Status)
poslednjiServisi = append(poslednjiServisi, s)
}
}
}
// artikli sa kritičnom zalihom, sortirani po količini rastuće
zaliheRedovi, err := h.DB.QueryContext(ctx, `
SELECT naziv, kolicina FROM artikli
WHERE kolicina <= kolicina_min
ORDER BY kolicina ASC LIMIT 5`)
if err != nil {
log.Printf("dashboard: kriticne zalihe: %v", err)
}
var kriticneZalihe []model.StavkaZalihe
if zaliheRedovi != nil {
defer zaliheRedovi.Close()
for zaliheRedovi.Next() {
var z model.StavkaZalihe
if err := zaliheRedovi.Scan(&z.Naziv, &z.Kolicina); err == nil {
if z.Kolicina == 0 {
z.BojaTacke = "#dc2626"
} else {
z.BojaTacke = "#f97316"
}
kriticneZalihe = append(kriticneZalihe, z)
}
}
}
podaci := model.PodaciDashboarda{
PodaciStranice: model.PodaciStranice{
Stranica: "dashboard",
NaslovStranice: "Dashboard",
Tema: podesavanja["tema"],
NazivFirme: podesavanja["naziv_firme"],
Podnazlov: podesavanja["podnazlov"],
LogoTip: podesavanja["logo_tip"],
LogoPutanja: podesavanja["logo_putanja"],
Korisnik: "Admin",
},
BrojArtikala: brojArtikala,
AktivniServisi: aktivniServisi,
ProdajaOvogMeseca: prodajaOvogMeseca,
KriticnaZaliha: kriticnaZaliha,
PoslednjiServisi: poslednjiServisi,
KriticneZalihe: kriticneZalihe,
}
tmpl, err := template.ParseFiles(
"web/templates/teme/podrazumevana/base.html",
"web/templates/komponente/sidebar.html",
"web/templates/komponente/topbar.html",
"web/templates/stranice/dashboard.html",
)
if err != nil {
log.Printf("greška pri učitavanju šablona: %v", err)
http.Error(w, "Greška pri učitavanju stranice", http.StatusInternalServerError)
return
}
if err := tmpl.ExecuteTemplate(w, "base", podaci); err != nil {
log.Printf("greška pri renderovanju: %v", err)
http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError)
}
}
// bojaTackeServisa vraća hex boju tačke prema statusu naloga
func bojaTackeServisa(status string) string {
switch status {
case "U dijagnostici":
return "#3b82f6"
case "Čeka delove":
return "#f97316"
case "U popravci":
return "#ca8a04"
case "Završeno":
return "#16a34a"
case "Preuzeto":
return "#15803d"
default:
return "#94a3b8"
}
}