Dashboard — pravi podaci, prihod meseca, poslednje prodaje, datum umesto badge

This commit is contained in:
2026-06-02 18:29:59 +02:00
parent 5c744ed15e
commit a6c4f429e4
3 changed files with 90 additions and 28 deletions
+43 -13
View File
@@ -4,6 +4,7 @@ import (
"html/template"
"log"
"net/http"
"time"
"ntech/internal/db/sqlite"
"ntech/internal/model"
@@ -19,7 +20,8 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
return
}
var brojArtikala, aktivniServisi, prodajaOvogMeseca, kriticnaZaliha int
var brojArtikala, aktivniServisi, kriticnaZaliha int
var prihodOvogMeseca float64
if err := h.DB.QueryRowContext(ctx,
"SELECT COUNT(*) FROM artikli",
@@ -35,10 +37,10 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
}
if err := h.DB.QueryRowContext(ctx, `
SELECT COUNT(*) FROM prodajni_nalozi
SELECT COALESCE(SUM(ukupno), 0) 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)
).Scan(&prihodOvogMeseca); err != nil {
log.Printf("dashboard: prihod ovog meseca: %v", err)
}
if err := h.DB.QueryRowContext(ctx,
@@ -47,9 +49,9 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
log.Printf("dashboard: kriticna zaliha: %v", err)
}
// poslednjih 5 servisnih naloga
// poslednjih 5 servisnih naloga sa datumom prijema
servisRedovi, err := h.DB.QueryContext(ctx, `
SELECT uredjaj, status FROM servisni_nalozi
SELECT uredjaj, status, datum_prijema FROM servisni_nalozi
ORDER BY datum_prijema DESC LIMIT 5`)
if err != nil {
log.Printf("dashboard: poslednji servisi: %v", err)
@@ -60,8 +62,10 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
defer servisRedovi.Close()
for servisRedovi.Next() {
var s model.StavkaServisa
if err := servisRedovi.Scan(&s.Uredjaj, &s.Status); err == nil {
var datum time.Time
if err := servisRedovi.Scan(&s.Uredjaj, &s.Status, &datum); err == nil {
s.BojaTacke = bojaTackeServisa(s.Status)
s.DatumPrijema = datum.Format("02.01.")
poslednjiServisi = append(poslednjiServisi, s)
}
}
@@ -92,6 +96,31 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
}
}
// poslednjih 5 prodajnih naloga sa nazivom klijenta
prodajaRedovi, err := h.DB.QueryContext(ctx, `
SELECT
pn.broj_naloga, pn.ukupno, pn.datum,
COALESCE(NULLIF(k.naziv_firme, ''), TRIM(COALESCE(k.ime, '') || ' ' || COALESCE(k.prezime, '')), '') AS klijent_naziv
FROM prodajni_nalozi pn
LEFT JOIN klijenti k ON k.id = pn.klijent_id
ORDER BY pn.datum DESC LIMIT 5`)
if err != nil {
log.Printf("dashboard: poslednje prodaje: %v", err)
}
var poslednjeProdaje []model.StavkaProdajePregled
if prodajaRedovi != nil {
defer prodajaRedovi.Close()
for prodajaRedovi.Next() {
var p model.StavkaProdajePregled
var datum time.Time
if err := prodajaRedovi.Scan(&p.BrojNaloga, &p.Ukupno, &datum, &p.KlijentNaziv); err == nil {
p.Datum = datum.Format("02.01.")
poslednjeProdaje = append(poslednjeProdaje, p)
}
}
}
podaci := model.PodaciDashboarda{
PodaciStranice: model.PodaciStranice{
Stranica: "dashboard",
@@ -103,12 +132,13 @@ func (h *Handler) Dashboard(w http.ResponseWriter, r *http.Request) {
LogoPutanja: podesavanja["logo_putanja"],
Korisnik: "Admin",
},
BrojArtikala: brojArtikala,
AktivniServisi: aktivniServisi,
ProdajaOvogMeseca: prodajaOvogMeseca,
KriticnaZaliha: kriticnaZaliha,
PoslednjiServisi: poslednjiServisi,
KriticneZalihe: kriticneZalihe,
BrojArtikala: brojArtikala,
AktivniServisi: aktivniServisi,
PrihodOvogMeseca: prihodOvogMeseca,
KriticnaZaliha: kriticnaZaliha,
PoslednjiServisi: poslednjiServisi,
KriticneZalihe: kriticneZalihe,
PoslednjeProdaje: poslednjeProdaje,
}
tmpl, err := template.ParseFiles(
+19 -9
View File
@@ -2,9 +2,10 @@ package model
// StavkaServisa prikazuje jedan servisni nalog na dashboardu
type StavkaServisa struct {
Uredjaj string
Status string
BojaTacke string
Uredjaj string
Status string
BojaTacke string
DatumPrijema string // kratki format, npr. "01.06."
}
// StavkaZalihe prikazuje jedan artikal sa kritičnom zalihom
@@ -14,6 +15,14 @@ type StavkaZalihe struct {
BojaTacke string
}
// StavkaProdajePregled prikazuje jedan prodajni nalog na dashboardu
type StavkaProdajePregled struct {
BrojNaloga string
KlijentNaziv string
Ukupno float64
Datum string // kratki format, npr. "01.06."
}
// PodaciStranice su zajednički podaci koje svaka stranica prima
type PodaciStranice struct {
Stranica string
@@ -29,10 +38,11 @@ type PodaciStranice struct {
// PodaciDashboarda su podaci specifični za dashboard stranicu
type PodaciDashboarda struct {
PodaciStranice
BrojArtikala int
AktivniServisi int
ProdajaOvogMeseca int
KriticnaZaliha int
PoslednjiServisi []StavkaServisa
KriticneZalihe []StavkaZalihe
BrojArtikala int
AktivniServisi int
PrihodOvogMeseca float64
KriticnaZaliha int
PoslednjiServisi []StavkaServisa
KriticneZalihe []StavkaZalihe
PoslednjeProdaje []StavkaProdajePregled
}