Dashboard — pravi podaci, prihod meseca, poslednje prodaje, datum umesto badge
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user