diff --git a/api/purchase.go b/api/purchase.go
index 5b982bb1dfed4750474c48bf2e7f300358a03ea3..79c7021237595562398768eb7f2586c55fd2c9c2 100644
--- a/api/purchase.go
+++ b/api/purchase.go
@@ -56,11 +56,14 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 	}
 	total := 0
 	for i, p := range products {
+		if p.ProductCode == 0 {
+			continue
+		}
 		var product Product
-		err := a.db.Where("code = ?", p.ProductCode).First(&product).Error
+		err = a.db.Where("code = ?", p.ProductCode).First(&product).Error
 		if err != nil {
 			log.Printf("Can't get product %d: %v", p.ProductCode, err)
-			w.WriteHeader(http.StatusInternalServerError)
+			w.WriteHeader(http.StatusBadRequest)
 			return
 		}
 
@@ -68,6 +71,14 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 		products[i].Price = product.Price
 	}
 
+	err = a.db.Model(&Member{}).
+		Where("num = ?", num).
+		Update("balance", gorm.Expr("balance - ?", total)).Error
+	if err != nil {
+		log.Printf("Can't update update member balance %d-%d: %v", num, total, err)
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
 	purchase := Purchase{
 		MemberNum: num,
 		Date:      time.Now(),
@@ -86,7 +97,7 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 			Where("code = ?", p.ProductCode).
 			Update("stock", gorm.Expr("stock - ?", p.Ammount)).Error
 		if err != nil {
-			log.Printf("Can't update product stock %d: %v", p.ProductCode, err)
+			log.Printf("Can't update product stock %d-%d: %v", p.ProductCode, p.Ammount, err)
 		}
 	}
 
diff --git a/api/purchase_test.go b/api/purchase_test.go
index 622a0d0eb7e1e6c4edb8e7a6c3726839fd0850b3..3bf4931c9627e382dd56134d94e15d07590414f5 100644
--- a/api/purchase_test.go
+++ b/api/purchase_test.go
@@ -51,4 +51,13 @@ func TestPurchaseAddListMine(t *testing.T) {
 	if product.Stock != testProduct.Stock-products[0].Ammount {
 		t.Error("Wrong product stock:", product)
 	}
+
+	var member Member
+	resp = tapi.do("GET", "/member/10", nil, &member)
+	if resp.StatusCode != http.StatusOK {
+		t.Error("Can't find the member:", resp.Status)
+	}
+	if member.Balance != testMember.Balance-(testProduct.Price*products[0].Ammount) {
+		t.Error("Wrong product balance:", member.Balance)
+	}
 }