From e88e0b043e6fcd42bf7750af32fef05f822a9cb6 Mon Sep 17 00:00:00 2001
From: meskio <meskio@sindominio.net>
Date: Wed, 23 Sep 2020 16:24:35 +0200
Subject: [PATCH] Update member balance when purchase

---
 api/purchase.go      | 17 ++++++++++++++---
 api/purchase_test.go |  9 +++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/api/purchase.go b/api/purchase.go
index 5b982bb..79c7021 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 622a0d0..3bf4931 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)
+	}
 }
-- 
GitLab