refactor(izvestaji): direktan SQL dashboard/izveštaja u IzvestajRepository

dashboard.go i izvestaji.go više ne sadrže direktan SQL — svih 12 upita
prebačeno u novi IzvestajRepository (internal/db/sqlite/izvestaj.go). Repo vraća
sirove redove (model.*Red tipovi), a handleri zadržavaju prezentaciju
(formatiranje datuma, boje tačaka, rang, sklapanje niza 12 meseci). Žičenje kroz
Handler.IzvestajRepo (+ reinicijalizuj).

Dobici: testabilnost (dodati integracioni testovi izvestaj_test.go) i put ka
Postgres-u bez prepravke handlera. dashboard.prihod provera ostaje u handleru.

Van obima: middleware/flash.go i backup VACUUM INTO (ne pripadaju repo sloju).
This commit is contained in:
2026-06-12 22:53:15 +02:00
parent 53c06b6db4
commit 9aaafa2358
7 changed files with 463 additions and 164 deletions
+20
View File
@@ -143,6 +143,26 @@ type DozvoleRepository interface {
Reset(ctx context.Context) error
}
// IzvestajRepository definiše read-only upite za dashboard i stranicu izveštaja.
// Vraća sirove podatke; prezentaciju (datumi, boje, rang) radi handler.
type IzvestajRepository interface {
// dashboard — brojači
BrojArtikala(ctx context.Context) (int, error)
BrojAktivnihServisa(ctx context.Context) (int, error)
PrihodTekuciMesec(ctx context.Context) (float64, error)
BrojKriticnihZaliha(ctx context.Context) (int, error)
// dashboard — liste
PoslednjiServisi(ctx context.Context, limit int) ([]model.ServisRedDashboard, error)
KriticneZalihe(ctx context.Context, limit int) ([]model.ZalihaRed, error)
PoslednjeProdaje(ctx context.Context, limit int) ([]model.ProdajaRedDashboard, error)
// izveštaji
MesecniPrihodProdaja(ctx context.Context) ([]model.MesecniIznos, error)
MesecniPrihodServis(ctx context.Context) ([]model.MesecniIznos, error)
StariOtvoreniNalozi(ctx context.Context) ([]model.StariNalogRed, error)
TopArtikli(ctx context.Context, limit int) ([]model.TopArtikalRed, error)
TopKlijenti(ctx context.Context, limit int) ([]model.TopKlijentRed, error)
}
// PodsetnikRepository definiše operacije nad podsetnicima
type PodsetnikRepository interface {
Lista(ctx context.Context, filter PodsetnikFilter) ([]model.Podsetnik, error)