diff --git a/db/db.go b/db/db.go
index 51c4b2d7959ac9ca52723222d7662269689c10d3..cdd9e9e532ea97599432bfeb04eaf2fadcafb17a 100644
--- a/db/db.go
+++ b/db/db.go
@@ -1,168 +1,12 @@
 package db
 
 import (
-	"encoding/json"
+	"fmt"
 	"git.sch.bme.hu/disappointment-industries/becskasszasch/helpers"
-	"github.com/go-pg/pg/v10"
 	"github.com/go-pg/pg/v10/orm"
 	"github.com/prometheus/client_golang/prometheus"
-	"github.com/prometheus/client_golang/prometheus/promauto"
-	"gitlab.com/MikeTTh/env"
-	"io/ioutil"
-	"strings"
-	"time"
 )
 
-const TopupID = "topup"
-
-type Spend struct {
-	ID string `pg:"id,pk,default:gen_random_uuid()"`
-
-	SchAcc string    `pg:"user_schacc"`
-	ProdID string    `pg:"product_id"`
-	Amount int64     `pg:"amount,default:1"`
-	Date   time.Time `pg:"date,default:now()"`
-	Notes  string    `pg:"notes"`
-
-	User    *User    `pg:"rel:has-one,join_fk:user_schacc"`
-	Product *Product `pg:"rel:has-one,join_fk:product_id"`
-}
-
-type Product struct {
-	ID      string `pg:"id,pk"`
-	Name    string `pg:"name"`
-	IconURI string `pg:"icon_uri"`
-	Price   int64  `pg:"price,use_zero"`
-	Buyable bool   `pg:"buyable,use_zero"`
-}
-
-type User struct {
-	SchAcc  string `pg:"schacc,pk"`
-	Name    string `pg:"name"`
-	Money   int64  `pg:"money,use_zero"`
-	IsAdmin bool   `pg:"is_admin,default:false"`
-
-	Spends []*Spend `pg:"rel:has-many,join_fk:user_schacc"`
-}
-
-type Session struct {
-	Id        string `pg:"id,pk,default:gen_random_uuid()"`
-	SchAcc    string `pg:"user_schacc"`
-	DarkTheme bool   `pg:"dark_theme,default:true"`
-
-	User *User `pg:"rel:has-one,join_fk:user_schacc"`
-}
-
-type Payout struct {
-	Id           string        `pg:"id,pk,default:gen_random_uuid()"`
-	ProdGroupID  string        `pg:"product_group_id"`
-	Amount       int64         `pg:"amount"`
-	Date         time.Time     `pg:"date,default:now()"`
-	ProductGroup *ProductGroup `pg:"rel:has-one,join_fk:product_group_id"`
-}
-
-type ProductGroup struct {
-	Id   string `pg:"id,pk,default:gen_random_uuid()"`
-	Name string `pg:"name"`
-}
-
-type ProductCategories struct {
-	Id           string        `pg:"id,pk,default:gen_random_uuid()"`
-	ProdID       string        `pg:"product_id"`
-	ProdGroupID  string        `pg:"product_group_id"`
-	Product      *Product      `pg:"rel:has-one,join_fk:product_id"`
-	ProductGroup *ProductGroup `pg:"rel:has-one,join_fk:product_group_id"`
-}
-
-var db = pg.Connect(&pg.Options{
-	Addr: func() string {
-		host := env.String("POSTGRES", "localhost")
-		if !strings.Contains(host, ":") {
-			host += ":5432"
-		}
-		return host
-	}(),
-	User:     env.String("POSTGRES_USER", "postgres"),
-	Password: env.String("POSTGRES_PASS", "postgres"),
-	Database: env.String("POSTGRES_DB", "postgres"),
-})
-
-var spendsNow = promauto.NewCounterVec(prometheus.CounterOpts{
-	Namespace: "becskasszasch",
-	Name:      "products_bought",
-	Help:      "Products bought",
-}, []string{"product"})
-
-func init() {
-	models := []interface{}{
-		(*Product)(nil),
-		(*User)(nil),
-		(*Spend)(nil),
-		(*Session)(nil),
-		(*ProductGroup)(nil),
-		(*ProductCategories)(nil),
-		(*Payout)(nil),
-	}
-
-	for _, model := range models {
-		err := db.Model(model).CreateTable(&orm.CreateTableOptions{
-			IfNotExists:   true,
-			FKConstraints: true,
-		})
-		if err != nil {
-			panic(err)
-		}
-	}
-
-	// TODO: Auto-migrate: https://github.com/go-pg/pg/issues/728#issuecomment-433345074
-
-	// Auto-create products
-	b, e := ioutil.ReadFile("db/products.json")
-	if e == nil {
-		var prods []*Product
-		e = json.Unmarshal(b, &prods)
-		for _, p := range prods {
-			_, e := db.Model(p).Insert()
-			if e != nil && !strings.Contains(e.Error(), "ERROR #23505") {
-				helpers.Logger.Println(e)
-			}
-		}
-	}
-
-	// Auto-create topup
-	top := &Product{
-		ID:      TopupID,
-		Name:    "Feltöltés",
-		IconURI: "/static/images/kszkoin.svg",
-		Buyable: false,
-		Price:   -1,
-	}
-	_, e = db.Model(top).Insert()
-	if e != nil {
-		_, e := db.Model(top).WherePK().Update()
-		if e != nil {
-			panic(e)
-		}
-	}
-
-	prod, err := GetProducts()
-	if err != nil {
-		// TODO
-	}
-	for _, p := range prod {
-		s, _ := GetSpends(p.ID)
-		var a float64
-		if s != nil {
-			for _, u := range s {
-				a += float64(u.Amount)
-			}
-		}
-		spendsNow.With(prometheus.Labels{"product": p.Name}).Add(a)
-	}
-
-	//GetSpendsBetween(time.Date(2021,7,19, 0, 0, 0, 0, time.Local), time.Date(2021,8,18, 0, 0, 0, 0, time.Local))
-}
-
 func StoreUserAndGiveCookie(SchAcc, Name string) (string, error) {
 	u := &User{
 		SchAcc: SchAcc,
@@ -287,6 +131,94 @@ func GetSpendsBetween(from, to string) (map[string]*int64, map[string]*Product,
 	return m, products, nil
 }
 
+func GetMoney() (map[string]*int64, map[string]*ProductGroup, error) {
+	var res []*Spend
+	e := db.Model(&res).Relation("Product").Relation("Product.ProductGroup").Select()
+	if e != nil {
+		return nil, nil, e
+	}
+
+	m := make(map[string]*int64)
+	products := make(map[string]*ProductGroup)
+
+	for _, sp := range res {
+		val, ok := m[sp.Product.ProductGroup.Name]
+		if !ok {
+			val = new(int64)
+			m[sp.Product.ProductGroup.Name] = val
+		}
+
+		*val += sp.Amount * sp.Product.Price
+
+		if _, ok := products[sp.Product.ProductGroup.Name]; !ok {
+			products[sp.Product.ProductGroup.Name] = sp.Product.ProductGroup
+		}
+	}
+
+	/*	for p := range products {
+		fmt.Print(p + ":")
+		fmt.Print(*m[p])
+		fmt.Println()
+	}*/
+
+	return m, products, nil
+}
+
+func GetPayouts() (map[string]*int64, error) {
+	var res []*Payout
+
+	e := db.Model(&res).Relation("ProductGroup").Select()
+	if e != nil {
+		return nil, e
+	}
+
+	m := make(map[string]*int64)
+
+	for _, pay := range res {
+		val, ok := m[pay.ProductGroup.Name]
+		if !ok {
+			val = new(int64)
+			m[pay.ProductGroup.Name] = val
+		}
+
+		*val += pay.Price
+	}
+
+	return m, nil
+}
+
+func GetBalance() (map[string]*int64, map[string]*ProductGroup, error) {
+	allMoney, groupList, err := GetMoney()
+	if err != nil {
+		return nil, nil, err
+	}
+
+	allPayout, e := GetPayouts()
+	if e != nil {
+		return nil, nil, e
+	}
+
+	m := make(map[string]*int64)
+
+	fmt.Println("-------------------------------")
+
+	for g := range groupList {
+		m[g] = new(int64)
+
+		if allPayout[g] != nil {
+			*m[g] = *allMoney[g] - *allPayout[g]
+		} else {
+			*m[g] = *allMoney[g]
+		}
+
+		fmt.Print(g + ":")
+		fmt.Print(*m[g])
+		fmt.Println()
+	}
+
+	return m, groupList, err
+}
+
 func GetSpends(typ string) ([]*Spend, error) {
 	var spends []*Spend
 
@@ -315,6 +247,18 @@ func (p *Product) Save() error {
 	return update(p)
 }
 
+func (p *Payout) Save() error {
+	return update(p)
+}
+
+func (p *ProductGroup) Save() error {
+	return update(p)
+}
+
+/*func (p *ProductCategories) Save() error {
+	return update(p)
+}*/
+
 func (p *Product) Load() error {
 
 	e := db.Model(p).WherePK().First()
@@ -350,3 +294,8 @@ func (sp *Spend) Delete() error {
 	_, e := db.Model(sp).WherePK().Delete()
 	return e
 }
+
+func (p *Payout) Delete() error {
+	_, e := db.Model(p).WherePK().Delete()
+	return e
+}