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 @@