From a6c4f429e487323bb56976237b83b12aaf98edfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dalibor=20Markovi=C4=87?= Date: Tue, 2 Jun 2026 18:29:59 +0200 Subject: [PATCH] =?UTF-8?q?Dashboard=20=E2=80=94=20pravi=20podaci,=20priho?= =?UTF-8?q?d=20meseca,=20poslednje=20prodaje,=20datum=20umesto=20badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/dashboard.go | 56 ++++++++++++++++++++------- internal/model/stranica.go | 28 +++++++++----- web/templates/stranice/dashboard.html | 34 +++++++++++++--- 3 files changed, 90 insertions(+), 28 deletions(-) diff --git a/internal/handler/dashboard.go b/internal/handler/dashboard.go index e1d789e..bd2adcd 100644 --- a/internal/handler/dashboard.go +++ b/internal/handler/dashboard.go @@ -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( diff --git a/internal/model/stranica.go b/internal/model/stranica.go index a2d5ad9..ce612fd 100644 --- a/internal/model/stranica.go +++ b/internal/model/stranica.go @@ -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 } diff --git a/web/templates/stranice/dashboard.html b/web/templates/stranice/dashboard.html index 02d6bb0..44c5bb8 100644 --- a/web/templates/stranice/dashboard.html +++ b/web/templates/stranice/dashboard.html @@ -25,8 +25,8 @@
-
{{.ProdajaOvogMeseca}}
-
Prodaja ovog meseca
+
{{printf "%.0f" .PrihodOvogMeseca}} din
+
Prihod ovog meseca
@@ -38,18 +38,17 @@
-
+
Poslednji servisi - Danas
{{range .PoslednjiServisi}}
- {{.Uredjaj}} - {{.Status}} + {{.Uredjaj}} + {{.DatumPrijema}}
{{else}}
Nema servisnih naloga.
@@ -72,5 +71,28 @@
Sve zalihe su uredne.
{{end}}
+ + +
+
+ Poslednje prodaje +
+ {{range .PoslednjeProdaje}} +
+
+
{{.BrojNaloga}}
+ {{if .KlijentNaziv}} +
{{.KlijentNaziv}}
+ {{end}} +
+
+
{{printf "%.0f" .Ukupno}} din
+
{{.Datum}}
+
+
+ {{else}} +
Nema prodajnih naloga.
+ {{end}} +
{{end}}